@code-yeongyu/senpi 2026.8.13 → 2026.8.14

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 (52) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/dist/core/agent-session.d.ts +1 -0
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +20 -5
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/extensions/builtin/claude-sdk-oauth/options.d.ts.map +1 -1
  7. package/dist/core/extensions/builtin/claude-sdk-oauth/options.js +1 -0
  8. package/dist/core/extensions/builtin/claude-sdk-oauth/options.js.map +1 -1
  9. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts.map +1 -1
  10. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js +3 -1
  11. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js.map +1 -1
  12. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  13. package/dist/core/extensions/builtin/compaction/index.js +178 -70
  14. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  15. package/dist/core/extensions/builtin/compaction/lane-policy.d.ts +2 -3
  16. package/dist/core/extensions/builtin/compaction/lane-policy.d.ts.map +1 -1
  17. package/dist/core/extensions/builtin/compaction/lane-policy.js +2 -3
  18. package/dist/core/extensions/builtin/compaction/lane-policy.js.map +1 -1
  19. package/dist/core/extensions/types.d.ts +1 -1
  20. package/dist/core/extensions/types.d.ts.map +1 -1
  21. package/dist/core/extensions/types.js.map +1 -1
  22. package/dist/core/retry-fallback/settings.d.ts.map +1 -1
  23. package/dist/core/retry-fallback/settings.js +4 -1
  24. package/dist/core/retry-fallback/settings.js.map +1 -1
  25. package/dist/modes/interactive/components/extension-selector.d.ts +2 -0
  26. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  27. package/dist/modes/interactive/components/extension-selector.js +17 -1
  28. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  29. package/docs/extensions.md +9 -1
  30. package/docs/json.md +3 -1
  31. package/docs/providers.md +2 -1
  32. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +24 -0
  33. package/node_modules/@code-yeongyu/senpi-codemode/package.json +5 -4
  34. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  35. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +15 -0
  36. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  37. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +15 -0
  38. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  39. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  40. package/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
  41. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  42. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google-vertex.json +1 -1
  43. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
  44. package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
  45. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  46. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  47. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  48. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  49. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  50. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  51. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  52. package/package.json +7 -7
