@oh-my-pi/pi-coding-agent 17.0.8 → 17.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/CHANGELOG.md +87 -1
  2. package/README.md +1 -1
  3. package/dist/cli.js +5495 -5021
  4. package/dist/types/async/job-manager.d.ts +37 -1
  5. package/dist/types/cli/args.d.ts +2 -0
  6. package/dist/types/cli/bench-cli.d.ts +41 -0
  7. package/dist/types/commands/bench.d.ts +15 -3
  8. package/dist/types/commands/launch.d.ts +4 -0
  9. package/dist/types/config/__tests__/model-registry.test.d.ts +1 -0
  10. package/dist/types/config/model-registry.d.ts +30 -1
  11. package/dist/types/config/models-config-schema.d.ts +18 -6
  12. package/dist/types/config/models-config.d.ts +14 -5
  13. package/dist/types/config/provider-globals.d.ts +2 -2
  14. package/dist/types/config/service-tier.d.ts +5 -1
  15. package/dist/types/config/settings-schema.d.ts +350 -50
  16. package/dist/types/config/settings.d.ts +7 -0
  17. package/dist/types/dap/client.d.ts +20 -0
  18. package/dist/types/exec/bash-executor.d.ts +38 -0
  19. package/dist/types/exec/direnv.d.ts +33 -0
  20. package/dist/types/export/html/args.d.ts +15 -0
  21. package/dist/types/export/html/index.d.ts +11 -26
  22. package/dist/types/export/html/web-palette.d.ts +55 -116
  23. package/dist/types/extensibility/extensions/loader.d.ts +3 -0
  24. package/dist/types/extensibility/extensions/types.d.ts +17 -2
  25. package/dist/types/extensibility/legacy-pi-coding-agent-shim.d.ts +1 -0
  26. package/dist/types/extensibility/legacy-pi-tui-shim.d.ts +10 -0
  27. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +14 -1
  28. package/dist/types/internal-urls/registry-helpers.d.ts +11 -0
  29. package/dist/types/live/controller.d.ts +40 -0
  30. package/dist/types/live/protocol.d.ts +85 -0
  31. package/dist/types/live/protocol.test.d.ts +1 -0
  32. package/dist/types/live/transport.d.ts +48 -0
  33. package/dist/types/live/visualizer.d.ts +33 -0
  34. package/dist/types/lsp/client.d.ts +18 -1
  35. package/dist/types/mcp/config-writer.test.d.ts +1 -0
  36. package/dist/types/mcp/manager.d.ts +6 -2
  37. package/dist/types/mcp/oauth-discovery.d.ts +2 -0
  38. package/dist/types/mcp/render.d.ts +2 -2
  39. package/dist/types/mcp/smithery-auth.d.ts +1 -1
  40. package/dist/types/mcp/smithery-auth.test.d.ts +1 -0
  41. package/dist/types/mcp/tool-bridge.d.ts +7 -3
  42. package/dist/types/mcp/types.d.ts +6 -0
  43. package/dist/types/memory-backend/tool-names.d.ts +2 -0
  44. package/dist/types/modes/components/login-dialog.d.ts +2 -2
  45. package/dist/types/modes/components/oauth-selector.d.ts +8 -0
  46. package/dist/types/modes/components/plan-review-overlay.d.ts +26 -0
  47. package/dist/types/modes/components/settings-defs.d.ts +8 -1
  48. package/dist/types/modes/components/status-line/component.jj-cache.test.d.ts +1 -0
  49. package/dist/types/modes/components/tool-execution.d.ts +9 -1
  50. package/dist/types/modes/controllers/command-controller.d.ts +1 -1
  51. package/dist/types/modes/controllers/event-controller.d.ts +6 -1
  52. package/dist/types/modes/controllers/live-command-controller.d.ts +14 -0
  53. package/dist/types/modes/controllers/mcp-command-controller.d.ts +3 -0
  54. package/dist/types/modes/interactive-mode.d.ts +5 -0
  55. package/dist/types/modes/rpc/rpc-client.d.ts +10 -1
  56. package/dist/types/modes/rpc/rpc-frame.d.ts +16 -0
  57. package/dist/types/modes/rpc/rpc-messages.d.ts +26 -0
  58. package/dist/types/modes/rpc/rpc-types.d.ts +40 -0
  59. package/dist/types/modes/setup-wizard/scenes/sign-in.d.ts +1 -1
  60. package/dist/types/modes/setup-wizard/scenes/types.d.ts +9 -1
  61. package/dist/types/modes/setup-wizard/scenes/web-search.d.ts +1 -1
  62. package/dist/types/modes/theme/theme.d.ts +1 -1
  63. package/dist/types/modes/types.d.ts +3 -1
  64. package/dist/types/modes/utils/context-usage.d.ts +12 -2
  65. package/dist/types/plan-mode/plan-files.d.ts +10 -0
  66. package/dist/types/registry/agent-lifecycle.d.ts +21 -9
  67. package/dist/types/registry/agent-registry.d.ts +11 -4
  68. package/dist/types/sdk.d.ts +15 -1
  69. package/dist/types/secrets/index.d.ts +15 -2
  70. package/dist/types/secrets/obfuscator.d.ts +113 -15
  71. package/dist/types/session/acp-permission-gate.d.ts +19 -0
  72. package/dist/types/session/agent-session-events.d.ts +84 -0
  73. package/dist/types/session/agent-session-types.d.ts +314 -0
  74. package/dist/types/session/agent-session.d.ts +120 -750
  75. package/dist/types/session/async-job-delivery.d.ts +28 -0
  76. package/dist/types/session/bash-runner.d.ts +75 -0
  77. package/dist/types/session/blob-store.d.ts +11 -1
  78. package/dist/types/session/blob-store.test.d.ts +1 -0
  79. package/dist/types/session/checkpoint-entries.d.ts +28 -0
  80. package/dist/types/session/eval-runner.d.ts +49 -0
  81. package/dist/types/session/irc-bridge.d.ts +46 -0
  82. package/dist/types/session/messages.d.ts +22 -0
  83. package/dist/types/session/model-controls.d.ts +180 -0
  84. package/dist/types/session/prewalk.d.ts +46 -0
  85. package/dist/types/session/queued-messages.d.ts +22 -0
  86. package/dist/types/session/redis-session-storage.d.ts +1 -0
  87. package/dist/types/session/retry-fallback-chains.d.ts +74 -0
  88. package/dist/types/session/role-models.d.ts +15 -0
  89. package/dist/types/session/session-advisors.d.ts +228 -0
  90. package/dist/types/session/session-entries.d.ts +8 -0
  91. package/dist/types/session/session-handoff.d.ts +70 -0
  92. package/dist/types/session/session-history-format.d.ts +6 -1
  93. package/dist/types/session/session-loader.d.ts +6 -4
  94. package/dist/types/session/session-maintenance.d.ts +246 -0
  95. package/dist/types/session/session-manager.d.ts +41 -0
  96. package/dist/types/session/session-memory.d.ts +56 -0
  97. package/dist/types/session/session-provider-boundary.d.ts +62 -0
  98. package/dist/types/session/session-stats.d.ts +48 -0
  99. package/dist/types/session/session-tools.d.ts +143 -0
  100. package/dist/types/session/session-workspace.d.ts +32 -0
  101. package/dist/types/session/stream-guards.d.ts +44 -0
  102. package/dist/types/session/todo-tracker.d.ts +56 -0
  103. package/dist/types/session/ttsr-coordinator.d.ts +51 -0
  104. package/dist/types/session/turn-recovery.d.ts +225 -0
  105. package/dist/types/system-prompt.d.ts +2 -0
  106. package/dist/types/task/executor.d.ts +4 -1
  107. package/dist/types/task/output-manager.d.ts +3 -1
  108. package/dist/types/task/types.d.ts +14 -0
  109. package/dist/types/tools/approval.d.ts +1 -0
  110. package/dist/types/tools/browser/launch.d.ts +5 -0
  111. package/dist/types/tools/hub/jobs.d.ts +1 -1
  112. package/dist/types/tools/image-gen.d.ts +4 -4
  113. package/dist/types/tools/image-providers.d.ts +38 -0
  114. package/dist/types/tools/index.d.ts +8 -0
  115. package/dist/types/tools/path-utils.d.ts +8 -0
  116. package/dist/types/tools/report-tool-issue.d.ts +24 -9
  117. package/dist/types/tools/todo.d.ts +10 -4
  118. package/dist/types/tools/xdev.d.ts +5 -1
  119. package/dist/types/tts/streaming-player.d.ts +14 -0
  120. package/dist/types/tts/vocalizer.d.ts +5 -0
  121. package/dist/types/utils/jj.d.ts +29 -0
  122. package/dist/types/utils/lang-from-path.d.ts +1 -0
  123. package/dist/types/utils/title-generator.d.ts +30 -0
  124. package/dist/types/vibe/runtime.d.ts +36 -8
  125. package/dist/types/web/search/index.d.ts +1 -1
  126. package/dist/types/web/search/provider.d.ts +15 -5
  127. package/dist/types/web/search/providers/firecrawl.d.ts +9 -0
  128. package/dist/types/web/search/types.d.ts +95 -1
  129. package/package.json +13 -12
  130. package/scripts/generate-share-viewer.ts +4 -6
  131. package/scripts/legacy-pi-virtual-module.ts +1 -1
  132. package/src/advisor/__tests__/advisor.test.ts +643 -0
  133. package/src/advisor/runtime.ts +144 -43
  134. package/src/async/job-manager.ts +90 -2
  135. package/src/cli/args.ts +2 -0
  136. package/src/cli/auth-gateway-cli.ts +18 -3
  137. package/src/cli/bench-cli.ts +395 -29
  138. package/src/cli/flag-tables.ts +3 -0
  139. package/src/cli/gc-cli.ts +2 -2
  140. package/src/cli/grievances-cli.ts +2 -2
  141. package/src/cli/usage-cli.ts +11 -2
  142. package/src/collab/host.ts +3 -2
  143. package/src/commands/bench.ts +18 -4
  144. package/src/commands/launch.ts +4 -0
  145. package/src/config/__tests__/model-registry.test.ts +147 -0
  146. package/src/config/model-registry.ts +50 -2
  147. package/src/config/model-resolver.ts +0 -1
  148. package/src/config/models-config-schema.ts +15 -4
  149. package/src/config/provider-globals.ts +9 -9
  150. package/src/config/service-tier.ts +26 -1
  151. package/src/config/settings-schema.ts +250 -54
  152. package/src/config/settings.ts +81 -2
  153. package/src/dap/client.ts +37 -4
  154. package/src/edit/index.ts +49 -12
  155. package/src/eval/py/executor.ts +103 -33
  156. package/src/exec/bash-executor.ts +89 -6
  157. package/src/exec/direnv.ts +145 -0
  158. package/src/export/html/args.ts +20 -0
  159. package/src/export/html/index.ts +45 -47
  160. package/src/export/html/template.css +19 -1
  161. package/src/export/html/template.html +6 -0
  162. package/src/export/html/template.js +21 -0
  163. package/src/export/html/tool-views.generated.js +31 -31
  164. package/src/export/html/web-palette.ts +116 -132
  165. package/src/export/share.ts +249 -49
  166. package/src/extensibility/extensions/loader.ts +29 -1
  167. package/src/extensibility/extensions/runner.ts +6 -0
  168. package/src/extensibility/extensions/types.ts +33 -2
  169. package/src/extensibility/legacy-pi-coding-agent-shim.ts +1 -0
  170. package/src/extensibility/legacy-pi-tui-shim.ts +10 -0
  171. package/src/extensibility/plugins/legacy-pi-compat.ts +870 -311
  172. package/src/hindsight/state.ts +64 -6
  173. package/src/internal-urls/local-protocol.ts +2 -1
  174. package/src/internal-urls/memory-protocol.ts +2 -2
  175. package/src/internal-urls/registry-helpers.ts +40 -0
  176. package/src/internal-urls/skill-protocol.ts +2 -2
  177. package/src/internal-urls/ssh-protocol.ts +2 -1
  178. package/src/internal-urls/vault-protocol.ts +2 -1
  179. package/src/live/audio-worklet.txt +59 -0
  180. package/src/live/browser-runtime.txt +221 -0
  181. package/src/live/controller.ts +464 -0
  182. package/src/live/prompts/agent-final-message.md +3 -0
  183. package/src/live/prompts/live-instructions.md +23 -0
  184. package/src/live/protocol.test.ts +140 -0
  185. package/src/live/protocol.ts +233 -0
  186. package/src/live/transport.ts +490 -0
  187. package/src/live/visualizer.ts +234 -0
  188. package/src/lsp/client.ts +52 -9
  189. package/src/lsp/clients/biome-client.ts +3 -4
  190. package/src/lsp/index.ts +44 -11
  191. package/src/main.ts +9 -1
  192. package/src/mcp/config-writer.test.ts +43 -0
  193. package/src/mcp/config-writer.ts +109 -82
  194. package/src/mcp/manager.ts +39 -8
  195. package/src/mcp/oauth-discovery.ts +10 -2
  196. package/src/mcp/render.ts +94 -35
  197. package/src/mcp/smithery-auth.test.ts +29 -0
  198. package/src/mcp/smithery-auth.ts +3 -2
  199. package/src/mcp/tool-bridge.ts +107 -11
  200. package/src/mcp/types.ts +7 -0
  201. package/src/memories/index.ts +40 -20
  202. package/src/memory-backend/tool-names.ts +2 -0
  203. package/src/mnemopi/backend.ts +24 -7
  204. package/src/modes/acp/acp-agent.ts +56 -10
  205. package/src/modes/acp/acp-event-mapper.ts +8 -1
  206. package/src/modes/components/agent-hub.ts +27 -10
  207. package/src/modes/components/login-dialog.ts +14 -4
  208. package/src/modes/components/oauth-selector.ts +24 -7
  209. package/src/modes/components/plan-review-overlay.ts +350 -35
  210. package/src/modes/components/settings-defs.ts +28 -3
  211. package/src/modes/components/settings-selector.ts +178 -6
  212. package/src/modes/components/status-line/component.jj-cache.test.ts +229 -0
  213. package/src/modes/components/status-line/component.ts +123 -2
  214. package/src/modes/components/tool-execution.test.ts +63 -2
  215. package/src/modes/components/tool-execution.ts +11 -2
  216. package/src/modes/controllers/command-controller.ts +70 -22
  217. package/src/modes/controllers/event-controller.ts +111 -16
  218. package/src/modes/controllers/extension-ui-controller.test.ts +1 -0
  219. package/src/modes/controllers/extension-ui-controller.ts +20 -4
  220. package/src/modes/controllers/live-command-controller.ts +178 -0
  221. package/src/modes/controllers/mcp-command-controller.ts +80 -41
  222. package/src/modes/controllers/omfg-controller.ts +44 -40
  223. package/src/modes/controllers/selector-controller.ts +18 -10
  224. package/src/modes/controllers/session-focus-controller.ts +6 -1
  225. package/src/modes/interactive-mode.ts +160 -38
  226. package/src/modes/rpc/rpc-client.ts +94 -3
  227. package/src/modes/rpc/rpc-frame.ts +164 -4
  228. package/src/modes/rpc/rpc-messages.ts +127 -0
  229. package/src/modes/rpc/rpc-mode.ts +79 -7
  230. package/src/modes/rpc/rpc-types.ts +34 -2
  231. package/src/modes/runtime-init.ts +2 -0
  232. package/src/modes/setup-wizard/scenes/model.ts +5 -7
  233. package/src/modes/setup-wizard/scenes/providers.ts +3 -2
  234. package/src/modes/setup-wizard/scenes/sign-in.ts +8 -2
  235. package/src/modes/setup-wizard/scenes/theme.ts +13 -3
  236. package/src/modes/setup-wizard/scenes/types.ts +9 -1
  237. package/src/modes/setup-wizard/scenes/web-search.ts +23 -10
  238. package/src/modes/setup-wizard/wizard-overlay.ts +1 -1
  239. package/src/modes/theme/theme.ts +1 -1
  240. package/src/modes/types.ts +3 -1
  241. package/src/modes/utils/context-usage.ts +23 -7
  242. package/src/modes/utils/ui-helpers.ts +10 -5
  243. package/src/plan-mode/plan-files.ts +40 -0
  244. package/src/prompts/bench/cache-prefix-chunk.md +1 -0
  245. package/src/prompts/bench/cache-prefix.md +3 -0
  246. package/src/prompts/bench/cache-suffix.md +1 -0
  247. package/src/prompts/goals/guided-goal-system.md +24 -3
  248. package/src/prompts/system/custom-system-prompt.md +1 -1
  249. package/src/prompts/system/project-prompt.md +8 -1
  250. package/src/prompts/system/subagent-async-pending.md +6 -0
  251. package/src/prompts/system/system-prompt.md +1 -1
  252. package/src/prompts/system/workflow-notice.md +48 -40
  253. package/src/prompts/system/xdev-mount-notice.md +4 -0
  254. package/src/prompts/tools/task.md +12 -2
  255. package/src/prompts/tools/todo.md +3 -1
  256. package/src/registry/agent-lifecycle.ts +116 -46
  257. package/src/registry/agent-registry.ts +35 -8
  258. package/src/registry/persisted-agents.ts +26 -2
  259. package/src/sdk.ts +255 -139
  260. package/src/secrets/index.ts +127 -4
  261. package/src/secrets/obfuscator.ts +2328 -105
  262. package/src/session/acp-permission-gate.ts +165 -0
  263. package/src/session/agent-session-error-log.test.ts +1 -1
  264. package/src/session/agent-session-events.ts +66 -0
  265. package/src/session/agent-session-types.ts +334 -0
  266. package/src/session/agent-session.ts +1910 -12213
  267. package/src/session/artifacts.ts +6 -5
  268. package/src/session/async-job-delivery.ts +74 -0
  269. package/src/session/bash-runner.ts +326 -0
  270. package/src/session/blob-store.test.ts +56 -0
  271. package/src/session/blob-store.ts +18 -2
  272. package/src/session/checkpoint-entries.ts +81 -0
  273. package/src/session/eval-runner.ts +212 -0
  274. package/src/session/indexed-session-storage.ts +9 -2
  275. package/src/session/irc-bridge.ts +203 -0
  276. package/src/session/messages.ts +263 -1
  277. package/src/session/model-controls.ts +714 -0
  278. package/src/session/prewalk.ts +252 -0
  279. package/src/session/queued-messages.ts +93 -0
  280. package/src/session/redis-session-storage.ts +51 -11
  281. package/src/session/retry-fallback-chains.ts +455 -0
  282. package/src/session/role-models.ts +85 -0
  283. package/src/session/session-advisors.ts +1679 -0
  284. package/src/session/session-context.test.ts +224 -1
  285. package/src/session/session-context.ts +47 -5
  286. package/src/session/session-entries.ts +8 -0
  287. package/src/session/session-handoff.ts +308 -0
  288. package/src/session/session-history-format.ts +20 -9
  289. package/src/session/session-loader.ts +10 -51
  290. package/src/session/session-maintenance.ts +2983 -0
  291. package/src/session/session-manager.ts +390 -30
  292. package/src/session/session-memory.ts +222 -0
  293. package/src/session/session-provider-boundary.ts +307 -0
  294. package/src/session/session-stats.ts +293 -0
  295. package/src/session/session-tools.ts +943 -0
  296. package/src/session/session-workspace.ts +53 -0
  297. package/src/session/stream-guards.ts +417 -0
  298. package/src/session/todo-tracker.ts +380 -0
  299. package/src/session/ttsr-coordinator.ts +496 -0
  300. package/src/session/turn-recovery.ts +1629 -0
  301. package/src/slash-commands/builtin-registry.ts +92 -11
  302. package/src/slash-commands/helpers/usage-report.ts +25 -4
  303. package/src/system-prompt.ts +41 -17
  304. package/src/task/executor.ts +288 -70
  305. package/src/task/index.ts +148 -111
  306. package/src/task/output-manager.ts +25 -3
  307. package/src/task/persisted-revive.ts +4 -3
  308. package/src/task/structured-subagent.ts +4 -1
  309. package/src/task/types.ts +16 -0
  310. package/src/tools/approval.ts +55 -10
  311. package/src/tools/bash-interactive.ts +26 -0
  312. package/src/tools/bash-skill-urls.ts +28 -2
  313. package/src/tools/bash.ts +339 -123
  314. package/src/tools/browser/launch.ts +9 -1
  315. package/src/tools/browser/tab-supervisor.ts +8 -5
  316. package/src/tools/browser.ts +94 -47
  317. package/src/tools/hub/index.ts +1 -1
  318. package/src/tools/hub/jobs.ts +67 -8
  319. package/src/tools/image-gen.ts +20 -28
  320. package/src/tools/image-providers.ts +50 -0
  321. package/src/tools/index.ts +12 -0
  322. package/src/tools/path-utils.ts +49 -2
  323. package/src/tools/read.ts +156 -88
  324. package/src/tools/renderers.ts +7 -1
  325. package/src/tools/report-tool-issue.ts +79 -28
  326. package/src/tools/todo.ts +101 -11
  327. package/src/tools/vibe.ts +1 -2
  328. package/src/tools/write.ts +51 -1
  329. package/src/tools/xdev.ts +67 -3
  330. package/src/tts/streaming-player.ts +62 -4
  331. package/src/tts/vocalizer.ts +18 -1
  332. package/src/utils/jj.ts +125 -4
  333. package/src/utils/lang-from-path.ts +7 -0
  334. package/src/utils/title-generator.ts +137 -1
  335. package/src/vibe/runtime.ts +852 -72
  336. package/src/web/search/index.ts +3 -6
  337. package/src/web/search/provider.ts +31 -16
  338. package/src/web/search/providers/firecrawl.ts +46 -13
  339. package/src/web/search/providers/xai.ts +7 -1
  340. package/src/web/search/types.ts +8 -1
