@ponythewhite/base-context 1.0.11 → 1.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/dist/base-context-runtime/pyproject.toml +1 -1
- package/dist/base-context-runtime/uv.lock +1 -1
- package/dist/build-info.json +1 -1
- package/dist/bundle/amazon-bedrock.js +3 -3
- package/dist/bundle/{anthropic-5PSCZEER.js → anthropic-BJVPUMPB.js} +2 -2
- package/dist/bundle/{azure-openai-responses-AYTLJR33.js → azure-openai-responses-ERRMAXK6.js} +4 -5
- package/dist/bundle/{bundled-modules-PEFT72QN.js → bundled-modules-URKVA3UB.js} +5 -5
- package/dist/bundle/{chunk-D3KOF57W.js → chunk-25VYRAC6.js} +14 -1
- package/dist/bundle/{chunk-2IPDSTDR.js → chunk-AEMRBMI2.js} +9 -9
- package/dist/bundle/{chunk-Q3MBSBEB.js → chunk-FOGKLC7V.js} +1 -1
- package/dist/bundle/{chunk-KT2BNEPE.js → chunk-MUFZODP5.js} +1 -1
- package/dist/bundle/{chunk-QKIFBA7N.js → chunk-Q6UAHLII.js} +2 -2
- package/dist/bundle/{chunk-TOOVREMP.js → chunk-TKOBEJ5E.js} +515 -107
- package/dist/bundle/{chunk-JZHGOOFM.js → chunk-TXVF6Q5H.js} +118 -22
- package/dist/bundle/{cli-main-BRXGYTGK.js → cli-main-ZTJM5EEH.js} +4 -4
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/{google-HTMCUJ7X.js → google-4GA4YMUX.js} +2 -2
- package/dist/bundle/{google-vertex-ZQO65AXF.js → google-vertex-7AMALD7D.js} +2 -2
- package/dist/bundle/{main-POUXGEL6.js → main-53I74INO.js} +5 -5
- package/dist/bundle/{mistral-SB7LU56G.js → mistral-74BXMNRM.js} +1 -1
- package/dist/bundle/{openai-codex-responses-5CEW4VN3.js → openai-codex-responses-COXNC4IH.js} +2 -2
- package/dist/bundle/{openai-completions-BAZJQSS2.js → openai-completions-BCSA5Q6S.js} +2 -2
- package/dist/bundle/{openai-responses-VHOE427P.js → openai-responses-ONCIZSJS.js} +3 -3
- package/dist/core/agent-session.d.ts +6 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +362 -103
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +9 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +29 -3
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/context-tree.d.ts +13 -10
- package/dist/core/context-tree.d.ts.map +1 -1
- package/dist/core/context-tree.js +49 -3
- package/dist/core/context-tree.js.map +1 -1
- package/dist/core/inference-coordinator.d.ts +1 -1
- package/dist/core/inference-coordinator.d.ts.map +1 -1
- package/dist/core/inference-coordinator.js +18 -5
- package/dist/core/inference-coordinator.js.map +1 -1
- package/dist/core/messages.d.ts +2 -0
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +2 -0
- package/dist/core/messages.js.map +1 -1
- package/dist/core/refinement/refinement.d.ts +2 -0
- package/dist/core/refinement/refinement.d.ts.map +1 -1
- package/dist/core/refinement/refinement.js +10 -1
- package/dist/core/refinement/refinement.js.map +1 -1
- package/dist/core/request-usage.d.ts +34 -0
- package/dist/core/request-usage.d.ts.map +1 -0
- package/dist/core/request-usage.js +111 -0
- package/dist/core/request-usage.js.map +1 -0
- package/dist/core/settings-manager.d.ts +3 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +7 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt.d.ts +2 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +4 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/modes/agent-connection/daemon-agent-connection.d.ts.map +1 -1
- package/dist/modes/agent-connection/daemon-agent-connection.js +8 -1
- package/dist/modes/agent-connection/daemon-agent-connection.js.map +1 -1
- package/dist/modes/daemon/daemon-protocol.d.ts +13 -3
- package/dist/modes/daemon/daemon-protocol.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-protocol.js +10 -2
- package/dist/modes/daemon/daemon-protocol.js.map +1 -1
- package/dist/modes/daemon/daemon-session-summarizer.d.ts +3 -0
- package/dist/modes/daemon/daemon-session-summarizer.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-session-summarizer.js +71 -32
- package/dist/modes/daemon/daemon-session-summarizer.js.map +1 -1
- package/dist/modes/interactive/components/context-tree-format.d.ts.map +1 -1
- package/dist/modes/interactive/components/context-tree-format.js +49 -0
- package/dist/modes/interactive/components/context-tree-format.js.map +1 -1
- package/docs/compaction.md +57 -4
- package/docs/context-management.md +23 -1
- package/docs/rlm.md +1 -1
- package/docs/settings.md +21 -0
- package/docs/usage.md +24 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-protocol.js","sourceRoot":"","sources":["../../../src/modes/daemon/daemon-protocol.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage, ThinkingLevel } from \"@ponythewhite/base-context-agent\";\nimport type { ImageContent, ServiceTier, TextContent, Transport } from \"@ponythewhite/base-context-ai\";\nimport type {\n\tAgentSessionMessageDeliveryMode,\n\tAgentSessionMessageReceipt,\n\tAgentSessionMessageSafetyStatus,\n} from \"../../core/agent-messages.js\";\nimport type { SessionActionRecoverySnapshot } from \"../../core/agent-session.js\";\nimport type { SavedSessionPage, SavedSessionPageQuery } from \"./saved-session-page.js\";\nexport type DaemonSavedSessionPage = SavedSessionPage;\n\nimport type { AgentSessionRuntimeConfig } from \"../../core/agent-session-config.js\";\nimport type { AgentSessionRuntimeMetadata } from \"../../core/agent-session-runtime.js\";\nimport type { AgentAutonomousStatus } from \"../../core/autonomous.js\";\nimport type { BashResult } from \"../../core/bash-executor.js\";\nimport type {\n\tAgentCronJob,\n\tAgentHeartbeatDeliveryMode,\n\tAgentHeartbeatManagementAction,\n\tAgentHeartbeatUpdateAction,\n} from \"../../core/cron-jobs.js\";\nimport type { InputSource } from \"../../core/extensions/types.js\";\nimport type { AcpMcpServerConfig } from \"../../core/mcp/acp-mcp-types.js\";\nimport type { CustomMessage } from \"../../core/messages.js\";\nimport type { QueuedMessageLane, QueuedMessageMutation } from \"../../core/session-action-store.js\";\nimport type { SessionCwdIssue } from \"../../core/session-cwd.js\";\nimport type { DeleteSessionFileResult } from \"../../core/session-file-actions.js\";\nimport type { SessionUsageSummary } from \"../../core/usage.js\";\nimport { PRODUCT } from \"../../product-identity.js\";\nimport type {\n\tAgentConnectionAgentStatus,\n\tAgentConnectionHeartbeat,\n\tAgentConnectionQueueMode,\n\tAgentConnectionResourceSnapshot,\n\tAgentConnectionRlmChildAgentSnapshot,\n\tAgentConnectionSavedSessionScope,\n\tAgentConnectionSavedSessionState,\n\tAgentConnectionScopedModel,\n\tAgentConnectionSessionContext,\n\tAgentConnectionSessionEvent,\n\tAgentConnectionSessionHeader,\n\tAgentConnectionSessionTreeNode,\n\tAgentConnectionSideQuestionEvent,\n\tAgentConnectionSideQuestionTurn,\n\tAgentConnectionState,\n} from \"../agent-connection/types.js\";\nimport type { AgentRosterEntry } from \"./agent-roster.js\";\nimport type { SessionSummary } from \"./daemon-session-list.js\";\nimport type { DaemonRlmCapacityOperation } from \"./daemon-worker-protocol.js\";\nimport type { RlmLedgerMutation } from \"./rlm-ledger-mutations.js\";\n\n/**\n * Local daemon JSONL protocol.\n *\n * This is the transport used by DaemonAgentConnection today, not the final\n * remote gateway protocol. The protocol primitives below are intentionally\n * JSON-serializable so a future gateway can wrap or proxy this local transport\n * without leaking transport details back into InteractiveMode.\n */\n\nexport const DAEMON_PROTOCOL_NAME = PRODUCT.daemonService;\nexport const DAEMON_PROTOCOL_VERSION = 13;\nexport const DAEMON_LEGACY_INSPECTION_PROTOCOL_VERSIONS: readonly number[] = [8, 9, 10];\nexport const DAEMON_COMMAND_ENVELOPE_MIN_PROTOCOL_VERSION = 8;\n// Revision 9 publishes persisted RLM spawn depth on passive session rows.\n// Revision 10 publishes persisted RLM spawn depth on all session catalog rows.\n// Revision 11 adds immediate get/set commands for active-session RLM max depth.\n// Revision 12 publishes idle-residency metadata on session summary rows.\n// Revision 13 narrows agent-origin reach and roster wire shapes to the nuclear family.\n// Revision 15 adds the mutate_queued_message command and queue_message_mutation capability.\n// Revision 16 adds the \"stopping\" workerState and stops reporting disconnected workers as \"ready\".\n// Revision 17 gates authoritative child rosters and transient owned-session recovery context.\n// Revision 18 adds the opt-in RLM quiescence barrier to headless completion.\n// Revision 19 adds daemon-held session input pauses.\n// Revision 20 lets cancellation target a prompt the session owns but has not started.\n// Revision 21 adds capability-gated, session-scoped ACP MCP server replacement.\n// Revision 23 lets workers query the supervisor agent roster on demand.\n// Revision 24 adds the capability-gated agent-roster subscription and push.\n// Revision 25 adds capability-gated direct worker peer transport discovery.\n// Revision 26 publishes own-session usage totals on session summary and saved-session rows.\n// Revision 27 starts the incompatible, product-isolated Base Context command plane.\n// Revision 28 requires native inference ownership for work and exposes optional finalized tool evidence.\n// Revision 29 requires canonical session ownership, framed readers, and fenced persistence ACKs.\n// Revision 30 requires bounded invocation output and agent_end refusal without successful messages.\n// Revision 31 requires canonical producer qualification for native task-origin authority.\n// Revision 32 requires qualified native recovery and source-backed context-epoch checkpoints.\n// Revision 33 retains recovery views in ordinary summary ACKs under adapter-proved replay contracts.\n// Revision 34 requires explicit public summary rendering and live resource acceptance on managed epochs.\n// Revision 35 requires request-time public checkpoints and honest unknown prior-token estimates.\n// Revision 36 requires owner-backed context mode and fixed native continuation contracts.\n// Revision 37 requires original tool-owner qualification and ACKed public tool continuation.\n// Revision 38 excludes the known legacy context extension before native owner loading.\n// Revision 39 requires current serialized orphan registration and kernel writer ownership.\n// Revision 40 requires selected-skill epochs and scoped queued skill bindings.\n// Revision 41 honors explicit compaction model and effort selection.\n// Revision 42 honors explicit branch-summary model and effort selection.\n// Revision 43 requires bounded saved-session query pages on the native catalog path.\n// Revision 44 uses typed native natural-turn continuation outcomes.\n// Revision 45 carries owned checkpoint/resume transitions through the native loop.\n// Revision 46 adds capability-gated explicit resume for bound recurring generic cron jobs.\n// Revision 47 adds capability-gated agent result capsules backed by native session archives.\n// Revision 48 removes remote data export policy from session commands and worker state.\n// Revision 49 requires shared root-family subagent capacity and adds its get/set commands.\nexport const DAEMON_SCHEMA_REVISION = 49;\nexport const DAEMON_SCHEMA_ID = \"protocol-13-schema-49-subagent-capacity\";\n\nexport type DaemonProtocolName = typeof DAEMON_PROTOCOL_NAME;\nexport type DaemonProtocolVersion = number;\nexport type DaemonCommandId = string;\nexport type DaemonEventId = string;\nexport type DaemonEventSequence = number;\nexport interface DaemonEventCursor {\n\tgeneration: string;\n\tsequence: DaemonEventSequence;\n}\nexport type DaemonClientId = string;\nexport type DaemonClientCapability =\n\t| \"attach_snapshot\"\n\t| \"event_sequence\"\n\t| \"extension_ui\"\n\t| \"slim_attach\"\n\t| \"chunked_snapshot\"\n\t| \"client_owned_sessions\";\nexport type DaemonPromptAdmissionCancellationStatus = \"cancelled\" | \"owned\" | \"unknown\";\nexport interface DaemonPromptAdmissionCancellationResult {\n\tstatus: DaemonPromptAdmissionCancellationStatus;\n}\nexport type DaemonServerCapability =\n\t| DaemonClientCapability\n\t| \"delete_rlm_subagent\"\n\t| \"heartbeat_catalog\"\n\t| \"heartbeat_management\"\n\t| \"cron_resume\"\n\t| \"agent_results\"\n\t| \"model_catalog\"\n\t// The daemon honors previousTurns on start_side_question (multi-turn side\n\t// conversations). Clients must check before sending follow-up transcripts.\n\t| \"side_question_transcript\"\n\t// The daemon honors transient and runId on execute_bash (side-conversation\n\t// bash: never recorded into the session, and its bash_start/bash_end events\n\t// carry the transient marker and echoed runId so clients correlate runs by\n\t// identity). Clients must check before sending.\n\t| \"transient_bash\"\n\t| \"agent_roster\"\n\t| \"session_input_admission\"\n\t| \"prompt_admission_cancellation\"\n\t| \"queue_message_mutation\"\n\t| \"authoritative_child_roster\"\n\t| \"owned_session_recovery_context\"\n\t| \"rlm_quiescence_barrier\"\n\t| \"session_input_pause\"\n\t| \"owned_prompt_cancellation\"\n\t| \"acp_mcp_servers\"\n\t| \"direct_peer_transport\"\n\t| \"native_inference_ownership\"\n\t| \"canonical_session_ownership\"\n\t| \"finalized_tool_exchanges\"\n\t| \"rlm_ledger_mutation\";\n\nexport type DaemonReplayStatus = \"complete\" | \"partial\" | \"unavailable\";\n\nexport interface DaemonProtocolInfo {\n\tname: DaemonProtocolName;\n\tversion: DaemonProtocolVersion;\n}\n\nexport const DAEMON_PROTOCOL_INFO: DaemonProtocolInfo = {\n\tname: DAEMON_PROTOCOL_NAME,\n\tversion: DAEMON_PROTOCOL_VERSION,\n};\n\nexport const DAEMON_DEFAULT_CLIENT_CAPABILITIES: readonly DaemonClientCapability[] = [\n\t\"attach_snapshot\",\n\t\"event_sequence\",\n];\n\nexport const DAEMON_SUPPORTED_CLIENT_CAPABILITIES: readonly DaemonClientCapability[] = [\n\t\"attach_snapshot\",\n\t\"event_sequence\",\n\t\"extension_ui\",\n\t\"slim_attach\",\n\t\"chunked_snapshot\",\n\t\"client_owned_sessions\",\n];\n\nexport const DAEMON_DEFAULT_SERVER_CAPABILITIES: readonly DaemonServerCapability[] = [\n\t...DAEMON_SUPPORTED_CLIENT_CAPABILITIES,\n\t\"delete_rlm_subagent\",\n\t\"heartbeat_catalog\",\n\t\"heartbeat_management\",\n\t\"cron_resume\",\n\t\"agent_results\",\n\t\"model_catalog\",\n\t\"side_question_transcript\",\n\t\"transient_bash\",\n\t\"session_input_admission\",\n\t\"prompt_admission_cancellation\",\n\t\"owned_prompt_cancellation\",\n\t\"queue_message_mutation\",\n\t\"authoritative_child_roster\",\n\t\"owned_session_recovery_context\",\n\t\"rlm_quiescence_barrier\",\n\t\"session_input_pause\",\n\t\"acp_mcp_servers\",\n\t\"native_inference_ownership\",\n\t\"canonical_session_ownership\",\n\t\"finalized_tool_exchanges\",\n];\n\n/** Single-use short-lived credential for one direct TUI connection to one worker process incarnation. */\nexport interface DaemonPeerTransportTicket {\n\tpurpose: \"session_client\";\n\tsocketPath: string;\n\t/** Filesystem identity of the worker socket at issue time; re-checked by the client before connecting. */\n\tsocketIdentity: { dev: number; ino: number };\n\tworkerInstanceId: string;\n\tactiveSessionId: string;\n\tgrantId: string;\n\ttoken: string;\n\texpiresAt: string;\n}\n\nexport interface DaemonRuntimeIdentity {\n\tbuildId: string;\n\texecutablePath: string;\n\tentrypointPath?: string;\n\tlauncherPath?: string;\n}\n\nexport type DaemonResumeCursor =\n\t| ({ activeSessionId?: string } & DaemonEventCursor)\n\t| { activeSessionId?: string; eventSequence: DaemonEventSequence };\n\nexport interface DaemonAttachClientMetadata {\n\tclientId?: DaemonClientId;\n\tcapabilities?: readonly DaemonClientCapability[];\n\tresumeCursor?: DaemonResumeCursor;\n\t/** Fresh owner-supplied runtime context for recovering a client-owned worker. Never persisted. */\n\trecoveryConfig?: AgentSessionRuntimeConfig;\n}\n\n/**\n * Client-side env vars forwarded to the daemon so extensions can reach them\n * (e.g. HERDR_PANE_ID/HERDR_SOCKET_PATH that herdr sets per pane). The daemon\n * scopes these to the created session and merges them over process.env for\n * that session's pi.exec() subprocesses — it does not mutate the daemon's own\n * env. Carried on create only: attach must not rebind a session's identity,\n * since watchers (agents view, subagent viewers) also attach.\n */\nexport interface DaemonClientEnv {\n\tenv?: Record<string, string>;\n}\n\nexport type DaemonSessionLifecycle = \"resident\" | \"client_owned\";\n\nexport interface DaemonLaunchEnv {\n\tlaunchEnv?: Record<string, string>;\n}\n\n/**\n * The allowlist of env vars a client may forward. One shared list because it\n * is the wire contract: clients filter before sending and the daemon\n * re-filters on receipt (the socket peer is untrusted).\n */\nexport const DAEMON_CLIENT_ENV_KEYS = [\n\t\"HERDR_ENV\",\n\t\"HERDR_PANE_ID\",\n\t\"HERDR_SOCKET_PATH\",\n\t\"HERDR_TAB_ID\",\n\t\"HERDR_WORKSPACE_ID\",\n] as const;\n\n/** Collect the allowlisted env vars from the client process for the create command. */\nexport function collectDaemonClientEnv(source: NodeJS.ProcessEnv = process.env): Record<string, string> | undefined {\n\tconst env: Record<string, string> = {};\n\tfor (const key of DAEMON_CLIENT_ENV_KEYS) {\n\t\tconst value = source[key];\n\t\tif (value !== undefined) {\n\t\t\tenv[key] = value;\n\t\t}\n\t}\n\treturn Object.keys(env).length > 0 ? env : undefined;\n}\n\nexport function collectDaemonLaunchEnv(source: NodeJS.ProcessEnv = process.env): Record<string, string> {\n\tconst env: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(source)) {\n\t\tif (value !== undefined && !key.startsWith(\"BASE_CONTEXT_INTERNAL_\")) {\n\t\t\tenv[key] = value;\n\t\t}\n\t}\n\treturn env;\n}\n\nexport interface DaemonReplayInfo {\n\tstatus: DaemonReplayStatus;\n\tfromSequence?: DaemonEventSequence;\n\ttoSequence: DaemonEventSequence;\n\tfromCursor?: DaemonEventCursor;\n\ttoCursor?: DaemonEventCursor;\n\treason?: string;\n}\n\nexport interface DaemonEventMeta {\n\tid: DaemonEventId;\n\tprotocol: DaemonProtocolInfo;\n\tactiveSessionId?: string;\n\tsequence?: DaemonEventSequence;\n\tcursor?: DaemonEventCursor;\n\temittedAt: string;\n\treplayed?: boolean;\n}\n\nexport interface DaemonCommandEnvelope<TCommand extends DaemonCommand = DaemonCommand> {\n\ttype: \"command\";\n\tid: DaemonCommandId;\n\tprotocol: DaemonProtocolInfo;\n\tclientId?: DaemonClientId;\n\tcommand: TCommand;\n}\n\nexport type DaemonCommandWire = DaemonCommand | DaemonCommandEnvelope;\n\nexport interface DaemonEventEnvelope<TEvent extends DaemonOutbound = DaemonOutbound> {\n\ttype: \"event\";\n\tid: DaemonEventId;\n\tprotocol: DaemonProtocolInfo;\n\tactiveSessionId?: string;\n\tsequence?: DaemonEventSequence;\n\tcursor?: DaemonEventCursor;\n\temittedAt: string;\n\tevent: TEvent;\n}\n\nexport interface DaemonArtifactReference {\n\tid: string;\n\tsessionId: string;\n\ttype: string;\n\tlogicalPath: string;\n\trelativePath?: string;\n\tmimeType?: string;\n\tmetadata?: Record<string, string | number | boolean | null>;\n}\n\nexport interface DaemonSessionSnapshot {\n\tactiveSessionId: string;\n\tsummary: SessionSummary;\n\tstate: AgentConnectionState;\n\tmessages: AgentMessage[];\n\tsessionContext?: AgentConnectionSessionContext;\n\tsessionTree?: { tree: AgentConnectionSessionTreeNode[]; leafId: string | null };\n\tlastEventSequence: DaemonEventSequence;\n\tlastEventCursor?: DaemonEventCursor;\n\tparent?: {\n\t\tactiveSessionId?: string;\n\t\tsessionId?: string;\n\t\tnodeId?: string;\n\t\tchildId?: string;\n\t};\n\t/** Live RLM child sessions (including grandchildren) hosted by the daemon under this session. */\n\tchildren?: AgentConnectionRlmChildAgentSnapshot[];\n}\n\nexport interface DaemonAttachResult {\n\tprotocol: DaemonProtocolInfo;\n\tactiveSessionId: string;\n\t/** Omitted for clients with the \"slim_attach\" capability; use snapshot.summary. */\n\tstate?: SessionSummary;\n\t/** Omitted for clients with the \"slim_attach\" capability; use snapshot.messages. */\n\tmessages?: AgentMessage[];\n\tsnapshot: DaemonSessionSnapshot;\n\treplay: DaemonReplayInfo;\n\tlastEventSequence: DaemonEventSequence;\n\tlastEventCursor?: DaemonEventCursor;\n\tsnapshotStream?: {\n\t\tid: string;\n\t\tmessageCount: number;\n\t\ttargetChunkBytes: number;\n\t};\n\tclient: {\n\t\tid: DaemonClientId;\n\t\tcapabilities: DaemonClientCapability[];\n\t};\n}\n\nexport const DAEMON_UPDATE_RESTART_FORMAT_VERSION = 1;\n\nexport interface DaemonUpdateRestartQueue {\n\tactions: SessionActionRecoverySnapshot;\n\tnextTurn: CustomMessage[];\n}\n\nexport interface DaemonUpdateRestartSession {\n\tactiveSessionId: string;\n\tsessionId: string;\n\tsessionFile: string;\n\tcwd: string;\n\tconfig: AgentSessionRuntimeConfig;\n\truntimeMetadata?: AgentSessionRuntimeMetadata;\n\tclientEnv?: Record<string, string>;\n\tqueue: DaemonUpdateRestartQueue;\n\tshouldResume: boolean;\n\twasStreaming: boolean;\n\twasCompacting: boolean;\n\twasBashRunning: boolean;\n\thadRunningRlmChildren: boolean;\n\twasRetrying: boolean;\n\thadAcceptedPromptInFlight: boolean;\n}\n\nexport interface DaemonUpdateRestartManifest {\n\tformatVersion: typeof DAEMON_UPDATE_RESTART_FORMAT_VERSION;\n\tcreatedAt: string;\n\tsessions: DaemonUpdateRestartSession[];\n\tdiscardedActiveSessionIds?: string[];\n}\n\nexport type DaemonSavedSessionListCommand =\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"list_saved_sessions\";\n\t\t\tactiveSessionId: string;\n\t\t\tscope: AgentConnectionSavedSessionScope;\n\t\t\tpage?: SavedSessionPageQuery;\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"list_saved_sessions\";\n\t\t\tcwd: string;\n\t\t\tsessionDir?: string;\n\t\t\tscope: AgentConnectionSavedSessionScope;\n\t\t\tpage?: SavedSessionPageQuery;\n\t };\n\nexport type DaemonCommand =\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"list\";\n\t\t\tall?: boolean;\n\t\t\tcwd?: string;\n\t\t\tsessionDir?: string;\n\t\t\tincludeClientOwned?: boolean;\n\t }\n\t| DaemonSavedSessionListCommand\n\t| { id?: string; type: \"list_agent_peers\"; workerToken: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"rlm_ledger_mutate\";\n\t\t\tworkerToken: string;\n\t\t\tworkerInstanceId: string;\n\t\t\tmutation: RlmLedgerMutation;\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"rlm_capacity\";\n\t\t\tworkerToken: string;\n\t\t\tworkerInstanceId: string;\n\t\t\toperation: DaemonRlmCapacityOperation;\n\t }\n\t| { id?: string; type: \"get_direct_worker_transport\"; activeSessionId: string }\n\t| { id?: string; type: \"roster_subscribe\" }\n\t| { id?: string; type: \"roster_unsubscribe\" }\n\t| ({\n\t\t\tid?: string;\n\t\t\ttype: \"create\";\n\t\t\tsessionPath?: string;\n\t\t\tcontinueRecent?: boolean;\n\t\t\tnoSession?: boolean;\n\t\t\tname?: string;\n\t\t\tconfig?: AgentSessionRuntimeConfig;\n\t\t\truntimeMetadata?: AgentSessionRuntimeMetadata;\n\t\t\tlifecycle?: DaemonSessionLifecycle;\n\t } & DaemonClientEnv &\n\t\t\tDaemonLaunchEnv)\n\t// Attach env is adopt-if-absent only: it fills identity for env-less\n\t// sessions (e.g. cron-created) but never rebinds one, since watchers\n\t// (agents view, subagent viewers) also attach.\n\t| ({\n\t\t\tid?: string;\n\t\t\ttype: \"attach\";\n\t\t\tactiveSessionId: string;\n\t\t\tsupportsExtensionUi?: boolean;\n\t } & DaemonAttachClientMetadata &\n\t\t\tDaemonClientEnv &\n\t\t\tDaemonLaunchEnv)\n\t| ({\n\t\t\tid?: string;\n\t\t\ttype: \"reattach\";\n\t\t\tactiveSessionId: string;\n\t\t\ttargetActiveSessionId: string;\n\t\t\tsupportsExtensionUi?: boolean;\n\t } & DaemonAttachClientMetadata &\n\t\t\tDaemonClientEnv &\n\t\t\tDaemonLaunchEnv)\n\t| { id?: string; type: \"detach\"; activeSessionId?: string }\n\t| { id?: string; type: \"complete_owned_session\"; activeSessionId: string }\n\t| { id?: string; type: \"promote_owned_session\"; activeSessionId: string }\n\t| { id?: string; type: \"kill\"; activeSessionId: string }\n\t| { id?: string; type: \"rename\"; activeSessionId: string; name: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"prompt\";\n\t\t\tactiveSessionId: string;\n\t\t\tmessage: string;\n\t\t\tcontent?: (TextContent | ImageContent)[];\n\t\t\timages?: ImageContent[];\n\t\t\tstreamingBehavior?: \"steer\" | \"followUp\";\n\t\t\tqueueIfBusy?: boolean;\n\t\t\texpandPromptTemplates?: boolean;\n\t\t\tsource?: InputSource;\n\t\t\tagentMessageId?: string;\n\t\t\tcustomMessage?: CustomMessage;\n\t\t\t/** Unique only when the caller needs cancellable pre-ownership admission. */\n\t\t\tadmissionId?: string;\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"cancel_prompt_admission\";\n\t\t\tactiveSessionId: string;\n\t\t\tadmissionId: string;\n\t\t\t/** Cancel session-owned work too when it has not started delivery. */\n\t\t\tcancelOwned?: boolean;\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"prompt_and_wait\";\n\t\t\tactiveSessionId: string;\n\t\t\tmessage: string;\n\t\t\tcontent?: (TextContent | ImageContent)[];\n\t\t\timages?: ImageContent[];\n\t\t\tstreamingBehavior?: \"steer\" | \"followUp\";\n\t\t\tqueueIfBusy?: boolean;\n\t\t\texpandPromptTemplates?: boolean;\n\t\t\tsource?: InputSource;\n\t\t\t/** Unique only when the caller needs cancellable pre-ownership admission. */\n\t\t\tadmissionId?: string;\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"steer\";\n\t\t\tactiveSessionId: string;\n\t\t\tmessage: string;\n\t\t\tcontent?: (TextContent | ImageContent)[];\n\t\t\timages?: ImageContent[];\n\t\t\tqueueKey?: string;\n\t\t\texpandPromptTemplates?: boolean;\n\t\t\tagentMessageId?: string;\n\t\t\tcustomMessage?: CustomMessage;\n\t\t\tprefixMessages?: CustomMessage[];\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"follow_up\";\n\t\t\tactiveSessionId: string;\n\t\t\tmessage: string;\n\t\t\tcontent?: (TextContent | ImageContent)[];\n\t\t\timages?: ImageContent[];\n\t\t\tqueueKey?: string;\n\t\t\texpandPromptTemplates?: boolean;\n\t\t\tagentMessageId?: string;\n\t\t\tcustomMessage?: CustomMessage;\n\t\t\tprefixMessages?: CustomMessage[];\n\t }\n\t| { id?: string; type: \"restore_next_turn\"; activeSessionId: string; messages: CustomMessage[] }\n\t| { id?: string; type: \"restore_actions\"; activeSessionId: string; snapshot: SessionActionRecoverySnapshot }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"append_custom_message\";\n\t\t\tactiveSessionId: string;\n\t\t\tmessage: Pick<CustomMessage, \"customType\" | \"content\" | \"display\" | \"details\">;\n\t }\n\t| { id?: string; type: \"resume_queue\"; activeSessionId: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"send_message\";\n\t\t\ttargetActiveSessionId: string;\n\t\t\tmessage: string;\n\t\t\tfromActiveSessionId?: string;\n\t\t\t/** Internal worker-origin marker; public clients remain unrestricted. */\n\t\t\tagentOrigin?: boolean;\n\t\t\tdeliveryMode?: AgentSessionMessageDeliveryMode;\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"send_result\";\n\t\t\ttargetActiveSessionId: string;\n\t\t\tsummary: string;\n\t\t\tfindings: string;\n\t\t\tfromActiveSessionId?: string;\n\t\t\t/** Internal worker-origin marker; public clients remain unrestricted. */\n\t\t\tagentOrigin?: boolean;\n\t\t\tdeliveryMode?: AgentSessionMessageDeliveryMode;\n\t }\n\t| { id?: string; type: \"agent_messages_status\"; activeSessionId?: string }\n\t| { id?: string; type: \"agent_messages_pause\"; activeSessionId?: string }\n\t| { id?: string; type: \"agent_messages_resume\"; activeSessionId?: string }\n\t| { id?: string; type: \"agent_messages_clear\"; activeSessionId: string }\n\t| { id?: string; type: \"abort\"; activeSessionId: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"start_side_question\";\n\t\t\tactiveSessionId: string;\n\t\t\tsideQuestionId: string;\n\t\t\tquestion: string;\n\t\t\tpreviousTurns?: AgentConnectionSideQuestionTurn[];\n\t }\n\t| { id?: string; type: \"abort_side_question\"; activeSessionId: string; sideQuestionId: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"execute_bash\";\n\t\t\tactiveSessionId: string;\n\t\t\tcommand: string;\n\t\t\texcludeFromContext?: boolean;\n\t\t\ttransient?: boolean;\n\t\t\trunId?: string;\n\t }\n\t| { id?: string; type: \"abort_bash\"; activeSessionId: string }\n\t| { id?: string; type: \"cancel_rlm_child\"; activeSessionId: string; childId: string }\n\t| { id?: string; type: \"delete_rlm_subagent\"; activeSessionId: string; childId: string }\n\t| { id?: string; type: \"wait_for_idle\"; activeSessionId: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"wait_for_headless_completion\";\n\t\t\tactiveSessionId: string;\n\t\t\twaitForRlmQuiescence?: boolean;\n\t }\n\t| { id?: string; type: \"get_session_header\"; activeSessionId: string }\n\t| { id?: string; type: \"get_state\"; activeSessionId: string }\n\t| { id?: string; type: \"get_connection_state\"; activeSessionId: string }\n\t| { id?: string; type: \"get_messages\"; activeSessionId: string }\n\t| { id?: string; type: \"get_rlm_children\"; activeSessionId: string }\n\t| { id?: string; type: \"get_session_stats\"; activeSessionId: string }\n\t| { id?: string; type: \"get_context_tree\"; activeSessionId: string }\n\t| { id?: string; type: \"get_commands\"; activeSessionId: string }\n\t| { id?: string; type: \"get_resource_snapshot\"; activeSessionId: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"replace_acp_mcp_servers\";\n\t\t\tactiveSessionId: string;\n\t\t\townerId: string;\n\t\t\tservers: AcpMcpServerConfig[];\n\t }\n\t| { id?: string; type: \"get_model_catalog\"; activeSessionId: string }\n\t| { id?: string; type: \"get_available_models\"; activeSessionId: string }\n\t| { id?: string; type: \"get_queue\"; activeSessionId: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"mutate_queued_message\";\n\t\t\tactiveSessionId: string;\n\t\t\tlane: QueuedMessageLane;\n\t\t\tindex: number;\n\t\t\texpectedText: string;\n\t\t\tmutation: QueuedMessageMutation;\n\t }\n\t| { id?: string; type: \"clear_queue\"; activeSessionId: string }\n\t| { id?: string; type: \"abort_and_clear_queue\"; activeSessionId: string }\n\t| { id?: string; type: \"acquire_session_input_pause\"; activeSessionId: string; leaseKey: string }\n\t| { id?: string; type: \"release_session_input_pause\"; activeSessionId: string; pauseId: string }\n\t| { id?: string; type: \"cron_list\"; activeSessionId?: string; includeInactive?: boolean }\n\t| { id?: string; type: \"heartbeats_list\"; activeSessionId?: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"heartbeat_manage\";\n\t\t\tactiveSessionId: string;\n\t\t\tjobId: string;\n\t\t\taction: AgentHeartbeatManagementAction;\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"cron_add\";\n\t\t\tactiveSessionId: string;\n\t\t\tschedule: string;\n\t\t\tprompt: string;\n\t\t\tpromoteOwnedSession?: boolean;\n\t }\n\t| { id?: string; type: \"cron_cancel\"; activeSessionId?: string; jobId: string }\n\t| { id?: string; type: \"cron_resume\"; activeSessionId?: string; jobId: string }\n\t| { id?: string; type: \"heartbeat_get\"; activeSessionId: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"heartbeat_set\";\n\t\t\tactiveSessionId: string;\n\t\t\tschedule: string;\n\t\t\tprompt: string;\n\t\t\tdeliveryMode?: AgentHeartbeatDeliveryMode;\n\t\t\tpromoteOwnedSession?: boolean;\n\t }\n\t| { id?: string; type: \"heartbeat_update\"; activeSessionId: string; action: AgentHeartbeatUpdateAction }\n\t| { id?: string; type: \"set_model\"; activeSessionId: string; provider: string; modelId: string }\n\t| { id?: string; type: \"cycle_model\"; activeSessionId: string; direction?: \"forward\" | \"backward\" }\n\t| { id?: string; type: \"set_scoped_models\"; activeSessionId: string; scopedModels: AgentConnectionScopedModel[] }\n\t| { id?: string; type: \"set_thinking_level\"; activeSessionId: string; level: ThinkingLevel }\n\t| { id?: string; type: \"set_service_tier\"; activeSessionId: string; serviceTier: ServiceTier }\n\t| { id?: string; type: \"cycle_thinking_level\"; activeSessionId: string }\n\t| { id?: string; type: \"set_transport\"; activeSessionId: string; transport: Transport }\n\t| { id?: string; type: \"set_steering_mode\"; activeSessionId: string; mode: AgentConnectionQueueMode }\n\t| { id?: string; type: \"set_follow_up_mode\"; activeSessionId: string; mode: AgentConnectionQueueMode }\n\t| { id?: string; type: \"set_auto_compaction\"; activeSessionId: string; enabled: boolean }\n\t| { id?: string; type: \"set_auto_retry\"; activeSessionId: string; enabled: boolean }\n\t| { id?: string; type: \"compact\"; activeSessionId: string; customInstructions?: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"refine\";\n\t\t\tactiveSessionId: string;\n\t\t\tinstructions?: string;\n\t\t\trollbackId?: string;\n\t\t\tglobal?: boolean;\n\t }\n\t| { id?: string; type: \"abort_compaction\"; activeSessionId: string }\n\t| { id?: string; type: \"abort_branch_summary\"; activeSessionId: string }\n\t| { id?: string; type: \"abort_retry\"; activeSessionId: string }\n\t| { id?: string; type: \"execute_bash_and_wait\"; activeSessionId: string; command: string }\n\t| { id?: string; type: \"reload\"; activeSessionId: string }\n\t| { id?: string; type: \"new_session\"; activeSessionId: string; parentSession?: string }\n\t| { id?: string; type: \"switch_session\"; activeSessionId: string; sessionPath: string; cwdOverride?: string }\n\t| { id?: string; type: \"fork\"; activeSessionId: string; entryId: string; position?: \"before\" | \"at\" }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"navigate_tree\";\n\t\t\tactiveSessionId: string;\n\t\t\ttargetId: string;\n\t\t\tsummarize?: boolean;\n\t\t\tcustomInstructions?: string;\n\t\t\treplaceInstructions?: boolean;\n\t\t\tlabel?: string;\n\t }\n\t| { id?: string; type: \"import_jsonl\"; activeSessionId: string; inputPath: string; cwdOverride?: string }\n\t| { id?: string; type: \"export_html\"; activeSessionId: string; outputPath?: string }\n\t| { id?: string; type: \"export_jsonl\"; activeSessionId: string; outputPath?: string }\n\t| { id?: string; type: \"set_session_name\"; activeSessionId: string; name: string; workerToken?: string }\n\t| { id?: string; type: \"get_rlm_max_subagents_status\"; activeSessionId: string }\n\t| { id?: string; type: \"set_rlm_max_subagents\"; activeSessionId: string; maxSubagents: number }\n\t| { id?: string; type: \"get_rlm_max_depth_status\"; activeSessionId: string }\n\t| { id?: string; type: \"set_rlm_max_depth\"; activeSessionId: string; maxDepth: number; global?: boolean }\n\t| { id?: string; type: \"rename_saved_session\"; activeSessionId?: string; sessionPath: string; name: string }\n\t| { id?: string; type: \"delete_saved_session\"; activeSessionId?: string; sessionPath: string }\n\t| { id?: string; type: \"get_session_context\"; activeSessionId: string }\n\t| { id?: string; type: \"get_session_tree\"; activeSessionId: string }\n\t| { id?: string; type: \"get_user_messages_for_forking\"; activeSessionId: string }\n\t| { id?: string; type: \"get_last_assistant_text\"; activeSessionId: string }\n\t| { id?: string; type: \"get_system_prompt\"; activeSessionId: string }\n\t| { id?: string; type: \"get_tool_definition\"; activeSessionId: string; name: string }\n\t| { id?: string; type: \"set_session_entry_label\"; activeSessionId: string; entryId: string; label?: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"extension_ui_response\";\n\t\t\tactiveSessionId: string;\n\t\t\trequestId: string;\n\t\t\tresponse: DaemonExtensionUIResponse;\n\t }\n\t| { id?: string; type: \"ack_result\"; commandId: string }\n\t| { id?: string; type: \"prepare_update_restart\" }\n\t| { id?: string; type: \"retry_worker\"; activeSessionId: string }\n\t| { id?: string; type: \"restart\" }\n\t| { id?: string; type: \"shutdown\"; force?: boolean };\n\ntype DaemonCommandName = DaemonCommand[\"type\"];\n\nexport interface DaemonCommandCompatibility {\n\tminProtocol: number;\n\tminSchemaRevision?: number;\n\tcapability?: DaemonServerCapability;\n}\n\nexport const NATIVE_INFERENCE_OWNERSHIP_COMPATIBILITY = {\n\tminProtocol: 9,\n\tminSchemaRevision: 28,\n\tcapability: \"native_inference_ownership\",\n} as const satisfies DaemonCommandCompatibility;\n\nexport const CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY = {\n\tminProtocol: 13,\n\tminSchemaRevision: 49,\n\tcapability: \"canonical_session_ownership\",\n} as const satisfies DaemonCommandCompatibility;\n\nexport const NATIVE_WORK_COMPATIBILITIES = [\n\tCANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tNATIVE_INFERENCE_OWNERSHIP_COMPATIBILITY,\n] as const;\n\n// These commands do not hydrate a worker, resume a queue, or drain refinement.\nconst LEGACY_INSPECTION_COMMANDS: ReadonlySet<DaemonCommandName> = new Set([\n\t\"ack_result\",\n\t\"list\",\n\t\"get_state\",\n\t\"get_messages\",\n\t\"roster_subscribe\",\n\t\"roster_unsubscribe\",\n]);\n\nexport function isLegacyDaemonInspection(command: DaemonCommand): boolean {\n\treturn (\n\t\tLEGACY_INSPECTION_COMMANDS.has(command.type) ||\n\t\t(command.type === \"list_saved_sessions\" && !(\"activeSessionId\" in command))\n\t);\n}\n\nconst LEGACY_DAEMON_COMMAND = { minProtocol: 8 } as const;\nconst RLM_MAX_DEPTH_COMMAND = { minProtocol: 8, minSchemaRevision: 11 } as const;\nconst RLM_CAPACITY_COMMAND = { minProtocol: 13, minSchemaRevision: 49 } as const;\nconst SESSION_INPUT_ADMISSION_COMMAND = {\n\tminProtocol: 8,\n\tcapability: \"session_input_admission\",\n} as const;\nconst PROMPT_ADMISSION_CANCELLATION_COMMAND = {\n\tminProtocol: 8,\n\tminSchemaRevision: 8,\n\tcapability: \"prompt_admission_cancellation\",\n} as const;\nconst OWNED_PROMPT_CANCELLATION_COMMAND = {\n\tminProtocol: 8,\n\tminSchemaRevision: 20,\n\tcapability: \"owned_prompt_cancellation\",\n} as const;\nconst CLIENT_OWNED_DAEMON_COMMAND = {\n\tminProtocol: 8,\n\tcapability: \"client_owned_sessions\",\n} as const;\nconst DELETE_RLM_SUBAGENT_COMMAND = {\n\tminProtocol: 8,\n\tcapability: \"delete_rlm_subagent\",\n} as const;\nconst FLAT_SESSION_TREE_COMMAND = { minProtocol: 8 } as const;\nconst AUTHORITATIVE_CHILD_ROSTER_COMMAND = {\n\tminProtocol: 8,\n\tminSchemaRevision: 17,\n\tcapability: \"authoritative_child_roster\",\n} as const;\nconst OWNED_SESSION_RECOVERY_CONTEXT = {\n\tminProtocol: 8,\n\tminSchemaRevision: 17,\n\tcapability: \"owned_session_recovery_context\",\n} as const;\nconst RLM_QUIESCENCE_BARRIER_COMMAND = {\n\tminProtocol: 8,\n\tminSchemaRevision: 18,\n\tcapability: \"rlm_quiescence_barrier\",\n} as const;\nconst SESSION_INPUT_PAUSE_COMMAND = {\n\tminProtocol: 8,\n\tminSchemaRevision: 19,\n\tcapability: \"session_input_pause\",\n} as const;\nconst AGENT_PEER_LIST_COMMAND = { minProtocol: 8, minSchemaRevision: 23 } as const;\nconst DIRECT_PEER_TRANSPORT_COMMAND = {\n\tminProtocol: 8,\n\tminSchemaRevision: 25,\n\tcapability: \"direct_peer_transport\",\n} as const;\n\nexport const DAEMON_COMMAND_COMPATIBILITY = {\n\tack_result: LEGACY_DAEMON_COMMAND,\n\tlist: LEGACY_DAEMON_COMMAND,\n\tlist_saved_sessions: LEGACY_DAEMON_COMMAND,\n\tlist_agent_peers: { ...AGENT_PEER_LIST_COMMAND, minProtocol: 10 },\n\trlm_ledger_mutate: { minProtocol: 10, minSchemaRevision: 28, capability: \"rlm_ledger_mutation\" },\n\trlm_capacity: RLM_CAPACITY_COMMAND,\n\tget_direct_worker_transport: { ...DIRECT_PEER_TRANSPORT_COMMAND, minProtocol: 10 },\n\tcreate: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tattach: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\treattach: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tdetach: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tcomplete_owned_session: { ...CLIENT_OWNED_DAEMON_COMMAND, minProtocol: 10 },\n\tpromote_owned_session: { ...CLIENT_OWNED_DAEMON_COMMAND, minProtocol: 10 },\n\tkill: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\trename: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tprompt: { ...SESSION_INPUT_ADMISSION_COMMAND, minProtocol: 10 },\n\tcancel_prompt_admission: { ...PROMPT_ADMISSION_CANCELLATION_COMMAND, minProtocol: 10 },\n\tprompt_and_wait: { ...SESSION_INPUT_ADMISSION_COMMAND, minProtocol: 10 },\n\tsteer: { ...SESSION_INPUT_ADMISSION_COMMAND, minProtocol: 10 },\n\tfollow_up: { ...SESSION_INPUT_ADMISSION_COMMAND, minProtocol: 10 },\n\trestore_next_turn: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\trestore_actions: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tappend_custom_message: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tresume_queue: { ...SESSION_INPUT_ADMISSION_COMMAND, minProtocol: 10 },\n\tsend_message: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tsend_result: { minProtocol: 11, minSchemaRevision: 47, capability: \"agent_results\" },\n\tagent_messages_status: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tagent_messages_pause: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tagent_messages_resume: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tagent_messages_clear: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tabort: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tstart_side_question: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tabort_side_question: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\texecute_bash: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tabort_bash: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tcancel_rlm_child: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tdelete_rlm_subagent: { ...DELETE_RLM_SUBAGENT_COMMAND, minProtocol: 10 },\n\twait_for_idle: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\twait_for_headless_completion: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_session_header: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_state: LEGACY_DAEMON_COMMAND,\n\tget_connection_state: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_messages: LEGACY_DAEMON_COMMAND,\n\tget_rlm_children: { ...AUTHORITATIVE_CHILD_ROSTER_COMMAND, minProtocol: 10 },\n\tget_session_stats: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_context_tree: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_commands: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_resource_snapshot: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\treplace_acp_mcp_servers: { minProtocol: 10, minSchemaRevision: 22, capability: \"acp_mcp_servers\" },\n\tget_model_catalog: { minProtocol: 10, capability: \"model_catalog\" },\n\tget_available_models: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_queue: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tmutate_queued_message: { minProtocol: 10, minSchemaRevision: 15, capability: \"queue_message_mutation\" },\n\tclear_queue: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tabort_and_clear_queue: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tacquire_session_input_pause: { ...SESSION_INPUT_PAUSE_COMMAND, minProtocol: 10 },\n\trelease_session_input_pause: { ...SESSION_INPUT_PAUSE_COMMAND, minProtocol: 10 },\n\tcron_list: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\theartbeats_list: { minProtocol: 10, capability: \"heartbeat_catalog\" },\n\troster_subscribe: { minProtocol: 8, capability: \"agent_roster\" },\n\troster_unsubscribe: { minProtocol: 8, capability: \"agent_roster\" },\n\theartbeat_manage: { minProtocol: 10, capability: \"heartbeat_management\" },\n\tcron_add: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tcron_cancel: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tcron_resume: { minProtocol: 11, minSchemaRevision: 46, capability: \"cron_resume\" },\n\theartbeat_get: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\theartbeat_set: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\theartbeat_update: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_model: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tcycle_model: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_scoped_models: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_thinking_level: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_service_tier: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tcycle_thinking_level: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_transport: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_steering_mode: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_follow_up_mode: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_auto_compaction: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_auto_retry: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tcompact: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\trefine: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tabort_compaction: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tabort_branch_summary: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tabort_retry: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\texecute_bash_and_wait: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\treload: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tnew_session: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tswitch_session: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tfork: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tnavigate_tree: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\timport_jsonl: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\texport_html: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\texport_jsonl: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_session_name: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_rlm_max_subagents_status: RLM_CAPACITY_COMMAND,\n\tset_rlm_max_subagents: RLM_CAPACITY_COMMAND,\n\tget_rlm_max_depth_status: { ...RLM_MAX_DEPTH_COMMAND, minProtocol: 10 },\n\tset_rlm_max_depth: { ...RLM_MAX_DEPTH_COMMAND, minProtocol: 10 },\n\trename_saved_session: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tdelete_saved_session: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_session_context: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_session_tree: { ...FLAT_SESSION_TREE_COMMAND, minProtocol: 10 },\n\tget_user_messages_for_forking: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_last_assistant_text: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_system_prompt: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_tool_definition: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_session_entry_label: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\textension_ui_response: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tprepare_update_restart: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tretry_worker: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\trestart: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tshutdown: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n} as const satisfies Record<DaemonCommandName, DaemonCommandCompatibility>;\n\n/**\n * Which endpoint serves each command when a client holds both a supervisor\n * (control-plane) and a direct worker (session-plane) connection. Session is\n * the default for session-addressed commands; \"control\" marks supervisor\n * semantics: worker lifecycle, cross-worker targeting, daemon-global\n * registries, and names a worker resolves differently (a worker's \"list\" is\n * only its own sessions). Total over DaemonCommand[\"type\"], so an\n * unclassified command is a compile error and never routes direct.\n */\nexport const DAEMON_COMMAND_PLANE = {\n\tack_result: \"control\",\n\tlist: \"control\",\n\tlist_saved_sessions: \"control\",\n\tlist_agent_peers: \"control\",\n\trlm_ledger_mutate: \"control\",\n\trlm_capacity: \"control\",\n\tget_direct_worker_transport: \"control\",\n\tcreate: \"control\",\n\tattach: \"session\",\n\treattach: \"control\",\n\tdetach: \"session\",\n\tcomplete_owned_session: \"control\",\n\tpromote_owned_session: \"control\",\n\tkill: \"control\",\n\trename: \"control\",\n\tprompt: \"session\",\n\tcancel_prompt_admission: \"session\",\n\tprompt_and_wait: \"session\",\n\tsteer: \"session\",\n\tfollow_up: \"session\",\n\trestore_next_turn: \"session\",\n\trestore_actions: \"session\",\n\tappend_custom_message: \"session\",\n\tresume_queue: \"session\",\n\tsend_message: \"control\",\n\tsend_result: \"control\",\n\tagent_messages_status: \"control\",\n\tagent_messages_pause: \"control\",\n\tagent_messages_resume: \"control\",\n\tagent_messages_clear: \"control\",\n\tabort: \"session\",\n\tstart_side_question: \"session\",\n\tabort_side_question: \"session\",\n\texecute_bash: \"session\",\n\tabort_bash: \"session\",\n\tcancel_rlm_child: \"session\",\n\tdelete_rlm_subagent: \"session\",\n\twait_for_idle: \"session\",\n\twait_for_headless_completion: \"session\",\n\tget_session_header: \"session\",\n\tget_state: \"session\",\n\tget_connection_state: \"session\",\n\tget_messages: \"session\",\n\tget_rlm_children: \"session\",\n\tget_session_stats: \"session\",\n\tget_context_tree: \"session\",\n\tget_commands: \"session\",\n\tget_resource_snapshot: \"session\",\n\treplace_acp_mcp_servers: \"session\",\n\tget_model_catalog: \"session\",\n\tget_available_models: \"session\",\n\tget_queue: \"session\",\n\tmutate_queued_message: \"session\",\n\tclear_queue: \"session\",\n\tabort_and_clear_queue: \"session\",\n\tacquire_session_input_pause: \"session\",\n\trelease_session_input_pause: \"session\",\n\tcron_list: \"control\",\n\theartbeats_list: \"control\",\n\troster_subscribe: \"control\",\n\troster_unsubscribe: \"control\",\n\theartbeat_manage: \"control\",\n\tcron_add: \"control\",\n\tcron_cancel: \"control\",\n\tcron_resume: \"control\",\n\theartbeat_get: \"control\",\n\theartbeat_set: \"control\",\n\theartbeat_update: \"control\",\n\tset_model: \"session\",\n\tcycle_model: \"session\",\n\tset_scoped_models: \"session\",\n\tset_thinking_level: \"session\",\n\tset_service_tier: \"session\",\n\tcycle_thinking_level: \"session\",\n\tset_transport: \"session\",\n\tset_steering_mode: \"session\",\n\tset_follow_up_mode: \"session\",\n\tset_auto_compaction: \"session\",\n\tset_auto_retry: \"session\",\n\tcompact: \"session\",\n\trefine: \"session\",\n\tabort_compaction: \"session\",\n\tabort_branch_summary: \"session\",\n\tabort_retry: \"session\",\n\texecute_bash_and_wait: \"session\",\n\treload: \"session\",\n\tnew_session: \"session\",\n\tswitch_session: \"session\",\n\tfork: \"session\",\n\tnavigate_tree: \"session\",\n\timport_jsonl: \"session\",\n\texport_html: \"session\",\n\texport_jsonl: \"session\",\n\tset_session_name: \"control\",\n\tget_rlm_max_subagents_status: \"session\",\n\tset_rlm_max_subagents: \"session\",\n\tget_rlm_max_depth_status: \"session\",\n\tset_rlm_max_depth: \"session\",\n\trename_saved_session: \"control\",\n\tdelete_saved_session: \"control\",\n\tget_session_context: \"session\",\n\tget_session_tree: \"session\",\n\tget_user_messages_for_forking: \"session\",\n\tget_last_assistant_text: \"session\",\n\tget_system_prompt: \"session\",\n\tget_tool_definition: \"session\",\n\tset_session_entry_label: \"session\",\n\textension_ui_response: \"session\",\n\tprepare_update_restart: \"control\",\n\tretry_worker: \"control\",\n\trestart: \"control\",\n\tshutdown: \"control\",\n} as const satisfies Record<DaemonCommandName, \"session\" | \"control\">;\n\nexport function isSessionPlaneDaemonCommand(type: string): boolean {\n\treturn (DAEMON_COMMAND_PLANE as Record<string, \"session\" | \"control\" | undefined>)[type] === \"session\";\n}\n\nexport function getDaemonCommandCompatibilities(command: DaemonCommand): readonly DaemonCommandCompatibility[] {\n\tconst requirements: DaemonCommandCompatibility[] = isLegacyDaemonInspection(command)\n\t\t? []\n\t\t: [...NATIVE_WORK_COMPATIBILITIES];\n\tif ((command.type === \"attach\" || command.type === \"reattach\") && command.recoveryConfig !== undefined) {\n\t\trequirements.push(OWNED_SESSION_RECOVERY_CONTEXT);\n\t}\n\tif ((command.type === \"prompt\" || command.type === \"prompt_and_wait\") && command.admissionId !== undefined) {\n\t\trequirements.push(PROMPT_ADMISSION_CANCELLATION_COMMAND);\n\t}\n\tif (command.type === \"wait_for_headless_completion\" && command.waitForRlmQuiescence === true) {\n\t\trequirements.push(RLM_QUIESCENCE_BARRIER_COMMAND);\n\t}\n\tif (command.type === \"cancel_prompt_admission\" && command.cancelOwned === true) {\n\t\trequirements.push(OWNED_PROMPT_CANCELLATION_COMMAND);\n\t}\n\tconst commandRequirement = DAEMON_COMMAND_COMPATIBILITY[command.type];\n\treturn commandRequirement === CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY\n\t\t? requirements\n\t\t: [...requirements, commandRequirement];\n}\n\nexport function meetsDaemonCommandCompatibility(\n\thello: {\n\t\tprotocol: DaemonProtocolInfo;\n\t\tschemaRevision?: number;\n\t\tserverCapabilities?: readonly DaemonServerCapability[];\n\t},\n\tcompatibility: DaemonCommandCompatibility,\n): boolean {\n\treturn (\n\t\thello.protocol.version >= compatibility.minProtocol &&\n\t\t(compatibility.minSchemaRevision === undefined ||\n\t\t\t(hello.schemaRevision ?? 0) >= compatibility.minSchemaRevision) &&\n\t\t(compatibility.capability === undefined || hello.serverCapabilities?.includes(compatibility.capability) === true)\n\t);\n}\n\nexport type DaemonResponse =\n\t| { id?: string; type: \"response\"; command: string; success: true; data?: unknown }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"response\";\n\t\t\tcommand: string;\n\t\t\tsuccess: false;\n\t\t\terror: string;\n\t\t\terrorInfo?: DaemonErrorInfo;\n\t };\n\nexport type DaemonErrorInfo =\n\t| { code: \"missing_session_cwd\"; issue: SessionCwdIssue }\n\t| { code: \"session_import_file_not_found\"; filePath: string }\n\t| { code: \"session_already_active\"; sessionPath: string; activeSessionId?: string }\n\t| { code: \"command_result_uncertain\"; clientId: DaemonClientId; commandId: DaemonCommandId };\n\nexport type DaemonSessionClosedReason = \"killed\" | \"shutdown\" | \"completed\" | \"replaced\" | \"update\";\nexport type DaemonClosingReason = \"shutdown\" | \"update\";\n\nexport type DaemonExtensionUIResponse = { value: string } | { confirmed: boolean } | { cancelled: true };\n\nexport function isDaemonDialogExtensionUiRequest(method: string): boolean {\n\treturn method === \"select\" || method === \"confirm\" || method === \"input\" || method === \"editor\";\n}\n\n/**\n * True when a daemon rejected a command it does not know, i.e. the daemon\n * process was started from a build that predates the command.\n */\nexport function isUnknownDaemonCommandError(error: unknown, command: DaemonCommand[\"type\"]): boolean {\n\treturn error instanceof Error && error.message.includes(`Unknown daemon command: ${command}`);\n}\n\nexport type DaemonRequestProgress =\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"session_list_progress\";\n\t\t\tcommand: \"list_saved_sessions\";\n\t\t\tactiveSessionId?: string;\n\t\t\tloaded: number;\n\t\t\ttotal: number;\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"session_list_item\";\n\t\t\tcommand: \"list_saved_sessions\";\n\t\t\tactiveSessionId?: string;\n\t\t\tsession: DaemonSavedSessionInfo;\n\t };\n\nexport interface DaemonSavedSessionInfo {\n\tpath: string;\n\tid: string;\n\tcwd: string;\n\tname?: string;\n\tstate?: AgentConnectionSavedSessionState;\n\tparentSessionPath?: string;\n\trlmDepth?: number;\n\tcreated: string;\n\tmodified: string;\n\tmessageCount: number;\n\tfirstMessage: string;\n\tallMessagesText: string;\n\tagentStatus?: AgentConnectionAgentStatus;\n\tusage?: SessionUsageSummary;\n}\n\nexport type DaemonDeleteSavedSessionResult = DeleteSessionFileResult;\nexport type DaemonAutonomousStatus = AgentAutonomousStatus;\nexport type DaemonBashResult = BashResult;\nexport type DaemonSessionHeader = AgentConnectionSessionHeader;\n\nexport type DaemonResourceSnapshot = AgentConnectionResourceSnapshot;\n\nexport type DaemonCronJob = AgentCronJob;\nexport type DaemonHeartbeat = AgentConnectionHeartbeat;\nexport type DaemonAgentSessionMessageReceipt = AgentSessionMessageReceipt;\nexport type DaemonAgentSessionMessageSafetyStatus = AgentSessionMessageSafetyStatus;\n\nexport type DaemonOutbound =\n\t| DaemonResponse\n\t| DaemonRequestProgress\n\t| {\n\t\t\ttype: \"daemon_hello\";\n\t\t\tsocketPath: string;\n\t\t\tprotocol: DaemonProtocolInfo;\n\t\t\tschemaId?: string;\n\t\t\t/** Monotonic wire-schema revision for field-sensitive compatibility checks. */\n\t\t\tschemaRevision?: number;\n\t\t\t/** App version of the daemon process, used to detect stale daemons after self-update. */\n\t\t\tappVersion?: string;\n\t\t\truntime?: DaemonRuntimeIdentity;\n\t\t\t/** Changes whenever the public supervisor process is replaced. */\n\t\t\tsupervisorGeneration?: string;\n\t\t\t/** Diagnostic process identity for attributing supervisor replacement. */\n\t\t\tsupervisorPid?: number;\n\t\t\t/** Durable owner marker for validating update handoff fences. */\n\t\t\tsupervisorOwnerToken?: string;\n\t\t\t/** Process start identity captured when the durable owner was published. */\n\t\t\tsupervisorProcessStartId?: string;\n\t\t\t/** Normalized socket identity stored in the durable owner record. */\n\t\t\tsupervisorSocketPath?: string;\n\t\t\tclientId: DaemonClientId;\n\t\t\tserverCapabilities: readonly DaemonServerCapability[];\n\t }\n\t| { type: \"daemon_closing\"; reason: DaemonClosingReason }\n\t| { type: \"heartbeats_changed\" }\n\t| { type: \"roster_update\"; changed: AgentRosterEntry[]; removed?: string[]; resync?: true }\n\t| { type: \"session_event\"; activeSessionId: string; event: AgentConnectionSessionEvent; meta?: DaemonEventMeta }\n\t| { type: \"side_question_event\"; activeSessionId: string; event: AgentConnectionSideQuestionEvent }\n\t| { type: \"session_status\"; activeSessionId: string; recap?: string; meta?: DaemonEventMeta }\n\t| {\n\t\t\ttype: \"session_replaced\";\n\t\t\tactiveSessionId: string;\n\t\t\tstate: AgentConnectionState;\n\t\t\tmessages: AgentMessage[];\n\t\t\tsnapshotFollows?: boolean;\n\t\t\tmeta?: DaemonEventMeta;\n\t }\n\t| {\n\t\t\ttype: \"session_resynced\";\n\t\t\tactiveSessionId: string;\n\t\t\tsnapshot: DaemonSessionSnapshot;\n\t\t\tmeta?: DaemonEventMeta;\n\t }\n\t| {\n\t\t\ttype: \"session_attached\";\n\t\t\tactiveSessionId: string;\n\t\t\tstate: SessionSummary;\n\t\t\tmessages: AgentMessage[];\n\t\t\tsnapshot?: DaemonSessionSnapshot;\n\t\t\treplay?: DaemonReplayInfo;\n\t\t\tlastEventSequence?: DaemonEventSequence;\n\t }\n\t| {\n\t\t\ttype: \"session_snapshot_begin\";\n\t\t\tactiveSessionId: string;\n\t\t\tsnapshotId: string;\n\t\t\tsnapshot: Omit<DaemonSessionSnapshot, \"messages\">;\n\t\t\tmessageCount: number;\n\t\t\ttargetChunkBytes: number;\n\t\t\tpurpose?: \"attach\" | \"replacement\" | \"resync\";\n\t }\n\t| {\n\t\t\ttype: \"session_snapshot_chunk\";\n\t\t\tactiveSessionId: string;\n\t\t\tsnapshotId: string;\n\t\t\tindex: number;\n\t\t\tmessages: AgentMessage[];\n\t }\n\t| {\n\t\t\ttype: \"session_snapshot_end\";\n\t\t\tactiveSessionId: string;\n\t\t\tsnapshotId: string;\n\t\t\tchunkCount: number;\n\t\t\tlastEventSequence: DaemonEventSequence;\n\t\t\tlastEventCursor?: DaemonEventCursor;\n\t }\n\t| {\n\t\t\ttype: \"session_snapshot_failed\";\n\t\t\tactiveSessionId: string;\n\t\t\tsnapshotId: string;\n\t\t\terror: string;\n\t }\n\t| { type: \"session_detached\"; activeSessionId: string }\n\t| { type: \"session_closed\"; activeSessionId: string; reason: DaemonSessionClosedReason; meta?: DaemonEventMeta }\n\t| {\n\t\t\ttype: \"extension_ui_request\";\n\t\t\tactiveSessionId: string;\n\t\t\tid: string;\n\t\t\tmethod: string;\n\t\t\tpayload: Record<string, unknown>;\n\t\t\tmeta?: DaemonEventMeta;\n\t }\n\t| {\n\t\t\ttype: \"extension_error\";\n\t\t\tactiveSessionId: string;\n\t\t\textensionPath: string;\n\t\t\tevent: string;\n\t\t\terror: string;\n\t\t\tmeta?: DaemonEventMeta;\n\t };\n\nexport const DAEMON_OUTBOUND_COMPATIBILITY = {\n\tresponse: LEGACY_DAEMON_COMMAND,\n\tsession_list_progress: LEGACY_DAEMON_COMMAND,\n\tsession_list_item: LEGACY_DAEMON_COMMAND,\n\tdaemon_hello: LEGACY_DAEMON_COMMAND,\n\tdaemon_closing: LEGACY_DAEMON_COMMAND,\n\theartbeats_changed: { minProtocol: 8, capability: \"heartbeat_catalog\" },\n\troster_update: { minProtocol: 8, capability: \"agent_roster\" },\n\t// agent_end refusal omits messages; attached readers must understand that terminal variant.\n\tsession_event: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tside_question_event: LEGACY_DAEMON_COMMAND,\n\tsession_status: LEGACY_DAEMON_COMMAND,\n\tsession_replaced: LEGACY_DAEMON_COMMAND,\n\tsession_resynced: LEGACY_DAEMON_COMMAND,\n\tsession_attached: LEGACY_DAEMON_COMMAND,\n\tsession_snapshot_begin: LEGACY_DAEMON_COMMAND,\n\tsession_snapshot_chunk: LEGACY_DAEMON_COMMAND,\n\tsession_snapshot_end: LEGACY_DAEMON_COMMAND,\n\tsession_snapshot_failed: LEGACY_DAEMON_COMMAND,\n\tsession_detached: LEGACY_DAEMON_COMMAND,\n\tsession_closed: LEGACY_DAEMON_COMMAND,\n\textension_ui_request: LEGACY_DAEMON_COMMAND,\n\textension_error: LEGACY_DAEMON_COMMAND,\n} as const satisfies Record<DaemonOutbound[\"type\"], DaemonCommandCompatibility>;\n\n/** Additive evidence fields: older observer events keep absence, never fabricated identities. */\nexport const DAEMON_SESSION_EVENT_FIELD_COMPATIBILITY = {\n\ttool_execution_end: { exchange: { minProtocol: 9, minSchemaRevision: 28, capability: \"finalized_tool_exchanges\" } },\n\tturn_end: {\n\t\texchanges: { minProtocol: 9, minSchemaRevision: 28, capability: \"finalized_tool_exchanges\" },\n\t\ttoolExecution: { minProtocol: 9, minSchemaRevision: 28, capability: \"finalized_tool_exchanges\" },\n\t},\n} as const;\n\nexport function createDaemonCommandEnvelope<TCommand extends DaemonCommand>(\n\tcommand: TCommand,\n\tid: DaemonCommandId,\n\tclientId?: DaemonClientId,\n\tprotocolVersion: DaemonProtocolVersion = DAEMON_PROTOCOL_VERSION,\n): DaemonCommandEnvelope<TCommand> {\n\treturn {\n\t\ttype: \"command\",\n\t\tid,\n\t\tprotocol: { name: DAEMON_PROTOCOL_NAME, version: protocolVersion },\n\t\t...(clientId ? { clientId } : {}),\n\t\tcommand,\n\t};\n}\n\nexport function isDaemonCommandEnvelope(value: unknown): value is DaemonCommandEnvelope {\n\tif (!value || typeof value !== \"object\") {\n\t\treturn false;\n\t}\n\tconst candidate = value as {\n\t\ttype?: unknown;\n\t\tid?: unknown;\n\t\tprotocol?: { name?: unknown; version?: unknown };\n\t\tclientId?: unknown;\n\t\tcommand?: unknown;\n\t};\n\treturn (\n\t\tcandidate.type === \"command\" &&\n\t\ttypeof candidate.id === \"string\" &&\n\t\tcandidate.protocol?.name === DAEMON_PROTOCOL_NAME &&\n\t\ttypeof candidate.protocol.version === \"number\" &&\n\t\tcandidate.protocol.version >= DAEMON_COMMAND_ENVELOPE_MIN_PROTOCOL_VERSION &&\n\t\tcandidate.protocol.version <= DAEMON_PROTOCOL_VERSION &&\n\t\t(candidate.clientId === undefined || typeof candidate.clientId === \"string\") &&\n\t\ttypeof candidate.command === \"object\" &&\n\t\tcandidate.command !== null\n\t);\n}\n\n/**\n * Best-effort id salvage for rejected command lines, so parse failures reach\n * the sender as correlatable responses instead of client-side timeouts.\n * Deliberately ignores everything but the id itself: whatever made the line\n * unparseable (rejected protocol version, missing or invalid type), the\n * sender still correlates the failure by id.\n */\nexport function salvageDaemonCommandId(line: string): string | undefined {\n\ttry {\n\t\tconst candidate = JSON.parse(line) as { id?: unknown };\n\t\tif (!candidate || typeof candidate !== \"object\") {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn typeof candidate.id === \"string\" ? candidate.id : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nconst READ_ONLY_DAEMON_COMMANDS: ReadonlySet<DaemonCommand[\"type\"]> = new Set([\n\t\"ack_result\",\n\t\"list\",\n\t\"list_saved_sessions\",\n\t\"list_agent_peers\",\n\t\"get_direct_worker_transport\",\n\t\"attach\",\n\t\"reattach\",\n\t\"roster_subscribe\",\n\t\"roster_unsubscribe\",\n\t\"agent_messages_status\",\n\t\"wait_for_idle\",\n\t\"get_session_header\",\n\t\"get_state\",\n\t\"get_connection_state\",\n\t\"get_messages\",\n\t\"get_rlm_children\",\n\t\"get_session_stats\",\n\t\"get_context_tree\",\n\t\"get_commands\",\n\t\"get_resource_snapshot\",\n\t\"get_model_catalog\",\n\t\"get_available_models\",\n\t\"get_queue\",\n\t\"cron_list\",\n\t\"heartbeats_list\",\n\t\"heartbeat_get\",\n\t\"get_session_context\",\n\t\"get_session_tree\",\n\t\"get_user_messages_for_forking\",\n\t\"get_last_assistant_text\",\n\t\"get_system_prompt\",\n\t\"get_rlm_max_subagents_status\",\n\t\"get_rlm_max_depth_status\",\n\t\"get_tool_definition\",\n]);\n\nexport function isDaemonMutatingCommand(command: Pick<DaemonCommand, \"type\">): boolean {\n\treturn !READ_ONLY_DAEMON_COMMANDS.has(command.type);\n}\n\nexport const UPDATE_RESTART_DRAIN_COMMANDS: ReadonlySet<DaemonCommand[\"type\"]> = new Set([\n\t\"rlm_ledger_mutate\",\n\t\"rlm_capacity\",\n\t\"extension_ui_response\",\n\t\"abort\",\n\t\"abort_bash\",\n\t\"abort_branch_summary\",\n\t\"abort_compaction\",\n\t\"abort_retry\",\n]);\n\nexport function createDaemonEventEnvelope<TEvent extends DaemonOutbound>(\n\tevent: TEvent,\n\tmeta: DaemonEventMeta,\n): DaemonEventEnvelope<TEvent> {\n\treturn {\n\t\ttype: \"event\",\n\t\tid: meta.id,\n\t\tprotocol: meta.protocol,\n\t\t...(meta.activeSessionId ? { activeSessionId: meta.activeSessionId } : {}),\n\t\t...(meta.sequence !== undefined ? { sequence: meta.sequence } : {}),\n\t\t...(meta.cursor ? { cursor: meta.cursor } : {}),\n\t\temittedAt: meta.emittedAt,\n\t\tevent,\n\t};\n}\n\nexport function createDaemonEventMeta(\n\tactiveSessionId: string,\n\tsequence: DaemonEventSequence,\n\temittedAt = new Date().toISOString(),\n\tgeneration = activeSessionId,\n): DaemonEventMeta {\n\treturn {\n\t\tid: `${activeSessionId}:${sequence}`,\n\t\tprotocol: DAEMON_PROTOCOL_INFO,\n\t\tactiveSessionId,\n\t\tsequence,\n\t\tcursor: { generation, sequence },\n\t\temittedAt,\n\t};\n}\n\nexport function createDaemonReplayInfo(\n\tresumeCursor: DaemonResumeCursor | undefined,\n\tlastEventSequence: DaemonEventSequence,\n\tgeneration = \"legacy\",\n): DaemonReplayInfo {\n\tconst toCursor = { generation, sequence: lastEventSequence };\n\tif (!resumeCursor) {\n\t\treturn {\n\t\t\tstatus: \"complete\",\n\t\t\ttoSequence: lastEventSequence,\n\t\t\ttoCursor,\n\t\t};\n\t}\n\tconst resumeSequence = \"sequence\" in resumeCursor ? resumeCursor.sequence : resumeCursor.eventSequence;\n\tconst fromCursor =\n\t\t\"generation\" in resumeCursor\n\t\t\t? { generation: resumeCursor.generation, sequence: resumeCursor.sequence }\n\t\t\t: undefined;\n\tif (fromCursor && fromCursor.generation !== generation) {\n\t\treturn {\n\t\t\tstatus: \"unavailable\",\n\t\t\tfromSequence: resumeSequence,\n\t\t\ttoSequence: lastEventSequence,\n\t\t\tfromCursor,\n\t\t\ttoCursor,\n\t\t\treason: \"event_generation_changed\",\n\t\t};\n\t}\n\n\tif (resumeSequence > lastEventSequence) {\n\t\treturn {\n\t\t\tstatus: \"unavailable\",\n\t\t\tfromSequence: resumeSequence,\n\t\t\ttoSequence: lastEventSequence,\n\t\t\t...(fromCursor ? { fromCursor } : {}),\n\t\t\ttoCursor,\n\t\t\treason: \"resume_cursor_ahead_of_session\",\n\t\t};\n\t}\n\n\tif (resumeSequence === lastEventSequence) {\n\t\treturn {\n\t\t\tstatus: \"complete\",\n\t\t\tfromSequence: resumeSequence,\n\t\t\ttoSequence: lastEventSequence,\n\t\t\t...(fromCursor ? { fromCursor } : {}),\n\t\t\ttoCursor,\n\t\t};\n\t}\n\n\treturn {\n\t\tstatus: \"unavailable\",\n\t\tfromSequence: resumeSequence,\n\t\ttoSequence: lastEventSequence,\n\t\t...(fromCursor ? { fromCursor } : {}),\n\t\ttoCursor,\n\t\treason: \"event_replay_not_available\",\n\t};\n}\n\nexport function success(id: string | undefined, command: DaemonCommandName, data?: unknown): DaemonResponse {\n\treturn data === undefined\n\t\t? { id, type: \"response\", command, success: true }\n\t\t: { id, type: \"response\", command, success: true, data };\n}\n\nexport function failure(\n\tid: string | undefined,\n\tcommand: string,\n\terror: unknown,\n\terrorInfo?: DaemonErrorInfo,\n): DaemonResponse {\n\treturn {\n\t\tid,\n\t\ttype: \"response\",\n\t\tcommand,\n\t\tsuccess: false,\n\t\terror: error instanceof Error ? error.message : String(error),\n\t\t...(errorInfo ? { errorInfo } : {}),\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"daemon-protocol.js","sourceRoot":"","sources":["../../../src/modes/daemon/daemon-protocol.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage, ThinkingLevel } from \"@ponythewhite/base-context-agent\";\nimport type { ImageContent, ServiceTier, TextContent, Transport } from \"@ponythewhite/base-context-ai\";\nimport type {\n\tAgentSessionMessageDeliveryMode,\n\tAgentSessionMessageReceipt,\n\tAgentSessionMessageSafetyStatus,\n} from \"../../core/agent-messages.js\";\nimport type { SessionActionRecoverySnapshot } from \"../../core/agent-session.js\";\nimport type { SavedSessionPage, SavedSessionPageQuery } from \"./saved-session-page.js\";\nexport type DaemonSavedSessionPage = SavedSessionPage;\n\nimport type { AgentSessionRuntimeConfig } from \"../../core/agent-session-config.js\";\nimport type { AgentSessionRuntimeMetadata } from \"../../core/agent-session-runtime.js\";\nimport type { AgentAutonomousStatus } from \"../../core/autonomous.js\";\nimport type { BashResult } from \"../../core/bash-executor.js\";\nimport type {\n\tAgentCronJob,\n\tAgentHeartbeatDeliveryMode,\n\tAgentHeartbeatManagementAction,\n\tAgentHeartbeatUpdateAction,\n} from \"../../core/cron-jobs.js\";\nimport type { InputSource } from \"../../core/extensions/types.js\";\nimport type { AcpMcpServerConfig } from \"../../core/mcp/acp-mcp-types.js\";\nimport type { CustomMessage } from \"../../core/messages.js\";\nimport type { QueuedMessageLane, QueuedMessageMutation } from \"../../core/session-action-store.js\";\nimport type { SessionCwdIssue } from \"../../core/session-cwd.js\";\nimport type { DeleteSessionFileResult } from \"../../core/session-file-actions.js\";\nimport type { SessionUsageSummary } from \"../../core/usage.js\";\nimport { PRODUCT } from \"../../product-identity.js\";\nimport type {\n\tAgentConnectionAgentStatus,\n\tAgentConnectionHeartbeat,\n\tAgentConnectionQueueMode,\n\tAgentConnectionResourceSnapshot,\n\tAgentConnectionRlmChildAgentSnapshot,\n\tAgentConnectionSavedSessionScope,\n\tAgentConnectionSavedSessionState,\n\tAgentConnectionScopedModel,\n\tAgentConnectionSessionContext,\n\tAgentConnectionSessionEvent,\n\tAgentConnectionSessionHeader,\n\tAgentConnectionSessionTreeNode,\n\tAgentConnectionSideQuestionEvent,\n\tAgentConnectionSideQuestionTurn,\n\tAgentConnectionState,\n} from \"../agent-connection/types.js\";\nimport type { AgentRosterEntry } from \"./agent-roster.js\";\nimport type { SessionSummary } from \"./daemon-session-list.js\";\nimport type { DaemonRlmCapacityOperation } from \"./daemon-worker-protocol.js\";\nimport type { RlmLedgerMutation } from \"./rlm-ledger-mutations.js\";\n\n/**\n * Local daemon JSONL protocol.\n *\n * This is the transport used by DaemonAgentConnection today, not the final\n * remote gateway protocol. The protocol primitives below are intentionally\n * JSON-serializable so a future gateway can wrap or proxy this local transport\n * without leaking transport details back into InteractiveMode.\n */\n\nexport const DAEMON_PROTOCOL_NAME = PRODUCT.daemonService;\nexport const DAEMON_PROTOCOL_VERSION = 13;\nexport const DAEMON_LEGACY_INSPECTION_PROTOCOL_VERSIONS: readonly number[] = [8, 9, 10];\nexport const DAEMON_COMMAND_ENVELOPE_MIN_PROTOCOL_VERSION = 8;\n// Revision 9 publishes persisted RLM spawn depth on passive session rows.\n// Revision 10 publishes persisted RLM spawn depth on all session catalog rows.\n// Revision 11 adds immediate get/set commands for active-session RLM max depth.\n// Revision 12 publishes idle-residency metadata on session summary rows.\n// Revision 13 narrows agent-origin reach and roster wire shapes to the nuclear family.\n// Revision 15 adds the mutate_queued_message command and queue_message_mutation capability.\n// Revision 16 adds the \"stopping\" workerState and stops reporting disconnected workers as \"ready\".\n// Revision 17 gates authoritative child rosters and transient owned-session recovery context.\n// Revision 18 adds the opt-in RLM quiescence barrier to headless completion.\n// Revision 19 adds daemon-held session input pauses.\n// Revision 20 lets cancellation target a prompt the session owns but has not started.\n// Revision 21 adds capability-gated, session-scoped ACP MCP server replacement.\n// Revision 23 lets workers query the supervisor agent roster on demand.\n// Revision 24 adds the capability-gated agent-roster subscription and push.\n// Revision 25 adds capability-gated direct worker peer transport discovery.\n// Revision 26 publishes own-session usage totals on session summary and saved-session rows.\n// Revision 27 starts the incompatible, product-isolated Base Context command plane.\n// Revision 28 requires native inference ownership for work and exposes optional finalized tool evidence.\n// Revision 29 requires canonical session ownership, framed readers, and fenced persistence ACKs.\n// Revision 30 requires bounded invocation output and agent_end refusal without successful messages.\n// Revision 31 requires canonical producer qualification for native task-origin authority.\n// Revision 32 requires qualified native recovery and source-backed context-epoch checkpoints.\n// Revision 33 retains recovery views in ordinary summary ACKs under adapter-proved replay contracts.\n// Revision 34 requires explicit public summary rendering and live resource acceptance on managed epochs.\n// Revision 35 requires request-time public checkpoints and honest unknown prior-token estimates.\n// Revision 36 requires owner-backed context mode and fixed native continuation contracts.\n// Revision 37 requires original tool-owner qualification and ACKed public tool continuation.\n// Revision 38 excludes the known legacy context extension before native owner loading.\n// Revision 39 requires current serialized orphan registration and kernel writer ownership.\n// Revision 40 requires selected-skill epochs and scoped queued skill bindings.\n// Revision 41 honors explicit compaction model and effort selection.\n// Revision 42 honors explicit branch-summary model and effort selection.\n// Revision 43 requires bounded saved-session query pages on the native catalog path.\n// Revision 44 uses typed native natural-turn continuation outcomes.\n// Revision 45 carries owned checkpoint/resume transitions through the native loop.\n// Revision 46 adds capability-gated explicit resume for bound recurring generic cron jobs.\n// Revision 47 adds capability-gated agent result capsules backed by native session archives.\n// Revision 48 removes remote data export policy from session commands and worker state.\n// Revision 49 requires shared root-family subagent capacity and adds its get/set commands.\n// Revision 50 adds optional captured request usage to context-tree responses.\nexport const DAEMON_SCHEMA_REVISION = 50;\nexport const DAEMON_SCHEMA_ID = \"protocol-13-schema-50-context-request-usage\";\n\nexport type DaemonProtocolName = typeof DAEMON_PROTOCOL_NAME;\nexport type DaemonProtocolVersion = number;\nexport type DaemonCommandId = string;\nexport type DaemonEventId = string;\nexport type DaemonEventSequence = number;\nexport interface DaemonEventCursor {\n\tgeneration: string;\n\tsequence: DaemonEventSequence;\n}\nexport type DaemonClientId = string;\nexport type DaemonClientCapability =\n\t| \"attach_snapshot\"\n\t| \"event_sequence\"\n\t| \"extension_ui\"\n\t| \"slim_attach\"\n\t| \"chunked_snapshot\"\n\t| \"client_owned_sessions\";\nexport type DaemonPromptAdmissionCancellationStatus = \"cancelled\" | \"owned\" | \"unknown\";\nexport interface DaemonPromptAdmissionCancellationResult {\n\tstatus: DaemonPromptAdmissionCancellationStatus;\n}\nexport type DaemonServerCapability =\n\t| DaemonClientCapability\n\t| \"delete_rlm_subagent\"\n\t| \"heartbeat_catalog\"\n\t| \"heartbeat_management\"\n\t| \"cron_resume\"\n\t| \"agent_results\"\n\t| \"model_catalog\"\n\t| \"context_request_usage\"\n\t// The daemon honors previousTurns on start_side_question (multi-turn side\n\t// conversations). Clients must check before sending follow-up transcripts.\n\t| \"side_question_transcript\"\n\t// The daemon honors transient and runId on execute_bash (side-conversation\n\t// bash: never recorded into the session, and its bash_start/bash_end events\n\t// carry the transient marker and echoed runId so clients correlate runs by\n\t// identity). Clients must check before sending.\n\t| \"transient_bash\"\n\t| \"agent_roster\"\n\t| \"session_input_admission\"\n\t| \"prompt_admission_cancellation\"\n\t| \"queue_message_mutation\"\n\t| \"authoritative_child_roster\"\n\t| \"owned_session_recovery_context\"\n\t| \"rlm_quiescence_barrier\"\n\t| \"session_input_pause\"\n\t| \"owned_prompt_cancellation\"\n\t| \"acp_mcp_servers\"\n\t| \"direct_peer_transport\"\n\t| \"native_inference_ownership\"\n\t| \"canonical_session_ownership\"\n\t| \"finalized_tool_exchanges\"\n\t| \"rlm_ledger_mutation\";\n\nexport type DaemonReplayStatus = \"complete\" | \"partial\" | \"unavailable\";\n\nexport interface DaemonProtocolInfo {\n\tname: DaemonProtocolName;\n\tversion: DaemonProtocolVersion;\n}\n\nexport const DAEMON_PROTOCOL_INFO: DaemonProtocolInfo = {\n\tname: DAEMON_PROTOCOL_NAME,\n\tversion: DAEMON_PROTOCOL_VERSION,\n};\n\nexport const DAEMON_DEFAULT_CLIENT_CAPABILITIES: readonly DaemonClientCapability[] = [\n\t\"attach_snapshot\",\n\t\"event_sequence\",\n];\n\nexport const DAEMON_SUPPORTED_CLIENT_CAPABILITIES: readonly DaemonClientCapability[] = [\n\t\"attach_snapshot\",\n\t\"event_sequence\",\n\t\"extension_ui\",\n\t\"slim_attach\",\n\t\"chunked_snapshot\",\n\t\"client_owned_sessions\",\n];\n\nexport const DAEMON_DEFAULT_SERVER_CAPABILITIES: readonly DaemonServerCapability[] = [\n\t...DAEMON_SUPPORTED_CLIENT_CAPABILITIES,\n\t\"delete_rlm_subagent\",\n\t\"heartbeat_catalog\",\n\t\"heartbeat_management\",\n\t\"cron_resume\",\n\t\"agent_results\",\n\t\"model_catalog\",\n\t\"context_request_usage\",\n\t\"side_question_transcript\",\n\t\"transient_bash\",\n\t\"session_input_admission\",\n\t\"prompt_admission_cancellation\",\n\t\"owned_prompt_cancellation\",\n\t\"queue_message_mutation\",\n\t\"authoritative_child_roster\",\n\t\"owned_session_recovery_context\",\n\t\"rlm_quiescence_barrier\",\n\t\"session_input_pause\",\n\t\"acp_mcp_servers\",\n\t\"native_inference_ownership\",\n\t\"canonical_session_ownership\",\n\t\"finalized_tool_exchanges\",\n];\n\n/** Single-use short-lived credential for one direct TUI connection to one worker process incarnation. */\nexport interface DaemonPeerTransportTicket {\n\tpurpose: \"session_client\";\n\tsocketPath: string;\n\t/** Filesystem identity of the worker socket at issue time; re-checked by the client before connecting. */\n\tsocketIdentity: { dev: number; ino: number };\n\tworkerInstanceId: string;\n\tactiveSessionId: string;\n\tgrantId: string;\n\ttoken: string;\n\texpiresAt: string;\n}\n\nexport interface DaemonRuntimeIdentity {\n\tbuildId: string;\n\texecutablePath: string;\n\tentrypointPath?: string;\n\tlauncherPath?: string;\n}\n\nexport type DaemonResumeCursor =\n\t| ({ activeSessionId?: string } & DaemonEventCursor)\n\t| { activeSessionId?: string; eventSequence: DaemonEventSequence };\n\nexport interface DaemonAttachClientMetadata {\n\tclientId?: DaemonClientId;\n\tcapabilities?: readonly DaemonClientCapability[];\n\tresumeCursor?: DaemonResumeCursor;\n\t/** Fresh owner-supplied runtime context for recovering a client-owned worker. Never persisted. */\n\trecoveryConfig?: AgentSessionRuntimeConfig;\n}\n\n/**\n * Client-side env vars forwarded to the daemon so extensions can reach them\n * (e.g. HERDR_PANE_ID/HERDR_SOCKET_PATH that herdr sets per pane). The daemon\n * scopes these to the created session and merges them over process.env for\n * that session's pi.exec() subprocesses — it does not mutate the daemon's own\n * env. Carried on create only: attach must not rebind a session's identity,\n * since watchers (agents view, subagent viewers) also attach.\n */\nexport interface DaemonClientEnv {\n\tenv?: Record<string, string>;\n}\n\nexport type DaemonSessionLifecycle = \"resident\" | \"client_owned\";\n\nexport interface DaemonLaunchEnv {\n\tlaunchEnv?: Record<string, string>;\n}\n\n/**\n * The allowlist of env vars a client may forward. One shared list because it\n * is the wire contract: clients filter before sending and the daemon\n * re-filters on receipt (the socket peer is untrusted).\n */\nexport const DAEMON_CLIENT_ENV_KEYS = [\n\t\"HERDR_ENV\",\n\t\"HERDR_PANE_ID\",\n\t\"HERDR_SOCKET_PATH\",\n\t\"HERDR_TAB_ID\",\n\t\"HERDR_WORKSPACE_ID\",\n] as const;\n\n/** Collect the allowlisted env vars from the client process for the create command. */\nexport function collectDaemonClientEnv(source: NodeJS.ProcessEnv = process.env): Record<string, string> | undefined {\n\tconst env: Record<string, string> = {};\n\tfor (const key of DAEMON_CLIENT_ENV_KEYS) {\n\t\tconst value = source[key];\n\t\tif (value !== undefined) {\n\t\t\tenv[key] = value;\n\t\t}\n\t}\n\treturn Object.keys(env).length > 0 ? env : undefined;\n}\n\nexport function collectDaemonLaunchEnv(source: NodeJS.ProcessEnv = process.env): Record<string, string> {\n\tconst env: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(source)) {\n\t\tif (value !== undefined && !key.startsWith(\"BASE_CONTEXT_INTERNAL_\")) {\n\t\t\tenv[key] = value;\n\t\t}\n\t}\n\treturn env;\n}\n\nexport interface DaemonReplayInfo {\n\tstatus: DaemonReplayStatus;\n\tfromSequence?: DaemonEventSequence;\n\ttoSequence: DaemonEventSequence;\n\tfromCursor?: DaemonEventCursor;\n\ttoCursor?: DaemonEventCursor;\n\treason?: string;\n}\n\nexport interface DaemonEventMeta {\n\tid: DaemonEventId;\n\tprotocol: DaemonProtocolInfo;\n\tactiveSessionId?: string;\n\tsequence?: DaemonEventSequence;\n\tcursor?: DaemonEventCursor;\n\temittedAt: string;\n\treplayed?: boolean;\n}\n\nexport interface DaemonCommandEnvelope<TCommand extends DaemonCommand = DaemonCommand> {\n\ttype: \"command\";\n\tid: DaemonCommandId;\n\tprotocol: DaemonProtocolInfo;\n\tclientId?: DaemonClientId;\n\tcommand: TCommand;\n}\n\nexport type DaemonCommandWire = DaemonCommand | DaemonCommandEnvelope;\n\nexport interface DaemonEventEnvelope<TEvent extends DaemonOutbound = DaemonOutbound> {\n\ttype: \"event\";\n\tid: DaemonEventId;\n\tprotocol: DaemonProtocolInfo;\n\tactiveSessionId?: string;\n\tsequence?: DaemonEventSequence;\n\tcursor?: DaemonEventCursor;\n\temittedAt: string;\n\tevent: TEvent;\n}\n\nexport interface DaemonArtifactReference {\n\tid: string;\n\tsessionId: string;\n\ttype: string;\n\tlogicalPath: string;\n\trelativePath?: string;\n\tmimeType?: string;\n\tmetadata?: Record<string, string | number | boolean | null>;\n}\n\nexport interface DaemonSessionSnapshot {\n\tactiveSessionId: string;\n\tsummary: SessionSummary;\n\tstate: AgentConnectionState;\n\tmessages: AgentMessage[];\n\tsessionContext?: AgentConnectionSessionContext;\n\tsessionTree?: { tree: AgentConnectionSessionTreeNode[]; leafId: string | null };\n\tlastEventSequence: DaemonEventSequence;\n\tlastEventCursor?: DaemonEventCursor;\n\tparent?: {\n\t\tactiveSessionId?: string;\n\t\tsessionId?: string;\n\t\tnodeId?: string;\n\t\tchildId?: string;\n\t};\n\t/** Live RLM child sessions (including grandchildren) hosted by the daemon under this session. */\n\tchildren?: AgentConnectionRlmChildAgentSnapshot[];\n}\n\nexport interface DaemonAttachResult {\n\tprotocol: DaemonProtocolInfo;\n\tactiveSessionId: string;\n\t/** Omitted for clients with the \"slim_attach\" capability; use snapshot.summary. */\n\tstate?: SessionSummary;\n\t/** Omitted for clients with the \"slim_attach\" capability; use snapshot.messages. */\n\tmessages?: AgentMessage[];\n\tsnapshot: DaemonSessionSnapshot;\n\treplay: DaemonReplayInfo;\n\tlastEventSequence: DaemonEventSequence;\n\tlastEventCursor?: DaemonEventCursor;\n\tsnapshotStream?: {\n\t\tid: string;\n\t\tmessageCount: number;\n\t\ttargetChunkBytes: number;\n\t};\n\tclient: {\n\t\tid: DaemonClientId;\n\t\tcapabilities: DaemonClientCapability[];\n\t};\n}\n\nexport const DAEMON_UPDATE_RESTART_FORMAT_VERSION = 1;\n\nexport interface DaemonUpdateRestartQueue {\n\tactions: SessionActionRecoverySnapshot;\n\tnextTurn: CustomMessage[];\n}\n\nexport interface DaemonUpdateRestartSession {\n\tactiveSessionId: string;\n\tsessionId: string;\n\tsessionFile: string;\n\tcwd: string;\n\tconfig: AgentSessionRuntimeConfig;\n\truntimeMetadata?: AgentSessionRuntimeMetadata;\n\tclientEnv?: Record<string, string>;\n\tqueue: DaemonUpdateRestartQueue;\n\tshouldResume: boolean;\n\twasStreaming: boolean;\n\twasCompacting: boolean;\n\twasBashRunning: boolean;\n\thadRunningRlmChildren: boolean;\n\twasRetrying: boolean;\n\thadAcceptedPromptInFlight: boolean;\n}\n\nexport interface DaemonUpdateRestartManifest {\n\tformatVersion: typeof DAEMON_UPDATE_RESTART_FORMAT_VERSION;\n\tcreatedAt: string;\n\tsessions: DaemonUpdateRestartSession[];\n\tdiscardedActiveSessionIds?: string[];\n}\n\nexport type DaemonSavedSessionListCommand =\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"list_saved_sessions\";\n\t\t\tactiveSessionId: string;\n\t\t\tscope: AgentConnectionSavedSessionScope;\n\t\t\tpage?: SavedSessionPageQuery;\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"list_saved_sessions\";\n\t\t\tcwd: string;\n\t\t\tsessionDir?: string;\n\t\t\tscope: AgentConnectionSavedSessionScope;\n\t\t\tpage?: SavedSessionPageQuery;\n\t };\n\nexport type DaemonCommand =\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"list\";\n\t\t\tall?: boolean;\n\t\t\tcwd?: string;\n\t\t\tsessionDir?: string;\n\t\t\tincludeClientOwned?: boolean;\n\t }\n\t| DaemonSavedSessionListCommand\n\t| { id?: string; type: \"list_agent_peers\"; workerToken: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"rlm_ledger_mutate\";\n\t\t\tworkerToken: string;\n\t\t\tworkerInstanceId: string;\n\t\t\tmutation: RlmLedgerMutation;\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"rlm_capacity\";\n\t\t\tworkerToken: string;\n\t\t\tworkerInstanceId: string;\n\t\t\toperation: DaemonRlmCapacityOperation;\n\t }\n\t| { id?: string; type: \"get_direct_worker_transport\"; activeSessionId: string }\n\t| { id?: string; type: \"roster_subscribe\" }\n\t| { id?: string; type: \"roster_unsubscribe\" }\n\t| ({\n\t\t\tid?: string;\n\t\t\ttype: \"create\";\n\t\t\tsessionPath?: string;\n\t\t\tcontinueRecent?: boolean;\n\t\t\tnoSession?: boolean;\n\t\t\tname?: string;\n\t\t\tconfig?: AgentSessionRuntimeConfig;\n\t\t\truntimeMetadata?: AgentSessionRuntimeMetadata;\n\t\t\tlifecycle?: DaemonSessionLifecycle;\n\t } & DaemonClientEnv &\n\t\t\tDaemonLaunchEnv)\n\t// Attach env is adopt-if-absent only: it fills identity for env-less\n\t// sessions (e.g. cron-created) but never rebinds one, since watchers\n\t// (agents view, subagent viewers) also attach.\n\t| ({\n\t\t\tid?: string;\n\t\t\ttype: \"attach\";\n\t\t\tactiveSessionId: string;\n\t\t\tsupportsExtensionUi?: boolean;\n\t } & DaemonAttachClientMetadata &\n\t\t\tDaemonClientEnv &\n\t\t\tDaemonLaunchEnv)\n\t| ({\n\t\t\tid?: string;\n\t\t\ttype: \"reattach\";\n\t\t\tactiveSessionId: string;\n\t\t\ttargetActiveSessionId: string;\n\t\t\tsupportsExtensionUi?: boolean;\n\t } & DaemonAttachClientMetadata &\n\t\t\tDaemonClientEnv &\n\t\t\tDaemonLaunchEnv)\n\t| { id?: string; type: \"detach\"; activeSessionId?: string }\n\t| { id?: string; type: \"complete_owned_session\"; activeSessionId: string }\n\t| { id?: string; type: \"promote_owned_session\"; activeSessionId: string }\n\t| { id?: string; type: \"kill\"; activeSessionId: string }\n\t| { id?: string; type: \"rename\"; activeSessionId: string; name: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"prompt\";\n\t\t\tactiveSessionId: string;\n\t\t\tmessage: string;\n\t\t\tcontent?: (TextContent | ImageContent)[];\n\t\t\timages?: ImageContent[];\n\t\t\tstreamingBehavior?: \"steer\" | \"followUp\";\n\t\t\tqueueIfBusy?: boolean;\n\t\t\texpandPromptTemplates?: boolean;\n\t\t\tsource?: InputSource;\n\t\t\tagentMessageId?: string;\n\t\t\tcustomMessage?: CustomMessage;\n\t\t\t/** Unique only when the caller needs cancellable pre-ownership admission. */\n\t\t\tadmissionId?: string;\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"cancel_prompt_admission\";\n\t\t\tactiveSessionId: string;\n\t\t\tadmissionId: string;\n\t\t\t/** Cancel session-owned work too when it has not started delivery. */\n\t\t\tcancelOwned?: boolean;\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"prompt_and_wait\";\n\t\t\tactiveSessionId: string;\n\t\t\tmessage: string;\n\t\t\tcontent?: (TextContent | ImageContent)[];\n\t\t\timages?: ImageContent[];\n\t\t\tstreamingBehavior?: \"steer\" | \"followUp\";\n\t\t\tqueueIfBusy?: boolean;\n\t\t\texpandPromptTemplates?: boolean;\n\t\t\tsource?: InputSource;\n\t\t\t/** Unique only when the caller needs cancellable pre-ownership admission. */\n\t\t\tadmissionId?: string;\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"steer\";\n\t\t\tactiveSessionId: string;\n\t\t\tmessage: string;\n\t\t\tcontent?: (TextContent | ImageContent)[];\n\t\t\timages?: ImageContent[];\n\t\t\tqueueKey?: string;\n\t\t\texpandPromptTemplates?: boolean;\n\t\t\tagentMessageId?: string;\n\t\t\tcustomMessage?: CustomMessage;\n\t\t\tprefixMessages?: CustomMessage[];\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"follow_up\";\n\t\t\tactiveSessionId: string;\n\t\t\tmessage: string;\n\t\t\tcontent?: (TextContent | ImageContent)[];\n\t\t\timages?: ImageContent[];\n\t\t\tqueueKey?: string;\n\t\t\texpandPromptTemplates?: boolean;\n\t\t\tagentMessageId?: string;\n\t\t\tcustomMessage?: CustomMessage;\n\t\t\tprefixMessages?: CustomMessage[];\n\t }\n\t| { id?: string; type: \"restore_next_turn\"; activeSessionId: string; messages: CustomMessage[] }\n\t| { id?: string; type: \"restore_actions\"; activeSessionId: string; snapshot: SessionActionRecoverySnapshot }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"append_custom_message\";\n\t\t\tactiveSessionId: string;\n\t\t\tmessage: Pick<CustomMessage, \"customType\" | \"content\" | \"display\" | \"details\">;\n\t }\n\t| { id?: string; type: \"resume_queue\"; activeSessionId: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"send_message\";\n\t\t\ttargetActiveSessionId: string;\n\t\t\tmessage: string;\n\t\t\tfromActiveSessionId?: string;\n\t\t\t/** Internal worker-origin marker; public clients remain unrestricted. */\n\t\t\tagentOrigin?: boolean;\n\t\t\tdeliveryMode?: AgentSessionMessageDeliveryMode;\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"send_result\";\n\t\t\ttargetActiveSessionId: string;\n\t\t\tsummary: string;\n\t\t\tfindings: string;\n\t\t\tfromActiveSessionId?: string;\n\t\t\t/** Internal worker-origin marker; public clients remain unrestricted. */\n\t\t\tagentOrigin?: boolean;\n\t\t\tdeliveryMode?: AgentSessionMessageDeliveryMode;\n\t }\n\t| { id?: string; type: \"agent_messages_status\"; activeSessionId?: string }\n\t| { id?: string; type: \"agent_messages_pause\"; activeSessionId?: string }\n\t| { id?: string; type: \"agent_messages_resume\"; activeSessionId?: string }\n\t| { id?: string; type: \"agent_messages_clear\"; activeSessionId: string }\n\t| { id?: string; type: \"abort\"; activeSessionId: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"start_side_question\";\n\t\t\tactiveSessionId: string;\n\t\t\tsideQuestionId: string;\n\t\t\tquestion: string;\n\t\t\tpreviousTurns?: AgentConnectionSideQuestionTurn[];\n\t }\n\t| { id?: string; type: \"abort_side_question\"; activeSessionId: string; sideQuestionId: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"execute_bash\";\n\t\t\tactiveSessionId: string;\n\t\t\tcommand: string;\n\t\t\texcludeFromContext?: boolean;\n\t\t\ttransient?: boolean;\n\t\t\trunId?: string;\n\t }\n\t| { id?: string; type: \"abort_bash\"; activeSessionId: string }\n\t| { id?: string; type: \"cancel_rlm_child\"; activeSessionId: string; childId: string }\n\t| { id?: string; type: \"delete_rlm_subagent\"; activeSessionId: string; childId: string }\n\t| { id?: string; type: \"wait_for_idle\"; activeSessionId: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"wait_for_headless_completion\";\n\t\t\tactiveSessionId: string;\n\t\t\twaitForRlmQuiescence?: boolean;\n\t }\n\t| { id?: string; type: \"get_session_header\"; activeSessionId: string }\n\t| { id?: string; type: \"get_state\"; activeSessionId: string }\n\t| { id?: string; type: \"get_connection_state\"; activeSessionId: string }\n\t| { id?: string; type: \"get_messages\"; activeSessionId: string }\n\t| { id?: string; type: \"get_rlm_children\"; activeSessionId: string }\n\t| { id?: string; type: \"get_session_stats\"; activeSessionId: string }\n\t| { id?: string; type: \"get_context_tree\"; activeSessionId: string }\n\t| { id?: string; type: \"get_commands\"; activeSessionId: string }\n\t| { id?: string; type: \"get_resource_snapshot\"; activeSessionId: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"replace_acp_mcp_servers\";\n\t\t\tactiveSessionId: string;\n\t\t\townerId: string;\n\t\t\tservers: AcpMcpServerConfig[];\n\t }\n\t| { id?: string; type: \"get_model_catalog\"; activeSessionId: string }\n\t| { id?: string; type: \"get_available_models\"; activeSessionId: string }\n\t| { id?: string; type: \"get_queue\"; activeSessionId: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"mutate_queued_message\";\n\t\t\tactiveSessionId: string;\n\t\t\tlane: QueuedMessageLane;\n\t\t\tindex: number;\n\t\t\texpectedText: string;\n\t\t\tmutation: QueuedMessageMutation;\n\t }\n\t| { id?: string; type: \"clear_queue\"; activeSessionId: string }\n\t| { id?: string; type: \"abort_and_clear_queue\"; activeSessionId: string }\n\t| { id?: string; type: \"acquire_session_input_pause\"; activeSessionId: string; leaseKey: string }\n\t| { id?: string; type: \"release_session_input_pause\"; activeSessionId: string; pauseId: string }\n\t| { id?: string; type: \"cron_list\"; activeSessionId?: string; includeInactive?: boolean }\n\t| { id?: string; type: \"heartbeats_list\"; activeSessionId?: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"heartbeat_manage\";\n\t\t\tactiveSessionId: string;\n\t\t\tjobId: string;\n\t\t\taction: AgentHeartbeatManagementAction;\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"cron_add\";\n\t\t\tactiveSessionId: string;\n\t\t\tschedule: string;\n\t\t\tprompt: string;\n\t\t\tpromoteOwnedSession?: boolean;\n\t }\n\t| { id?: string; type: \"cron_cancel\"; activeSessionId?: string; jobId: string }\n\t| { id?: string; type: \"cron_resume\"; activeSessionId?: string; jobId: string }\n\t| { id?: string; type: \"heartbeat_get\"; activeSessionId: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"heartbeat_set\";\n\t\t\tactiveSessionId: string;\n\t\t\tschedule: string;\n\t\t\tprompt: string;\n\t\t\tdeliveryMode?: AgentHeartbeatDeliveryMode;\n\t\t\tpromoteOwnedSession?: boolean;\n\t }\n\t| { id?: string; type: \"heartbeat_update\"; activeSessionId: string; action: AgentHeartbeatUpdateAction }\n\t| { id?: string; type: \"set_model\"; activeSessionId: string; provider: string; modelId: string }\n\t| { id?: string; type: \"cycle_model\"; activeSessionId: string; direction?: \"forward\" | \"backward\" }\n\t| { id?: string; type: \"set_scoped_models\"; activeSessionId: string; scopedModels: AgentConnectionScopedModel[] }\n\t| { id?: string; type: \"set_thinking_level\"; activeSessionId: string; level: ThinkingLevel }\n\t| { id?: string; type: \"set_service_tier\"; activeSessionId: string; serviceTier: ServiceTier }\n\t| { id?: string; type: \"cycle_thinking_level\"; activeSessionId: string }\n\t| { id?: string; type: \"set_transport\"; activeSessionId: string; transport: Transport }\n\t| { id?: string; type: \"set_steering_mode\"; activeSessionId: string; mode: AgentConnectionQueueMode }\n\t| { id?: string; type: \"set_follow_up_mode\"; activeSessionId: string; mode: AgentConnectionQueueMode }\n\t| { id?: string; type: \"set_auto_compaction\"; activeSessionId: string; enabled: boolean }\n\t| { id?: string; type: \"set_auto_retry\"; activeSessionId: string; enabled: boolean }\n\t| { id?: string; type: \"compact\"; activeSessionId: string; customInstructions?: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"refine\";\n\t\t\tactiveSessionId: string;\n\t\t\tinstructions?: string;\n\t\t\trollbackId?: string;\n\t\t\tglobal?: boolean;\n\t }\n\t| { id?: string; type: \"abort_compaction\"; activeSessionId: string }\n\t| { id?: string; type: \"abort_branch_summary\"; activeSessionId: string }\n\t| { id?: string; type: \"abort_retry\"; activeSessionId: string }\n\t| { id?: string; type: \"execute_bash_and_wait\"; activeSessionId: string; command: string }\n\t| { id?: string; type: \"reload\"; activeSessionId: string }\n\t| { id?: string; type: \"new_session\"; activeSessionId: string; parentSession?: string }\n\t| { id?: string; type: \"switch_session\"; activeSessionId: string; sessionPath: string; cwdOverride?: string }\n\t| { id?: string; type: \"fork\"; activeSessionId: string; entryId: string; position?: \"before\" | \"at\" }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"navigate_tree\";\n\t\t\tactiveSessionId: string;\n\t\t\ttargetId: string;\n\t\t\tsummarize?: boolean;\n\t\t\tcustomInstructions?: string;\n\t\t\treplaceInstructions?: boolean;\n\t\t\tlabel?: string;\n\t }\n\t| { id?: string; type: \"import_jsonl\"; activeSessionId: string; inputPath: string; cwdOverride?: string }\n\t| { id?: string; type: \"export_html\"; activeSessionId: string; outputPath?: string }\n\t| { id?: string; type: \"export_jsonl\"; activeSessionId: string; outputPath?: string }\n\t| { id?: string; type: \"set_session_name\"; activeSessionId: string; name: string; workerToken?: string }\n\t| { id?: string; type: \"get_rlm_max_subagents_status\"; activeSessionId: string }\n\t| { id?: string; type: \"set_rlm_max_subagents\"; activeSessionId: string; maxSubagents: number }\n\t| { id?: string; type: \"get_rlm_max_depth_status\"; activeSessionId: string }\n\t| { id?: string; type: \"set_rlm_max_depth\"; activeSessionId: string; maxDepth: number; global?: boolean }\n\t| { id?: string; type: \"rename_saved_session\"; activeSessionId?: string; sessionPath: string; name: string }\n\t| { id?: string; type: \"delete_saved_session\"; activeSessionId?: string; sessionPath: string }\n\t| { id?: string; type: \"get_session_context\"; activeSessionId: string }\n\t| { id?: string; type: \"get_session_tree\"; activeSessionId: string }\n\t| { id?: string; type: \"get_user_messages_for_forking\"; activeSessionId: string }\n\t| { id?: string; type: \"get_last_assistant_text\"; activeSessionId: string }\n\t| { id?: string; type: \"get_system_prompt\"; activeSessionId: string }\n\t| { id?: string; type: \"get_tool_definition\"; activeSessionId: string; name: string }\n\t| { id?: string; type: \"set_session_entry_label\"; activeSessionId: string; entryId: string; label?: string }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"extension_ui_response\";\n\t\t\tactiveSessionId: string;\n\t\t\trequestId: string;\n\t\t\tresponse: DaemonExtensionUIResponse;\n\t }\n\t| { id?: string; type: \"ack_result\"; commandId: string }\n\t| { id?: string; type: \"prepare_update_restart\" }\n\t| { id?: string; type: \"retry_worker\"; activeSessionId: string }\n\t| { id?: string; type: \"restart\" }\n\t| { id?: string; type: \"shutdown\"; force?: boolean };\n\ntype DaemonCommandName = DaemonCommand[\"type\"];\n\nexport interface DaemonCommandCompatibility {\n\tminProtocol: number;\n\tminSchemaRevision?: number;\n\tcapability?: DaemonServerCapability;\n}\n\nexport const NATIVE_INFERENCE_OWNERSHIP_COMPATIBILITY = {\n\tminProtocol: 9,\n\tminSchemaRevision: 28,\n\tcapability: \"native_inference_ownership\",\n} as const satisfies DaemonCommandCompatibility;\n\nexport const CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY = {\n\tminProtocol: 13,\n\tminSchemaRevision: 49,\n\tcapability: \"canonical_session_ownership\",\n} as const satisfies DaemonCommandCompatibility;\n\nexport const NATIVE_WORK_COMPATIBILITIES = [\n\tCANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tNATIVE_INFERENCE_OWNERSHIP_COMPATIBILITY,\n] as const;\n\n// These commands do not hydrate a worker, resume a queue, or drain refinement.\nconst LEGACY_INSPECTION_COMMANDS: ReadonlySet<DaemonCommandName> = new Set([\n\t\"ack_result\",\n\t\"list\",\n\t\"get_state\",\n\t\"get_messages\",\n\t\"roster_subscribe\",\n\t\"roster_unsubscribe\",\n]);\n\nexport function isLegacyDaemonInspection(command: DaemonCommand): boolean {\n\treturn (\n\t\tLEGACY_INSPECTION_COMMANDS.has(command.type) ||\n\t\t(command.type === \"list_saved_sessions\" && !(\"activeSessionId\" in command))\n\t);\n}\n\nconst LEGACY_DAEMON_COMMAND = { minProtocol: 8 } as const;\nconst RLM_MAX_DEPTH_COMMAND = { minProtocol: 8, minSchemaRevision: 11 } as const;\nconst RLM_CAPACITY_COMMAND = { minProtocol: 13, minSchemaRevision: 49 } as const;\nconst SESSION_INPUT_ADMISSION_COMMAND = {\n\tminProtocol: 8,\n\tcapability: \"session_input_admission\",\n} as const;\nconst PROMPT_ADMISSION_CANCELLATION_COMMAND = {\n\tminProtocol: 8,\n\tminSchemaRevision: 8,\n\tcapability: \"prompt_admission_cancellation\",\n} as const;\nconst OWNED_PROMPT_CANCELLATION_COMMAND = {\n\tminProtocol: 8,\n\tminSchemaRevision: 20,\n\tcapability: \"owned_prompt_cancellation\",\n} as const;\nconst CLIENT_OWNED_DAEMON_COMMAND = {\n\tminProtocol: 8,\n\tcapability: \"client_owned_sessions\",\n} as const;\nconst DELETE_RLM_SUBAGENT_COMMAND = {\n\tminProtocol: 8,\n\tcapability: \"delete_rlm_subagent\",\n} as const;\nconst FLAT_SESSION_TREE_COMMAND = { minProtocol: 8 } as const;\nconst AUTHORITATIVE_CHILD_ROSTER_COMMAND = {\n\tminProtocol: 8,\n\tminSchemaRevision: 17,\n\tcapability: \"authoritative_child_roster\",\n} as const;\nconst OWNED_SESSION_RECOVERY_CONTEXT = {\n\tminProtocol: 8,\n\tminSchemaRevision: 17,\n\tcapability: \"owned_session_recovery_context\",\n} as const;\nconst RLM_QUIESCENCE_BARRIER_COMMAND = {\n\tminProtocol: 8,\n\tminSchemaRevision: 18,\n\tcapability: \"rlm_quiescence_barrier\",\n} as const;\nconst SESSION_INPUT_PAUSE_COMMAND = {\n\tminProtocol: 8,\n\tminSchemaRevision: 19,\n\tcapability: \"session_input_pause\",\n} as const;\nconst AGENT_PEER_LIST_COMMAND = { minProtocol: 8, minSchemaRevision: 23 } as const;\nconst DIRECT_PEER_TRANSPORT_COMMAND = {\n\tminProtocol: 8,\n\tminSchemaRevision: 25,\n\tcapability: \"direct_peer_transport\",\n} as const;\n\nexport const DAEMON_COMMAND_COMPATIBILITY = {\n\tack_result: LEGACY_DAEMON_COMMAND,\n\tlist: LEGACY_DAEMON_COMMAND,\n\tlist_saved_sessions: LEGACY_DAEMON_COMMAND,\n\tlist_agent_peers: { ...AGENT_PEER_LIST_COMMAND, minProtocol: 10 },\n\trlm_ledger_mutate: { minProtocol: 10, minSchemaRevision: 28, capability: \"rlm_ledger_mutation\" },\n\trlm_capacity: RLM_CAPACITY_COMMAND,\n\tget_direct_worker_transport: { ...DIRECT_PEER_TRANSPORT_COMMAND, minProtocol: 10 },\n\tcreate: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tattach: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\treattach: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tdetach: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tcomplete_owned_session: { ...CLIENT_OWNED_DAEMON_COMMAND, minProtocol: 10 },\n\tpromote_owned_session: { ...CLIENT_OWNED_DAEMON_COMMAND, minProtocol: 10 },\n\tkill: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\trename: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tprompt: { ...SESSION_INPUT_ADMISSION_COMMAND, minProtocol: 10 },\n\tcancel_prompt_admission: { ...PROMPT_ADMISSION_CANCELLATION_COMMAND, minProtocol: 10 },\n\tprompt_and_wait: { ...SESSION_INPUT_ADMISSION_COMMAND, minProtocol: 10 },\n\tsteer: { ...SESSION_INPUT_ADMISSION_COMMAND, minProtocol: 10 },\n\tfollow_up: { ...SESSION_INPUT_ADMISSION_COMMAND, minProtocol: 10 },\n\trestore_next_turn: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\trestore_actions: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tappend_custom_message: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tresume_queue: { ...SESSION_INPUT_ADMISSION_COMMAND, minProtocol: 10 },\n\tsend_message: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tsend_result: { minProtocol: 11, minSchemaRevision: 47, capability: \"agent_results\" },\n\tagent_messages_status: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tagent_messages_pause: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tagent_messages_resume: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tagent_messages_clear: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tabort: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tstart_side_question: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tabort_side_question: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\texecute_bash: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tabort_bash: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tcancel_rlm_child: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tdelete_rlm_subagent: { ...DELETE_RLM_SUBAGENT_COMMAND, minProtocol: 10 },\n\twait_for_idle: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\twait_for_headless_completion: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_session_header: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_state: LEGACY_DAEMON_COMMAND,\n\tget_connection_state: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_messages: LEGACY_DAEMON_COMMAND,\n\tget_rlm_children: { ...AUTHORITATIVE_CHILD_ROSTER_COMMAND, minProtocol: 10 },\n\tget_session_stats: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_context_tree: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_commands: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_resource_snapshot: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\treplace_acp_mcp_servers: { minProtocol: 10, minSchemaRevision: 22, capability: \"acp_mcp_servers\" },\n\tget_model_catalog: { minProtocol: 10, capability: \"model_catalog\" },\n\tget_available_models: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_queue: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tmutate_queued_message: { minProtocol: 10, minSchemaRevision: 15, capability: \"queue_message_mutation\" },\n\tclear_queue: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tabort_and_clear_queue: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tacquire_session_input_pause: { ...SESSION_INPUT_PAUSE_COMMAND, minProtocol: 10 },\n\trelease_session_input_pause: { ...SESSION_INPUT_PAUSE_COMMAND, minProtocol: 10 },\n\tcron_list: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\theartbeats_list: { minProtocol: 10, capability: \"heartbeat_catalog\" },\n\troster_subscribe: { minProtocol: 8, capability: \"agent_roster\" },\n\troster_unsubscribe: { minProtocol: 8, capability: \"agent_roster\" },\n\theartbeat_manage: { minProtocol: 10, capability: \"heartbeat_management\" },\n\tcron_add: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tcron_cancel: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tcron_resume: { minProtocol: 11, minSchemaRevision: 46, capability: \"cron_resume\" },\n\theartbeat_get: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\theartbeat_set: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\theartbeat_update: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_model: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tcycle_model: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_scoped_models: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_thinking_level: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_service_tier: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tcycle_thinking_level: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_transport: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_steering_mode: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_follow_up_mode: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_auto_compaction: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_auto_retry: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tcompact: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\trefine: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tabort_compaction: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tabort_branch_summary: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tabort_retry: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\texecute_bash_and_wait: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\treload: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tnew_session: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tswitch_session: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tfork: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tnavigate_tree: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\timport_jsonl: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\texport_html: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\texport_jsonl: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_session_name: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_rlm_max_subagents_status: RLM_CAPACITY_COMMAND,\n\tset_rlm_max_subagents: RLM_CAPACITY_COMMAND,\n\tget_rlm_max_depth_status: { ...RLM_MAX_DEPTH_COMMAND, minProtocol: 10 },\n\tset_rlm_max_depth: { ...RLM_MAX_DEPTH_COMMAND, minProtocol: 10 },\n\trename_saved_session: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tdelete_saved_session: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_session_context: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_session_tree: { ...FLAT_SESSION_TREE_COMMAND, minProtocol: 10 },\n\tget_user_messages_for_forking: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_last_assistant_text: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_system_prompt: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tget_tool_definition: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tset_session_entry_label: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\textension_ui_response: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tprepare_update_restart: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tretry_worker: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\trestart: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tshutdown: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n} as const satisfies Record<DaemonCommandName, DaemonCommandCompatibility>;\n\n/**\n * Which endpoint serves each command when a client holds both a supervisor\n * (control-plane) and a direct worker (session-plane) connection. Session is\n * the default for session-addressed commands; \"control\" marks supervisor\n * semantics: worker lifecycle, cross-worker targeting, daemon-global\n * registries, and names a worker resolves differently (a worker's \"list\" is\n * only its own sessions). Total over DaemonCommand[\"type\"], so an\n * unclassified command is a compile error and never routes direct.\n */\nexport const DAEMON_COMMAND_PLANE = {\n\tack_result: \"control\",\n\tlist: \"control\",\n\tlist_saved_sessions: \"control\",\n\tlist_agent_peers: \"control\",\n\trlm_ledger_mutate: \"control\",\n\trlm_capacity: \"control\",\n\tget_direct_worker_transport: \"control\",\n\tcreate: \"control\",\n\tattach: \"session\",\n\treattach: \"control\",\n\tdetach: \"session\",\n\tcomplete_owned_session: \"control\",\n\tpromote_owned_session: \"control\",\n\tkill: \"control\",\n\trename: \"control\",\n\tprompt: \"session\",\n\tcancel_prompt_admission: \"session\",\n\tprompt_and_wait: \"session\",\n\tsteer: \"session\",\n\tfollow_up: \"session\",\n\trestore_next_turn: \"session\",\n\trestore_actions: \"session\",\n\tappend_custom_message: \"session\",\n\tresume_queue: \"session\",\n\tsend_message: \"control\",\n\tsend_result: \"control\",\n\tagent_messages_status: \"control\",\n\tagent_messages_pause: \"control\",\n\tagent_messages_resume: \"control\",\n\tagent_messages_clear: \"control\",\n\tabort: \"session\",\n\tstart_side_question: \"session\",\n\tabort_side_question: \"session\",\n\texecute_bash: \"session\",\n\tabort_bash: \"session\",\n\tcancel_rlm_child: \"session\",\n\tdelete_rlm_subagent: \"session\",\n\twait_for_idle: \"session\",\n\twait_for_headless_completion: \"session\",\n\tget_session_header: \"session\",\n\tget_state: \"session\",\n\tget_connection_state: \"session\",\n\tget_messages: \"session\",\n\tget_rlm_children: \"session\",\n\tget_session_stats: \"session\",\n\tget_context_tree: \"session\",\n\tget_commands: \"session\",\n\tget_resource_snapshot: \"session\",\n\treplace_acp_mcp_servers: \"session\",\n\tget_model_catalog: \"session\",\n\tget_available_models: \"session\",\n\tget_queue: \"session\",\n\tmutate_queued_message: \"session\",\n\tclear_queue: \"session\",\n\tabort_and_clear_queue: \"session\",\n\tacquire_session_input_pause: \"session\",\n\trelease_session_input_pause: \"session\",\n\tcron_list: \"control\",\n\theartbeats_list: \"control\",\n\troster_subscribe: \"control\",\n\troster_unsubscribe: \"control\",\n\theartbeat_manage: \"control\",\n\tcron_add: \"control\",\n\tcron_cancel: \"control\",\n\tcron_resume: \"control\",\n\theartbeat_get: \"control\",\n\theartbeat_set: \"control\",\n\theartbeat_update: \"control\",\n\tset_model: \"session\",\n\tcycle_model: \"session\",\n\tset_scoped_models: \"session\",\n\tset_thinking_level: \"session\",\n\tset_service_tier: \"session\",\n\tcycle_thinking_level: \"session\",\n\tset_transport: \"session\",\n\tset_steering_mode: \"session\",\n\tset_follow_up_mode: \"session\",\n\tset_auto_compaction: \"session\",\n\tset_auto_retry: \"session\",\n\tcompact: \"session\",\n\trefine: \"session\",\n\tabort_compaction: \"session\",\n\tabort_branch_summary: \"session\",\n\tabort_retry: \"session\",\n\texecute_bash_and_wait: \"session\",\n\treload: \"session\",\n\tnew_session: \"session\",\n\tswitch_session: \"session\",\n\tfork: \"session\",\n\tnavigate_tree: \"session\",\n\timport_jsonl: \"session\",\n\texport_html: \"session\",\n\texport_jsonl: \"session\",\n\tset_session_name: \"control\",\n\tget_rlm_max_subagents_status: \"session\",\n\tset_rlm_max_subagents: \"session\",\n\tget_rlm_max_depth_status: \"session\",\n\tset_rlm_max_depth: \"session\",\n\trename_saved_session: \"control\",\n\tdelete_saved_session: \"control\",\n\tget_session_context: \"session\",\n\tget_session_tree: \"session\",\n\tget_user_messages_for_forking: \"session\",\n\tget_last_assistant_text: \"session\",\n\tget_system_prompt: \"session\",\n\tget_tool_definition: \"session\",\n\tset_session_entry_label: \"session\",\n\textension_ui_response: \"session\",\n\tprepare_update_restart: \"control\",\n\tretry_worker: \"control\",\n\trestart: \"control\",\n\tshutdown: \"control\",\n} as const satisfies Record<DaemonCommandName, \"session\" | \"control\">;\n\nexport function isSessionPlaneDaemonCommand(type: string): boolean {\n\treturn (DAEMON_COMMAND_PLANE as Record<string, \"session\" | \"control\" | undefined>)[type] === \"session\";\n}\n\nexport function getDaemonCommandCompatibilities(command: DaemonCommand): readonly DaemonCommandCompatibility[] {\n\tconst requirements: DaemonCommandCompatibility[] = isLegacyDaemonInspection(command)\n\t\t? []\n\t\t: [...NATIVE_WORK_COMPATIBILITIES];\n\tif ((command.type === \"attach\" || command.type === \"reattach\") && command.recoveryConfig !== undefined) {\n\t\trequirements.push(OWNED_SESSION_RECOVERY_CONTEXT);\n\t}\n\tif ((command.type === \"prompt\" || command.type === \"prompt_and_wait\") && command.admissionId !== undefined) {\n\t\trequirements.push(PROMPT_ADMISSION_CANCELLATION_COMMAND);\n\t}\n\tif (command.type === \"wait_for_headless_completion\" && command.waitForRlmQuiescence === true) {\n\t\trequirements.push(RLM_QUIESCENCE_BARRIER_COMMAND);\n\t}\n\tif (command.type === \"cancel_prompt_admission\" && command.cancelOwned === true) {\n\t\trequirements.push(OWNED_PROMPT_CANCELLATION_COMMAND);\n\t}\n\tconst commandRequirement = DAEMON_COMMAND_COMPATIBILITY[command.type];\n\treturn commandRequirement === CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY\n\t\t? requirements\n\t\t: [...requirements, commandRequirement];\n}\n\nexport function meetsDaemonCommandCompatibility(\n\thello: {\n\t\tprotocol: DaemonProtocolInfo;\n\t\tschemaRevision?: number;\n\t\tserverCapabilities?: readonly DaemonServerCapability[];\n\t},\n\tcompatibility: DaemonCommandCompatibility,\n): boolean {\n\treturn (\n\t\thello.protocol.version >= compatibility.minProtocol &&\n\t\t(compatibility.minSchemaRevision === undefined ||\n\t\t\t(hello.schemaRevision ?? 0) >= compatibility.minSchemaRevision) &&\n\t\t(compatibility.capability === undefined || hello.serverCapabilities?.includes(compatibility.capability) === true)\n\t);\n}\n\nexport type DaemonResponse =\n\t| { id?: string; type: \"response\"; command: string; success: true; data?: unknown }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"response\";\n\t\t\tcommand: string;\n\t\t\tsuccess: false;\n\t\t\terror: string;\n\t\t\terrorInfo?: DaemonErrorInfo;\n\t };\n\nexport type DaemonErrorInfo =\n\t| { code: \"missing_session_cwd\"; issue: SessionCwdIssue }\n\t| { code: \"session_import_file_not_found\"; filePath: string }\n\t| { code: \"session_already_active\"; sessionPath: string; activeSessionId?: string }\n\t| { code: \"command_result_uncertain\"; clientId: DaemonClientId; commandId: DaemonCommandId };\n\nexport type DaemonSessionClosedReason = \"killed\" | \"shutdown\" | \"completed\" | \"replaced\" | \"update\";\nexport type DaemonClosingReason = \"shutdown\" | \"update\";\n\nexport type DaemonExtensionUIResponse = { value: string } | { confirmed: boolean } | { cancelled: true };\n\nexport function isDaemonDialogExtensionUiRequest(method: string): boolean {\n\treturn method === \"select\" || method === \"confirm\" || method === \"input\" || method === \"editor\";\n}\n\n/**\n * True when a daemon rejected a command it does not know, i.e. the daemon\n * process was started from a build that predates the command.\n */\nexport function isUnknownDaemonCommandError(error: unknown, command: DaemonCommand[\"type\"]): boolean {\n\treturn error instanceof Error && error.message.includes(`Unknown daemon command: ${command}`);\n}\n\nexport type DaemonRequestProgress =\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"session_list_progress\";\n\t\t\tcommand: \"list_saved_sessions\";\n\t\t\tactiveSessionId?: string;\n\t\t\tloaded: number;\n\t\t\ttotal: number;\n\t }\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"session_list_item\";\n\t\t\tcommand: \"list_saved_sessions\";\n\t\t\tactiveSessionId?: string;\n\t\t\tsession: DaemonSavedSessionInfo;\n\t };\n\nexport interface DaemonSavedSessionInfo {\n\tpath: string;\n\tid: string;\n\tcwd: string;\n\tname?: string;\n\tstate?: AgentConnectionSavedSessionState;\n\tparentSessionPath?: string;\n\trlmDepth?: number;\n\tcreated: string;\n\tmodified: string;\n\tmessageCount: number;\n\tfirstMessage: string;\n\tallMessagesText: string;\n\tagentStatus?: AgentConnectionAgentStatus;\n\tusage?: SessionUsageSummary;\n}\n\nexport type DaemonDeleteSavedSessionResult = DeleteSessionFileResult;\nexport type DaemonAutonomousStatus = AgentAutonomousStatus;\nexport type DaemonBashResult = BashResult;\nexport type DaemonSessionHeader = AgentConnectionSessionHeader;\n\nexport type DaemonResourceSnapshot = AgentConnectionResourceSnapshot;\n\nexport type DaemonCronJob = AgentCronJob;\nexport type DaemonHeartbeat = AgentConnectionHeartbeat;\nexport type DaemonAgentSessionMessageReceipt = AgentSessionMessageReceipt;\nexport type DaemonAgentSessionMessageSafetyStatus = AgentSessionMessageSafetyStatus;\n\nexport type DaemonOutbound =\n\t| DaemonResponse\n\t| DaemonRequestProgress\n\t| {\n\t\t\ttype: \"daemon_hello\";\n\t\t\tsocketPath: string;\n\t\t\tprotocol: DaemonProtocolInfo;\n\t\t\tschemaId?: string;\n\t\t\t/** Monotonic wire-schema revision for field-sensitive compatibility checks. */\n\t\t\tschemaRevision?: number;\n\t\t\t/** App version of the daemon process, used to detect stale daemons after self-update. */\n\t\t\tappVersion?: string;\n\t\t\truntime?: DaemonRuntimeIdentity;\n\t\t\t/** Changes whenever the public supervisor process is replaced. */\n\t\t\tsupervisorGeneration?: string;\n\t\t\t/** Diagnostic process identity for attributing supervisor replacement. */\n\t\t\tsupervisorPid?: number;\n\t\t\t/** Durable owner marker for validating update handoff fences. */\n\t\t\tsupervisorOwnerToken?: string;\n\t\t\t/** Process start identity captured when the durable owner was published. */\n\t\t\tsupervisorProcessStartId?: string;\n\t\t\t/** Normalized socket identity stored in the durable owner record. */\n\t\t\tsupervisorSocketPath?: string;\n\t\t\tclientId: DaemonClientId;\n\t\t\tserverCapabilities: readonly DaemonServerCapability[];\n\t }\n\t| { type: \"daemon_closing\"; reason: DaemonClosingReason }\n\t| { type: \"heartbeats_changed\" }\n\t| { type: \"roster_update\"; changed: AgentRosterEntry[]; removed?: string[]; resync?: true }\n\t| { type: \"session_event\"; activeSessionId: string; event: AgentConnectionSessionEvent; meta?: DaemonEventMeta }\n\t| { type: \"side_question_event\"; activeSessionId: string; event: AgentConnectionSideQuestionEvent }\n\t| { type: \"session_status\"; activeSessionId: string; recap?: string; meta?: DaemonEventMeta }\n\t| {\n\t\t\ttype: \"session_replaced\";\n\t\t\tactiveSessionId: string;\n\t\t\tstate: AgentConnectionState;\n\t\t\tmessages: AgentMessage[];\n\t\t\tsnapshotFollows?: boolean;\n\t\t\tmeta?: DaemonEventMeta;\n\t }\n\t| {\n\t\t\ttype: \"session_resynced\";\n\t\t\tactiveSessionId: string;\n\t\t\tsnapshot: DaemonSessionSnapshot;\n\t\t\tmeta?: DaemonEventMeta;\n\t }\n\t| {\n\t\t\ttype: \"session_attached\";\n\t\t\tactiveSessionId: string;\n\t\t\tstate: SessionSummary;\n\t\t\tmessages: AgentMessage[];\n\t\t\tsnapshot?: DaemonSessionSnapshot;\n\t\t\treplay?: DaemonReplayInfo;\n\t\t\tlastEventSequence?: DaemonEventSequence;\n\t }\n\t| {\n\t\t\ttype: \"session_snapshot_begin\";\n\t\t\tactiveSessionId: string;\n\t\t\tsnapshotId: string;\n\t\t\tsnapshot: Omit<DaemonSessionSnapshot, \"messages\">;\n\t\t\tmessageCount: number;\n\t\t\ttargetChunkBytes: number;\n\t\t\tpurpose?: \"attach\" | \"replacement\" | \"resync\";\n\t }\n\t| {\n\t\t\ttype: \"session_snapshot_chunk\";\n\t\t\tactiveSessionId: string;\n\t\t\tsnapshotId: string;\n\t\t\tindex: number;\n\t\t\tmessages: AgentMessage[];\n\t }\n\t| {\n\t\t\ttype: \"session_snapshot_end\";\n\t\t\tactiveSessionId: string;\n\t\t\tsnapshotId: string;\n\t\t\tchunkCount: number;\n\t\t\tlastEventSequence: DaemonEventSequence;\n\t\t\tlastEventCursor?: DaemonEventCursor;\n\t }\n\t| {\n\t\t\ttype: \"session_snapshot_failed\";\n\t\t\tactiveSessionId: string;\n\t\t\tsnapshotId: string;\n\t\t\terror: string;\n\t }\n\t| { type: \"session_detached\"; activeSessionId: string }\n\t| { type: \"session_closed\"; activeSessionId: string; reason: DaemonSessionClosedReason; meta?: DaemonEventMeta }\n\t| {\n\t\t\ttype: \"extension_ui_request\";\n\t\t\tactiveSessionId: string;\n\t\t\tid: string;\n\t\t\tmethod: string;\n\t\t\tpayload: Record<string, unknown>;\n\t\t\tmeta?: DaemonEventMeta;\n\t }\n\t| {\n\t\t\ttype: \"extension_error\";\n\t\t\tactiveSessionId: string;\n\t\t\textensionPath: string;\n\t\t\tevent: string;\n\t\t\terror: string;\n\t\t\tmeta?: DaemonEventMeta;\n\t };\n\nexport const DAEMON_OUTBOUND_COMPATIBILITY = {\n\tresponse: LEGACY_DAEMON_COMMAND,\n\tsession_list_progress: LEGACY_DAEMON_COMMAND,\n\tsession_list_item: LEGACY_DAEMON_COMMAND,\n\tdaemon_hello: LEGACY_DAEMON_COMMAND,\n\tdaemon_closing: LEGACY_DAEMON_COMMAND,\n\theartbeats_changed: { minProtocol: 8, capability: \"heartbeat_catalog\" },\n\troster_update: { minProtocol: 8, capability: \"agent_roster\" },\n\t// agent_end refusal omits messages; attached readers must understand that terminal variant.\n\tsession_event: CANONICAL_SESSION_OWNERSHIP_COMPATIBILITY,\n\tside_question_event: LEGACY_DAEMON_COMMAND,\n\tsession_status: LEGACY_DAEMON_COMMAND,\n\tsession_replaced: LEGACY_DAEMON_COMMAND,\n\tsession_resynced: LEGACY_DAEMON_COMMAND,\n\tsession_attached: LEGACY_DAEMON_COMMAND,\n\tsession_snapshot_begin: LEGACY_DAEMON_COMMAND,\n\tsession_snapshot_chunk: LEGACY_DAEMON_COMMAND,\n\tsession_snapshot_end: LEGACY_DAEMON_COMMAND,\n\tsession_snapshot_failed: LEGACY_DAEMON_COMMAND,\n\tsession_detached: LEGACY_DAEMON_COMMAND,\n\tsession_closed: LEGACY_DAEMON_COMMAND,\n\textension_ui_request: LEGACY_DAEMON_COMMAND,\n\textension_error: LEGACY_DAEMON_COMMAND,\n} as const satisfies Record<DaemonOutbound[\"type\"], DaemonCommandCompatibility>;\n\n/** Optional response metadata; the existing command remains available without this capability. */\nexport const DAEMON_RESPONSE_FIELD_COMPATIBILITY = {\n\tget_context_tree: {\n\t\townRequestUsage: { minProtocol: 13, minSchemaRevision: 50, capability: \"context_request_usage\" },\n\t},\n} as const;\n\n/** Additive evidence fields: older observer events keep absence, never fabricated identities. */\nexport const DAEMON_SESSION_EVENT_FIELD_COMPATIBILITY = {\n\ttool_execution_end: { exchange: { minProtocol: 9, minSchemaRevision: 28, capability: \"finalized_tool_exchanges\" } },\n\tturn_end: {\n\t\texchanges: { minProtocol: 9, minSchemaRevision: 28, capability: \"finalized_tool_exchanges\" },\n\t\ttoolExecution: { minProtocol: 9, minSchemaRevision: 28, capability: \"finalized_tool_exchanges\" },\n\t},\n} as const;\n\nexport function createDaemonCommandEnvelope<TCommand extends DaemonCommand>(\n\tcommand: TCommand,\n\tid: DaemonCommandId,\n\tclientId?: DaemonClientId,\n\tprotocolVersion: DaemonProtocolVersion = DAEMON_PROTOCOL_VERSION,\n): DaemonCommandEnvelope<TCommand> {\n\treturn {\n\t\ttype: \"command\",\n\t\tid,\n\t\tprotocol: { name: DAEMON_PROTOCOL_NAME, version: protocolVersion },\n\t\t...(clientId ? { clientId } : {}),\n\t\tcommand,\n\t};\n}\n\nexport function isDaemonCommandEnvelope(value: unknown): value is DaemonCommandEnvelope {\n\tif (!value || typeof value !== \"object\") {\n\t\treturn false;\n\t}\n\tconst candidate = value as {\n\t\ttype?: unknown;\n\t\tid?: unknown;\n\t\tprotocol?: { name?: unknown; version?: unknown };\n\t\tclientId?: unknown;\n\t\tcommand?: unknown;\n\t};\n\treturn (\n\t\tcandidate.type === \"command\" &&\n\t\ttypeof candidate.id === \"string\" &&\n\t\tcandidate.protocol?.name === DAEMON_PROTOCOL_NAME &&\n\t\ttypeof candidate.protocol.version === \"number\" &&\n\t\tcandidate.protocol.version >= DAEMON_COMMAND_ENVELOPE_MIN_PROTOCOL_VERSION &&\n\t\tcandidate.protocol.version <= DAEMON_PROTOCOL_VERSION &&\n\t\t(candidate.clientId === undefined || typeof candidate.clientId === \"string\") &&\n\t\ttypeof candidate.command === \"object\" &&\n\t\tcandidate.command !== null\n\t);\n}\n\n/**\n * Best-effort id salvage for rejected command lines, so parse failures reach\n * the sender as correlatable responses instead of client-side timeouts.\n * Deliberately ignores everything but the id itself: whatever made the line\n * unparseable (rejected protocol version, missing or invalid type), the\n * sender still correlates the failure by id.\n */\nexport function salvageDaemonCommandId(line: string): string | undefined {\n\ttry {\n\t\tconst candidate = JSON.parse(line) as { id?: unknown };\n\t\tif (!candidate || typeof candidate !== \"object\") {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn typeof candidate.id === \"string\" ? candidate.id : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nconst READ_ONLY_DAEMON_COMMANDS: ReadonlySet<DaemonCommand[\"type\"]> = new Set([\n\t\"ack_result\",\n\t\"list\",\n\t\"list_saved_sessions\",\n\t\"list_agent_peers\",\n\t\"get_direct_worker_transport\",\n\t\"attach\",\n\t\"reattach\",\n\t\"roster_subscribe\",\n\t\"roster_unsubscribe\",\n\t\"agent_messages_status\",\n\t\"wait_for_idle\",\n\t\"get_session_header\",\n\t\"get_state\",\n\t\"get_connection_state\",\n\t\"get_messages\",\n\t\"get_rlm_children\",\n\t\"get_session_stats\",\n\t\"get_context_tree\",\n\t\"get_commands\",\n\t\"get_resource_snapshot\",\n\t\"get_model_catalog\",\n\t\"get_available_models\",\n\t\"get_queue\",\n\t\"cron_list\",\n\t\"heartbeats_list\",\n\t\"heartbeat_get\",\n\t\"get_session_context\",\n\t\"get_session_tree\",\n\t\"get_user_messages_for_forking\",\n\t\"get_last_assistant_text\",\n\t\"get_system_prompt\",\n\t\"get_rlm_max_subagents_status\",\n\t\"get_rlm_max_depth_status\",\n\t\"get_tool_definition\",\n]);\n\nexport function isDaemonMutatingCommand(command: Pick<DaemonCommand, \"type\">): boolean {\n\treturn !READ_ONLY_DAEMON_COMMANDS.has(command.type);\n}\n\nexport const UPDATE_RESTART_DRAIN_COMMANDS: ReadonlySet<DaemonCommand[\"type\"]> = new Set([\n\t\"rlm_ledger_mutate\",\n\t\"rlm_capacity\",\n\t\"extension_ui_response\",\n\t\"abort\",\n\t\"abort_bash\",\n\t\"abort_branch_summary\",\n\t\"abort_compaction\",\n\t\"abort_retry\",\n]);\n\nexport function createDaemonEventEnvelope<TEvent extends DaemonOutbound>(\n\tevent: TEvent,\n\tmeta: DaemonEventMeta,\n): DaemonEventEnvelope<TEvent> {\n\treturn {\n\t\ttype: \"event\",\n\t\tid: meta.id,\n\t\tprotocol: meta.protocol,\n\t\t...(meta.activeSessionId ? { activeSessionId: meta.activeSessionId } : {}),\n\t\t...(meta.sequence !== undefined ? { sequence: meta.sequence } : {}),\n\t\t...(meta.cursor ? { cursor: meta.cursor } : {}),\n\t\temittedAt: meta.emittedAt,\n\t\tevent,\n\t};\n}\n\nexport function createDaemonEventMeta(\n\tactiveSessionId: string,\n\tsequence: DaemonEventSequence,\n\temittedAt = new Date().toISOString(),\n\tgeneration = activeSessionId,\n): DaemonEventMeta {\n\treturn {\n\t\tid: `${activeSessionId}:${sequence}`,\n\t\tprotocol: DAEMON_PROTOCOL_INFO,\n\t\tactiveSessionId,\n\t\tsequence,\n\t\tcursor: { generation, sequence },\n\t\temittedAt,\n\t};\n}\n\nexport function createDaemonReplayInfo(\n\tresumeCursor: DaemonResumeCursor | undefined,\n\tlastEventSequence: DaemonEventSequence,\n\tgeneration = \"legacy\",\n): DaemonReplayInfo {\n\tconst toCursor = { generation, sequence: lastEventSequence };\n\tif (!resumeCursor) {\n\t\treturn {\n\t\t\tstatus: \"complete\",\n\t\t\ttoSequence: lastEventSequence,\n\t\t\ttoCursor,\n\t\t};\n\t}\n\tconst resumeSequence = \"sequence\" in resumeCursor ? resumeCursor.sequence : resumeCursor.eventSequence;\n\tconst fromCursor =\n\t\t\"generation\" in resumeCursor\n\t\t\t? { generation: resumeCursor.generation, sequence: resumeCursor.sequence }\n\t\t\t: undefined;\n\tif (fromCursor && fromCursor.generation !== generation) {\n\t\treturn {\n\t\t\tstatus: \"unavailable\",\n\t\t\tfromSequence: resumeSequence,\n\t\t\ttoSequence: lastEventSequence,\n\t\t\tfromCursor,\n\t\t\ttoCursor,\n\t\t\treason: \"event_generation_changed\",\n\t\t};\n\t}\n\n\tif (resumeSequence > lastEventSequence) {\n\t\treturn {\n\t\t\tstatus: \"unavailable\",\n\t\t\tfromSequence: resumeSequence,\n\t\t\ttoSequence: lastEventSequence,\n\t\t\t...(fromCursor ? { fromCursor } : {}),\n\t\t\ttoCursor,\n\t\t\treason: \"resume_cursor_ahead_of_session\",\n\t\t};\n\t}\n\n\tif (resumeSequence === lastEventSequence) {\n\t\treturn {\n\t\t\tstatus: \"complete\",\n\t\t\tfromSequence: resumeSequence,\n\t\t\ttoSequence: lastEventSequence,\n\t\t\t...(fromCursor ? { fromCursor } : {}),\n\t\t\ttoCursor,\n\t\t};\n\t}\n\n\treturn {\n\t\tstatus: \"unavailable\",\n\t\tfromSequence: resumeSequence,\n\t\ttoSequence: lastEventSequence,\n\t\t...(fromCursor ? { fromCursor } : {}),\n\t\ttoCursor,\n\t\treason: \"event_replay_not_available\",\n\t};\n}\n\nexport function success(id: string | undefined, command: DaemonCommandName, data?: unknown): DaemonResponse {\n\treturn data === undefined\n\t\t? { id, type: \"response\", command, success: true }\n\t\t: { id, type: \"response\", command, success: true, data };\n}\n\nexport function failure(\n\tid: string | undefined,\n\tcommand: string,\n\terror: unknown,\n\terrorInfo?: DaemonErrorInfo,\n): DaemonResponse {\n\treturn {\n\t\tid,\n\t\ttype: \"response\",\n\t\tcommand,\n\t\tsuccess: false,\n\t\terror: error instanceof Error ? error.message : String(error),\n\t\t...(errorInfo ? { errorInfo } : {}),\n\t};\n}\n"]}
|
|
@@ -18,6 +18,7 @@ export interface GenerateAgentStatusParams {
|
|
|
18
18
|
model?: Model<Api>;
|
|
19
19
|
messages: readonly AgentMessage[];
|
|
20
20
|
isWorking: boolean;
|
|
21
|
+
sessionId?: string;
|
|
21
22
|
signal?: AbortSignal;
|
|
22
23
|
requests?: InferenceCoordinator;
|
|
23
24
|
}
|
|
@@ -38,6 +39,7 @@ export declare class DaemonSessionSummarizer {
|
|
|
38
39
|
private interval;
|
|
39
40
|
private readonly debounceTimers;
|
|
40
41
|
private readonly inFlight;
|
|
42
|
+
private readonly refreshes;
|
|
41
43
|
private readonly tasks;
|
|
42
44
|
private readonly forgotten;
|
|
43
45
|
private stopped;
|
|
@@ -51,6 +53,7 @@ export declare class DaemonSessionSummarizer {
|
|
|
51
53
|
seed(state: ActiveSessionState): void;
|
|
52
54
|
/** Called when a session finishes a turn; debounce until the agent settles. */
|
|
53
55
|
notifyActivity(state: ActiveSessionState): void;
|
|
56
|
+
private schedule;
|
|
54
57
|
private summarize;
|
|
55
58
|
private runSummary;
|
|
56
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-session-summarizer.d.ts","sourceRoot":"","sources":["../../../src/modes/daemon/daemon-session-summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAqB,KAAK,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AACnG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAWpE,eAAO,MAAM,0BAA0B,s5BAaV,CAAC;AAE9B,MAAM,WAAW,iBAAiB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,cAAc,CAAC;CAC3B;AAiCD,4FAA4F;AAC5F,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAkBhG;AAyBD,wGAAwG;AACxG,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,iBAAiB,GAAG,SAAS,CAgBxG;AAED,MAAM,WAAW,yBAAyB;IACzC,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAED,mFAAmF;AACnF,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CA2CnH;AAmBD;;;;;GAKG;AACH,qBAAa,uBAAuB;IAYlC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAGzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAlBzB,OAAO,CAAC,QAAQ,CAA6C;IAC7D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoD;IAEnF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAC/D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IAEpD,YACkB,YAAY,EAAE,MAAM,SAAS,kBAAkB,EAAE,EACjD,eAAe,CAAC,mDAAqC,EAErD,QAAQ,GAAE,CAC1B,MAAM,EAAE,yBAAyB,KAC7B,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAuB,EAChD,WAAW,CAAC,wFAA6E,EACzF,OAAO,GAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,KAAK,IACpD,EAClB;IAEJ,KAAK,IAAI,IAAI,CAWZ;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAe1B;IAED,0EAA0E;IACpE,MAAM,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUnD;IAED,8EAA8E;IAC9E,IAAI,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CASpC;IAED,+EAA+E;IAC/E,cAAc,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAa9C;IAED,OAAO,CAAC,SAAS;YAkBH,UAAU;CA4GxB","sourcesContent":["import type { AgentMessage } from \"@ponythewhite/base-context-agent\";\nimport type { Api, Model } from \"@ponythewhite/base-context-ai\";\nimport { completeInference, type InferenceCoordinator } from \"../../core/inference-coordinator.js\";\nimport type { ModelRegistry } from \"../../core/model-registry.js\";\nimport type { AgentStatus, AgentTaskState } from \"../../core/session-manager.js\";\nimport type { ActiveSessionState } from \"./active-session-state.js\";\n\nconst SWEEP_INTERVAL_MS = 25_000;\n// Collapse a tool-use loop's rapid turn_end bursts into one summarization.\nconst SETTLE_DEBOUNCE_MS = 2_000;\n\nconst SUMMARY_CONTEXT_MESSAGES = 8;\nconst SUMMARY_MAX_CHARS_PER_MESSAGE = 600;\n// Generous so a chatty model still closes the tags before truncation.\nconst SUMMARY_MAX_TOKENS = 400;\n\nexport const AGENT_STATUS_SYSTEM_PROMPT = `You generate a status line for an AI coding agent dashboard. You are given the recent conversation between a user and the agent, plus whether the agent is currently working or idle.\n\nOutput ONLY these two tags, nothing before, between, or after. Do not think out loud, explain, or count words.\n<recap>a present-tense clause, at most 12 words, saying what the agent is doing or just did, no trailing period</recap>\n<status>one of NEEDS_INPUT, COMPLETED</status>\n\nSTATUS meaning:\n- COMPLETED: the agent finished its turn AND the user's request is fully done with nothing left.\n- NEEDS_INPUT: the agent finished its turn but the task is not fully done — it asked a question, hit a blocker, or needs more prompting.\nWhen you are unsure between COMPLETED and NEEDS_INPUT, choose NEEDS_INPUT.\n\nExample:\n<recap>Refactoring the auth middleware and updating its tests</recap>\n<status>NEEDS_INPUT</status>`;\n\nexport interface AgentStatusResult {\n\tsummary: string;\n\ttaskState?: AgentTaskState;\n}\n\nfunction messageText(content: unknown): { text: string; tools: string[] } {\n\tif (typeof content === \"string\") {\n\t\treturn { text: content, tools: [] };\n\t}\n\tif (!Array.isArray(content)) {\n\t\treturn { text: \"\", tools: [] };\n\t}\n\tconst parts: string[] = [];\n\tconst tools: string[] = [];\n\tfor (const block of content) {\n\t\tif (typeof block !== \"object\" || block === null) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst type = (block as { type?: unknown }).type;\n\t\tif (type === \"text\" && typeof (block as { text?: unknown }).text === \"string\") {\n\t\t\tparts.push((block as { text: string }).text);\n\t\t} else if (type === \"tool_use\" || type === \"toolUse\") {\n\t\t\tconst name = (block as { name?: unknown }).name;\n\t\t\tif (typeof name === \"string\") {\n\t\t\t\ttools.push(name);\n\t\t\t}\n\t\t}\n\t}\n\treturn { text: parts.join(\"\\n\"), tools };\n}\n\nfunction clamp(text: string, max: number): string {\n\tconst normalized = text.replace(/\\s+/g, \" \").trim();\n\treturn normalized.length > max ? `${normalized.slice(0, max)}…` : normalized;\n}\n\n/** Serialize the trailing messages into a compact prompt body (tool calls by name only). */\nexport function buildStatusContext(messages: readonly AgentMessage[], isWorking: boolean): string {\n\tconst recent = messages.slice(-SUMMARY_CONTEXT_MESSAGES);\n\tconst lines: string[] = [];\n\tfor (const message of recent) {\n\t\tconst role = message.role;\n\t\tif (role !== \"user\" && role !== \"assistant\" && role !== \"toolResult\" && role !== \"custom\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst { text, tools } = messageText(message.content);\n\t\tconst body = clamp(text, SUMMARY_MAX_CHARS_PER_MESSAGE);\n\t\tconst toolNote = tools.length > 0 ? `[tools: ${[...new Set(tools)].join(\", \")}]` : \"\";\n\t\tconst rendered = [body, toolNote].filter((part) => part.length > 0).join(\" \");\n\t\tif (rendered) {\n\t\t\tlines.push(`${role}: ${rendered}`);\n\t\t}\n\t}\n\tconst state = isWorking ? \"working\" : \"idle (finished its turn)\";\n\treturn `<agent-state>${state}</agent-state>\\n<conversation>\\n${lines.join(\"\\n\")}\\n</conversation>`;\n}\n\n// Cuts a word-counting trailer the model sometimes appends, e.g.\n// `Sending X. That's 5 words? Count: X(1)... = 6 words.`. Kept to structural\n// counting markers so plain words (\"Waiting for CI\") survive.\nconst REASONING_TRAILER = /\\s*(?:[\"”]\\s*)?(?:\\bthat['’]?s\\s+\\d+\\s*words?\\b|\\bcount\\s*:|\\(\\d+\\)|=\\s*\\d+\\s*words?\\b).*/i;\nconst COUNTING_ARTIFACT = /\\(\\d+\\)|=\\s*\\d+\\s*words?\\b/i;\nconst MAX_RECAP_WORDS = 16;\n\nfunction cleanRecap(raw: string): string | undefined {\n\tconst value = raw\n\t\t.trim()\n\t\t.replace(REASONING_TRAILER, \"\")\n\t\t.replace(/^[\"“']+|[\"”']+$/g, \"\")\n\t\t.replace(/[.\\s]+$/, \"\")\n\t\t.trim();\n\tif (!value || value.startsWith(\"<\") || /present-tense|12 words/i.test(value)) {\n\t\treturn undefined;\n\t}\n\tif (COUNTING_ARTIFACT.test(value) || value.split(/\\s+/).length > MAX_RECAP_WORDS) {\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\n/** Take the content of the last `<recap>` and `<status>` tags; idle verdicts default to needs_input. */\nexport function parseAgentStatusResponse(text: string, isWorking: boolean): AgentStatusResult | undefined {\n\t// Normalize unicode angle-bracket lookalikes (‹ › < >) so a tag written with them still parses.\n\tconst cleaned = text.replace(/[‹<]/g, \"<\").replace(/[›>]/g, \">\");\n\n\tconst recapMatch = [...cleaned.matchAll(/<recap>([\\s\\S]*?)<\\/recap>/gi)].at(-1);\n\tconst summary = recapMatch ? cleanRecap(recapMatch[1]!) : undefined;\n\tif (!summary) {\n\t\treturn undefined;\n\t}\n\tif (isWorking) {\n\t\treturn { summary };\n\t}\n\tconst statusMatch = [...cleaned.matchAll(/<status>\\s*([a-z_]+)\\s*<\\/status>/gi)].at(-1);\n\tconst status = statusMatch ? statusMatch[1]!.toUpperCase() : undefined;\n\tconst taskState: AgentTaskState = status === \"COMPLETED\" ? \"completed\" : \"needs_input\";\n\treturn { summary, taskState };\n}\n\nexport interface GenerateAgentStatusParams {\n\tregistry: ModelRegistry;\n\tmodel?: Model<Api>;\n\tmessages: readonly AgentMessage[];\n\tisWorking: boolean;\n\tsignal?: AbortSignal;\n\trequests?: InferenceCoordinator;\n}\n\n/** Use the session's selected model, or keep the local status when unavailable. */\nexport async function generateAgentStatus(params: GenerateAgentStatusParams): Promise<AgentStatusResult | undefined> {\n\tconst { registry, messages, isWorking, signal, requests, model: selectedModel } = params;\n\tif (messages.length === 0) {\n\t\treturn undefined;\n\t}\n\tif (!selectedModel) {\n\t\treturn undefined;\n\t}\n\tconst model = { ...selectedModel, cost: { ...selectedModel.cost } };\n\tconst subject = buildStatusContext(messages, isWorking);\n\tconst timestamp = Date.now();\n\tconst auth = await registry.getApiKeyAndHeaders(model);\n\tif (!auth.ok || !auth.apiKey) {\n\t\treturn undefined;\n\t}\n\ttry {\n\t\tconst response = await completeInference(\n\t\t\trequests,\n\t\t\tmodel,\n\t\t\t{\n\t\t\t\tsystemPrompt: AGENT_STATUS_SYSTEM_PROMPT,\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\trole: \"user\" as const,\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: subject }],\n\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{ maxTokens: SUMMARY_MAX_TOKENS, apiKey: auth.apiKey, headers: auth.headers, signal },\n\t\t\t{ purpose: \"native-control\", purposeDetail: \"daemon-status\" },\n\t\t);\n\t\tif (response.stopReason === \"error\") {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst textContent = response.content\n\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t.map((c) => c.text)\n\t\t\t.join(\"\\n\");\n\t\treturn parseAgentStatusResponse(textContent, isWorking);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction isSessionWorking(state: ActiveSessionState): boolean {\n\tconst session = state.runtime.session;\n\treturn session.isSessionActive;\n}\n\n/** Use the last assistant turn's real failure instead of asking a classifier to invent completed work. */\nfunction terminalTurnError(messages: readonly AgentMessage[]): string | undefined {\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst message = messages[i];\n\t\tif (message.role !== \"assistant\") continue;\n\t\tif (message.stopReason !== \"error\") return undefined;\n\t\tconst detail = message.errorMessage?.trim();\n\t\treturn detail ? `Model request failed: ${clamp(detail, 160)}` : \"Model request failed\";\n\t}\n\treturn undefined;\n}\n\n/**\n * Background status summarization for daemon-hosted sessions, top-level and\n * subagents alike. A periodic sweep refreshes working sessions; debounced\n * turn-end activity drives the idle verdict. Status lives in memory; settled\n * idle verdicts are persisted.\n */\nexport class DaemonSessionSummarizer {\n\tprivate interval: ReturnType<typeof setInterval> | undefined;\n\tprivate readonly debounceTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\t// Controller per in-flight summary so a closing session can abort its write.\n\tprivate readonly inFlight = new Map<string, AbortController>();\n\tprivate readonly tasks = new Map<string, Promise<void>>();\n\tprivate readonly forgotten = new Set<string>();\n\tprivate stopped = false;\n\t// Sessions requested while one was running; get one more pass on completion.\n\tprivate readonly rerunRequested = new Set<string>();\n\n\tconstructor(\n\t\tprivate readonly listSessions: () => readonly ActiveSessionState[],\n\t\tprivate readonly onStatusChanged?: (state: ActiveSessionState) => void,\n\t\t// Injectable for tests.\n\t\tprivate readonly generate: (\n\t\t\tparams: GenerateAgentStatusParams,\n\t\t) => Promise<AgentStatusResult | undefined> = generateAgentStatus,\n\t\tprivate readonly getRequests?: (session: ActiveSessionState[\"runtime\"][\"session\"]) => InferenceCoordinator,\n\t\tprivate readonly onError: (state: ActiveSessionState, error: unknown) => void = (_state, error) =>\n\t\t\tconsole.error(error),\n\t) {}\n\n\tstart(): void {\n\t\tif (this.interval) {\n\t\t\treturn;\n\t\t}\n\t\tthis.stopped = false;\n\t\tthis.interval = setInterval(() => {\n\t\t\tfor (const state of this.listSessions()) {\n\t\t\t\tthis.summarize(state);\n\t\t\t}\n\t\t}, SWEEP_INTERVAL_MS);\n\t\tthis.interval.unref?.();\n\t}\n\n\tasync stop(): Promise<void> {\n\t\tthis.stopped = true;\n\t\tif (this.interval) {\n\t\t\tclearInterval(this.interval);\n\t\t\tthis.interval = undefined;\n\t\t}\n\t\tfor (const timer of this.debounceTimers.values()) {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t\tthis.debounceTimers.clear();\n\t\tfor (const controller of this.inFlight.values()) {\n\t\t\tcontroller.abort();\n\t\t}\n\t\tthis.rerunRequested.clear();\n\t\tawait Promise.all(this.tasks.values());\n\t}\n\n\t/** Cancel new work and drain any admitted status write before closing. */\n\tasync forget(activeSessionId: string): Promise<void> {\n\t\tthis.forgotten.add(activeSessionId);\n\t\tconst timer = this.debounceTimers.get(activeSessionId);\n\t\tif (timer) {\n\t\t\tclearTimeout(timer);\n\t\t\tthis.debounceTimers.delete(activeSessionId);\n\t\t}\n\t\tthis.inFlight.get(activeSessionId)?.abort();\n\t\tthis.rerunRequested.delete(activeSessionId);\n\t\tawait this.tasks.get(activeSessionId);\n\t}\n\n\t/** Seed in-memory status from the persisted entry when a session is added. */\n\tseed(state: ActiveSessionState): void {\n\t\tthis.forgotten.delete(state.activeSessionId);\n\t\tif (state.summaryState) {\n\t\t\treturn;\n\t\t}\n\t\tconst persisted = state.runtime.session.sessionManager.getLatestAgentStatus();\n\t\tif (persisted) {\n\t\t\tstate.summaryState = persisted;\n\t\t}\n\t}\n\n\t/** Called when a session finishes a turn; debounce until the agent settles. */\n\tnotifyActivity(state: ActiveSessionState): void {\n\t\tconst id = state.activeSessionId;\n\t\tif (this.stopped || this.forgotten.has(id)) return;\n\t\tconst existing = this.debounceTimers.get(id);\n\t\tif (existing) {\n\t\t\tclearTimeout(existing);\n\t\t}\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis.debounceTimers.delete(id);\n\t\t\tthis.summarize(state);\n\t\t}, SETTLE_DEBOUNCE_MS);\n\t\ttimer.unref?.();\n\t\tthis.debounceTimers.set(id, timer);\n\t}\n\n\tprivate summarize(state: ActiveSessionState): Promise<void> {\n\t\tconst id = state.activeSessionId;\n\t\tif (this.stopped || this.forgotten.has(id)) return Promise.resolve();\n\t\tconst existing = this.tasks.get(id);\n\t\tif (existing) {\n\t\t\tthis.rerunRequested.add(id);\n\t\t\treturn existing;\n\t\t}\n\t\tconst task = this.runSummary(state)\n\t\t\t.catch((error) => this.onError(state, error))\n\t\t\t.finally(() => {\n\t\t\t\tthis.tasks.delete(id);\n\t\t\t\tif (this.rerunRequested.delete(id)) this.notifyActivity(state);\n\t\t\t});\n\t\tthis.tasks.set(id, task);\n\t\treturn task;\n\t}\n\n\tprivate async runSummary(state: ActiveSessionState): Promise<void> {\n\t\tconst id = state.activeSessionId;\n\t\tconst session = state.runtime.session;\n\t\tconst sessionManager = session.sessionManager;\n\t\tconst sessionId = sessionManager.getSessionId();\n\t\tconst sessionFile = sessionManager.getSessionFile();\n\t\tconst messages = session.messages;\n\t\tif (messages.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst messageCount = messages.length;\n\t\tconst isWorking = isSessionWorking(state);\n\t\tconst previous = state.summaryState;\n\t\t// Idle sessions with a current verdict need no refresh unless a terminal\n\t\t// error must replace a previously fabricated verdict. Working sessions\n\t\t// always refresh so the recap keeps up with the in-progress turn.\n\t\tconst contentUnchanged = previous?.basedOnMessageCount === messageCount;\n\t\tconst owesIdleVerdict = !isWorking && previous?.taskState === undefined;\n\t\t// A blank recap means the model call hasn't succeeded yet (e.g. the\n\t\t// needs_input fallback fired on a transient failure); keep retrying until a\n\t\t// real summary lands so the recap isn't left permanently empty.\n\t\tconst owesSummary = !isWorking && !previous?.summary;\n\t\tconst turnError = !isWorking ? terminalTurnError(messages) : undefined;\n\t\tconst owesErrorVerdict =\n\t\t\tturnError !== undefined && (previous?.taskState !== \"needs_input\" || previous?.summary !== turnError);\n\t\tif (contentUnchanged && !isWorking && !owesIdleVerdict && !owesSummary && !owesErrorVerdict) {\n\t\t\treturn;\n\t\t}\n\t\t// Include the in-progress message so a long streaming turn gets a live recap.\n\t\tconst streaming = isWorking ? session.state.streamingMessage : undefined;\n\t\tconst contextMessages = streaming ? [...messages, streaming] : messages;\n\n\t\tconst controller = new AbortController();\n\t\tconst isCurrent = () =>\n\t\t\t!controller.signal.aborted &&\n\t\t\tstate.runtime.session === session &&\n\t\t\tsession.sessionManager === sessionManager &&\n\t\t\tsessionManager.getSessionId() === sessionId &&\n\t\t\tsessionManager.getSessionFile() === sessionFile &&\n\t\t\tisSessionWorking(state) === isWorking &&\n\t\t\tsession.messages.length === messageCount;\n\t\tthis.inFlight.set(id, controller);\n\t\tlet requests: InferenceCoordinator | undefined;\n\t\tlet status: AgentStatus | undefined;\n\t\tlet changed = false;\n\t\ttry {\n\t\t\tif (turnError === undefined) requests = this.getRequests?.(session);\n\t\t\tconst generated: AgentStatusResult | undefined =\n\t\t\t\tturnError !== undefined\n\t\t\t\t\t? { summary: turnError, taskState: \"needs_input\" }\n\t\t\t\t\t: await this.generate({\n\t\t\t\t\t\t\tregistry: session.modelRegistry,\n\t\t\t\t\t\t\tmodel: session.model,\n\t\t\t\t\t\t\tmessages: contextMessages,\n\t\t\t\t\t\t\tisWorking,\n\t\t\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\t\t\trequests,\n\t\t\t\t\t\t});\n\t\t\t// An unused capture otherwise counts this idle subject as working.\n\t\t\tawait requests?.dispose();\n\t\t\t// A failed classification on an idle session would spin at \"working\"\n\t\t\t// forever (the activity axis holds unjudged idle sessions there), so\n\t\t\t// settle it to needs_input.\n\t\t\tconst result =\n\t\t\t\tgenerated ??\n\t\t\t\t(!isWorking && (owesIdleVerdict || owesSummary)\n\t\t\t\t\t? { summary: previous?.summary ?? \"\", taskState: \"needs_input\" as const }\n\t\t\t\t\t: undefined);\n\t\t\tif (!result) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Discard if the session closed, was swapped, or moved to a new turn\n\t\t\t// during the async call — never write a verdict for stale state.\n\t\t\tif (!isCurrent()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// A working refresh carries no verdict; keep the prior one at the same\n\t\t\t// message count so a still-valid needs_input isn't dropped.\n\t\t\tconst taskState =\n\t\t\t\tresult.taskState ?? (previous?.basedOnMessageCount === messageCount ? previous?.taskState : undefined);\n\t\t\tstatus = {\n\t\t\t\tsummary: result.summary,\n\t\t\t\ttaskState,\n\t\t\t\tbasedOnMessageCount: messageCount,\n\t\t\t};\n\t\t\t// An idle settle refreshes the verdict's currency, which drives the roster's\n\t\t\t// activity axis: it must publish even when the verdict text is unchanged.\n\t\t\tchanged =\n\t\t\t\tprevious?.summary !== status.summary ||\n\t\t\t\tprevious?.taskState !== status.taskState ||\n\t\t\t\t(!isWorking && previous?.basedOnMessageCount !== status.basedOnMessageCount);\n\t\t\t// Persist only settled idle verdicts, never mid-stream.\n\t\t\tif (!isWorking) {\n\t\t\t\tawait sessionManager.appendAgentStatus(status);\n\t\t\t\tif (!isCurrent()) return;\n\t\t\t}\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tawait requests?.dispose();\n\t\t\t} finally {\n\t\t\t\tthis.inFlight.delete(id);\n\t\t\t}\n\t\t}\n\t\tif (status && isCurrent()) {\n\t\t\tstate.summaryState = status;\n\t\t\tif (changed) this.onStatusChanged?.(state);\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"daemon-session-summarizer.d.ts","sourceRoot":"","sources":["../../../src/modes/daemon/daemon-session-summarizer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@ponythewhite/base-context-agent\";\nimport type { Api, Model } from \"@ponythewhite/base-context-ai\";\nimport { completeInference, type InferenceCoordinator } from \"../../core/inference-coordinator.js\";\nimport type { ModelRegistry } from \"../../core/model-registry.js\";\nimport type { AgentStatus, AgentTaskState } from \"../../core/session-manager.js\";\nimport type { ActiveSessionState } from \"./active-session-state.js\";\n\nconst SWEEP_INTERVAL_MS = 25_000;\n// Collapse a tool-use loop's rapid turn_end bursts into one summarization.\nconst SETTLE_DEBOUNCE_MS = 2_000;\n// Keep rapid tool/stream updates local; periodically refresh the generated recap.\nconst MIN_REFRESH_INTERVAL_MS = 60_000;\n\nconst SUMMARY_CONTEXT_MESSAGES = 8;\nconst SUMMARY_MAX_CHARS_PER_MESSAGE = 600;\n// Generous so a chatty model still closes the tags before truncation.\nconst SUMMARY_MAX_TOKENS = 400;\n\nexport const AGENT_STATUS_SYSTEM_PROMPT = `You generate a status line for an AI coding agent dashboard. You are given the recent conversation between a user and the agent, plus whether the agent is currently working or idle.\n\nOutput ONLY these two tags, nothing before, between, or after. Do not think out loud, explain, or count words.\n<recap>a present-tense clause, at most 12 words, saying what the agent is doing or just did, no trailing period</recap>\n<status>one of NEEDS_INPUT, COMPLETED</status>\n\nSTATUS meaning:\n- COMPLETED: the agent finished its turn AND the user's request is fully done with nothing left.\n- NEEDS_INPUT: the agent finished its turn but the task is not fully done — it asked a question, hit a blocker, or needs more prompting.\nWhen you are unsure between COMPLETED and NEEDS_INPUT, choose NEEDS_INPUT.\n\nExample:\n<recap>Refactoring the auth middleware and updating its tests</recap>\n<status>NEEDS_INPUT</status>`;\n\nexport interface AgentStatusResult {\n\tsummary: string;\n\ttaskState?: AgentTaskState;\n}\n\nfunction messageText(content: unknown): { text: string; tools: string[] } {\n\tif (typeof content === \"string\") {\n\t\treturn { text: content, tools: [] };\n\t}\n\tif (!Array.isArray(content)) {\n\t\treturn { text: \"\", tools: [] };\n\t}\n\tconst parts: string[] = [];\n\tconst tools: string[] = [];\n\tfor (const block of content) {\n\t\tif (typeof block !== \"object\" || block === null) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst type = (block as { type?: unknown }).type;\n\t\tif (type === \"text\" && typeof (block as { text?: unknown }).text === \"string\") {\n\t\t\tparts.push((block as { text: string }).text);\n\t\t} else if (type === \"toolCall\" || type === \"tool_use\" || type === \"toolUse\") {\n\t\t\tconst name = (block as { name?: unknown }).name;\n\t\t\tif (typeof name === \"string\") {\n\t\t\t\ttools.push(name);\n\t\t\t}\n\t\t}\n\t}\n\treturn { text: parts.join(\"\\n\"), tools };\n}\n\nfunction clamp(text: string, max: number): string {\n\tconst normalized = text.replace(/\\s+/g, \" \").trim();\n\treturn normalized.length > max ? `${normalized.slice(0, max)}…` : normalized;\n}\n\n/** Serialize the trailing messages into a compact prompt body (tool calls by name only). */\nexport function buildStatusContext(messages: readonly AgentMessage[], isWorking: boolean): string {\n\tconst recent = messages.slice(-SUMMARY_CONTEXT_MESSAGES);\n\tconst lines: string[] = [];\n\tfor (const message of recent) {\n\t\tconst role = message.role;\n\t\tif (role !== \"user\" && role !== \"assistant\" && role !== \"toolResult\" && role !== \"custom\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst { text, tools } = messageText(message.content);\n\t\tconst body = clamp(text, SUMMARY_MAX_CHARS_PER_MESSAGE);\n\t\tconst toolNote = tools.length > 0 ? `[tools: ${[...new Set(tools)].join(\", \")}]` : \"\";\n\t\tconst rendered = [body, toolNote].filter((part) => part.length > 0).join(\" \");\n\t\tif (rendered) {\n\t\t\tlines.push(`${role}: ${rendered}`);\n\t\t}\n\t}\n\tconst state = isWorking ? \"working\" : \"idle (finished its turn)\";\n\treturn `<agent-state>${state}</agent-state>\\n<conversation>\\n${lines.join(\"\\n\")}\\n</conversation>`;\n}\n\n// Cuts a word-counting trailer the model sometimes appends, e.g.\n// `Sending X. That's 5 words? Count: X(1)... = 6 words.`. Kept to structural\n// counting markers so plain words (\"Waiting for CI\") survive.\nconst REASONING_TRAILER = /\\s*(?:[\"”]\\s*)?(?:\\bthat['’]?s\\s+\\d+\\s*words?\\b|\\bcount\\s*:|\\(\\d+\\)|=\\s*\\d+\\s*words?\\b).*/i;\nconst COUNTING_ARTIFACT = /\\(\\d+\\)|=\\s*\\d+\\s*words?\\b/i;\nconst MAX_RECAP_WORDS = 16;\n\nfunction cleanRecap(raw: string): string | undefined {\n\tconst value = raw\n\t\t.trim()\n\t\t.replace(REASONING_TRAILER, \"\")\n\t\t.replace(/^[\"“']+|[\"”']+$/g, \"\")\n\t\t.replace(/[.\\s]+$/, \"\")\n\t\t.trim();\n\tif (!value || value.startsWith(\"<\") || /present-tense|12 words/i.test(value)) {\n\t\treturn undefined;\n\t}\n\tif (COUNTING_ARTIFACT.test(value) || value.split(/\\s+/).length > MAX_RECAP_WORDS) {\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\n/** Take the content of the last `<recap>` and `<status>` tags; idle verdicts default to needs_input. */\nexport function parseAgentStatusResponse(text: string, isWorking: boolean): AgentStatusResult | undefined {\n\t// Normalize unicode angle-bracket lookalikes (‹ › < >) so a tag written with them still parses.\n\tconst cleaned = text.replace(/[‹<]/g, \"<\").replace(/[›>]/g, \">\");\n\n\tconst recapMatch = [...cleaned.matchAll(/<recap>([\\s\\S]*?)<\\/recap>/gi)].at(-1);\n\tconst summary = recapMatch ? cleanRecap(recapMatch[1]!) : undefined;\n\tif (!summary) {\n\t\treturn undefined;\n\t}\n\tif (isWorking) {\n\t\treturn { summary };\n\t}\n\tconst statusMatch = [...cleaned.matchAll(/<status>\\s*([a-z_]+)\\s*<\\/status>/gi)].at(-1);\n\tconst status = statusMatch ? statusMatch[1]!.toUpperCase() : undefined;\n\tconst taskState: AgentTaskState = status === \"COMPLETED\" ? \"completed\" : \"needs_input\";\n\treturn { summary, taskState };\n}\n\nexport interface GenerateAgentStatusParams {\n\tregistry: ModelRegistry;\n\tmodel?: Model<Api>;\n\tmessages: readonly AgentMessage[];\n\tisWorking: boolean;\n\tsessionId?: string;\n\tsignal?: AbortSignal;\n\trequests?: InferenceCoordinator;\n}\n\n/** Use the session's selected model, or keep the local status when unavailable. */\nexport async function generateAgentStatus(params: GenerateAgentStatusParams): Promise<AgentStatusResult | undefined> {\n\tconst { registry, messages, isWorking, sessionId, signal, requests, model: selectedModel } = params;\n\tif (messages.length === 0) {\n\t\treturn undefined;\n\t}\n\tif (!selectedModel) {\n\t\treturn undefined;\n\t}\n\tconst model = { ...selectedModel, cost: { ...selectedModel.cost } };\n\tconst subject = buildStatusContext(messages, isWorking);\n\tconst timestamp = Date.now();\n\tconst auth = await registry.getApiKeyAndHeaders(model);\n\tif (!auth.ok || !auth.apiKey) {\n\t\treturn undefined;\n\t}\n\ttry {\n\t\tconst response = await completeInference(\n\t\t\trequests,\n\t\t\tmodel,\n\t\t\t{\n\t\t\t\tsystemPrompt: AGENT_STATUS_SYSTEM_PROMPT,\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\trole: \"user\" as const,\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: subject }],\n\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tmaxTokens: SUMMARY_MAX_TOKENS,\n\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\theaders: auth.headers,\n\t\t\t\tsignal,\n\t\t\t\tsessionId: sessionId ? `daemon-status:${sessionId}` : undefined,\n\t\t\t},\n\t\t\t{ purpose: \"native-control\", purposeDetail: \"daemon-status\" },\n\t\t);\n\t\tif (response.stopReason === \"error\") {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst textContent = response.content\n\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t.map((c) => c.text)\n\t\t\t.join(\"\\n\");\n\t\treturn parseAgentStatusResponse(textContent, isWorking);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction isSessionWorking(state: ActiveSessionState): boolean {\n\tconst session = state.runtime.session;\n\treturn session.isSessionActive;\n}\n\n/** Use the last assistant turn's real failure instead of asking a classifier to invent completed work. */\nfunction terminalTurnError(messages: readonly AgentMessage[]): string | undefined {\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst message = messages[i];\n\t\tif (message.role !== \"assistant\") continue;\n\t\tif (message.stopReason !== \"error\") return undefined;\n\t\tconst detail = message.errorMessage?.trim();\n\t\treturn detail ? `Model request failed: ${clamp(detail, 160)}` : \"Model request failed\";\n\t}\n\treturn undefined;\n}\n\n/**\n * Background status summarization for daemon-hosted sessions, top-level and\n * subagents alike. A periodic sweep refreshes working sessions; debounced\n * turn-end activity drives the idle verdict. Status lives in memory; settled\n * idle verdicts are persisted.\n */\nexport class DaemonSessionSummarizer {\n\tprivate interval: ReturnType<typeof setInterval> | undefined;\n\tprivate readonly debounceTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\t// Controller per in-flight summary so a closing session can abort its write.\n\tprivate readonly inFlight = new Map<string, AbortController>();\n\tprivate readonly refreshes = new Map<\n\t\tstring,\n\t\t{ isCurrentSource: () => boolean; input?: string; attemptedAt?: number; wasWorking?: boolean }\n\t>();\n\tprivate readonly tasks = new Map<string, Promise<void>>();\n\tprivate readonly forgotten = new Set<string>();\n\tprivate stopped = false;\n\t// Sessions requested while one was running; get one more pass on completion.\n\tprivate readonly rerunRequested = new Set<string>();\n\n\tconstructor(\n\t\tprivate readonly listSessions: () => readonly ActiveSessionState[],\n\t\tprivate readonly onStatusChanged?: (state: ActiveSessionState) => void,\n\t\t// Injectable for tests.\n\t\tprivate readonly generate: (\n\t\t\tparams: GenerateAgentStatusParams,\n\t\t) => Promise<AgentStatusResult | undefined> = generateAgentStatus,\n\t\tprivate readonly getRequests?: (session: ActiveSessionState[\"runtime\"][\"session\"]) => InferenceCoordinator,\n\t\tprivate readonly onError: (state: ActiveSessionState, error: unknown) => void = (_state, error) =>\n\t\t\tconsole.error(error),\n\t) {}\n\n\tstart(): void {\n\t\tif (this.interval) {\n\t\t\treturn;\n\t\t}\n\t\tthis.stopped = false;\n\t\tthis.interval = setInterval(() => {\n\t\t\tfor (const state of this.listSessions()) {\n\t\t\t\tthis.summarize(state);\n\t\t\t}\n\t\t}, SWEEP_INTERVAL_MS);\n\t\tthis.interval.unref?.();\n\t}\n\n\tasync stop(): Promise<void> {\n\t\tthis.stopped = true;\n\t\tif (this.interval) {\n\t\t\tclearInterval(this.interval);\n\t\t\tthis.interval = undefined;\n\t\t}\n\t\tfor (const timer of this.debounceTimers.values()) {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t\tthis.debounceTimers.clear();\n\t\tfor (const controller of this.inFlight.values()) {\n\t\t\tcontroller.abort();\n\t\t}\n\t\tthis.rerunRequested.clear();\n\t\tawait Promise.all(this.tasks.values());\n\t}\n\n\t/** Cancel new work and drain any admitted status write before closing. */\n\tasync forget(activeSessionId: string): Promise<void> {\n\t\tthis.forgotten.add(activeSessionId);\n\t\tconst timer = this.debounceTimers.get(activeSessionId);\n\t\tif (timer) {\n\t\t\tclearTimeout(timer);\n\t\t\tthis.debounceTimers.delete(activeSessionId);\n\t\t}\n\t\tthis.inFlight.get(activeSessionId)?.abort();\n\t\tthis.refreshes.delete(activeSessionId);\n\t\tthis.rerunRequested.delete(activeSessionId);\n\t\tawait this.tasks.get(activeSessionId);\n\t}\n\n\t/** Seed in-memory status from the persisted entry when a session is added. */\n\tseed(state: ActiveSessionState): void {\n\t\tthis.forgotten.delete(state.activeSessionId);\n\t\tif (state.summaryState) {\n\t\t\treturn;\n\t\t}\n\t\tconst persisted = state.runtime.session.sessionManager.getLatestAgentStatus();\n\t\tif (persisted) {\n\t\t\tstate.summaryState = persisted;\n\t\t}\n\t}\n\n\t/** Called when a session finishes a turn; debounce until the agent settles. */\n\tnotifyActivity(state: ActiveSessionState): void {\n\t\tthis.schedule(state, SETTLE_DEBOUNCE_MS);\n\t}\n\n\tprivate schedule(state: ActiveSessionState, delay: number): void {\n\t\tconst id = state.activeSessionId;\n\t\tif (this.stopped || this.forgotten.has(id)) return;\n\t\tconst existing = this.debounceTimers.get(id);\n\t\tif (existing) {\n\t\t\tclearTimeout(existing);\n\t\t}\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis.debounceTimers.delete(id);\n\t\t\tthis.summarize(state);\n\t\t}, delay);\n\t\ttimer.unref?.();\n\t\tthis.debounceTimers.set(id, timer);\n\t}\n\n\tprivate summarize(state: ActiveSessionState): Promise<void> {\n\t\tconst id = state.activeSessionId;\n\t\tif (this.stopped || this.forgotten.has(id)) return Promise.resolve();\n\t\tconst existing = this.tasks.get(id);\n\t\tif (existing) {\n\t\t\tthis.rerunRequested.add(id);\n\t\t\treturn existing;\n\t\t}\n\t\tconst task = this.runSummary(state)\n\t\t\t.catch((error) => this.onError(state, error))\n\t\t\t.finally(() => {\n\t\t\t\tthis.tasks.delete(id);\n\t\t\t\tif (this.rerunRequested.delete(id)) this.notifyActivity(state);\n\t\t\t});\n\t\tthis.tasks.set(id, task);\n\t\treturn task;\n\t}\n\n\tprivate async runSummary(state: ActiveSessionState): Promise<void> {\n\t\tconst id = state.activeSessionId;\n\t\tconst session = state.runtime.session;\n\t\tconst sessionManager = session.sessionManager;\n\t\tconst sessionId = sessionManager.getSessionId();\n\t\tconst sessionFile = sessionManager.getSessionFile();\n\t\tconst messages = session.messages;\n\t\tif (messages.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst messageCount = messages.length;\n\t\tconst isWorking = isSessionWorking(state);\n\t\tconst previous = state.summaryState;\n\t\tconst owesIdleVerdict = !isWorking && previous?.taskState === undefined;\n\t\tconst owesSummary = !isWorking && !previous?.summary;\n\t\tconst turnError = !isWorking ? terminalTurnError(messages) : undefined;\n\t\t// Compare exactly what the classifier sees, not message counts or hidden\n\t\t// thinking/tool output beyond the bounded prompt.\n\t\tconst contextMessages = () => {\n\t\t\tconst streaming = isWorking ? session.state.streamingMessage : undefined;\n\t\t\treturn streaming ? [...session.messages, streaming] : session.messages;\n\t\t};\n\t\tconst input = buildStatusContext(contextMessages(), isWorking);\n\t\tconst model = session.model;\n\t\tconst isCurrentSource = () =>\n\t\t\tstate.runtime.session === session &&\n\t\t\tsession.sessionManager === sessionManager &&\n\t\t\tsessionManager.getSessionId() === sessionId &&\n\t\t\tsessionManager.getSessionFile() === sessionFile &&\n\t\t\tsession.model === model;\n\t\tlet refresh = this.refreshes.get(id);\n\t\tif (!refresh?.isCurrentSource()) {\n\t\t\trefresh = { isCurrentSource };\n\t\t\tthis.refreshes.set(id, refresh);\n\t\t}\n\t\tconst finalTransition = !isWorking && refresh.wasWorking === true;\n\t\trefresh.wasWorking = isWorking;\n\t\tconst reuse = turnError === undefined && refresh.input === input && previous?.summary ? previous : undefined;\n\t\tif (\n\t\t\t(reuse ||\n\t\t\t\t(turnError !== undefined && previous?.summary === turnError && previous.taskState === \"needs_input\")) &&\n\t\t\tprevious?.basedOnMessageCount === messageCount\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (!reuse && turnError === undefined) {\n\t\t\t// A final working -> idle verdict must not wait behind the live recap.\n\t\t\tconst remaining = MIN_REFRESH_INTERVAL_MS - (Date.now() - (refresh.attemptedAt ?? -Infinity));\n\t\t\tif (!finalTransition && remaining > 0) {\n\t\t\t\tthis.schedule(state, remaining);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\trefresh.attemptedAt = Date.now();\n\t\t}\n\n\t\tconst controller = new AbortController();\n\t\tconst isCurrent = () =>\n\t\t\t!controller.signal.aborted &&\n\t\t\tisCurrentSource() &&\n\t\t\tisSessionWorking(state) === isWorking &&\n\t\t\tsession.messages.length === messageCount &&\n\t\t\tbuildStatusContext(contextMessages(), isWorking) === input &&\n\t\t\t(isWorking || terminalTurnError(session.messages) === turnError);\n\t\tthis.inFlight.set(id, controller);\n\t\tlet requests: InferenceCoordinator | undefined;\n\t\tlet status: AgentStatus | undefined;\n\t\tlet completedInput: string | undefined;\n\t\tlet changed = false;\n\t\ttry {\n\t\t\tif (!reuse && turnError === undefined) requests = this.getRequests?.(session);\n\t\t\tconst generated: AgentStatusResult | undefined =\n\t\t\t\treuse ??\n\t\t\t\t(turnError !== undefined\n\t\t\t\t\t? { summary: turnError, taskState: \"needs_input\" }\n\t\t\t\t\t: await this.generate({\n\t\t\t\t\t\t\tregistry: session.modelRegistry,\n\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\tmessages: contextMessages(),\n\t\t\t\t\t\t\tisWorking,\n\t\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\t\t\trequests,\n\t\t\t\t\t\t}));\n\t\t\t// An unused capture otherwise counts this idle subject as working.\n\t\t\tawait requests?.dispose();\n\t\t\t// A failed classification on an idle session would spin at \"working\"\n\t\t\t// forever (the activity axis holds unjudged idle sessions there), so\n\t\t\t// settle it to needs_input.\n\t\t\tconst result =\n\t\t\t\tgenerated ??\n\t\t\t\t(!isWorking && (owesIdleVerdict || owesSummary)\n\t\t\t\t\t? { summary: previous?.summary ?? \"\", taskState: \"needs_input\" as const }\n\t\t\t\t\t: undefined);\n\t\t\tif (!result) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Discard if the session closed, was swapped, or moved to a new turn\n\t\t\t// during the async call — never write a verdict for stale state.\n\t\t\tif (!isCurrent()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (generated && turnError === undefined) completedInput = input;\n\t\t\t// A working refresh carries no verdict; keep the prior one at the same\n\t\t\t// message count so a still-valid needs_input isn't dropped.\n\t\t\tconst taskState =\n\t\t\t\tresult.taskState ?? (previous?.basedOnMessageCount === messageCount ? previous?.taskState : undefined);\n\t\t\tstatus = {\n\t\t\t\tsummary: result.summary,\n\t\t\t\ttaskState,\n\t\t\t\tbasedOnMessageCount: messageCount,\n\t\t\t};\n\t\t\t// An idle settle refreshes the verdict's currency, which drives the roster's\n\t\t\t// activity axis: it must publish even when the verdict text is unchanged.\n\t\t\tchanged =\n\t\t\t\tprevious?.summary !== status.summary ||\n\t\t\t\tprevious?.taskState !== status.taskState ||\n\t\t\t\t(!isWorking && previous?.basedOnMessageCount !== status.basedOnMessageCount);\n\t\t\t// Persist only settled idle verdicts, never mid-stream.\n\t\t\tif (!isWorking) {\n\t\t\t\tawait sessionManager.appendAgentStatus(status);\n\t\t\t\tif (!isCurrent()) return;\n\t\t\t}\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tawait requests?.dispose();\n\t\t\t} finally {\n\t\t\t\tthis.inFlight.delete(id);\n\t\t\t}\n\t\t}\n\t\tif (status && isCurrent()) {\n\t\t\trefresh.input = completedInput;\n\t\t\tstate.summaryState = status;\n\t\t\tif (changed) this.onStatusChanged?.(state);\n\t\t}\n\t}\n}\n"]}
|