@@ -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\nexport function 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) {\n\t\t\t\t\tspeculativeJob = undefined;\n\t\t\t\t\tgetLogger(ctx).debug(\"speculative_applied\", {\n\t\t\t\t\t\tgeneration: pendingJob.generation,\n\t\t\t\t\t\torigin: \"speculative\",\n\t\t\t\t\t});\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 === \"stale\") {\n\t\t\t\t\tgetLogger(ctx).debug(\"speculative_stale\", { generation: pendingJob.generation });\n\t\t\t\t} else if (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
+ {"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 { createWarmAnchorSnapshot, isWarmSummaryAnchorValid } from \"../../../compaction/warm-anchor.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\nexport function 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// A session reload retires this extension generation while the warm-up\n\t// watcher below is still armed: `AgentSession.reload()` invalidates the old\n\t// runner, after which every `ExtensionContext` getter throws\n\t// \"stale extension generation after reload\". The watcher outlives that\n\t// invalidation in two places — the `job.failure` continuation and the armed\n\t// retry timer — and neither had a caller left to receive the throw: the\n\t// continuation is spawned with `void` (unhandled rejection) and the timer\n\t// callback throws straight into the timer queue, which terminates the\n\t// process. The context carries no liveness flag, so a retired generation is\n\t// only observable by reading a getter and catching the assertion.\n\tfunction isContextRetired(ctx: ExtensionContext): boolean {\n\t\ttry {\n\t\t\tctx.isIdle();\n\t\t\treturn false;\n\t\t} catch {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// Fenced on the observed job: a prompt, invalidation, a reload, or a newer\n\t// warm-up stands this watcher down before it can start a duplicate\n\t// 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\t// A reload between arming and this continuation retires the context.\n\t\t\tif (isContextRetired(ctx)) {\n\t\t\t\tcancelIdleWarmupRetry();\n\t\t\t\treturn;\n\t\t\t}\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\t// The reload may land after the timer was armed; a throw here would\n\t\t\t\t// escape into the timer queue as an uncaughtException.\n\t\t\t\tif (isContextRetired(ctx)) 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 isSameModelIdentity(\n\t\tleft: SpeculativeCompactionSnapshot[\"model\"],\n\t\tright: ExtensionContext[\"model\"],\n\t): boolean {\n\t\treturn (\n\t\t\tright !== undefined &&\n\t\t\tleft.api === right.api &&\n\t\t\tleft.provider === right.provider &&\n\t\t\tleft.id === right.id &&\n\t\t\tleft.baseUrl === right.baseUrl &&\n\t\t\tleft.contextWindow === right.contextWindow\n\t\t);\n\t}\n\n\t/**\n\t * Detach the warm job for the core route before any `await`, so exactly one\n\t * claimant can own it. The controller is deliberately NOT aborted: the whole\n\t * point is to keep the already-paid summarization alive and hand its result to\n\t * core, and clearing the reference is what stands the idle-retry watcher down.\n\t */\n\tfunction claimWarmSummaryForCoreRoute(\n\t\tevent: SessionBeforeCompactEvent,\n\t\tctx: ExtensionContext,\n\t): typeof speculativeJob {\n\t\tconst job = speculativeJob;\n\t\tif (!job) return undefined;\n\t\tif (event.customInstructions !== undefined) return undefined;\n\t\tif (job.snapshot.origin !== \"speculative\") return undefined;\n\t\tif (job.snapshot.preparation.firstKeptEntryId !== event.preparation.firstKeptEntryId) return undefined;\n\t\tif (!isSameModelIdentity(job.snapshot.model, ctx.model)) return undefined;\n\t\tconst anchor = createWarmAnchorSnapshot(\n\t\t\tjob.snapshot.preparation.firstKeptEntryId,\n\t\t\tjob.snapshot.branchEntries ?? [],\n\t\t);\n\t\tif (!anchor || !isWarmSummaryAnchorValid(anchor, event.branchEntries ?? ctx.sessionManager.getBranch())) {\n\t\t\treturn undefined;\n\t\t}\n\t\tspeculativeJob = undefined;\n\t\treturn job;\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) {\n\t\t\t\t\tspeculativeJob = undefined;\n\t\t\t\t\tgetLogger(ctx).debug(\"speculative_applied\", {\n\t\t\t\t\t\tgeneration: pendingJob.generation,\n\t\t\t\t\t\torigin: \"speculative\",\n\t\t\t\t\t});\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 === \"stale\") {\n\t\t\t\t\tgetLogger(ctx).debug(\"speculative_stale\", { generation: pendingJob.generation });\n\t\t\t\t} else if (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\tconst claimedWarmJob = claimWarmSummaryForCoreRoute(event, ctx);\n\t\t// The claim detaches the job without aborting it, so ownership must survive every\n\t\t// exit from this handler - including a throw - or the request it already paid for\n\t\t// keeps streaming for a result nobody will read.\n\t\tlet warmJobConsumed = false;\n\t\tinvalidateSpeculativeCompaction(ctx);\n\t\ttry {\n\t\t\tif (lanePolicy.disablesSenpiCompaction(ctx)) {\n\t\t\t\treturn {\n\t\t\t\t\tcancel: true,\n\t\t\t\t\trejectionCause: \"external-owner\",\n\t\t\t\t\treason: SDK_NATIVE_LANE_REJECTION_REASON,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (cap.shouldRejectByCap(state).cancel) {\n\t\t\t\tgetLogger(ctx).debug(\"skip_cap\", { reason: event.reason, count: state.acceptedAbsolute });\n\t\t\t\treturn {\n\t\t\t\t\tcancel: true,\n\t\t\t\t\trejectionCause: \"per-turn-cap\",\n\t\t\t\t\treason: \"absolute compaction cap reached for this session\",\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst now = Date.now();\n\t\t\tif (breaker.isTripped(state, now) && !breaker.shouldBypass(state, { reason: event.reason })) {\n\t\t\t\tconst remainingMs = state.trippedAt !== null ? Math.max(0, state.trippedAt + breaker.COOLDOWN_MS - now) : 0;\n\t\t\t\tgetLogger(ctx).debug(\"skip_breaker\", { reason: event.reason, remainingSec: Math.ceil(remainingMs / 1000) });\n\t\t\t\treturn {\n\t\t\t\t\tcancel: true,\n\t\t\t\t\trejectionCause: \"circuit-breaker\",\n\t\t\t\t\treason: `compaction circuit breaker cooling down (${Math.ceil(remainingMs / 1000)}s left)`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcapturePendingMetadata(event.requestId, ctx);\n\n\t\t\tconst model = ctx.model;\n\t\t\tif (!model) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst remoteCompaction = await runOpenAiRemoteCompaction(\n\t\t\t\tctx,\n\t\t\t\tevent,\n\t\t\t\t(data) => pi.events.emit(SENPI_COMPACTION_EVENT, data),\n\t\t\t\tremoteCompactionDependencies,\n\t\t\t);\n\t\t\tif (remoteCompaction) {\n\t\t\t\tgetLogger(ctx).debug(\"core_route_generated\", { route: \"core-route\", requestId: event.requestId });\n\t\t\t\treturn { compaction: remoteCompaction };\n\t\t\t}\n\n\t\t\tif (claimedWarmJob) {\n\t\t\t\tconst unlinkAbort = linkAbortSignal(event.signal, claimedWarmJob.controller);\n\t\t\t\tlet warmCompaction: CompactionResult | undefined;\n\t\t\t\tlet warmFailure: Error | undefined;\n\t\t\t\ttry {\n\t\t\t\t\twarmCompaction = await claimedWarmJob.promise;\n\t\t\t\t\twarmFailure = await claimedWarmJob.failure;\n\t\t\t\t} finally {\n\t\t\t\t\tunlinkAbort();\n\t\t\t\t}\n\t\t\t\tif (warmFailure === undefined && warmCompaction && !event.signal.aborted) {\n\t\t\t\t\tgetLogger(ctx).debug(\"warm_consumed\", { generation: claimedWarmJob.generation, route: \"core-route\" });\n\t\t\t\t\twarmJobConsumed = true;\n\t\t\t\t\treturn { compaction: warmCompaction };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst snapshot = {\n\t\t\t\tgeneration: ++speculativeGeneration,\n\t\t\t\texpectedRevision: ctx.getMessageRevision(),\n\t\t\t\tmodel,\n\t\t\t\tcontextWindow: ctx.getContextUsage()?.contextWindow ?? model.contextWindow ?? DEFAULT_CONTEXT_WINDOW,\n\t\t\t\tpreparation: event.preparation,\n\t\t\t\tbranchEntries: event.branchEntries,\n\t\t\t\tpromptVariant: getPromptVariant(event),\n\t\t\t\torigin: \"core-route\" as const,\n\t\t\t\tcustomInstructions: event.customInstructions,\n\t\t\t\tsystemPrompt: ctx.getSystemPrompt(),\n\t\t\t\ttools: getSummarizationTools(),\n\t\t\t};\n\t\t\tlet compaction: CompactionResult | undefined;\n\t\t\ttry {\n\t\t\t\tcompaction = await runExtensionCompaction(ctx, snapshot, event.signal, (delta) =>\n\t\t\t\t\tctx.updateCompaction?.({ reason: event.reason, signal: event.signal, delta }),\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tconst failureKind = classifyRequiredCompactionFallbackFailure(error);\n\t\t\t\tif (\n\t\t\t\t\tisRequiredCompactionFallbackReason(event.reason) &&\n\t\t\t\t\tfailureKind !== undefined &&\n\t\t\t\t\t!event.signal.aborted\n\t\t\t\t) {\n\t\t\t\t\tconst fallback = createRequiredCompactionFallback(\n\t\t\t\t\t\tsnapshot.preparation,\n\t\t\t\t\t\tsnapshot.contextWindow,\n\t\t\t\t\t\tfailureKind,\n\t\t\t\t\t\t{ taskIntent: resolveInheritedTaskIntent(event.branchEntries) },\n\t\t\t\t\t\tevent.branchEntries,\n\t\t\t\t\t);\n\t\t\t\t\tif (fallback) return { compaction: fallback };\n\t\t\t\t\tpendingMetadata.delete(event.requestId);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcancel: true,\n\t\t\t\t\t\treason: \"deterministic compaction fallback cannot retain the prepared suffix\",\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tpendingMetadata.delete(event.requestId);\n\t\t\t\tif (error instanceof SummaryGenerationError) {\n\t\t\t\t\treturn { cancel: true, reason: error.message };\n\t\t\t\t}\n\t\t\t\treturn { cancel: true, reason: `compaction generator failed: ${message}` };\n\t\t\t}\n\t\t\tif (!compaction) {\n\t\t\t\tpendingMetadata.delete(event.requestId);\n\t\t\t\tif (event.signal.aborted) {\n\t\t\t\t\treturn { cancel: true };\n\t\t\t\t}\n\t\t\t\treturn { cancel: true, reason: \"compaction generator returned no summary\" };\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcompaction,\n\t\t\t};\n\t\t} finally {\n\t\t\tif (!warmJobConsumed) claimedWarmJob?.controller.abort();\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\t// The reload path retires this extension generation right after this event\n\t// (`AgentSession.reload()` invalidates the old runner), so stand the idle\n\t// warm-up watcher down here rather than leaving a timer armed against a\n\t// context that is about to start throwing on every read.\n\tpi.on(\"session_shutdown\", () => {\n\t\tcancelIdleWarmupRetry();\n\t\tidleWarmupAttempt = 0;\n\t\tspeculativeJob?.controller.abort();\n\t\tspeculativeJob = undefined;\n\t});\n}\n"]}
@@ -22,9 +22,8 @@ export declare const CLAUDE_SDK_OAUTH_COMPACT_ENTRY_TYPE = "claude-sdk-oauth-com
22
22
  export declare const CLAUDE_SDK_OAUTH_COMPACT_BOUNDARY_DIAGNOSTIC = "claude_sdk_oauth_compact_boundary";
23
23
  /**
24
24
  * Reason reported when senpi declines to compact an SDK-native lane. The
25
- * structured `rejectionCause` stays `cancelled-by-extension` (a closed union
26
- * shared with the RPC surface); this string is what the user and the compaction
27
- * log see.
25
+ * `external-owner` rejection cause carries the machine-readable policy while
26
+ * this string is what the user and the compaction log see.
28
27
  */
29
28
  export declare const SDK_NATIVE_LANE_REJECTION_REASON = "the Claude Agent SDK owns compaction for this session";
30
29
  declare const COMPACT_BOUNDARY_SCHEMA = "senpi.claude-sdk-oauth.compact-boundary.v1";
@@ -1 +1 @@
1
- {"version":3,"file":"lane-policy.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/lane-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGlE,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AAGtF,6EAA6E;AAC7E,eAAO,MAAM,mCAAmC,6BAA6B,CAAC;AAC9E,mFAAmF;AACnF,eAAO,MAAM,4CAA4C,sCAAsC,CAAC;AAChG;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC,0DAA0D,CAAC;AACxG,QAAA,MAAM,uBAAuB,+CAA+C,CAAC;AAE7E,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,0FAA0F;IAC1F,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACpC,uFAAuF;IACvF,uBAAuB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC;CACvD;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,OAAO,uBAAuB,CAAC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAMD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAG5E;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACzC,OAAO,GAAE;IAAE,oBAAoB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,8BAA8B,CAAA;CAAO,GACtF,oBAAoB,CAwBtB;AAED,oFAAoF;AACpF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,GAAG,SAAS,CAW5F;AAQD,kFAAkF;AAClF,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,YAAY,GAAG,oBAAoB,EAAE,CAQ3F"}
1
+ {"version":3,"file":"lane-policy.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/lane-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGlE,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AAGtF,6EAA6E;AAC7E,eAAO,MAAM,mCAAmC,6BAA6B,CAAC;AAC9E,mFAAmF;AACnF,eAAO,MAAM,4CAA4C,sCAAsC,CAAC;AAChG;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,0DAA0D,CAAC;AACxG,QAAA,MAAM,uBAAuB,+CAA+C,CAAC;AAE7E,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,0FAA0F;IAC1F,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACpC,uFAAuF;IACvF,uBAAuB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC;CACvD;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,OAAO,uBAAuB,CAAC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAMD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAG5E;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACzC,OAAO,GAAE;IAAE,oBAAoB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,8BAA8B,CAAA;CAAO,GACtF,oBAAoB,CAwBtB;AAED,oFAAoF;AACpF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,GAAG,SAAS,CAW5F;AAQD,kFAAkF;AAClF,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,YAAY,GAAG,oBAAoB,EAAE,CAQ3F"}
@@ -6,9 +6,8 @@ export const CLAUDE_SDK_OAUTH_COMPACT_ENTRY_TYPE = "claude-sdk-oauth-compact";
6
6
  export const CLAUDE_SDK_OAUTH_COMPACT_BOUNDARY_DIAGNOSTIC = "claude_sdk_oauth_compact_boundary";
7
7
  /**
8
8
  * Reason reported when senpi declines to compact an SDK-native lane. The
9
- * structured `rejectionCause` stays `cancelled-by-extension` (a closed union
10
- * shared with the RPC surface); this string is what the user and the compaction
11
- * log see.
9
+ * `external-owner` rejection cause carries the machine-readable policy while
10
+ * this string is what the user and the compaction log see.
12
11
  */
13
12
  export const SDK_NATIVE_LANE_REJECTION_REASON = "the Claude Agent SDK owns compaction for this session";
14
13
  const COMPACT_BOUNDARY_SCHEMA = "senpi.claude-sdk-oauth.compact-boundary.v1";
@@ -1 +1 @@
1
- {"version":3,"file":"lane-policy.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/lane-policy.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Provider-scoped compaction opt-out for the `claude-sdk-oauth` main lane.\n *\n * That lane keeps one resident SDK session per senpi session, and the Claude\n * Agent SDK runs its own native auto-compaction over that session's transcript.\n * Running senpi's compaction on top of it would rewrite a history senpi no\n * longer owns, so senpi stands down for the lane: no auto-compaction triggers,\n * no context reduction. Every other provider is untouched.\n *\n * The stand-down is conditional on the lane actually being resident: with the\n * `resumeMode: \"off\"` escape hatch senpi flattens its own history into every\n * request, so senpi's compaction must stay fully active there.\n *\n * This module also owns the shape of the mirrored `compact_boundary` ledger\n * entry, so the SDK's native compactions stay visible in senpi history.\n */\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { AssistantMessageDiagnostic } from \"@earendil-works/pi-ai\";\nimport { CLAUDE_SDK_OAUTH_PROVIDER_ID } from \"../claude-sdk-oauth/account-management.ts\";\nimport type { ClaudeSdkOauthProviderSettings } from \"../claude-sdk-oauth/settings.ts\";\nimport { loadClaudeSdkOauthProviderSettingsFromDisk } from \"../claude-sdk-oauth/settings.ts\";\n\n/** Custom session entry type carrying a mirrored SDK compaction boundary. */\nexport const CLAUDE_SDK_OAUTH_COMPACT_ENTRY_TYPE = \"claude-sdk-oauth-compact\";\n/** Assistant-message diagnostic the lane uses to transport a received boundary. */\nexport const CLAUDE_SDK_OAUTH_COMPACT_BOUNDARY_DIAGNOSTIC = \"claude_sdk_oauth_compact_boundary\";\n/**\n * Reason reported when senpi declines to compact an SDK-native lane. The\n * structured `rejectionCause` stays `cancelled-by-extension` (a closed union\n * shared with the RPC surface); this string is what the user and the compaction\n * log see.\n */\nexport const SDK_NATIVE_LANE_REJECTION_REASON = \"the Claude Agent SDK owns compaction for this session\";\nconst COMPACT_BOUNDARY_SCHEMA = \"senpi.claude-sdk-oauth.compact-boundary.v1\";\n\nexport interface LaneModel {\n\tprovider?: string;\n}\n\nexport interface SdkNativeLaneInput {\n\tmodel: LaneModel | undefined;\n\t/** Resolved `claudeSdkOauthProvider.resumeMode`; `undefined` means the \"auto\" default. */\n\tresumeMode?: string;\n}\n\nexport interface LaneContext {\n\tcwd: string;\n\tmodel: LaneModel | undefined;\n}\n\nexport interface CompactionLanePolicy {\n\t/** True when the SDK owns this lane's context and senpi compaction must stand down. */\n\tdisablesSenpiCompaction(context: LaneContext): boolean;\n}\n\nexport interface CompactBoundaryEntry {\n\tschema: typeof COMPACT_BOUNDARY_SCHEMA;\n\tsdkSessionId: string;\n\tuuid: string;\n\tcompactMetadata: Record<string, unknown>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Pure lane predicate. Kept separate from {@link createCompactionLanePolicy} so\n * callers that already know the resolved resume mode never touch disk.\n */\nexport function isSdkNativeCompactionLane(input: SdkNativeLaneInput): boolean {\n\tif (input.model?.provider !== CLAUDE_SDK_OAUTH_PROVIDER_ID) return false;\n\treturn input.resumeMode !== \"off\";\n}\n\n/**\n * Per-extension-instance policy holding one memoized provider-settings read.\n * Settings are only read when the active model actually belongs to the lane, so\n * other providers never pay for the lookup.\n */\nexport function createCompactionLanePolicy(\n\toptions: { loadProviderSettings?: (cwd: string) => ClaudeSdkOauthProviderSettings } = {},\n): CompactionLanePolicy {\n\tconst load = options.loadProviderSettings ?? loadClaudeSdkOauthProviderSettingsFromDisk;\n\tlet cachedCwd: string | undefined;\n\tlet cachedResumeMode: string | undefined;\n\treturn {\n\t\tdisablesSenpiCompaction(context: LaneContext): boolean {\n\t\t\tif (context.model?.provider !== CLAUDE_SDK_OAUTH_PROVIDER_ID) return false;\n\t\t\t// Per-cwd cache is the intended contract (pinned by lane-policy.test.ts):\n\t\t\t// resumeMode is read once per cwd. A mid-session switch takes effect on\n\t\t\t// the next cwd or session.\n\t\t\tif (cachedCwd !== context.cwd) {\n\t\t\t\ttry {\n\t\t\t\t\tcachedResumeMode = load(context.cwd).resumeMode;\n\t\t\t\t} catch {\n\t\t\t\t\t// A settings read failure must never silently disable senpi compaction:\n\t\t\t\t\t// fail closed by keeping senpi's own compaction fully active.\n\t\t\t\t\tcachedCwd = undefined;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tcachedCwd = context.cwd;\n\t\t\t}\n\t\t\treturn isSdkNativeCompactionLane({ model: context.model, resumeMode: cachedResumeMode });\n\t\t},\n\t};\n}\n\n/** Parse an SDK `compact_boundary` system message into the senpi ledger payload. */\nexport function parseCompactBoundaryMessage(value: unknown): CompactBoundaryEntry | undefined {\n\tif (!isRecord(value)) return undefined;\n\tif (value.type !== \"system\" || value.subtype !== \"compact_boundary\") return undefined;\n\tif (typeof value.session_id !== \"string\" || typeof value.uuid !== \"string\") return undefined;\n\tif (!isRecord(value.compact_metadata)) return undefined;\n\treturn {\n\t\tschema: COMPACT_BOUNDARY_SCHEMA,\n\t\tsdkSessionId: value.session_id,\n\t\tuuid: value.uuid,\n\t\tcompactMetadata: { ...value.compact_metadata },\n\t};\n}\n\nfunction messageDiagnostics(message: AgentMessage): readonly AssistantMessageDiagnostic[] {\n\tif (message.role !== \"assistant\") return [];\n\tconst diagnostics = message.diagnostics;\n\treturn Array.isArray(diagnostics) ? diagnostics : [];\n}\n\n/** Collect every compaction boundary the lane attached to a finalized message. */\nexport function collectCompactBoundaryEntries(message: AgentMessage): CompactBoundaryEntry[] {\n\tconst entries: CompactBoundaryEntry[] = [];\n\tfor (const diagnostic of messageDiagnostics(message)) {\n\t\tif (diagnostic.type !== CLAUDE_SDK_OAUTH_COMPACT_BOUNDARY_DIAGNOSTIC) continue;\n\t\tconst entry = parseCompactBoundaryMessage(diagnostic.details);\n\t\tif (entry) entries.push(entry);\n\t}\n\treturn entries;\n}\n"]}
1
+ {"version":3,"file":"lane-policy.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/lane-policy.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Provider-scoped compaction opt-out for the `claude-sdk-oauth` main lane.\n *\n * That lane keeps one resident SDK session per senpi session, and the Claude\n * Agent SDK runs its own native auto-compaction over that session's transcript.\n * Running senpi's compaction on top of it would rewrite a history senpi no\n * longer owns, so senpi stands down for the lane: no auto-compaction triggers,\n * no context reduction. Every other provider is untouched.\n *\n * The stand-down is conditional on the lane actually being resident: with the\n * `resumeMode: \"off\"` escape hatch senpi flattens its own history into every\n * request, so senpi's compaction must stay fully active there.\n *\n * This module also owns the shape of the mirrored `compact_boundary` ledger\n * entry, so the SDK's native compactions stay visible in senpi history.\n */\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { AssistantMessageDiagnostic } from \"@earendil-works/pi-ai\";\nimport { CLAUDE_SDK_OAUTH_PROVIDER_ID } from \"../claude-sdk-oauth/account-management.ts\";\nimport type { ClaudeSdkOauthProviderSettings } from \"../claude-sdk-oauth/settings.ts\";\nimport { loadClaudeSdkOauthProviderSettingsFromDisk } from \"../claude-sdk-oauth/settings.ts\";\n\n/** Custom session entry type carrying a mirrored SDK compaction boundary. */\nexport const CLAUDE_SDK_OAUTH_COMPACT_ENTRY_TYPE = \"claude-sdk-oauth-compact\";\n/** Assistant-message diagnostic the lane uses to transport a received boundary. */\nexport const CLAUDE_SDK_OAUTH_COMPACT_BOUNDARY_DIAGNOSTIC = \"claude_sdk_oauth_compact_boundary\";\n/**\n * Reason reported when senpi declines to compact an SDK-native lane. The\n * `external-owner` rejection cause carries the machine-readable policy while\n * this string is what the user and the compaction log see.\n */\nexport const SDK_NATIVE_LANE_REJECTION_REASON = \"the Claude Agent SDK owns compaction for this session\";\nconst COMPACT_BOUNDARY_SCHEMA = \"senpi.claude-sdk-oauth.compact-boundary.v1\";\n\nexport interface LaneModel {\n\tprovider?: string;\n}\n\nexport interface SdkNativeLaneInput {\n\tmodel: LaneModel | undefined;\n\t/** Resolved `claudeSdkOauthProvider.resumeMode`; `undefined` means the \"auto\" default. */\n\tresumeMode?: string;\n}\n\nexport interface LaneContext {\n\tcwd: string;\n\tmodel: LaneModel | undefined;\n}\n\nexport interface CompactionLanePolicy {\n\t/** True when the SDK owns this lane's context and senpi compaction must stand down. */\n\tdisablesSenpiCompaction(context: LaneContext): boolean;\n}\n\nexport interface CompactBoundaryEntry {\n\tschema: typeof COMPACT_BOUNDARY_SCHEMA;\n\tsdkSessionId: string;\n\tuuid: string;\n\tcompactMetadata: Record<string, unknown>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Pure lane predicate. Kept separate from {@link createCompactionLanePolicy} so\n * callers that already know the resolved resume mode never touch disk.\n */\nexport function isSdkNativeCompactionLane(input: SdkNativeLaneInput): boolean {\n\tif (input.model?.provider !== CLAUDE_SDK_OAUTH_PROVIDER_ID) return false;\n\treturn input.resumeMode !== \"off\";\n}\n\n/**\n * Per-extension-instance policy holding one memoized provider-settings read.\n * Settings are only read when the active model actually belongs to the lane, so\n * other providers never pay for the lookup.\n */\nexport function createCompactionLanePolicy(\n\toptions: { loadProviderSettings?: (cwd: string) => ClaudeSdkOauthProviderSettings } = {},\n): CompactionLanePolicy {\n\tconst load = options.loadProviderSettings ?? loadClaudeSdkOauthProviderSettingsFromDisk;\n\tlet cachedCwd: string | undefined;\n\tlet cachedResumeMode: string | undefined;\n\treturn {\n\t\tdisablesSenpiCompaction(context: LaneContext): boolean {\n\t\t\tif (context.model?.provider !== CLAUDE_SDK_OAUTH_PROVIDER_ID) return false;\n\t\t\t// Per-cwd cache is the intended contract (pinned by lane-policy.test.ts):\n\t\t\t// resumeMode is read once per cwd. A mid-session switch takes effect on\n\t\t\t// the next cwd or session.\n\t\t\tif (cachedCwd !== context.cwd) {\n\t\t\t\ttry {\n\t\t\t\t\tcachedResumeMode = load(context.cwd).resumeMode;\n\t\t\t\t} catch {\n\t\t\t\t\t// A settings read failure must never silently disable senpi compaction:\n\t\t\t\t\t// fail closed by keeping senpi's own compaction fully active.\n\t\t\t\t\tcachedCwd = undefined;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tcachedCwd = context.cwd;\n\t\t\t}\n\t\t\treturn isSdkNativeCompactionLane({ model: context.model, resumeMode: cachedResumeMode });\n\t\t},\n\t};\n}\n\n/** Parse an SDK `compact_boundary` system message into the senpi ledger payload. */\nexport function parseCompactBoundaryMessage(value: unknown): CompactBoundaryEntry | undefined {\n\tif (!isRecord(value)) return undefined;\n\tif (value.type !== \"system\" || value.subtype !== \"compact_boundary\") return undefined;\n\tif (typeof value.session_id !== \"string\" || typeof value.uuid !== \"string\") return undefined;\n\tif (!isRecord(value.compact_metadata)) return undefined;\n\treturn {\n\t\tschema: COMPACT_BOUNDARY_SCHEMA,\n\t\tsdkSessionId: value.session_id,\n\t\tuuid: value.uuid,\n\t\tcompactMetadata: { ...value.compact_metadata },\n\t};\n}\n\nfunction messageDiagnostics(message: AgentMessage): readonly AssistantMessageDiagnostic[] {\n\tif (message.role !== \"assistant\") return [];\n\tconst diagnostics = message.diagnostics;\n\treturn Array.isArray(diagnostics) ? diagnostics : [];\n}\n\n/** Collect every compaction boundary the lane attached to a finalized message. */\nexport function collectCompactBoundaryEntries(message: AgentMessage): CompactBoundaryEntry[] {\n\tconst entries: CompactBoundaryEntry[] = [];\n\tfor (const diagnostic of messageDiagnostics(message)) {\n\t\tif (diagnostic.type !== CLAUDE_SDK_OAUTH_COMPACT_BOUNDARY_DIAGNOSTIC) continue;\n\t\tconst entry = parseCompactBoundaryMessage(diagnostic.details);\n\t\tif (entry) entries.push(entry);\n\t}\n\treturn entries;\n}\n"]}
@@ -36,7 +36,7 @@ export type { BuildSystemPromptOptions } from "../system-prompt.ts";
36
36
  export type { AgentToolResult, AgentToolUpdateCallback, ToolExecutionMode };
37
37
  export type ServiceTier = "auto" | "flex" | "priority";
38
38
  export type CompactionReason = "manual" | "threshold" | "overflow" | "pre_prompt" | "branch" | "extension";
39
- export type CompactionRejectionCause = "cancelled-by-extension" | "would-overflow" | "circuit-breaker" | "per-turn-cap" | "stale-revision";
39
+ export type CompactionRejectionCause = "cancelled-by-extension" | "external-owner" | "would-overflow" | "circuit-breaker" | "per-turn-cap" | "stale-revision";
40
40
  /** Options for extension UI dialogs. */
41
41
  export interface ExtensionUIDialogOptions {
42
42
  /** AbortSignal to programmatically dismiss the dialog. */