@@ -22,16 +22,26 @@ export interface ContextBreakdown {
22
22
  /** Estimated snapcompact wire savings; set when requested and a snapcompact.* setting is enabled. */
23
23
  snapcompact?: SnapcompactSavingsEstimate;
24
24
  }
25
+ /** Stable inputs used to cache non-message token estimates. */
26
+ export interface NonMessageTokenSource {
27
+ readonly systemPrompt?: string[];
28
+ readonly agent?: {
29
+ readonly state?: {
30
+ readonly tools?: ReadonlyArray<Pick<Tool, "name" | "description" | "parameters">>;
31
+ };
32
+ };
33
+ readonly skills?: readonly Skill[];
34
+ }
25
35
  export declare function estimateSkillsTokens(skills: readonly Skill[]): number;
26
36
  export declare function estimateToolSchemaTokens(tools: ReadonlyArray<Pick<Tool, "name" | "description" | "parameters">>): number;
27
- export declare function computeNonMessageTokens(session: AgentSession): number;
37
+ export declare function computeNonMessageTokens(session: NonMessageTokenSource): number;
28
38
  /**
29
39
  * Shared helper for the four non-message token totals used by
30
40
  * `computeContextBreakdown` (/context panel). Keep this category split stable:
31
41
  * the status-line fast path intentionally uses the equivalent collapsed total
32
42
  * in `computeNonMessageTokens`.
33
43
  */
