codemap.md 3.1 KB

src/hooks/todo-continuation/

Responsibility

Implements orchestrator-only auto-continuation for incomplete todo lists with strict safety controls so automation does not loop or fight the user. It also hosts todo-state hygiene reminders after relevant tool actions.

Design

  • index.ts exports createTodoContinuationHook(ctx, config?), returning:
    • handleMessagesTransform
    • handleChatSystemTransform
    • handleToolExecuteAfter
    • handleEvent
    • handleChatMessage
    • handleCommandExecuteBefore
    • tool map containing auto_continue
  • State model (ContinuationState) tracks:
    • enabled flag, consecutive continuation count, cooldown timer
    • suppression window after abort, orchestrator session IDs
    • in-flight notification and injection guards
  • todo-hygiene.ts owns lightweight reminder arming/injection using todo-queue transitions and message-context signals.
  • Request signatures are used in handleMessagesTransform to avoid duplicate per-request work.

Flow

Auto-continuation path

  1. handleMessagesTransform identifies the latest external user message, infers session/agent, and starts a new continuation cycle for orchestrator sessions.
  2. On session.idle/idle session.status, if enabled, the hook validates: incomplete todos, non-question last assistant message, max-continuation limit, suppress/notification guard, and timer/injection state.
  3. If all guards pass, it schedules a cooldown timer and sends a lightweight no-reply notification via session.prompt.
  4. After cooldown, it injects CONTINUATION_PROMPT via session.prompt, updates consecutiveContinuations, and logs progress.
  5. Event handling resets counters, clears pending timers, or applies a short suppression window on abort-like errors.
  6. On session.deleted, orchestrator session state is torn down and notification state is cleared.

Command path

  1. handleCommandExecuteBefore intercepts /auto-continue before runtime execution.
  2. It toggles enabled state (on, off, or flip), clears timers as needed, and injects a direct status response into output parts.
  3. When enabling and todos are pending, it appends continuation-ready status text; when no todos remain, it reports that state.

Todo hygiene path

  1. createTodoHygiene.handleToolExecuteAfter arms reminders after supported tooling activity, with reset/ignore rules for specific tools.
  2. createTodoHygiene.handleChatSystemTransform injects one reminder per request when open todos remain (TODO_HYGIENE_REMINDER or TODO_FINAL_ACTIVE_REMINDER).
  3. handleEvent clears hygiene state on session.deleted.

Integration

  • Registered in src/index.ts across:
    • experimental.chat.messages.transform
    • experimental.chat.system.transform
    • chat.message
    • command.execute.before
    • event
    • tool.execute.after
  • Uses shared utilities: log, createInternalAgentTextPart, and SLIM_INTERNAL_INITIATOR_MARKER.
  • Session/agent identity is coordinated with session.message events and maintained in the plugin for serve-mode routing consistency.