@roll-agent/runtime 0.12.0 → 0.14.0

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.
Files changed (36) hide show
  1. package/README.md +47 -0
  2. package/dist/engine/agent-session.d.ts +11 -0
  3. package/dist/engine/agent-session.js +1 -1
  4. package/dist/engine/capability-manifest.d.ts +1 -0
  5. package/dist/engine/capability-manifest.js +1 -1
  6. package/dist/engine/compaction-checkpoint.d.ts +136 -136
  7. package/dist/engine/compaction-semantic-state.d.ts +102 -102
  8. package/dist/engine/system-prompt.d.ts +1 -0
  9. package/dist/engine/system-prompt.js +1 -1
  10. package/dist/interaction/user-input-interaction-manager.d.ts +28 -0
  11. package/dist/interaction/user-input-interaction-manager.js +1 -0
  12. package/dist/server/protocol.d.ts +2 -2
  13. package/dist/server/runtime-client-interaction-lifecycle.d.ts +88 -0
  14. package/dist/server/runtime-client-interaction-lifecycle.js +1 -0
  15. package/dist/server/runtime-client-request-coordinator.d.ts +37 -8
  16. package/dist/server/runtime-client-request-coordinator.js +1 -1
  17. package/dist/server/runtime-protocol-adapter.d.ts +24 -3
  18. package/dist/server/runtime-protocol-adapter.js +1 -1
  19. package/dist/server/runtime-server.d.ts +1 -0
  20. package/dist/server/runtime-server.js +1 -1
  21. package/dist/service/runtime-service.d.ts +43 -7
  22. package/dist/service/runtime-service.js +1 -1
  23. package/dist/store/thread-store.d.ts +42 -0
  24. package/dist/store/thread-store.js +1 -1
  25. package/dist/tool-bridge/bash-tool.d.ts +3 -0
  26. package/dist/tool-bridge/bash-tool.js +1 -1
  27. package/dist/tool-bridge/build-tools.d.ts +8 -1
  28. package/dist/tool-bridge/build-tools.js +1 -1
  29. package/dist/tool-bridge/session-exec-tool.d.ts +3 -0
  30. package/dist/tool-bridge/session-exec-tool.js +1 -1
  31. package/dist/tool-bridge/shell-explanation.d.ts +2 -0
  32. package/dist/tool-bridge/shell-explanation.js +1 -0
  33. package/dist/tool-bridge/user-input-tool.d.ts +16 -0
  34. package/dist/tool-bridge/user-input-tool.js +1 -0
  35. package/dist/types/events.d.ts +17 -0
  36. package/package.json +3 -3
package/README.md ADDED
@@ -0,0 +1,47 @@
1
+ # `@roll-agent/runtime`
2
+
3
+ `@roll-agent/runtime` 实现 Roll Runtime 的 Thread、Turn、Interaction、事件投影和持久存储。
4
+ 第三方宿主应通过 `@roll-agent/client-node` 或版本化 Runtime Protocol 接入,不应直接依赖
5
+ `RuntimeService`、`ThreadStore` 等内部类。
6
+
7
+ ## 协议版本
8
+
9
+ 当前支持 Runtime Protocol `1.3`、`1.2`、`1.1`、`1.0`。1.3 在 1.2 typed Interaction
10
+ 与 capability handshake 基础上增加 durable event 恢复;旧版本继续使用 Snapshot 收敛。
11
+
12
+ | 1.3 event | allowlist | 恢复 |
13
+ |---|---|---|
14
+ | durable | Turn 状态、完整消息、安全 Tool 完成投影、安全 Approval 状态、capability 变更 | 先事务提交后发布;携带 `eventId` 与不透明 Thread `cursor` |
15
+ | ephemeral | message/reasoning/tool-output delta 与开始态 | 仅进程内 `sequence`,不持久、不重放 |
16
+
17
+ 1.3 Snapshot 包含可空 `eventCursor`。Client 使用
18
+ `runtime.events.resume({ threadId, afterCursor })` 后,Runtime 先逐条发送 replay
19
+ notification,再返回 `{ throughCursor, replayedCount }`;该 Response 是 replay→live
20
+ barrier。Client 必须暂存并发 live durable event,收到 Response 后按 cursor 排序、按
21
+ eventId 去重再交付。
22
+
23
+ 每个 Thread 的事件日志最多保留 10,000 条、16 MiB、30 天,只裁剪最老连续前缀。
24
+ `afterCursor: null` 固定表示原始日志起点;若该起点已被裁剪,Runtime 返回
25
+ `EVENT_CURSOR_EXPIRED`,不会从当前最早保留事件静默续传。
26
+ `EVENT_CURSOR_EXPIRED`、`EVENT_CURSOR_GAP`、Runtime 重启或 Client 检测到 stream gap 时,
27
+ 回退 `thread.snapshot({ threadId, limit: 1, recovery: true })`。该 1.3 响应携带
28
+ `recoveryProjection: true`,保留 checkpoint/active Turn 元数据并清空 timeline 与 pending
29
+ arrays,从而保证单帧可承载;完整 timeline 由普通 Snapshot 分页补载,未决 Interaction 以
30
+ 当前连接的 Server Request 为权威。Replay 使用无副作用路径,不会重新触发 Approval、
31
+ User Input、Tool、Turn 或其他执行。
32
+
33
+ ## 边界
34
+
35
+ - Runtime event cursor 按 Thread 标识 durable 日志;Relay `relaySequence`/ACK 按 Workspace
36
+ 标识安全投影投递。两者类型和生命周期不同,不能相互确认或推导。
37
+ - #176 不修改 Relay Wire,也不提供持久 Relay outbox、Interaction WAL 或 Server Request
38
+ replay。断线仍会取消未决 Approval/User Input handler。
39
+ - `authentication.request` 与 File Picker 没有远程 projector,保持 local-only;未来远程
40
+ 启用必须先完成安全 RFC #186。
41
+
42
+ 完整契约见:
43
+
44
+ - [Runtime Protocol v1 参考](../../docs/runtime-protocol-v1-reference.md)
45
+ - [`@roll-agent/client-node` API 参考](../../docs/client-node-reference.md)
46
+ - [Runtime Protocol 架构与边界](../../docs/runtime-protocol-architecture.md)
47
+ - [Relay 1.1/1.0 参考](../../docs/companion-relay-v1-reference.md)
@@ -1,5 +1,6 @@
1
1
  import { type ModelMessage } from "ai";
2
2
  import type { LanguageModelV4, LanguageModelV4CallOptions, SharedV4ProviderOptions } from "@ai-sdk/provider";
3
+ import type { UserInputResult } from "@roll-agent/protocol";
3
4
  import type { SkillLibrary, SkillSummary } from "@roll-agent/core/skills/library";
4
5
  import type { ContextCompactionReason, ContextCompactionStrategy, SessionEvent, SessionTokenUsage } from "../types/events.ts";
5
6
  import type { ToolPolicy } from "../types/policy.ts";