34
- export declare function computeNonMessageBreakdown(session: AgentSession): {
44
+ export declare function computeNonMessageBreakdown(session: NonMessageTokenSource): {
35
45
  skillsTokens: number;
36
46
  toolsTokens: number;
37
47
  systemContextTokens: number;
@@ -0,0 +1,10 @@
1
+ import { type LocalProtocolOptions } from "../internal-urls/index.js";
2
+ /** Reads a plan from a local URL or cwd-relative filesystem path. */
3
+ export declare function readPlanFile(planFilePath: string, options: {
4
+ localProtocolOptions: LocalProtocolOptions;
5
+ cwd: string;
6
+ }): Promise<string | null>;
7
+ /** Lists session-local plan files from newest to oldest. */
8
+ export declare function listPlanFiles(options: {
9
+ localProtocolOptions: LocalProtocolOptions;
10
+ }): Promise<string[]>;
@@ -14,10 +14,14 @@
14
14
  * - ensureLive during an in-flight park either cancels the park (session still
15
15
  * live) or waits for detach+park and then revives.
16
16
  * - Concurrent ensureLive/park operations coalesce per id.
17
+ *
18
+ * Every adoption, park, and revival is bound to the exact {@link AgentRef} it
19
+ * started from, so stale async work (a late finalizer, a cancelled initializer,
20
+ * a superseded revive) can never clobber a newer same-id ref.
17
21
  */
18
22
  import type { AgentSession } from "../session/agent-session.js";
19
- import { type AgentRef, AgentRegistry } from "./agent-registry.js";
20
- export type AgentReviver = () => Promise<AgentSession>;
23
+ import { type AgentRef, type AgentRefExpectation, AgentRegistry } from "./agent-registry.js";
24
+ export type AgentReviver = (expected: AgentRef) => Promise<AgentSession>;
21
25
  /**
22
26
  * Builds a reviver for a `parked` ref restored from disk (Agent Hub scan,
23
27
  * collab mirror, resumed process) that carries a sessionFile but no in-memory
@@ -48,10 +52,12 @@ export declare class AgentLifecycleManager {
48
52
  /**
49
53
  * Take ownership of a finished subagent. Caller has already set registry
50
54
  * status to "idle". Arms the TTL timer (idleTtlMs <= 0 adopts without one).
55
+ * When `expected` is given, the adoption is refused if the id no longer
56
+ * resolves to that ref (or that ref's session).
51
57
  */
52
- adopt(id: string, opts: AdoptOptions): void;
53
- /** True if the id is adopted (parked or live). */
54
- has(id: string): boolean;
58
+ adopt(id: string, opts: AdoptOptions, expected?: AgentRefExpectation): void;
59
+ /** True if the id is adopted (parked or live) — and, when `expected` is given, still bound to that ref. */
60
+ has(id: string, expected?: AgentRefExpectation): boolean;
55
61
  /**
56
62
  * True when this manager owns `registry` — i.e. its adopt/park/revive state
57
63
  * describes that registry's refs. Lets a caller holding a specific registry
@@ -62,9 +68,10 @@ export declare class AgentLifecycleManager {
62
68
  /**
63
69
  * True while {@link park} is disposing this agent's session (lets dispose
64
70
  * hooks distinguish park from teardown). False once the park is cancelled
65
- * by ensureLive or after detach+dispose completes.
71
+ * by ensureLive or after detach+dispose completes. When `expected` is
72
+ * given, only a park bound to that ref (or its session) counts.
66
73
  */
67
- isParking(id: string): boolean;
74
+ isParking(id: string, expected?: AgentRefExpectation): boolean;
68
75
  /**
69
76
  * Dispose the live session, detach it from the registry, and mark the
70
77
  * agent `parked`. No-op unless the id is adopted and live.
@@ -84,8 +91,13 @@ export declare class AgentLifecycleManager {
84
91
  * cancelled (session still live) or awaited to completion before revive.
85
92
  */
86
93
  ensureLive(id: string): Promise<AgentSession>;
87
- /** Hard removal: dispose if live, unregister from registry, drop timers. */
88
- release(id: string): Promise<void>;
94
+ /**
95
+ * Hard removal: dispose if live, unregister from registry, drop timers.
96
+ * When `expected` is given, only a ref matching it is released; a stale
97
+ * release can never take down a newer same-id ref. Returns true when a
98
+ * matching ref was released.
99
+ */
100
+ release(id: string, expected?: AgentRefExpectation): Promise<boolean>;
89
101
  /** Teardown everything (process exit / main session dispose). */
90
102
  dispose(): Promise<void>;
91
103
  }
@@ -39,6 +39,7 @@ export interface AgentRef {
39
39
  /** Short gist of what the agent is currently doing (latest intent or tool), for the work-aware roster. Display-only. */
40
40
  activity?: string;
41
41
  }
42
+ export type AgentRefExpectation = AgentRef | AgentSession;
42
43
  export type RegistryEvent = {
43
44
  type: "registered";
44
45
  ref: AgentRef;
@@ -65,7 +66,13 @@ export declare class AgentRegistry {
65
66
  /** Reset the global registry. Test-only. */
66
67
  static resetGlobalForTests(): void;
67
68
  register(input: RegisterInput): AgentRef;
68
- setStatus(id: string, status: AgentStatus): void;
69
+ /**
70
+ * Register a new id only when it is absent, or reuse the exact ref a parked
71
+ * revival was authorized to revive. A missing expected ref is a failed CAS:
72
+ * callers must never claim an id after its prior generation disappeared.
73
+ */
74
+ registerIfAvailable(input: RegisterInput, expected: AgentRef | null): AgentRef | undefined;
75
+ setStatus(id: string, status: AgentStatus, expected?: AgentRefExpectation): boolean;
69
76
  /**
70
77
  * Record a short activity gist for the work-aware roster. Display-only and
71
78
  * read on demand (`irc list`, peer roster), so it emits no event — keeping
@@ -81,9 +88,9 @@ export declare class AgentRegistry {
81
88
  * every caller is safe without sanitizing at its own call site.
82
89
  */
83
90
  setActivity(id: string, activity: string): void;
84
- attachSession(id: string, session: AgentSession, sessionFile?: string | null): void;
85
- detachSession(id: string): void;
86
- unregister(id: string): void;
91
+ attachSession(id: string, session: AgentSession, sessionFile?: string | null, expected?: AgentRefExpectation): boolean;
92
+ detachSession(id: string, expected?: AgentRefExpectation): boolean;
93
+ unregister(id: string, expected?: AgentRefExpectation): boolean;
87
94
  get(id: string): AgentRef | undefined;
88
95
  list(): AgentRef[];
89
96
  /**
@@ -16,7 +16,7 @@ import type { HindsightSessionState } from "./hindsight/state.js";
16
16
  import { type LocalProtocolOptions } from "./internal-urls/index.js";
17
17
  import { MCPManager, type MCPToolsLoadResult } from "./mcp/index.js";
18
18
  import type { MnemopiSessionState } from "./mnemopi/state.js";
19
- import { AgentRegistry } from "./registry/agent-registry.js";
19
+ import { type AgentRef, AgentRegistry } from "./registry/agent-registry.js";
20
20
  import { AgentSession, type PlanYolo, type Prewalk } from "./session/agent-session.js";
21
21
  import type { AuthStorage } from "./session/auth-storage.js";
22
22
  import { SessionManager } from "./session/session-manager.js";
@@ -29,6 +29,8 @@ import { type WorkspaceTree } from "./workspace-tree.js";
29
29
  export interface CreateAgentSessionOptions {
30
30
  /** Working directory for project-local discovery. Default: getProjectDir() */
31
31
  cwd?: string;
32
+ /** Additional workspace directories beyond cwd (multi-root), absolute or cwd-relative. */
33
+ additionalDirectories?: string[];
32
34
  /** Global config directory. Default: ~/.omp/agent */
33
35
  agentDir?: string;
34
36
  /** Spawns to allow. Default: "*" */
@@ -180,6 +182,13 @@ export interface CreateAgentSessionOptions {
180
182
  agentDisplayName?: string;
181
183
  /** Optional shared agent registry for IRC routing. Default: AgentRegistry.global(). */
182
184
  agentRegistry?: AgentRegistry;
185
+ /**
186
+ * Registry generation authorized for this creation. `null` requires the id
187
+ * to be absent; an AgentRef allows a parked revival to reuse only that ref.
188
+ * Undefined preserves legacy unconditional registration for external SDK callers.
189
+ * @internal
190
+ */
191
+ expectedAgentRef?: AgentRef | null;
183
192
  /** Parent task ID prefix for nested artifact naming (e.g., "Extensions") */
184
193
  parentTaskPrefix?: string;
185
194
  /**
@@ -205,6 +214,11 @@ export interface CreateAgentSessionOptions {
205
214
  settingsManager?: Settings | Promise<Settings>;
206
215
  /** Whether UI is available (enables interactive tools like ask). Default: false */
207
216
  hasUI?: boolean;
217
+ /**
218
+ * Defer `confirm` reserve-policy fallback until AgentSession prompt-time UI is configured.
219
+ * ACP uses this while capabilities are negotiated without enabling UI-only tools.
220
+ */
221
+ deferUsageReserveConfirmation?: boolean;
208
222
  /**
209
223
  * Opt-in OpenTelemetry instrumentation forwarded to the underlying Agent.
210
224
  * Passing `{}` enables the loop's GenAI-semantic-convention spans. See
@@ -1,5 +1,18 @@
1
- import type { SecretEntry } from "./obfuscator.js";
2
- export { deobfuscateSessionContext, deobfuscateToolArguments, obfuscateMessages, obfuscateProviderContext, type SecretEntry, SecretObfuscator, } from "./obfuscator.js";
1
+ import { type SecretEntry } from "./obfuscator.js";
2
+ /**
3
+ * Per-install secret key for the placeholder digest. Persisted under the agent
4
+ * config directory and never sent to a provider, so model-visible placeholders
5
+ * cannot be reversed by dictionary-hashing candidate secrets. Stable across
6
+ * sessions so persisted transcripts deobfuscate consistently. Defaults to
7
+ * `getAgentDir()` — the same directory `createAgentSession()` passes as
8
+ * `agentDir` — so a caller relying on the default reads/writes the identical
9
+ * key file live sessions use, per `~/.omp/agent/secret-placeholder.key` in
10
+ * docs/secrets.md.
11
+ */
12
+ export declare function getSecretPlaceholderKey(keyDir?: string): Promise<string>;
13
+ /** Return an existing placeholder key for redaction without creating a new key file. */
14
+ export declare function getExistingSecretPlaceholderKey(keyDir?: string): Promise<string | undefined>;
15
+ export { deobfuscateSessionContext, deobfuscateToolArguments, obfuscateMessages, obfuscateProviderContext, type SecretEntry, SecretObfuscator, secretEntriesNeedPlaceholderKey, secretEntryNeedsPlaceholderKey, } from "./obfuscator.js";
3
16
  /**
4
17
  * Load secrets from project-local and global secrets.yml files.
5
18
  * Project-local entries override global entries with matching content.
@@ -7,6 +7,7 @@ export interface SecretEntry {
7
7
  mode?: "obfuscate" | "replace";
8
8
  replacement?: string;
9
9
  flags?: string;
10
+ friendlyName?: string;
10
11
  }
11
12
  export type JsonValue = string | number | boolean | null | JsonValue[] | {
12
13
  [key: string]: JsonValue | undefined;
@@ -14,14 +15,105 @@ export type JsonValue = string | number | boolean | null | JsonValue[] | {
14
15
  export type JsonRecord = {
15
16
  [key: string]: JsonValue | undefined;
16
17
  };
18
+ /**
19
+ * Whether a default (no custom `replacement`) replace-mode regex can never
20
+ * safely redact a 1-2 char match: `findNonMatchingReplacement`'s bounded
21
+ * search — the same search `#generateRegexReplacement` runs at match time —
22
+ * finds no candidate the regex fails to re-match. This holds independent of
23
+ * any actual per-install key: the search already exhausts every character in
24
+ * `REPLACEMENT_CHARS` (the alphabet `buildKeyedReplacementRun` draws its
25
+ * fallback marker from) plus punctuation and whitespace, so if none of those
26
+ * escape the regex, no key-derived marker drawn from the same alphabet can
27
+ * either — the marker is guaranteed to re-match too, making every such match
28
+ * unresolvable: the fallback could only ever emit the raw matched text
29
+ * unchanged. Probed with a value (`"\0".repeat(length)`) the bounded search
30
+ * never treats as a real candidate, so the result depends only on the
31
+ * regex's own matching behavior, not on this specific probe.
32
+ */
33
+ export declare function regexHasUnresolvableShortMatchFallback(regex: RegExp): boolean;
34
+ export declare const MIN_OBFUSCATE_SECRET_LEN = 8;
35
+ /** Normalize a friendly name into the model-visible placeholder prefix. */
36
+ export declare function sanitizeSecretFriendlyName(name: string): string | undefined;
37
+ /**
38
+ * Whether an entry needs the persisted placeholder key: either because it can
39
+ * produce a reversible (keyed) obfuscate-mode placeholder, or because a default
40
+ * (no custom `replacement`) replace-mode regex can reach
41
+ * `#generateRegexReplacement`'s key-derived idempotent fallback marker (see
42
+ * `#generateReplacement`) when every same-length candidate re-matches a
43
+ * pathological match-everything config (e.g. `[\s\S]{8}`). That fallback depends
44
+ * on the persisted per-install key — not just length — to stay a fixed point
45
+ * across a process restart; without a persisted key, a fresh install falls back
46
+ * to a process-random key (`defaultPlaceholderKey()`), so the fallback marker
47
+ * would churn across restarts even though the algorithm itself is stable. A
48
+ * regex WITH a custom `replacement` never reaches that fallback (it always emits
49
+ * the literal configured string), and a plain replace secret's replacement is
50
+ * pure content-hash (`#generateSecretReplacement`), so neither needs the key.
51
+ * Short plain obfuscate entries are toned down (never placeheld), so they must
52
+ * NOT force key creation: otherwise a `secret-placeholder.key` file is written
53
+ * and persisted for a config that ends up with no active secrets, leaving the
54
+ * key readable via a tool and reusable for later placeholders.
55
+ */
56
+ export declare function secretEntryNeedsPlaceholderKey(entry: SecretEntry): boolean;
57
+ /**
58
+ * Whether a SET of entries needs the persisted placeholder key. `obfuscate()`
59
+ * applies plain replace-mode mappings before the plain-obfuscate pass, so a plain
60
+ * obfuscate entry only emits a reversible (keyed) placeholder when its content can
61
+ * still appear AFTER the replace phase. When no obfuscate entry can ever produce a
62
+ * placeholder, the persisted key must NOT be required/created — otherwise an
63
+ * effectively replace-only secret set still writes `secret-placeholder.key` and
64
+ * fails startup when the agent config dir is unwritable.
65
+ *
66
+ * The decision models the replace phase as the obfuscator actually runs it:
67
+ * replace mappings are content-keyed (later duplicate wins) and applied in
68
+ * descending content-length order; for a fresh probe (no prior placeholders) that
69
+ * phase is plain sequential substring replacement. A plain obfuscate entry needs
70
+ * the key when its content survives that simulated phase (direct typing) OR when
71
+ * any effective replacement can form the content via tiling — a substring,
72
+ * wholesale superstring, or prefix/suffix border that joins with surrounding
73
+ * passthrough bytes (see `replacementCanFormContent`). This covers direct
74
+ * shadowing (`SECRET -> safe`), reintroduction, duplicate ordering, transitive
75
+ * chains, and context-joined fragments uniformly. Default (omitted) replacements
76
+ * are deterministic, length-preserving, and distinct, so a same-content shadow
77
+ * with no other interacting replacement stays key-free.
78
+ * Replacement outputs are themselves rewritten by every later (shorter-content)
79
+ * replacement before the plain-obfuscate pass sees them, so a fragment that a
80
+ * subsequent replacement erases (`AA -> SEC` then `S -> X` turns every `SEC` into
81
+ * `XEC`) no longer forces the key. Surrounding bytes stay modeled as arbitrary
82
+ * passthrough, so testing the surviving fragment only drops false positives and
83
+ * never under-approximates a real key need.
84
+ */
85
+ export declare function secretEntriesNeedPlaceholderKey(entries: SecretEntry[]): boolean;
86
+ export declare function stripPendingSecretPlaceholderSuffix(text: string): string;
17
87
  export declare class SecretObfuscator {
18
88
  #private;
19
- constructor(entries: SecretEntry[]);
89
+ constructor(entries: SecretEntry[], key?: string);
20
90
  hasSecrets(): boolean;
91
+ /** Whether stored-session restoration can resolve keyed or legacy placeholders. */
92
+ hasStoredSecrets(): boolean;
21
93
  /** Obfuscate all secrets in text. Bidirectional placeholders for obfuscate mode, one-way for replace. */
22
- obfuscate(text: string): string;
23
- /** Deobfuscate obfuscate-mode placeholders back to original secrets. Replace-mode is NOT reversed. */
94
+ obfuscate(text: string, sharedRegexSecretValues?: ReadonlySet<string>): string;
95
+ /**
96
+ * Deobfuscate keyed placeholders back to original secrets for LIVE paths
97
+ * (provider output, tool-call arguments). Replace-mode is NOT reversed, and
98
+ * legacy index-derived aliases are intentionally ignored so a prompt-injected
99
+ * model cannot synthesize one to recover a secret.
100
+ */
24
101
  deobfuscate(text: string): string;
102
+ /**
103
+ * Deobfuscate stored session content for replay/display. Identical to
104
+ * {@link deobfuscate} but additionally honors legacy index-derived aliases so
105
+ * sessions persisted before keyed placeholders still resume correctly. Use
106
+ * only for trusted on-disk session content, never for live model output.
107
+ */
108
+ deobfuscateStored(text: string): string;
109
+ /** Deep-walk an object, deobfuscating string values for LIVE paths (keyed placeholders only). */
110
+ deobfuscateObject<T>(obj: T): T;
111
+ /** Deep-walk stored session content, deobfuscating string values incl. legacy aliases. */
112
+ deobfuscateStoredObject<T>(obj: T): T;
113
+ /** Deep-walk an object, obfuscating all string values. */
114
+ obfuscateObject<T>(obj: T): T;
115
+ collectRegexSecretValuesForObfuscation(text: string): Set<string>;
116
+ stripUnsafeFriendlyPlaceholderPrefixes(text: string, sharedRegexSecretValues: ReadonlySet<string>): string;
25
117
  }
26
118
  /**
27
119
  * Restore secret placeholders for local display. Only message kinds the model
@@ -30,30 +122,36 @@ export declare class SecretObfuscator {
30
122
  * tool-result messages are persisted with their literal text, so a literal
31
123
  * `#ABCD#` the operator typed must survive untouched; those roles are never
32
124
  * walked.
125
+ *
126
+ * Legacy index-derived aliases (`#XXXX#`) are unkeyed and trivially guessable,
127
+ * so a prompt-injected model can plant one in any record it influences. Every
128
+ * agent-feeding path (resume, history rewrite, branch switch) therefore restores
129
+ * keyed placeholders ONLY (`allowLegacyAliases` false), leaving legacy tokens
130
+ * inert; display-only transcripts that are never re-obfuscated opt in via
131
+ * `allowLegacyAliases`.
33
132
  */
34
- export declare function deobfuscateSessionContext(sessionContext: SessionContext, obfuscator: SecretObfuscator | undefined): SessionContext;
35
- export declare function deobfuscateAgentMessages(obfuscator: SecretObfuscator, messages: AgentMessage[]): AgentMessage[];
133
+ export declare function deobfuscateSessionContext(sessionContext: SessionContext, obfuscator: SecretObfuscator | undefined, allowLegacyAliases?: boolean): SessionContext;
134
+ export declare function deobfuscateAgentMessages(obfuscator: SecretObfuscator, messages: AgentMessage[], allowLegacyAliases?: boolean): AgentMessage[];
36
135
  /**
37
136
  * Restore placeholders in assistant content: visible text and tool-call
38
137
  * arguments/intent/rawBlock. Thinking and signatures are opaque
39
138
  * provider-replay/hidden-reasoning data and pass through byte-identical.
40
139
  */
41
- export declare function deobfuscateAssistantContent(obfuscator: SecretObfuscator, content: AssistantMessage["content"]): AssistantMessage["content"];
140
+ export declare function deobfuscateAssistantContent(obfuscator: SecretObfuscator, content: AssistantMessage["content"], allowLegacyAliases?: boolean): AssistantMessage["content"];
42
141
  /**
43
142
  * Restore placeholders inside a tool call's arguments. Arguments are arbitrary
44
143
  * model-authored JSON, so tool-call arguments are the ONLY place a recursive
45
144
  * JSON walk runs.
46
145
  */
47
- export declare function deobfuscateToolArguments(obfuscator: SecretObfuscator, args: Record<string, unknown>): Record<string, unknown>;
146
+ export declare function deobfuscateToolArguments(obfuscator: SecretObfuscator, args: Record<string, unknown>, allowLegacyAliases?: boolean): Record<string, unknown>;
48
147
  /** Redact secrets inside a tool call's arguments (same JSON-walk exception as {@link deobfuscateToolArguments}). */
49
- export declare function obfuscateToolArguments(obfuscator: SecretObfuscator, args: Record<string, unknown>): Record<string, unknown>;
50
- /**
51
- * Redact secrets from outbound messages. Opt-in by origin: only user messages,
52
- * tool results, and user-authored developer messages (e.g. `@file` mentions)
53
- * can carry operator secrets. System prompts, tool schemas, and assistant
54
- * output are author-controlled or model-generated and pass through untouched.
55
- * Within a targeted message only `text` blocks are rewritten — inline image
56
- * bytes are never walked.
148
+ export declare function obfuscateToolArguments(obfuscator: SecretObfuscator, args: Record<string, unknown>, sharedRegexSecretValues?: ReadonlySet<string>): Record<string, unknown>;
149
+ /**
150
+ * Redact secrets from outbound messages. User messages, tool results, and
151
+ * user-authored developer messages (e.g. `@file` mentions) are obfuscated.
152
+ * Assistant replay content is re-obfuscated too, because session restoration
153
+ * expands keyed placeholders locally before the next provider request. Inline
154
+ * image bytes are never walked.
57
155
  */
58
156
  export declare function obfuscateMessages(obfuscator: SecretObfuscator, messages: Message[]): Message[];
59
157
  /**
@@ -0,0 +1,19 @@
1
+ import type { ClientBridgePermissionOption } from "./client-bridge.js";
2
+ /** Tools that require user permission before execution when an ACP client is connected. */
3
+ export declare const PERMISSION_REQUIRED_TOOLS: Record<string, true>;
4
+ /** Permission options presented to the client on each gated tool call. */
5
+ export declare const PERMISSION_OPTIONS: ClientBridgePermissionOption[];
6
+ /** Permission options indexed by their wire identifiers; unknown IDs miss and fail closed. */
7
+ export declare const PERMISSION_OPTIONS_BY_ID: Map<string, ClientBridgePermissionOption>;
8
+ /** Describes the permission prompt required for a destructive tool call. */
9
+ export declare function getPermissionIntent(toolName: string, args: unknown): {
10
+ toolName: string;
11
+ title: string;
12
+ paths?: string[];
13
+ cacheKey: string;
14
+ } | undefined;
15
+ /** Converts tool path arguments into absolute ACP editor locations. */
16
+ export declare function extractPermissionLocations(args: unknown, cwd: string, explicitPaths?: string[]): {
17
+ path: string;
18
+ line?: number;
19
+ }[];
@@ -0,0 +1,84 @@
1
+ import type { AgentEvent, ThinkingLevel } from "@oh-my-pi/pi-agent-core";
2
+ import type { CompactionResult } from "@oh-my-pi/pi-agent-core/compaction";
3
+ import type { Effort } from "@oh-my-pi/pi-ai";
4
+ import type { Rule } from "../capability/rule.js";
5
+ import type { RecoveredRetryError } from "../extensibility/shared-events.js";
6
+ import type { Goal, GoalModeState } from "../goals/state.js";
7
+ import type { ConfiguredThinkingLevel } from "../thinking.js";
8
+ import type { TodoItem } from "../tools/todo.js";
9
+ import type { CustomMessage } from "./messages.js";
10
+ /** Session-specific events that extend the core AgentEvent. */
11
+ export type AgentSessionEvent = Exclude<AgentEvent, {
12
+ type: "agent_end";
13
+ }> | (Extract<AgentEvent, {
14
+ type: "agent_end";
15
+ }> & {
16
+ /** False when an async delivery will resume the session before its true final settle. */
17
+ isTerminal?: boolean;
18
+ }) | {
19
+ type: "auto_compaction_start";
20
+ reason: "threshold" | "overflow" | "idle" | "incomplete";
21
+ action: "context-full" | "handoff" | "shake" | "snapcompact";
22
+ } | {
23
+ type: "auto_compaction_end";
24
+ action: "context-full" | "handoff" | "shake" | "snapcompact";
25
+ result: CompactionResult | undefined;
26
+ aborted: boolean;
27
+ willRetry: boolean;
28
+ errorMessage?: string;
29
+ /** True when compaction was skipped for a benign reason. */
30
+ skipped?: boolean;
31
+ } | {
32
+ type: "auto_retry_start";
33
+ attempt: number;
34
+ maxAttempts: number;
35
+ delayMs: number;
36
+ errorMessage: string;
37
+ errorId?: number;
38
+ } | {
39
+ type: "auto_retry_end";
40
+ success: boolean;
41
+ attempt: number;
42
+ finalError?: string;
43
+ recoveredErrors?: RecoveredRetryError[];
44
+ } | {
45
+ type: "retry_fallback_applied";
46
+ from: string;
47
+ to: string;
48
+ role: string;
49
+ } | {
50
+ type: "retry_fallback_succeeded";
51
+ model: string;
52
+ role: string;
53
+ } | {
54
+ type: "ttsr_triggered";
55
+ rules: Rule[];
56
+ } | {
57
+ type: "todo_reminder";
58
+ todos: TodoItem[];
59
+ attempt: number;
60
+ maxAttempts: number;
61
+ } | {
62
+ type: "todo_auto_clear";
63
+ } | {
64
+ type: "irc_message";
65
+ message: CustomMessage;
66
+ } | {
67
+ type: "notice";
68
+ level: "info" | "warning" | "error";
69
+ message: string;
70
+ source?: string;
71
+ } | {
72
+ type: "thinking_level_changed";
73
+ thinkingLevel: ThinkingLevel | undefined;
74
+ /** The user-configured selector when it differs from the effective level. */
75
+ configured?: ConfiguredThinkingLevel;
76
+ /** The level `auto` resolved to this turn, once classified. */
77
+ resolved?: Effort;
78
+ } | {
79
+ type: "goal_updated";
80
+ goal: Goal | null;
81
+ state?: GoalModeState;
82
+ };
83
+ /** Listener function for agent session events. */
84
+ export type AgentSessionEventListener = (event: AgentSessionEvent) => void;