@astralyn/pi 0.84.8 → 0.84.10

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 (270) hide show
  1. package/CHANGELOG.md +17 -2
  2. package/README.md +3 -2
  3. package/dist/cli/args.d.ts +1 -0
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +29 -9
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/file-processor.d.ts.map +1 -1
  8. package/dist/cli/file-processor.js +2 -1
  9. package/dist/cli/file-processor.js.map +1 -1
  10. package/dist/config.d.ts +4 -3
  11. package/dist/config.d.ts.map +1 -1
  12. package/dist/config.js +22 -14
  13. package/dist/config.js.map +1 -1
  14. package/dist/core/agent-session.d.ts +26 -7
  15. package/dist/core/agent-session.d.ts.map +1 -1
  16. package/dist/core/agent-session.js +83 -64
  17. package/dist/core/agent-session.js.map +1 -1
  18. package/dist/core/auth-storage.d.ts.map +1 -1
  19. package/dist/core/auth-storage.js +6 -7
  20. package/dist/core/auth-storage.js.map +1 -1
  21. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  22. package/dist/core/compaction/branch-summarization.js +3 -0
  23. package/dist/core/compaction/branch-summarization.js.map +1 -1
  24. package/dist/core/compaction/compaction.d.ts +4 -3
  25. package/dist/core/compaction/compaction.d.ts.map +1 -1
  26. package/dist/core/compaction/compaction.js +41 -32
  27. package/dist/core/compaction/compaction.js.map +1 -1
  28. package/dist/core/compaction-controller.d.ts +2 -1
  29. package/dist/core/compaction-controller.d.ts.map +1 -1
  30. package/dist/core/compaction-controller.js +64 -21
  31. package/dist/core/compaction-controller.js.map +1 -1
  32. package/dist/core/defaults.d.ts +1 -0
  33. package/dist/core/defaults.d.ts.map +1 -1
  34. package/dist/core/defaults.js +9 -0
  35. package/dist/core/defaults.js.map +1 -1
  36. package/dist/core/extensions/index.d.ts +2 -2
  37. package/dist/core/extensions/index.d.ts.map +1 -1
  38. package/dist/core/extensions/index.js +1 -1
  39. package/dist/core/extensions/index.js.map +1 -1
  40. package/dist/core/extensions/loader.d.ts.map +1 -1
  41. package/dist/core/extensions/loader.js +115 -48
  42. package/dist/core/extensions/loader.js.map +1 -1
  43. package/dist/core/extensions/types.d.ts +38 -9
  44. package/dist/core/extensions/types.d.ts.map +1 -1
  45. package/dist/core/extensions/types.js +3 -0
  46. package/dist/core/extensions/types.js.map +1 -1
  47. package/dist/core/footer-data-provider.d.ts +1 -1
  48. package/dist/core/footer-data-provider.js +1 -1
  49. package/dist/core/footer-data-provider.js.map +1 -1
  50. package/dist/core/keybindings.d.ts +20 -19
  51. package/dist/core/keybindings.d.ts.map +1 -1
  52. package/dist/core/keybindings.js +26 -5
  53. package/dist/core/keybindings.js.map +1 -1
  54. package/dist/core/model-config.d.ts +5 -0
  55. package/dist/core/model-config.d.ts.map +1 -1
  56. package/dist/core/model-config.js +3 -1
  57. package/dist/core/model-config.js.map +1 -1
  58. package/dist/core/model-resolver.d.ts +1 -0
  59. package/dist/core/model-resolver.d.ts.map +1 -1
  60. package/dist/core/model-resolver.js +14 -8
  61. package/dist/core/model-resolver.js.map +1 -1
  62. package/dist/core/models-store.d.ts.map +1 -1
  63. package/dist/core/models-store.js +2 -1
  64. package/dist/core/models-store.js.map +1 -1
  65. package/dist/core/package-manager.d.ts.map +1 -1
  66. package/dist/core/package-manager.js +22 -14
  67. package/dist/core/package-manager.js.map +1 -1
  68. package/dist/core/pi-manifest.d.ts.map +1 -1
  69. package/dist/core/pi-manifest.js +2 -1
  70. package/dist/core/pi-manifest.js.map +1 -1
  71. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  72. package/dist/core/remote-catalog-provider.js +2 -1
  73. package/dist/core/remote-catalog-provider.js.map +1 -1
  74. package/dist/core/resource-loader.d.ts.map +1 -1
  75. package/dist/core/resource-loader.js +3 -2
  76. package/dist/core/resource-loader.js.map +1 -1
  77. package/dist/core/sdk.d.ts +2 -2
  78. package/dist/core/sdk.d.ts.map +1 -1
  79. package/dist/core/sdk.js +10 -3
  80. package/dist/core/sdk.js.map +1 -1
  81. package/dist/core/session-export.d.ts +4 -0
  82. package/dist/core/session-export.d.ts.map +1 -0
  83. package/dist/core/session-export.js +32 -0
  84. package/dist/core/session-export.js.map +1 -0
  85. package/dist/core/session-manager.d.ts.map +1 -1
  86. package/dist/core/session-manager.js +4 -3
  87. package/dist/core/session-manager.js.map +1 -1
  88. package/dist/core/settings-diagnostics.d.ts +9 -0
  89. package/dist/core/settings-diagnostics.d.ts.map +1 -0
  90. package/dist/core/settings-diagnostics.js +21 -0
  91. package/dist/core/settings-diagnostics.js.map +1 -0
  92. package/dist/core/settings-manager.d.ts +9 -0
  93. package/dist/core/settings-manager.d.ts.map +1 -1
  94. package/dist/core/settings-manager.js +51 -10
  95. package/dist/core/settings-manager.js.map +1 -1
  96. package/dist/core/skills.d.ts.map +1 -1
  97. package/dist/core/skills.js +51 -33
  98. package/dist/core/skills.js.map +1 -1
  99. package/dist/core/slash-commands.d.ts.map +1 -1
  100. package/dist/core/slash-commands.js +2 -1
  101. package/dist/core/slash-commands.js.map +1 -1
  102. package/dist/core/system-prompt.d.ts.map +1 -1
  103. package/dist/core/system-prompt.js +11 -2
  104. package/dist/core/system-prompt.js.map +1 -1
  105. package/dist/core/tools/bash.d.ts +19 -1
  106. package/dist/core/tools/bash.d.ts.map +1 -1
  107. package/dist/core/tools/bash.js +59 -37
  108. package/dist/core/tools/bash.js.map +1 -1
  109. package/dist/core/tools/edit-diff.d.ts +0 -5
  110. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  111. package/dist/core/tools/edit-diff.js +2 -5
  112. package/dist/core/tools/edit-diff.js.map +1 -1
  113. package/dist/core/tools/edit.d.ts.map +1 -1
  114. package/dist/core/tools/edit.js +20 -4
  115. package/dist/core/tools/edit.js.map +1 -1
  116. package/dist/core/tools/index.d.ts +4 -1
  117. package/dist/core/tools/index.d.ts.map +1 -1
  118. package/dist/core/tools/index.js +18 -1
  119. package/dist/core/tools/index.js.map +1 -1
  120. package/dist/core/tools/powershell.d.ts +16 -0
  121. package/dist/core/tools/powershell.d.ts.map +1 -0
  122. package/dist/core/tools/powershell.js +39 -0
  123. package/dist/core/tools/powershell.js.map +1 -0
  124. package/dist/core/trust-manager.d.ts.map +1 -1
  125. package/dist/core/trust-manager.js +2 -1
  126. package/dist/core/trust-manager.js.map +1 -1
  127. package/dist/extensions/background/registry.d.ts +2 -3
  128. package/dist/extensions/background/registry.d.ts.map +1 -1
  129. package/dist/extensions/background/registry.js +2 -6
  130. package/dist/extensions/background/registry.js.map +1 -1
  131. package/dist/extensions/llama/index.d.ts.map +1 -1
  132. package/dist/extensions/llama/index.js +2 -0
  133. package/dist/extensions/llama/index.js.map +1 -1
  134. package/dist/extensions/llama/provider.d.ts.map +1 -1
  135. package/dist/extensions/llama/provider.js +6 -2
  136. package/dist/extensions/llama/provider.js.map +1 -1
  137. package/dist/extensions/question/types.d.ts +0 -1
  138. package/dist/extensions/question/types.d.ts.map +1 -1
  139. package/dist/extensions/question/types.js +1 -1
  140. package/dist/extensions/question/types.js.map +1 -1
  141. package/dist/extensions/router/register.d.ts +0 -1
  142. package/dist/extensions/router/register.d.ts.map +1 -1
  143. package/dist/extensions/router/register.js +0 -3
  144. package/dist/extensions/router/register.js.map +1 -1
  145. package/dist/extensions/router/stream.d.ts +0 -2
  146. package/dist/extensions/router/stream.d.ts.map +1 -1
  147. package/dist/extensions/router/stream.js +1 -12
  148. package/dist/extensions/router/stream.js.map +1 -1
  149. package/dist/extensions/subagent/index.js +2 -2
  150. package/dist/extensions/subagent/index.js.map +1 -1
  151. package/dist/extensions/subagent/render.d.ts +6 -2
  152. package/dist/extensions/subagent/render.d.ts.map +1 -1
  153. package/dist/extensions/subagent/render.js +143 -132
  154. package/dist/extensions/subagent/render.js.map +1 -1
  155. package/dist/extensions/subagent/text.d.ts +0 -1
  156. package/dist/extensions/subagent/text.d.ts.map +1 -1
  157. package/dist/extensions/subagent/text.js +1 -30
  158. package/dist/extensions/subagent/text.js.map +1 -1
  159. package/dist/extensions/subagent/ui/model-list.d.ts +0 -3
  160. package/dist/extensions/subagent/ui/model-list.d.ts.map +1 -1
  161. package/dist/extensions/subagent/ui/model-list.js +1 -10
  162. package/dist/extensions/subagent/ui/model-list.js.map +1 -1
  163. package/dist/index.d.ts +5 -5
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js +4 -4
  166. package/dist/index.js.map +1 -1
  167. package/dist/main.d.ts +4 -0
  168. package/dist/main.d.ts.map +1 -1
  169. package/dist/main.js +18 -15
  170. package/dist/main.js.map +1 -1
  171. package/dist/migrations.js +5 -5
  172. package/dist/migrations.js.map +1 -1
  173. package/dist/modes/interactive/components/index.d.ts +0 -1
  174. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  175. package/dist/modes/interactive/components/index.js +0 -1
  176. package/dist/modes/interactive/components/index.js.map +1 -1
  177. package/dist/modes/interactive/components/model-selector.d.ts +9 -3
  178. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  179. package/dist/modes/interactive/components/model-selector.js +54 -11
  180. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  181. package/dist/modes/interactive/components/settings-selector.d.ts +7 -2
  182. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  183. package/dist/modes/interactive/components/settings-selector.js +118 -55
  184. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  185. package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
  186. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
  187. package/dist/modes/interactive/components/settings-submenu.js +151 -0
  188. package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
  189. package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
  190. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  191. package/dist/modes/interactive/components/thinking-selector.js +68 -17
  192. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  193. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  194. package/dist/modes/interactive/external-editor.js +2 -1
  195. package/dist/modes/interactive/external-editor.js.map +1 -1
  196. package/dist/modes/interactive/interactive-mode.d.ts +11 -0
  197. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  198. package/dist/modes/interactive/interactive-mode.js +167 -105
  199. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  200. package/dist/modes/interactive/session-share.d.ts +16 -0
  201. package/dist/modes/interactive/session-share.d.ts.map +1 -0
  202. package/dist/modes/interactive/session-share.js +188 -0
  203. package/dist/modes/interactive/session-share.js.map +1 -0
  204. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  205. package/dist/modes/interactive/theme/theme.js +3 -2
  206. package/dist/modes/interactive/theme/theme.js.map +1 -1
  207. package/dist/modes/json-event.d.ts +16 -13
  208. package/dist/modes/json-event.d.ts.map +1 -1
  209. package/dist/modes/json-event.js +20 -6
  210. package/dist/modes/json-event.js.map +1 -1
  211. package/dist/package-manager-cli.d.ts +1 -0
  212. package/dist/package-manager-cli.d.ts.map +1 -1
  213. package/dist/package-manager-cli.js +186 -2
  214. package/dist/package-manager-cli.js.map +1 -1
  215. package/dist/utils/frontmatter.d.ts.map +1 -1
  216. package/dist/utils/frontmatter.js +2 -1
  217. package/dist/utils/frontmatter.js.map +1 -1
  218. package/dist/utils/management-http.d.ts +5 -3
  219. package/dist/utils/management-http.d.ts.map +1 -1
  220. package/dist/utils/management-http.js +14 -10
  221. package/dist/utils/management-http.js.map +1 -1
  222. package/dist/utils/paths.d.ts +0 -5
  223. package/dist/utils/paths.d.ts.map +1 -1
  224. package/dist/utils/paths.js +0 -7
  225. package/dist/utils/paths.js.map +1 -1
  226. package/dist/utils/shell.d.ts +3 -0
  227. package/dist/utils/shell.d.ts.map +1 -1
  228. package/dist/utils/shell.js +17 -5
  229. package/dist/utils/shell.js.map +1 -1
  230. package/dist/utils/text.d.ts +8 -0
  231. package/dist/utils/text.d.ts.map +1 -0
  232. package/dist/utils/text.js +9 -0
  233. package/dist/utils/text.js.map +1 -0
  234. package/docs/bundled/extensions/subagent.md +40 -23
  235. package/docs/compaction.md +19 -2
  236. package/docs/custom-provider.md +5 -2
  237. package/docs/environment-variables.md +8 -8
  238. package/docs/extensions.md +22 -10
  239. package/docs/json.md +7 -2
  240. package/docs/keybindings.md +10 -8
  241. package/docs/llama-cpp.md +6 -4
  242. package/docs/models.md +10 -3
  243. package/docs/packages.md +2 -1
  244. package/docs/rpc.md +9 -3
  245. package/docs/sdk.md +12 -2
  246. package/docs/settings.md +16 -5
  247. package/docs/skills.md +5 -4
  248. package/docs/terminal-setup.md +11 -9
  249. package/docs/usage.md +6 -2
  250. package/docs/windows.md +24 -2
  251. package/examples/extensions/border-status-editor.ts +1 -1
  252. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  253. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  254. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  255. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  256. package/examples/extensions/doom-overlay/doom/build.sh +0 -0
  257. package/examples/extensions/git-checkpoint.ts +2 -2
  258. package/examples/extensions/gondolin/package-lock.json +2 -2
  259. package/examples/extensions/gondolin/package.json +1 -1
  260. package/examples/extensions/notify.ts +3 -1
  261. package/examples/extensions/sandbox/package-lock.json +2 -2
  262. package/examples/extensions/sandbox/package.json +1 -1
  263. package/examples/extensions/titlebar-spinner.ts +1 -1
  264. package/examples/extensions/with-deps/package-lock.json +2 -2
  265. package/examples/extensions/with-deps/package.json +1 -1
  266. package/examples/rpc-extension-ui.ts +1 -1
  267. package/examples/sdk/06-extensions.ts +1 -1
  268. package/examples/sdk/README.md +1 -1
  269. package/npm-shrinkwrap.json +196 -257
  270. package/package.json +6 -8
