toeverything/AFFiNE · error · CopilotActionTaken

copilot_action_taken

copilot_action_taken

Error message

Action has been taken, no more messages allowed.

What it means

appendTurn throws CopilotActionTaken when a user turn is appended to a session whose prompt is an action and prior turns already exist — action prompts allow exactly one user message, and further input is rejected.

Source

Thrown at packages/backend/server/src/plugins/copilot/session.ts:107

    if (!this.stashTurnCount) return [];
    return this.state.turns.slice(-this.stashTurnCount);
  }

  get latestUserTurn() {
    return this.state.turns.findLast(({ role }) => role === 'user');
  }

  findTurn(turnId: string) {
    return this.state.turns.find(({ id }) => id === turnId);
  }

  private appendTurn(turn: Turn, persisted: boolean) {
    if (
      this.state.prompt.action &&
      this.state.turns.length > 0 &&
      turn.role === 'user'
    ) {
      throw new CopilotActionTaken();
    }
    this.state.turns.push(turn);
    if (!persisted) {
      this.stashTurnCount += 1;
    }
  }

  pushTurn(turn: Turn) {
    this.appendTurn(turn, false);
  }

  pushPersistedTurn(turn: Turn) {
    this.appendTurn(turn, true);
  }

  revertLatestMessage(removeLatestUserMessage: boolean) {
    const turns = this.state.turns;
    turns.splice(

View on GitHub (pinned to b4c8548c09)

Solutions

  1. Start a new copilot session to continue the conversation after an action has been taken.
  2. Do not send further messages on a session that is finalized by an action; create a fresh session instead.
  3. Adjust the client flow to open a new session after the action completes.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at packages/backend/server/src/plugins/copilot/session.ts:107 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of toeverything/AFFiNE@b4c8548c09 (2026-08-18). Data as JSON: /api/errors/62ac8f40ebdddcfd. Report an issue: GitHub.