@@ -13,6 +14,7 @@ import type { CommitCompactionInput, ListToolExecutionsOptions, ListTranscriptMe
13
14
  import { type CapabilityAgentOnboardingCatalogEntry, type CapabilityExternalDynamicContext, type CapabilityHostMode, type EffectiveCapabilityTurnContext, type EffectiveCapabilityManifest } from "./capability-manifest.ts";
14
15
  import { type ArchivedTranscriptMessage, type CompactionCheckpoint } from "./compaction-checkpoint.ts";
15
16
  import { type TranscriptReader } from "../tool-bridge/transcript-tool.ts";
17
+ import { type SessionUserInputRequestId } from "../interaction/user-input-interaction-manager.ts";
16
18
  export interface SessionCompactionSettings {
17
19
  readonly enabled: boolean;
18
20
  readonly strategy: ContextCompactionStrategy;
@@ -138,9 +140,13 @@ export declare class AgentSession {
138
140
  private skillToolBuilt;
139
141
  private readonly toolSourceAgentNames;
140
142
  private readonly gate;
143
+ private readonly userInputInteractions;
141
144
  private readonly toolCoordinator;
142
145
  private tools;
143
146
  private readonly registry;
147
+ private readonly userInputToolId;
148
+ private readonly userInputTool;
149
+ private userInputAvailable;
144
150
  private readonly sessionManager;
145
151
  private readonly sessionManagerInstanceId;
146
152
  private compactionCheckpoint;
@@ -155,6 +161,10 @@ export declare class AgentSession {
155
161
  private compileCapabilityManifest;
156
162
  private compileSystemPrompt;
157
163
  private refreshCapabilityManifest;
164
+ setUserInputAvailable(available: boolean): void;
165
+ resolveUserInput(requestId: SessionUserInputRequestId, result: UserInputResult): boolean;
166
+ cancelUserInput(requestId: SessionUserInputRequestId, reason?: string): boolean;
167
+ private requestUserInput;
158
168
  private trackPendingToolCall;
159
169
  private buildSkillTools;
160
170
  applyAgentRefresh(refresh: SessionAgentRefresh): void;
@@ -166,6 +176,7 @@ export declare class AgentSession {
166
176
  private persistToolExecution;
167
177
  private rememberCompactionResources;
168
178
  private retainCompactionResource;
179
+ private interactionDeadlineMs;
169
180
  private requestApproval;
170
181
  approve(approvalId: string): boolean;
171
182
  reject(approvalId: string, reason?: string): boolean;
@@ -1 +1 @@
1
- import{createHash as e,randomUUID as t}from"node:crypto";import{waitForPromiseSettlement as s}from"../bounded-wait.js";import{stepCountIs as o,streamText as i,InvalidToolInputError as n}from"ai";import{buildAgentToolset as a}from"../tool-bridge/build-tools.js";import{buildAgentInstallToolset as r}from"../tool-bridge/agent-install-tool.js";import{buildSkillToolset as c}from"../tool-bridge/skill-tool.js";import{buildBashToolset as l}from"../tool-bridge/bash-tool.js";import{EXEC_COMMAND_NAME as u,EXEC_LIST_NAME as p,EXEC_POLL_NAME as h,buildSessionExecToolset as d}from"../tool-bridge/session-exec-tool.js";import{SessionManager as m}from"../bash/session/session-manager.js";import{isTerminalSessionState as g}from"../bash/session/types.js";import{withCleanEnv as v}from"../bash/clean-env.js";import{RUNTIME_CANCELLATION_ABORT_REASON as f,SESSION_CANCELLATION_REASONS as y,TURN_TIMEOUT_ABORT_REASON as C,USER_CANCELLATION_ABORT_REASON as b,createTurnCancellationMessage as k,isTurnTimeoutAbortReason as T,stripTurnCancellationMetadata as S}from"../types/cancellation.js";import{ToolRegistry as x}from"../tool-bridge/naming.js";import{TOOL_CANCELLATION_EXECUTION_STATES as I,TOOL_OUTCOME_KINDS as E,createToolResult as M,failedToolResult as w,isNormalizedToolResult as R,normalizeToolResult as q,readDisplayOutput as P,readToolOutcome as A}from"../tool-bridge/normalize-result.js";import{createToolExecutionRecord as N,prepareToolExecutionRecordForPersistence as O,redactSecretText as $,toRedactedToolExecutionRecordSummary as j}from"../tool-bridge/tool-execution-record.js";import{TOOL_RESOURCE_ACCESS_MODES as W,ToolExecutionCoordinator as D}from"../tool-bridge/tool-execution-coordinator.js";import{ApprovalGate as L}from"../approval/approval-gate.js";import{COMPACTION_DRAFT_FALLBACK_REASONS as F,compactMessages as V,CompactionDraftFallbackError as U,isCompactionSummaryAcknowledgement as _,readCompactionSummaryPayload as z}from"./compactor.js";import{AsyncEventQueue as G}from"./event-queue.js";import{applyExplicitSkillContext as J,attachExplicitSkillCheckpoint as B,prepareExplicitSkillContext as H,readExplicitSkillCheckpoint as Y,stripExplicitSkillCheckpoints as K}from"./explicit-skill-context.js";import{createCancelledTurnRecoveryMessage as Q,materializeCancelledTurnRecoveryMessages as X,stripCancelledTurnRecoveryMessages as Z}from"./cancelled-turn-recovery.js";import{CAPABILITY_HOST_MODES as ee,CAPABILITY_TOOL_ROLES as te,buildEffectiveCapabilityTurnContext as se,buildEffectiveCapabilityManifest as oe,findCapabilityToolId as ie}from"./capability-manifest.js";import{buildCapabilityTurnReminder as ne,buildChatSystemPromptFromManifest as ae}from"./system-prompt.js";import{buildCompactionCheckpointReminder as re,buildCompactionToolState as ce,COMPACTION_CHECKPOINT_VERSION as le,createCompactionCheckpoint as ue,createCompactionSummary as pe,createCheckpointSemanticReminderProjection as he,findLatestRealUserGoal as de,resolveActiveCompactionConstraints as me,TRANSCRIPT_MESSAGE_PROVENANCES as ge}from"./compaction-checkpoint.js";import{buildCompactionSemanticModelContext as ve,buildCompactionSemanticEvidenceRegistry as fe,mergeCompactionSemanticState as ye,replaceCompactionSemanticConstraints as Ce,replaceCompactionSemanticGoal as be,renderCompactionSemanticSummary as ke,seedCompactionSemanticConstraints as Te,seedLegacyCompactionSnapshotUncertainties as Se,validateCompactionModelDraft as xe}from"./compaction-semantic-state.js";import{ACTIVE_TOOL_PROTOCOL_REPAIR_STATUS as Ie,repairActiveToolProtocol as Ee}from"./tool-protocol-repair.js";import{buildTranscriptToolset as Me}from"../tool-bridge/transcript-tool.js";const we=6e3,Re=1,qe=1024,Pe="AI_InvalidToolInputError:",Ae={startsNewGoalScope:!1,goal:null,constraints:[],decisions:[],completedWork:[],pendingWork:[],resources:[],runningSessions:[],uncertainties:[],resolutions:[],evidenceReviews:[]};function Ne(t){const s=[...t];if(s.length<=qe)return t;const o=`…#${e("sha256").update(t).digest("hex").slice(0,16)}`;return`${s.slice(0,qe-[...o].length).join("")}${o}`}function Oe(){return{abortController:new AbortController,execSessionIds:new Set,pendingToolCalls:new Map,completedStepResponses:new Map,toolExecutions:[],hadPotentialSideEffects:!1,aborted:!1,cancellationEventEmitted:!1,cancellationPersistenceAttempted:!1,cancellationPersisted:!1}}function $e(e,t){e.completedStepResponses.set(`${t.callId}:${String(t.stepNumber)}`,[...t.response.messages])}function je(e){return[...e.completedStepResponses.values()].flatMap(e=>[...e])}function We(e){return e instanceof Error?e.message:String(e)}function De(e){const t=Y(e.message),[s]=K([e.message]),o=s??e.message,i=void 0!==t&&"user"===o.role?t.snapshot.userPrompt:"string"==typeof o.content?o.content:JSON.stringify(o.content);return`message ${String(e.sequence)} ${o.role}: ${i}`}function Le(e){return JSON.stringify(e)??String(e)}function Fe(e){const t=O(e);return{id:e.id,agentName:e.agentName,toolName:e.toolName,inputSummary:Le(t.input.value),resultSummary:Le(t.model),outcome:{kind:e.outcome.kind,...e.outcome.kind===E.cancelled&&void 0!==e.outcome.executionState?{executionState:e.outcome.executionState}:{}}}}function Ve(e){return"user"===e.role&&"string"==typeof e.content&&void 0!==z(e.content)||"assistant"===e.role&&_(e.content)}function Ue(e,t){const s=t.flatMap((e,t)=>{if("user"===e.role&&"string"==typeof e.content){const t=z(e.content);if(void 0!==t)return 0===t.length?[]:[$(t)]}return"assistant"===e.role&&_(e.content)?[]:[$(De({sequence:t,provenance:ge[1],createdAt:new Date(0).toISOString(),message:e}))]});return{checkpointId:e,messageFingerprints:t.map(e=>JSON.stringify(e)),fragments:s,removableRawMessageCount:t.filter(e=>!Ve(e)).length}}function _e(e,t,s){return!(1!==t?.version||t.id!==e.checkpointId||s.length<e.messageFingerprints.length)&&e.messageFingerprints.every((e,t)=>JSON.stringify(s[t])===e)}function ze(e){return void 0===e?{messagesThroughSequence:-1,toolExecutionsThroughSequence:-1}:e.version===le?e.semanticEvidence:{messagesThroughSequence:e.transcript.messages.throughSequence,toolExecutionsThroughSequence:e.transcript.toolExecutions.throughSequence}}function Ge(e,t){return t.aborted?Promise.reject(t.reason):new Promise((s,o)=>{let i=!1;const n=e=>{i||(i=!0,t.removeEventListener("abort",a),e())},a=()=>n(()=>o(t.reason));t.addEventListener("abort",a,{once:!0}),Promise.resolve(e).then(e=>n(()=>s(e)),e=>n(()=>o(e)))})}function Je(e){return We(P(e))}function Be(e){return n.isInstance(e)||"string"==typeof e&&e.startsWith(Pe)?E.invalidInput:E.toolFailed}function He(){return({steps:e})=>e.at(-1)?.toolResults.some(e=>A(e.output).kind===E.userRejected)??!1}function Ye(e){return/context[_ -]?length|context window|maximum context|token limit|too many tokens|prompt is too long|input is too long/i.test(We(e))}function Ke(e){const t=e.inputTokenDetails?.cacheReadTokens,s=e.inputTokenDetails?.cacheWriteTokens,o=e.outputTokenDetails?.reasoningTokens;return{...void 0!==e.inputTokens?{inputTokens:e.inputTokens}:{},...void 0!==e.outputTokens?{outputTokens:e.outputTokens}:{},...void 0!==e.totalTokens?{totalTokens:e.totalTokens}:{},...void 0!==t?{cachedInputTokens:t}:{},...void 0!==s?{cacheWriteTokens:s}:{},...void 0!==o?{reasoningTokens:o}:{}}}function Qe(e,t){return void 0===e&&void 0===t?void 0:(e??0)+(t??0)}function Xe(e,t){const s=Qe(e.cachedInputTokens,t.cachedInputTokens),o=Qe(e.cacheWriteTokens,t.cacheWriteTokens),i=Qe(e.reasoningTokens,t.reasoningTokens);return{inputTokens:(e.inputTokens??0)+(t.inputTokens??0),outputTokens:(e.outputTokens??0)+(t.outputTokens??0),totalTokens:(e.totalTokens??0)+(t.totalTokens??0),...void 0!==s?{cachedInputTokens:s}:{},...void 0!==o?{cacheWriteTokens:o}:{},...void 0!==i?{reasoningTokens:i}:{}}}function Ze(e,t){return void 0===t?e:void 0===e?t:Math.max(e,t)}function et(e,t){const s=e.trim(),o=t.trim();return s.length>0&&o.length>0&&o.startsWith(s)}function tt(e,t){return void 0!==e?e:T(t)?y.timeout:y.runtime}function st(e){return e.flatMap(e=>{if("assistant"!==e.role||!Array.isArray(e.content))return[e];const t=e.content.filter(e=>"reasoning"!==e.type);return 0===t.length?[]:t.length===e.content.length?[e]:[{...e,content:t}]})}function ot(e,t,s){for(const o of Object.keys(t))e[o]=s}function it(e,t,s){const o={[u]:te.sessionCommand,[h]:te.sessionPoll,[p]:te.sessionList};for(const i of Object.keys(t)){const t=s.resolve(i),n=t?o[t.toolName]:void 0;n&&(e[i]=n)}}function nt(e,t){const s=[...e];for(let e=s.length-1;e>=0;e-=1){const o=s[e];if("user"===o?.role){s[e]={...o,content:"string"==typeof o.content?`${t}\n\n${o.content}`:[{type:"text",text:t},...o.content]};break}}return s}export class AgentSession{id;model;maxSteps;messages;onPersist;onReplace;onToolExecution;listPersistedToolExecutions;getPersistedToolExecution;listPersistedTranscriptMessages;commitPersistedCompaction;inMemoryToolExecutions=[];inMemoryTranscript=[];legacyV1ActiveSnapshot;compactionResources=new Map;contextWindow;compaction;turnTimeoutMs;onClose;providerOptions;structuredOutputProviderOptions;structuredOutputReasoning;onProviderOptionsChange;debugEvents;policy;systemPrompt;explicitSystemPrompt;capabilityContext;resolveDynamicCapabilityContext;capabilityManifest;lastCapabilityTurnContext;toolRoles;skillSummaries;skillLibrary;skillToolBuilt=!1;toolSourceAgentNames;gate=new L;toolCoordinator=new D;tools;registry;sessionManager;sessionManagerInstanceId=t();compactionCheckpoint;emit;activeTurn;closePromise;closed=!1;sessionUsage={inputTokens:0,outputTokens:0,totalTokens:0};lastInputTokens;needsCompaction=!1;constructor(e){this.id=e.id,this.model=e.model,this.maxSteps=e.maxSteps;const t=e.initialMessages?st(e.initialMessages):[];this.messages=[...Ee(t).messages],this.legacyV1ActiveSnapshot=1===e.initialCheckpoint?.version?Ue(e.initialCheckpoint.id,this.messages):void 0,this.onPersist=e.onPersist,this.onReplace=e.onReplace,this.onToolExecution=e.onToolExecution,this.listPersistedToolExecutions=e.listToolExecutions,this.getPersistedToolExecution=e.getToolExecution,this.listPersistedTranscriptMessages=e.listTranscriptMessages,this.commitPersistedCompaction=e.commitCompaction,this.compactionCheckpoint=e.initialCheckpoint;let s=ze(e.initialCheckpoint).messagesThroughSequence+1;for(const e of this.messages)Ve(e)||(this.inMemoryTranscript.push({sequence:s,provenance:ge[0],createdAt:new Date(0).toISOString(),message:e}),s+=1);for(const t of e.initialCheckpoint?.resources??[])this.retainCompactionResource(t);this.contextWindow=e.contextWindow,this.compaction=e.compaction,this.turnTimeoutMs=e.turnTimeoutMs,this.onClose=e.onClose,this.providerOptions=e.providerOptions,this.structuredOutputProviderOptions=e.structuredOutputProviderOptions,this.structuredOutputReasoning=e.structuredOutputReasoning,this.onProviderOptionsChange=e.onProviderOptionsChange,this.debugEvents=e.debugEvents??!1,this.policy=e.policy,this.explicitSystemPrompt=e.systemPrompt,this.resolveDynamicCapabilityContext=e.resolveDynamicCapabilityContext,this.skillLibrary=e.skillLibrary,this.skillSummaries=e.skillLibrary?.list()??[],this.toolSourceAgentNames=new Set(e.sources.map(e=>e.agentName));const o=new x,i={},n=e.readCheckpointTranscript?Me(e.readCheckpointTranscript,o,this.toolCoordinator,`thread:${this.id}:transcript`):{};ot(i,n,te.transcriptRead);const c=e.skillLibrary?this.buildSkillTools(o):{};ot(i,c,te.skill);const u={...e.policy?{policy:e.policy}:{},requestApproval:e=>this.requestApproval(e),emitEvent:e=>this.emit?.(e),coordinator:this.toolCoordinator},p=e.bashClassifier?{classifier:e.bashClassifier}:{},h=e.bash?l(e.bash,o,u,p):{};ot(i,h,te.shell),e.bashSession&&(this.sessionManager=new m({maxSessions:e.bashSession.maxSessions,profile:e.bashSession.profile,env:v(e.bashSession.env??process.env),bufferCapacity:e.bashSession.bufferCapacity}));const g=e.bashSession&&this.sessionManager?d({workdir:e.bashSession.workdir,defaultYieldMs:e.bashSession.defaultYieldMs,maxOutputTokens:e.bashSession.maxOutputTokens,...e.bashSession.env?{env:e.bashSession.env}:{}},this.sessionManager,o,u,{...p,onSessionTouched:e=>this.activeTurn?.execSessionIds.add(e)}):{};it(i,g,o);const f=e.agentInstall,y=f?r({catalog:f.catalog,install:async(e,t)=>{const s=await f.install(e,t);return s.outcome.ok&&s.refresh?(this.applyAgentRefresh(s.refresh),{...s.outcome,refreshApplied:!0}):s.outcome}},o,{...e.policy?{policy:e.policy}:{},requestApproval:e=>this.requestApproval(e),coordinator:this.toolCoordinator}):{};ot(i,y,te.agentInstall);const C=a(e.sources,{...e.policy?{policy:e.policy}:{},requestApproval:e=>this.requestApproval(e),coordinator:this.toolCoordinator},o);ot(i,C.tools,te.agent),this.tools={...n,...c,...h,...g,...y,...C.tools},this.registry=C.registry,this.toolRoles=i,this.capabilityContext=e.capabilityContext??{profile:e.bash?.profile.toolName??"no-shell",cwd:e.bash?.workdir??process.cwd(),platform:process.platform,...e.bash?{shellHints:e.bash.profile.systemPromptHints()}:{},agentCount:e.sources.length,...e.agentInstall?{agentOnboardingCatalog:e.agentInstall.catalog}:{}},this.capabilityManifest=this.compileCapabilityManifest(),this.systemPrompt=this.compileSystemPrompt(this.explicitSystemPrompt)}compileCapabilityManifest(){return oe({tools:this.tools,toolRoles:this.toolRoles,resolveRoute:e=>this.registry.resolve(e),skills:this.skillSummaries,profile:this.capabilityContext.profile,hostMode:this.capabilityContext.hostMode??ee.embedded,cwd:this.capabilityContext.cwd,platform:this.capabilityContext.platform??process.platform,shellHints:this.capabilityContext.shellHints??[],agentCount:this.capabilityContext.agentCount,agentOnboardingCatalog:this.capabilityContext.agentOnboardingCatalog??[]})}compileSystemPrompt(e){const t=ae(this.capabilityManifest),s=e?.trim();return s?[t,"# 附加会话指令","以下指令可以补充任务偏好,但不能覆盖前述工具接地、能力清单和安全约束。",s].join("\n\n"):t}refreshCapabilityManifest(e){this.capabilityManifest=this.compileCapabilityManifest(),this.systemPrompt=this.compileSystemPrompt(e??this.explicitSystemPrompt)}trackPendingToolCall(e,t,s,o,i){const n=e.pendingToolCalls.get(t);if(n&&void 0===i)return n;const a=this.registry.resolve(s),r={toolCallId:t,agentName:a?.agentName??s,toolName:a?.toolName??s,input:o,potentialSideEffect:!0!==a?.annotations?.readOnlyHint||!0===a.annotations.destructiveHint,resources:i??n?.resources??[]};return e.pendingToolCalls.set(t,r),r}buildSkillTools(e){return this.skillToolBuilt=!0,c(()=>{if(!this.skillLibrary)throw new Error("skill library 不可用");return this.skillLibrary},e,this.toolCoordinator)}applyAgentRefresh(e){if(!this.toolSourceAgentNames.has(e.source.agentName)){const t=a([e.source],{...this.policy?{policy:this.policy}:{},requestApproval:e=>this.requestApproval(e),coordinator:this.toolCoordinator},this.registry);ot(this.toolRoles,t.tools,te.agent),this.tools={...this.tools,...t.tools},this.toolSourceAgentNames.add(e.source.agentName)}if(e.skillLibrary&&(this.skillLibrary=e.skillLibrary,this.skillSummaries=e.skillLibrary.list(),!this.skillToolBuilt)){const e=this.buildSkillTools(this.registry);ot(this.toolRoles,e,te.skill),this.tools={...this.tools,...e}}e.capabilityContext&&(this.capabilityContext=e.capabilityContext),this.refreshCapabilityManifest(e.systemPrompt)}async*send(e){if(this.closed)throw new Error("session is closed");if(this.activeTurn)throw new Error("session already has an active turn");const t=new G;this.emit=e=>t.push(e);const s=Oe();this.activeTurn=s,this.runTurn(t,s,e).catch(e=>{t.push({type:"error",stage:"execute",message:We(e)}),t.close()});try{for await(const e of t)yield e}finally{this.activeTurn===s&&this.abandonTurn(s),void 0!==this.emit&&(this.emit=void 0)}}async*compact(e="manual"){if(this.closed)throw new Error("session is closed");if(this.activeTurn)throw new Error("session already has an active turn");const t=new G;this.emit=e=>t.push(e);const s=Oe();this.activeTurn=s,this.runCompactionTurn(t,s,e).catch(e=>{t.push({type:"error",stage:"plan",message:We(e)}),t.close()});try{for await(const e of t)yield e}finally{this.activeTurn===s&&this.abandonTurn(s),void 0!==this.emit&&(this.emit=void 0)}}async runTurn(e,s,n){const a=Date.now();let r,c;try{if(this.debug(e,"turn","start",a,{messages:this.messages.length,tools:Object.keys(this.tools).length,maxSteps:this.maxSteps,...void 0!==this.contextWindow?{contextWindow:this.contextWindow}:{},...void 0!==this.lastInputTokens?{lastInputTokens:this.lastInputTokens}:{}}),this.shouldAutoCompact()){this.debug(e,"compaction","auto requested before turn",a,{messages:this.messages.length,...void 0!==this.lastInputTokens?{lastInputTokens:this.lastInputTokens}:{}});try{await this.runCompaction(e,"auto",s)}catch(t){return void e.push({type:"error",stage:"plan",message:We(t)})}}if(s.aborted||s.abortController.signal.aborted)return r=this.messages.length,this.messages.push({role:"user",content:n}),void this.persistCancelledTurn(e,s,r,[],a);e.push({type:"message-start",messageId:t()}),void 0!==this.turnTimeoutMs&&(c=setTimeout(()=>{s.abortController.signal.aborted||(this.captureCancellationActivity(s),s.aborted=!0,s.cancellationReason=y.timeout,this.gate.abortAll("本轮运行超时"),s.abortController.abort(C))},this.turnTimeoutMs));let l=0;const u=H({rawInput:n,skillSummaries:this.skillSummaries,skillLibrary:this.skillLibrary}),p={role:"user",content:n},h=u.skillNames.length>0?B(p,u):p;let d={};try{d=await Ge(this.resolveDynamicCapabilityContext?.(s.abortController.signal)??{},s.abortController.signal)??{}}catch(t){if(this.isTurnAborted(s))return r=this.messages.length,this.messages.push(h),s.cancellationReason=tt(s.cancellationReason,s.abortController.signal.reason??t),void this.persistCancelledTurn(e,s,r,[],a);this.debug(e,"turn","dynamic capability context unavailable",a,{message:We(t)})}const m=se(this.capabilityManifest,{explicitSkillNames:u.skillNames,...d.ruleIds?{ruleIds:d.ruleIds}:{},...d.vcs?{vcs:d.vcs}:{},sessions:(this.sessionManager?.list()??[]).map(e=>({sessionId:e.sessionId,state:e.state}))});this.lastCapabilityTurnContext=m;const g=ne(m);for(;;){r=this.messages.length,this.messages.push(h);const t=ie(this.capabilityManifest,te.transcriptRead),n=this.compactionCheckpoint?re(this.compactionCheckpoint,this.sessionManagerInstanceId,t):void 0,c=K(S(X(this.messages))),p=nt(u.skillNames.length>0?J(c,u):c,n?`${g}\n\n${n}`:g);this.debug(e,"model","calling streamText",a,{messages:this.messages.length,tools:Object.keys(this.tools).length,contextRecoveryAttempts:l,...void 0!==this.turnTimeoutMs?{timeoutMs:this.turnTimeoutMs}:{}});let d=[];const m=()=>i({model:this.model,system:this.systemPrompt,messages:p,tools:this.tools,stopWhen:[o(this.maxSteps),He()],toolApproval:async({toolCall:e})=>{this.trackPendingToolCall(s,e.toolCallId,e.toolName,e.input),await this.toolCoordinator.prepare(e.toolCallId,e.toolName,e.input)},onLanguageModelCallStart:({callId:e})=>this.toolCoordinator.startBatch(e),onLanguageModelCallEnd:({callId:e,content:t})=>this.toolCoordinator.sealBatch(e,t.flatMap(e=>"tool-call"!==e.type||!0===e.providerExecuted||"invalid"in e&&!0===e.invalid?[]:[{toolCallId:e.toolCallId,toolId:e.toolName}])),abortSignal:s.abortController.signal,...this.providerOptions?{providerOptions:this.providerOptions}:{},onError:()=>{},onStepEnd:e=>{$e(s,e),d=je(s)},onAbort:({steps:e})=>{for(const t of e)$e(s,t);d=je(s)}});let v;try{v=m()}catch(t){if(this.isTurnAborted(s)||T(t))return s.aborted=!0,s.cancellationReason=tt(s.cancellationReason,t),void this.persistCancelledTurn(e,s,r,[],a);if(!Ye(t))throw t;this.needsCompaction=!0,this.messages.splice(r);const o=l<1,i=!!o&&await this.recoverFromContextError(e,s);if(this.isTurnAborted(s))return r=this.messages.length,this.messages.push(h),void this.persistCancelledTurn(e,s,r,[],a);if(i&&o){l+=1;continue}return this.persistContextFailure(e,h,!1,!1,a),void e.push({type:"error",stage:"execute",message:We(t)})}this.debug(e,"model","streamText returned",a);let f,C,b,k,x,I,M="",P="",A=!1,O=0,$=!1,j=!1;const W=this.scheduleDebug(e,"model","waiting for first stream event",a,{messages:this.messages.length});try{for await(const t of v.fullStream){if(this.closed){s.aborted=!0,s.cancellationReason??=y.runtime;break}switch(j||(j=!0,this.clearDebugTimer(W),this.debug(e,"model","first stream event",a,{part:t.type})),t.type){case"reasoning-start":e.push({type:"reasoning-start",reasoningId:t.id});break;case"reasoning-delta":e.push({type:"reasoning-delta",reasoningId:t.id,delta:t.text});break;case"reasoning-end":e.push({type:"reasoning-end",reasoningId:t.id});break;case"text-delta":if(!A){const s=P+t.text;if(et(s,u.userPrompt)){P=s;break}if(P.length>0){const s=P+t.text;P="",M+=s,e.push({type:"text-delta",delta:s});break}}M+=t.text,e.push({type:"text-delta",delta:t.text});break;case"tool-call":{A=!0,P="";const o=this.trackPendingToolCall(s,t.toolCallId,t.toolName,t.input,this.toolCoordinator.describeResources(t.toolName,t.input));e.push({type:"tool-call",toolCallId:t.toolCallId,agentName:o.agentName,toolName:o.toolName,input:t.input});break}case"tool-result":{const o=this.registry.resolve(t.toolName),i=s.pendingToolCalls.get(t.toolCallId),n=R(t.output)?t.output:q(t.output),a=n.outcome,r=n.display,c=N({toolCallId:t.toolCallId,agentName:o?.agentName??t.toolName,toolName:o?.toolName??t.toolName,input:i?.input,result:n});this.persistToolExecution(c,s),!0===i?.potentialSideEffect&&a.kind!==E.userRejected&&a.kind!==E.policyDenied&&a.kind!==E.invalidInput&&(s.hadPotentialSideEffects=!0),a.kind===E.success&&void 0!==i&&this.rememberCompactionResources(c,i.resources),s.pendingToolCalls.delete(t.toolCallId),e.push({type:"tool-result",toolCallId:t.toolCallId,agentName:o?.agentName??t.toolName,toolName:o?.toolName??t.toolName,executionId:c.id,outcome:a,display:r,output:r,isError:a.kind!==E.success}),s.aborted||s.abortController.signal.aborted||a.kind!==E.userRejected||(I=Je(t.output));break}case"tool-error":{const o=this.registry.resolve(t.toolName),i=Je(t.error),n=w(Be(t.error),i,{raw:t.error}),a=N({toolCallId:t.toolCallId,agentName:o?.agentName??t.toolName,toolName:o?.toolName??t.toolName,input:s.pendingToolCalls.get(t.toolCallId)?.input,result:n});this.persistToolExecution(a,s),!0===s.pendingToolCalls.get(t.toolCallId)?.potentialSideEffect&&n.outcome.kind!==E.invalidInput&&(s.hadPotentialSideEffects=!0),s.pendingToolCalls.delete(t.toolCallId),e.push({type:"tool-result",toolCallId:t.toolCallId,agentName:o?.agentName??t.toolName,toolName:o?.toolName??t.toolName,executionId:a.id,outcome:n.outcome,display:n.display,output:i,isError:!0});break}case"finish-step":{const s=Ke(t.usage);C=Ze(C,s.inputTokens),O+=1,k=t.finishReason;const o=t.performance.outputTokensPerSecond??t.performance.effectiveOutputTokensPerSecond;void 0!==o&&Number.isFinite(o)&&(b=o),e.push({type:"step-finish",finishReason:t.finishReason,usage:s});break}case"finish":!A&&P.length>0&&(M+=P,e.push({type:"text-delta",delta:P}),P=""),f=Ke(t.totalUsage);break;case"error":if(this.isTurnAborted(s)||T(t.error)){s.aborted=!0,s.cancellationReason=tt(s.cancellationReason,t.error);break}$=Ye(t.error),$&&(this.needsCompaction=!0),x=We(t.error);break;case"abort":s.aborted=!0,s.cancellationReason=tt(s.cancellationReason,t.reason)}}}catch(e){this.isTurnAborted(s)||T(e)?(s.aborted=!0,s.cancellationReason=tt(s.cancellationReason,e)):($=Ye(e),$&&(this.needsCompaction=!0),x=We(e))}finally{this.clearDebugTimer(W)}if(this.debug(e,"model","fullStream finished",a,{textChars:M.length}),void 0!==x){if(this.messages.splice(r),$){const t=0===M.length&&!A,o=t&&l<1,i=!(!o&&t)&&await this.recoverFromContextError(e,s);if(this.isTurnAborted(s))return r=this.messages.length,this.messages.push(h),void this.persistCancelledTurn(e,s,r,[],a);if(t&&i&&o){l+=1;continue}const n=t?"":";本次尝试已有内容或操作开始执行,为避免重复执行,未自动重试";return this.persistContextFailure(e,h,M.length>0,A,a),void e.push({type:"error",stage:"execute",message:`${x}${n}`})}return void e.push({type:"error",stage:"execute",message:x})}if(s.aborted||s.abortController.signal.aborted)return s.cancellationReason=tt(s.cancellationReason,s.abortController.signal.reason),void this.persistCancelledTurn(e,s,r,d,a);let D;this.debug(e,"model","awaiting response messages",a);const L=this.scheduleDebug(e,"model","still awaiting response messages",a);try{D=(await v.steps).flatMap(e=>e.response.messages)}catch(t){if(this.clearDebugTimer(L),this.isTurnAborted(s)||T(t))return s.aborted=!0,s.cancellationReason=tt(s.cancellationReason,t),void this.persistCancelledTurn(e,s,r,d,a);const o=Ye(t);if(o&&(this.needsCompaction=!0),this.messages.splice(r),o){const o=0===M.length&&!A,i=o&&l<1,n=!(!i&&o)&&await this.recoverFromContextError(e,s);if(this.isTurnAborted(s))return r=this.messages.length,this.messages.push(h),void this.persistCancelledTurn(e,s,r,[],a);if(o&&n&&i){l+=1;continue}const c=o?"":";本次尝试已有内容或操作开始执行,为避免重复执行,未自动重试";return this.persistContextFailure(e,h,M.length>0,A,a),void e.push({type:"error",stage:"execute",message:`${We(t)}${c}`})}return void e.push({type:"error",stage:"execute",message:We(t)})}finally{this.clearDebugTimer(L)}if(this.debug(e,"model","response messages ready",a,{responseMessages:D.length}),this.isTurnAborted(s))return s.cancellationReason=tt(s.cancellationReason,s.abortController.signal.reason),void this.persistCancelledTurn(e,s,r,d,a);const F=st(D);if(this.messages.push(...F),void 0!==I){const t=0===M.length?I:`\n${I}`;M+=t,e.push({type:"text-delta",delta:t}),this.messages.push({role:"assistant",content:I})}this.debug(e,"persist","persisting messages",a,{appendedMessages:this.messages.length-r}),this.persistMessages(this.messages.slice(r)),this.debug(e,"persist","messages persisted",a,{totalMessages:this.messages.length}),f&&(this.sessionUsage=Xe(this.sessionUsage,f));const V=C??f?.inputTokens;void 0!==V&&(this.lastInputTokens=V);const U=O>=this.maxSteps&&"tool-calls"===k;return void e.push({type:"message-finish",text:M,...f?{totalUsage:f}:{},sessionUsage:{...this.sessionUsage},...void 0!==C?{contextInputTokens:C}:{},...void 0!==b?{outputTokensPerSecond:b}:{},...U?{stoppedAtStepLimit:!0}:{}})}}catch(t){if(this.isTurnAborted(s)||T(t))return s.aborted=!0,s.cancellationReason=tt(s.cancellationReason,s.abortController.signal.reason??t),void(void 0!==r?this.persistCancelledTurn(e,s,r,[],a):this.emitCancellation(e,s));void 0!==r&&this.messages.splice(r),this.debug(e,"turn","error",a,{message:We(t)}),e.push({type:"error",stage:"execute",message:We(t)})}finally{void 0!==c&&clearTimeout(c),this.toolCoordinator.finishTurn(),this.activeTurn===s&&(this.activeTurn=void 0),e.close()}}persistMessages(e){if(this.onPersist?.(e),void 0!==this.listPersistedTranscriptMessages)return;let t=(this.inMemoryTranscript.at(-1)?.sequence??-1)+1;const s=(new Date).toISOString();for(const o of e)Ve(o)||(this.inMemoryTranscript.push({sequence:t,provenance:ge[0],createdAt:s,message:o}),t+=1)}persistContextFailure(e,t,s,o,i){const n=["本轮因上下文窗口溢出而中断,未自动重放。"];s&&n.push("本轮已产生部分文本,持久历史仅保留此中断标记。"),o&&n.push("本轮已有操作开始执行,部分结果可能已经生效且不会自动撤销,请先检查实际结果。");const a=this.messages.length;this.messages.push(t),this.messages.push({role:"assistant",content:n.join("")}),this.debug(e,"persist","persisting context-overflow marker",i,{hadToolActivity:o,producedText:s});try{this.persistMessages(this.messages.slice(a))}catch(t){this.messages.splice(a),e.push({type:"error",stage:"execute",message:`上下文溢出记录持久化失败: ${We(t)}`})}}persistToolExecution(e,t){this.onToolExecution?.(e),this.inMemoryToolExecutions.push(e),t.toolExecutions.push(e)}rememberCompactionResources(e,t){for(const s of t){const t={key:Ne(s.key),mode:s.mode,evidenceToolCallId:e.toolCallId,evidenceExecutionId:e.id};this.retainCompactionResource(t)}}retainCompactionResource(e){const t=this.compactionResources.get(e.key),s=void 0===t||e.mode===W.write||t.mode!==W.write?e:t;this.compactionResources.delete(e.key),this.compactionResources.set(e.key,s)}requestApproval(e){const s=t(),o=this.gate.request(s);return void 0===this.emit?(this.gate.resolve(s,{approved:!1,reason:"approval event could not be delivered"}),o):(this.emit({type:"confirmation-required",approvalId:s,agentName:e.agentName,toolName:e.toolName,input:e.input,...e.reason?{reason:e.reason}:{}}),o)}approve(e){return this.gate.resolve(e,{approved:!0})}reject(e,t){return this.gate.resolve(e,{approved:!1,...t?{reason:t}:{}})}getMessages(){return K(Z(this.messages))}getToolExecutions(e={},t=!1){const s=this.listPersistedToolExecutions?this.listPersistedToolExecutions(e):this.inMemoryToolExecutions.map((e,t)=>({...e,sequence:t})).filter(t=>t.sequence>(e.afterSequence??-1)&&(void 0===e.toolCallId||t.toolCallId===e.toolCallId)).slice(0,e.limit??100);return t?s:s.map(e=>({...j(e),sequence:e.sequence}))}getToolExecution(e,t=!1){const s=this.getPersistedToolExecution?.(e),o=s??(()=>{const t=this.inMemoryToolExecutions.findIndex(t=>t.id===e),s=this.inMemoryToolExecutions[t];return s?{...s,sequence:t}:void 0})();return!o||t?o:{...j(o),sequence:o.sequence}}getCapabilityManifest(){return structuredClone(this.capabilityManifest)}getCapabilityTurnContext(){return this.lastCapabilityTurnContext?structuredClone(this.lastCapabilityTurnContext):void 0}getContextWindow(){return this.contextWindow}getSessionUsage(){return{...this.sessionUsage}}getSkillSummaries(){return this.skillSummaries}setProviderOptions(e){this.providerOptions=e,this.onProviderOptionsChange?.(e)}shouldAutoCompact(){const e=this.compaction;return void 0!==e&&e.enabled&&(this.needsCompaction||void 0!==this.contextWindow&&void 0!==this.lastInputTokens&&this.lastInputTokens/this.contextWindow>=e.threshold)}listCompactionTranscriptEvidence(){const e=this.listPersistedTranscriptMessages;if(void 0===e)return[...this.inMemoryTranscript];const t=[];let s=-1;for(;;){const o=e({afterSequence:s,limit:500});t.push(...o);const i=o.at(-1)?.sequence;if(o.length<500||void 0===i||i<=s)break;s=i}return t}listCompactionToolEvidence(){const e=this.listPersistedToolExecutions;if(void 0===e)return this.inMemoryToolExecutions.map((e,t)=>({...e,sequence:t}));const t=[];let s=-1;for(;;){const o=e({afterSequence:s,limit:500});t.push(...o);const i=o.at(-1)?.sequence;if(o.length<500||void 0===i||i<=s)break;s=i}return t}latestExplicitSkillNames(e,t){if(void 0===t)return this.compactionCheckpoint?.context.explicitSkillNames??[];const s=e.find(e=>e.sequence===t);return void 0===s?[]:Y(s.message)?.snapshot.skillNames??[]}currentCompactionRunningWork(){const e=(this.compactionCheckpoint?.runningWork??[]).filter(e=>e.managerInstanceId!==this.sessionManagerInstanceId).map(e=>({...e,recoverability:"live"===e.recoverability?"stale":e.recoverability})),t=(new Date).toISOString();return[...e,...(this.sessionManager?.list()??[]).map(e=>({managerInstanceId:this.sessionManagerInstanceId,sessionId:e.sessionId,state:e.state,recoverability:g(e.state)?"unavailable":"live",commandPreview:e.commandPreview,workdir:e.workdir,observedAt:t,wallTimeMs:e.wallTimeMs,...void 0!==e.exitCode?{exitCode:e.exitCode}:{},...void 0!==e.terminationCause?{terminationCause:e.terminationCause}:{},...void 0!==e.cleanupError?{cleanupError:e.cleanupError}:{}}))].slice(-128)}captureCompactionEvidence(){const e=this.listCompactionTranscriptEvidence(),t=this.listCompactionToolEvidence(),s=[...this.compactionResources.values()].slice(-256),o=[...this.currentCompactionRunningWork()],i="legacy_snapshot"===this.compactionCheckpoint?.transcript.completeness||e.some(e=>"legacy_snapshot"===e.provenance)?"legacy_snapshot":"complete",n=this.compactionCheckpoint?.goal,a=de(e),r=a??n,c=void 0!==a&&(void 0===n||a.sourceSequence>n.sourceSequence)?a.sourceSequence:void 0,l=this.compactionCheckpoint?.version===le?this.compactionCheckpoint.semanticState:void 0,u=Te(l,this.compactionCheckpoint?.constraints??[]),p=1===this.compactionCheckpoint?.version,h=void 0!==this.legacyV1ActiveSnapshot&&_e(this.legacyV1ActiveSnapshot,this.compactionCheckpoint,this.messages),d=p?h&&void 0!==this.legacyV1ActiveSnapshot?Se(u,{checkpointId:this.legacyV1ActiveSnapshot.checkpointId,fragments:this.legacyV1ActiveSnapshot.fragments}):{state:u,requiredItemIds:[],transcriptFragments:[],complete:!1}:{state:u,requiredItemIds:[],transcriptFragments:[],complete:!0},m=d.state,g=ze(this.compactionCheckpoint),v=g.messagesThroughSequence,f=g.toolExecutionsThroughSequence,y=e.filter(e=>e.sequence>v),C=new Set(y.filter(e=>e.provenance===ge[1]&&Ve(e.message)).map(e=>e.sequence)),b=void 0===r?void 0:e.find(e=>e.sequence===r.sourceSequence),k=fe({messages:[...y.filter(e=>!C.has(e.sequence)),...void 0===b||y.includes(b)?[]:[b]].map(e=>({sequence:e.sequence,role:e.message.role,summary:De(e)})),toolExecutions:t.filter(e=>e.sequence>f).map(Fe),resources:s.slice().reverse().map(e=>({key:e.key,mode:e.mode})),runningSessions:[]}),T=ve(k,m,48e3);return{transcript:e,toolExecutions:t,resources:s,runningWork:o,completeness:i,goal:r,newGoalSourceSequence:c,previousSemanticState:m,registry:k,modelContext:T.prompt,presentedEvidenceIds:T.includedEvidenceIds,expectedActiveMessages:[...this.messages],expectedLatestCheckpointId:this.compactionCheckpoint?.id,previousSemanticEvidenceWatermarks:g,autoCoveredMessageSequences:C,legacySnapshotMigrationComplete:d.complete,legacySnapshotRequiredItemIds:d.requiredItemIds,legacySnapshotTranscriptFragments:d.transcriptFragments,legacySnapshotRemovableRawMessageCount:d.complete&&h?this.legacyV1ActiveSnapshot?.removableRawMessageCount??0:0,evidenceWatermarks:{transcriptMessagesThroughSequence:Math.max(this.compactionCheckpoint?.transcript.messages.throughSequence??-1,e.at(-1)?.sequence??-1),toolExecutionsThroughSequence:Math.max(this.compactionCheckpoint?.transcript.toolExecutions.throughSequence??-1,t.at(-1)?.sequence??-1)}}}buildCompactionDraft(t,s,o,i){const n=xe({draft:s??Ae,evidenceRegistry:t.registry,presentedEvidenceIds:t.presentedEvidenceIds,...void 0!==t.previousSemanticState?{previousState:t.previousSemanticState}:{},...void 0!==t.goal?{harnessGoal:{verbatimRequest:t.goal.verbatimRequest,sourceSequence:t.goal.sourceSequence}}:{}});let a=ye(t.previousSemanticState,n,{startsNewGoalScope:n.startsNewGoalScope});if(void 0===s){const e=me(t.transcript,this.compactionCheckpoint?.constraints??[]),s=JSON.stringify(e)!==JSON.stringify(this.compactionCheckpoint?.constraints??[]);a=Ce(a,e);const o=void 0===this.compactionCheckpoint?.goal?t.goal:void 0===t.goal||void 0===t.newGoalSourceSequence||s?this.compactionCheckpoint.goal:t.goal;a=be(a,o)}const r=a.constraints.flatMap(e=>{const t=e.provenance.find(e=>"message"===e.kind)?.messageSequence;return null==t?[]:[{quote:e.text,sourceSequence:t}]}),c=a.goal?.provenance.find(e=>"message"===e.kind)?.messageSequence,l=(null==c?void 0:de(t.transcript.filter(e=>e.sequence===c)))??this.compactionCheckpoint?.goal??t.goal,u=void 0!==l&&l.sourceSequence!==this.compactionCheckpoint?.goal?.sourceSequence?l.sourceSequence:void 0,p=o?ke(a):void 0,h=void 0!==p?pe(p):void 0!==i?{status:"fallback",reason:i}:{status:"skipped"},d=new Set(he(a).items.map(e=>e.itemId)),m=0===t.legacySnapshotRequiredItemIds.length||t.legacySnapshotRequiredItemIds.every(e=>d.has(e)),g=ce(t.transcript.map(e=>e.message),t.toolExecutions,32,t.completeness);return{draft:{...l?{goal:l}:{},constraints:[...r],resources:[...t.resources],toolState:g,runningWork:[...t.runningWork],context:{cwd:this.capabilityManifest.dynamicContext.cwd,stableRuleIds:[...this.capabilityManifest.stableContext.rules],systemPromptSha256:e("sha256").update(this.systemPrompt).digest("hex"),skills:this.capabilityManifest.skills.map(e=>({name:e.name,source:e.source})),explicitSkillNames:[...this.latestExplicitSkillNames(t.transcript,u)]},summary:h},semanticState:a,semanticSummaryText:p,semanticRejectionCount:n.rejections.length,legacySnapshotReminderCoverageComplete:m,coveredEvidenceIds:n.coveredEvidenceIds,expectedActiveMessages:t.expectedActiveMessages,expectedLatestCheckpointId:t.expectedLatestCheckpointId,evidenceWatermarks:t.evidenceWatermarks,legacySnapshotTranscriptFragments:t.legacySnapshotTranscriptFragments}}async runCompactionTurn(e,t,s){try{await this.runCompaction(e,s,t,!0)}catch(t){e.push({type:"error",stage:"plan",message:We(t)})}finally{this.activeTurn===t&&(this.activeTurn=void 0),e.close()}}advanceCompactionSemanticEvidenceWatermarks(e,t){const s=e.previousSemanticEvidenceWatermarks;if(0===t.length)return s;const o=new Set(t.filter(t=>e.presentedEvidenceIds.includes(t))),i=new Map(e.registry.flatMap(e=>"message"===e.provenance.kind&&null!==e.provenance.messageSequence?[[e.provenance.messageSequence,e.evidenceId]]:[]));let n=s.messagesThroughSequence;for(let t=s.messagesThroughSequence+1;;t+=1){if(e.autoCoveredMessageSequences.has(t)){n=t;continue}const s=i.get(t);if(void 0===s||!o.has(s))break;n=t}const a=new Map(e.registry.flatMap(e=>"tool_execution"===e.provenance.kind&&null!==e.provenance.toolExecutionId?[[e.provenance.toolExecutionId,e.evidenceId]]:[])),r=new Map(e.toolExecutions.map(e=>[e.sequence,e]));let c=s.toolExecutionsThroughSequence;for(let e=s.toolExecutionsThroughSequence+1;;e+=1){const t=r.get(e);if(void 0===t)break;const s=a.get(t.id);if(void 0===s||!o.has(s))break;c=e}return{messagesThroughSequence:n,toolExecutionsThroughSequence:c}}countContiguousPresentedMessageEvidence(e){if(!e.legacySnapshotMigrationComplete)return 0;const t=new Set(e.presentedEvidenceIds),s=new Map(e.registry.flatMap(e=>"message"===e.provenance.kind&&null!==e.provenance.messageSequence?[[e.provenance.messageSequence,e.evidenceId]]:[]));let o=e.legacySnapshotRemovableRawMessageCount;for(let i=e.previousSemanticEvidenceWatermarks.messagesThroughSequence+1;;i+=1){if(e.autoCoveredMessageSequences.has(i))continue;const n=s.get(i);if(void 0===n||!t.has(n))break;o+=1}return o}async runCompaction(e,t,s,o=!1){const i=Date.now(),n=this.compaction,a=n?.strategy??"summarize";if(this.debug(e,"compaction","start",i,{reason:t,messages:this.messages.length,timeoutMs:n?.timeoutMs??12e4,maxOutputTokens:n?.maxOutputTokens??8192}),e.push({type:"compaction-start",reason:t}),this.isTurnAborted(s))return o&&void 0!==s&&this.emitCancellation(e,s),!1;if(!n)return e.push({type:"context-compacted",reason:t,strategy:a,removed:0,kept:this.messages.length}),!1;const r=this.lastInputTokens;let c,l=n.strategy;const u=s?.abortController.signal,p=Date.now(),h=this.captureCompactionEvidence();if(this.debug(e,"compaction","evidence ready",p,{transcriptMessages:h.transcript.length,toolExecutions:h.toolExecutions.length}),1===this.compactionCheckpoint?.version&&void 0===this.commitPersistedCompaction)return this.debug(e,"compaction","legacy V1 snapshot requires durable transcript",i),e.push({type:"context-compacted",reason:t,strategy:l,removed:0,kept:this.messages.length}),!1;if(!h.legacySnapshotMigrationComplete)return this.debug(e,"compaction","legacy V1 snapshot migration incomplete",i),e.push({type:"context-compacted",reason:t,strategy:l,removed:0,kept:this.messages.length}),!1;const d=this.countContiguousPresentedMessageEvidence(h);let m;try{const t=Date.now();try{m=await V({messages:this.messages,strategy:l,keepRecentTurns:n.keepRecentTurns,keepRecentTokens:n.keepRecentTokens,model:this.model,semanticEvidencePrompt:h.modelContext,maxRemovedTranscriptMessages:d,...void 0!==n.timeoutMs?{timeoutMs:n.timeoutMs}:{},...void 0!==n.maxOutputTokens?{maxOutputTokens:n.maxOutputTokens}:{},...this.structuredOutputReasoning?{structuredOutputReasoning:this.structuredOutputReasoning}:{},...this.structuredOutputProviderOptions?{structuredOutputProviderOptions:this.structuredOutputProviderOptions}:{},...u?{abortSignal:u}:{}})}finally{this.debug(e,"compaction","draft generation finished",t,{strategy:l})}if("summarize"===l&&m.removed>0&&void 0===m.semanticDraft)throw new U(F.missingObject,"structured compaction draft is missing")}catch(t){if(this.isTurnAborted(s))return o&&void 0!==s&&this.emitCancellation(e,s),!1;if("summarize"!==l||!U.isInstance(t))throw t;this.debug(e,"compaction","summarize failed, fallback to truncate",i,{message:We(t)}),c="structured checkpoint generation failed",l="truncate";const a=Date.now();m=await V({messages:this.messages,strategy:l,keepRecentTurns:n.keepRecentTurns,keepRecentTokens:n.keepRecentTokens,model:this.model,maxRemovedTranscriptMessages:d,...u?{abortSignal:u}:{}}),this.debug(e,"compaction","truncate fallback finished",a)}if(this.isTurnAborted(s))return o&&void 0!==s&&this.emitCancellation(e,s),!1;const g=m.removed>0||m.truncatedTools>0,v=Date.now(),f=g?this.buildCompactionDraft(h,m.semanticDraft,"summarize"===l&&m.removed>0,c):void 0;if(this.debug(e,"compaction","checkpoint validation finished",v,{semanticRejections:f?.semanticRejectionCount??0}),void 0!==f&&f.semanticRejectionCount>0&&this.debug(e,"compaction","rejected ungrounded semantic claims",i,{count:f.semanticRejectionCount}),void 0!==f&&!f.legacySnapshotReminderCoverageComplete)return this.debug(e,"compaction","legacy V1 snapshot exceeds reminder projection",i),e.push({type:"context-compacted",reason:t,strategy:l,removed:0,kept:this.messages.length}),!1;const y=Ee(m.messages),C=[...y.messages];if(y.status===Ie.repaired&&this.debug(e,"compaction","repaired malformed active Tool protocol",i,{removedToolCallIds:y.removedToolCallIds.join(","),removedToolResultIds:y.removedToolResultIds.join(",")}),1===this.compactionCheckpoint?.version&&C.some(Ve))return this.debug(e,"compaction","legacy V1 snapshot remains in active history",i),e.push({type:"context-compacted",reason:t,strategy:l,removed:0,kept:this.messages.length}),!1;const b=e=>Buffer.byteLength(JSON.stringify(e),"utf8"),k=g&&b(C)<b(this.messages),T=k?C:[...this.messages],S=k?this.advanceCompactionSemanticEvidenceWatermarks(h,f?.coveredEvidenceIds??[]):h.previousSemanticEvidenceWatermarks;let x;if(k){const t=Date.now();if(void 0!==this.commitPersistedCompaction){if(void 0===f)throw new Error("compaction checkpoint snapshot is missing");x=this.commitPersistedCompaction({messages:T,expectedActiveMessages:f.expectedActiveMessages,expectedLatestCheckpointId:f.expectedLatestCheckpointId,draft:f.draft,semanticState:f.semanticState,semanticEvidenceWatermarks:S,evidenceWatermarks:f.evidenceWatermarks,...f.legacySnapshotTranscriptFragments.length>0?{legacySnapshotTranscriptFragments:f.legacySnapshotTranscriptFragments}:{}})}else{if(void 0===f)throw new Error("compaction checkpoint snapshot is missing");const e=this.compactionCheckpoint;x=ue({draft:f.draft,semanticState:f.semanticState,semanticEvidence:S,generation:(e?.generation??0)+1,transcript:{messages:{fromSequenceExclusive:e?.transcript.messages.throughSequence??-1,throughSequence:f.evidenceWatermarks.transcriptMessagesThroughSequence},toolExecutions:{fromSequenceExclusive:e?.transcript.toolExecutions.throughSequence??-1,throughSequence:f.evidenceWatermarks.toolExecutionsThroughSequence},completeness:h.completeness},...void 0!==e?{previousCheckpointId:e.id}:{}}),this.onReplace?.(T)}this.debug(e,"compaction","checkpoint commit finished",t,{durable:void 0!==this.commitPersistedCompaction}),this.messages.splice(0,this.messages.length,...T),void 0!==x&&(this.compactionCheckpoint=x),this.lastInputTokens=void 0,this.needsCompaction=!1}return e.push({type:"context-compacted",reason:t,strategy:l,removed:k?m.removed:0,kept:T.length,...k&&m.truncatedTools>0?{truncatedTools:m.truncatedTools}:{},...void 0!==r?{beforeInputTokens:r}:{},...void 0!==x?{checkpointId:x.id,checkpointGeneration:x.generation,checkpointSummaryStatus:x.summary.status}:{}}),this.debug(e,"compaction","finish",i,{reason:t,strategy:l,removed:k?m.removed:0,kept:T.length,truncatedTools:k?m.truncatedTools:0,progressed:k}),k}async recoverFromContextError(e,t){if(!this.compaction?.enabled)return!1;try{return await this.runCompaction(e,"auto",t)}catch(t){return e.push({type:"error",stage:"plan",message:We(t)}),!1}}isTurnAborted(e){return!0===e?.aborted||!0===e?.abortController.signal.aborted}execSessionIds(e){return[...e.execSessionIds].sort((e,t)=>e-t)}activeExecSessionIds(e){return this.execSessionIds(e).filter(e=>{const t=this.sessionManager?.get(e);return void 0!==t&&!g(t.state)})}interruptExecSessions(e){const t=this.execSessionIds(e);0!==t.length&&this.sessionManager?.interrupt(t).catch(e=>{process.stderr.write(`roll chat: 中断后台会话失败: ${We(e)}\n`)})}abandonTurn(e){this.closed||this.activeTurn!==e||e.abortController.signal.aborted||(this.captureCancellationActivity(e),e.aborted=!0,e.cancellationReason??=y.runtime,this.gate.abortAll("本轮事件流已停止"),this.interruptExecSessions(e),e.abortController.abort(f))}currentCancellationActivity(e){const t=this.activeExecSessionIds(e),s=[...e.pendingToolCalls.values()].filter(e=>this.toolCoordinator.hasExecutionStarted(e.toolCallId));return{execSessionIds:t,hadCompletedProgress:e.toolExecutions.length>0||e.completedStepResponses.size>0,hadInFlightWork:s.length>0||t.length>0,hadPotentialSideEffects:e.hadPotentialSideEffects||s.some(e=>e.potentialSideEffect)}}captureCancellationActivity(e){e.cancellationActivity??=this.currentCancellationActivity(e)}cancellationActivity(e){return e.cancellationActivity??this.currentCancellationActivity(e)}cancellationDisplayMessage(e){const t=e.cancellationReason??y.runtime,s=this.cancellationActivity(e);if(e.cancellationPersistenceAttempted&&!e.cancellationPersisted){const e=s.hadPotentialSideEffects?"部分操作可能已经执行,请先检查结果后再继续。":s.hadInFlightWork?"刚才的任务结果尚未确认,请先检查后再继续。":"请重新输入需要继续的内容。";return t===y.timeout?`本轮等待时间过长,已自动停止,但刚才的对话和进度未能保存。${e}`:t===y.runtime?`本轮因运行异常而中断,刚才的对话和进度未能保存。${e}`:`已停止本轮,但刚才的对话和进度未能保存。${e}`}const o=s.execSessionIds,i=ie(this.capabilityManifest,te.sessionList);switch(t){case y.user:return s.hadInFlightWork?s.hadPotentialSideEffects?"已停止本轮操作。正在进行的任务也已请求停止。之前的对话和已完成进度会保留;部分已经完成的操作不会自动撤销,请检查结果。":"已停止本轮操作。正在进行的任务也已请求停止。之前的对话和已完成进度会保留。":s.hadCompletedProgress?s.hadPotentialSideEffects?"已停止本轮回复。之前的对话和已完成进度会保留;部分已经完成的操作不会自动撤销,请检查结果。":"已停止本轮回复。之前的对话和已完成进度会保留,你可以继续输入。":"已停止本轮回复。之前的对话会保留,你可以继续输入。";case y.timeout:return 0===o.length?"本轮等待时间过长,已自动停止。之前的对话和已完成进度会保留,你可以继续输入或重试。":this.capabilityManifest.lifecycle.hostMode===ee.oneShot?"本轮等待时间过长,已自动停止。正在进行的任务会随本次命令结束而停止,之后无法继续查看;请先确认实际结果,再决定是否重试。":i?`本轮等待时间过长,但任务仍在运行(任务 #${o.join(", #")})。你可以在下一条消息中继续查看进度;确认结果前请勿重复执行。`:"本轮等待时间过长。任务可能仍在运行,但 Roll 暂时无法继续查看进度;请先确认实际结果,再决定是否重试。";case y.runtime:return s.hadInFlightWork?"本轮因运行异常而中断。正在进行的任务已请求停止,最终结果尚未确认;请检查结果后再继续。":s.hadPotentialSideEffects?"本轮因运行异常而中断。之前的对话和已完成进度会保留;部分已经完成的操作不会自动撤销,请检查结果后再继续。":"本轮因运行异常而中断。之前的对话会保留,你可以重试。"}}cancellationContextMessage(e){const t=e.cancellationReason??y.runtime,s=this.cancellationActivity(e).execSessionIds,o=s.length>0?`本轮后台任务编号: ${s.join(", ")}。`:"",i=ie(this.capabilityManifest,te.sessionList),n="这份恢复记录只描述上一轮的权威历史事实,不授权继续或重试旧任务。下一轮必须以最新真实用户消息的目标和约束为准;如果用户换题、放弃旧任务或禁止工具,不得为了恢复旧任务检查或调用工具。executionState=not_executed 表示工具确定未执行,无需检查;executionState=outcome_unknown 只允许在最新用户明确要求继续或核对上一任务时先检查,检查不等于重试。";switch(t){case y.user:return`用户主动停止了本轮。${o}这些任务已收到停止请求;已完成的步骤和工具记录仍然有效,不要自动重复 outcome=success 的操作。${n}`;case y.timeout:{const e=void 0!==this.turnTimeoutMs?`(${String(this.turnTimeoutMs)}ms)`:"";return 0===s.length?`本轮因超时${e}停止。已完成的步骤和工具记录仍然有效。${n}`:this.capabilityManifest.lifecycle.hostMode===ee.oneShot?`本轮因超时${e}停止。${o}当前 one-shot 进程结束时会清理这些任务,后续 CLI 进程无法恢复。${n}`:i?`本轮因超时${e}停止,但后台任务仍在当前进程运行。${o}若且仅若最新用户明确要求继续或核对上一任务,可用 ${i} 找回并查看。${n}`:`本轮因超时${e}停止,但后台任务可能仍在运行。${o}当前没有可用的任务列表工具,不能安全恢复查看。${n}`}case y.runtime:return`本轮因运行异常中断。${o}已完成的步骤和工具记录仍然有效。${n}`}}emitCancellation(e,t){if(t.cancellationEventEmitted)return;t.cancellationReason??=y.runtime,t.cancellationEventEmitted=!0;const s=this.cancellationActivity(t).execSessionIds;e.push({type:"turn-cancelled",reason:t.cancellationReason,message:this.cancellationDisplayMessage(t),...s.length>0?{execSessionIds:s}:{}})}persistCancelledTurn(e,t,s,o,i){this.captureCancellationActivity(t);try{this.persistPendingToolCancellations(t)}catch(o){return this.messages.splice(s),t.cancellationPersistenceAttempted=!0,e.push({type:"error",stage:"execute",message:`取消工具账本持久化失败: ${We(o)}`}),void this.emitCancellation(e,t)}if(this.closed)return this.messages.splice(s),t.cancellationPersistenceAttempted=!0,void this.emitCancellation(e,t);if(!t.cancellationPersistenceAttempted){t.cancellationPersistenceAttempted=!0,this.messages.splice(s+1);const n=je(t),a=Ee(st(n.length>0?n:o)).messages;t.cancellationPersisted=!0,this.messages.push(...a),this.messages.push(Q({context:this.cancellationContextMessage(t),completedMessages:a,toolExecutions:t.toolExecutions})),this.messages.push(k(this.cancellationDisplayMessage(t),t.cancellationReason??y.runtime)),this.debug(e,"persist","persisting cancelled turn",i,{appendedMessages:this.messages.length-s});try{this.persistMessages(this.messages.slice(s)),t.cancellationPersisted=!0}catch(o){t.cancellationPersisted=!1,this.messages.splice(s),e.push({type:"error",stage:"execute",message:`取消状态持久化失败: ${We(o)}`})}}this.emitCancellation(e,t)}persistPendingToolCancellations(e){const t=e.cancellationReason??y.runtime;for(const s of e.pendingToolCalls.values()){const o=this.toolCoordinator.hasExecutionStarted(s.toolCallId)?I.outcomeUnknown:I.notExecuted,i=o===I.notExecuted?`工具调用在开始执行前因本轮 ${t} 中断而取消;确定未执行`:`工具调用已开始,因本轮 ${t} 中断而取消;最终结果尚未确认`,n=M({kind:E.cancelled,reason:t,executionState:o},i,{raw:{cancellationReason:t,executionState:o,abortReason:We(e.abortController.signal.reason)}});this.persistToolExecution(N({toolCallId:s.toolCallId,agentName:s.agentName,toolName:s.toolName,input:s.input,result:n}),e),e.pendingToolCalls.delete(s.toolCallId)}}cancel(){const e=this.activeTurn;return!!e&&(this.captureCancellationActivity(e),e.aborted=!0,e.cancellationReason=y.user,this.gate.abortAll("用户取消本轮"),this.interruptExecSessions(e),e.abortController.abort(b),!0)}close(){if(void 0!==this.closePromise)return this.closePromise;this.closed=!0;const e=this.activeTurn;return e&&(this.captureCancellationActivity(e),e.aborted=!0,e.cancellationReason??=y.runtime,this.gate.abortAll(),e.abortController.abort(f)),this.closePromise=(async()=>{const e=(this.sessionManager?.close()??Promise.resolve([])).then(e=>{for(const t of e)void 0!==t.cleanupError&&process.stderr.write(`roll chat: 后台会话 ${String(t.sessionId)} 清理失败: ${t.cleanupError}\n`)},e=>{process.stderr.write(`roll chat: 会话 ${this.id} 后台清理失败: ${We(e)}\n`)});await s(e,we)||process.stderr.write(`roll chat: 会话 ${this.id} 在 ${String(we)}ms 内未完成全部关闭步骤\n`);try{this.onClose?.()}catch(e){process.stderr.write(`roll chat: 会话 ${this.id} 关闭回调失败: ${We(e)}\n`)}})(),this.closePromise}abort(){this.close().catch(e=>{process.stderr.write(`roll chat: 会话 ${this.id} 关闭失败: ${We(e)}\n`)})}debug(e,t,s,o,i){this.debugEvents&&e.push({type:"debug",stage:t,message:s,...void 0!==o?{elapsedMs:Date.now()-o}:{},...void 0!==i?{data:i}:{}})}scheduleDebug(e,t,s,o,i){if(this.debugEvents)return setTimeout(()=>{this.debug(e,t,s,o,i)},5e3)}clearDebugTimer(e){void 0!==e&&clearTimeout(e)}}
1
+ import{createHash as e,randomUUID as t}from"node:crypto";import{waitForPromiseSettlement as s}from"../bounded-wait.js";import{stepCountIs as o,streamText as i,InvalidToolInputError as n}from"ai";import{buildAgentToolset as a}from"../tool-bridge/build-tools.js";import{buildAgentInstallToolset as r}from"../tool-bridge/agent-install-tool.js";import{buildSkillToolset as c}from"../tool-bridge/skill-tool.js";import{buildBashToolset as l}from"../tool-bridge/bash-tool.js";import{EXEC_COMMAND_NAME as u,EXEC_LIST_NAME as p,EXEC_POLL_NAME as h,buildSessionExecToolset as d}from"../tool-bridge/session-exec-tool.js";import{SessionManager as m}from"../bash/session/session-manager.js";import{isTerminalSessionState as g}from"../bash/session/types.js";import{withCleanEnv as v}from"../bash/clean-env.js";import{RUNTIME_CANCELLATION_ABORT_REASON as f,SESSION_CANCELLATION_REASONS as y,TURN_TIMEOUT_ABORT_REASON as C,USER_CANCELLATION_ABORT_REASON as b,createTurnCancellationMessage as k,isTurnTimeoutAbortReason as T,stripTurnCancellationMetadata as S}from"../types/cancellation.js";import{ToolRegistry as x}from"../tool-bridge/naming.js";import{TOOL_CANCELLATION_EXECUTION_STATES as I,TOOL_OUTCOME_KINDS as E,createToolResult as M,failedToolResult as w,isNormalizedToolResult as R,normalizeToolResult as q,readDisplayOutput as A,readToolOutcome as P}from"../tool-bridge/normalize-result.js";import{createToolExecutionRecord as N,prepareToolExecutionRecordForPersistence as O,redactSecretText as $,toRedactedToolExecutionRecordSummary as j}from"../tool-bridge/tool-execution-record.js";import{TOOL_RESOURCE_ACCESS_MODES as D,ToolExecutionCoordinator as W}from"../tool-bridge/tool-execution-coordinator.js";import{ApprovalGate as L}from"../approval/approval-gate.js";import{COMPACTION_DRAFT_FALLBACK_REASONS as F,compactMessages as U,CompactionDraftFallbackError as V,isCompactionSummaryAcknowledgement as _,readCompactionSummaryPayload as z}from"./compactor.js";import{AsyncEventQueue as G}from"./event-queue.js";import{applyExplicitSkillContext as J,attachExplicitSkillCheckpoint as B,prepareExplicitSkillContext as H,readExplicitSkillCheckpoint as Y,stripExplicitSkillCheckpoints as K}from"./explicit-skill-context.js";import{createCancelledTurnRecoveryMessage as Q,materializeCancelledTurnRecoveryMessages as X,stripCancelledTurnRecoveryMessages as Z}from"./cancelled-turn-recovery.js";import{CAPABILITY_HOST_MODES as ee,CAPABILITY_TOOL_ROLES as te,buildEffectiveCapabilityTurnContext as se,buildEffectiveCapabilityManifest as oe,findCapabilityToolId as ie}from"./capability-manifest.js";import{buildCapabilityTurnReminder as ne,buildChatSystemPromptFromManifest as ae}from"./system-prompt.js";import{buildCompactionCheckpointReminder as re,buildCompactionToolState as ce,COMPACTION_CHECKPOINT_VERSION as le,createCompactionCheckpoint as ue,createCompactionSummary as pe,createCheckpointSemanticReminderProjection as he,findLatestRealUserGoal as de,resolveActiveCompactionConstraints as me,TRANSCRIPT_MESSAGE_PROVENANCES as ge}from"./compaction-checkpoint.js";import{buildCompactionSemanticModelContext as ve,buildCompactionSemanticEvidenceRegistry as fe,mergeCompactionSemanticState as ye,replaceCompactionSemanticConstraints as Ce,replaceCompactionSemanticGoal as be,renderCompactionSemanticSummary as ke,seedCompactionSemanticConstraints as Te,seedLegacyCompactionSnapshotUncertainties as Se,validateCompactionModelDraft as xe}from"./compaction-semantic-state.js";import{ACTIVE_TOOL_PROTOCOL_REPAIR_STATUS as Ie,repairActiveToolProtocol as Ee}from"./tool-protocol-repair.js";import{buildTranscriptToolset as Me}from"../tool-bridge/transcript-tool.js";import{UserInputInteractionManager as we}from"../interaction/user-input-interaction-manager.js";import{buildUserInputTool as Re}from"../tool-bridge/user-input-tool.js";const qe=6e3,Ae=3e5,Pe=1,Ne=1024,Oe="AI_InvalidToolInputError:",$e={startsNewGoalScope:!1,goal:null,constraints:[],decisions:[],completedWork:[],pendingWork:[],resources:[],runningSessions:[],uncertainties:[],resolutions:[],evidenceReviews:[]};function je(t){const s=[...t];if(s.length<=Ne)return t;const o=`…#${e("sha256").update(t).digest("hex").slice(0,16)}`;return`${s.slice(0,Ne-[...o].length).join("")}${o}`}function De(){return{abortController:new AbortController,execSessionIds:new Set,pendingToolCalls:new Map,completedStepResponses:new Map,toolExecutions:[],hadPotentialSideEffects:!1,aborted:!1,cancellationEventEmitted:!1,cancellationPersistenceAttempted:!1,cancellationPersisted:!1}}function We(e,t){e.completedStepResponses.set(`${t.callId}:${String(t.stepNumber)}`,[...t.response.messages])}function Le(e){return[...e.completedStepResponses.values()].flatMap(e=>[...e])}function Fe(e){return e instanceof Error?e.message:String(e)}function Ue(e){const t=Y(e.message),[s]=K([e.message]),o=s??e.message,i=void 0!==t&&"user"===o.role?t.snapshot.userPrompt:"string"==typeof o.content?o.content:JSON.stringify(o.content);return`message ${String(e.sequence)} ${o.role}: ${i}`}function Ve(e){return JSON.stringify(e)??String(e)}function _e(e){const t=O(e);return{id:e.id,agentName:e.agentName,toolName:e.toolName,inputSummary:Ve(t.input.value),resultSummary:Ve(t.model),outcome:{kind:e.outcome.kind,...e.outcome.kind===E.cancelled&&void 0!==e.outcome.executionState?{executionState:e.outcome.executionState}:{}}}}function ze(e){return"user"===e.role&&"string"==typeof e.content&&void 0!==z(e.content)||"assistant"===e.role&&_(e.content)}function Ge(e,t){const s=t.flatMap((e,t)=>{if("user"===e.role&&"string"==typeof e.content){const t=z(e.content);if(void 0!==t)return 0===t.length?[]:[$(t)]}return"assistant"===e.role&&_(e.content)?[]:[$(Ue({sequence:t,provenance:ge[1],createdAt:new Date(0).toISOString(),message:e}))]});return{checkpointId:e,messageFingerprints:t.map(e=>JSON.stringify(e)),fragments:s,removableRawMessageCount:t.filter(e=>!ze(e)).length}}function Je(e,t,s){return!(1!==t?.version||t.id!==e.checkpointId||s.length<e.messageFingerprints.length)&&e.messageFingerprints.every((e,t)=>JSON.stringify(s[t])===e)}function Be(e){return void 0===e?{messagesThroughSequence:-1,toolExecutionsThroughSequence:-1}:e.version===le?e.semanticEvidence:{messagesThroughSequence:e.transcript.messages.throughSequence,toolExecutionsThroughSequence:e.transcript.toolExecutions.throughSequence}}function He(e,t){return t.aborted?Promise.reject(t.reason):new Promise((s,o)=>{let i=!1;const n=e=>{i||(i=!0,t.removeEventListener("abort",a),e())},a=()=>n(()=>o(t.reason));t.addEventListener("abort",a,{once:!0}),Promise.resolve(e).then(e=>n(()=>s(e)),e=>n(()=>o(e)))})}function Ye(e){return Fe(A(e))}function Ke(e){return n.isInstance(e)||"string"==typeof e&&e.startsWith(Oe)?E.invalidInput:E.toolFailed}function Qe(){return({steps:e})=>e.at(-1)?.toolResults.some(e=>P(e.output).kind===E.userRejected)??!1}function Xe(e){return/context[_ -]?length|context window|maximum context|token limit|too many tokens|prompt is too long|input is too long/i.test(Fe(e))}function Ze(e){const t=e.inputTokenDetails?.cacheReadTokens,s=e.inputTokenDetails?.cacheWriteTokens,o=e.outputTokenDetails?.reasoningTokens;return{...void 0!==e.inputTokens?{inputTokens:e.inputTokens}:{},...void 0!==e.outputTokens?{outputTokens:e.outputTokens}:{},...void 0!==e.totalTokens?{totalTokens:e.totalTokens}:{},...void 0!==t?{cachedInputTokens:t}:{},...void 0!==s?{cacheWriteTokens:s}:{},...void 0!==o?{reasoningTokens:o}:{}}}function et(e,t){return void 0===e&&void 0===t?void 0:(e??0)+(t??0)}function tt(e,t){const s=et(e.cachedInputTokens,t.cachedInputTokens),o=et(e.cacheWriteTokens,t.cacheWriteTokens),i=et(e.reasoningTokens,t.reasoningTokens);return{inputTokens:(e.inputTokens??0)+(t.inputTokens??0),outputTokens:(e.outputTokens??0)+(t.outputTokens??0),totalTokens:(e.totalTokens??0)+(t.totalTokens??0),...void 0!==s?{cachedInputTokens:s}:{},...void 0!==o?{cacheWriteTokens:o}:{},...void 0!==i?{reasoningTokens:i}:{}}}function st(e,t){return void 0===t?e:void 0===e?t:Math.max(e,t)}function ot(e,t){const s=e.trim(),o=t.trim();return s.length>0&&o.length>0&&o.startsWith(s)}function it(e,t){return void 0!==e?e:T(t)?y.timeout:y.runtime}function nt(e){return e.flatMap(e=>{if("assistant"!==e.role||!Array.isArray(e.content))return[e];const t=e.content.filter(e=>"reasoning"!==e.type);return 0===t.length?[]:t.length===e.content.length?[e]:[{...e,content:t}]})}function at(e,t,s){for(const o of Object.keys(t))e[o]=s}function rt(e,t,s){const o={[u]:te.sessionCommand,[h]:te.sessionPoll,[p]:te.sessionList};for(const i of Object.keys(t)){const t=s.resolve(i),n=t?o[t.toolName]:void 0;n&&(e[i]=n)}}function ct(e,t){const s=[...e];for(let e=s.length-1;e>=0;e-=1){const o=s[e];if("user"===o?.role){s[e]={...o,content:"string"==typeof o.content?`${t}\n\n${o.content}`:[{type:"text",text:t},...o.content]};break}}return s}export class AgentSession{id;model;maxSteps;messages;onPersist;onReplace;onToolExecution;listPersistedToolExecutions;getPersistedToolExecution;listPersistedTranscriptMessages;commitPersistedCompaction;inMemoryToolExecutions=[];inMemoryTranscript=[];legacyV1ActiveSnapshot;compactionResources=new Map;contextWindow;compaction;turnTimeoutMs;onClose;providerOptions;structuredOutputProviderOptions;structuredOutputReasoning;onProviderOptionsChange;debugEvents;policy;systemPrompt;explicitSystemPrompt;capabilityContext;resolveDynamicCapabilityContext;capabilityManifest;lastCapabilityTurnContext;toolRoles;skillSummaries;skillLibrary;skillToolBuilt=!1;toolSourceAgentNames;gate=new L;userInputInteractions=new we;toolCoordinator=new W;tools;registry;userInputToolId;userInputTool;userInputAvailable=!1;sessionManager;sessionManagerInstanceId=t();compactionCheckpoint;emit;activeTurn;closePromise;closed=!1;sessionUsage={inputTokens:0,outputTokens:0,totalTokens:0};lastInputTokens;needsCompaction=!1;constructor(e){this.id=e.id,this.model=e.model,this.maxSteps=e.maxSteps;const t=e.initialMessages?nt(e.initialMessages):[];this.messages=[...Ee(t).messages],this.legacyV1ActiveSnapshot=1===e.initialCheckpoint?.version?Ge(e.initialCheckpoint.id,this.messages):void 0,this.onPersist=e.onPersist,this.onReplace=e.onReplace,this.onToolExecution=e.onToolExecution,this.listPersistedToolExecutions=e.listToolExecutions,this.getPersistedToolExecution=e.getToolExecution,this.listPersistedTranscriptMessages=e.listTranscriptMessages,this.commitPersistedCompaction=e.commitCompaction,this.compactionCheckpoint=e.initialCheckpoint;let s=Be(e.initialCheckpoint).messagesThroughSequence+1;for(const e of this.messages)ze(e)||(this.inMemoryTranscript.push({sequence:s,provenance:ge[0],createdAt:new Date(0).toISOString(),message:e}),s+=1);for(const t of e.initialCheckpoint?.resources??[])this.retainCompactionResource(t);this.contextWindow=e.contextWindow,this.compaction=e.compaction,this.turnTimeoutMs=e.turnTimeoutMs,this.onClose=e.onClose,this.providerOptions=e.providerOptions,this.structuredOutputProviderOptions=e.structuredOutputProviderOptions,this.structuredOutputReasoning=e.structuredOutputReasoning,this.onProviderOptionsChange=e.onProviderOptionsChange,this.debugEvents=e.debugEvents??!1,this.policy=e.policy,this.explicitSystemPrompt=e.systemPrompt,this.resolveDynamicCapabilityContext=e.resolveDynamicCapabilityContext,this.skillLibrary=e.skillLibrary,this.skillSummaries=e.skillLibrary?.list()??[],this.toolSourceAgentNames=new Set(e.sources.map(e=>e.agentName));const o=new x,i={},n=Re({sessionId:this.id,isAvailable:()=>this.userInputAvailable,request:(e,t)=>this.requestUserInput(e,t)},o,this.toolCoordinator);this.userInputToolId=n.id,this.userInputTool=n.tools,at(i,n.tools,te.userInput);const c=e.readCheckpointTranscript?Me(e.readCheckpointTranscript,o,this.toolCoordinator,`thread:${this.id}:transcript`):{};at(i,c,te.transcriptRead);const u=e.skillLibrary?this.buildSkillTools(o):{};at(i,u,te.skill);const p={...e.policy?{policy:e.policy}:{},requestApproval:e=>this.requestApproval(e),emitEvent:e=>this.emit?.(e),coordinator:this.toolCoordinator},h=e.bashClassifier?{classifier:e.bashClassifier}:{},g=e.bash?l(e.bash,o,p,h):{};at(i,g,te.shell),e.bashSession&&(this.sessionManager=new m({maxSessions:e.bashSession.maxSessions,profile:e.bashSession.profile,env:v(e.bashSession.env??process.env),bufferCapacity:e.bashSession.bufferCapacity}));const f=e.bashSession&&this.sessionManager?d({workdir:e.bashSession.workdir,defaultYieldMs:e.bashSession.defaultYieldMs,maxOutputTokens:e.bashSession.maxOutputTokens,...e.bashSession.env?{env:e.bashSession.env}:{}},this.sessionManager,o,p,{...h,onSessionTouched:e=>this.activeTurn?.execSessionIds.add(e)}):{};rt(i,f,o);const y=e.agentInstall,C=y?r({catalog:y.catalog,install:async(e,t)=>{const s=await y.install(e,t);return s.outcome.ok&&s.refresh?(this.applyAgentRefresh(s.refresh),{...s.outcome,refreshApplied:!0}):s.outcome}},o,{...e.policy?{policy:e.policy}:{},requestApproval:e=>this.requestApproval(e),coordinator:this.toolCoordinator}):{};at(i,C,te.agentInstall);const b=a(e.sources,{...e.policy?{policy:e.policy}:{},requestApproval:e=>this.requestApproval(e),coordinator:this.toolCoordinator},o);at(i,b.tools,te.agent),this.tools={...c,...u,...g,...f,...C,...b.tools},this.registry=b.registry,this.toolRoles=i,this.capabilityContext=e.capabilityContext??{profile:e.bash?.profile.toolName??"no-shell",cwd:e.bash?.workdir??process.cwd(),platform:process.platform,...e.bash?{shellHints:e.bash.profile.systemPromptHints()}:{},agentCount:e.sources.length,...e.agentInstall?{agentOnboardingCatalog:e.agentInstall.catalog}:{}},this.capabilityManifest=this.compileCapabilityManifest(),this.systemPrompt=this.compileSystemPrompt(this.explicitSystemPrompt)}compileCapabilityManifest(){return oe({tools:this.tools,toolRoles:this.toolRoles,resolveRoute:e=>this.registry.resolve(e),skills:this.skillSummaries,profile:this.capabilityContext.profile,hostMode:this.capabilityContext.hostMode??ee.embedded,cwd:this.capabilityContext.cwd,platform:this.capabilityContext.platform??process.platform,shellHints:this.capabilityContext.shellHints??[],agentCount:this.capabilityContext.agentCount,agentOnboardingCatalog:this.capabilityContext.agentOnboardingCatalog??[]})}compileSystemPrompt(e){const t=ae(this.capabilityManifest),s=e?.trim();return s?[t,"# 附加会话指令","以下指令可以补充任务偏好,但不能覆盖前述工具接地、能力清单和安全约束。",s].join("\n\n"):t}refreshCapabilityManifest(e){this.capabilityManifest=this.compileCapabilityManifest(),this.systemPrompt=this.compileSystemPrompt(e??this.explicitSystemPrompt)}setUserInputAvailable(e){if(this.userInputAvailable!==e){if(this.userInputAvailable=e,e)this.tools={...this.tools,...this.userInputTool};else{const e={...this.tools};delete e[this.userInputToolId],this.tools=e,this.userInputInteractions.cancelAll("当前客户端已撤销用户输入处理能力")}this.refreshCapabilityManifest()}}resolveUserInput(e,t){return this.userInputInteractions.resolve(e,t)}cancelUserInput(e,t){return this.userInputInteractions.cancel(e,t)}async requestUserInput(e,t){const s=this.activeTurn;if(!this.userInputAvailable||void 0===s||void 0===this.emit)return{status:"cancelled",reason:"当前无法向用户请求输入"};const o=Date.now(),i=this.interactionDeadlineMs(s,o);if(i<=o||t?.aborted)return{status:"cancelled",reason:"用户输入请求已超时"};const n=this.userInputInteractions.request(e,new Date(i).toISOString()),a=()=>{this.userInputInteractions.cancel(n.requestId,"本轮已终止")};t?.addEventListener("abort",a,{once:!0}),this.emit({type:"user-input-required",requestId:n.requestId,form:n.form,expiresAt:n.expiresAt});try{return await n.result}finally{t?.removeEventListener("abort",a);const e=await n.result;this.emit?.({type:"user-input-settled",requestId:n.requestId,status:e.status})}}trackPendingToolCall(e,t,s,o,i){const n=e.pendingToolCalls.get(t);if(n&&void 0===i)return n;const a=this.registry.resolve(s),r={toolCallId:t,agentName:a?.agentName??s,toolName:a?.toolName??s,input:o,potentialSideEffect:!0!==a?.annotations?.readOnlyHint||!0===a.annotations.destructiveHint,resources:i??n?.resources??[]};return e.pendingToolCalls.set(t,r),r}buildSkillTools(e){return this.skillToolBuilt=!0,c(()=>{if(!this.skillLibrary)throw new Error("skill library 不可用");return this.skillLibrary},e,this.toolCoordinator)}applyAgentRefresh(e){if(!this.toolSourceAgentNames.has(e.source.agentName)){const t=a([e.source],{...this.policy?{policy:this.policy}:{},requestApproval:e=>this.requestApproval(e),coordinator:this.toolCoordinator},this.registry);at(this.toolRoles,t.tools,te.agent),this.tools={...this.tools,...t.tools},this.toolSourceAgentNames.add(e.source.agentName)}if(e.skillLibrary&&(this.skillLibrary=e.skillLibrary,this.skillSummaries=e.skillLibrary.list(),!this.skillToolBuilt)){const e=this.buildSkillTools(this.registry);at(this.toolRoles,e,te.skill),this.tools={...this.tools,...e}}e.capabilityContext&&(this.capabilityContext=e.capabilityContext),this.refreshCapabilityManifest(e.systemPrompt)}async*send(e){if(this.closed)throw new Error("session is closed");if(this.activeTurn)throw new Error("session already has an active turn");const t=new G;this.emit=e=>t.push(e);const s=De();this.activeTurn=s,this.runTurn(t,s,e).catch(e=>{t.push({type:"error",stage:"execute",message:Fe(e)}),t.close()});try{for await(const e of t)yield e}finally{this.activeTurn===s&&this.abandonTurn(s),void 0!==this.emit&&(this.emit=void 0)}}async*compact(e="manual"){if(this.closed)throw new Error("session is closed");if(this.activeTurn)throw new Error("session already has an active turn");const t=new G;this.emit=e=>t.push(e);const s=De();this.activeTurn=s,this.runCompactionTurn(t,s,e).catch(e=>{t.push({type:"error",stage:"plan",message:Fe(e)}),t.close()});try{for await(const e of t)yield e}finally{this.activeTurn===s&&this.abandonTurn(s),void 0!==this.emit&&(this.emit=void 0)}}async runTurn(e,s,n){const a=Date.now();let r,c;try{if(this.debug(e,"turn","start",a,{messages:this.messages.length,tools:Object.keys(this.tools).length,maxSteps:this.maxSteps,...void 0!==this.contextWindow?{contextWindow:this.contextWindow}:{},...void 0!==this.lastInputTokens?{lastInputTokens:this.lastInputTokens}:{}}),this.shouldAutoCompact()){this.debug(e,"compaction","auto requested before turn",a,{messages:this.messages.length,...void 0!==this.lastInputTokens?{lastInputTokens:this.lastInputTokens}:{}});try{await this.runCompaction(e,"auto",s)}catch(t){return void e.push({type:"error",stage:"plan",message:Fe(t)})}}if(s.aborted||s.abortController.signal.aborted)return r=this.messages.length,this.messages.push({role:"user",content:n}),void this.persistCancelledTurn(e,s,r,[],a);e.push({type:"message-start",messageId:t()}),void 0!==this.turnTimeoutMs&&(s.expiresAt=new Date(Date.now()+this.turnTimeoutMs).toISOString(),c=setTimeout(()=>{s.abortController.signal.aborted||(this.captureCancellationActivity(s),s.aborted=!0,s.cancellationReason=y.timeout,this.gate.abortAll("本轮运行超时"),this.userInputInteractions.cancelAll("本轮运行超时"),s.abortController.abort(C))},this.turnTimeoutMs));let l=0;const u=H({rawInput:n,skillSummaries:this.skillSummaries,skillLibrary:this.skillLibrary}),p={role:"user",content:n},h=u.skillNames.length>0?B(p,u):p;let d={};try{d=await He(this.resolveDynamicCapabilityContext?.(s.abortController.signal)??{},s.abortController.signal)??{}}catch(t){if(this.isTurnAborted(s))return r=this.messages.length,this.messages.push(h),s.cancellationReason=it(s.cancellationReason,s.abortController.signal.reason??t),void this.persistCancelledTurn(e,s,r,[],a);this.debug(e,"turn","dynamic capability context unavailable",a,{message:Fe(t)})}const m=se(this.capabilityManifest,{explicitSkillNames:u.skillNames,...d.ruleIds?{ruleIds:d.ruleIds}:{},...d.vcs?{vcs:d.vcs}:{},sessions:(this.sessionManager?.list()??[]).map(e=>({sessionId:e.sessionId,state:e.state}))});this.lastCapabilityTurnContext=m;const g=ne(m);for(;;){r=this.messages.length,this.messages.push(h);const t=ie(this.capabilityManifest,te.transcriptRead),n=this.compactionCheckpoint?re(this.compactionCheckpoint,this.sessionManagerInstanceId,t):void 0,c=K(S(X(this.messages))),p=ct(u.skillNames.length>0?J(c,u):c,n?`${g}\n\n${n}`:g);this.debug(e,"model","calling streamText",a,{messages:this.messages.length,tools:Object.keys(this.tools).length,contextRecoveryAttempts:l,...void 0!==this.turnTimeoutMs?{timeoutMs:this.turnTimeoutMs}:{}});let d=[];const m=()=>i({model:this.model,system:this.systemPrompt,messages:p,tools:this.tools,stopWhen:[o(this.maxSteps),Qe()],toolApproval:async({toolCall:e})=>{this.trackPendingToolCall(s,e.toolCallId,e.toolName,e.input),await this.toolCoordinator.prepare(e.toolCallId,e.toolName,e.input)},onLanguageModelCallStart:({callId:e})=>this.toolCoordinator.startBatch(e),onLanguageModelCallEnd:({callId:e,content:t})=>this.toolCoordinator.sealBatch(e,t.flatMap(e=>"tool-call"!==e.type||!0===e.providerExecuted||"invalid"in e&&!0===e.invalid?[]:[{toolCallId:e.toolCallId,toolId:e.toolName}])),abortSignal:s.abortController.signal,...this.providerOptions?{providerOptions:this.providerOptions}:{},onError:()=>{},onStepEnd:e=>{We(s,e),d=Le(s)},onAbort:({steps:e})=>{for(const t of e)We(s,t);d=Le(s)}});let v;try{v=m()}catch(t){if(this.isTurnAborted(s)||T(t))return s.aborted=!0,s.cancellationReason=it(s.cancellationReason,t),void this.persistCancelledTurn(e,s,r,[],a);if(!Xe(t))throw t;this.needsCompaction=!0,this.messages.splice(r);const o=l<1,i=!!o&&await this.recoverFromContextError(e,s);if(this.isTurnAborted(s))return r=this.messages.length,this.messages.push(h),void this.persistCancelledTurn(e,s,r,[],a);if(i&&o){l+=1;continue}return this.persistContextFailure(e,h,!1,!1,a),void e.push({type:"error",stage:"execute",message:Fe(t)})}this.debug(e,"model","streamText returned",a);let f,C,b,k,x,I,M="",A="",P=!1,O=0,$=!1,j=!1;const D=this.scheduleDebug(e,"model","waiting for first stream event",a,{messages:this.messages.length});try{for await(const t of v.fullStream){if(this.closed){s.aborted=!0,s.cancellationReason??=y.runtime;break}switch(j||(j=!0,this.clearDebugTimer(D),this.debug(e,"model","first stream event",a,{part:t.type})),t.type){case"reasoning-start":e.push({type:"reasoning-start",reasoningId:t.id});break;case"reasoning-delta":e.push({type:"reasoning-delta",reasoningId:t.id,delta:t.text});break;case"reasoning-end":e.push({type:"reasoning-end",reasoningId:t.id});break;case"text-delta":if(!P){const s=A+t.text;if(ot(s,u.userPrompt)){A=s;break}if(A.length>0){const s=A+t.text;A="",M+=s,e.push({type:"text-delta",delta:s});break}}M+=t.text,e.push({type:"text-delta",delta:t.text});break;case"tool-call":{P=!0,A="";const o=this.trackPendingToolCall(s,t.toolCallId,t.toolName,t.input,this.toolCoordinator.describeResources(t.toolName,t.input));e.push({type:"tool-call",toolCallId:t.toolCallId,agentName:o.agentName,toolName:o.toolName,input:t.input});break}case"tool-result":{const o=this.registry.resolve(t.toolName),i=s.pendingToolCalls.get(t.toolCallId),n=R(t.output)?t.output:q(t.output),a=n.outcome,r=n.display,c=N({toolCallId:t.toolCallId,agentName:o?.agentName??t.toolName,toolName:o?.toolName??t.toolName,input:i?.input,result:n});this.persistToolExecution(c,s),!0===i?.potentialSideEffect&&a.kind!==E.userRejected&&a.kind!==E.policyDenied&&a.kind!==E.invalidInput&&(s.hadPotentialSideEffects=!0),a.kind===E.success&&void 0!==i&&this.rememberCompactionResources(c,i.resources),s.pendingToolCalls.delete(t.toolCallId),e.push({type:"tool-result",toolCallId:t.toolCallId,agentName:o?.agentName??t.toolName,toolName:o?.toolName??t.toolName,executionId:c.id,outcome:a,display:r,output:r,isError:a.kind!==E.success}),s.aborted||s.abortController.signal.aborted||a.kind!==E.userRejected||(I=Ye(t.output));break}case"tool-error":{const o=this.registry.resolve(t.toolName),i=Ye(t.error),n=w(Ke(t.error),i,{raw:t.error}),a=N({toolCallId:t.toolCallId,agentName:o?.agentName??t.toolName,toolName:o?.toolName??t.toolName,input:s.pendingToolCalls.get(t.toolCallId)?.input,result:n});this.persistToolExecution(a,s),!0===s.pendingToolCalls.get(t.toolCallId)?.potentialSideEffect&&n.outcome.kind!==E.invalidInput&&(s.hadPotentialSideEffects=!0),s.pendingToolCalls.delete(t.toolCallId),e.push({type:"tool-result",toolCallId:t.toolCallId,agentName:o?.agentName??t.toolName,toolName:o?.toolName??t.toolName,executionId:a.id,outcome:n.outcome,display:n.display,output:i,isError:!0});break}case"finish-step":{const s=Ze(t.usage);C=st(C,s.inputTokens),O+=1,k=t.finishReason;const o=t.performance.outputTokensPerSecond??t.performance.effectiveOutputTokensPerSecond;void 0!==o&&Number.isFinite(o)&&(b=o),e.push({type:"step-finish",finishReason:t.finishReason,usage:s});break}case"finish":!P&&A.length>0&&(M+=A,e.push({type:"text-delta",delta:A}),A=""),f=Ze(t.totalUsage);break;case"error":if(this.isTurnAborted(s)||T(t.error)){s.aborted=!0,s.cancellationReason=it(s.cancellationReason,t.error);break}$=Xe(t.error),$&&(this.needsCompaction=!0),x=Fe(t.error);break;case"abort":s.aborted=!0,s.cancellationReason=it(s.cancellationReason,t.reason)}}}catch(e){this.isTurnAborted(s)||T(e)?(s.aborted=!0,s.cancellationReason=it(s.cancellationReason,e)):($=Xe(e),$&&(this.needsCompaction=!0),x=Fe(e))}finally{this.clearDebugTimer(D)}if(this.debug(e,"model","fullStream finished",a,{textChars:M.length}),void 0!==x){if(this.messages.splice(r),$){const t=0===M.length&&!P,o=t&&l<1,i=!(!o&&t)&&await this.recoverFromContextError(e,s);if(this.isTurnAborted(s))return r=this.messages.length,this.messages.push(h),void this.persistCancelledTurn(e,s,r,[],a);if(t&&i&&o){l+=1;continue}const n=t?"":";本次尝试已有内容或操作开始执行,为避免重复执行,未自动重试";return this.persistContextFailure(e,h,M.length>0,P,a),void e.push({type:"error",stage:"execute",message:`${x}${n}`})}return void e.push({type:"error",stage:"execute",message:x})}if(s.aborted||s.abortController.signal.aborted)return s.cancellationReason=it(s.cancellationReason,s.abortController.signal.reason),void this.persistCancelledTurn(e,s,r,d,a);let W;this.debug(e,"model","awaiting response messages",a);const L=this.scheduleDebug(e,"model","still awaiting response messages",a);try{W=(await v.steps).flatMap(e=>e.response.messages)}catch(t){if(this.clearDebugTimer(L),this.isTurnAborted(s)||T(t))return s.aborted=!0,s.cancellationReason=it(s.cancellationReason,t),void this.persistCancelledTurn(e,s,r,d,a);const o=Xe(t);if(o&&(this.needsCompaction=!0),this.messages.splice(r),o){const o=0===M.length&&!P,i=o&&l<1,n=!(!i&&o)&&await this.recoverFromContextError(e,s);if(this.isTurnAborted(s))return r=this.messages.length,this.messages.push(h),void this.persistCancelledTurn(e,s,r,[],a);if(o&&n&&i){l+=1;continue}const c=o?"":";本次尝试已有内容或操作开始执行,为避免重复执行,未自动重试";return this.persistContextFailure(e,h,M.length>0,P,a),void e.push({type:"error",stage:"execute",message:`${Fe(t)}${c}`})}return void e.push({type:"error",stage:"execute",message:Fe(t)})}finally{this.clearDebugTimer(L)}if(this.debug(e,"model","response messages ready",a,{responseMessages:W.length}),this.isTurnAborted(s))return s.cancellationReason=it(s.cancellationReason,s.abortController.signal.reason),void this.persistCancelledTurn(e,s,r,d,a);const F=nt(W);if(this.messages.push(...F),void 0!==I){const t=0===M.length?I:`\n${I}`;M+=t,e.push({type:"text-delta",delta:t}),this.messages.push({role:"assistant",content:I})}this.debug(e,"persist","persisting messages",a,{appendedMessages:this.messages.length-r}),this.persistMessages(this.messages.slice(r)),this.debug(e,"persist","messages persisted",a,{totalMessages:this.messages.length}),f&&(this.sessionUsage=tt(this.sessionUsage,f));const U=C??f?.inputTokens;void 0!==U&&(this.lastInputTokens=U);const V=O>=this.maxSteps&&"tool-calls"===k;return void e.push({type:"message-finish",text:M,...f?{totalUsage:f}:{},sessionUsage:{...this.sessionUsage},...void 0!==C?{contextInputTokens:C}:{},...void 0!==b?{outputTokensPerSecond:b}:{},...V?{stoppedAtStepLimit:!0}:{}})}}catch(t){if(this.isTurnAborted(s)||T(t))return s.aborted=!0,s.cancellationReason=it(s.cancellationReason,s.abortController.signal.reason??t),void(void 0!==r?this.persistCancelledTurn(e,s,r,[],a):this.emitCancellation(e,s));void 0!==r&&this.messages.splice(r),this.debug(e,"turn","error",a,{message:Fe(t)}),e.push({type:"error",stage:"execute",message:Fe(t)})}finally{void 0!==c&&clearTimeout(c),this.toolCoordinator.finishTurn(),this.activeTurn===s&&(this.activeTurn=void 0),e.close()}}persistMessages(e){if(this.onPersist?.(e),void 0!==this.listPersistedTranscriptMessages)return;let t=(this.inMemoryTranscript.at(-1)?.sequence??-1)+1;const s=(new Date).toISOString();for(const o of e)ze(o)||(this.inMemoryTranscript.push({sequence:t,provenance:ge[0],createdAt:s,message:o}),t+=1)}persistContextFailure(e,t,s,o,i){const n=["本轮因上下文窗口溢出而中断,未自动重放。"];s&&n.push("本轮已产生部分文本,持久历史仅保留此中断标记。"),o&&n.push("本轮已有操作开始执行,部分结果可能已经生效且不会自动撤销,请先检查实际结果。");const a=this.messages.length;this.messages.push(t),this.messages.push({role:"assistant",content:n.join("")}),this.debug(e,"persist","persisting context-overflow marker",i,{hadToolActivity:o,producedText:s});try{this.persistMessages(this.messages.slice(a))}catch(t){this.messages.splice(a),e.push({type:"error",stage:"execute",message:`上下文溢出记录持久化失败: ${Fe(t)}`})}}persistToolExecution(e,t){this.onToolExecution?.(e),this.inMemoryToolExecutions.push(e),t.toolExecutions.push(e)}rememberCompactionResources(e,t){for(const s of t){const t={key:je(s.key),mode:s.mode,evidenceToolCallId:e.toolCallId,evidenceExecutionId:e.id};this.retainCompactionResource(t)}}retainCompactionResource(e){const t=this.compactionResources.get(e.key),s=void 0===t||e.mode===D.write||t.mode!==D.write?e:t;this.compactionResources.delete(e.key),this.compactionResources.set(e.key,s)}interactionDeadlineMs(e,t){const s=void 0===e.expiresAt?Number.POSITIVE_INFINITY:Date.parse(e.expiresAt);return Math.min(t+Ae,Number.isFinite(s)?s:Number.POSITIVE_INFINITY)}requestApproval(e){const s=t(),o=this.gate.request(s);if(void 0===this.emit)return this.gate.resolve(s,{approved:!1,reason:"approval event could not be delivered"}),o;const i=void 0===this.activeTurn?void 0:new Date(this.interactionDeadlineMs(this.activeTurn,Date.now())).toISOString();return this.emit({type:"confirmation-required",approvalId:s,agentName:e.agentName,toolName:e.toolName,input:e.input,...void 0!==i?{expiresAt:i}:{},...e.reason?{reason:e.reason}:{},...void 0!==e.explanation?{explanation:e.explanation}:{}}),o}approve(e){return this.gate.resolve(e,{approved:!0})}reject(e,t){return this.gate.resolve(e,{approved:!1,...t?{reason:t}:{}})}getMessages(){return K(Z(this.messages))}getToolExecutions(e={},t=!1){const s=this.listPersistedToolExecutions?this.listPersistedToolExecutions(e):this.inMemoryToolExecutions.map((e,t)=>({...e,sequence:t})).filter(t=>t.sequence>(e.afterSequence??-1)&&(void 0===e.toolCallId||t.toolCallId===e.toolCallId)).slice(0,e.limit??100);return t?s:s.map(e=>({...j(e),sequence:e.sequence}))}getToolExecution(e,t=!1){const s=this.getPersistedToolExecution?.(e),o=s??(()=>{const t=this.inMemoryToolExecutions.findIndex(t=>t.id===e),s=this.inMemoryToolExecutions[t];return s?{...s,sequence:t}:void 0})();return!o||t?o:{...j(o),sequence:o.sequence}}getCapabilityManifest(){return structuredClone(this.capabilityManifest)}getCapabilityTurnContext(){return this.lastCapabilityTurnContext?structuredClone(this.lastCapabilityTurnContext):void 0}getContextWindow(){return this.contextWindow}getSessionUsage(){return{...this.sessionUsage}}getSkillSummaries(){return this.skillSummaries}setProviderOptions(e){this.providerOptions=e,this.onProviderOptionsChange?.(e)}shouldAutoCompact(){const e=this.compaction;return void 0!==e&&e.enabled&&(this.needsCompaction||void 0!==this.contextWindow&&void 0!==this.lastInputTokens&&this.lastInputTokens/this.contextWindow>=e.threshold)}listCompactionTranscriptEvidence(){const e=this.listPersistedTranscriptMessages;if(void 0===e)return[...this.inMemoryTranscript];const t=[];let s=-1;for(;;){const o=e({afterSequence:s,limit:500});t.push(...o);const i=o.at(-1)?.sequence;if(o.length<500||void 0===i||i<=s)break;s=i}return t}listCompactionToolEvidence(){const e=this.listPersistedToolExecutions;if(void 0===e)return this.inMemoryToolExecutions.map((e,t)=>({...e,sequence:t}));const t=[];let s=-1;for(;;){const o=e({afterSequence:s,limit:500});t.push(...o);const i=o.at(-1)?.sequence;if(o.length<500||void 0===i||i<=s)break;s=i}return t}latestExplicitSkillNames(e,t){if(void 0===t)return this.compactionCheckpoint?.context.explicitSkillNames??[];const s=e.find(e=>e.sequence===t);return void 0===s?[]:Y(s.message)?.snapshot.skillNames??[]}currentCompactionRunningWork(){const e=(this.compactionCheckpoint?.runningWork??[]).filter(e=>e.managerInstanceId!==this.sessionManagerInstanceId).map(e=>({...e,recoverability:"live"===e.recoverability?"stale":e.recoverability})),t=(new Date).toISOString();return[...e,...(this.sessionManager?.list()??[]).map(e=>({managerInstanceId:this.sessionManagerInstanceId,sessionId:e.sessionId,state:e.state,recoverability:g(e.state)?"unavailable":"live",commandPreview:e.commandPreview,workdir:e.workdir,observedAt:t,wallTimeMs:e.wallTimeMs,...void 0!==e.exitCode?{exitCode:e.exitCode}:{},...void 0!==e.terminationCause?{terminationCause:e.terminationCause}:{},...void 0!==e.cleanupError?{cleanupError:e.cleanupError}:{}}))].slice(-128)}captureCompactionEvidence(){const e=this.listCompactionTranscriptEvidence(),t=this.listCompactionToolEvidence(),s=[...this.compactionResources.values()].slice(-256),o=[...this.currentCompactionRunningWork()],i="legacy_snapshot"===this.compactionCheckpoint?.transcript.completeness||e.some(e=>"legacy_snapshot"===e.provenance)?"legacy_snapshot":"complete",n=this.compactionCheckpoint?.goal,a=de(e),r=a??n,c=void 0!==a&&(void 0===n||a.sourceSequence>n.sourceSequence)?a.sourceSequence:void 0,l=this.compactionCheckpoint?.version===le?this.compactionCheckpoint.semanticState:void 0,u=Te(l,this.compactionCheckpoint?.constraints??[]),p=1===this.compactionCheckpoint?.version,h=void 0!==this.legacyV1ActiveSnapshot&&Je(this.legacyV1ActiveSnapshot,this.compactionCheckpoint,this.messages),d=p?h&&void 0!==this.legacyV1ActiveSnapshot?Se(u,{checkpointId:this.legacyV1ActiveSnapshot.checkpointId,fragments:this.legacyV1ActiveSnapshot.fragments}):{state:u,requiredItemIds:[],transcriptFragments:[],complete:!1}:{state:u,requiredItemIds:[],transcriptFragments:[],complete:!0},m=d.state,g=Be(this.compactionCheckpoint),v=g.messagesThroughSequence,f=g.toolExecutionsThroughSequence,y=e.filter(e=>e.sequence>v),C=new Set(y.filter(e=>e.provenance===ge[1]&&ze(e.message)).map(e=>e.sequence)),b=void 0===r?void 0:e.find(e=>e.sequence===r.sourceSequence),k=fe({messages:[...y.filter(e=>!C.has(e.sequence)),...void 0===b||y.includes(b)?[]:[b]].map(e=>({sequence:e.sequence,role:e.message.role,summary:Ue(e)})),toolExecutions:t.filter(e=>e.sequence>f).map(_e),resources:s.slice().reverse().map(e=>({key:e.key,mode:e.mode})),runningSessions:[]}),T=ve(k,m,48e3);return{transcript:e,toolExecutions:t,resources:s,runningWork:o,completeness:i,goal:r,newGoalSourceSequence:c,previousSemanticState:m,registry:k,modelContext:T.prompt,presentedEvidenceIds:T.includedEvidenceIds,expectedActiveMessages:[...this.messages],expectedLatestCheckpointId:this.compactionCheckpoint?.id,previousSemanticEvidenceWatermarks:g,autoCoveredMessageSequences:C,legacySnapshotMigrationComplete:d.complete,legacySnapshotRequiredItemIds:d.requiredItemIds,legacySnapshotTranscriptFragments:d.transcriptFragments,legacySnapshotRemovableRawMessageCount:d.complete&&h?this.legacyV1ActiveSnapshot?.removableRawMessageCount??0:0,evidenceWatermarks:{transcriptMessagesThroughSequence:Math.max(this.compactionCheckpoint?.transcript.messages.throughSequence??-1,e.at(-1)?.sequence??-1),toolExecutionsThroughSequence:Math.max(this.compactionCheckpoint?.transcript.toolExecutions.throughSequence??-1,t.at(-1)?.sequence??-1)}}}buildCompactionDraft(t,s,o,i){const n=xe({draft:s??$e,evidenceRegistry:t.registry,presentedEvidenceIds:t.presentedEvidenceIds,...void 0!==t.previousSemanticState?{previousState:t.previousSemanticState}:{},...void 0!==t.goal?{harnessGoal:{verbatimRequest:t.goal.verbatimRequest,sourceSequence:t.goal.sourceSequence}}:{}});let a=ye(t.previousSemanticState,n,{startsNewGoalScope:n.startsNewGoalScope});if(void 0===s){const e=me(t.transcript,this.compactionCheckpoint?.constraints??[]),s=JSON.stringify(e)!==JSON.stringify(this.compactionCheckpoint?.constraints??[]);a=Ce(a,e);const o=void 0===this.compactionCheckpoint?.goal?t.goal:void 0===t.goal||void 0===t.newGoalSourceSequence||s?this.compactionCheckpoint.goal:t.goal;a=be(a,o)}const r=a.constraints.flatMap(e=>{const t=e.provenance.find(e=>"message"===e.kind)?.messageSequence;return null==t?[]:[{quote:e.text,sourceSequence:t}]}),c=a.goal?.provenance.find(e=>"message"===e.kind)?.messageSequence,l=(null==c?void 0:de(t.transcript.filter(e=>e.sequence===c)))??this.compactionCheckpoint?.goal??t.goal,u=void 0!==l&&l.sourceSequence!==this.compactionCheckpoint?.goal?.sourceSequence?l.sourceSequence:void 0,p=o?ke(a):void 0,h=void 0!==p?pe(p):void 0!==i?{status:"fallback",reason:i}:{status:"skipped"},d=new Set(he(a).items.map(e=>e.itemId)),m=0===t.legacySnapshotRequiredItemIds.length||t.legacySnapshotRequiredItemIds.every(e=>d.has(e)),g=ce(t.transcript.map(e=>e.message),t.toolExecutions,32,t.completeness);return{draft:{...l?{goal:l}:{},constraints:[...r],resources:[...t.resources],toolState:g,runningWork:[...t.runningWork],context:{cwd:this.capabilityManifest.dynamicContext.cwd,stableRuleIds:[...this.capabilityManifest.stableContext.rules],systemPromptSha256:e("sha256").update(this.systemPrompt).digest("hex"),skills:this.capabilityManifest.skills.map(e=>({name:e.name,source:e.source})),explicitSkillNames:[...this.latestExplicitSkillNames(t.transcript,u)]},summary:h},semanticState:a,semanticSummaryText:p,semanticRejectionCount:n.rejections.length,legacySnapshotReminderCoverageComplete:m,coveredEvidenceIds:n.coveredEvidenceIds,expectedActiveMessages:t.expectedActiveMessages,expectedLatestCheckpointId:t.expectedLatestCheckpointId,evidenceWatermarks:t.evidenceWatermarks,legacySnapshotTranscriptFragments:t.legacySnapshotTranscriptFragments}}async runCompactionTurn(e,t,s){try{await this.runCompaction(e,s,t,!0)}catch(t){e.push({type:"error",stage:"plan",message:Fe(t)})}finally{this.activeTurn===t&&(this.activeTurn=void 0),e.close()}}advanceCompactionSemanticEvidenceWatermarks(e,t){const s=e.previousSemanticEvidenceWatermarks;if(0===t.length)return s;const o=new Set(t.filter(t=>e.presentedEvidenceIds.includes(t))),i=new Map(e.registry.flatMap(e=>"message"===e.provenance.kind&&null!==e.provenance.messageSequence?[[e.provenance.messageSequence,e.evidenceId]]:[]));let n=s.messagesThroughSequence;for(let t=s.messagesThroughSequence+1;;t+=1){if(e.autoCoveredMessageSequences.has(t)){n=t;continue}const s=i.get(t);if(void 0===s||!o.has(s))break;n=t}const a=new Map(e.registry.flatMap(e=>"tool_execution"===e.provenance.kind&&null!==e.provenance.toolExecutionId?[[e.provenance.toolExecutionId,e.evidenceId]]:[])),r=new Map(e.toolExecutions.map(e=>[e.sequence,e]));let c=s.toolExecutionsThroughSequence;for(let e=s.toolExecutionsThroughSequence+1;;e+=1){const t=r.get(e);if(void 0===t)break;const s=a.get(t.id);if(void 0===s||!o.has(s))break;c=e}return{messagesThroughSequence:n,toolExecutionsThroughSequence:c}}countContiguousPresentedMessageEvidence(e){if(!e.legacySnapshotMigrationComplete)return 0;const t=new Set(e.presentedEvidenceIds),s=new Map(e.registry.flatMap(e=>"message"===e.provenance.kind&&null!==e.provenance.messageSequence?[[e.provenance.messageSequence,e.evidenceId]]:[]));let o=e.legacySnapshotRemovableRawMessageCount;for(let i=e.previousSemanticEvidenceWatermarks.messagesThroughSequence+1;;i+=1){if(e.autoCoveredMessageSequences.has(i))continue;const n=s.get(i);if(void 0===n||!t.has(n))break;o+=1}return o}async runCompaction(e,t,s,o=!1){const i=Date.now(),n=this.compaction,a=n?.strategy??"summarize";if(this.debug(e,"compaction","start",i,{reason:t,messages:this.messages.length,timeoutMs:n?.timeoutMs??12e4,maxOutputTokens:n?.maxOutputTokens??8192}),e.push({type:"compaction-start",reason:t}),this.isTurnAborted(s))return o&&void 0!==s&&this.emitCancellation(e,s),!1;if(!n)return e.push({type:"context-compacted",reason:t,strategy:a,removed:0,kept:this.messages.length}),!1;const r=this.lastInputTokens;let c,l=n.strategy;const u=s?.abortController.signal,p=Date.now(),h=this.captureCompactionEvidence();if(this.debug(e,"compaction","evidence ready",p,{transcriptMessages:h.transcript.length,toolExecutions:h.toolExecutions.length}),1===this.compactionCheckpoint?.version&&void 0===this.commitPersistedCompaction)return this.debug(e,"compaction","legacy V1 snapshot requires durable transcript",i),e.push({type:"context-compacted",reason:t,strategy:l,removed:0,kept:this.messages.length}),!1;if(!h.legacySnapshotMigrationComplete)return this.debug(e,"compaction","legacy V1 snapshot migration incomplete",i),e.push({type:"context-compacted",reason:t,strategy:l,removed:0,kept:this.messages.length}),!1;const d=this.countContiguousPresentedMessageEvidence(h);let m;try{const t=Date.now();try{m=await U({messages:this.messages,strategy:l,keepRecentTurns:n.keepRecentTurns,keepRecentTokens:n.keepRecentTokens,model:this.model,semanticEvidencePrompt:h.modelContext,maxRemovedTranscriptMessages:d,...void 0!==n.timeoutMs?{timeoutMs:n.timeoutMs}:{},...void 0!==n.maxOutputTokens?{maxOutputTokens:n.maxOutputTokens}:{},...this.structuredOutputReasoning?{structuredOutputReasoning:this.structuredOutputReasoning}:{},...this.structuredOutputProviderOptions?{structuredOutputProviderOptions:this.structuredOutputProviderOptions}:{},...u?{abortSignal:u}:{}})}finally{this.debug(e,"compaction","draft generation finished",t,{strategy:l})}if("summarize"===l&&m.removed>0&&void 0===m.semanticDraft)throw new V(F.missingObject,"structured compaction draft is missing")}catch(t){if(this.isTurnAborted(s))return o&&void 0!==s&&this.emitCancellation(e,s),!1;if("summarize"!==l||!V.isInstance(t))throw t;this.debug(e,"compaction","summarize failed, fallback to truncate",i,{message:Fe(t)}),c="structured checkpoint generation failed",l="truncate";const a=Date.now();m=await U({messages:this.messages,strategy:l,keepRecentTurns:n.keepRecentTurns,keepRecentTokens:n.keepRecentTokens,model:this.model,maxRemovedTranscriptMessages:d,...u?{abortSignal:u}:{}}),this.debug(e,"compaction","truncate fallback finished",a)}if(this.isTurnAborted(s))return o&&void 0!==s&&this.emitCancellation(e,s),!1;const g=m.removed>0||m.truncatedTools>0,v=Date.now(),f=g?this.buildCompactionDraft(h,m.semanticDraft,"summarize"===l&&m.removed>0,c):void 0;if(this.debug(e,"compaction","checkpoint validation finished",v,{semanticRejections:f?.semanticRejectionCount??0}),void 0!==f&&f.semanticRejectionCount>0&&this.debug(e,"compaction","rejected ungrounded semantic claims",i,{count:f.semanticRejectionCount}),void 0!==f&&!f.legacySnapshotReminderCoverageComplete)return this.debug(e,"compaction","legacy V1 snapshot exceeds reminder projection",i),e.push({type:"context-compacted",reason:t,strategy:l,removed:0,kept:this.messages.length}),!1;const y=Ee(m.messages),C=[...y.messages];if(y.status===Ie.repaired&&this.debug(e,"compaction","repaired malformed active Tool protocol",i,{removedToolCallIds:y.removedToolCallIds.join(","),removedToolResultIds:y.removedToolResultIds.join(",")}),1===this.compactionCheckpoint?.version&&C.some(ze))return this.debug(e,"compaction","legacy V1 snapshot remains in active history",i),e.push({type:"context-compacted",reason:t,strategy:l,removed:0,kept:this.messages.length}),!1;const b=e=>Buffer.byteLength(JSON.stringify(e),"utf8"),k=g&&b(C)<b(this.messages),T=k?C:[...this.messages],S=k?this.advanceCompactionSemanticEvidenceWatermarks(h,f?.coveredEvidenceIds??[]):h.previousSemanticEvidenceWatermarks;let x;if(k){const t=Date.now();if(void 0!==this.commitPersistedCompaction){if(void 0===f)throw new Error("compaction checkpoint snapshot is missing");x=this.commitPersistedCompaction({messages:T,expectedActiveMessages:f.expectedActiveMessages,expectedLatestCheckpointId:f.expectedLatestCheckpointId,draft:f.draft,semanticState:f.semanticState,semanticEvidenceWatermarks:S,evidenceWatermarks:f.evidenceWatermarks,...f.legacySnapshotTranscriptFragments.length>0?{legacySnapshotTranscriptFragments:f.legacySnapshotTranscriptFragments}:{}})}else{if(void 0===f)throw new Error("compaction checkpoint snapshot is missing");const e=this.compactionCheckpoint;x=ue({draft:f.draft,semanticState:f.semanticState,semanticEvidence:S,generation:(e?.generation??0)+1,transcript:{messages:{fromSequenceExclusive:e?.transcript.messages.throughSequence??-1,throughSequence:f.evidenceWatermarks.transcriptMessagesThroughSequence},toolExecutions:{fromSequenceExclusive:e?.transcript.toolExecutions.throughSequence??-1,throughSequence:f.evidenceWatermarks.toolExecutionsThroughSequence},completeness:h.completeness},...void 0!==e?{previousCheckpointId:e.id}:{}}),this.onReplace?.(T)}this.debug(e,"compaction","checkpoint commit finished",t,{durable:void 0!==this.commitPersistedCompaction}),this.messages.splice(0,this.messages.length,...T),void 0!==x&&(this.compactionCheckpoint=x),this.lastInputTokens=void 0,this.needsCompaction=!1}return e.push({type:"context-compacted",reason:t,strategy:l,removed:k?m.removed:0,kept:T.length,...k&&m.truncatedTools>0?{truncatedTools:m.truncatedTools}:{},...void 0!==r?{beforeInputTokens:r}:{},...void 0!==x?{checkpointId:x.id,checkpointGeneration:x.generation,checkpointSummaryStatus:x.summary.status}:{}}),this.debug(e,"compaction","finish",i,{reason:t,strategy:l,removed:k?m.removed:0,kept:T.length,truncatedTools:k?m.truncatedTools:0,progressed:k}),k}async recoverFromContextError(e,t){if(!this.compaction?.enabled)return!1;try{return await this.runCompaction(e,"auto",t)}catch(t){return e.push({type:"error",stage:"plan",message:Fe(t)}),!1}}isTurnAborted(e){return!0===e?.aborted||!0===e?.abortController.signal.aborted}execSessionIds(e){return[...e.execSessionIds].sort((e,t)=>e-t)}activeExecSessionIds(e){return this.execSessionIds(e).filter(e=>{const t=this.sessionManager?.get(e);return void 0!==t&&!g(t.state)})}interruptExecSessions(e){const t=this.execSessionIds(e);0!==t.length&&this.sessionManager?.interrupt(t).catch(e=>{process.stderr.write(`roll chat: 中断后台会话失败: ${Fe(e)}\n`)})}abandonTurn(e){this.closed||this.activeTurn!==e||e.abortController.signal.aborted||(this.captureCancellationActivity(e),e.aborted=!0,e.cancellationReason??=y.runtime,this.gate.abortAll("本轮事件流已停止"),this.userInputInteractions.cancelAll("本轮事件流已停止"),this.interruptExecSessions(e),e.abortController.abort(f))}currentCancellationActivity(e){const t=this.activeExecSessionIds(e),s=[...e.pendingToolCalls.values()].filter(e=>this.toolCoordinator.hasExecutionStarted(e.toolCallId));return{execSessionIds:t,hadCompletedProgress:e.toolExecutions.length>0||e.completedStepResponses.size>0,hadInFlightWork:s.length>0||t.length>0,hadPotentialSideEffects:e.hadPotentialSideEffects||s.some(e=>e.potentialSideEffect)}}captureCancellationActivity(e){e.cancellationActivity??=this.currentCancellationActivity(e)}cancellationActivity(e){return e.cancellationActivity??this.currentCancellationActivity(e)}cancellationDisplayMessage(e){const t=e.cancellationReason??y.runtime,s=this.cancellationActivity(e);if(e.cancellationPersistenceAttempted&&!e.cancellationPersisted){const e=s.hadPotentialSideEffects?"部分操作可能已经执行,请先检查结果后再继续。":s.hadInFlightWork?"刚才的任务结果尚未确认,请先检查后再继续。":"请重新输入需要继续的内容。";return t===y.timeout?`本轮等待时间过长,已自动停止,但刚才的对话和进度未能保存。${e}`:t===y.runtime?`本轮因运行异常而中断,刚才的对话和进度未能保存。${e}`:`已停止本轮,但刚才的对话和进度未能保存。${e}`}const o=s.execSessionIds,i=ie(this.capabilityManifest,te.sessionList);switch(t){case y.user:return s.hadInFlightWork?s.hadPotentialSideEffects?"已停止本轮操作。正在进行的任务也已请求停止。之前的对话和已完成进度会保留;部分已经完成的操作不会自动撤销,请检查结果。":"已停止本轮操作。正在进行的任务也已请求停止。之前的对话和已完成进度会保留。":s.hadCompletedProgress?s.hadPotentialSideEffects?"已停止本轮回复。之前的对话和已完成进度会保留;部分已经完成的操作不会自动撤销,请检查结果。":"已停止本轮回复。之前的对话和已完成进度会保留,你可以继续输入。":"已停止本轮回复。之前的对话会保留,你可以继续输入。";case y.timeout:return 0===o.length?"本轮等待时间过长,已自动停止。之前的对话和已完成进度会保留,你可以继续输入或重试。":this.capabilityManifest.lifecycle.hostMode===ee.oneShot?"本轮等待时间过长,已自动停止。正在进行的任务会随本次命令结束而停止,之后无法继续查看;请先确认实际结果,再决定是否重试。":i?`本轮等待时间过长,但任务仍在运行(任务 #${o.join(", #")})。你可以在下一条消息中继续查看进度;确认结果前请勿重复执行。`:"本轮等待时间过长。任务可能仍在运行,但 Roll 暂时无法继续查看进度;请先确认实际结果,再决定是否重试。";case y.runtime:return s.hadInFlightWork?"本轮因运行异常而中断。正在进行的任务已请求停止,最终结果尚未确认;请检查结果后再继续。":s.hadPotentialSideEffects?"本轮因运行异常而中断。之前的对话和已完成进度会保留;部分已经完成的操作不会自动撤销,请检查结果后再继续。":"本轮因运行异常而中断。之前的对话会保留,你可以重试。"}}cancellationContextMessage(e){const t=e.cancellationReason??y.runtime,s=this.cancellationActivity(e).execSessionIds,o=s.length>0?`本轮后台任务编号: ${s.join(", ")}。`:"",i=ie(this.capabilityManifest,te.sessionList),n="这份恢复记录只描述上一轮的权威历史事实,不授权继续或重试旧任务。下一轮必须以最新真实用户消息的目标和约束为准;如果用户换题、放弃旧任务或禁止工具,不得为了恢复旧任务检查或调用工具。executionState=not_executed 表示工具确定未执行,无需检查;executionState=outcome_unknown 只允许在最新用户明确要求继续或核对上一任务时先检查,检查不等于重试。";switch(t){case y.user:return`用户主动停止了本轮。${o}这些任务已收到停止请求;已完成的步骤和工具记录仍然有效,不要自动重复 outcome=success 的操作。${n}`;case y.timeout:{const e=void 0!==this.turnTimeoutMs?`(${String(this.turnTimeoutMs)}ms)`:"";return 0===s.length?`本轮因超时${e}停止。已完成的步骤和工具记录仍然有效。${n}`:this.capabilityManifest.lifecycle.hostMode===ee.oneShot?`本轮因超时${e}停止。${o}当前 one-shot 进程结束时会清理这些任务,后续 CLI 进程无法恢复。${n}`:i?`本轮因超时${e}停止,但后台任务仍在当前进程运行。${o}若且仅若最新用户明确要求继续或核对上一任务,可用 ${i} 找回并查看。${n}`:`本轮因超时${e}停止,但后台任务可能仍在运行。${o}当前没有可用的任务列表工具,不能安全恢复查看。${n}`}case y.runtime:return`本轮因运行异常中断。${o}已完成的步骤和工具记录仍然有效。${n}`}}emitCancellation(e,t){if(t.cancellationEventEmitted)return;t.cancellationReason??=y.runtime,t.cancellationEventEmitted=!0;const s=this.cancellationActivity(t).execSessionIds;e.push({type:"turn-cancelled",reason:t.cancellationReason,message:this.cancellationDisplayMessage(t),...s.length>0?{execSessionIds:s}:{}})}persistCancelledTurn(e,t,s,o,i){this.captureCancellationActivity(t);try{this.persistPendingToolCancellations(t)}catch(o){return this.messages.splice(s),t.cancellationPersistenceAttempted=!0,e.push({type:"error",stage:"execute",message:`取消工具账本持久化失败: ${Fe(o)}`}),void this.emitCancellation(e,t)}if(this.closed)return this.messages.splice(s),t.cancellationPersistenceAttempted=!0,void this.emitCancellation(e,t);if(!t.cancellationPersistenceAttempted){t.cancellationPersistenceAttempted=!0,this.messages.splice(s+1);const n=Le(t),a=Ee(nt(n.length>0?n:o)).messages;t.cancellationPersisted=!0,this.messages.push(...a),this.messages.push(Q({context:this.cancellationContextMessage(t),completedMessages:a,toolExecutions:t.toolExecutions})),this.messages.push(k(this.cancellationDisplayMessage(t),t.cancellationReason??y.runtime)),this.debug(e,"persist","persisting cancelled turn",i,{appendedMessages:this.messages.length-s});try{this.persistMessages(this.messages.slice(s)),t.cancellationPersisted=!0}catch(o){t.cancellationPersisted=!1,this.messages.splice(s),e.push({type:"error",stage:"execute",message:`取消状态持久化失败: ${Fe(o)}`})}}this.emitCancellation(e,t)}persistPendingToolCancellations(e){const t=e.cancellationReason??y.runtime;for(const s of e.pendingToolCalls.values()){const o=this.toolCoordinator.hasExecutionStarted(s.toolCallId)?I.outcomeUnknown:I.notExecuted,i=o===I.notExecuted?`工具调用在开始执行前因本轮 ${t} 中断而取消;确定未执行`:`工具调用已开始,因本轮 ${t} 中断而取消;最终结果尚未确认`,n=M({kind:E.cancelled,reason:t,executionState:o},i,{raw:{cancellationReason:t,executionState:o,abortReason:Fe(e.abortController.signal.reason)}});this.persistToolExecution(N({toolCallId:s.toolCallId,agentName:s.agentName,toolName:s.toolName,input:s.input,result:n}),e),e.pendingToolCalls.delete(s.toolCallId)}}cancel(){const e=this.activeTurn;return!!e&&(this.captureCancellationActivity(e),e.aborted=!0,e.cancellationReason=y.user,this.gate.abortAll("用户取消本轮"),this.userInputInteractions.cancelAll("用户取消本轮"),this.interruptExecSessions(e),e.abortController.abort(b),!0)}close(){if(void 0!==this.closePromise)return this.closePromise;this.closed=!0;const e=this.activeTurn;return e&&(this.captureCancellationActivity(e),e.aborted=!0,e.cancellationReason??=y.runtime,this.gate.abortAll(),this.userInputInteractions.cancelAll("Runtime 正在关闭"),e.abortController.abort(f)),this.closePromise=(async()=>{const e=(this.sessionManager?.close()??Promise.resolve([])).then(e=>{for(const t of e)void 0!==t.cleanupError&&process.stderr.write(`roll chat: 后台会话 ${String(t.sessionId)} 清理失败: ${t.cleanupError}\n`)},e=>{process.stderr.write(`roll chat: 会话 ${this.id} 后台清理失败: ${Fe(e)}\n`)});await s(e,qe)||process.stderr.write(`roll chat: 会话 ${this.id} 在 ${String(qe)}ms 内未完成全部关闭步骤\n`);try{this.onClose?.()}catch(e){process.stderr.write(`roll chat: 会话 ${this.id} 关闭回调失败: ${Fe(e)}\n`)}})(),this.closePromise}abort(){this.close().catch(e=>{process.stderr.write(`roll chat: 会话 ${this.id} 关闭失败: ${Fe(e)}\n`)})}debug(e,t,s,o,i){this.debugEvents&&e.push({type:"debug",stage:t,message:s,...void 0!==o?{elapsedMs:Date.now()-o}:{},...void 0!==i?{data:i}:{}})}scheduleDebug(e,t,s,o,i){if(this.debugEvents)return setTimeout(()=>{this.debug(e,t,s,o,i)},5e3)}clearDebugTimer(e){void 0!==e&&clearTimeout(e)}}
@@ -16,6 +16,7 @@ export declare const CAPABILITY_TOOL_ROLES: {
16
16
  readonly sessionList: "session-list";
17
17
  readonly agentInstall: "agent-install";
18
18
  readonly transcriptRead: "transcript-read";
19
+ readonly userInput: "user-input";
19
20
  };
20
21
  export type CapabilityToolRole = (typeof CAPABILITY_TOOL_ROLES)[keyof typeof CAPABILITY_TOOL_ROLES];
21
22
  export declare const CAPABILITY_APPROVAL_MODES: {
@@ -1 +1 @@
1
- import{asSchema as e}from"ai";import{isSensitiveFieldName as t,redactSecretText as n}from"../tool-bridge/tool-execution-record.js";export const CAPABILITY_MANIFEST_VERSION=1;export const CAPABILITY_TURN_CONTEXT_VERSION=1;export const CAPABILITY_TOOL_ROLES={agent:"agent",skill:"skill",shell:"shell",sessionCommand:"session-command",sessionPoll:"session-poll",sessionList:"session-list",agentInstall:"agent-install",transcriptRead:"transcript-read"};export const CAPABILITY_APPROVAL_MODES={readOnly:"read-only",alwaysConfirm:"always-confirm",runtimePolicy:"runtime-policy"};export const CAPABILITY_TOOL_SOURCE_KINDS={builtIn:"built-in",agent:"agent"};export const CAPABILITY_MANIFEST_LIFECYCLES={manifest:"session-snapshot",turnContext:"per-turn"};export const CAPABILITY_HOST_MODES={embedded:"embedded",interactive:"interactive",oneShot:"one-shot",server:"server"};export const CAPABILITY_SESSION_EXEC_LIFECYCLES={resumable:"resumable",unavailable:"unavailable"};export const CAPABILITY_SESSION_DURABILITIES={processLocal:"process-local",unavailable:"unavailable"};const o=["tool-grounding/v1","task-persistence/v1","output-channel/v1"],i={stringChars:512,arrayItems:128,objectEntries:128,depth:16,objectKeyChars:128},s=new Set(["default","example","examples"]),r=new Set(["type","format","$ref","$schema"]),a=/data:(?:image|audio|video)\/[^\s,]{1,80}(?:;base64)?,[^\s"'<>)]*/giu,l="[sensitive value redacted]",c="[media value omitted]",p="[binary-like value omitted]";function d(e,t=i.stringChars){return e.length<=t?e:`${e.slice(0,t-1)}…`}function u(e){return e.length>=256&&/^[a-z0-9+/_=-]+$/iu.test(e)}function I(e){return u(e)?p:d(n(e,l).replace(a,c))}function m(e,t){if(!Object.hasOwn(e,t))return t;let n=1;for(;;){const o=`~${String(n)}`,s=`${t.slice(0,i.objectKeyChars-o.length)}${o}`;if(!Object.hasOwn(e,s))return s;n+=1}}function f(e,n){if(n.depth>=i.depth)return"[nested value omitted]";if("string"==typeof e)return n.sensitive&&!r.has(n.key.toLowerCase())?l:I(e);if(null===e||"boolean"==typeof e||"number"==typeof e)return e;if(Array.isArray(e)){const t=e.slice(0,i.arrayItems).map(e=>f(e,{...n,depth:n.depth+1}));return e.length>i.arrayItems&&t.push(`[${String(e.length-i.arrayItems)} items omitted]`),t}const o=Object.entries(e).filter(e=>void 0!==e[1]&&!s.has(e[0].toLowerCase())).sort(([e],[t])=>e.localeCompare(t)),a={};for(const[e,s]of o.slice(0,i.objectEntries)){a[m(a,d(I(e),i.objectKeyChars))]=f(s,{depth:n.depth+1,key:e,sensitive:n.sensitive||t(e)})}return o.length>i.objectEntries&&(a[m(a,"__roll_snapshot_omitted__")]=o.length-i.objectEntries),a}function C(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function A(e,t=0){if(t>32)return"[nested value omitted]";if(null===e||"string"==typeof e||"boolean"==typeof e||"number"==typeof e&&Number.isFinite(e))return e;if(Array.isArray(e))return e.map(e=>A(e,t+1));if(C(e)){const n={};for(const[o,i]of Object.entries(e))void 0!==i&&(n[o]=A(i,t+1));return n}return"number"==typeof e?String(e):void 0===e?null:String(e)}const L={[CAPABILITY_TOOL_ROLES.skill]:CAPABILITY_APPROVAL_MODES.readOnly,[CAPABILITY_TOOL_ROLES.sessionList]:CAPABILITY_APPROVAL_MODES.readOnly,[CAPABILITY_TOOL_ROLES.transcriptRead]:CAPABILITY_APPROVAL_MODES.readOnly,[CAPABILITY_TOOL_ROLES.agentInstall]:CAPABILITY_APPROVAL_MODES.alwaysConfirm};function O(e){return L[e]??CAPABILITY_APPROVAL_MODES.runtimePolicy}function S(e,t){return t!==CAPABILITY_TOOL_ROLES.agent?CAPABILITY_TOOL_SOURCE_KINDS.builtIn:e.agentSource??CAPABILITY_TOOL_SOURCE_KINDS.agent}function _(e,t){const n=new Set(e.map(e=>e.role)),o=[CAPABILITY_TOOL_ROLES.sessionCommand,CAPABILITY_TOOL_ROLES.sessionPoll,CAPABILITY_TOOL_ROLES.sessionList].every(e=>n.has(e));return{manifest:CAPABILITY_MANIFEST_LIFECYCLES.manifest,turnContext:CAPABILITY_MANIFEST_LIFECYCLES.turnContext,hostMode:t,sessionExec:o?CAPABILITY_SESSION_EXEC_LIFECYCLES.resumable:CAPABILITY_SESSION_EXEC_LIFECYCLES.unavailable,sessionDurability:o?CAPABILITY_SESSION_DURABILITIES.processLocal:CAPABILITY_SESSION_DURABILITIES.unavailable}}export function buildEffectiveCapabilityManifest(t){const n=Object.keys(t.tools).sort((e,t)=>e.localeCompare(t)).map(n=>{const o=t.tools[n],i=t.resolveRoute(n);if(!o||!i)throw new Error(`无法为已注册工具 ${n} 构建 capability manifest`);const s=t.toolRoles[n];if(!s)throw new Error(`已注册工具 ${n} 缺少 capability role`);const r="description"in o?o.description:void 0;return{id:n,agentName:i.agentName,toolName:i.toolName,source:S(i,s),...i.transport?{transport:i.transport}:{},...i.runtimeOwnership?{runtimeOwnership:i.runtimeOwnership}:{},...i.annotations?{annotations:{...i.annotations}}:{},role:s,approval:O(s),..."string"==typeof r&&r.length>0?{description:r}:{},inputSchema:A(e(o.inputSchema).jsonSchema)}});return{version:1,audience:"roll-chat",profile:t.profile,lifecycle:_(n,t.hostMode??CAPABILITY_HOST_MODES.embedded),tools:n,skills:t.skills.map(e=>({...e})),agentCount:t.agentCount,agentOnboardingCatalog:(t.agentOnboardingCatalog??[]).map(e=>({...e})),stableContext:{rules:o,shellHints:[...t.shellHints??[]]},dynamicContext:{cwd:t.cwd,platform:t.platform??process.platform}}}export function findCapabilityToolId(e,t){return e.tools.find(e=>e.role===t)?.id}export function listCapabilityToolIds(e,t){return e.tools.filter(e=>e.role===t).map(e=>e.id)}function y(e){return`${String(e.getFullYear()).padStart(4,"0")}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}export function buildEffectiveCapabilityTurnContext(e,t={}){const n=findCapabilityToolId(e,CAPABILITY_TOOL_ROLES.sessionList),o=findCapabilityToolId(e,CAPABILITY_TOOL_ROLES.transcriptRead);return{version:1,audience:e.audience,profile:e.profile,lifecycle:{...e.lifecycle},cwd:e.dynamicContext.cwd,platform:e.dynamicContext.platform,date:y(t.now??new Date),dynamic:{ruleIds:[...t.ruleIds??e.stableContext.rules],sessions:(t.sessions??[]).map(e=>({...e})),...t.vcs?{vcs:{...t.vcs}}:{}},effectiveToolIds:e.tools.map(e=>e.id),explicitSkillNames:[...t.explicitSkillNames??[]],...n?{sessionListToolId:n}:{},...o?{transcriptReadToolId:o}:{}}}function T(e){return e.slice(0,i.arrayItems).map(e=>I(e))}function E(e){return{id:I(e.id),agentName:I(e.agentName),toolName:I(e.toolName),source:e.source,...e.transport?{transport:e.transport}:{},...e.runtimeOwnership?{runtimeOwnership:e.runtimeOwnership}:{},...e.annotations?{annotations:{...e.annotations}}:{},role:e.role,approval:e.approval,...e.description?{description:I(e.description)}:{},inputSchema:f(e.inputSchema,{depth:0,key:"inputSchema",sensitive:!1})}}function h(e){return{version:e.version,audience:e.audience,profile:I(e.profile),lifecycle:{...e.lifecycle},tools:e.tools.slice(0,i.arrayItems).map(E),skills:e.skills.slice(0,i.arrayItems).map(e=>({name:I(e.name),description:I(e.description),source:e.source})),agentCount:e.agentCount,agentOnboardingCatalog:e.agentOnboardingCatalog.slice(0,i.arrayItems).map(e=>({shortName:I(e.shortName),description:I(e.description)})),stableContext:{rules:T(e.stableContext.rules),shellHints:T(e.stableContext.shellHints)},dynamicContext:{cwd:I(e.dynamicContext.cwd),platform:e.dynamicContext.platform}}}function b(e){return{version:e.version,audience:e.audience,profile:I(e.profile),lifecycle:{...e.lifecycle},cwd:I(e.cwd),platform:e.platform,date:I(e.date),dynamic:{ruleIds:T(e.dynamic.ruleIds),sessions:e.dynamic.sessions.slice(0,i.arrayItems).map(e=>({...e})),...e.dynamic.vcs?{vcs:{...e.dynamic.vcs,...e.dynamic.vcs.branch?{branch:I(e.dynamic.vcs.branch)}:{}}}:{}},effectiveToolIds:T(e.effectiveToolIds),explicitSkillNames:T(e.explicitSkillNames),...e.sessionListToolId?{sessionListToolId:I(e.sessionListToolId)}:{},...e.transcriptReadToolId?{transcriptReadToolId:I(e.transcriptReadToolId)}:{}}}export function createSafeCapabilitySnapshot(e,t){return{manifest:h(e),...t?{turnContext:b(t)}:{}}}
1
+ import{asSchema as e}from"ai";import{isSensitiveFieldName as t,redactSecretText as n}from"../tool-bridge/tool-execution-record.js";export const CAPABILITY_MANIFEST_VERSION=1;export const CAPABILITY_TURN_CONTEXT_VERSION=1;export const CAPABILITY_TOOL_ROLES={agent:"agent",skill:"skill",shell:"shell",sessionCommand:"session-command",sessionPoll:"session-poll",sessionList:"session-list",agentInstall:"agent-install",transcriptRead:"transcript-read",userInput:"user-input"};export const CAPABILITY_APPROVAL_MODES={readOnly:"read-only",alwaysConfirm:"always-confirm",runtimePolicy:"runtime-policy"};export const CAPABILITY_TOOL_SOURCE_KINDS={builtIn:"built-in",agent:"agent"};export const CAPABILITY_MANIFEST_LIFECYCLES={manifest:"session-snapshot",turnContext:"per-turn"};export const CAPABILITY_HOST_MODES={embedded:"embedded",interactive:"interactive",oneShot:"one-shot",server:"server"};export const CAPABILITY_SESSION_EXEC_LIFECYCLES={resumable:"resumable",unavailable:"unavailable"};export const CAPABILITY_SESSION_DURABILITIES={processLocal:"process-local",unavailable:"unavailable"};const o=["tool-grounding/v1","task-persistence/v1","output-channel/v1"],i={stringChars:512,arrayItems:128,objectEntries:128,depth:16,objectKeyChars:128},s=new Set(["default","example","examples"]),r=new Set(["type","format","$ref","$schema"]),a=/data:(?:image|audio|video)\/[^\s,]{1,80}(?:;base64)?,[^\s"'<>)]*/giu,l="[sensitive value redacted]",c="[media value omitted]",p="[binary-like value omitted]";function u(e,t=i.stringChars){return e.length<=t?e:`${e.slice(0,t-1)}…`}function d(e){return e.length>=256&&/^[a-z0-9+/_=-]+$/iu.test(e)}function I(e){return d(e)?p:u(n(e,l).replace(a,c))}function m(e,t){if(!Object.hasOwn(e,t))return t;let n=1;for(;;){const o=`~${String(n)}`,s=`${t.slice(0,i.objectKeyChars-o.length)}${o}`;if(!Object.hasOwn(e,s))return s;n+=1}}function f(e,n){if(n.depth>=i.depth)return"[nested value omitted]";if("string"==typeof e)return n.sensitive&&!r.has(n.key.toLowerCase())?l:I(e);if(null===e||"boolean"==typeof e||"number"==typeof e)return e;if(Array.isArray(e)){const t=e.slice(0,i.arrayItems).map(e=>f(e,{...n,depth:n.depth+1}));return e.length>i.arrayItems&&t.push(`[${String(e.length-i.arrayItems)} items omitted]`),t}const o=Object.entries(e).filter(e=>void 0!==e[1]&&!s.has(e[0].toLowerCase())).sort(([e],[t])=>e.localeCompare(t)),a={};for(const[e,s]of o.slice(0,i.objectEntries)){a[m(a,u(I(e),i.objectKeyChars))]=f(s,{depth:n.depth+1,key:e,sensitive:n.sensitive||t(e)})}return o.length>i.objectEntries&&(a[m(a,"__roll_snapshot_omitted__")]=o.length-i.objectEntries),a}function C(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function A(e,t=0){if(t>32)return"[nested value omitted]";if(null===e||"string"==typeof e||"boolean"==typeof e||"number"==typeof e&&Number.isFinite(e))return e;if(Array.isArray(e))return e.map(e=>A(e,t+1));if(C(e)){const n={};for(const[o,i]of Object.entries(e))void 0!==i&&(n[o]=A(i,t+1));return n}return"number"==typeof e?String(e):void 0===e?null:String(e)}const L={[CAPABILITY_TOOL_ROLES.skill]:CAPABILITY_APPROVAL_MODES.readOnly,[CAPABILITY_TOOL_ROLES.sessionList]:CAPABILITY_APPROVAL_MODES.readOnly,[CAPABILITY_TOOL_ROLES.transcriptRead]:CAPABILITY_APPROVAL_MODES.readOnly,[CAPABILITY_TOOL_ROLES.agentInstall]:CAPABILITY_APPROVAL_MODES.alwaysConfirm,[CAPABILITY_TOOL_ROLES.userInput]:CAPABILITY_APPROVAL_MODES.readOnly};function O(e){return L[e]??CAPABILITY_APPROVAL_MODES.runtimePolicy}function S(e,t){return t!==CAPABILITY_TOOL_ROLES.agent?CAPABILITY_TOOL_SOURCE_KINDS.builtIn:e.agentSource??CAPABILITY_TOOL_SOURCE_KINDS.agent}function _(e,t){const n=new Set(e.map(e=>e.role)),o=[CAPABILITY_TOOL_ROLES.sessionCommand,CAPABILITY_TOOL_ROLES.sessionPoll,CAPABILITY_TOOL_ROLES.sessionList].every(e=>n.has(e));return{manifest:CAPABILITY_MANIFEST_LIFECYCLES.manifest,turnContext:CAPABILITY_MANIFEST_LIFECYCLES.turnContext,hostMode:t,sessionExec:o?CAPABILITY_SESSION_EXEC_LIFECYCLES.resumable:CAPABILITY_SESSION_EXEC_LIFECYCLES.unavailable,sessionDurability:o?CAPABILITY_SESSION_DURABILITIES.processLocal:CAPABILITY_SESSION_DURABILITIES.unavailable}}export function buildEffectiveCapabilityManifest(t){const n=Object.keys(t.tools).sort((e,t)=>e.localeCompare(t)).map(n=>{const o=t.tools[n],i=t.resolveRoute(n);if(!o||!i)throw new Error(`无法为已注册工具 ${n} 构建 capability manifest`);const s=t.toolRoles[n];if(!s)throw new Error(`已注册工具 ${n} 缺少 capability role`);const r="description"in o?o.description:void 0;return{id:n,agentName:i.agentName,toolName:i.toolName,source:S(i,s),...i.transport?{transport:i.transport}:{},...i.runtimeOwnership?{runtimeOwnership:i.runtimeOwnership}:{},...i.annotations?{annotations:{...i.annotations}}:{},role:s,approval:O(s),..."string"==typeof r&&r.length>0?{description:r}:{},inputSchema:A(e(o.inputSchema).jsonSchema)}});return{version:1,audience:"roll-chat",profile:t.profile,lifecycle:_(n,t.hostMode??CAPABILITY_HOST_MODES.embedded),tools:n,skills:t.skills.map(e=>({...e})),agentCount:t.agentCount,agentOnboardingCatalog:(t.agentOnboardingCatalog??[]).map(e=>({...e})),stableContext:{rules:o,shellHints:[...t.shellHints??[]]},dynamicContext:{cwd:t.cwd,platform:t.platform??process.platform}}}export function findCapabilityToolId(e,t){return e.tools.find(e=>e.role===t)?.id}export function listCapabilityToolIds(e,t){return e.tools.filter(e=>e.role===t).map(e=>e.id)}function T(e){return`${String(e.getFullYear()).padStart(4,"0")}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}export function buildEffectiveCapabilityTurnContext(e,t={}){const n=findCapabilityToolId(e,CAPABILITY_TOOL_ROLES.sessionList),o=findCapabilityToolId(e,CAPABILITY_TOOL_ROLES.transcriptRead);return{version:1,audience:e.audience,profile:e.profile,lifecycle:{...e.lifecycle},cwd:e.dynamicContext.cwd,platform:e.dynamicContext.platform,date:T(t.now??new Date),dynamic:{ruleIds:[...t.ruleIds??e.stableContext.rules],sessions:(t.sessions??[]).map(e=>({...e})),...t.vcs?{vcs:{...t.vcs}}:{}},effectiveToolIds:e.tools.map(e=>e.id),explicitSkillNames:[...t.explicitSkillNames??[]],...n?{sessionListToolId:n}:{},...o?{transcriptReadToolId:o}:{}}}function y(e){return e.slice(0,i.arrayItems).map(e=>I(e))}function E(e){return{id:I(e.id),agentName:I(e.agentName),toolName:I(e.toolName),source:e.source,...e.transport?{transport:e.transport}:{},...e.runtimeOwnership?{runtimeOwnership:e.runtimeOwnership}:{},...e.annotations?{annotations:{...e.annotations}}:{},role:e.role,approval:e.approval,...e.description?{description:I(e.description)}:{},inputSchema:f(e.inputSchema,{depth:0,key:"inputSchema",sensitive:!1})}}function h(e){return{version:e.version,audience:e.audience,profile:I(e.profile),lifecycle:{...e.lifecycle},tools:e.tools.slice(0,i.arrayItems).map(E),skills:e.skills.slice(0,i.arrayItems).map(e=>({name:I(e.name),description:I(e.description),source:e.source})),agentCount:e.agentCount,agentOnboardingCatalog:e.agentOnboardingCatalog.slice(0,i.arrayItems).map(e=>({shortName:I(e.shortName),description:I(e.description)})),stableContext:{rules:y(e.stableContext.rules),shellHints:y(e.stableContext.shellHints)},dynamicContext:{cwd:I(e.dynamicContext.cwd),platform:e.dynamicContext.platform}}}function b(e){return{version:e.version,audience:e.audience,profile:I(e.profile),lifecycle:{...e.lifecycle},cwd:I(e.cwd),platform:e.platform,date:I(e.date),dynamic:{ruleIds:y(e.dynamic.ruleIds),sessions:e.dynamic.sessions.slice(0,i.arrayItems).map(e=>({...e})),...e.dynamic.vcs?{vcs:{...e.dynamic.vcs,...e.dynamic.vcs.branch?{branch:I(e.dynamic.vcs.branch)}:{}}}:{}},effectiveToolIds:y(e.effectiveToolIds),explicitSkillNames:y(e.explicitSkillNames),...e.sessionListToolId?{sessionListToolId:I(e.sessionListToolId)}:{},...e.transcriptReadToolId?{transcriptReadToolId:I(e.transcriptReadToolId)}:{}}}export function createSafeCapabilitySnapshot(e,t){return{manifest:h(e),...t?{turnContext:b(t)}:{}}}