@@ -1 +1 @@
1
- {"version":3,"file":"compaction-controller.js","sourceRoot":"","sources":["../../src/core/compaction-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Agent, AgentMessage, PrepareNextTurnContext, ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { AssistantMessage, Model, Usage } from \"@earendil-works/pi-ai/compat\";\nimport {\n\tisContextOverflow,\n\tisRecoverableLength,\n\ttype RetryCallbacks,\n\tstreamSimple,\n} from \"@earendil-works/pi-ai/compat\";\nimport type { AgentSessionEvent } from \"./agent-session.ts\";\nimport {\n\ttype CompactionResult,\n\tcalculateContextTokens,\n\tcompact,\n\testimateContextTokens,\n\testimateTokens,\n\tprepareCompaction,\n\tshouldCompact,\n} from \"./compaction/index.ts\";\nimport type { CompactionTiming, ExtensionRunner, SessionBeforeCompactResult } from \"./extensions/index.ts\";\nimport type { CompactionEntry, SessionManager } from \"./session-manager.ts\";\nimport { getLatestCompactionEntry } from \"./session-manager.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\n\nexport const CONTEXT_REMAINS_OVER_COMPACTION_THRESHOLD =\n\t\"Estimated retained context remains above the configured auto-compaction threshold. Reduce compaction.keepRecentTokens, remove large retained content, or switch to a model with a larger context window before continuing.\";\nexport const NOTHING_TO_COMPACT_WITHIN_KEEP_WINDOW =\n\t\"Nothing to compact while preserving the configured recent context. Reduce compaction.keepRecentTokens, remove large retained content, or switch to a model with a larger context window before continuing.\";\nexport const AUTO_COMPACTION_STOPPED_BEFORE_NEXT_PROVIDER =\n\t\"Stopped before the next provider request because auto-compaction did not produce a safe context. Review the compaction warning before continuing.\";\n\ninterface AutoCompactionOutcome {\n\tcompacted: boolean;\n\tshouldContinue: boolean;\n\t/** Compaction persisted, but the rebuilt context is still unsafe to send. */\n\tmustStop?: boolean;\n\t/** An extension declined this compaction via session_before_compact. */\n\tcancelled?: boolean;\n}\n\nexport interface MidTurnCompactionOutcome {\n\tmessages?: AgentMessage[];\n\tstopErrorMessage?: string;\n}\n\nexport function estimateMessagesTokens(messages: AgentMessage[]): number {\n\tlet tokens = 0;\n\tfor (const message of messages) {\n\t\ttokens += estimateTokens(message);\n\t}\n\treturn tokens;\n}\n\ninterface SummarizationRequestAuth {\n\tmodel: Model<any>;\n\tapiKey?: string;\n\theaders?: Record<string, string>;\n\tenv?: Record<string, string>;\n}\n\n/**\n * The slice of AgentSession that auto-compaction needs. Every member forwards\n * to existing session state; the host does not grant new capabilities.\n */\nexport interface CompactionHost {\n\treadonly agent: Agent;\n\treadonly sessionManager: SessionManager;\n\treadonly settingsManager: SettingsManager;\n\tgetModel(): Model<any> | undefined;\n\tgetThinkingLevel(): ThinkingLevel;\n\tgetExtensionRunner(): ExtensionRunner;\n\t/** Whether a manual /compact run currently owns the compaction lifecycle. */\n\tisManualCompactionActive(): boolean;\n\temit(event: AgentSessionEvent): void;\n\tgetRequiredRequestAuth(model: Model<any>): Promise<SummarizationRequestAuth>;\n\tgetSummarizationRequestAuth(\n\t\tmodel: Model<any>,\n\t\tstreamFunction: Agent[\"streamFunction\"],\n\t): Promise<SummarizationRequestAuth>;\n\tsummarizationRetryCallbacks(source: {\n\t\tsource: \"compaction\";\n\t\treason: \"manual\" | \"threshold\" | \"overflow\";\n\t}): RetryCallbacks;\n}\n\n/**\n * Owns automatic compaction: threshold checks after tool batches (mid-turn),\n * after a run, and before a prompt; overflow compact-and-retry recovery; and\n * the fail-closed stop when compaction cannot produce a safe context.\n * Manual /compact stays in AgentSession.\n */\nexport class CompactionController {\n\tprivate readonly host: CompactionHost;\n\tprivate _abortController: AbortController | undefined = undefined;\n\tprivate _stopAfterTurnRequested = false;\n\t/** An extension cancelled a mid-turn compaction; skip further mid-turn checks this run. */\n\tprivate _midTurnDeclined = false;\n\tprivate _overflowRecoveryAttempted = false;\n\n\tconstructor(host: CompactionHost) {\n\t\tthis.host = host;\n\t}\n\n\t/** Clear per-run state when a new agent run starts. */\n\tnoteRunStart(): void {\n\t\tthis._stopAfterTurnRequested = false;\n\t\tthis._midTurnDeclined = false;\n\t}\n\n\t/** Read and clear the pending stop request. */\n\tconsumeStopAfterTurn(): boolean {\n\t\tconst requested = this._stopAfterTurnRequested;\n\t\tthis._stopAfterTurnRequested = false;\n\t\treturn requested;\n\t}\n\n\t/** Stop the run at the next lifecycle boundary instead of sending an unsafe context. */\n\trequestStopAfterTurn(): void {\n\t\tthis._stopAfterTurnRequested = true;\n\t}\n\n\t/** A user message or a healthy assistant response resets overflow recovery. */\n\tresetOverflowRecovery(): void {\n\t\tthis._overflowRecoveryAttempted = false;\n\t}\n\n\tget isAutoCompacting(): boolean {\n\t\treturn this._abortController !== undefined;\n\t}\n\n\tabort(): void {\n\t\tthis._abortController?.abort();\n\t}\n\n\testimateContextTokens(messages: AgentMessage[]): number {\n\t\tconst estimate = estimateContextTokens(messages);\n\t\tconst compactionEntry = getLatestCompactionEntry(this.host.sessionManager.getBranch());\n\t\tif (compactionEntry && estimate.lastUsageIndex !== null) {\n\t\t\tconst usageMessage = messages[estimate.lastUsageIndex];\n\t\t\tif (\n\t\t\t\tusageMessage?.role === \"assistant\" &&\n\t\t\t\tusageMessage.timestamp <= new Date(compactionEntry.timestamp).getTime()\n\t\t\t) {\n\t\t\t\t// A retained pre-compaction usage describes the old, larger context. Fall back\n\t\t\t\t// to message estimates rather than immediately compacting again from stale data.\n\t\t\t\treturn estimateMessagesTokens(messages);\n\t\t\t}\n\t\t}\n\t\treturn estimate.tokens;\n\t}\n\n\tasync maybeCompactBeforeNextToolTurn(\n\t\tturn: PrepareNextTurnContext,\n\t\tsignal?: AbortSignal,\n\t): Promise<MidTurnCompactionOutcome> {\n\t\tif (signal?.aborted) {\n\t\t\treturn { stopErrorMessage: AUTO_COMPACTION_STOPPED_BEFORE_NEXT_PROVIDER };\n\t\t}\n\t\t// Tool batches always continue the run; a turn without tool results only\n\t\t// continues when steering/follow-up messages are queued, otherwise the\n\t\t// post-run path covers it.\n\t\tif (turn.toolResults.length === 0 && !this.host.agent.hasQueuedMessages()) {\n\t\t\treturn {};\n\t\t}\n\t\tif (this._midTurnDeclined) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst settings = this.host.settingsManager.getCompactionSettings();\n\t\tif (!settings.enabled) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst contextTokens = this.estimateContextTokens(turn.context.messages);\n\t\tconst contextWindow = this.host.getModel()?.contextWindow ?? 0;\n\t\tif (!shouldCompact(contextTokens, contextWindow, settings)) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst outcome = await this._runAutoCompactionWithOutcome(\"threshold\", false, \"midTurn\", signal);\n\t\tif (!outcome.compacted) {\n\t\t\tif (outcome.cancelled && signal?.aborted !== true) {\n\t\t\t\t// The extension took ownership of the risk; don't re-ask on every batch.\n\t\t\t\tthis._midTurnDeclined = true;\n\t\t\t\treturn {};\n\t\t\t}\n\t\t\treturn { stopErrorMessage: AUTO_COMPACTION_STOPPED_BEFORE_NEXT_PROVIDER };\n\t\t}\n\n\t\treturn {\n\t\t\tmessages: this.host.agent.state.messages.slice(),\n\t\t\t...(signal?.aborted === true\n\t\t\t\t? { stopErrorMessage: AUTO_COMPACTION_STOPPED_BEFORE_NEXT_PROVIDER }\n\t\t\t\t: outcome.mustStop === true\n\t\t\t\t\t? { stopErrorMessage: CONTEXT_REMAINS_OVER_COMPACTION_THRESHOLD }\n\t\t\t\t\t: {}),\n\t\t};\n\t}\n\n\t/**\n\t * Check if compaction is needed and run it.\n\t * Called after agent_end and before prompt submission.\n\t *\n\t * Two cases:\n\t * 1. Recoverable failure: LLM returned context overflow or stopped below its desired output limit;\n\t * remove the assistant message, compact, and auto-retry once\n\t * 2. Threshold: Context over threshold, compact, NO auto-retry (user continues manually)\n\t *\n\t * @param assistantMessage The assistant message to check\n\t * @param skipAbortedCheck If false, include aborted messages (for pre-prompt check). Default: true\n\t */\n\tasync checkCompaction(\n\t\tassistantMessage: AssistantMessage,\n\t\tskipAbortedCheck = true,\n\t\ttiming: CompactionTiming = \"postRun\",\n\t): Promise<boolean> {\n\t\tconst settings = this.host.settingsManager.getCompactionSettings();\n\t\tif (!settings.enabled) return false;\n\n\t\t// Skip if message was aborted (user cancelled) - unless skipAbortedCheck is false\n\t\tif (skipAbortedCheck && assistantMessage.stopReason === \"aborted\") return false;\n\n\t\tconst model = this.host.getModel();\n\t\tconst contextWindow = model?.contextWindow ?? 0;\n\n\t\t// Skip overflow check if the message came from a different model.\n\t\t// This handles the case where user switched from a smaller-context model (e.g. opus)\n\t\t// to a larger-context model (e.g. codex) - the overflow error from the old model\n\t\t// shouldn't trigger compaction for the new model.\n\t\tconst sameModel = model && assistantMessage.provider === model.provider && assistantMessage.model === model.id;\n\n\t\t// Skip compaction checks if this assistant message is older than the latest\n\t\t// compaction boundary. This prevents a stale pre-compaction usage/error\n\t\t// from retriggering compaction on the first prompt after compaction.\n\t\tconst compactionEntry = getLatestCompactionEntry(this.host.sessionManager.getBranch());\n\t\tconst assistantIsFromBeforeCompaction =\n\t\t\tcompactionEntry !== null && assistantMessage.timestamp <= new Date(compactionEntry.timestamp).getTime();\n\t\tif (assistantIsFromBeforeCompaction) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Case 1: Recoverable failure. Explicit/silent context overflow still uses context metadata.\n\t\t// A length stop is recoverable when output ended below the model's original desired limit,\n\t\t// independent of the configured context size or any context-clamped provider request limit.\n\t\t// A successful response over the configured window should compact but must not retry: the\n\t\t// assistant answer already completed and agent.continue() cannot continue from an assistant.\n\t\tconst recoverableLength = sameModel && isRecoverableLength(assistantMessage, model?.maxTokens ?? 0);\n\t\tif (sameModel && (isContextOverflow(assistantMessage, contextWindow) || recoverableLength)) {\n\t\t\tconst willRetry = assistantMessage.stopReason !== \"stop\";\n\n\t\t\tif (!willRetry) {\n\t\t\t\treturn await this._runAutoCompaction(\"overflow\", false, timing);\n\t\t\t}\n\n\t\t\tif (this._overflowRecoveryAttempted) {\n\t\t\t\tthis._stopAfterTurnRequested = true;\n\t\t\t\tthis.host.emit({\n\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\treason: \"overflow\",\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted: false,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\"Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.\",\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis._overflowRecoveryAttempted = true;\n\t\t\t// Remove the failed or truncated message from agent state. It remains in session history,\n\t\t\t// but must not be included in the compact-and-retry context.\n\t\t\tconst messages = this.host.agent.state.messages;\n\t\t\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\t\t\tthis.host.agent.state.messages = messages.slice(0, -1);\n\t\t\t}\n\t\t\treturn await this._runAutoCompaction(\"overflow\", willRetry, timing);\n\t\t}\n\n\t\t// Case 2: Threshold - context is getting large\n\t\t// For error messages or all-zero usage messages, estimate from the last valid response.\n\t\t// This ensures sessions that hit persistent API errors (e.g. 529) or malformed zero-usage\n\t\t// responses can still compact and do not reset context accounting.\n\t\tlet contextTokens: number;\n\t\tconst directContextTokens = assistantMessage.usage ? calculateContextTokens(assistantMessage.usage) : 0;\n\t\tif (assistantMessage.stopReason === \"error\" || directContextTokens === 0) {\n\t\t\tconst messages = this.host.agent.state.messages;\n\t\t\tconst estimate = estimateContextTokens(messages);\n\t\t\tif (estimate.lastUsageIndex === null) return false; // No usage data at all\n\t\t\t// Verify the usage source is post-compaction. Kept pre-compaction messages\n\t\t\t// have stale usage reflecting the old (larger) context and would falsely\n\t\t\t// trigger compaction right after one just finished.\n\t\t\tconst usageMsg = messages[estimate.lastUsageIndex];\n\t\t\tif (\n\t\t\t\tcompactionEntry &&\n\t\t\t\tusageMsg.role === \"assistant\" &&\n\t\t\t\t(usageMsg as AssistantMessage).timestamp <= new Date(compactionEntry.timestamp).getTime()\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tcontextTokens = estimate.tokens;\n\t\t} else {\n\t\t\tcontextTokens = directContextTokens;\n\t\t}\n\t\tif (shouldCompact(contextTokens, contextWindow, settings)) {\n\t\t\treturn await this._runAutoCompaction(\"threshold\", false, timing);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Internal: Run auto-compaction with events.\n\t */\n\tprivate async _runAutoCompaction(\n\t\treason: \"overflow\" | \"threshold\",\n\t\twillRetry: boolean,\n\t\ttiming: CompactionTiming = \"postRun\",\n\t): Promise<boolean> {\n\t\tconst outcome = await this._runAutoCompactionWithOutcome(reason, willRetry, timing);\n\t\tif (!outcome.compacted || outcome.mustStop) {\n\t\t\tthis._stopAfterTurnRequested = true;\n\t\t}\n\t\treturn outcome.shouldContinue;\n\t}\n\n\tprivate async _runAutoCompactionWithOutcome(\n\t\treason: \"overflow\" | \"threshold\",\n\t\twillRetry: boolean,\n\t\ttiming: CompactionTiming,\n\t\tparentSignal?: AbortSignal,\n\t): Promise<AutoCompactionOutcome> {\n\t\tconst settings = this.host.settingsManager.getCompactionSettings();\n\t\tlet started = false;\n\t\tlet controller: AbortController | undefined;\n\t\tlet removeParentAbortListener: (() => void) | undefined;\n\n\t\ttry {\n\t\t\tconst model = this.host.getModel();\n\t\t\tif (!model || this._abortController || this.host.isManualCompactionActive() || parentSignal?.aborted) {\n\t\t\t\treturn { compacted: false, shouldContinue: false };\n\t\t\t}\n\t\t\tconst streamFunction = this.host.agent.streamFunction;\n\t\t\tconst thinkingLevel = this.host.getThinkingLevel();\n\t\t\tconst retrySettings = this.host.settingsManager.getRetrySettings();\n\n\t\t\tcontroller = new AbortController();\n\t\t\tif (parentSignal) {\n\t\t\t\tconst abortFromParent = () => controller?.abort();\n\t\t\t\tparentSignal.addEventListener(\"abort\", abortFromParent, { once: true });\n\t\t\t\tremoveParentAbortListener = () => parentSignal.removeEventListener(\"abort\", abortFromParent);\n\t\t\t}\n\t\t\tif (controller.signal.aborted) {\n\t\t\t\treturn { compacted: false, shouldContinue: false };\n\t\t\t}\n\t\t\tthis._abortController = controller;\n\t\t\tstarted = true;\n\t\t\tthis.host.emit({ type: \"compaction_start\", reason });\n\t\t\tif (controller.signal.aborted) {\n\t\t\t\tthis.host.emit({\n\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\treason,\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted: true,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t});\n\t\t\t\treturn { compacted: false, shouldContinue: false };\n\t\t\t}\n\n\t\t\tlet extensionCompaction: CompactionResult | undefined;\n\t\t\tlet fromExtension = false;\n\t\t\tconst pathEntries = this.host.sessionManager.getBranch();\n\t\t\tconst preparation = prepareCompaction(pathEntries, settings);\n\t\t\tif (!preparation) {\n\t\t\t\tthrow new Error(NOTHING_TO_COMPACT_WITHIN_KEEP_WINDOW);\n\t\t\t}\n\n\t\t\tconst extensionRunner = this.host.getExtensionRunner();\n\t\t\tif (extensionRunner.hasHandlers(\"session_before_compact\")) {\n\t\t\t\tconst extensionResult = (await extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_compact\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tbranchEntries: pathEntries,\n\t\t\t\t\tcustomInstructions: undefined,\n\t\t\t\t\treason,\n\t\t\t\t\ttiming,\n\t\t\t\t\twillRetry,\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t})) as SessionBeforeCompactResult | undefined;\n\n\t\t\t\tif (extensionResult?.cancel) {\n\t\t\t\t\tthis.host.emit({\n\t\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\t\treason,\n\t\t\t\t\t\tresult: undefined,\n\t\t\t\t\t\taborted: true,\n\t\t\t\t\t\twillRetry: false,\n\t\t\t\t\t});\n\t\t\t\t\t// A cancel produced by an abort (abortCompaction/parent abort) is not an\n\t\t\t\t\t// extension decision; only a voluntary cancel hands the risk to the extension.\n\t\t\t\t\treturn { compacted: false, shouldContinue: false, cancelled: !controller.signal.aborted };\n\t\t\t\t}\n\n\t\t\t\tif (extensionResult?.compaction) {\n\t\t\t\t\textensionCompaction = extensionResult.compaction;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet summary: string;\n\t\t\tlet firstKeptEntryId: string;\n\t\t\tlet tokensBefore: number;\n\t\t\tlet usage: Usage | undefined;\n\t\t\tlet details: unknown;\n\n\t\t\tif (extensionCompaction) {\n\t\t\t\t// Extension provided compaction content\n\t\t\t\tsummary = extensionCompaction.summary;\n\t\t\t\tfirstKeptEntryId = extensionCompaction.firstKeptEntryId;\n\t\t\t\ttokensBefore = extensionCompaction.tokensBefore;\n\t\t\t\tusage = extensionCompaction.usage;\n\t\t\t\tdetails = extensionCompaction.details;\n\t\t\t} else {\n\t\t\t\tlet requestModel = model;\n\t\t\t\tlet apiKey: string | undefined;\n\t\t\t\tlet headers: Record<string, string> | undefined;\n\t\t\t\tlet env: Record<string, string> | undefined;\n\t\t\t\tif (streamFunction === streamSimple) {\n\t\t\t\t\t({ model: requestModel, apiKey, headers, env } = await this.host.getRequiredRequestAuth(model));\n\t\t\t\t} else {\n\t\t\t\t\t({\n\t\t\t\t\t\tmodel: requestModel,\n\t\t\t\t\t\tapiKey,\n\t\t\t\t\t\theaders,\n\t\t\t\t\t\tenv,\n\t\t\t\t\t} = await this.host.getSummarizationRequestAuth(model, streamFunction));\n\t\t\t\t}\n\t\t\t\tif (controller.signal.aborted) {\n\t\t\t\t\tthis.host.emit({\n\t\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\t\treason,\n\t\t\t\t\t\tresult: undefined,\n\t\t\t\t\t\taborted: true,\n\t\t\t\t\t\twillRetry: false,\n\t\t\t\t\t});\n\t\t\t\t\treturn { compacted: false, shouldContinue: false };\n\t\t\t\t}\n\n\t\t\t\t// Generate compaction result\n\t\t\t\tconst compactResult = await compact(\n\t\t\t\t\tpreparation,\n\t\t\t\t\trequestModel,\n\t\t\t\t\tapiKey,\n\t\t\t\t\theaders,\n\t\t\t\t\tundefined,\n\t\t\t\t\tcontroller.signal,\n\t\t\t\t\tthinkingLevel,\n\t\t\t\t\tstreamFunction,\n\t\t\t\t\tenv,\n\t\t\t\t\tretrySettings,\n\t\t\t\t\tthis.host.summarizationRetryCallbacks({ source: \"compaction\", reason }),\n\t\t\t\t);\n\t\t\t\tsummary = compactResult.summary;\n\t\t\t\tfirstKeptEntryId = compactResult.firstKeptEntryId;\n\t\t\t\ttokensBefore = compactResult.tokensBefore;\n\t\t\t\tusage = compactResult.usage;\n\t\t\t\tdetails = compactResult.details;\n\t\t\t}\n\n\t\t\tif (controller.signal.aborted) {\n\t\t\t\tthis.host.emit({\n\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\treason,\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted: true,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t});\n\t\t\t\treturn { compacted: false, shouldContinue: false };\n\t\t\t}\n\n\t\t\tthis.host.sessionManager.appendCompaction(\n\t\t\t\tsummary,\n\t\t\t\tfirstKeptEntryId,\n\t\t\t\ttokensBefore,\n\t\t\t\tdetails,\n\t\t\t\tfromExtension,\n\t\t\t\tusage,\n\t\t\t);\n\t\t\tconst newEntries = this.host.sessionManager.getEntries();\n\t\t\tconst sessionContext = this.host.sessionManager.buildSessionContext();\n\t\t\tthis.host.agent.state.messages = sessionContext.messages;\n\t\t\tif (willRetry) {\n\t\t\t\tconst messages = this.host.agent.state.messages;\n\t\t\t\tconst lastMsg = messages[messages.length - 1];\n\t\t\t\t// The overflow response was persisted on message_end before checkCompaction() removed it\n\t\t\t\t// from agent state. Rebuilding state from the new compaction can restore that kept entry,\n\t\t\t\t// leaving an assistant as the final message. agent.continue() rejects that state, so remove\n\t\t\t\t// the retriable error or truncated-length response again before continuing the interrupted turn.\n\t\t\t\tif (\n\t\t\t\t\tlastMsg?.role === \"assistant\" &&\n\t\t\t\t\t((lastMsg as AssistantMessage).stopReason === \"error\" ||\n\t\t\t\t\t\t(lastMsg as AssistantMessage).stopReason === \"length\")\n\t\t\t\t) {\n\t\t\t\t\tthis.host.agent.state.messages = messages.slice(0, -1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst estimatedTokensAfter = this.estimateContextTokens(this.host.agent.state.messages);\n\t\t\tconst contextStillOverThreshold = shouldCompact(estimatedTokensAfter, model.contextWindow, settings);\n\t\t\tconst effectiveWillRetry = willRetry && !contextStillOverThreshold;\n\n\t\t\t// Get the saved compaction entry for the extension event\n\t\t\tconst savedCompactionEntry = newEntries.find((e) => e.type === \"compaction\" && e.summary === summary) as\n\t\t\t\t| CompactionEntry\n\t\t\t\t| undefined;\n\n\t\t\tif (savedCompactionEntry) {\n\t\t\t\tawait extensionRunner.emit({\n\t\t\t\t\ttype: \"session_compact\",\n\t\t\t\t\tcompactionEntry: savedCompactionEntry,\n\t\t\t\t\tfromExtension,\n\t\t\t\t\treason,\n\t\t\t\t\twillRetry: effectiveWillRetry,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result: CompactionResult = {\n\t\t\t\tsummary,\n\t\t\t\tfirstKeptEntryId,\n\t\t\t\ttokensBefore,\n\t\t\t\testimatedTokensAfter,\n\t\t\t\tusage,\n\t\t\t\tdetails,\n\t\t\t};\n\t\t\tthis.host.emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason,\n\t\t\t\tresult,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: effectiveWillRetry,\n\t\t\t\t...(contextStillOverThreshold ? { errorMessage: CONTEXT_REMAINS_OVER_COMPACTION_THRESHOLD } : {}),\n\t\t\t});\n\t\t\tif (contextStillOverThreshold) {\n\t\t\t\treturn { compacted: true, shouldContinue: false, mustStop: true };\n\t\t\t}\n\n\t\t\tif (effectiveWillRetry) {\n\t\t\t\treturn { compacted: true, shouldContinue: true };\n\t\t\t}\n\n\t\t\t// Auto-compaction can complete while follow-up/steering/custom messages are waiting.\n\t\t\t// Continue once so queued messages are delivered.\n\t\t\treturn { compacted: true, shouldContinue: this.host.agent.hasQueuedMessages() };\n\t\t} catch (error) {\n\t\t\tconst aborted = controller?.signal.aborted || (error instanceof Error && error.name === \"AbortError\");\n\t\t\tconst errorMessage = error instanceof Error ? error.message : \"compaction failed\";\n\t\t\tif (started) {\n\t\t\t\tthis.host.emit({\n\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\treason,\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\t...(aborted\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\t\t\treason === \"overflow\"\n\t\t\t\t\t\t\t\t\t\t? `Context overflow recovery failed: ${errorMessage}`\n\t\t\t\t\t\t\t\t\t\t: `Auto-compaction failed: ${errorMessage}`,\n\t\t\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn { compacted: false, shouldContinue: false };\n\t\t} finally {\n\t\t\tremoveParentAbortListener?.();\n\t\t\tif (this._abortController === controller) {\n\t\t\t\tthis._abortController = undefined;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"compaction-controller.js","sourceRoot":"","sources":["../../src/core/compaction-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Agent, AgentMessage, PrepareNextTurnContext, ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { AssistantMessage, Model, Usage } from \"@earendil-works/pi-ai/compat\";\nimport {\n\tisContextOverflow,\n\tisRecoverableLength,\n\ttype RetryCallbacks,\n\tstreamSimple,\n} from \"@earendil-works/pi-ai/compat\";\nimport type { AgentSessionEvent } from \"./agent-session.ts\";\nimport {\n\ttype CompactionResult,\n\tcalculateContextTokens,\n\tcompact,\n\testimateContextTokens,\n\testimateTokens,\n\tprepareCompaction,\n\tshouldCompact,\n} from \"./compaction/index.ts\";\nimport type {\n\tCompactionTiming,\n\tExtensionRunner,\n\tSessionBeforeCompactResult,\n\tSessionCompactFailedEvent,\n} from \"./extensions/index.ts\";\nimport type { CompactionEntry, SessionManager } from \"./session-manager.ts\";\nimport { getLatestCompactionEntry } from \"./session-manager.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\n\nexport const CONTEXT_REMAINS_OVER_COMPACTION_THRESHOLD =\n\t\"Estimated retained context remains above the configured auto-compaction threshold. Reduce compaction.keepRecentTokens, remove large retained content, or switch to a model with a larger context window before continuing.\";\nexport const NOTHING_TO_COMPACT_WITHIN_KEEP_WINDOW =\n\t\"Nothing to compact while preserving the configured recent context. Reduce compaction.keepRecentTokens, remove large retained content, or switch to a model with a larger context window before continuing.\";\nexport const AUTO_COMPACTION_STOPPED_BEFORE_NEXT_PROVIDER =\n\t\"Stopped before the next provider request because auto-compaction did not produce a safe context. Review the compaction warning before continuing.\";\n\ninterface AutoCompactionOutcome {\n\tcompacted: boolean;\n\tshouldContinue: boolean;\n\t/** Compaction persisted, but the rebuilt context is still unsafe to send. */\n\tmustStop?: boolean;\n\t/** An extension declined this compaction via session_before_compact. */\n\tcancelled?: boolean;\n}\n\nexport interface MidTurnCompactionOutcome {\n\tmessages?: AgentMessage[];\n\tstopErrorMessage?: string;\n}\n\nexport function estimateMessagesTokens(messages: AgentMessage[]): number {\n\tlet tokens = 0;\n\tfor (const message of messages) {\n\t\ttokens += estimateTokens(message);\n\t}\n\treturn tokens;\n}\n\ninterface SummarizationRequestAuth {\n\tmodel: Model<any>;\n\tapiKey?: string;\n\theaders?: Record<string, string>;\n\tenv?: Record<string, string>;\n}\n\n/**\n * The slice of AgentSession that auto-compaction needs. Every member forwards\n * to existing session state; the host does not grant new capabilities.\n */\nexport interface CompactionHost {\n\treadonly agent: Agent;\n\treadonly sessionManager: SessionManager;\n\treadonly settingsManager: SettingsManager;\n\tgetModel(): Model<any> | undefined;\n\tgetThinkingLevel(): ThinkingLevel;\n\tgetExtensionRunner(): ExtensionRunner;\n\t/** Whether a manual /compact run currently owns the compaction lifecycle. */\n\tisManualCompactionActive(): boolean;\n\temit(event: AgentSessionEvent): void;\n\temitSessionCompactFailed(event: Omit<SessionCompactFailedEvent, \"type\">): Promise<void>;\n\tgetRequiredRequestAuth(model: Model<any>): Promise<SummarizationRequestAuth>;\n\tgetSummarizationRequestAuth(\n\t\tmodel: Model<any>,\n\t\tstreamFunction: Agent[\"streamFunction\"],\n\t): Promise<SummarizationRequestAuth>;\n\tsummarizationRetryCallbacks(source: {\n\t\tsource: \"compaction\";\n\t\treason: \"manual\" | \"threshold\" | \"overflow\";\n\t}): RetryCallbacks;\n}\n\n/**\n * Owns automatic compaction: threshold checks after tool batches (mid-turn),\n * after a run, and before a prompt; overflow compact-and-retry recovery; and\n * the fail-closed stop when compaction cannot produce a safe context.\n * Manual /compact stays in AgentSession.\n */\nexport class CompactionController {\n\tprivate readonly host: CompactionHost;\n\tprivate _abortController: AbortController | undefined = undefined;\n\tprivate _stopAfterTurnRequested = false;\n\t/** An extension cancelled a mid-turn compaction; skip further mid-turn checks this run. */\n\tprivate _midTurnDeclined = false;\n\tprivate _overflowRecoveryAttempted = false;\n\n\tconstructor(host: CompactionHost) {\n\t\tthis.host = host;\n\t}\n\n\t/** Clear per-run state when a new agent run starts. */\n\tnoteRunStart(): void {\n\t\tthis._stopAfterTurnRequested = false;\n\t\tthis._midTurnDeclined = false;\n\t}\n\n\t/** Read and clear the pending stop request. */\n\tconsumeStopAfterTurn(): boolean {\n\t\tconst requested = this._stopAfterTurnRequested;\n\t\tthis._stopAfterTurnRequested = false;\n\t\treturn requested;\n\t}\n\n\t/** Stop the run at the next lifecycle boundary instead of sending an unsafe context. */\n\trequestStopAfterTurn(): void {\n\t\tthis._stopAfterTurnRequested = true;\n\t}\n\n\t/** A user message or a healthy assistant response resets overflow recovery. */\n\tresetOverflowRecovery(): void {\n\t\tthis._overflowRecoveryAttempted = false;\n\t}\n\n\tget isAutoCompacting(): boolean {\n\t\treturn this._abortController !== undefined;\n\t}\n\n\tabort(): void {\n\t\tthis._abortController?.abort();\n\t}\n\n\testimateContextTokens(messages: AgentMessage[]): number {\n\t\tconst estimate = estimateContextTokens(messages);\n\t\tconst compactionEntry = getLatestCompactionEntry(this.host.sessionManager.getBranch());\n\t\tif (compactionEntry && estimate.lastUsageIndex !== null) {\n\t\t\tconst usageMessage = messages[estimate.lastUsageIndex];\n\t\t\tif (\n\t\t\t\tusageMessage?.role === \"assistant\" &&\n\t\t\t\tusageMessage.timestamp <= new Date(compactionEntry.timestamp).getTime()\n\t\t\t) {\n\t\t\t\t// A retained pre-compaction usage describes the old, larger context. Fall back\n\t\t\t\t// to message estimates rather than immediately compacting again from stale data.\n\t\t\t\treturn estimateMessagesTokens(messages);\n\t\t\t}\n\t\t}\n\t\treturn estimate.tokens;\n\t}\n\n\tasync maybeCompactBeforeNextToolTurn(\n\t\tturn: PrepareNextTurnContext,\n\t\tsignal?: AbortSignal,\n\t): Promise<MidTurnCompactionOutcome> {\n\t\tif (signal?.aborted) {\n\t\t\treturn { stopErrorMessage: AUTO_COMPACTION_STOPPED_BEFORE_NEXT_PROVIDER };\n\t\t}\n\t\t// Tool batches always continue the run; a turn without tool results only\n\t\t// continues when steering/follow-up messages are queued, otherwise the\n\t\t// post-run path covers it.\n\t\tif (turn.toolResults.length === 0 && !this.host.agent.hasQueuedMessages()) {\n\t\t\treturn {};\n\t\t}\n\t\tif (this._midTurnDeclined) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst settings = this.host.settingsManager.getCompactionSettings();\n\t\tif (!settings.enabled) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst contextTokens = this.estimateContextTokens(turn.context.messages);\n\t\tconst contextWindow = this.host.getModel()?.contextWindow ?? 0;\n\t\tif (!shouldCompact(contextTokens, contextWindow, settings)) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst outcome = await this._runAutoCompactionWithOutcome(\"threshold\", false, \"midTurn\", signal);\n\t\tif (!outcome.compacted) {\n\t\t\tif (outcome.cancelled && signal?.aborted !== true) {\n\t\t\t\t// The extension took ownership of the risk; don't re-ask on every batch.\n\t\t\t\tthis._midTurnDeclined = true;\n\t\t\t\treturn {};\n\t\t\t}\n\t\t\treturn { stopErrorMessage: AUTO_COMPACTION_STOPPED_BEFORE_NEXT_PROVIDER };\n\t\t}\n\n\t\treturn {\n\t\t\tmessages: this.host.agent.state.messages.slice(),\n\t\t\t...(signal?.aborted === true\n\t\t\t\t? { stopErrorMessage: AUTO_COMPACTION_STOPPED_BEFORE_NEXT_PROVIDER }\n\t\t\t\t: outcome.mustStop === true\n\t\t\t\t\t? { stopErrorMessage: CONTEXT_REMAINS_OVER_COMPACTION_THRESHOLD }\n\t\t\t\t\t: {}),\n\t\t};\n\t}\n\n\t/**\n\t * Check if compaction is needed and run it.\n\t * Called after agent_end and before prompt submission.\n\t *\n\t * Two cases:\n\t * 1. Recoverable failure: LLM returned context overflow or stopped below its desired output limit;\n\t * remove the assistant message, compact, and auto-retry once\n\t * 2. Threshold: Context over threshold, compact, NO auto-retry (user continues manually)\n\t *\n\t * @param assistantMessage The assistant message to check\n\t * @param skipAbortedCheck If false, include aborted messages (for pre-prompt check). Default: true\n\t */\n\tasync checkCompaction(\n\t\tassistantMessage: AssistantMessage,\n\t\tskipAbortedCheck = true,\n\t\ttiming: CompactionTiming = \"postRun\",\n\t): Promise<boolean> {\n\t\tconst settings = this.host.settingsManager.getCompactionSettings();\n\t\tif (!settings.enabled) return false;\n\n\t\t// Skip if message was aborted (user cancelled) - unless skipAbortedCheck is false\n\t\tif (skipAbortedCheck && assistantMessage.stopReason === \"aborted\") return false;\n\n\t\tconst model = this.host.getModel();\n\t\tconst contextWindow = model?.contextWindow ?? 0;\n\n\t\t// Skip overflow check if the message came from a different model.\n\t\t// This handles the case where user switched from a smaller-context model (e.g. opus)\n\t\t// to a larger-context model (e.g. codex) - the overflow error from the old model\n\t\t// shouldn't trigger compaction for the new model.\n\t\tconst sameModel = model && assistantMessage.provider === model.provider && assistantMessage.model === model.id;\n\n\t\t// Skip compaction checks if this assistant message is older than the latest\n\t\t// compaction boundary. This prevents a stale pre-compaction usage/error\n\t\t// from retriggering compaction on the first prompt after compaction.\n\t\tconst compactionEntry = getLatestCompactionEntry(this.host.sessionManager.getBranch());\n\t\tconst assistantIsFromBeforeCompaction =\n\t\t\tcompactionEntry !== null && assistantMessage.timestamp <= new Date(compactionEntry.timestamp).getTime();\n\t\tif (assistantIsFromBeforeCompaction) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Case 1: Recoverable failure. Explicit/silent context overflow still uses context metadata.\n\t\t// A length stop is recoverable when output ended below the model's original desired limit,\n\t\t// independent of the configured context size or any context-clamped provider request limit.\n\t\t// A successful response over the configured window should compact but must not retry: the\n\t\t// assistant answer already completed and agent.continue() cannot continue from an assistant.\n\t\tconst contextOverflow = sameModel && isContextOverflow(assistantMessage, contextWindow);\n\t\tconst recoverableLength = sameModel && isRecoverableLength(assistantMessage, model?.maxTokens ?? 0);\n\t\tif (contextOverflow || recoverableLength) {\n\t\t\tconst willRetry = assistantMessage.stopReason !== \"stop\";\n\n\t\t\tif (!willRetry) {\n\t\t\t\treturn await this._runAutoCompaction(\"overflow\", false, timing);\n\t\t\t}\n\n\t\t\tif (this._overflowRecoveryAttempted) {\n\t\t\t\tthis._stopAfterTurnRequested = true;\n\t\t\t\tconst errorMessage = contextOverflow\n\t\t\t\t\t? \"Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.\"\n\t\t\t\t\t: \"Truncated response recovery failed after one compact-and-retry attempt.\";\n\t\t\t\tthis.host.emit({\n\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\treason: \"overflow\",\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted: false,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\terrorMessage,\n\t\t\t\t});\n\t\t\t\tawait this.host.emitSessionCompactFailed({\n\t\t\t\t\treason: \"overflow\",\n\t\t\t\t\terrorMessage,\n\t\t\t\t\taborted: false,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\tfromExtension: false,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis._overflowRecoveryAttempted = true;\n\t\t\t// Remove the failed or truncated message from agent state. It remains in session history,\n\t\t\t// but must not be included in the compact-and-retry context.\n\t\t\tconst messages = this.host.agent.state.messages;\n\t\t\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\t\t\tthis.host.agent.state.messages = messages.slice(0, -1);\n\t\t\t}\n\t\t\treturn await this._runAutoCompaction(\"overflow\", willRetry, timing);\n\t\t}\n\n\t\t// Case 2: Threshold - context is getting large\n\t\t// For error messages or all-zero usage messages, estimate from the last valid response.\n\t\t// This ensures sessions that hit persistent API errors (e.g. 529) or malformed zero-usage\n\t\t// responses can still compact and do not reset context accounting.\n\t\tlet contextTokens: number;\n\t\tconst directContextTokens = assistantMessage.usage ? calculateContextTokens(assistantMessage.usage) : 0;\n\t\tif (assistantMessage.stopReason === \"error\" || directContextTokens === 0) {\n\t\t\tconst messages = this.host.agent.state.messages;\n\t\t\tconst estimate = estimateContextTokens(messages);\n\t\t\t// Without provider usage, estimate.tokens is the pure message-size estimate.\n\t\t\t// Only usage-backed estimates need the stale pre-compaction check.\n\t\t\tif (estimate.lastUsageIndex !== null) {\n\t\t\t\t// Verify the usage source is post-compaction. Kept pre-compaction messages\n\t\t\t\t// have stale usage reflecting the old (larger) context and would falsely\n\t\t\t\t// trigger compaction right after one just finished.\n\t\t\t\tconst usageMsg = messages[estimate.lastUsageIndex];\n\t\t\t\tif (\n\t\t\t\t\tcompactionEntry &&\n\t\t\t\t\tusageMsg.role === \"assistant\" &&\n\t\t\t\t\t(usageMsg as AssistantMessage).timestamp <= new Date(compactionEntry.timestamp).getTime()\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontextTokens = estimate.tokens;\n\t\t} else {\n\t\t\tcontextTokens = directContextTokens;\n\t\t}\n\t\tif (shouldCompact(contextTokens, contextWindow, settings)) {\n\t\t\treturn await this._runAutoCompaction(\"threshold\", false, timing);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Internal: Run auto-compaction with events.\n\t */\n\tprivate async _runAutoCompaction(\n\t\treason: \"overflow\" | \"threshold\",\n\t\twillRetry: boolean,\n\t\ttiming: CompactionTiming = \"postRun\",\n\t): Promise<boolean> {\n\t\tconst outcome = await this._runAutoCompactionWithOutcome(reason, willRetry, timing);\n\t\tif (!outcome.compacted || outcome.mustStop) {\n\t\t\tthis._stopAfterTurnRequested = true;\n\t\t}\n\t\treturn outcome.shouldContinue;\n\t}\n\n\tprivate async _runAutoCompactionWithOutcome(\n\t\treason: \"overflow\" | \"threshold\",\n\t\twillRetry: boolean,\n\t\ttiming: CompactionTiming,\n\t\tparentSignal?: AbortSignal,\n\t): Promise<AutoCompactionOutcome> {\n\t\tconst settings = this.host.settingsManager.getCompactionSettings();\n\t\tlet started = false;\n\t\tlet fromExtension = false;\n\t\tlet controller: AbortController | undefined;\n\t\tlet removeParentAbortListener: (() => void) | undefined;\n\n\t\ttry {\n\t\t\tconst model = this.host.getModel();\n\t\t\tif (!model || this._abortController || this.host.isManualCompactionActive() || parentSignal?.aborted) {\n\t\t\t\treturn { compacted: false, shouldContinue: false };\n\t\t\t}\n\t\t\tconst streamFunction = this.host.agent.streamFunction;\n\t\t\tconst thinkingLevel = this.host.getThinkingLevel();\n\t\t\tconst retrySettings = this.host.settingsManager.getRetrySettings();\n\n\t\t\tcontroller = new AbortController();\n\t\t\tif (parentSignal) {\n\t\t\t\tconst abortFromParent = () => controller?.abort();\n\t\t\t\tparentSignal.addEventListener(\"abort\", abortFromParent, { once: true });\n\t\t\t\tremoveParentAbortListener = () => parentSignal.removeEventListener(\"abort\", abortFromParent);\n\t\t\t}\n\t\t\tif (controller.signal.aborted) {\n\t\t\t\treturn { compacted: false, shouldContinue: false };\n\t\t\t}\n\t\t\tthis._abortController = controller;\n\t\t\tstarted = true;\n\t\t\tthis.host.emit({ type: \"compaction_start\", reason });\n\t\t\tif (controller.signal.aborted) {\n\t\t\t\tthis.host.emit({\n\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\treason,\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted: true,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t});\n\t\t\t\tawait this.host.emitSessionCompactFailed({\n\t\t\t\t\treason,\n\t\t\t\t\taborted: true,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\tfromExtension: false,\n\t\t\t\t});\n\t\t\t\treturn { compacted: false, shouldContinue: false };\n\t\t\t}\n\n\t\t\tlet extensionCompaction: CompactionResult | undefined;\n\t\t\tconst pathEntries = this.host.sessionManager.getBranch();\n\t\t\tconst preparation = prepareCompaction(pathEntries, settings);\n\t\t\tif (!preparation) {\n\t\t\t\tthrow new Error(NOTHING_TO_COMPACT_WITHIN_KEEP_WINDOW);\n\t\t\t}\n\n\t\t\tconst extensionRunner = this.host.getExtensionRunner();\n\t\t\tif (extensionRunner.hasHandlers(\"session_before_compact\")) {\n\t\t\t\tconst extensionResult = (await extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_compact\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tbranchEntries: pathEntries,\n\t\t\t\t\tcustomInstructions: undefined,\n\t\t\t\t\treason,\n\t\t\t\t\ttiming,\n\t\t\t\t\twillRetry,\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t})) as SessionBeforeCompactResult | undefined;\n\n\t\t\t\tif (extensionResult?.cancel) {\n\t\t\t\t\tthis.host.emit({\n\t\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\t\treason,\n\t\t\t\t\t\tresult: undefined,\n\t\t\t\t\t\taborted: true,\n\t\t\t\t\t\twillRetry: false,\n\t\t\t\t\t});\n\t\t\t\t\tawait this.host.emitSessionCompactFailed({\n\t\t\t\t\t\treason,\n\t\t\t\t\t\taborted: true,\n\t\t\t\t\t\twillRetry: false,\n\t\t\t\t\t\tfromExtension: false,\n\t\t\t\t\t});\n\t\t\t\t\t// A cancel produced by an abort (abortCompaction/parent abort) is not an\n\t\t\t\t\t// extension decision; only a voluntary cancel hands the risk to the extension.\n\t\t\t\t\treturn { compacted: false, shouldContinue: false, cancelled: !controller.signal.aborted };\n\t\t\t\t}\n\n\t\t\t\tif (extensionResult?.compaction) {\n\t\t\t\t\textensionCompaction = extensionResult.compaction;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet summary: string;\n\t\t\tlet firstKeptEntryId: string;\n\t\t\tlet tokensBefore: number;\n\t\t\tlet usage: Usage | undefined;\n\t\t\tlet details: unknown;\n\n\t\t\tif (extensionCompaction) {\n\t\t\t\t// Extension provided compaction content\n\t\t\t\tsummary = extensionCompaction.summary;\n\t\t\t\tfirstKeptEntryId = extensionCompaction.firstKeptEntryId;\n\t\t\t\ttokensBefore = extensionCompaction.tokensBefore;\n\t\t\t\tusage = extensionCompaction.usage;\n\t\t\t\tdetails = extensionCompaction.details;\n\t\t\t} else {\n\t\t\t\tlet requestModel = model;\n\t\t\t\tlet apiKey: string | undefined;\n\t\t\t\tlet headers: Record<string, string> | undefined;\n\t\t\t\tlet env: Record<string, string> | undefined;\n\t\t\t\tif (streamFunction === streamSimple) {\n\t\t\t\t\t({ model: requestModel, apiKey, headers, env } = await this.host.getRequiredRequestAuth(model));\n\t\t\t\t} else {\n\t\t\t\t\t({\n\t\t\t\t\t\tmodel: requestModel,\n\t\t\t\t\t\tapiKey,\n\t\t\t\t\t\theaders,\n\t\t\t\t\t\tenv,\n\t\t\t\t\t} = await this.host.getSummarizationRequestAuth(model, streamFunction));\n\t\t\t\t}\n\t\t\t\tif (controller.signal.aborted) {\n\t\t\t\t\tthis.host.emit({\n\t\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\t\treason,\n\t\t\t\t\t\tresult: undefined,\n\t\t\t\t\t\taborted: true,\n\t\t\t\t\t\twillRetry: false,\n\t\t\t\t\t});\n\t\t\t\t\tawait this.host.emitSessionCompactFailed({\n\t\t\t\t\t\treason,\n\t\t\t\t\t\taborted: true,\n\t\t\t\t\t\twillRetry: false,\n\t\t\t\t\t\tfromExtension: false,\n\t\t\t\t\t});\n\t\t\t\t\treturn { compacted: false, shouldContinue: false };\n\t\t\t\t}\n\n\t\t\t\t// Generate compaction result\n\t\t\t\tconst compactResult = await compact(\n\t\t\t\t\tpreparation,\n\t\t\t\t\trequestModel,\n\t\t\t\t\tapiKey,\n\t\t\t\t\theaders,\n\t\t\t\t\tundefined,\n\t\t\t\t\tcontroller.signal,\n\t\t\t\t\tthinkingLevel,\n\t\t\t\t\tstreamFunction,\n\t\t\t\t\tenv,\n\t\t\t\t\tretrySettings,\n\t\t\t\t\tthis.host.summarizationRetryCallbacks({ source: \"compaction\", reason }),\n\t\t\t\t);\n\t\t\t\tsummary = compactResult.summary;\n\t\t\t\tfirstKeptEntryId = compactResult.firstKeptEntryId;\n\t\t\t\ttokensBefore = compactResult.tokensBefore;\n\t\t\t\tusage = compactResult.usage;\n\t\t\t\tdetails = compactResult.details;\n\t\t\t}\n\n\t\t\tif (controller.signal.aborted) {\n\t\t\t\tthis.host.emit({\n\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\treason,\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted: true,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t});\n\t\t\t\tawait this.host.emitSessionCompactFailed({\n\t\t\t\t\treason,\n\t\t\t\t\taborted: true,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\tfromExtension,\n\t\t\t\t});\n\t\t\t\treturn { compacted: false, shouldContinue: false };\n\t\t\t}\n\n\t\t\tthis.host.sessionManager.appendCompaction(\n\t\t\t\tsummary,\n\t\t\t\tfirstKeptEntryId,\n\t\t\t\ttokensBefore,\n\t\t\t\tdetails,\n\t\t\t\tfromExtension,\n\t\t\t\tusage,\n\t\t\t);\n\t\t\tconst newEntries = this.host.sessionManager.getEntries();\n\t\t\tconst sessionContext = this.host.sessionManager.buildSessionContext();\n\t\t\tthis.host.agent.state.messages = sessionContext.messages;\n\t\t\tif (willRetry) {\n\t\t\t\tconst messages = this.host.agent.state.messages;\n\t\t\t\tconst lastMsg = messages[messages.length - 1];\n\t\t\t\t// The overflow response was persisted on message_end before checkCompaction() removed it\n\t\t\t\t// from agent state. Rebuilding state from the new compaction can restore that kept entry,\n\t\t\t\t// leaving an assistant as the final message. agent.continue() rejects that state, so remove\n\t\t\t\t// the retriable error or truncated-length response again before continuing the interrupted turn.\n\t\t\t\tif (\n\t\t\t\t\tlastMsg?.role === \"assistant\" &&\n\t\t\t\t\t((lastMsg as AssistantMessage).stopReason === \"error\" ||\n\t\t\t\t\t\t(lastMsg as AssistantMessage).stopReason === \"length\")\n\t\t\t\t) {\n\t\t\t\t\tthis.host.agent.state.messages = messages.slice(0, -1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst estimatedTokensAfter = this.estimateContextTokens(this.host.agent.state.messages);\n\t\t\tconst contextStillOverThreshold = shouldCompact(estimatedTokensAfter, model.contextWindow, settings);\n\t\t\tconst effectiveWillRetry = willRetry && !contextStillOverThreshold;\n\n\t\t\t// Get the saved compaction entry for the extension event\n\t\t\tconst savedCompactionEntry = newEntries.find((e) => e.type === \"compaction\" && e.summary === summary) as\n\t\t\t\t| CompactionEntry\n\t\t\t\t| undefined;\n\n\t\t\tif (savedCompactionEntry) {\n\t\t\t\tawait extensionRunner.emit({\n\t\t\t\t\ttype: \"session_compact\",\n\t\t\t\t\tcompactionEntry: savedCompactionEntry,\n\t\t\t\t\tfromExtension,\n\t\t\t\t\treason,\n\t\t\t\t\twillRetry: effectiveWillRetry,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result: CompactionResult = {\n\t\t\t\tsummary,\n\t\t\t\tfirstKeptEntryId,\n\t\t\t\ttokensBefore,\n\t\t\t\testimatedTokensAfter,\n\t\t\t\tusage,\n\t\t\t\tdetails,\n\t\t\t};\n\t\t\tthis.host.emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason,\n\t\t\t\tresult,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: effectiveWillRetry,\n\t\t\t\t...(contextStillOverThreshold ? { errorMessage: CONTEXT_REMAINS_OVER_COMPACTION_THRESHOLD } : {}),\n\t\t\t});\n\t\t\tif (contextStillOverThreshold) {\n\t\t\t\treturn { compacted: true, shouldContinue: false, mustStop: true };\n\t\t\t}\n\n\t\t\tif (effectiveWillRetry) {\n\t\t\t\treturn { compacted: true, shouldContinue: true };\n\t\t\t}\n\n\t\t\t// Auto-compaction can complete while follow-up/steering/custom messages are waiting.\n\t\t\t// Continue once so queued messages are delivered.\n\t\t\treturn { compacted: true, shouldContinue: this.host.agent.hasQueuedMessages() };\n\t\t} catch (error) {\n\t\t\tconst aborted = controller?.signal.aborted || (error instanceof Error && error.name === \"AbortError\");\n\t\t\tconst message = error instanceof Error ? error.message : \"compaction failed\";\n\t\t\tif (started) {\n\t\t\t\tconst errorMessage = aborted\n\t\t\t\t\t? undefined\n\t\t\t\t\t: reason === \"overflow\"\n\t\t\t\t\t\t? `Context overflow recovery failed: ${message}`\n\t\t\t\t\t\t: `Auto-compaction failed: ${message}`;\n\t\t\t\tthis.host.emit({\n\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\treason,\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\t...(errorMessage ? { errorMessage } : {}),\n\t\t\t\t});\n\t\t\t\tawait this.host.emitSessionCompactFailed({\n\t\t\t\t\treason,\n\t\t\t\t\terrorMessage,\n\t\t\t\t\taborted,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\tfromExtension,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn { compacted: false, shouldContinue: false };\n\t\t} finally {\n\t\t\tremoveParentAbortListener?.();\n\t\t\tif (this._abortController === controller) {\n\t\t\t\tthis._abortController = undefined;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
@@ -1,3 +1,4 @@
1
1
  import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
2
2
  export declare const DEFAULT_THINKING_LEVEL: ThinkingLevel;
3
+ export declare const THINKING_LEVEL_OPTIONS: readonly ThinkingLevel[];
3
4
  //# sourceMappingURL=defaults.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/core/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,eAAO,MAAM,sBAAsB,EAAE,aAAwB,CAAC"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/core/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,eAAO,MAAM,sBAAsB,EAAE,aAAwB,CAAC;AAC9D,eAAO,MAAM,sBAAsB,EAAE,SAAS,aAAa,EAQ1D,CAAC"}
@@ -1,2 +1,11 @@
1
1
  export const DEFAULT_THINKING_LEVEL = "medium";
2
+ export const THINKING_LEVEL_OPTIONS = [
3
+ "off",
4
+ "minimal",
5
+ "low",
6
+ "medium",
7
+ "high",
8
+ "xhigh",
9
+ "max",
10
+ ];
2
11
  //# sourceMappingURL=defaults.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/core/defaults.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAkB,QAAQ,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\n\nexport const DEFAULT_THINKING_LEVEL: ThinkingLevel = \"medium\";\n"]}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/core/defaults.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAkB,QAAQ,CAAC;AAC9D,MAAM,CAAC,MAAM,sBAAsB,GAA6B;IAC/D,KAAK;IACL,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;IACP,KAAK;CACL,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\n\nexport const DEFAULT_THINKING_LEVEL: ThinkingLevel = \"medium\";\nexport const THINKING_LEVEL_OPTIONS: readonly ThinkingLevel[] = [\n\t\"off\",\n\t\"minimal\",\n\t\"low\",\n\t\"medium\",\n\t\"high\",\n\t\"xhigh\",\n\t\"max\",\n];\n"]}
@@ -6,7 +6,7 @@ export type { SourceInfo } from "../source-info.ts";
6
6
  export { createExtensionRuntime, discoverAndLoadExtensions, loadExtensionFromFactory, loadExtensions, } from "./loader.ts";
7
7
  export type { ExtensionErrorListener, ForkHandler, NavigateTreeHandler, NewSessionHandler, ShutdownHandler, SwitchSessionHandler, } from "./runner.ts";
8
8
  export { ExtensionRunner } from "./runner.ts";
9
- export type { AfterProviderResponseEvent, AgentEndEvent, AgentSettledEvent, AgentStartEvent, AgentToolResult, AgentToolUpdateCallback, AppendEntryHandler, AppKeybinding, AutocompleteProviderFactory, BashToolCallEvent, BashToolResultEvent, BeforeAgentStartEvent, BeforeAgentStartEventResult, BeforeProviderHeadersEvent, BeforeProviderRequestEvent, BeforeProviderRequestEventResult, BuildSystemPromptOptions, CompactionTiming, CompactOptions, ContextEvent, ContextEventResult, ContextUsage, CustomToolCallEvent, CustomToolResultEvent, EditorFactory, EditToolCallEvent, EditToolResultEvent, EntryRenderer, EntryRenderOptions, ExecOptions, ExecResult, Extension, ExtensionActions, ExtensionAPI, ExtensionCommandContext, ExtensionCommandContextActions, ExtensionContext, ExtensionContextActions, ExtensionError, ExtensionEvent, ExtensionFactory, ExtensionFlag, ExtensionHandler, ExtensionMode, ExtensionRuntime, ExtensionShortcut, ExtensionUIContext, ExtensionUIDialogOptions, ExtensionWidgetOptions, FindToolCallEvent, FindToolResultEvent, GetActiveToolsHandler, GetAllToolsHandler, GetCommandsHandler, GetThinkingLevelHandler, GrepToolCallEvent, GrepToolResultEvent, InlineExtension, InputEvent, InputEventResult, InputSource, KeybindingsManager, LoadExtensionsResult, LsToolCallEvent, LsToolResultEvent, MarkdownTransformContext, MarkdownTransformer, MessageEndEvent, MessageRenderer, MessageRenderOptions, MessageStartEvent, MessageUpdateEvent, ModelSelectEvent, ModelSelectSource, ProjectTrustContext, ProjectTrustEvent, ProjectTrustEventDecision, ProjectTrustEventResult, ProjectTrustHandler, ProviderConfig, ProviderModelConfig, ReadToolCallEvent, ReadToolResultEvent, RegisteredCommand, RegisteredTool, ReplacedSessionContext, ResolvedCommand, ResourcesDiscoverEvent, ResourcesDiscoverResult, SendMessageHandler, SendUserMessageHandler, SessionBeforeCompactEvent, SessionBeforeCompactResult, SessionBeforeForkEvent, SessionBeforeForkResult, SessionBeforeSwitchEvent, SessionBeforeSwitchResult, SessionBeforeTreeEvent, SessionBeforeTreeResult, SessionCompactEvent, SessionEvent, SessionInfoChangedEvent, SessionShutdownEvent, SessionStartEvent, SessionTreeEvent, SetActiveToolsHandler, SetLabelHandler, SetModelHandler, SetThinkingLevelHandler, ShellSettings, TerminalInputHandler, ToolCallEvent, ToolCallEventResult, ToolDefinition, ToolExecutionEndEvent, ToolExecutionMode, ToolExecutionStartEvent, ToolExecutionUpdateEvent, ToolInfo, ToolRenderResultOptions, ToolResultEvent, ToolResultEventResult, TreePreparation, TurnEndEvent, TurnStartEvent, UserBashEvent, UserBashEventResult, WidgetPlacement, WorkingIndicatorOptions, WriteToolCallEvent, WriteToolResultEvent, } from "./types.ts";
10
- export { defineTool, isBashToolResult, isEditToolResult, isFindToolResult, isGrepToolResult, isLsToolResult, isReadToolResult, isStaleExtensionContextError, isToolCallEventType, isWriteToolResult, STALE_EXTENSION_CONTEXT_MESSAGE, } from "./types.ts";
9
+ export type { AfterProviderResponseEvent, AgentEndEvent, AgentSettledEvent, AgentStartEvent, AgentToolResult, AgentToolUpdateCallback, AppendEntryHandler, AppKeybinding, AutocompleteProviderFactory, BashToolCallEvent, BashToolResultEvent, BeforeAgentStartEvent, BeforeAgentStartEventResult, BeforeProviderHeadersEvent, BeforeProviderRequestEvent, BeforeProviderRequestEventResult, BuildSystemPromptOptions, CompactionTiming, CompactOptions, ContextEvent, ContextEventResult, ContextUsage, CustomToolCallEvent, CustomToolResultEvent, EditorFactory, EditToolCallEvent, EditToolResultEvent, EntryRenderer, EntryRenderOptions, ExecOptions, ExecResult, Extension, ExtensionActions, ExtensionAPI, ExtensionCommandContext, ExtensionCommandContextActions, ExtensionContext, ExtensionContextActions, ExtensionError, ExtensionEvent, ExtensionFactory, ExtensionFlag, ExtensionHandler, ExtensionMode, ExtensionRuntime, ExtensionShortcut, ExtensionUIContext, ExtensionUIDialogOptions, ExtensionWidgetOptions, FindToolCallEvent, FindToolResultEvent, GetActiveToolsHandler, GetAllToolsHandler, GetCommandsHandler, GetThinkingLevelHandler, GrepToolCallEvent, GrepToolResultEvent, InlineExtension, InputEvent, InputEventResult, InputSource, KeybindingsManager, LoadExtensionsResult, LsToolCallEvent, LsToolResultEvent, MarkdownTransformContext, MarkdownTransformer, MessageEndEvent, MessageRenderer, MessageRenderOptions, MessageStartEvent, MessageUpdateEvent, ModelSelectEvent, ModelSelectSource, PowerShellToolCallEvent, PowerShellToolResultEvent, ProjectTrustContext, ProjectTrustEvent, ProjectTrustEventDecision, ProjectTrustEventResult, ProjectTrustHandler, ProviderConfig, ProviderModelConfig, ReadToolCallEvent, ReadToolResultEvent, RegisteredCommand, RegisteredTool, ReplacedSessionContext, ResolvedCommand, ResourcesDiscoverEvent, ResourcesDiscoverResult, SendMessageHandler, SendUserMessageHandler, SessionBeforeCompactEvent, SessionBeforeCompactResult, SessionBeforeForkEvent, SessionBeforeForkResult, SessionBeforeSwitchEvent, SessionBeforeSwitchResult, SessionBeforeTreeEvent, SessionBeforeTreeResult, SessionCompactEvent, SessionCompactFailedEvent, SessionEvent, SessionInfoChangedEvent, SessionShutdownEvent, SessionStartEvent, SessionTreeEvent, SetActiveToolsHandler, SetLabelHandler, SetModelHandler, SetThinkingLevelHandler, ShellSettings, TerminalInputHandler, ToolCallEvent, ToolCallEventResult, ToolDefinition, ToolExecutionEndEvent, ToolExecutionMode, ToolExecutionStartEvent, ToolExecutionUpdateEvent, ToolInfo, ToolRenderResultOptions, ToolResultEvent, ToolResultEventResult, TreePreparation, TurnEndEvent, TurnStartEvent, UserBashEvent, UserBashEventResult, WidgetPlacement, WorkingIndicatorOptions, WriteToolCallEvent, WriteToolResultEvent, } from "./types.ts";
10
+ export { defineTool, isBashToolResult, isEditToolResult, isFindToolResult, isGrepToolResult, isLsToolResult, isPowerShellToolResult, isReadToolResult, isStaleExtensionContextError, isToolCallEventType, isWriteToolResult, STALE_EXTENSION_CONTEXT_MESSAGE, } from "./types.ts";
11
11
  export { wrapRegisteredTool, wrapRegisteredTools } from "./wrapper.ts";
12
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/index.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,6 @@
4
4
  export { createExtensionRuntime, discoverAndLoadExtensions, loadExtensionFromFactory, loadExtensions, } from "./loader.js";
5
5
  export { ExtensionRunner } from "./runner.js";
6
6
  // Type guards
7
- export { defineTool, isBashToolResult, isEditToolResult, isFindToolResult, isGrepToolResult, isLsToolResult, isReadToolResult, isStaleExtensionContextError, isToolCallEventType, isWriteToolResult, STALE_EXTENSION_CONTEXT_MESSAGE, } from "./types.js";
7
+ export { defineTool, isBashToolResult, isEditToolResult, isFindToolResult, isGrepToolResult, isLsToolResult, isPowerShellToolResult, isReadToolResult, isStaleExtensionContextError, isToolCallEventType, isWriteToolResult, STALE_EXTENSION_CONTEXT_MESSAGE, } from "./types.js";
8
8
  export { wrapRegisteredTool, wrapRegisteredTools } from "./wrapper.js";
9
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/extensions/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EACN,sBAAsB,EACtB,yBAAyB,EACzB,wBAAwB,EACxB,cAAc,GACd,MAAM,aAAa,CAAC;AASrB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA2J9C,cAAc;AACd,OAAO,EACN,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,4BAA4B,EAC5B,mBAAmB,EACnB,iBAAiB,EACjB,+BAA+B,GAC/B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["/**\n * Extension system for lifecycle events and custom tools.\n */\n\nexport type { SlashCommandInfo, SlashCommandSource } from \"../slash-commands.ts\";\nexport type { SourceInfo } from \"../source-info.ts\";\nexport {\n\tcreateExtensionRuntime,\n\tdiscoverAndLoadExtensions,\n\tloadExtensionFromFactory,\n\tloadExtensions,\n} from \"./loader.ts\";\nexport type {\n\tExtensionErrorListener,\n\tForkHandler,\n\tNavigateTreeHandler,\n\tNewSessionHandler,\n\tShutdownHandler,\n\tSwitchSessionHandler,\n} from \"./runner.ts\";\nexport { ExtensionRunner } from \"./runner.ts\";\nexport type {\n\tAfterProviderResponseEvent,\n\tAgentEndEvent,\n\tAgentSettledEvent,\n\tAgentStartEvent,\n\t// Re-exports\n\tAgentToolResult,\n\tAgentToolUpdateCallback,\n\tAppendEntryHandler,\n\t// App keybindings (for custom editors)\n\tAppKeybinding,\n\tAutocompleteProviderFactory,\n\t// Events - Tool (ToolCallEvent types)\n\tBashToolCallEvent,\n\tBashToolResultEvent,\n\tBeforeAgentStartEvent,\n\tBeforeAgentStartEventResult,\n\tBeforeProviderHeadersEvent,\n\tBeforeProviderRequestEvent,\n\tBeforeProviderRequestEventResult,\n\tBuildSystemPromptOptions,\n\t// Context\n\tCompactionTiming,\n\tCompactOptions,\n\t// Events - Agent\n\tContextEvent,\n\t// Event Results\n\tContextEventResult,\n\tContextUsage,\n\tCustomToolCallEvent,\n\tCustomToolResultEvent,\n\tEditorFactory,\n\tEditToolCallEvent,\n\tEditToolResultEvent,\n\t// Message and Entry Rendering\n\tEntryRenderer,\n\tEntryRenderOptions,\n\tExecOptions,\n\tExecResult,\n\tExtension,\n\tExtensionActions,\n\t// API\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionCommandContextActions,\n\tExtensionContext,\n\tExtensionContextActions,\n\t// Errors\n\tExtensionError,\n\tExtensionEvent,\n\tExtensionFactory,\n\tExtensionFlag,\n\tExtensionHandler,\n\tExtensionMode,\n\t// Runtime\n\tExtensionRuntime,\n\tExtensionShortcut,\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tFindToolCallEvent,\n\tFindToolResultEvent,\n\tGetActiveToolsHandler,\n\tGetAllToolsHandler,\n\tGetCommandsHandler,\n\tGetThinkingLevelHandler,\n\tGrepToolCallEvent,\n\tGrepToolResultEvent,\n\tInlineExtension,\n\t// Events - Input\n\tInputEvent,\n\tInputEventResult,\n\tInputSource,\n\tKeybindingsManager,\n\tLoadExtensionsResult,\n\tLsToolCallEvent,\n\tLsToolResultEvent,\n\tMarkdownTransformContext,\n\tMarkdownTransformer,\n\t// Events - Message\n\tMessageEndEvent,\n\tMessageRenderer,\n\tMessageRenderOptions,\n\tMessageStartEvent,\n\tMessageUpdateEvent,\n\tModelSelectEvent,\n\tModelSelectSource,\n\tProjectTrustContext,\n\tProjectTrustEvent,\n\tProjectTrustEventDecision,\n\tProjectTrustEventResult,\n\tProjectTrustHandler,\n\t// Provider Registration\n\tProviderConfig,\n\tProviderModelConfig,\n\tReadToolCallEvent,\n\tReadToolResultEvent,\n\t// Commands\n\tRegisteredCommand,\n\tRegisteredTool,\n\tReplacedSessionContext,\n\tResolvedCommand,\n\t// Events - Resources\n\tResourcesDiscoverEvent,\n\tResourcesDiscoverResult,\n\tSendMessageHandler,\n\tSendUserMessageHandler,\n\tSessionBeforeCompactEvent,\n\tSessionBeforeCompactResult,\n\tSessionBeforeForkEvent,\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchEvent,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeEvent,\n\tSessionBeforeTreeResult,\n\tSessionCompactEvent,\n\tSessionEvent,\n\tSessionInfoChangedEvent,\n\tSessionShutdownEvent,\n\t// Events - Session\n\tSessionStartEvent,\n\tSessionTreeEvent,\n\tSetActiveToolsHandler,\n\tSetLabelHandler,\n\tSetModelHandler,\n\tSetThinkingLevelHandler,\n\tShellSettings,\n\tTerminalInputHandler,\n\t// Events - Tool\n\tToolCallEvent,\n\tToolCallEventResult,\n\t// Tools\n\tToolDefinition,\n\t// Events - Tool Execution\n\tToolExecutionEndEvent,\n\t// Tool execution mode\n\tToolExecutionMode,\n\tToolExecutionStartEvent,\n\tToolExecutionUpdateEvent,\n\tToolInfo,\n\tToolRenderResultOptions,\n\tToolResultEvent,\n\tToolResultEventResult,\n\tTreePreparation,\n\tTurnEndEvent,\n\tTurnStartEvent,\n\t// Events - User Bash\n\tUserBashEvent,\n\tUserBashEventResult,\n\tWidgetPlacement,\n\tWorkingIndicatorOptions,\n\tWriteToolCallEvent,\n\tWriteToolResultEvent,\n} from \"./types.ts\";\n// Type guards\nexport {\n\tdefineTool,\n\tisBashToolResult,\n\tisEditToolResult,\n\tisFindToolResult,\n\tisGrepToolResult,\n\tisLsToolResult,\n\tisReadToolResult,\n\tisStaleExtensionContextError,\n\tisToolCallEventType,\n\tisWriteToolResult,\n\tSTALE_EXTENSION_CONTEXT_MESSAGE,\n} from \"./types.ts\";\nexport { wrapRegisteredTool, wrapRegisteredTools } from \"./wrapper.ts\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/extensions/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EACN,sBAAsB,EACtB,yBAAyB,EACzB,wBAAwB,EACxB,cAAc,GACd,MAAM,aAAa,CAAC;AASrB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA8J9C,cAAc;AACd,OAAO,EACN,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,4BAA4B,EAC5B,mBAAmB,EACnB,iBAAiB,EACjB,+BAA+B,GAC/B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["/**\n * Extension system for lifecycle events and custom tools.\n */\n\nexport type { SlashCommandInfo, SlashCommandSource } from \"../slash-commands.ts\";\nexport type { SourceInfo } from \"../source-info.ts\";\nexport {\n\tcreateExtensionRuntime,\n\tdiscoverAndLoadExtensions,\n\tloadExtensionFromFactory,\n\tloadExtensions,\n} from \"./loader.ts\";\nexport type {\n\tExtensionErrorListener,\n\tForkHandler,\n\tNavigateTreeHandler,\n\tNewSessionHandler,\n\tShutdownHandler,\n\tSwitchSessionHandler,\n} from \"./runner.ts\";\nexport { ExtensionRunner } from \"./runner.ts\";\nexport type {\n\tAfterProviderResponseEvent,\n\tAgentEndEvent,\n\tAgentSettledEvent,\n\tAgentStartEvent,\n\t// Re-exports\n\tAgentToolResult,\n\tAgentToolUpdateCallback,\n\tAppendEntryHandler,\n\t// App keybindings (for custom editors)\n\tAppKeybinding,\n\tAutocompleteProviderFactory,\n\t// Events - Tool (ToolCallEvent types)\n\tBashToolCallEvent,\n\tBashToolResultEvent,\n\tBeforeAgentStartEvent,\n\tBeforeAgentStartEventResult,\n\tBeforeProviderHeadersEvent,\n\tBeforeProviderRequestEvent,\n\tBeforeProviderRequestEventResult,\n\tBuildSystemPromptOptions,\n\t// Context\n\tCompactionTiming,\n\tCompactOptions,\n\t// Events - Agent\n\tContextEvent,\n\t// Event Results\n\tContextEventResult,\n\tContextUsage,\n\tCustomToolCallEvent,\n\tCustomToolResultEvent,\n\tEditorFactory,\n\tEditToolCallEvent,\n\tEditToolResultEvent,\n\t// Message and Entry Rendering\n\tEntryRenderer,\n\tEntryRenderOptions,\n\tExecOptions,\n\tExecResult,\n\tExtension,\n\tExtensionActions,\n\t// API\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionCommandContextActions,\n\tExtensionContext,\n\tExtensionContextActions,\n\t// Errors\n\tExtensionError,\n\tExtensionEvent,\n\tExtensionFactory,\n\tExtensionFlag,\n\tExtensionHandler,\n\tExtensionMode,\n\t// Runtime\n\tExtensionRuntime,\n\tExtensionShortcut,\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tFindToolCallEvent,\n\tFindToolResultEvent,\n\tGetActiveToolsHandler,\n\tGetAllToolsHandler,\n\tGetCommandsHandler,\n\tGetThinkingLevelHandler,\n\tGrepToolCallEvent,\n\tGrepToolResultEvent,\n\tInlineExtension,\n\t// Events - Input\n\tInputEvent,\n\tInputEventResult,\n\tInputSource,\n\tKeybindingsManager,\n\tLoadExtensionsResult,\n\tLsToolCallEvent,\n\tLsToolResultEvent,\n\tMarkdownTransformContext,\n\tMarkdownTransformer,\n\t// Events - Message\n\tMessageEndEvent,\n\tMessageRenderer,\n\tMessageRenderOptions,\n\tMessageStartEvent,\n\tMessageUpdateEvent,\n\tModelSelectEvent,\n\tModelSelectSource,\n\tPowerShellToolCallEvent,\n\tPowerShellToolResultEvent,\n\tProjectTrustContext,\n\tProjectTrustEvent,\n\tProjectTrustEventDecision,\n\tProjectTrustEventResult,\n\tProjectTrustHandler,\n\t// Provider Registration\n\tProviderConfig,\n\tProviderModelConfig,\n\tReadToolCallEvent,\n\tReadToolResultEvent,\n\t// Commands\n\tRegisteredCommand,\n\tRegisteredTool,\n\tReplacedSessionContext,\n\tResolvedCommand,\n\t// Events - Resources\n\tResourcesDiscoverEvent,\n\tResourcesDiscoverResult,\n\tSendMessageHandler,\n\tSendUserMessageHandler,\n\tSessionBeforeCompactEvent,\n\tSessionBeforeCompactResult,\n\tSessionBeforeForkEvent,\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchEvent,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeEvent,\n\tSessionBeforeTreeResult,\n\tSessionCompactEvent,\n\tSessionCompactFailedEvent,\n\tSessionEvent,\n\tSessionInfoChangedEvent,\n\tSessionShutdownEvent,\n\t// Events - Session\n\tSessionStartEvent,\n\tSessionTreeEvent,\n\tSetActiveToolsHandler,\n\tSetLabelHandler,\n\tSetModelHandler,\n\tSetThinkingLevelHandler,\n\tShellSettings,\n\tTerminalInputHandler,\n\t// Events - Tool\n\tToolCallEvent,\n\tToolCallEventResult,\n\t// Tools\n\tToolDefinition,\n\t// Events - Tool Execution\n\tToolExecutionEndEvent,\n\t// Tool execution mode\n\tToolExecutionMode,\n\tToolExecutionStartEvent,\n\tToolExecutionUpdateEvent,\n\tToolInfo,\n\tToolRenderResultOptions,\n\tToolResultEvent,\n\tToolResultEventResult,\n\tTreePreparation,\n\tTurnEndEvent,\n\tTurnStartEvent,\n\t// Events - User Bash\n\tUserBashEvent,\n\tUserBashEventResult,\n\tWidgetPlacement,\n\tWorkingIndicatorOptions,\n\tWriteToolCallEvent,\n\tWriteToolResultEvent,\n} from \"./types.ts\";\n// Type guards\nexport {\n\tdefineTool,\n\tisBashToolResult,\n\tisEditToolResult,\n\tisFindToolResult,\n\tisGrepToolResult,\n\tisLsToolResult,\n\tisPowerShellToolResult,\n\tisReadToolResult,\n\tisStaleExtensionContextError,\n\tisToolCallEventType,\n\tisWriteToolResult,\n\tSTALE_EXTENSION_CONTEXT_MESSAGE,\n} from \"./types.ts\";\nexport { wrapRegisteredTool, wrapRegisteredTools } from \"./wrapper.ts\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyBH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAMhE,OAAO,EAEN,KAAK,SAAS,EAEd,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EAOzB,MAAM,YAAY,CAAC;AAkGpB,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C;AAWD;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAkEzD;AAoRD;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,EACzB,aAAa,SAAa,GACxB,OAAO,CAAC,SAAS,CAAC,CAOpB;AA6CD,wBAAsB,cAAc,CACnC,KAAK,EAAE,MAAM,EAAE,EACf,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AAED,wBAAsB,oBAAoB,CACzC,KAAK,EAAE,MAAM,EAAE,EACf,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AA2FD;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,oBAAoB,CAAC,CA2C/B"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyBH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAMhE,OAAO,EAEN,KAAK,SAAS,EAEd,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EAOzB,MAAM,YAAY,CAAC;AAuGpB,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C;AAWD;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAkEzD;AAwVD;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,EACzB,aAAa,SAAa,GACxB,OAAO,CAAC,SAAS,CAAC,CAGpB;AA6CD,wBAAsB,cAAc,CACnC,KAAK,EAAE,MAAM,EAAE,EACf,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AAED,wBAAsB,oBAAoB,CACzC,KAAK,EAAE,MAAM,EAAE,EACf,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AA2FD;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,oBAAoB,CAAC,CA2C/B"}
@@ -29,7 +29,7 @@ import { readPiManifest } from "../pi-manifest.js";
29
29
  import { createSyntheticSourceInfo } from "../source-info.js";
30
30
  import { time } from "../timings.js";
31
31
  import { STALE_EXTENSION_CONTEXT_MESSAGE, } from "./types.js";
32
- /** Modules available to extensions via virtualModules (for compiled Bun binary) */
32
+ /** Modules available to extensions via virtualModules (for compiled binaries) */
33
33
  const VIRTUAL_MODULES = {
34
34
  typebox: _bundledTypebox,
35
35
  "typebox/compile": _bundledTypeboxCompile,
@@ -56,10 +56,13 @@ const VIRTUAL_MODULES = {
56
56
  "@mariozechner/pi-coding-agent": _bundledPiCodingAgent,
57
57
  };
58
58
  const require = createRequire(import.meta.url);
59
+ const isNodeSeaBinary = ("sea" in process.features && process.features.sea === true) ||
60
+ process.getBuiltinModule("node:sea")?.isSea() === true;
61
+ const isBundledNode = typeof PI_BUNDLED_NODE !== "undefined" && PI_BUNDLED_NODE;
59
62
  const isTypeScriptSourceRuntime = !isBunBinary && path.extname(fileURLToPath(import.meta.url)) === ".ts";
60
63
  /**
61
64
  * Get aliases for jiti (used in built Node.js mode).
62
- * In Bun binary mode, virtualModules is used instead.
65
+ * In compiled binary mode, virtualModules is used instead.
63
66
  */
64
67
  let _aliases = null;
65
68
  function getAliases() {
@@ -196,16 +199,37 @@ export function createExtensionRuntime() {
196
199
  * Action methods delegate to the shared runtime.
197
200
  */
198
201
  function createExtensionAPI(extension, runtime, cwd, eventBus) {
202
+ const pendingFlagValues = new Map();
203
+ const pendingRuntimeChanges = [];
204
+ const loadingUnsubscribers = [];
205
+ let state = "loading";
206
+ const assertActive = () => {
207
+ if (state === "failed") {
208
+ throw new Error(`Extension "${extension.path}" failed to load and its API is no longer active.`);
209
+ }
210
+ runtime.assertActive();
211
+ };
212
+ const applyRuntimeChange = (change) => {
213
+ if (state === "loading")
214
+ pendingRuntimeChanges.push(change);
215
+ else
216
+ change();
217
+ };
218
+ const clearPending = () => {
219
+ pendingFlagValues.clear();
220
+ pendingRuntimeChanges.length = 0;
221
+ loadingUnsubscribers.length = 0;
222
+ };
199
223
  const api = {
200
224
  // Registration methods - write to extension
201
225
  on(event, handler) {
202
- runtime.assertActive();
226
+ assertActive();
203
227
  const list = extension.handlers.get(event) ?? [];
204
228
  list.push(handler);
205
229
  extension.handlers.set(event, list);
206
230
  },
207
231
  registerTool(tool) {
208
- runtime.assertActive();
232
+ assertActive();
209
233
  extension.tools.set(tool.name, {
210
234
  definition: tool,
211
235
  sourceInfo: extension.sourceInfo,
@@ -213,7 +237,7 @@ function createExtensionAPI(extension, runtime, cwd, eventBus) {
213
237
  runtime.refreshTools();
214
238
  },
215
239
  registerCommand(name, options) {
216
- runtime.assertActive();
240
+ assertActive();
217
241
  extension.commands.set(name, {
218
242
  name,
219
243
  sourceInfo: extension.sourceInfo,
@@ -221,119 +245,154 @@ function createExtensionAPI(extension, runtime, cwd, eventBus) {
221
245
  });
222
246
  },
223
247
  registerShortcut(shortcut, options) {
224
- runtime.assertActive();
248
+ assertActive();
225
249
  extension.shortcuts.set(shortcut, { shortcut, extensionPath: extension.path, ...options });
226
250
  },
227
251
  registerFlag(name, options) {
228
- runtime.assertActive();
252
+ assertActive();
253
+ if (options.default !== undefined && typeof options.default !== options.type) {
254
+ throw new Error(`Invalid default for flag "${name}": expected ${options.type}, got ${typeof options.default}`);
255
+ }
229
256
  extension.flags.set(name, { name, extensionPath: extension.path, ...options });
230
257
  if (options.default !== undefined && !runtime.flagValues.has(name)) {
231
- runtime.flagValues.set(name, options.default);
258
+ if (state === "loading") {
259
+ if (!pendingFlagValues.has(name))
260
+ pendingFlagValues.set(name, options.default);
261
+ }
262
+ else {
263
+ runtime.flagValues.set(name, options.default);
264
+ }
232
265
  }
233
266
  },
234
267
  registerMessageRenderer(customType, renderer) {
235
- runtime.assertActive();
268
+ assertActive();
236
269
  extension.messageRenderers.set(customType, renderer);
237
270
  },
238
271
  registerMarkdownTransformer(transformer) {
239
- runtime.assertActive();
272
+ assertActive();
240
273
  extension.markdownTransformer = transformer;
241
274
  },
242
275
  registerEntryRenderer(customType, renderer) {
243
- runtime.assertActive();
276
+ assertActive();
244
277
  extension.entryRenderers ??= new Map();
245
278
  extension.entryRenderers.set(customType, renderer);
246
279
  },
247
280
  // Flag access - checks extension registered it, reads from runtime
248
281
  getFlag(name) {
249
- runtime.assertActive();
282
+ assertActive();
250
283
  if (!extension.flags.has(name))
251
284
  return undefined;
252
- return runtime.flagValues.get(name);
285
+ return runtime.flagValues.has(name) ? runtime.flagValues.get(name) : pendingFlagValues.get(name);
253
286
  },
254
287
  // Action methods - delegate to shared runtime
255
288
  sendMessage(message, options) {
256
- runtime.assertActive();
289
+ assertActive();
257
290
  runtime.sendMessage(message, options);
258
291
  },
259
292
  sendUserMessage(content, options) {
260
- runtime.assertActive();
293
+ assertActive();
261
294
  runtime.sendUserMessage(content, options);
262
295
  },
263
296
  appendEntry(customType, data) {
264
- runtime.assertActive();
297
+ assertActive();
265
298
  runtime.appendEntry(customType, data);
266
299
  },
267
300
  setSessionName(name) {
268
- runtime.assertActive();
301
+ assertActive();
269
302
  runtime.setSessionName(name);
270
303
  },
271
304
  getSessionName() {
272
- runtime.assertActive();
305
+ assertActive();
273
306
  return runtime.getSessionName();
274
307
  },
275
308
  setLabel(entryId, label) {
276
- runtime.assertActive();
309
+ assertActive();
277
310
  runtime.setLabel(entryId, label);
278
311
  },
279
312
  exec(command, args, options) {
280
- runtime.assertActive();
313
+ assertActive();
281
314
  return execCommand(command, args, options?.cwd ?? cwd, options);
282
315
  },
283
316
  getActiveTools() {
284
- runtime.assertActive();
317
+ assertActive();
285
318
  return runtime.getActiveTools();
286
319
  },
287
320
  getAllTools() {
288
- runtime.assertActive();
321
+ assertActive();
289
322
  return runtime.getAllTools();
290
323
  },
291
324
  setActiveTools(toolNames) {
292
- runtime.assertActive();
325
+ assertActive();
293
326
  runtime.setActiveTools(toolNames);
294
327
  },
295
328
  getCommands() {
296
- runtime.assertActive();
329
+ assertActive();
297
330
  return runtime.getCommands();
298
331
  },
299
332
  setModel(model) {
300
- runtime.assertActive();
333
+ assertActive();
301
334
  return runtime.setModel(model);
302
335
  },
303
336
  getThinkingLevel() {
304
- runtime.assertActive();
337
+ assertActive();
305
338
  return runtime.getThinkingLevel();
306
339
  },
307
340
  setThinkingLevel(level) {
308
- runtime.assertActive();
341
+ assertActive();
309
342
  runtime.setThinkingLevel(level);
310
343
  },
311
344
  registerProvider(providerOrName, config) {
312
- runtime.assertActive();
345
+ assertActive();
313
346
  if (typeof providerOrName === "string") {
314
347
  if (!config)
315
348
  throw new Error("Provider config is required when registering by name");
316
- runtime.registerProvider(providerOrName, config, extension.path);
349
+ applyRuntimeChange(() => runtime.registerProvider(providerOrName, config, extension.path));
317
350
  return;
318
351
  }
319
- runtime.registerNativeProvider(providerOrName, extension.path);
352
+ applyRuntimeChange(() => runtime.registerNativeProvider(providerOrName, extension.path));
320
353
  },
321
354
  unregisterProvider(name) {
322
- runtime.assertActive();
323
- runtime.unregisterProvider(name, extension.path);
355
+ assertActive();
356
+ applyRuntimeChange(() => runtime.unregisterProvider(name, extension.path));
324
357
  },
325
358
  events: {
326
359
  emit(channel, data) {
327
- runtime.assertActive();
360
+ assertActive();
328
361
  eventBus.emit(channel, data);
329
362
  },
330
363
  on(channel, handler) {
331
- runtime.assertActive();
332
- return runtime.trackEventBusSubscription(eventBus.on(channel, handler));
364
+ assertActive();
365
+ const unsubscribe = runtime.trackEventBusSubscription(eventBus.on(channel, handler));
366
+ if (state === "loading")
367
+ loadingUnsubscribers.push(unsubscribe);
368
+ return unsubscribe;
333
369
  },
334
370
  },
335
371
  };
336
- return api;
372
+ return {
373
+ api,
374
+ commit: () => {
375
+ if (state !== "loading")
376
+ return;
377
+ runtime.assertActive();
378
+ for (const [name, value] of pendingFlagValues) {
379
+ if (!runtime.flagValues.has(name))
380
+ runtime.flagValues.set(name, value);
381
+ }
382
+ for (const apply of pendingRuntimeChanges)
383
+ apply();
384
+ state = "active";
385
+ clearPending();
386
+ },
387
+ discard: () => {
388
+ if (state !== "loading")
389
+ return;
390
+ state = "failed";
391
+ for (const unsubscribe of loadingUnsubscribers)
392
+ unsubscribe();
393
+ clearPending();
394
+ },
395
+ };
337
396
  }
338
397
  function isCurrentCacheToken(cacheToken) {
339
398
  return (cacheToken !== undefined &&
@@ -349,9 +408,10 @@ async function loadExtensionModule(extensionPath, cacheToken) {
349
408
  }
350
409
  const jiti = createJiti(import.meta.url, {
351
410
  moduleCache: false,
352
- // Bun uses modules embedded in the executable. Source TypeScript reuses the
353
- // host-resolved modules and root tsconfig paths. Built Node uses dist aliases.
354
- ...(isBunBinary
411
+ // Compiled binaries and the bundled Node distribution use embedded modules.
412
+ // Source TypeScript reuses host modules and root tsconfig paths. Unbundled
413
+ // Node builds use dist aliases.
414
+ ...(isBunBinary || isNodeSeaBinary || isBundledNode
355
415
  ? { virtualModules: VIRTUAL_MODULES, tryNative: false }
356
416
  : isTypeScriptSourceRuntime
357
417
  ? { virtualModules: VIRTUAL_MODULES, tsconfigPaths: true }
@@ -388,6 +448,20 @@ function createExtension(extensionPath, resolvedPath) {
388
448
  shortcuts: new Map(),
389
449
  };
390
450
  }
451
+ async function initializeExtension(factory, extensionPath, resolvedPath, cwd, eventBus, runtime) {
452
+ const extension = createExtension(extensionPath, resolvedPath);
453
+ const load = createExtensionAPI(extension, runtime, cwd, eventBus);
454
+ try {
455
+ await factory(load.api);
456
+ load.commit();
457
+ }
458
+ catch (error) {
459
+ load.discard();
460
+ throw error;
461
+ }
462
+ time(`${extensionPath} factory`, "extensions");
463
+ return extension;
464
+ }
391
465
  async function loadExtension(extensionPath, cwd, eventBus, runtime, cacheToken) {
392
466
  const resolvedPath = resolvePath(extensionPath, cwd, { normalizeUnicodeSpaces: true });
393
467
  try {
@@ -396,10 +470,7 @@ async function loadExtension(extensionPath, cwd, eventBus, runtime, cacheToken)
396
470
  if (!factory) {
397
471
  return { extension: null, error: `Extension does not export a valid factory function: ${extensionPath}` };
398
472
  }
399
- const extension = createExtension(extensionPath, resolvedPath);
400
- const api = createExtensionAPI(extension, runtime, cwd, eventBus);
401
- await factory(api);
402
- time(`${extensionPath} factory`, "extensions");
473
+ const extension = await initializeExtension(factory, extensionPath, resolvedPath, cwd, eventBus, runtime);
403
474
  return { extension, error: null };
404
475
  }
405
476
  catch (err) {
@@ -411,12 +482,8 @@ async function loadExtension(extensionPath, cwd, eventBus, runtime, cacheToken)
411
482
  * Create an Extension from an inline factory function.
412
483
  */
413
484
  export async function loadExtensionFromFactory(factory, cwd, eventBus, runtime, extensionPath = "<inline>") {
414
- const extension = createExtension(extensionPath, extensionPath);
415
485
  const resolvedCwd = resolvePath(cwd);
416
- const api = createExtensionAPI(extension, runtime, resolvedCwd, eventBus);
417
- await factory(api);
418
- time(`${extensionPath} factory`, "extensions");
419
- return extension;
486
+ return initializeExtension(factory, extensionPath, extensionPath, resolvedCwd, eventBus, runtime);
420
487
  }
421
488
  /**
422
489
  * Load extensions from paths.