@code-yeongyu/senpi 2026.8.5 → 2026.8.6

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 (99) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/dist/core/agent-abort-provenance.d.ts +20 -0
  3. package/dist/core/agent-abort-provenance.d.ts.map +1 -0
  4. package/dist/core/agent-abort-provenance.js +83 -0
  5. package/dist/core/agent-abort-provenance.js.map +1 -0
  6. package/dist/core/agent-session.d.ts +5 -1
  7. package/dist/core/agent-session.d.ts.map +1 -1
  8. package/dist/core/agent-session.js +77 -42
  9. package/dist/core/agent-session.js.map +1 -1
  10. package/dist/core/agent-settled-delivery.d.ts +9 -0
  11. package/dist/core/agent-settled-delivery.d.ts.map +1 -0
  12. package/dist/core/agent-settled-delivery.js +25 -0
  13. package/dist/core/agent-settled-delivery.js.map +1 -0
  14. package/dist/core/extensions/builtin/compaction/index.js +3 -3
  15. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  16. package/dist/core/extensions/builtin/compaction/per-turn-cap.d.ts +8 -8
  17. package/dist/core/extensions/builtin/compaction/per-turn-cap.d.ts.map +1 -1
  18. package/dist/core/extensions/builtin/compaction/per-turn-cap.js +9 -16
  19. package/dist/core/extensions/builtin/compaction/per-turn-cap.js.map +1 -1
  20. package/dist/core/extensions/builtin/goal/agent-end-continuation.d.ts +11 -0
  21. package/dist/core/extensions/builtin/goal/agent-end-continuation.d.ts.map +1 -0
  22. package/dist/core/extensions/builtin/goal/agent-end-continuation.js +13 -0
  23. package/dist/core/extensions/builtin/goal/agent-end-continuation.js.map +1 -0
  24. package/dist/core/extensions/builtin/goal/cache-warm.d.ts +0 -2
  25. package/dist/core/extensions/builtin/goal/cache-warm.d.ts.map +1 -1
  26. package/dist/core/extensions/builtin/goal/cache-warm.js +0 -34
  27. package/dist/core/extensions/builtin/goal/cache-warm.js.map +1 -1
  28. package/dist/core/extensions/builtin/goal/continuation.d.ts +1 -1
  29. package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
  30. package/dist/core/extensions/builtin/goal/continuation.js +2 -0
  31. package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
  32. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  33. package/dist/core/extensions/builtin/goal/index.js +17 -19
  34. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  35. package/dist/core/extensions/builtin/goal/last-assistant-message.d.ts +5 -0
  36. package/dist/core/extensions/builtin/goal/last-assistant-message.d.ts.map +1 -0
  37. package/dist/core/extensions/builtin/goal/last-assistant-message.js +9 -0
  38. package/dist/core/extensions/builtin/goal/last-assistant-message.js.map +1 -0
  39. package/dist/core/extensions/builtin/goal/monitor-continuation-types.d.ts +23 -0
  40. package/dist/core/extensions/builtin/goal/monitor-continuation-types.d.ts.map +1 -0
  41. package/dist/core/extensions/builtin/goal/monitor-continuation-types.js +2 -0
  42. package/dist/core/extensions/builtin/goal/monitor-continuation-types.js.map +1 -0
  43. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts +4 -10
  44. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
  45. package/dist/core/extensions/builtin/goal/monitor-continuation.js +31 -21
  46. package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
  47. package/dist/core/extensions/builtin/goal/terminal-provider-error.d.ts +3 -0
  48. package/dist/core/extensions/builtin/goal/terminal-provider-error.d.ts.map +1 -0
  49. package/dist/core/extensions/builtin/goal/terminal-provider-error.js +10 -0
  50. package/dist/core/extensions/builtin/goal/terminal-provider-error.js.map +1 -0
  51. package/dist/core/extensions/builtin/gpt-apply-patch/apply.d.ts.map +1 -1
  52. package/dist/core/extensions/builtin/gpt-apply-patch/apply.js +55 -11
  53. package/dist/core/extensions/builtin/gpt-apply-patch/apply.js.map +1 -1
  54. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.d.ts.map +1 -1
  55. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js +8 -5
  56. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js.map +1 -1
  57. package/dist/core/extensions/builtin/gpt-apply-patch/preview.d.ts +2 -0
  58. package/dist/core/extensions/builtin/gpt-apply-patch/preview.d.ts.map +1 -1
  59. package/dist/core/extensions/builtin/gpt-apply-patch/preview.js +39 -7
  60. package/dist/core/extensions/builtin/gpt-apply-patch/preview.js.map +1 -1
  61. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts +1 -0
  62. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts.map +1 -1
  63. package/dist/core/extensions/builtin/gpt-apply-patch/types.js.map +1 -1
  64. package/dist/core/extensions/builtin/ttsr/index.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/ttsr/index.js +35 -34
  66. package/dist/core/extensions/builtin/ttsr/index.js.map +1 -1
  67. package/dist/core/extensions/runner.d.ts.map +1 -1
  68. package/dist/core/extensions/runner.js +2 -2
  69. package/dist/core/extensions/runner.js.map +1 -1
  70. package/dist/core/extensions/types.d.ts +2 -2
  71. package/dist/core/extensions/types.d.ts.map +1 -1
  72. package/dist/core/extensions/types.js.map +1 -1
  73. package/dist/modes/interactive/components/assistant-message.d.ts +0 -1
  74. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  75. package/dist/modes/interactive/components/assistant-message.js +8 -128
  76. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  77. package/dist/modes/interactive/components/assistant-render-descriptors.d.ts +17 -0
  78. package/dist/modes/interactive/components/assistant-render-descriptors.d.ts.map +1 -0
  79. package/dist/modes/interactive/components/assistant-render-descriptors.js +133 -0
  80. package/dist/modes/interactive/components/assistant-render-descriptors.js.map +1 -0
  81. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +24 -0
  82. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  83. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  84. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +30 -0
  85. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  86. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +30 -0
  87. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  88. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  89. package/node_modules/@earendil-works/pi-ai/dist/providers/data/anthropic.json +1 -1
  90. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  91. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  92. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  93. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  94. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  95. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  96. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +14 -1
  97. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  98. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  99. package/package.json +7 -7
@@ -0,0 +1,9 @@
1
+ export type DeferredAgentSettledAction = () => void;
2
+ export declare class AgentSettledDelivery {
3
+ #private;
4
+ begin(userAbortGeneration: number): void;
5
+ defer(action: DeferredAgentSettledAction): boolean;
6
+ finish(userAbortGeneration: number): DeferredAgentSettledAction[];
7
+ cancel(): void;
8
+ }
9
+ //# sourceMappingURL=agent-settled-delivery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-settled-delivery.d.ts","sourceRoot":"","sources":["../../src/core/agent-settled-delivery.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,0BAA0B,GAAG,MAAM,IAAI,CAAC;AAEpD,qBAAa,oBAAoB;;IAIhC,KAAK,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAGvC;IAED,KAAK,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAIjD;IAED,MAAM,CAAC,mBAAmB,EAAE,MAAM,GAAG,0BAA0B,EAAE,CAKhE;IAED,MAAM,IAAI,IAAI,CAGb;CACD"}
@@ -0,0 +1,25 @@
1
+ export class AgentSettledDelivery {
2
+ #generation;
3
+ #actions = [];
4
+ begin(userAbortGeneration) {
5
+ this.#generation = userAbortGeneration;
6
+ this.#actions = [];
7
+ }
8
+ defer(action) {
9
+ if (this.#generation === undefined)
10
+ return false;
11
+ this.#actions.push(action);
12
+ return true;
13
+ }
14
+ finish(userAbortGeneration) {
15
+ const actions = this.#generation === userAbortGeneration ? this.#actions : [];
16
+ this.#generation = undefined;
17
+ this.#actions = [];
18
+ return actions;
19
+ }
20
+ cancel() {
21
+ this.#generation = undefined;
22
+ this.#actions = [];
23
+ }
24
+ }
25
+ //# sourceMappingURL=agent-settled-delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-settled-delivery.js","sourceRoot":"","sources":["../../src/core/agent-settled-delivery.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,oBAAoB;IAChC,WAAW,CAAqB;IAChC,QAAQ,GAAiC,EAAE,CAAC;IAE5C,KAAK,CAAC,mBAA2B;QAChC,IAAI,CAAC,WAAW,GAAG,mBAAmB,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,MAAkC;QACvC,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,CAAC,mBAA2B;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,KAAK,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,MAAM;QACL,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACpB,CAAC;CACD","sourcesContent":["export type DeferredAgentSettledAction = () => void;\n\nexport class AgentSettledDelivery {\n\t#generation: number | undefined;\n\t#actions: DeferredAgentSettledAction[] = [];\n\n\tbegin(userAbortGeneration: number): void {\n\t\tthis.#generation = userAbortGeneration;\n\t\tthis.#actions = [];\n\t}\n\n\tdefer(action: DeferredAgentSettledAction): boolean {\n\t\tif (this.#generation === undefined) return false;\n\t\tthis.#actions.push(action);\n\t\treturn true;\n\t}\n\n\tfinish(userAbortGeneration: number): DeferredAgentSettledAction[] {\n\t\tconst actions = this.#generation === userAbortGeneration ? this.#actions : [];\n\t\tthis.#generation = undefined;\n\t\tthis.#actions = [];\n\t\treturn actions;\n\t}\n\n\tcancel(): void {\n\t\tthis.#generation = undefined;\n\t\tthis.#actions = [];\n\t}\n}\n"]}
@@ -356,12 +356,12 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
356
356
  if (lanePolicy.disablesSenpiCompaction(ctx)) {
357
357
  return { cancel: true, reason: SDK_NATIVE_LANE_REJECTION_REASON };
358
358
  }
359
- if (cap.shouldRejectByCap(state, { reason: event.reason }).cancel) {
360
- getLogger(ctx).debug("skip_cap", { reason: event.reason, count: state.acceptedThisTurn });
359
+ if (cap.shouldRejectByCap(state).cancel) {
360
+ getLogger(ctx).debug("skip_cap", { reason: event.reason, count: state.acceptedAbsolute });
361
361
  return {
362
362
  cancel: true,
363
363
  rejectionCause: "per-turn-cap",
364
- reason: "per-turn compaction cap reached for this turn",
364
+ reason: "absolute compaction cap reached for this session",
365
365
  };
366
366
  }
367
367
  const now = Date.now();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Tool } from \"@earendil-works/pi-ai\";\nimport type { CompactionResult } from \"../../../compaction/index.ts\";\nimport { convertToLlm } from \"../../../messages.ts\";\nimport type {\n\tContextUsage,\n\tExtensionAPI,\n\tExtensionContext,\n\tSessionBeforeCompactEvent,\n\tSessionCompactEvent,\n} from \"../../types.ts\";\nimport * as checkpointState from \"./checkpoint-state.ts\";\nimport * as breaker from \"./circuit-breaker.ts\";\nimport {\n\tBUILTIN_CONTEXT_REDUCTION_OPTIONS,\n\treduceContextMessages,\n\tshouldApplyContextReduction,\n} from \"./context-reduction.ts\";\nimport {\n\tcreateDegradationMonitorState,\n\thandleMessageEnd,\n\thandleTurnEnd,\n\tRECOVERY_INSTRUCTIONS,\n\tresetOnSessionCompact,\n} from \"./degradation-monitor.ts\";\nimport {\n\tclassifyRequiredCompactionFallbackFailure,\n\tcreateRequiredCompactionFallback,\n} from \"./deterministic-fallback.ts\";\nimport * as idle from \"./idle.ts\";\nimport * as idleRetry from \"./idle-retry.ts\";\nimport {\n\tCLAUDE_SDK_OAUTH_COMPACT_ENTRY_TYPE,\n\tcollectCompactBoundaryEntries,\n\tcreateCompactionLanePolicy,\n\tSDK_NATIVE_LANE_REJECTION_REASON,\n} from \"./lane-policy.ts\";\nimport { type CompactionLogger, createCompactionLogger } from \"./log.ts\";\nimport {\n\tmarkOpenAiRemoteReplayBoundary,\n\ttype OpenAiRemoteCompactionDependencies,\n\trewriteOpenAiPayloadWithRemoteCompaction,\n\trunOpenAiRemoteCompaction,\n\tSENPI_COMPACTION_EVENT,\n} from \"./openai-remote.ts\";\nimport {\n\tcreateOpenAiRemoteCompactionHeaders,\n\tisOpenAiRemoteCompactionModel,\n\topenAiRemoteCompactionOrigin,\n} from \"./openai-remote-model.ts\";\nimport * as cap from \"./per-turn-cap.ts\";\nimport * as policy from \"./policy.ts\";\nimport { repairOrphanedToolResults } from \"./repair-tool-pairs.ts\";\nimport * as restoration from \"./restoration-tracker.ts\";\nimport {\n\tapplyGeneratedCompaction,\n\tcreateEmergencyPruneLatch,\n\tcreateSpeculativeCompactionSnapshot,\n\tgetPromptVariant,\n\thardLimitEmergencyPrune,\n\trunExtensionCompaction,\n\ttype SpeculativeCompactionResult,\n\ttype SpeculativeCompactionSnapshot,\n\tSummaryGenerationError,\n} from \"./speculative.ts\";\nimport { type CompactionExtensionState, createInitialState, resetTurnCounter } from \"./state.ts\";\nimport { resolveInheritedTaskIntent } from \"./task-intent.ts\";\nimport * as todoBridge from \"./todo-bridge.ts\";\nimport { isTransientSummarizationFailure } from \"./transient-failure.ts\";\nimport { isIneffectiveCompaction } from \"./yield.ts\";\n\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\nconst EMERGENCY_COMPACTION_INSTRUCTIONS =\n\t\"EMERGENCY: hard context limit reached. Produce an aggressive recovery summary that preserves current goal, constraints, files touched, tool outcomes, and exact next steps. Prefer concise factual state over transcript detail.\";\nconst PROACTIVE_COMPACTION_INSTRUCTIONS = \"Proactively compact before the next agent turn.\";\nconst MAX_PENDING_METADATA = 8;\nconst IMAGE_PROMPT_TOKEN_ESTIMATE = 1_200;\nconst MAX_OUTPUT_RESERVE_RATIO = 0.5;\n\ninterface PendingCompactionMetadata {\n\tcheckpoint: checkpointState.AgentCheckpoint;\n\ttodoSnapshot: todoBridge.TodoSnapshotPayload;\n}\n\nfunction approxTokens(text: string): number {\n\treturn Math.ceil(text.length / 4);\n}\n\nfunction estimatePendingPromptTokens(event: { prompt?: string; images?: readonly unknown[] }): number {\n\treturn approxTokens(event.prompt ?? \"\") + (event.images?.length ?? 0) * IMAGE_PROMPT_TOKEN_ESTIMATE;\n}\n\nfunction getPromptContextWindow(contextWindow: number, maxTokens: number | undefined): number {\n\tif (typeof maxTokens !== \"number\" || !Number.isFinite(maxTokens) || maxTokens <= 0 || contextWindow <= 0) {\n\t\treturn contextWindow;\n\t}\n\tconst outputReserve = Math.min(maxTokens, Math.floor(contextWindow * MAX_OUTPUT_RESERVE_RATIO));\n\treturn contextWindow - outputReserve;\n}\n\nfunction withAdditionalTokens(usage: ContextUsage, additionalTokens: number): ContextUsage {\n\tif (usage.tokens === null || additionalTokens <= 0) return usage;\n\tconst tokens = usage.tokens + additionalTokens;\n\treturn {\n\t\t...usage,\n\t\ttokens,\n\t\tpercent: usage.contextWindow > 0 ? (tokens / usage.contextWindow) * 100 : usage.percent,\n\t};\n}\n\nfunction isMonitorableMessageEvent(event: { message: AgentMessage }): event is {\n\tmessage: AgentMessage & { content: Array<{ type: string; text?: string }> };\n} {\n\treturn \"content\" in event.message && Array.isArray(event.message.content);\n}\n\nfunction isAbortedAssistantMessage(event: { message: AgentMessage }): boolean {\n\treturn event.message.role === \"assistant\" && \"stopReason\" in event.message && event.message.stopReason === \"aborted\";\n}\n\nfunction isRequiredCompactionFallbackReason(reason: SessionBeforeCompactEvent[\"reason\"]): boolean {\n\treturn reason === \"threshold\" || reason === \"overflow\";\n}\n\nfunction recentCheckpoint(ctx: ExtensionContext): checkpointState.AgentCheckpoint | null {\n\tconst checkpoint = checkpointState.getLatestCheckpoint(ctx);\n\tif (!checkpoint?.timestamp) return null;\n\treturn Date.now() - checkpoint.timestamp <= 60_000 ? checkpoint : null;\n}\n\nfunction shouldEndFeedback(result: SpeculativeCompactionResult): boolean {\n\treturn !result.applied && result.reason !== \"rejected\";\n}\n\nfunction endCompactionFeedback(\n\tctx: ExtensionContext,\n\tsignal: AbortSignal | undefined,\n\tresult: SpeculativeCompactionResult,\n): void {\n\tif (shouldEndFeedback(result)) {\n\t\tctx.endCompaction?.({ reason: \"extension\", signal, aborted: signal?.aborted });\n\t}\n}\n\nfunction linkAbortSignal(source: AbortSignal | undefined, target: AbortController): () => void {\n\tif (!source) return () => {};\n\tif (source.aborted) {\n\t\ttarget.abort();\n\t\treturn () => {};\n\t}\n\tconst abort = () => target.abort();\n\tsource.addEventListener(\"abort\", abort, { once: true });\n\treturn () => source.removeEventListener(\"abort\", abort);\n}\n\nfunction createBlockingRemoteCompactionEvent(\n\tctx: ExtensionContext,\n\tsnapshot: SpeculativeCompactionSnapshot,\n\tcustomInstructions: string,\n\tsignal: AbortSignal,\n): SessionBeforeCompactEvent {\n\treturn {\n\t\ttype: \"session_before_compact\",\n\t\treason: \"extension\",\n\t\twillRetry: false,\n\t\trequestId: randomUUID(),\n\t\tpreparation: snapshot.preparation,\n\t\tbranchEntries: ctx.sessionManager.getBranch(),\n\t\tcustomInstructions,\n\t\tsignal,\n\t};\n}\n\nexport default function compactionExtension(\n\tpi: ExtensionAPI,\n\tremoteCompactionDependencies: OpenAiRemoteCompactionDependencies = {},\n): void {\n\tlet state: CompactionExtensionState = createInitialState();\n\tconst lanePolicy = createCompactionLanePolicy();\n\tconst restorationDirectiveState = checkpointState.createRestorationDirectiveState();\n\tconst emergencyPruneLatch = createEmergencyPruneLatch();\n\tconst degradationState = createDegradationMonitorState();\n\tconst restorationState = state.restoration ?? restoration.createRestorationTrackerState();\n\tstate = { ...state, restoration: restorationState };\n\tlet speculativeGeneration = 0;\n\tlet speculativeJob:\n\t\t| {\n\t\t\t\tgeneration: number;\n\t\t\t\tsnapshot: SpeculativeCompactionSnapshot;\n\t\t\t\tcontroller: AbortController;\n\t\t\t\tpromise: Promise<CompactionResult | undefined>;\n\t\t\t\tfailure: Promise<Error | undefined>;\n\t\t }\n\t\t| undefined;\n\tconst pendingMetadata = new Map<string, PendingCompactionMetadata>();\n\tlet logger: CompactionLogger | undefined;\n\tconst getLogger = (ctx: ExtensionContext): CompactionLogger => (logger ??= createCompactionLogger(ctx.agentDir));\n\n\tfunction getSummarizationTools(): Tool[] {\n\t\tif (typeof pi.getAllTools !== \"function\" || typeof pi.getActiveTools !== \"function\") return [];\n\t\ttry {\n\t\t\tconst definitionsByName = new Map(pi.getAllTools().map((tool) => [tool.name, tool]));\n\t\t\treturn pi.getActiveTools().flatMap((name) => {\n\t\t\t\tconst tool = definitionsByName.get(name);\n\t\t\t\treturn tool ? [{ name: tool.name, description: tool.description, parameters: tool.parameters }] : [];\n\t\t\t});\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tlet idleWarmupTimer: ReturnType<typeof setTimeout> | undefined;\n\tlet idleWarmupAttempt = 0;\n\n\tfunction cancelIdleWarmupRetry(): void {\n\t\tif (idleWarmupTimer === undefined) return;\n\t\tclearTimeout(idleWarmupTimer);\n\t\tidleWarmupTimer = undefined;\n\t}\n\n\t// Fenced on the observed job: a prompt, invalidation, or newer warm-up\n\t// stands this watcher down before it can start a duplicate summarization.\n\tfunction armIdleWarmupRetry(ctx: ExtensionContext): void {\n\t\tconst job = speculativeJob;\n\t\tif (!job) return;\n\t\tvoid job.failure.then((failure) => {\n\t\t\tif (failure === undefined) {\n\t\t\t\tidleWarmupAttempt = 0;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (speculativeJob !== job) return;\n\t\t\tconst usage = ctx.getContextUsage();\n\t\t\tconst contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\t\t\tconst retryDecision: idleRetry.IdleWarmupRetryDecision = {\n\t\t\t\tattempt: idleWarmupAttempt,\n\t\t\t\ttransient: isTransientSummarizationFailure(failure, failure.message),\n\t\t\t\tisIdle: ctx.isIdle(),\n\t\t\t\tbreakerTripped: breaker.isTripped(state, Date.now()),\n\t\t\t\tstillOverThreshold:\n\t\t\t\t\tusage !== undefined &&\n\t\t\t\t\tpolicy.shouldTriggerCompaction(\n\t\t\t\t\t\tusage,\n\t\t\t\t\t\tcontextWindow,\n\t\t\t\t\t\tctx.getCompactionSettings(),\n\t\t\t\t\t\tstate.lastYield ?? undefined,\n\t\t\t\t\t),\n\t\t\t};\n\t\t\tif (!idleRetry.shouldRetryIdleWarmup(retryDecision)) return;\n\t\t\tcancelIdleWarmupRetry();\n\t\t\tidleWarmupTimer = setTimeout(() => {\n\t\t\t\tidleWarmupTimer = undefined;\n\t\t\t\tif (speculativeJob !== job) return;\n\t\t\t\tif (!ctx.isIdle()) return;\n\t\t\t\tidleWarmupAttempt += 1;\n\t\t\t\tgetLogger(ctx).debug(\"idle_trigger\", {\n\t\t\t\t\tcontextWindow,\n\t\t\t\t\ttokens: usage?.tokens ?? 0,\n\t\t\t\t\tcount: idleWarmupAttempt,\n\t\t\t\t});\n\t\t\t\tinvalidateSpeculativeCompaction(ctx);\n\t\t\t\tstartSpeculativeCompaction(ctx, idle.IDLE_COMPACTION_INSTRUCTIONS);\n\t\t\t\tarmIdleWarmupRetry(ctx);\n\t\t\t}, idleRetry.IDLE_WARMUP_RETRY_DELAY_MS);\n\t\t});\n\t}\n\n\tfunction invalidateSpeculativeCompaction(ctx: ExtensionContext): void {\n\t\tconst previousGeneration = speculativeGeneration;\n\t\tspeculativeGeneration++;\n\t\tgetLogger(ctx).debug(\"speculative_invalidated\", { generation: previousGeneration });\n\t\tspeculativeJob?.controller.abort();\n\t\tspeculativeJob = undefined;\n\t}\n\n\tfunction startSpeculativeCompaction(ctx: ExtensionContext, customInstructions: string): void {\n\t\tif (speculativeJob) return;\n\t\tconst generation = ++speculativeGeneration;\n\t\tconst snapshot = createSpeculativeCompactionSnapshot(ctx, {\n\t\t\tgeneration,\n\t\t\tcustomInstructions,\n\t\t\torigin: \"speculative\",\n\t\t\ttools: getSummarizationTools(),\n\t\t});\n\t\tif (!snapshot) return;\n\t\tgetLogger(ctx).debug(\"speculative_started\", { generation, origin: \"speculative\" });\n\t\tconst controller = new AbortController();\n\t\tconst settled = runExtensionCompaction(ctx, snapshot, controller.signal).then(\n\t\t\t(result) => ({ result, error: undefined }),\n\t\t\t(error: unknown) => ({ result: undefined, error: error instanceof Error ? error : new Error(String(error)) }),\n\t\t);\n\t\tconst promise = settled.then(({ result }) => result);\n\t\tconst failure = settled.then(({ error }) => error);\n\t\tspeculativeJob = { generation, snapshot, controller, promise, failure };\n\t}\n\n\tfunction capturePendingMetadata(requestId: string, ctx: ExtensionContext): void {\n\t\tpendingMetadata.set(requestId, {\n\t\t\tcheckpoint: checkpointState.captureAgentCheckpoint(pi, ctx),\n\t\t\ttodoSnapshot: todoBridge.createTodoSnapshot(ctx),\n\t\t});\n\t\twhile (pendingMetadata.size > MAX_PENDING_METADATA) {\n\t\t\tconst oldestRequestId = pendingMetadata.keys().next().value;\n\t\t\tif (oldestRequestId === undefined) break;\n\t\t\tpendingMetadata.delete(oldestRequestId);\n\t\t}\n\t}\n\n\tfunction persistAcceptedMetadata(requestId: string): void {\n\t\tconst metadata = pendingMetadata.get(requestId);\n\t\tif (!metadata) return;\n\t\tpendingMetadata.delete(requestId);\n\t\tcheckpointState.persistCheckpoint(pi, metadata.checkpoint);\n\t\ttodoBridge.persistTodoSnapshot(pi, metadata.todoSnapshot);\n\t}\n\n\tasync function applyBlockingCompaction(\n\t\tctx: ExtensionContext,\n\t\tcustomInstructions: string,\n\t): Promise<SpeculativeCompactionResult> {\n\t\tif (breaker.isTripped(state, Date.now())) {\n\t\t\tgetLogger(ctx).debug(\"skip_breaker\", { route: \"blocking\" });\n\t\t\treturn { applied: false, reason: \"rejected\" };\n\t\t}\n\t\tif (cap.shouldRejectByCap(state).cancel) {\n\t\t\tgetLogger(ctx).debug(\"skip_cap\", { route: \"blocking\" });\n\t\t\treturn { applied: false, reason: \"rejected\" };\n\t\t}\n\t\tlet feedbackSignal = ctx.beginCompaction?.({ reason: \"extension\" });\n\t\ttry {\n\t\t\tif (isOpenAiRemoteCompactionModel(ctx.model)) {\n\t\t\t\tconst remoteGeneration = speculativeGeneration + 1;\n\t\t\t\tconst remoteSnapshot = createSpeculativeCompactionSnapshot(ctx, {\n\t\t\t\t\tgeneration: remoteGeneration,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\torigin: \"blocking\",\n\t\t\t\t});\n\t\t\t\tgetLogger(ctx).debug(\"blocking_started\", { generation: remoteGeneration, origin: \"blocking\" });\n\t\t\t\tif (remoteSnapshot) {\n\t\t\t\t\tconst remoteSignal = feedbackSignal ?? new AbortController().signal;\n\t\t\t\t\tconst remoteCompaction = await runOpenAiRemoteCompaction(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tcreateBlockingRemoteCompactionEvent(ctx, remoteSnapshot, customInstructions, remoteSignal),\n\t\t\t\t\t\t(data) => pi.events.emit(SENPI_COMPACTION_EVENT, data),\n\t\t\t\t\t\tremoteCompactionDependencies,\n\t\t\t\t\t);\n\t\t\t\t\tif (remoteCompaction) {\n\t\t\t\t\t\tif (speculativeGeneration !== remoteGeneration - 1) {\n\t\t\t\t\t\t\tconst result = { applied: false, reason: \"stale\" } as const;\n\t\t\t\t\t\t\tgetLogger(ctx).debug(\"speculative_stale\", { generation: remoteGeneration });\n\t\t\t\t\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tspeculativeGeneration = remoteGeneration;\n\t\t\t\t\t\tspeculativeJob?.controller.abort();\n\t\t\t\t\t\tspeculativeJob = undefined;\n\t\t\t\t\t\tconst result = await applyGeneratedCompaction(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tremoteSnapshot,\n\t\t\t\t\t\t\t() => speculativeGeneration,\n\t\t\t\t\t\t\tremoteCompaction,\n\t\t\t\t\t\t\tfeedbackSignal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tgetLogger(ctx).debug(\"speculative_applied\", { generation: remoteGeneration, origin: \"blocking\" });\n\t\t\t\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst pendingJob = speculativeJob;\n\t\t\tif (pendingJob) {\n\t\t\t\tconst unlinkAbort = linkAbortSignal(feedbackSignal, pendingJob.controller);\n\t\t\t\tlet compaction: CompactionResult | undefined;\n\t\t\t\tlet inheritedFailure: Error | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tcompaction = await pendingJob.promise;\n\t\t\t\t\tinheritedFailure = await pendingJob.failure;\n\t\t\t\t\tif (compaction)\n\t\t\t\t\t\tgetLogger(ctx).debug(\"warm_consumed\", { generation: pendingJob.generation, route: \"speculative\" });\n\t\t\t\t} finally {\n\t\t\t\t\tunlinkAbort();\n\t\t\t\t}\n\t\t\t\tif (inheritedFailure !== undefined) {\n\t\t\t\t\tspeculativeJob = undefined;\n\t\t\t\t\tif (isTransientSummarizationFailure(inheritedFailure, inheritedFailure.message)) {\n\t\t\t\t\t\tctx.endCompaction?.({\n\t\t\t\t\t\t\treason: \"extension\",\n\t\t\t\t\t\t\tsignal: feedbackSignal,\n\t\t\t\t\t\t\taborted: feedbackSignal?.aborted,\n\t\t\t\t\t\t\terrorMessage: `Compaction failed: ${inheritedFailure.message}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tstate = breaker.recordFailure(state, Date.now(), { route: \"extension\" });\n\t\t\t\t\t\treturn { applied: false, reason: \"failed\" };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst result = await applyGeneratedCompaction(\n\t\t\t\t\tctx,\n\t\t\t\t\tpendingJob.snapshot,\n\t\t\t\t\t() => speculativeGeneration,\n\t\t\t\t\tcompaction,\n\t\t\t\t\tfeedbackSignal,\n\t\t\t\t);\n\t\t\t\tif (result.applied || result.reason === \"stale\") {\n\t\t\t\t\tspeculativeJob = undefined;\n\t\t\t\t\tif (result.applied)\n\t\t\t\t\t\tgetLogger(ctx).debug(\"speculative_applied\", {\n\t\t\t\t\t\t\tgeneration: pendingJob.generation,\n\t\t\t\t\t\t\torigin: \"speculative\",\n\t\t\t\t\t\t});\n\t\t\t\t\telse getLogger(ctx).debug(\"speculative_stale\", { generation: pendingJob.generation });\n\t\t\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tif (result.reason === \"rejected\") {\n\t\t\t\t\tfeedbackSignal = ctx.beginCompaction?.({ reason: \"extension\" });\n\t\t\t\t}\n\t\t\t\tspeculativeJob = undefined;\n\t\t\t}\n\n\t\t\tconst generation = ++speculativeGeneration;\n\t\t\tconst snapshot = createSpeculativeCompactionSnapshot(ctx, {\n\t\t\t\tgeneration,\n\t\t\t\tcustomInstructions,\n\t\t\t\torigin: \"core-route\",\n\t\t\t\ttools: getSummarizationTools(),\n\t\t\t});\n\t\t\tif (!snapshot) {\n\t\t\t\tconst result = { applied: false, reason: \"unavailable\" } as const;\n\t\t\t\tgetLogger(ctx).debug(\"summary_failed\", { reason: \"unavailable\" });\n\t\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tlet compaction: CompactionResult | undefined;\n\t\t\ttry {\n\t\t\t\tcompaction = await runExtensionCompaction(ctx, snapshot, feedbackSignal, (delta) =>\n\t\t\t\t\tctx.updateCompaction?.({\n\t\t\t\t\t\treason: \"extension\",\n\t\t\t\t\t\tsignal: feedbackSignal,\n\t\t\t\t\t\tdelta,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof SummaryGenerationError)) throw error;\n\t\t\t\tgetLogger(ctx).debug(\"summary_failed\", { reason: error.kind });\n\t\t\t}\n\t\t\tconst result = await applyGeneratedCompaction(\n\t\t\t\tctx,\n\t\t\t\tsnapshot,\n\t\t\t\t() => speculativeGeneration,\n\t\t\t\tcompaction,\n\t\t\t\tfeedbackSignal,\n\t\t\t);\n\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tctx.endCompaction?.({\n\t\t\t\treason: \"extension\",\n\t\t\t\tsignal: feedbackSignal,\n\t\t\t\taborted: feedbackSignal?.aborted,\n\t\t\t\terrorMessage: `Compaction failed: ${message}`,\n\t\t\t});\n\t\t\tconst transient = isTransientSummarizationFailure(error, message);\n\t\t\tif (transient) {\n\t\t\t\tstate = breaker.recordFailure(state, Date.now(), { route: \"extension\" });\n\t\t\t\treturn { applied: false, reason: \"failed\" };\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpi.on(\"session_before_compact\", async (event: SessionBeforeCompactEvent, ctx) => {\n\t\tinvalidateSpeculativeCompaction(ctx);\n\t\tif (lanePolicy.disablesSenpiCompaction(ctx)) {\n\t\t\treturn { cancel: true, reason: SDK_NATIVE_LANE_REJECTION_REASON };\n\t\t}\n\t\tif (cap.shouldRejectByCap(state, { reason: event.reason }).cancel) {\n\t\t\tgetLogger(ctx).debug(\"skip_cap\", { reason: event.reason, count: state.acceptedThisTurn });\n\t\t\treturn {\n\t\t\t\tcancel: true,\n\t\t\t\trejectionCause: \"per-turn-cap\",\n\t\t\t\treason: \"per-turn compaction cap reached for this turn\",\n\t\t\t};\n\t\t}\n\t\tconst now = Date.now();\n\t\tif (breaker.isTripped(state, now) && !breaker.shouldBypass(state, { reason: event.reason })) {\n\t\t\tconst remainingMs = state.trippedAt !== null ? Math.max(0, state.trippedAt + breaker.COOLDOWN_MS - now) : 0;\n\t\t\tgetLogger(ctx).debug(\"skip_breaker\", { reason: event.reason, remainingSec: Math.ceil(remainingMs / 1000) });\n\t\t\treturn {\n\t\t\t\tcancel: true,\n\t\t\t\trejectionCause: \"circuit-breaker\",\n\t\t\t\treason: `compaction circuit breaker cooling down (${Math.ceil(remainingMs / 1000)}s left)`,\n\t\t\t};\n\t\t}\n\n\t\tcapturePendingMetadata(event.requestId, ctx);\n\n\t\tconst model = ctx.model;\n\t\tif (!model) return undefined;\n\t\tconst remoteCompaction = await runOpenAiRemoteCompaction(\n\t\t\tctx,\n\t\t\tevent,\n\t\t\t(data) => pi.events.emit(SENPI_COMPACTION_EVENT, data),\n\t\t\tremoteCompactionDependencies,\n\t\t);\n\t\tif (remoteCompaction) {\n\t\t\tgetLogger(ctx).debug(\"core_route_generated\", { route: \"core-route\", requestId: event.requestId });\n\t\t\treturn { compaction: remoteCompaction };\n\t\t}\n\n\t\tconst snapshot = {\n\t\t\tgeneration: ++speculativeGeneration,\n\t\t\texpectedRevision: ctx.getMessageRevision(),\n\t\t\tmodel,\n\t\t\tcontextWindow: ctx.getContextUsage()?.contextWindow ?? model.contextWindow ?? DEFAULT_CONTEXT_WINDOW,\n\t\t\tpreparation: event.preparation,\n\t\t\tbranchEntries: event.branchEntries,\n\t\t\tpromptVariant: getPromptVariant(event),\n\t\t\torigin: \"core-route\" as const,\n\t\t\tcustomInstructions: event.customInstructions,\n\t\t\tsystemPrompt: ctx.getSystemPrompt(),\n\t\t\ttools: getSummarizationTools(),\n\t\t};\n\t\tlet compaction: CompactionResult | undefined;\n\t\ttry {\n\t\t\tcompaction = await runExtensionCompaction(ctx, snapshot, event.signal, (delta) =>\n\t\t\t\tctx.updateCompaction?.({ reason: event.reason, signal: event.signal, delta }),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconst failureKind = classifyRequiredCompactionFallbackFailure(error);\n\t\t\tif (isRequiredCompactionFallbackReason(event.reason) && failureKind !== undefined && !event.signal.aborted) {\n\t\t\t\tconst fallback = createRequiredCompactionFallback(\n\t\t\t\t\tsnapshot.preparation,\n\t\t\t\t\tsnapshot.contextWindow,\n\t\t\t\t\tfailureKind,\n\t\t\t\t\t{ taskIntent: resolveInheritedTaskIntent(event.branchEntries) },\n\t\t\t\t\tevent.branchEntries,\n\t\t\t\t);\n\t\t\t\tif (fallback) return { compaction: fallback };\n\t\t\t\tpendingMetadata.delete(event.requestId);\n\t\t\t\treturn {\n\t\t\t\t\tcancel: true,\n\t\t\t\t\treason: \"deterministic compaction fallback cannot retain the prepared suffix\",\n\t\t\t\t};\n\t\t\t}\n\t\t\tpendingMetadata.delete(event.requestId);\n\t\t\tif (error instanceof SummaryGenerationError) {\n\t\t\t\treturn { cancel: true, reason: error.message };\n\t\t\t}\n\t\t\treturn { cancel: true, reason: `compaction generator failed: ${message}` };\n\t\t}\n\t\tif (!compaction) {\n\t\t\tpendingMetadata.delete(event.requestId);\n\t\t\tif (event.signal.aborted) {\n\t\t\t\treturn { cancel: true };\n\t\t\t}\n\t\t\treturn { cancel: true, reason: \"compaction generator returned no summary\" };\n\t\t}\n\n\t\treturn {\n\t\t\tcompaction,\n\t\t};\n\t});\n\n\tpi.on(\"model_select\", (event, ctx) => {\n\t\tif (lanePolicy.disablesSenpiCompaction(ctx)) {\n\t\t\tinvalidateSpeculativeCompaction(ctx);\n\t\t\treturn;\n\t\t}\n\t\tconst jobModel = speculativeJob?.snapshot.model;\n\t\tconst selectedModel = ctx.model;\n\t\tconst alreadySpeculatingForSelectedModel =\n\t\t\tjobModel !== undefined &&\n\t\t\tselectedModel !== undefined &&\n\t\t\tjobModel.api === selectedModel.api &&\n\t\t\tjobModel.provider === selectedModel.provider &&\n\t\t\tjobModel.id === selectedModel.id &&\n\t\t\tjobModel.baseUrl === selectedModel.baseUrl &&\n\t\t\tjobModel.contextWindow === selectedModel.contextWindow;\n\t\tif (!alreadySpeculatingForSelectedModel) {\n\t\t\tinvalidateSpeculativeCompaction(ctx);\n\t\t}\n\t\tconst previousWindow = event.previousModel?.contextWindow ?? 0;\n\t\tconst contextWindow = ctx.model?.contextWindow ?? 0;\n\t\tif (previousWindow <= contextWindow) return;\n\t\tconst usage = ctx.getContextUsage();\n\t\tif (!usage) return;\n\t\tif (breaker.isTripped(state, Date.now())) return;\n\t\tconst settings = ctx.getCompactionSettings();\n\t\tif (policy.shouldStartSpeculativeCompaction(usage, contextWindow, settings, state.lastYield ?? undefined)) {\n\t\t\tstartSpeculativeCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);\n\t\t}\n\t});\n\n\tpi.on(\"session_compact\", async (event: SessionCompactEvent, ctx) => {\n\t\tconst compactEvent = event;\n\t\tinvalidateSpeculativeCompaction(ctx);\n\t\tif (compactEvent.accepted) {\n\t\t\tpersistAcceptedMetadata(compactEvent.requestId);\n\t\t\tconst branchEntries = ctx.sessionManager.getBranch();\n\t\t\tconst firstKeptIndex = branchEntries.findIndex(\n\t\t\t\t(entry) => entry.id === compactEvent.compactionEntry.firstKeptEntryId,\n\t\t\t);\n\t\t\tconst keptEntries = firstKeptIndex === -1 ? [] : branchEntries.slice(firstKeptIndex);\n\t\t\tstate = cap.incrementAccepted(state);\n\t\t\tstate = breaker.recordSuccess(state);\n\t\t\tconst details = compactEvent.compactionEntry.details as\n\t\t\t\t| { structuralYield?: { savedTokens: number; savingsRatio: number } }\n\t\t\t\t| undefined;\n\t\t\tconst sy = details?.structuralYield;\n\t\t\tif (sy && typeof sy.savedTokens === \"number\" && typeof sy.savingsRatio === \"number\") {\n\t\t\t\tstate = {\n\t\t\t\t\t...state,\n\t\t\t\t\tlastYield: { savedTokens: sy.savedTokens, tokensBefore: compactEvent.compactionEntry.tokensBefore },\n\t\t\t\t};\n\t\t\t\tif (\n\t\t\t\t\tisIneffectiveCompaction({\n\t\t\t\t\t\ttokensBefore: compactEvent.compactionEntry.tokensBefore,\n\t\t\t\t\t\tsavedTokens: sy.savedTokens,\n\t\t\t\t\t\tsavingsRatio: sy.savingsRatio,\n\t\t\t\t\t})\n\t\t\t\t) {\n\t\t\t\t\tstate = cap.incrementIneffective(state);\n\t\t\t\t\tgetLogger(ctx).debug(\"ineffective_counted\", {\n\t\t\t\t\t\ttokensBefore: compactEvent.compactionEntry.tokensBefore,\n\t\t\t\t\t\tsavedTokens: sy.savedTokens,\n\t\t\t\t\t\tsavingsRatio: sy.savingsRatio,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tresetOnSessionCompact(degradationState);\n\t\t\ttodoBridge.restoreTodosIfMissing(pi, ctx);\n\t\t\tconst usage = ctx.getContextUsage();\n\t\t\tconst settings = ctx.getCompactionSettings();\n\t\t\tif (settings.restorationEnabled ?? true) {\n\t\t\t\trestoration.preparePendingPayload(restorationState, {\n\t\t\t\t\taccepted: true,\n\t\t\t\t\treason: compactEvent.reason,\n\t\t\t\t\tcompactionEntryId: compactEvent.compactionEntry.id,\n\t\t\t\t\tcontextWindow: usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW,\n\t\t\t\t\tusageTokens: usage?.tokens ?? null,\n\t\t\t\t\treserveTokens: settings.reserveTokens,\n\t\t\t\t\tsettings,\n\t\t\t\t\tkeptMessages: keptEntries.flatMap((entry) => {\n\t\t\t\t\t\tif (entry.type !== \"message\") return [];\n\t\t\t\t\t\treturn [entry.message];\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tstate = breaker.recordFailure(state, Date.now(), { route: compactEvent.reason });\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tcancelIdleWarmupRetry();\n\t\tconst message = checkpointState.attachRestorationDirective(\n\t\t\trestorationDirectiveState,\n\t\t\trecentCheckpoint(ctx),\n\t\t\trestoration.consumePendingPayload(restorationState),\n\t\t);\n\n\t\tconst usage = ctx.getContextUsage();\n\t\tconst contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\t\tconst settings = ctx.getCompactionSettings();\n\t\tconst pendingPromptTokens = estimatePendingPromptTokens(event);\n\t\tconst usageWithPendingPrompt = usage ? withAdditionalTokens(usage, pendingPromptTokens) : undefined;\n\t\t// The SDK owns this lane's context entirely, so even the hard-limit valve stands down;\n\t\t// the circuit breaker never blocks that valve for senpi-owned lanes.\n\t\tconst laneOwnsCompaction = lanePolicy.disablesSenpiCompaction(ctx);\n\t\tconst breakerCoolingDown = breaker.isTripped(state, Date.now()) || laneOwnsCompaction;\n\t\tif (\n\t\t\t!laneOwnsCompaction &&\n\t\t\tusage &&\n\t\t\tpolicy.isAtHardLimit(usage, contextWindow, settings.reserveTokens, pendingPromptTokens)\n\t\t) {\n\t\t\tgetLogger(ctx).debug(\"hard_limit_trigger\", {\n\t\t\t\tcontextWindow,\n\t\t\t\ttokens: usage.tokens ?? 0,\n\t\t\t\tthreshold: settings.reserveTokens,\n\t\t\t});\n\t\t\tawait applyBlockingCompaction(ctx, EMERGENCY_COMPACTION_INSTRUCTIONS);\n\t\t} else if (\n\t\t\t!breakerCoolingDown &&\n\t\t\tusageWithPendingPrompt &&\n\t\t\tpolicy.shouldTriggerCompaction(usageWithPendingPrompt, contextWindow, settings, state.lastYield ?? undefined)\n\t\t) {\n\t\t\tgetLogger(ctx).debug(\"threshold_trigger\", {\n\t\t\t\tcontextWindow,\n\t\t\t\ttokens: usageWithPendingPrompt.tokens ?? 0,\n\t\t\t\tthreshold: settings.reserveTokens,\n\t\t\t});\n\t\t\tawait applyBlockingCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);\n\t\t} else if (\n\t\t\t!breakerCoolingDown &&\n\t\t\tusageWithPendingPrompt &&\n\t\t\tpolicy.shouldStartSpeculativeCompaction(\n\t\t\t\tusageWithPendingPrompt,\n\t\t\t\tcontextWindow,\n\t\t\t\tsettings,\n\t\t\t\tstate.lastYield ?? undefined,\n\t\t\t)\n\t\t) {\n\t\t\tgetLogger(ctx).debug(\"emergency_prune\", {\n\t\t\t\troute: \"context-event\",\n\t\t\t\ttokens: usageWithPendingPrompt.tokens ?? 0,\n\t\t\t});\n\t\t\tstartSpeculativeCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);\n\t\t}\n\n\t\treturn message ? { message } : undefined;\n\t});\n\n\tpi.on(\"context\", (event, ctx) => {\n\t\tconst usage = ctx.getContextUsage();\n\t\tconst contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\t\tconst promptContextWindow = getPromptContextWindow(contextWindow, ctx.model?.maxTokens);\n\t\tconst sourceMessages = shouldApplyContextReduction({\n\t\t\tusageTokens: usage?.tokens ?? null,\n\t\t\tcontextWindow,\n\t\t\tisProviderNativeCompactionPath:\n\t\t\t\tisOpenAiRemoteCompactionModel(ctx.model) || lanePolicy.disablesSenpiCompaction(ctx),\n\t\t})\n\t\t\t? reduceContextMessages(event.messages, BUILTIN_CONTEXT_REDUCTION_OPTIONS).messages\n\t\t\t: event.messages;\n\t\t// The claude-sdk-oauth lane stands down from senpi compaction entirely:\n\t\t// destructively pruning the provider context near the hard limit would\n\t\t// break the resident SDK session's continuity the same way the gated\n\t\t// reduction lane would.\n\t\tconst emergency = lanePolicy.disablesSenpiCompaction(ctx)\n\t\t\t? { messages: sourceMessages, needsAggressiveCompaction: false }\n\t\t\t: hardLimitEmergencyPrune(sourceMessages, promptContextWindow, emergencyPruneLatch);\n\t\tconst marked = markOpenAiRemoteReplayBoundary(emergency.messages, {\n\t\t\tmodel: ctx.model,\n\t\t\tbranchEntries: ctx.sessionManager.getBranch(),\n\t\t});\n\t\treturn { messages: repairOrphanedToolResults(convertToLlm(marked)) };\n\t});\n\n\tpi.on(\"before_provider_request\", async (event, ctx) => {\n\t\tconst model = event.model ?? ctx.model;\n\t\tif (!isOpenAiRemoteCompactionModel(model)) return undefined;\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (!auth.ok) return undefined;\n\t\tconst effectiveModel =\n\t\t\tauth.upstreamModelId || auth.baseUrl\n\t\t\t\t? {\n\t\t\t\t\t\t...model,\n\t\t\t\t\t\t...(auth.upstreamModelId ? { id: auth.upstreamModelId } : {}),\n\t\t\t\t\t\t...(auth.baseUrl ? { baseUrl: auth.baseUrl } : {}),\n\t\t\t\t\t}\n\t\t\t\t: model;\n\t\tconst headers = createOpenAiRemoteCompactionHeaders(\n\t\t\teffectiveModel,\n\t\t\t{ ...auth, headers: event.headers ?? auth.headers },\n\t\t\tctx.sessionManager.getSessionId(),\n\t\t);\n\t\tif (!headers) return undefined;\n\t\tconst origin = openAiRemoteCompactionOrigin(effectiveModel, headers);\n\t\treturn rewriteOpenAiPayloadWithRemoteCompaction(\n\t\t\tevent.payload,\n\t\t\t{ model: effectiveModel, branchEntries: ctx.sessionManager.getBranch(), origin },\n\t\t\t(data) => pi.events.emit(SENPI_COMPACTION_EVENT, data),\n\t\t);\n\t});\n\n\tpi.on(\"turn_end\", async (_event, ctx) => {\n\t\ttry {\n\t\t\tif (lanePolicy.disablesSenpiCompaction(ctx)) return;\n\t\t\thandleTurnEnd(degradationState);\n\t\t\tif (degradationState.recoveryTriggeredThisCycle) return;\n\t\t\tif (state.lastYield && state.lastYield.savedTokens <= 0) {\n\t\t\t\tvoid applyBlockingCompaction(ctx, RECOVERY_INSTRUCTIONS).catch(() => {});\n\t\t\t}\n\t\t} finally {\n\t\t\tstate = resetTurnCounter(state, \"\");\n\t\t}\n\t});\n\n\tpi.on(\"agent_end\", async (event, ctx) => {\n\t\tstate = resetTurnCounter(state, \"\");\n\t\tif (lanePolicy.disablesSenpiCompaction(ctx)) return;\n\t\tconst usage = ctx.getContextUsage();\n\t\tconst contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\t\tconst settings = ctx.getCompactionSettings();\n\t\tif (\n\t\t\tidle.shouldRunIdleCompaction({\n\t\t\t\twillRetry: event.willRetry ?? false,\n\t\t\t\taborted: event.aborted === true,\n\t\t\t\tsettings,\n\t\t\t\tusage,\n\t\t\t\tcontextWindow,\n\t\t\t\tbreakerTripped: breaker.isTripped(state, Date.now()),\n\t\t\t\tlastYield: state.lastYield ?? undefined,\n\t\t\t\tmode: ctx.mode,\n\t\t\t})\n\t\t) {\n\t\t\tgetLogger(ctx).debug(\"idle_trigger\", { contextWindow, tokens: usage?.tokens ?? 0 });\n\t\t\tidleWarmupAttempt = 0;\n\t\t\tstartSpeculativeCompaction(ctx, idle.IDLE_COMPACTION_INSTRUCTIONS);\n\t\t\tarmIdleWarmupRetry(ctx);\n\t\t}\n\t});\n\n\tpi.on(\"message_end\", async (event, ctx) => {\n\t\tfor (const entry of collectCompactBoundaryEntries(event.message)) {\n\t\t\tpi.appendEntry(CLAUDE_SDK_OAUTH_COMPACT_ENTRY_TYPE, entry);\n\t\t}\n\t\tif (isAbortedAssistantMessage(event)) {\n\t\t\tinvalidateSpeculativeCompaction(ctx);\n\t\t}\n\t\tif (isMonitorableMessageEvent(event) && !lanePolicy.disablesSenpiCompaction(ctx)) {\n\t\t\tawait handleMessageEnd(degradationState, event, {\n\t\t\t\tapplyCompaction: async (options) => {\n\t\t\t\t\treturn await applyBlockingCompaction(ctx, options.customInstructions);\n\t\t\t\t},\n\t\t\t\tnotify: (message) => ctx.ui.notify(message, \"warning\"),\n\t\t\t});\n\t\t}\n\t});\n\n\tpi.on(\"tool_call\", (event) => {\n\t\trestoration.trackToolCall(restorationState, event);\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Tool } from \"@earendil-works/pi-ai\";\nimport type { CompactionResult } from \"../../../compaction/index.ts\";\nimport { convertToLlm } from \"../../../messages.ts\";\nimport type {\n\tContextUsage,\n\tExtensionAPI,\n\tExtensionContext,\n\tSessionBeforeCompactEvent,\n\tSessionCompactEvent,\n} from \"../../types.ts\";\nimport * as checkpointState from \"./checkpoint-state.ts\";\nimport * as breaker from \"./circuit-breaker.ts\";\nimport {\n\tBUILTIN_CONTEXT_REDUCTION_OPTIONS,\n\treduceContextMessages,\n\tshouldApplyContextReduction,\n} from \"./context-reduction.ts\";\nimport {\n\tcreateDegradationMonitorState,\n\thandleMessageEnd,\n\thandleTurnEnd,\n\tRECOVERY_INSTRUCTIONS,\n\tresetOnSessionCompact,\n} from \"./degradation-monitor.ts\";\nimport {\n\tclassifyRequiredCompactionFallbackFailure,\n\tcreateRequiredCompactionFallback,\n} from \"./deterministic-fallback.ts\";\nimport * as idle from \"./idle.ts\";\nimport * as idleRetry from \"./idle-retry.ts\";\nimport {\n\tCLAUDE_SDK_OAUTH_COMPACT_ENTRY_TYPE,\n\tcollectCompactBoundaryEntries,\n\tcreateCompactionLanePolicy,\n\tSDK_NATIVE_LANE_REJECTION_REASON,\n} from \"./lane-policy.ts\";\nimport { type CompactionLogger, createCompactionLogger } from \"./log.ts\";\nimport {\n\tmarkOpenAiRemoteReplayBoundary,\n\ttype OpenAiRemoteCompactionDependencies,\n\trewriteOpenAiPayloadWithRemoteCompaction,\n\trunOpenAiRemoteCompaction,\n\tSENPI_COMPACTION_EVENT,\n} from \"./openai-remote.ts\";\nimport {\n\tcreateOpenAiRemoteCompactionHeaders,\n\tisOpenAiRemoteCompactionModel,\n\topenAiRemoteCompactionOrigin,\n} from \"./openai-remote-model.ts\";\nimport * as cap from \"./per-turn-cap.ts\";\nimport * as policy from \"./policy.ts\";\nimport { repairOrphanedToolResults } from \"./repair-tool-pairs.ts\";\nimport * as restoration from \"./restoration-tracker.ts\";\nimport {\n\tapplyGeneratedCompaction,\n\tcreateEmergencyPruneLatch,\n\tcreateSpeculativeCompactionSnapshot,\n\tgetPromptVariant,\n\thardLimitEmergencyPrune,\n\trunExtensionCompaction,\n\ttype SpeculativeCompactionResult,\n\ttype SpeculativeCompactionSnapshot,\n\tSummaryGenerationError,\n} from \"./speculative.ts\";\nimport { type CompactionExtensionState, createInitialState, resetTurnCounter } from \"./state.ts\";\nimport { resolveInheritedTaskIntent } from \"./task-intent.ts\";\nimport * as todoBridge from \"./todo-bridge.ts\";\nimport { isTransientSummarizationFailure } from \"./transient-failure.ts\";\nimport { isIneffectiveCompaction } from \"./yield.ts\";\n\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\nconst EMERGENCY_COMPACTION_INSTRUCTIONS =\n\t\"EMERGENCY: hard context limit reached. Produce an aggressive recovery summary that preserves current goal, constraints, files touched, tool outcomes, and exact next steps. Prefer concise factual state over transcript detail.\";\nconst PROACTIVE_COMPACTION_INSTRUCTIONS = \"Proactively compact before the next agent turn.\";\nconst MAX_PENDING_METADATA = 8;\nconst IMAGE_PROMPT_TOKEN_ESTIMATE = 1_200;\nconst MAX_OUTPUT_RESERVE_RATIO = 0.5;\n\ninterface PendingCompactionMetadata {\n\tcheckpoint: checkpointState.AgentCheckpoint;\n\ttodoSnapshot: todoBridge.TodoSnapshotPayload;\n}\n\nfunction approxTokens(text: string): number {\n\treturn Math.ceil(text.length / 4);\n}\n\nfunction estimatePendingPromptTokens(event: { prompt?: string; images?: readonly unknown[] }): number {\n\treturn approxTokens(event.prompt ?? \"\") + (event.images?.length ?? 0) * IMAGE_PROMPT_TOKEN_ESTIMATE;\n}\n\nfunction getPromptContextWindow(contextWindow: number, maxTokens: number | undefined): number {\n\tif (typeof maxTokens !== \"number\" || !Number.isFinite(maxTokens) || maxTokens <= 0 || contextWindow <= 0) {\n\t\treturn contextWindow;\n\t}\n\tconst outputReserve = Math.min(maxTokens, Math.floor(contextWindow * MAX_OUTPUT_RESERVE_RATIO));\n\treturn contextWindow - outputReserve;\n}\n\nfunction withAdditionalTokens(usage: ContextUsage, additionalTokens: number): ContextUsage {\n\tif (usage.tokens === null || additionalTokens <= 0) return usage;\n\tconst tokens = usage.tokens + additionalTokens;\n\treturn {\n\t\t...usage,\n\t\ttokens,\n\t\tpercent: usage.contextWindow > 0 ? (tokens / usage.contextWindow) * 100 : usage.percent,\n\t};\n}\n\nfunction isMonitorableMessageEvent(event: { message: AgentMessage }): event is {\n\tmessage: AgentMessage & { content: Array<{ type: string; text?: string }> };\n} {\n\treturn \"content\" in event.message && Array.isArray(event.message.content);\n}\n\nfunction isAbortedAssistantMessage(event: { message: AgentMessage }): boolean {\n\treturn event.message.role === \"assistant\" && \"stopReason\" in event.message && event.message.stopReason === \"aborted\";\n}\n\nfunction isRequiredCompactionFallbackReason(reason: SessionBeforeCompactEvent[\"reason\"]): boolean {\n\treturn reason === \"threshold\" || reason === \"overflow\";\n}\n\nfunction recentCheckpoint(ctx: ExtensionContext): checkpointState.AgentCheckpoint | null {\n\tconst checkpoint = checkpointState.getLatestCheckpoint(ctx);\n\tif (!checkpoint?.timestamp) return null;\n\treturn Date.now() - checkpoint.timestamp <= 60_000 ? checkpoint : null;\n}\n\nfunction shouldEndFeedback(result: SpeculativeCompactionResult): boolean {\n\treturn !result.applied && result.reason !== \"rejected\";\n}\n\nfunction endCompactionFeedback(\n\tctx: ExtensionContext,\n\tsignal: AbortSignal | undefined,\n\tresult: SpeculativeCompactionResult,\n): void {\n\tif (shouldEndFeedback(result)) {\n\t\tctx.endCompaction?.({ reason: \"extension\", signal, aborted: signal?.aborted });\n\t}\n}\n\nfunction linkAbortSignal(source: AbortSignal | undefined, target: AbortController): () => void {\n\tif (!source) return () => {};\n\tif (source.aborted) {\n\t\ttarget.abort();\n\t\treturn () => {};\n\t}\n\tconst abort = () => target.abort();\n\tsource.addEventListener(\"abort\", abort, { once: true });\n\treturn () => source.removeEventListener(\"abort\", abort);\n}\n\nfunction createBlockingRemoteCompactionEvent(\n\tctx: ExtensionContext,\n\tsnapshot: SpeculativeCompactionSnapshot,\n\tcustomInstructions: string,\n\tsignal: AbortSignal,\n): SessionBeforeCompactEvent {\n\treturn {\n\t\ttype: \"session_before_compact\",\n\t\treason: \"extension\",\n\t\twillRetry: false,\n\t\trequestId: randomUUID(),\n\t\tpreparation: snapshot.preparation,\n\t\tbranchEntries: ctx.sessionManager.getBranch(),\n\t\tcustomInstructions,\n\t\tsignal,\n\t};\n}\n\nexport default function compactionExtension(\n\tpi: ExtensionAPI,\n\tremoteCompactionDependencies: OpenAiRemoteCompactionDependencies = {},\n): void {\n\tlet state: CompactionExtensionState = createInitialState();\n\tconst lanePolicy = createCompactionLanePolicy();\n\tconst restorationDirectiveState = checkpointState.createRestorationDirectiveState();\n\tconst emergencyPruneLatch = createEmergencyPruneLatch();\n\tconst degradationState = createDegradationMonitorState();\n\tconst restorationState = state.restoration ?? restoration.createRestorationTrackerState();\n\tstate = { ...state, restoration: restorationState };\n\tlet speculativeGeneration = 0;\n\tlet speculativeJob:\n\t\t| {\n\t\t\t\tgeneration: number;\n\t\t\t\tsnapshot: SpeculativeCompactionSnapshot;\n\t\t\t\tcontroller: AbortController;\n\t\t\t\tpromise: Promise<CompactionResult | undefined>;\n\t\t\t\tfailure: Promise<Error | undefined>;\n\t\t }\n\t\t| undefined;\n\tconst pendingMetadata = new Map<string, PendingCompactionMetadata>();\n\tlet logger: CompactionLogger | undefined;\n\tconst getLogger = (ctx: ExtensionContext): CompactionLogger => (logger ??= createCompactionLogger(ctx.agentDir));\n\n\tfunction getSummarizationTools(): Tool[] {\n\t\tif (typeof pi.getAllTools !== \"function\" || typeof pi.getActiveTools !== \"function\") return [];\n\t\ttry {\n\t\t\tconst definitionsByName = new Map(pi.getAllTools().map((tool) => [tool.name, tool]));\n\t\t\treturn pi.getActiveTools().flatMap((name) => {\n\t\t\t\tconst tool = definitionsByName.get(name);\n\t\t\t\treturn tool ? [{ name: tool.name, description: tool.description, parameters: tool.parameters }] : [];\n\t\t\t});\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tlet idleWarmupTimer: ReturnType<typeof setTimeout> | undefined;\n\tlet idleWarmupAttempt = 0;\n\n\tfunction cancelIdleWarmupRetry(): void {\n\t\tif (idleWarmupTimer === undefined) return;\n\t\tclearTimeout(idleWarmupTimer);\n\t\tidleWarmupTimer = undefined;\n\t}\n\n\t// Fenced on the observed job: a prompt, invalidation, or newer warm-up\n\t// stands this watcher down before it can start a duplicate summarization.\n\tfunction armIdleWarmupRetry(ctx: ExtensionContext): void {\n\t\tconst job = speculativeJob;\n\t\tif (!job) return;\n\t\tvoid job.failure.then((failure) => {\n\t\t\tif (failure === undefined) {\n\t\t\t\tidleWarmupAttempt = 0;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (speculativeJob !== job) return;\n\t\t\tconst usage = ctx.getContextUsage();\n\t\t\tconst contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\t\t\tconst retryDecision: idleRetry.IdleWarmupRetryDecision = {\n\t\t\t\tattempt: idleWarmupAttempt,\n\t\t\t\ttransient: isTransientSummarizationFailure(failure, failure.message),\n\t\t\t\tisIdle: ctx.isIdle(),\n\t\t\t\tbreakerTripped: breaker.isTripped(state, Date.now()),\n\t\t\t\tstillOverThreshold:\n\t\t\t\t\tusage !== undefined &&\n\t\t\t\t\tpolicy.shouldTriggerCompaction(\n\t\t\t\t\t\tusage,\n\t\t\t\t\t\tcontextWindow,\n\t\t\t\t\t\tctx.getCompactionSettings(),\n\t\t\t\t\t\tstate.lastYield ?? undefined,\n\t\t\t\t\t),\n\t\t\t};\n\t\t\tif (!idleRetry.shouldRetryIdleWarmup(retryDecision)) return;\n\t\t\tcancelIdleWarmupRetry();\n\t\t\tidleWarmupTimer = setTimeout(() => {\n\t\t\t\tidleWarmupTimer = undefined;\n\t\t\t\tif (speculativeJob !== job) return;\n\t\t\t\tif (!ctx.isIdle()) return;\n\t\t\t\tidleWarmupAttempt += 1;\n\t\t\t\tgetLogger(ctx).debug(\"idle_trigger\", {\n\t\t\t\t\tcontextWindow,\n\t\t\t\t\ttokens: usage?.tokens ?? 0,\n\t\t\t\t\tcount: idleWarmupAttempt,\n\t\t\t\t});\n\t\t\t\tinvalidateSpeculativeCompaction(ctx);\n\t\t\t\tstartSpeculativeCompaction(ctx, idle.IDLE_COMPACTION_INSTRUCTIONS);\n\t\t\t\tarmIdleWarmupRetry(ctx);\n\t\t\t}, idleRetry.IDLE_WARMUP_RETRY_DELAY_MS);\n\t\t});\n\t}\n\n\tfunction invalidateSpeculativeCompaction(ctx: ExtensionContext): void {\n\t\tconst previousGeneration = speculativeGeneration;\n\t\tspeculativeGeneration++;\n\t\tgetLogger(ctx).debug(\"speculative_invalidated\", { generation: previousGeneration });\n\t\tspeculativeJob?.controller.abort();\n\t\tspeculativeJob = undefined;\n\t}\n\n\tfunction startSpeculativeCompaction(ctx: ExtensionContext, customInstructions: string): void {\n\t\tif (speculativeJob) return;\n\t\tconst generation = ++speculativeGeneration;\n\t\tconst snapshot = createSpeculativeCompactionSnapshot(ctx, {\n\t\t\tgeneration,\n\t\t\tcustomInstructions,\n\t\t\torigin: \"speculative\",\n\t\t\ttools: getSummarizationTools(),\n\t\t});\n\t\tif (!snapshot) return;\n\t\tgetLogger(ctx).debug(\"speculative_started\", { generation, origin: \"speculative\" });\n\t\tconst controller = new AbortController();\n\t\tconst settled = runExtensionCompaction(ctx, snapshot, controller.signal).then(\n\t\t\t(result) => ({ result, error: undefined }),\n\t\t\t(error: unknown) => ({ result: undefined, error: error instanceof Error ? error : new Error(String(error)) }),\n\t\t);\n\t\tconst promise = settled.then(({ result }) => result);\n\t\tconst failure = settled.then(({ error }) => error);\n\t\tspeculativeJob = { generation, snapshot, controller, promise, failure };\n\t}\n\n\tfunction capturePendingMetadata(requestId: string, ctx: ExtensionContext): void {\n\t\tpendingMetadata.set(requestId, {\n\t\t\tcheckpoint: checkpointState.captureAgentCheckpoint(pi, ctx),\n\t\t\ttodoSnapshot: todoBridge.createTodoSnapshot(ctx),\n\t\t});\n\t\twhile (pendingMetadata.size > MAX_PENDING_METADATA) {\n\t\t\tconst oldestRequestId = pendingMetadata.keys().next().value;\n\t\t\tif (oldestRequestId === undefined) break;\n\t\t\tpendingMetadata.delete(oldestRequestId);\n\t\t}\n\t}\n\n\tfunction persistAcceptedMetadata(requestId: string): void {\n\t\tconst metadata = pendingMetadata.get(requestId);\n\t\tif (!metadata) return;\n\t\tpendingMetadata.delete(requestId);\n\t\tcheckpointState.persistCheckpoint(pi, metadata.checkpoint);\n\t\ttodoBridge.persistTodoSnapshot(pi, metadata.todoSnapshot);\n\t}\n\n\tasync function applyBlockingCompaction(\n\t\tctx: ExtensionContext,\n\t\tcustomInstructions: string,\n\t): Promise<SpeculativeCompactionResult> {\n\t\tif (breaker.isTripped(state, Date.now())) {\n\t\t\tgetLogger(ctx).debug(\"skip_breaker\", { route: \"blocking\" });\n\t\t\treturn { applied: false, reason: \"rejected\" };\n\t\t}\n\t\tif (cap.shouldRejectByCap(state).cancel) {\n\t\t\tgetLogger(ctx).debug(\"skip_cap\", { route: \"blocking\" });\n\t\t\treturn { applied: false, reason: \"rejected\" };\n\t\t}\n\t\tlet feedbackSignal = ctx.beginCompaction?.({ reason: \"extension\" });\n\t\ttry {\n\t\t\tif (isOpenAiRemoteCompactionModel(ctx.model)) {\n\t\t\t\tconst remoteGeneration = speculativeGeneration + 1;\n\t\t\t\tconst remoteSnapshot = createSpeculativeCompactionSnapshot(ctx, {\n\t\t\t\t\tgeneration: remoteGeneration,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\torigin: \"blocking\",\n\t\t\t\t});\n\t\t\t\tgetLogger(ctx).debug(\"blocking_started\", { generation: remoteGeneration, origin: \"blocking\" });\n\t\t\t\tif (remoteSnapshot) {\n\t\t\t\t\tconst remoteSignal = feedbackSignal ?? new AbortController().signal;\n\t\t\t\t\tconst remoteCompaction = await runOpenAiRemoteCompaction(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tcreateBlockingRemoteCompactionEvent(ctx, remoteSnapshot, customInstructions, remoteSignal),\n\t\t\t\t\t\t(data) => pi.events.emit(SENPI_COMPACTION_EVENT, data),\n\t\t\t\t\t\tremoteCompactionDependencies,\n\t\t\t\t\t);\n\t\t\t\t\tif (remoteCompaction) {\n\t\t\t\t\t\tif (speculativeGeneration !== remoteGeneration - 1) {\n\t\t\t\t\t\t\tconst result = { applied: false, reason: \"stale\" } as const;\n\t\t\t\t\t\t\tgetLogger(ctx).debug(\"speculative_stale\", { generation: remoteGeneration });\n\t\t\t\t\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tspeculativeGeneration = remoteGeneration;\n\t\t\t\t\t\tspeculativeJob?.controller.abort();\n\t\t\t\t\t\tspeculativeJob = undefined;\n\t\t\t\t\t\tconst result = await applyGeneratedCompaction(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tremoteSnapshot,\n\t\t\t\t\t\t\t() => speculativeGeneration,\n\t\t\t\t\t\t\tremoteCompaction,\n\t\t\t\t\t\t\tfeedbackSignal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tgetLogger(ctx).debug(\"speculative_applied\", { generation: remoteGeneration, origin: \"blocking\" });\n\t\t\t\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst pendingJob = speculativeJob;\n\t\t\tif (pendingJob) {\n\t\t\t\tconst unlinkAbort = linkAbortSignal(feedbackSignal, pendingJob.controller);\n\t\t\t\tlet compaction: CompactionResult | undefined;\n\t\t\t\tlet inheritedFailure: Error | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tcompaction = await pendingJob.promise;\n\t\t\t\t\tinheritedFailure = await pendingJob.failure;\n\t\t\t\t\tif (compaction)\n\t\t\t\t\t\tgetLogger(ctx).debug(\"warm_consumed\", { generation: pendingJob.generation, route: \"speculative\" });\n\t\t\t\t} finally {\n\t\t\t\t\tunlinkAbort();\n\t\t\t\t}\n\t\t\t\tif (inheritedFailure !== undefined) {\n\t\t\t\t\tspeculativeJob = undefined;\n\t\t\t\t\tif (isTransientSummarizationFailure(inheritedFailure, inheritedFailure.message)) {\n\t\t\t\t\t\tctx.endCompaction?.({\n\t\t\t\t\t\t\treason: \"extension\",\n\t\t\t\t\t\t\tsignal: feedbackSignal,\n\t\t\t\t\t\t\taborted: feedbackSignal?.aborted,\n\t\t\t\t\t\t\terrorMessage: `Compaction failed: ${inheritedFailure.message}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tstate = breaker.recordFailure(state, Date.now(), { route: \"extension\" });\n\t\t\t\t\t\treturn { applied: false, reason: \"failed\" };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst result = await applyGeneratedCompaction(\n\t\t\t\t\tctx,\n\t\t\t\t\tpendingJob.snapshot,\n\t\t\t\t\t() => speculativeGeneration,\n\t\t\t\t\tcompaction,\n\t\t\t\t\tfeedbackSignal,\n\t\t\t\t);\n\t\t\t\tif (result.applied || result.reason === \"stale\") {\n\t\t\t\t\tspeculativeJob = undefined;\n\t\t\t\t\tif (result.applied)\n\t\t\t\t\t\tgetLogger(ctx).debug(\"speculative_applied\", {\n\t\t\t\t\t\t\tgeneration: pendingJob.generation,\n\t\t\t\t\t\t\torigin: \"speculative\",\n\t\t\t\t\t\t});\n\t\t\t\t\telse getLogger(ctx).debug(\"speculative_stale\", { generation: pendingJob.generation });\n\t\t\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tif (result.reason === \"rejected\") {\n\t\t\t\t\tfeedbackSignal = ctx.beginCompaction?.({ reason: \"extension\" });\n\t\t\t\t}\n\t\t\t\tspeculativeJob = undefined;\n\t\t\t}\n\n\t\t\tconst generation = ++speculativeGeneration;\n\t\t\tconst snapshot = createSpeculativeCompactionSnapshot(ctx, {\n\t\t\t\tgeneration,\n\t\t\t\tcustomInstructions,\n\t\t\t\torigin: \"core-route\",\n\t\t\t\ttools: getSummarizationTools(),\n\t\t\t});\n\t\t\tif (!snapshot) {\n\t\t\t\tconst result = { applied: false, reason: \"unavailable\" } as const;\n\t\t\t\tgetLogger(ctx).debug(\"summary_failed\", { reason: \"unavailable\" });\n\t\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tlet compaction: CompactionResult | undefined;\n\t\t\ttry {\n\t\t\t\tcompaction = await runExtensionCompaction(ctx, snapshot, feedbackSignal, (delta) =>\n\t\t\t\t\tctx.updateCompaction?.({\n\t\t\t\t\t\treason: \"extension\",\n\t\t\t\t\t\tsignal: feedbackSignal,\n\t\t\t\t\t\tdelta,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof SummaryGenerationError)) throw error;\n\t\t\t\tgetLogger(ctx).debug(\"summary_failed\", { reason: error.kind });\n\t\t\t}\n\t\t\tconst result = await applyGeneratedCompaction(\n\t\t\t\tctx,\n\t\t\t\tsnapshot,\n\t\t\t\t() => speculativeGeneration,\n\t\t\t\tcompaction,\n\t\t\t\tfeedbackSignal,\n\t\t\t);\n\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tctx.endCompaction?.({\n\t\t\t\treason: \"extension\",\n\t\t\t\tsignal: feedbackSignal,\n\t\t\t\taborted: feedbackSignal?.aborted,\n\t\t\t\terrorMessage: `Compaction failed: ${message}`,\n\t\t\t});\n\t\t\tconst transient = isTransientSummarizationFailure(error, message);\n\t\t\tif (transient) {\n\t\t\t\tstate = breaker.recordFailure(state, Date.now(), { route: \"extension\" });\n\t\t\t\treturn { applied: false, reason: \"failed\" };\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpi.on(\"session_before_compact\", async (event: SessionBeforeCompactEvent, ctx) => {\n\t\tinvalidateSpeculativeCompaction(ctx);\n\t\tif (lanePolicy.disablesSenpiCompaction(ctx)) {\n\t\t\treturn { cancel: true, reason: SDK_NATIVE_LANE_REJECTION_REASON };\n\t\t}\n\t\tif (cap.shouldRejectByCap(state).cancel) {\n\t\t\tgetLogger(ctx).debug(\"skip_cap\", { reason: event.reason, count: state.acceptedAbsolute });\n\t\t\treturn {\n\t\t\t\tcancel: true,\n\t\t\t\trejectionCause: \"per-turn-cap\",\n\t\t\t\treason: \"absolute compaction cap reached for this session\",\n\t\t\t};\n\t\t}\n\t\tconst now = Date.now();\n\t\tif (breaker.isTripped(state, now) && !breaker.shouldBypass(state, { reason: event.reason })) {\n\t\t\tconst remainingMs = state.trippedAt !== null ? Math.max(0, state.trippedAt + breaker.COOLDOWN_MS - now) : 0;\n\t\t\tgetLogger(ctx).debug(\"skip_breaker\", { reason: event.reason, remainingSec: Math.ceil(remainingMs / 1000) });\n\t\t\treturn {\n\t\t\t\tcancel: true,\n\t\t\t\trejectionCause: \"circuit-breaker\",\n\t\t\t\treason: `compaction circuit breaker cooling down (${Math.ceil(remainingMs / 1000)}s left)`,\n\t\t\t};\n\t\t}\n\n\t\tcapturePendingMetadata(event.requestId, ctx);\n\n\t\tconst model = ctx.model;\n\t\tif (!model) return undefined;\n\t\tconst remoteCompaction = await runOpenAiRemoteCompaction(\n\t\t\tctx,\n\t\t\tevent,\n\t\t\t(data) => pi.events.emit(SENPI_COMPACTION_EVENT, data),\n\t\t\tremoteCompactionDependencies,\n\t\t);\n\t\tif (remoteCompaction) {\n\t\t\tgetLogger(ctx).debug(\"core_route_generated\", { route: \"core-route\", requestId: event.requestId });\n\t\t\treturn { compaction: remoteCompaction };\n\t\t}\n\n\t\tconst snapshot = {\n\t\t\tgeneration: ++speculativeGeneration,\n\t\t\texpectedRevision: ctx.getMessageRevision(),\n\t\t\tmodel,\n\t\t\tcontextWindow: ctx.getContextUsage()?.contextWindow ?? model.contextWindow ?? DEFAULT_CONTEXT_WINDOW,\n\t\t\tpreparation: event.preparation,\n\t\t\tbranchEntries: event.branchEntries,\n\t\t\tpromptVariant: getPromptVariant(event),\n\t\t\torigin: \"core-route\" as const,\n\t\t\tcustomInstructions: event.customInstructions,\n\t\t\tsystemPrompt: ctx.getSystemPrompt(),\n\t\t\ttools: getSummarizationTools(),\n\t\t};\n\t\tlet compaction: CompactionResult | undefined;\n\t\ttry {\n\t\t\tcompaction = await runExtensionCompaction(ctx, snapshot, event.signal, (delta) =>\n\t\t\t\tctx.updateCompaction?.({ reason: event.reason, signal: event.signal, delta }),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconst failureKind = classifyRequiredCompactionFallbackFailure(error);\n\t\t\tif (isRequiredCompactionFallbackReason(event.reason) && failureKind !== undefined && !event.signal.aborted) {\n\t\t\t\tconst fallback = createRequiredCompactionFallback(\n\t\t\t\t\tsnapshot.preparation,\n\t\t\t\t\tsnapshot.contextWindow,\n\t\t\t\t\tfailureKind,\n\t\t\t\t\t{ taskIntent: resolveInheritedTaskIntent(event.branchEntries) },\n\t\t\t\t\tevent.branchEntries,\n\t\t\t\t);\n\t\t\t\tif (fallback) return { compaction: fallback };\n\t\t\t\tpendingMetadata.delete(event.requestId);\n\t\t\t\treturn {\n\t\t\t\t\tcancel: true,\n\t\t\t\t\treason: \"deterministic compaction fallback cannot retain the prepared suffix\",\n\t\t\t\t};\n\t\t\t}\n\t\t\tpendingMetadata.delete(event.requestId);\n\t\t\tif (error instanceof SummaryGenerationError) {\n\t\t\t\treturn { cancel: true, reason: error.message };\n\t\t\t}\n\t\t\treturn { cancel: true, reason: `compaction generator failed: ${message}` };\n\t\t}\n\t\tif (!compaction) {\n\t\t\tpendingMetadata.delete(event.requestId);\n\t\t\tif (event.signal.aborted) {\n\t\t\t\treturn { cancel: true };\n\t\t\t}\n\t\t\treturn { cancel: true, reason: \"compaction generator returned no summary\" };\n\t\t}\n\n\t\treturn {\n\t\t\tcompaction,\n\t\t};\n\t});\n\n\tpi.on(\"model_select\", (event, ctx) => {\n\t\tif (lanePolicy.disablesSenpiCompaction(ctx)) {\n\t\t\tinvalidateSpeculativeCompaction(ctx);\n\t\t\treturn;\n\t\t}\n\t\tconst jobModel = speculativeJob?.snapshot.model;\n\t\tconst selectedModel = ctx.model;\n\t\tconst alreadySpeculatingForSelectedModel =\n\t\t\tjobModel !== undefined &&\n\t\t\tselectedModel !== undefined &&\n\t\t\tjobModel.api === selectedModel.api &&\n\t\t\tjobModel.provider === selectedModel.provider &&\n\t\t\tjobModel.id === selectedModel.id &&\n\t\t\tjobModel.baseUrl === selectedModel.baseUrl &&\n\t\t\tjobModel.contextWindow === selectedModel.contextWindow;\n\t\tif (!alreadySpeculatingForSelectedModel) {\n\t\t\tinvalidateSpeculativeCompaction(ctx);\n\t\t}\n\t\tconst previousWindow = event.previousModel?.contextWindow ?? 0;\n\t\tconst contextWindow = ctx.model?.contextWindow ?? 0;\n\t\tif (previousWindow <= contextWindow) return;\n\t\tconst usage = ctx.getContextUsage();\n\t\tif (!usage) return;\n\t\tif (breaker.isTripped(state, Date.now())) return;\n\t\tconst settings = ctx.getCompactionSettings();\n\t\tif (policy.shouldStartSpeculativeCompaction(usage, contextWindow, settings, state.lastYield ?? undefined)) {\n\t\t\tstartSpeculativeCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);\n\t\t}\n\t});\n\n\tpi.on(\"session_compact\", async (event: SessionCompactEvent, ctx) => {\n\t\tconst compactEvent = event;\n\t\tinvalidateSpeculativeCompaction(ctx);\n\t\tif (compactEvent.accepted) {\n\t\t\tpersistAcceptedMetadata(compactEvent.requestId);\n\t\t\tconst branchEntries = ctx.sessionManager.getBranch();\n\t\t\tconst firstKeptIndex = branchEntries.findIndex(\n\t\t\t\t(entry) => entry.id === compactEvent.compactionEntry.firstKeptEntryId,\n\t\t\t);\n\t\t\tconst keptEntries = firstKeptIndex === -1 ? [] : branchEntries.slice(firstKeptIndex);\n\t\t\tstate = cap.incrementAccepted(state);\n\t\t\tstate = breaker.recordSuccess(state);\n\t\t\tconst details = compactEvent.compactionEntry.details as\n\t\t\t\t| { structuralYield?: { savedTokens: number; savingsRatio: number } }\n\t\t\t\t| undefined;\n\t\t\tconst sy = details?.structuralYield;\n\t\t\tif (sy && typeof sy.savedTokens === \"number\" && typeof sy.savingsRatio === \"number\") {\n\t\t\t\tstate = {\n\t\t\t\t\t...state,\n\t\t\t\t\tlastYield: { savedTokens: sy.savedTokens, tokensBefore: compactEvent.compactionEntry.tokensBefore },\n\t\t\t\t};\n\t\t\t\tif (\n\t\t\t\t\tisIneffectiveCompaction({\n\t\t\t\t\t\ttokensBefore: compactEvent.compactionEntry.tokensBefore,\n\t\t\t\t\t\tsavedTokens: sy.savedTokens,\n\t\t\t\t\t\tsavingsRatio: sy.savingsRatio,\n\t\t\t\t\t})\n\t\t\t\t) {\n\t\t\t\t\tstate = cap.incrementIneffective(state);\n\t\t\t\t\tgetLogger(ctx).debug(\"ineffective_counted\", {\n\t\t\t\t\t\ttokensBefore: compactEvent.compactionEntry.tokensBefore,\n\t\t\t\t\t\tsavedTokens: sy.savedTokens,\n\t\t\t\t\t\tsavingsRatio: sy.savingsRatio,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tresetOnSessionCompact(degradationState);\n\t\t\ttodoBridge.restoreTodosIfMissing(pi, ctx);\n\t\t\tconst usage = ctx.getContextUsage();\n\t\t\tconst settings = ctx.getCompactionSettings();\n\t\t\tif (settings.restorationEnabled ?? true) {\n\t\t\t\trestoration.preparePendingPayload(restorationState, {\n\t\t\t\t\taccepted: true,\n\t\t\t\t\treason: compactEvent.reason,\n\t\t\t\t\tcompactionEntryId: compactEvent.compactionEntry.id,\n\t\t\t\t\tcontextWindow: usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW,\n\t\t\t\t\tusageTokens: usage?.tokens ?? null,\n\t\t\t\t\treserveTokens: settings.reserveTokens,\n\t\t\t\t\tsettings,\n\t\t\t\t\tkeptMessages: keptEntries.flatMap((entry) => {\n\t\t\t\t\t\tif (entry.type !== \"message\") return [];\n\t\t\t\t\t\treturn [entry.message];\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tstate = breaker.recordFailure(state, Date.now(), { route: compactEvent.reason });\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tcancelIdleWarmupRetry();\n\t\tconst message = checkpointState.attachRestorationDirective(\n\t\t\trestorationDirectiveState,\n\t\t\trecentCheckpoint(ctx),\n\t\t\trestoration.consumePendingPayload(restorationState),\n\t\t);\n\n\t\tconst usage = ctx.getContextUsage();\n\t\tconst contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\t\tconst settings = ctx.getCompactionSettings();\n\t\tconst pendingPromptTokens = estimatePendingPromptTokens(event);\n\t\tconst usageWithPendingPrompt = usage ? withAdditionalTokens(usage, pendingPromptTokens) : undefined;\n\t\t// The SDK owns this lane's context entirely, so even the hard-limit valve stands down;\n\t\t// the circuit breaker never blocks that valve for senpi-owned lanes.\n\t\tconst laneOwnsCompaction = lanePolicy.disablesSenpiCompaction(ctx);\n\t\tconst breakerCoolingDown = breaker.isTripped(state, Date.now()) || laneOwnsCompaction;\n\t\tif (\n\t\t\t!laneOwnsCompaction &&\n\t\t\tusage &&\n\t\t\tpolicy.isAtHardLimit(usage, contextWindow, settings.reserveTokens, pendingPromptTokens)\n\t\t) {\n\t\t\tgetLogger(ctx).debug(\"hard_limit_trigger\", {\n\t\t\t\tcontextWindow,\n\t\t\t\ttokens: usage.tokens ?? 0,\n\t\t\t\tthreshold: settings.reserveTokens,\n\t\t\t});\n\t\t\tawait applyBlockingCompaction(ctx, EMERGENCY_COMPACTION_INSTRUCTIONS);\n\t\t} else if (\n\t\t\t!breakerCoolingDown &&\n\t\t\tusageWithPendingPrompt &&\n\t\t\tpolicy.shouldTriggerCompaction(usageWithPendingPrompt, contextWindow, settings, state.lastYield ?? undefined)\n\t\t) {\n\t\t\tgetLogger(ctx).debug(\"threshold_trigger\", {\n\t\t\t\tcontextWindow,\n\t\t\t\ttokens: usageWithPendingPrompt.tokens ?? 0,\n\t\t\t\tthreshold: settings.reserveTokens,\n\t\t\t});\n\t\t\tawait applyBlockingCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);\n\t\t} else if (\n\t\t\t!breakerCoolingDown &&\n\t\t\tusageWithPendingPrompt &&\n\t\t\tpolicy.shouldStartSpeculativeCompaction(\n\t\t\t\tusageWithPendingPrompt,\n\t\t\t\tcontextWindow,\n\t\t\t\tsettings,\n\t\t\t\tstate.lastYield ?? undefined,\n\t\t\t)\n\t\t) {\n\t\t\tgetLogger(ctx).debug(\"emergency_prune\", {\n\t\t\t\troute: \"context-event\",\n\t\t\t\ttokens: usageWithPendingPrompt.tokens ?? 0,\n\t\t\t});\n\t\t\tstartSpeculativeCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);\n\t\t}\n\n\t\treturn message ? { message } : undefined;\n\t});\n\n\tpi.on(\"context\", (event, ctx) => {\n\t\tconst usage = ctx.getContextUsage();\n\t\tconst contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\t\tconst promptContextWindow = getPromptContextWindow(contextWindow, ctx.model?.maxTokens);\n\t\tconst sourceMessages = shouldApplyContextReduction({\n\t\t\tusageTokens: usage?.tokens ?? null,\n\t\t\tcontextWindow,\n\t\t\tisProviderNativeCompactionPath:\n\t\t\t\tisOpenAiRemoteCompactionModel(ctx.model) || lanePolicy.disablesSenpiCompaction(ctx),\n\t\t})\n\t\t\t? reduceContextMessages(event.messages, BUILTIN_CONTEXT_REDUCTION_OPTIONS).messages\n\t\t\t: event.messages;\n\t\t// The claude-sdk-oauth lane stands down from senpi compaction entirely:\n\t\t// destructively pruning the provider context near the hard limit would\n\t\t// break the resident SDK session's continuity the same way the gated\n\t\t// reduction lane would.\n\t\tconst emergency = lanePolicy.disablesSenpiCompaction(ctx)\n\t\t\t? { messages: sourceMessages, needsAggressiveCompaction: false }\n\t\t\t: hardLimitEmergencyPrune(sourceMessages, promptContextWindow, emergencyPruneLatch);\n\t\tconst marked = markOpenAiRemoteReplayBoundary(emergency.messages, {\n\t\t\tmodel: ctx.model,\n\t\t\tbranchEntries: ctx.sessionManager.getBranch(),\n\t\t});\n\t\treturn { messages: repairOrphanedToolResults(convertToLlm(marked)) };\n\t});\n\n\tpi.on(\"before_provider_request\", async (event, ctx) => {\n\t\tconst model = event.model ?? ctx.model;\n\t\tif (!isOpenAiRemoteCompactionModel(model)) return undefined;\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (!auth.ok) return undefined;\n\t\tconst effectiveModel =\n\t\t\tauth.upstreamModelId || auth.baseUrl\n\t\t\t\t? {\n\t\t\t\t\t\t...model,\n\t\t\t\t\t\t...(auth.upstreamModelId ? { id: auth.upstreamModelId } : {}),\n\t\t\t\t\t\t...(auth.baseUrl ? { baseUrl: auth.baseUrl } : {}),\n\t\t\t\t\t}\n\t\t\t\t: model;\n\t\tconst headers = createOpenAiRemoteCompactionHeaders(\n\t\t\teffectiveModel,\n\t\t\t{ ...auth, headers: event.headers ?? auth.headers },\n\t\t\tctx.sessionManager.getSessionId(),\n\t\t);\n\t\tif (!headers) return undefined;\n\t\tconst origin = openAiRemoteCompactionOrigin(effectiveModel, headers);\n\t\treturn rewriteOpenAiPayloadWithRemoteCompaction(\n\t\t\tevent.payload,\n\t\t\t{ model: effectiveModel, branchEntries: ctx.sessionManager.getBranch(), origin },\n\t\t\t(data) => pi.events.emit(SENPI_COMPACTION_EVENT, data),\n\t\t);\n\t});\n\n\tpi.on(\"turn_end\", async (_event, ctx) => {\n\t\ttry {\n\t\t\tif (lanePolicy.disablesSenpiCompaction(ctx)) return;\n\t\t\thandleTurnEnd(degradationState);\n\t\t\tif (degradationState.recoveryTriggeredThisCycle) return;\n\t\t\tif (state.lastYield && state.lastYield.savedTokens <= 0) {\n\t\t\t\tvoid applyBlockingCompaction(ctx, RECOVERY_INSTRUCTIONS).catch(() => {});\n\t\t\t}\n\t\t} finally {\n\t\t\tstate = resetTurnCounter(state, \"\");\n\t\t}\n\t});\n\n\tpi.on(\"agent_end\", async (event, ctx) => {\n\t\tstate = resetTurnCounter(state, \"\");\n\t\tif (lanePolicy.disablesSenpiCompaction(ctx)) return;\n\t\tconst usage = ctx.getContextUsage();\n\t\tconst contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\t\tconst settings = ctx.getCompactionSettings();\n\t\tif (\n\t\t\tidle.shouldRunIdleCompaction({\n\t\t\t\twillRetry: event.willRetry ?? false,\n\t\t\t\taborted: event.aborted === true,\n\t\t\t\tsettings,\n\t\t\t\tusage,\n\t\t\t\tcontextWindow,\n\t\t\t\tbreakerTripped: breaker.isTripped(state, Date.now()),\n\t\t\t\tlastYield: state.lastYield ?? undefined,\n\t\t\t\tmode: ctx.mode,\n\t\t\t})\n\t\t) {\n\t\t\tgetLogger(ctx).debug(\"idle_trigger\", { contextWindow, tokens: usage?.tokens ?? 0 });\n\t\t\tidleWarmupAttempt = 0;\n\t\t\tstartSpeculativeCompaction(ctx, idle.IDLE_COMPACTION_INSTRUCTIONS);\n\t\t\tarmIdleWarmupRetry(ctx);\n\t\t}\n\t});\n\n\tpi.on(\"message_end\", async (event, ctx) => {\n\t\tfor (const entry of collectCompactBoundaryEntries(event.message)) {\n\t\t\tpi.appendEntry(CLAUDE_SDK_OAUTH_COMPACT_ENTRY_TYPE, entry);\n\t\t}\n\t\tif (isAbortedAssistantMessage(event)) {\n\t\t\tinvalidateSpeculativeCompaction(ctx);\n\t\t}\n\t\tif (isMonitorableMessageEvent(event) && !lanePolicy.disablesSenpiCompaction(ctx)) {\n\t\t\tawait handleMessageEnd(degradationState, event, {\n\t\t\t\tapplyCompaction: async (options) => {\n\t\t\t\t\treturn await applyBlockingCompaction(ctx, options.customInstructions);\n\t\t\t\t},\n\t\t\t\tnotify: (message) => ctx.ui.notify(message, \"warning\"),\n\t\t\t});\n\t\t}\n\t});\n\n\tpi.on(\"tool_call\", (event) => {\n\t\trestoration.trackToolCall(restorationState, event);\n\t});\n}\n"]}
@@ -1,16 +1,16 @@
1
- import type { CompactionReason } from "../../types.ts";
2
1
  import type { CompactionExtensionState } from "./state.ts";
3
- export declare const softCap = 3;
4
2
  export declare const hardCap = 10;
5
- export interface ShouldRejectByCapOptions {
6
- manual?: boolean;
7
- reason?: CompactionReason;
8
- }
9
3
  export declare function incrementAccepted(state: CompactionExtensionState): CompactionExtensionState;
10
4
  export declare function incrementIneffective(state: CompactionExtensionState): CompactionExtensionState;
11
- export declare function isOverSoftCap(state: CompactionExtensionState): boolean;
12
5
  export declare function isOverHardCap(state: CompactionExtensionState): boolean;
13
- export declare function shouldRejectByCap(state: CompactionExtensionState, opts?: ShouldRejectByCapOptions): {
6
+ /**
7
+ * Admission is bounded only by the absolute session cap. The former per-turn
8
+ * soft cap (3 accepted + ineffective attempts) rejected required compactions
9
+ * mid-turn, which fatally ended turns that legitimately needed more than three
10
+ * compactions. Runaway protection remains: `hardCap` bounds accepted
11
+ * compactions per session and the circuit breaker halts repeated failures.
12
+ */
13
+ export declare function shouldRejectByCap(state: CompactionExtensionState): {
14
14
  cancel: boolean;
15
15
  };
16
16
  //# sourceMappingURL=per-turn-cap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"per-turn-cap.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/per-turn-cap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,OAAO,KAAK,CAAC;AAE1B,MAAM,WAAW,wBAAwB;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,wBAAwB,GAAG,wBAAwB,CAM3F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,wBAAwB,GAAG,wBAAwB,CAK9F;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAEtE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAEtE;AAED,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,wBAAwB,EAC/B,IAAI,CAAC,EAAE,wBAAwB,GAC7B;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAYrB"}
1
+ {"version":3,"file":"per-turn-cap.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/per-turn-cap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,eAAO,MAAM,OAAO,KAAK,CAAC;AAE1B,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,wBAAwB,GAAG,wBAAwB,CAM3F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,wBAAwB,GAAG,wBAAwB,CAK9F;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAEtE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,wBAAwB,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAEtF"}
@@ -1,4 +1,3 @@
1
- export const softCap = 3;
2
1
  export const hardCap = 10;
3
2
  export function incrementAccepted(state) {
4
3
  return {
@@ -13,23 +12,17 @@ export function incrementIneffective(state) {
13
12
  ineffectiveAttemptsThisTurn: state.ineffectiveAttemptsThisTurn + 1,
14
13
  };
15
14
  }
16
- export function isOverSoftCap(state) {
17
- return state.acceptedThisTurn + (state.ineffectiveAttemptsThisTurn ?? 0) >= softCap;
18
- }
19
15
  export function isOverHardCap(state) {
20
16
  return state.acceptedAbsolute >= hardCap;
21
17
  }
22
- export function shouldRejectByCap(state, opts) {
23
- if (isOverHardCap(state)) {
24
- return { cancel: true };
25
- }
26
- const bypass = opts?.manual === true || opts?.reason === "manual" || opts?.reason === "extension";
27
- if (bypass) {
28
- return { cancel: false };
29
- }
30
- if (isOverSoftCap(state)) {
31
- return { cancel: true };
32
- }
33
- return { cancel: false };
18
+ /**
19
+ * Admission is bounded only by the absolute session cap. The former per-turn
20
+ * soft cap (3 accepted + ineffective attempts) rejected required compactions
21
+ * mid-turn, which fatally ended turns that legitimately needed more than three
22
+ * compactions. Runaway protection remains: `hardCap` bounds accepted
23
+ * compactions per session and the circuit breaker halts repeated failures.
24
+ */
25
+ export function shouldRejectByCap(state) {
26
+ return { cancel: isOverHardCap(state) };
34
27
  }
35
28
  //# sourceMappingURL=per-turn-cap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"per-turn-cap.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/per-turn-cap.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,CAAC;AAO1B,MAAM,UAAU,iBAAiB,CAAC,KAA+B;IAChE,OAAO;QACN,GAAG,KAAK;QACR,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,GAAG,CAAC;QAC5C,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,GAAG,CAAC;KAC5C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAA+B;IACnE,OAAO;QACN,GAAG,KAAK;QACR,2BAA2B,EAAE,KAAK,CAAC,2BAA2B,GAAG,CAAC;KAClE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAA+B;IAC5D,OAAO,KAAK,CAAC,gBAAgB,GAAG,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAA+B;IAC5D,OAAO,KAAK,CAAC,gBAAgB,IAAI,OAAO,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAChC,KAA+B,EAC/B,IAA+B;IAE/B,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,KAAK,IAAI,IAAI,IAAI,EAAE,MAAM,KAAK,QAAQ,IAAI,IAAI,EAAE,MAAM,KAAK,WAAW,CAAC;IAClG,IAAI,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;IACD,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC","sourcesContent":["import type { CompactionReason } from \"../../types.ts\";\nimport type { CompactionExtensionState } from \"./state.ts\";\n\nexport const softCap = 3;\nexport const hardCap = 10;\n\nexport interface ShouldRejectByCapOptions {\n\tmanual?: boolean;\n\treason?: CompactionReason;\n}\n\nexport function incrementAccepted(state: CompactionExtensionState): CompactionExtensionState {\n\treturn {\n\t\t...state,\n\t\tacceptedThisTurn: state.acceptedThisTurn + 1,\n\t\tacceptedAbsolute: state.acceptedAbsolute + 1,\n\t};\n}\n\nexport function incrementIneffective(state: CompactionExtensionState): CompactionExtensionState {\n\treturn {\n\t\t...state,\n\t\tineffectiveAttemptsThisTurn: state.ineffectiveAttemptsThisTurn + 1,\n\t};\n}\n\nexport function isOverSoftCap(state: CompactionExtensionState): boolean {\n\treturn state.acceptedThisTurn + (state.ineffectiveAttemptsThisTurn ?? 0) >= softCap;\n}\n\nexport function isOverHardCap(state: CompactionExtensionState): boolean {\n\treturn state.acceptedAbsolute >= hardCap;\n}\n\nexport function shouldRejectByCap(\n\tstate: CompactionExtensionState,\n\topts?: ShouldRejectByCapOptions,\n): { cancel: boolean } {\n\tif (isOverHardCap(state)) {\n\t\treturn { cancel: true };\n\t}\n\tconst bypass = opts?.manual === true || opts?.reason === \"manual\" || opts?.reason === \"extension\";\n\tif (bypass) {\n\t\treturn { cancel: false };\n\t}\n\tif (isOverSoftCap(state)) {\n\t\treturn { cancel: true };\n\t}\n\treturn { cancel: false };\n}\n"]}
1
+ {"version":3,"file":"per-turn-cap.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/per-turn-cap.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,CAAC;AAE1B,MAAM,UAAU,iBAAiB,CAAC,KAA+B;IAChE,OAAO;QACN,GAAG,KAAK;QACR,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,GAAG,CAAC;QAC5C,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,GAAG,CAAC;KAC5C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAA+B;IACnE,OAAO;QACN,GAAG,KAAK;QACR,2BAA2B,EAAE,KAAK,CAAC,2BAA2B,GAAG,CAAC;KAClE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAA+B;IAC5D,OAAO,KAAK,CAAC,gBAAgB,IAAI,OAAO,CAAC;AAC1C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAA+B;IAChE,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;AACzC,CAAC","sourcesContent":["import type { CompactionExtensionState } from \"./state.ts\";\n\nexport const hardCap = 10;\n\nexport function incrementAccepted(state: CompactionExtensionState): CompactionExtensionState {\n\treturn {\n\t\t...state,\n\t\tacceptedThisTurn: state.acceptedThisTurn + 1,\n\t\tacceptedAbsolute: state.acceptedAbsolute + 1,\n\t};\n}\n\nexport function incrementIneffective(state: CompactionExtensionState): CompactionExtensionState {\n\treturn {\n\t\t...state,\n\t\tineffectiveAttemptsThisTurn: state.ineffectiveAttemptsThisTurn + 1,\n\t};\n}\n\nexport function isOverHardCap(state: CompactionExtensionState): boolean {\n\treturn state.acceptedAbsolute >= hardCap;\n}\n\n/**\n * Admission is bounded only by the absolute session cap. The former per-turn\n * soft cap (3 accepted + ineffective attempts) rejected required compactions\n * mid-turn, which fatally ended turns that legitimately needed more than three\n * compactions. Runaway protection remains: `hardCap` bounds accepted\n * compactions per session and the circuit breaker halts repeated failures.\n */\nexport function shouldRejectByCap(state: CompactionExtensionState): { cancel: boolean } {\n\treturn { cancel: isOverHardCap(state) };\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { AgentEndEvent, ExtensionContext } from "../../types.ts";
2
+ import type { MonitorAwareGoalContinuation } from "./monitor-continuation.ts";
3
+ import type { Goal } from "./types.ts";
4
+ interface GoalAgentEndOptions {
5
+ readonly ctx: ExtensionContext;
6
+ readonly event: AgentEndEvent;
7
+ readonly goal: Goal | null;
8
+ }
9
+ export declare function continueGoalAfterAgentEnd(monitor: MonitorAwareGoalContinuation, options: GoalAgentEndOptions): Promise<Goal | null>;
10
+ export {};
11
+ //# sourceMappingURL=agent-end-continuation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-end-continuation.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/agent-end-continuation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,UAAU,mBAAmB;IAC5B,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAsB,yBAAyB,CAC9C,OAAO,EAAE,4BAA4B,EACrC,OAAO,EAAE,mBAAmB,GAC1B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAWtB"}
@@ -0,0 +1,13 @@
1
+ export async function continueGoalAfterAgentEnd(monitor, options) {
2
+ if (options.event.aborted === true && options.event.abortSource === "system") {
3
+ return monitor.afterSystemAbort({
4
+ ctx: options.ctx,
5
+ event: options.event,
6
+ goal: options.goal,
7
+ messages: options.event.messages,
8
+ willRetry: options.event.willRetry === true,
9
+ });
10
+ }
11
+ return monitor.afterAgentEnd({ ctx: options.ctx, goal: options.goal, messages: options.event.messages });
12
+ }
13
+ //# sourceMappingURL=agent-end-continuation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-end-continuation.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/agent-end-continuation.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,OAAqC,EACrC,OAA4B;IAE5B,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC9E,OAAO,OAAO,CAAC,gBAAgB,CAAC;YAC/B,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ;YAChC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI;SAC3C,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC1G,CAAC","sourcesContent":["import type { AgentEndEvent, ExtensionContext } from \"../../types.ts\";\nimport type { MonitorAwareGoalContinuation } from \"./monitor-continuation.ts\";\nimport type { Goal } from \"./types.ts\";\n\ninterface GoalAgentEndOptions {\n\treadonly ctx: ExtensionContext;\n\treadonly event: AgentEndEvent;\n\treadonly goal: Goal | null;\n}\n\nexport async function continueGoalAfterAgentEnd(\n\tmonitor: MonitorAwareGoalContinuation,\n\toptions: GoalAgentEndOptions,\n): Promise<Goal | null> {\n\tif (options.event.aborted === true && options.event.abortSource === \"system\") {\n\t\treturn monitor.afterSystemAbort({\n\t\t\tctx: options.ctx,\n\t\t\tevent: options.event,\n\t\t\tgoal: options.goal,\n\t\t\tmessages: options.event.messages,\n\t\t\twillRetry: options.event.willRetry === true,\n\t\t});\n\t}\n\treturn monitor.afterAgentEnd({ ctx: options.ctx, goal: options.goal, messages: options.event.messages });\n}\n"]}
@@ -28,8 +28,6 @@ export interface GoalCacheWarmupEntryData {
28
28
  readonly cache?: GoalCacheWarmMetrics;
29
29
  }
30
30
  export declare function estimateCacheWarmMetrics(model: Model<Api> | undefined, env: NodeJS.ProcessEnv, lastTurnUsage: Pick<TokenUsageSnapshot, "cacheRead" | "cacheWrite"> | undefined): GoalCacheWarmMetrics | undefined;
31
- export declare function buildCacheWarmScheduledNotice(delayMs: number, activeMonitorCount: number, cache: GoalCacheWarmMetrics | undefined): string;
32
- export declare function buildCacheWarmResumedNotice(waitedMs: number, activeMonitorCount: number, cache: GoalCacheWarmMetrics | undefined): string;
33
31
  export declare function formatWarmTokenCount(tokens: number): string;
34
32
  export declare function formatWakeDuration(ms: number): string;
35
33
  export declare function formatCacheTtl(seconds: number): string;
@@ -1 +1 @@
1
- {"version":3,"file":"cache-warm.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/cache-warm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAe,MAAM,uBAAuB,CAAC;AAErE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,4EAA4E;AAC5E,eAAO,MAAM,4BAA4B,sBAAsB,CAAC;AAEhE,4EAA4E;AAC5E,MAAM,WAAW,oBAAoB;IACpC,mEAAmE;IACnE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,qGAAqG;IACrG,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG,SAAS,CAAC;AAE3D;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC;CACtC;AAID,wBAAgB,wBAAwB,CACvC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,EAC7B,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,aAAa,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,GAAG,YAAY,CAAC,GAAG,SAAS,GAC7E,oBAAoB,GAAG,SAAS,CAalC;AAED,wBAAgB,6BAA6B,CAC5C,OAAO,EAAE,MAAM,EACf,kBAAkB,EAAE,MAAM,EAC1B,KAAK,EAAE,oBAAoB,GAAG,SAAS,GACrC,MAAM,CAUR;AAED,wBAAgB,2BAA2B,CAC1C,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,MAAM,EAC1B,KAAK,EAAE,oBAAoB,GAAG,SAAS,GACrC,MAAM,CAUR;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CASrD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAItD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpD"}
1
+ {"version":3,"file":"cache-warm.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/cache-warm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAe,MAAM,uBAAuB,CAAC;AAErE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,4EAA4E;AAC5E,eAAO,MAAM,4BAA4B,sBAAsB,CAAC;AAEhE,4EAA4E;AAC5E,MAAM,WAAW,oBAAoB;IACpC,mEAAmE;IACnE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,qGAAqG;IACrG,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG,SAAS,CAAC;AAE3D;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC;CACtC;AAID,wBAAgB,wBAAwB,CACvC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,EAC7B,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,aAAa,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,GAAG,YAAY,CAAC,GAAG,SAAS,GAC7E,oBAAoB,GAAG,SAAS,CAalC;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CASrD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAItD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpD"}
@@ -16,27 +16,6 @@ export function estimateCacheWarmMetrics(model, env, lastTurnUsage) {
16
16
  ...(estimatedSavedUsd !== undefined ? { estimatedSavedUsd } : {}),
17
17
  };
18
18
  }
19
- export function buildCacheWarmScheduledNotice(delayMs, activeMonitorCount, cache) {
20
- const base = `${monitorsOnDuty(activeMonitorCount)} - goal continuation deferred ${formatDeferredDelay(delayMs)}`;
21
- if (cache === undefined || cache.cachedTokens <= 0) {
22
- return `${base} so the monitor can wake us the moment decisive output lands.`;
23
- }
24
- const warmTokens = `~${formatWarmTokenCount(cache.cachedTokens)} tokens`;
25
- if (cache.ttlSeconds === undefined) {
26
- return `${base}. The timed wake keeps ${warmTokens} warm instead of re-paying a cold read.`;
27
- }
28
- return `${base}. The timed wake stays inside the ${formatCacheTtl(cache.ttlSeconds)} prompt-cache TTL, keeping ${warmTokens} warm instead of re-paying a cold read.`;
29
- }
30
- export function buildCacheWarmResumedNotice(waitedMs, activeMonitorCount, cache) {
31
- const stillOnDuty = activeMonitorCount === 1 ? "1 monitor still on duty" : `${activeMonitorCount} monitors still on duty`;
32
- const head = `Cache-warm wake after ${formatWakeDuration(waitedMs)} - ${stillOnDuty}.`;
33
- if (cache === undefined || cache.cachedTokens <= 0)
34
- return `${head} Continuing the goal.`;
35
- const savings = cache.estimatedSavedUsd !== undefined && cache.estimatedSavedUsd > 0
36
- ? ` (est. ${formatSavedUsd(cache.estimatedSavedUsd)} saved vs a cold re-read)`
37
- : "";
38
- return `${head} ~${formatWarmTokenCount(cache.cachedTokens)} tokens stayed warm in the prompt cache${savings}. Continuing the goal.`;
39
- }
40
19
  export function formatWarmTokenCount(tokens) {
41
20
  if (tokens >= 1_000_000)
42
21
  return `${trimTrailingZero((tokens / 1_000_000).toFixed(1))}M`;
@@ -70,19 +49,6 @@ export function formatSavedUsd(value) {
70
49
  return `$${value.toFixed(3)}`;
71
50
  return `$${value.toFixed(2)}`;
72
51
  }
73
- function monitorsOnDuty(count) {
74
- return count === 1 ? "1 monitor on duty" : `${count} monitors on duty`;
75
- }
76
- function formatDeferredDelay(delayMs) {
77
- const seconds = Math.round(delayMs / 1000);
78
- if (seconds < 60)
79
- return `${seconds}s`;
80
- const minutes = Math.floor(seconds / 60);
81
- const restSeconds = seconds % 60;
82
- if (restSeconds === 0)
83
- return minutes === 1 ? "1 minute" : `${minutes} minutes`;
84
- return `${minutes}m ${restSeconds}s`;
85
- }
86
52
  function trimTrailingZero(value) {
87
53
  return value.endsWith(".0") ? value.slice(0, -2) : value;
88
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cache-warm.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/cache-warm.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model, ProviderEnv } from \"@earendil-works/pi-ai\";\nimport { resolvePromptCacheTtlSeconds } from \"@earendil-works/pi-ai\";\nimport type { TokenUsageSnapshot } from \"./types.ts\";\n\n/** Custom session-entry type carrying the cache-warm continuation story. */\nexport const GOAL_CACHE_WARMUP_ENTRY_TYPE = \"goal-cache-warmup\";\n\n/** Cache context captured when a monitor-wait continuation is scheduled. */\nexport interface GoalCacheWarmMetrics {\n\t/** Prompt-cache TTL of the active model in seconds, when known. */\n\treadonly ttlSeconds?: number;\n\t/** Tokens sitting warm in the provider prompt cache after the last turn. */\n\treadonly cachedTokens: number;\n\t/** Estimated USD saved by re-reading those tokens from cache instead of paying a cold input read. */\n\treadonly estimatedSavedUsd?: number;\n}\n\nexport type GoalCacheWarmupPhase = \"scheduled\" | \"resumed\";\n\n/**\n * Durable payload appended as a `goal-cache-warmup` custom entry and carried by\n * the `goal_continuation_scheduled` / `goal_continuation_resumed` pi-events, so\n * external consumers (for example omo-desktop-app) can render the story later.\n */\nexport interface GoalCacheWarmupEntryData {\n\treadonly phase: GoalCacheWarmupPhase;\n\treadonly goalId: string;\n\t/** Planned continuation delay in milliseconds. */\n\treadonly delayMs: number;\n\t/** Actual wait in milliseconds; present on the `resumed` phase only. */\n\treadonly waitedMs?: number;\n\treadonly activeMonitorCount: number;\n\treadonly cache?: GoalCacheWarmMetrics;\n}\n\nconst TOKENS_PER_PRICE_UNIT = 1_000_000;\n\nexport function estimateCacheWarmMetrics(\n\tmodel: Model<Api> | undefined,\n\tenv: NodeJS.ProcessEnv,\n\tlastTurnUsage: Pick<TokenUsageSnapshot, \"cacheRead\" | \"cacheWrite\"> | undefined,\n): GoalCacheWarmMetrics | undefined {\n\tconst cachedTokens = clampTokens(lastTurnUsage?.cacheRead) + clampTokens(lastTurnUsage?.cacheWrite);\n\tconst ttlSeconds = model === undefined ? undefined : resolvePromptCacheTtlSeconds(model, toProviderEnv(env));\n\tif (ttlSeconds === undefined && cachedTokens === 0) return undefined;\n\tconst estimatedSavedUsd =\n\t\tmodel !== undefined && cachedTokens > 0\n\t\t\t? (Math.max(0, model.cost.input - model.cost.cacheRead) * cachedTokens) / TOKENS_PER_PRICE_UNIT\n\t\t\t: undefined;\n\treturn {\n\t\tcachedTokens,\n\t\t...(ttlSeconds !== undefined ? { ttlSeconds } : {}),\n\t\t...(estimatedSavedUsd !== undefined ? { estimatedSavedUsd } : {}),\n\t};\n}\n\nexport function buildCacheWarmScheduledNotice(\n\tdelayMs: number,\n\tactiveMonitorCount: number,\n\tcache: GoalCacheWarmMetrics | undefined,\n): string {\n\tconst base = `${monitorsOnDuty(activeMonitorCount)} - goal continuation deferred ${formatDeferredDelay(delayMs)}`;\n\tif (cache === undefined || cache.cachedTokens <= 0) {\n\t\treturn `${base} so the monitor can wake us the moment decisive output lands.`;\n\t}\n\tconst warmTokens = `~${formatWarmTokenCount(cache.cachedTokens)} tokens`;\n\tif (cache.ttlSeconds === undefined) {\n\t\treturn `${base}. The timed wake keeps ${warmTokens} warm instead of re-paying a cold read.`;\n\t}\n\treturn `${base}. The timed wake stays inside the ${formatCacheTtl(cache.ttlSeconds)} prompt-cache TTL, keeping ${warmTokens} warm instead of re-paying a cold read.`;\n}\n\nexport function buildCacheWarmResumedNotice(\n\twaitedMs: number,\n\tactiveMonitorCount: number,\n\tcache: GoalCacheWarmMetrics | undefined,\n): string {\n\tconst stillOnDuty =\n\t\tactiveMonitorCount === 1 ? \"1 monitor still on duty\" : `${activeMonitorCount} monitors still on duty`;\n\tconst head = `Cache-warm wake after ${formatWakeDuration(waitedMs)} - ${stillOnDuty}.`;\n\tif (cache === undefined || cache.cachedTokens <= 0) return `${head} Continuing the goal.`;\n\tconst savings =\n\t\tcache.estimatedSavedUsd !== undefined && cache.estimatedSavedUsd > 0\n\t\t\t? ` (est. ${formatSavedUsd(cache.estimatedSavedUsd)} saved vs a cold re-read)`\n\t\t\t: \"\";\n\treturn `${head} ~${formatWarmTokenCount(cache.cachedTokens)} tokens stayed warm in the prompt cache${savings}. Continuing the goal.`;\n}\n\nexport function formatWarmTokenCount(tokens: number): string {\n\tif (tokens >= 1_000_000) return `${trimTrailingZero((tokens / 1_000_000).toFixed(1))}M`;\n\tif (tokens >= 1000) return `${trimTrailingZero((tokens / 1000).toFixed(1))}K`;\n\treturn String(Math.max(0, Math.trunc(tokens)));\n}\n\nexport function formatWakeDuration(ms: number): string {\n\tconst seconds = Math.round(ms / 1000);\n\tif (seconds < 60) return `${seconds}s`;\n\tconst minutes = Math.floor(seconds / 60);\n\tconst restSeconds = seconds % 60;\n\tif (minutes < 60) return restSeconds === 0 ? `${minutes}m` : `${minutes}m ${restSeconds}s`;\n\tconst hours = Math.floor(minutes / 60);\n\tconst restMinutes = minutes % 60;\n\treturn restMinutes === 0 ? `${hours}h` : `${hours}h ${restMinutes}m`;\n}\n\nexport function formatCacheTtl(seconds: number): string {\n\tif (seconds % 3600 === 0) return `${seconds / 3600}h`;\n\tif (seconds % 60 === 0) return `${seconds / 60}m`;\n\treturn `${seconds}s`;\n}\n\nexport function formatSavedUsd(value: number): string {\n\tif (value < 0.0005) return \"<$0.001\";\n\tif (value < 1) return `$${value.toFixed(3)}`;\n\treturn `$${value.toFixed(2)}`;\n}\n\nfunction monitorsOnDuty(count: number): string {\n\treturn count === 1 ? \"1 monitor on duty\" : `${count} monitors on duty`;\n}\n\nfunction formatDeferredDelay(delayMs: number): string {\n\tconst seconds = Math.round(delayMs / 1000);\n\tif (seconds < 60) return `${seconds}s`;\n\tconst minutes = Math.floor(seconds / 60);\n\tconst restSeconds = seconds % 60;\n\tif (restSeconds === 0) return minutes === 1 ? \"1 minute\" : `${minutes} minutes`;\n\treturn `${minutes}m ${restSeconds}s`;\n}\n\nfunction trimTrailingZero(value: string): string {\n\treturn value.endsWith(\".0\") ? value.slice(0, -2) : value;\n}\n\nfunction clampTokens(value: number | undefined): number {\n\treturn typeof value === \"number\" && Number.isFinite(value) && value > 0 ? Math.trunc(value) : 0;\n}\n\nfunction toProviderEnv(env: NodeJS.ProcessEnv): ProviderEnv {\n\tconst resolved: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(env)) {\n\t\tif (value !== undefined) resolved[key] = value;\n\t}\n\treturn resolved;\n}\n"]}
1
+ {"version":3,"file":"cache-warm.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/cache-warm.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAGrE,4EAA4E;AAC5E,MAAM,CAAC,MAAM,4BAA4B,GAAG,mBAAmB,CAAC;AA8BhE,MAAM,qBAAqB,GAAG,SAAS,CAAC;AAExC,MAAM,UAAU,wBAAwB,CACvC,KAA6B,EAC7B,GAAsB,EACtB,aAA+E;IAE/E,MAAM,YAAY,GAAG,WAAW,CAAC,aAAa,EAAE,SAAS,CAAC,GAAG,WAAW,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IACpG,MAAM,UAAU,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,4BAA4B,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7G,IAAI,UAAU,KAAK,SAAS,IAAI,YAAY,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACrE,MAAM,iBAAiB,GACtB,KAAK,KAAK,SAAS,IAAI,YAAY,GAAG,CAAC;QACtC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC,GAAG,qBAAqB;QAC/F,CAAC,CAAC,SAAS,CAAC;IACd,OAAO;QACN,YAAY;QACZ,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc;IAClD,IAAI,MAAM,IAAI,SAAS;QAAE,OAAO,GAAG,gBAAgB,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACxF,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,GAAG,gBAAgB,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9E,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAU;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,OAAO,GAAG,EAAE,CAAC;IACjC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,WAAW,GAAG,CAAC;IAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,OAAO,GAAG,EAAE,CAAC;IACjC,OAAO,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,WAAW,GAAG,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC7C,IAAI,OAAO,GAAG,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,OAAO,GAAG,IAAI,GAAG,CAAC;IACtD,IAAI,OAAO,GAAG,EAAE,KAAK,CAAC;QAAE,OAAO,GAAG,OAAO,GAAG,EAAE,GAAG,CAAC;IAClD,OAAO,GAAG,OAAO,GAAG,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IAC3C,IAAI,KAAK,GAAG,MAAM;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1D,CAAC;AAED,SAAS,WAAW,CAAC,KAAyB;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,SAAS,aAAa,CAAC,GAAsB;IAC5C,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,IAAI,KAAK,KAAK,SAAS;YAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAChD,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC","sourcesContent":["import type { Api, Model, ProviderEnv } from \"@earendil-works/pi-ai\";\nimport { resolvePromptCacheTtlSeconds } from \"@earendil-works/pi-ai\";\nimport type { TokenUsageSnapshot } from \"./types.ts\";\n\n/** Custom session-entry type carrying the cache-warm continuation story. */\nexport const GOAL_CACHE_WARMUP_ENTRY_TYPE = \"goal-cache-warmup\";\n\n/** Cache context captured when a monitor-wait continuation is scheduled. */\nexport interface GoalCacheWarmMetrics {\n\t/** Prompt-cache TTL of the active model in seconds, when known. */\n\treadonly ttlSeconds?: number;\n\t/** Tokens sitting warm in the provider prompt cache after the last turn. */\n\treadonly cachedTokens: number;\n\t/** Estimated USD saved by re-reading those tokens from cache instead of paying a cold input read. */\n\treadonly estimatedSavedUsd?: number;\n}\n\nexport type GoalCacheWarmupPhase = \"scheduled\" | \"resumed\";\n\n/**\n * Durable payload appended as a `goal-cache-warmup` custom entry and carried by\n * the `goal_continuation_scheduled` / `goal_continuation_resumed` pi-events, so\n * external consumers (for example omo-desktop-app) can render the story later.\n */\nexport interface GoalCacheWarmupEntryData {\n\treadonly phase: GoalCacheWarmupPhase;\n\treadonly goalId: string;\n\t/** Planned continuation delay in milliseconds. */\n\treadonly delayMs: number;\n\t/** Actual wait in milliseconds; present on the `resumed` phase only. */\n\treadonly waitedMs?: number;\n\treadonly activeMonitorCount: number;\n\treadonly cache?: GoalCacheWarmMetrics;\n}\n\nconst TOKENS_PER_PRICE_UNIT = 1_000_000;\n\nexport function estimateCacheWarmMetrics(\n\tmodel: Model<Api> | undefined,\n\tenv: NodeJS.ProcessEnv,\n\tlastTurnUsage: Pick<TokenUsageSnapshot, \"cacheRead\" | \"cacheWrite\"> | undefined,\n): GoalCacheWarmMetrics | undefined {\n\tconst cachedTokens = clampTokens(lastTurnUsage?.cacheRead) + clampTokens(lastTurnUsage?.cacheWrite);\n\tconst ttlSeconds = model === undefined ? undefined : resolvePromptCacheTtlSeconds(model, toProviderEnv(env));\n\tif (ttlSeconds === undefined && cachedTokens === 0) return undefined;\n\tconst estimatedSavedUsd =\n\t\tmodel !== undefined && cachedTokens > 0\n\t\t\t? (Math.max(0, model.cost.input - model.cost.cacheRead) * cachedTokens) / TOKENS_PER_PRICE_UNIT\n\t\t\t: undefined;\n\treturn {\n\t\tcachedTokens,\n\t\t...(ttlSeconds !== undefined ? { ttlSeconds } : {}),\n\t\t...(estimatedSavedUsd !== undefined ? { estimatedSavedUsd } : {}),\n\t};\n}\n\nexport function formatWarmTokenCount(tokens: number): string {\n\tif (tokens >= 1_000_000) return `${trimTrailingZero((tokens / 1_000_000).toFixed(1))}M`;\n\tif (tokens >= 1000) return `${trimTrailingZero((tokens / 1000).toFixed(1))}K`;\n\treturn String(Math.max(0, Math.trunc(tokens)));\n}\n\nexport function formatWakeDuration(ms: number): string {\n\tconst seconds = Math.round(ms / 1000);\n\tif (seconds < 60) return `${seconds}s`;\n\tconst minutes = Math.floor(seconds / 60);\n\tconst restSeconds = seconds % 60;\n\tif (minutes < 60) return restSeconds === 0 ? `${minutes}m` : `${minutes}m ${restSeconds}s`;\n\tconst hours = Math.floor(minutes / 60);\n\tconst restMinutes = minutes % 60;\n\treturn restMinutes === 0 ? `${hours}h` : `${hours}h ${restMinutes}m`;\n}\n\nexport function formatCacheTtl(seconds: number): string {\n\tif (seconds % 3600 === 0) return `${seconds / 3600}h`;\n\tif (seconds % 60 === 0) return `${seconds / 60}m`;\n\treturn `${seconds}s`;\n}\n\nexport function formatSavedUsd(value: number): string {\n\tif (value < 0.0005) return \"<$0.001\";\n\tif (value < 1) return `$${value.toFixed(3)}`;\n\treturn `$${value.toFixed(2)}`;\n}\n\nfunction trimTrailingZero(value: string): string {\n\treturn value.endsWith(\".0\") ? value.slice(0, -2) : value;\n}\n\nfunction clampTokens(value: number | undefined): number {\n\treturn typeof value === \"number\" && Number.isFinite(value) && value > 0 ? Math.trunc(value) : 0;\n}\n\nfunction toProviderEnv(env: NodeJS.ProcessEnv): ProviderEnv {\n\tconst resolved: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(env)) {\n\t\tif (value !== undefined) resolved[key] = value;\n\t}\n\treturn resolved;\n}\n"]}