@gajae-code/coding-agent 0.11.1 → 0.11.2

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 (404) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/dist/types/cli/config-cli.d.ts +11 -1
  3. package/dist/types/cli/notify-cli.d.ts +1 -0
  4. package/dist/types/cli/session-picker.d.ts +2 -1
  5. package/dist/types/cli/setup-cli.d.ts +1 -1
  6. package/dist/types/commands/mcp-serve.d.ts +33 -0
  7. package/dist/types/commands/mcp.d.ts +1 -1
  8. package/dist/types/commands/notify.d.ts +0 -2
  9. package/dist/types/commands/sdk.d.ts +1 -1
  10. package/dist/types/config/atomic-yaml-patch.d.ts +18 -0
  11. package/dist/types/config/file-lock.d.ts +14 -4
  12. package/dist/types/config/keybindings.d.ts +42 -1
  13. package/dist/types/config/model-auth.d.ts +3 -0
  14. package/dist/types/config/model-bindings-applier.d.ts +13 -0
  15. package/dist/types/config/model-discovery-manager.d.ts +49 -0
  16. package/dist/types/config/model-equivalence.d.ts +20 -0
  17. package/dist/types/config/model-registry.d.ts +16 -15
  18. package/dist/types/config/model-resolver.d.ts +28 -18
  19. package/dist/types/config/models-config-schema.d.ts +11 -0
  20. package/dist/types/config/settings-schema.d.ts +56 -1
  21. package/dist/types/config/settings.d.ts +14 -11
  22. package/dist/types/coordinator-mcp/policy.d.ts +5 -0
  23. package/dist/types/coordinator-mcp/question-gate-codec.d.ts +129 -0
  24. package/dist/types/coordinator-mcp/question-state.d.ts +356 -0
  25. package/dist/types/coordinator-mcp/server.d.ts +4 -0
  26. package/dist/types/discovery/helpers.d.ts +0 -6
  27. package/dist/types/edit/index.d.ts +3 -0
  28. package/dist/types/eval/py/env.d.ts +9 -0
  29. package/dist/types/extensibility/extensions/loader.d.ts +2 -1
  30. package/dist/types/extensibility/extensions/runner.d.ts +2 -2
  31. package/dist/types/extensibility/extensions/types.d.ts +34 -3
  32. package/dist/types/extensibility/hooks/runner.d.ts +1 -1
  33. package/dist/types/extensibility/shared-events.d.ts +2 -0
  34. package/dist/types/gjc-runtime/deep-interview-recorder.d.ts +10 -1
  35. package/dist/types/gjc-runtime/deep-interview-state.d.ts +44 -0
  36. package/dist/types/gjc-runtime/goal-mode-request.d.ts +11 -1
  37. package/dist/types/gjc-runtime/launch-worktree.d.ts +4 -2
  38. package/dist/types/gjc-runtime/linux-proc.d.ts +29 -0
  39. package/dist/types/gjc-runtime/session-resolution.d.ts +2 -2
  40. package/dist/types/gjc-runtime/state-migrations.d.ts +1 -1
  41. package/dist/types/gjc-runtime/state-writer.d.ts +2 -1
  42. package/dist/types/gjc-runtime/team-launch.d.ts +59 -0
  43. package/dist/types/gjc-runtime/team-notify.d.ts +45 -0
  44. package/dist/types/gjc-runtime/team-runtime.d.ts +29 -121
  45. package/dist/types/gjc-runtime/team-store.d.ts +160 -0
  46. package/dist/types/gjc-runtime/team-workers.d.ts +78 -0
  47. package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +8 -0
  48. package/dist/types/gjc-runtime/ultragoal-change-set.d.ts +13 -0
  49. package/dist/types/gjc-runtime/ultragoal-evidence.d.ts +38 -0
  50. package/dist/types/gjc-runtime/ultragoal-guard.d.ts +7 -0
  51. package/dist/types/gjc-runtime/ultragoal-pipeline.d.ts +23 -0
  52. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +55 -33
  53. package/dist/types/gjc-runtime/workflow-cli-common.d.ts +8 -0
  54. package/dist/types/gjc-runtime/workflow-manifest.d.ts +3 -0
  55. package/dist/types/goals/continuation-timeout-guard.d.ts +22 -0
  56. package/dist/types/goals/runtime.d.ts +1 -0
  57. package/dist/types/goals/state.d.ts +8 -0
  58. package/dist/types/harness-control-plane/lifecycle-reconciliation.d.ts +17 -0
  59. package/dist/types/harness-control-plane/phase-rollup.d.ts +4 -7
  60. package/dist/types/harness-control-plane/receipt-ingest.d.ts +5 -0
  61. package/dist/types/harness-control-plane/receipt-spool.d.ts +4 -0
  62. package/dist/types/hindsight/state.d.ts +11 -4
  63. package/dist/types/lsp/lspmux.d.ts +5 -3
  64. package/dist/types/lsp/path-trust.d.ts +1 -0
  65. package/dist/types/main.d.ts +3 -2
  66. package/dist/types/memories/storage.d.ts +1 -0
  67. package/dist/types/modes/action-registry.d.ts +29 -0
  68. package/dist/types/modes/components/chrome.d.ts +14 -0
  69. package/dist/types/modes/components/command-palette.d.ts +27 -0
  70. package/dist/types/modes/components/custom-provider-wizard.d.ts +1 -0
  71. package/dist/types/modes/components/index.d.ts +2 -1
  72. package/dist/types/modes/components/pet-selector.d.ts +1 -1
  73. package/dist/types/modes/components/plan-preview-overlay.d.ts +43 -0
  74. package/dist/types/modes/components/queue-mode-selector.d.ts +1 -1
  75. package/dist/types/modes/components/queue-pane.d.ts +12 -0
  76. package/dist/types/modes/components/read-tool-group.d.ts +6 -0
  77. package/dist/types/modes/components/session-observer-overlay.d.ts +3 -4
  78. package/dist/types/modes/components/sessions-dashboard.d.ts +32 -0
  79. package/dist/types/modes/components/settings-selector.d.ts +1 -1
  80. package/dist/types/modes/components/show-images-selector.d.ts +1 -1
  81. package/dist/types/modes/components/status-line/types.d.ts +1 -1
  82. package/dist/types/modes/components/status-line.d.ts +1 -94
  83. package/dist/types/modes/components/tasks-pane.d.ts +15 -0
  84. package/dist/types/modes/components/theme-selector.d.ts +1 -1
  85. package/dist/types/modes/components/tool-execution.d.ts +15 -0
  86. package/dist/types/modes/components/tool-status-header.d.ts +111 -0
  87. package/dist/types/modes/components/transcript-viewer-overlay.d.ts +42 -0
  88. package/dist/types/modes/controllers/goal-mode-controller.d.ts +62 -0
  89. package/dist/types/modes/controllers/input-controller.d.ts +8 -1
  90. package/dist/types/modes/controllers/mode-gate.d.ts +8 -0
  91. package/dist/types/modes/controllers/plan-mode-controller.d.ts +65 -0
  92. package/dist/types/modes/controllers/selector-controller.d.ts +15 -3
  93. package/dist/types/modes/controllers/stt-controller.d.ts +26 -0
  94. package/dist/types/modes/interactive-mode.d.ts +19 -17
  95. package/dist/types/modes/jobs-observer.d.ts +2 -0
  96. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -11
  97. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +20 -2
  98. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +31 -0
  99. package/dist/types/modes/tasks-aggregator.d.ts +39 -0
  100. package/dist/types/modes/transcript-item-registry.d.ts +60 -0
  101. package/dist/types/modes/types.d.ts +20 -13
  102. package/dist/types/modes/utils/ui-helpers.d.ts +2 -2
  103. package/dist/types/runtime-mcp/manager.d.ts +1 -1
  104. package/dist/types/sdk/broker/broker.d.ts +78 -12
  105. package/dist/types/sdk/broker/lifecycle-codec.d.ts +4 -0
  106. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +15 -1
  107. package/dist/types/sdk/broker/lifecycle.d.ts +6 -2
  108. package/dist/types/sdk/broker/process-incarnation.d.ts +2 -0
  109. package/dist/types/sdk/broker/session-index.d.ts +0 -1
  110. package/dist/types/sdk/broker/state-version.d.ts +2 -0
  111. package/dist/types/sdk/bus/chat-effect-journal.d.ts +1 -0
  112. package/dist/types/sdk/bus/config-commands.d.ts +1 -1
  113. package/dist/types/sdk/bus/config.d.ts +11 -0
  114. package/dist/types/sdk/bus/daemon-paths.d.ts +1 -0
  115. package/dist/types/sdk/bus/html-format.d.ts +3 -2
  116. package/dist/types/sdk/bus/index.d.ts +27 -0
  117. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +4 -0
  118. package/dist/types/sdk/bus/notification-service.d.ts +20 -0
  119. package/dist/types/sdk/bus/rate-limit-pool.d.ts +13 -2
  120. package/dist/types/sdk/bus/recent-activity.d.ts +21 -12
  121. package/dist/types/sdk/bus/rich-document.d.ts +7 -0
  122. package/dist/types/sdk/bus/rich-render.d.ts +18 -41
  123. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +9 -4
  124. package/dist/types/sdk/bus/telegram-daemon.d.ts +46 -3
  125. package/dist/types/sdk/bus/threaded-inbound.d.ts +1 -1
  126. package/dist/types/sdk/bus/threaded-render.d.ts +13 -0
  127. package/dist/types/sdk/bus/topic-registry.d.ts +24 -2
  128. package/dist/types/sdk/host/control/operations.d.ts +1 -1
  129. package/dist/types/sdk/host/host.d.ts +2 -0
  130. package/dist/types/sdk/index.d.ts +1 -0
  131. package/dist/types/sdk/session-directory.d.ts +56 -0
  132. package/dist/types/session/agent-session.d.ts +82 -47
  133. package/dist/types/session/agent-storage.d.ts +7 -0
  134. package/dist/types/session/fallback-chain-controller.d.ts +10 -2
  135. package/dist/types/session/internal/managed-session-scope.d.ts +102 -0
  136. package/dist/types/session/internal/managed-session-storage.d.ts +38 -0
  137. package/dist/types/session/messages.d.ts +16 -0
  138. package/dist/types/session/session-manager-internal.d.ts +14 -0
  139. package/dist/types/session/session-manager.d.ts +82 -12
  140. package/dist/types/session/session-storage.d.ts +43 -3
  141. package/dist/types/session/volatile-context-pruning.d.ts +15 -0
  142. package/dist/types/skill-state/{deep-interview-mutation-guard.d.ts → workflow-mutation-guard.d.ts} +24 -8
  143. package/dist/types/skill-state/workflow-state-contract.d.ts +1 -3
  144. package/dist/types/slash-commands/builtin-registry.d.ts +4 -1
  145. package/dist/types/system-prompt.d.ts +2 -11
  146. package/dist/types/task/executor.d.ts +3 -1
  147. package/dist/types/thinking.d.ts +7 -0
  148. package/dist/types/tool-discovery/tool-index.d.ts +1 -50
  149. package/dist/types/tools/ask.d.ts +64 -2
  150. package/dist/types/tools/bash.d.ts +3 -0
  151. package/dist/types/tools/browser/dead-tab-recovery.d.ts +24 -0
  152. package/dist/types/tools/browser/tab-supervisor.d.ts +21 -0
  153. package/dist/types/tools/cron.d.ts +2 -0
  154. package/dist/types/tools/fetch.d.ts +1 -0
  155. package/dist/types/tools/index.d.ts +30 -15
  156. package/dist/types/tools/output-meta.d.ts +1 -0
  157. package/dist/types/tools/read.d.ts +3 -0
  158. package/dist/types/tools/search-tool-bm25.d.ts +3 -4
  159. package/dist/types/utils/event-bus.d.ts +1 -1
  160. package/dist/types/web/search/index.d.ts +3 -1
  161. package/package.json +21 -9
  162. package/scripts/build-sdk-package-smoke.ts +34 -1
  163. package/scripts/generate-hotkeys-docs.ts +74 -0
  164. package/scripts/generate-sdk-operation-inventory.ts +64 -20
  165. package/scripts/verify-gjc-sdk-canonicalization.ts +182 -2
  166. package/src/async/job-manager.ts +49 -6
  167. package/src/cli/config-cli.ts +75 -2
  168. package/src/cli/notify-cli.ts +92 -26
  169. package/src/cli/session-picker.ts +20 -3
  170. package/src/cli/setup-cli.ts +1 -1
  171. package/src/cli.ts +1 -1
  172. package/src/commands/config.ts +1 -1
  173. package/src/commands/harness.ts +34 -106
  174. package/src/commands/launch.ts +6 -4
  175. package/src/commands/mcp-serve.ts +85 -8
  176. package/src/commands/mcp.ts +2 -2
  177. package/src/commands/notify.ts +8 -4
  178. package/src/commands/sdk.ts +61 -40
  179. package/src/commands/ultragoal.ts +4 -1
  180. package/src/config/atomic-yaml-patch.ts +80 -13
  181. package/src/config/file-lock.ts +105 -43
  182. package/src/config/keybindings.ts +64 -20
  183. package/src/config/model-auth.ts +9 -0
  184. package/src/config/model-bindings-applier.ts +139 -0
  185. package/src/config/model-discovery-manager.ts +224 -0
  186. package/src/config/model-equivalence.ts +66 -0
  187. package/src/config/model-registry.ts +169 -302
  188. package/src/config/model-resolver.ts +361 -369
  189. package/src/config/models-config-schema.ts +5 -4
  190. package/src/config/settings-schema.ts +159 -2
  191. package/src/config/settings.ts +458 -482
  192. package/src/coordinator-mcp/policy.ts +76 -11
  193. package/src/coordinator-mcp/question-gate-codec.ts +274 -0
  194. package/src/coordinator-mcp/question-state.ts +778 -0
  195. package/src/coordinator-mcp/server.ts +1702 -238
  196. package/src/debug/index.ts +1 -1
  197. package/src/defaults/gjc/skills/deep-interview/SKILL.md +13 -1
  198. package/src/defaults/gjc/skills/team/SKILL.md +16 -0
  199. package/src/discovery/helpers.ts +1 -50
  200. package/src/edit/index.ts +64 -0
  201. package/src/eval/py/env.ts +26 -0
  202. package/src/eval/py/kernel.ts +5 -3
  203. package/src/extensibility/extensions/loader.ts +9 -1
  204. package/src/extensibility/extensions/runner.ts +12 -3
  205. package/src/extensibility/extensions/types.ts +39 -1
  206. package/src/extensibility/gjc-plugins/installer.ts +16 -16
  207. package/src/extensibility/hooks/runner.ts +2 -2
  208. package/src/extensibility/runtime-skill-discovery.ts +33 -13
  209. package/src/extensibility/shared-events.ts +2 -0
  210. package/src/gjc-runtime/deep-interview-recorder.ts +63 -3
  211. package/src/gjc-runtime/deep-interview-runtime.ts +76 -27
  212. package/src/gjc-runtime/deep-interview-state.ts +317 -5
  213. package/src/gjc-runtime/goal-mode-request.ts +55 -8
  214. package/src/gjc-runtime/launch-tmux.ts +2 -5
  215. package/src/gjc-runtime/launch-worktree.ts +5 -5
  216. package/src/gjc-runtime/linux-proc.ts +71 -0
  217. package/src/gjc-runtime/ralplan-runtime.ts +74 -90
  218. package/src/gjc-runtime/session-resolution.ts +18 -3
  219. package/src/gjc-runtime/session-state-sidecar.ts +6 -107
  220. package/src/gjc-runtime/state-migrations.ts +1 -1
  221. package/src/gjc-runtime/state-runtime.ts +320 -249
  222. package/src/gjc-runtime/state-writer.ts +36 -40
  223. package/src/gjc-runtime/team-launch.ts +319 -0
  224. package/src/gjc-runtime/team-notify.ts +326 -0
  225. package/src/gjc-runtime/team-runtime.ts +1099 -1482
  226. package/src/gjc-runtime/team-store.ts +828 -0
  227. package/src/gjc-runtime/team-workers.ts +962 -0
  228. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +2 -11
  229. package/src/gjc-runtime/tmux-owner-isolation.ts +14 -9
  230. package/src/gjc-runtime/tmux-sessions.ts +4 -21
  231. package/src/gjc-runtime/ultragoal-change-set.ts +172 -0
  232. package/src/gjc-runtime/ultragoal-evidence.ts +874 -0
  233. package/src/gjc-runtime/ultragoal-guard.ts +29 -5
  234. package/src/gjc-runtime/ultragoal-pipeline.ts +306 -0
  235. package/src/gjc-runtime/ultragoal-runtime.ts +84 -1311
  236. package/src/gjc-runtime/workflow-cli-common.ts +30 -0
  237. package/src/gjc-runtime/workflow-manifest.generated.json +58 -0
  238. package/src/gjc-runtime/workflow-manifest.ts +18 -0
  239. package/src/goals/continuation-timeout-guard.ts +79 -0
  240. package/src/goals/runtime.ts +7 -5
  241. package/src/goals/state.ts +18 -0
  242. package/src/harness-control-plane/lifecycle-reconciliation.ts +64 -0
  243. package/src/harness-control-plane/phase-rollup.ts +4 -7
  244. package/src/harness-control-plane/receipt-ingest.ts +5 -0
  245. package/src/harness-control-plane/receipt-spool.ts +51 -7
  246. package/src/harness-control-plane/session-lease.ts +12 -130
  247. package/src/hindsight/backend.ts +26 -27
  248. package/src/hindsight/state.ts +101 -32
  249. package/src/hooks/skill-state.ts +17 -11
  250. package/src/internal-urls/docs-index.generated.ts +21 -18
  251. package/src/lsp/client.ts +1 -1
  252. package/src/lsp/config.ts +145 -26
  253. package/src/lsp/index.ts +1 -1
  254. package/src/lsp/lspmux.ts +39 -10
  255. package/src/lsp/path-trust.ts +81 -0
  256. package/src/main.ts +28 -8
  257. package/src/memories/index.ts +1 -0
  258. package/src/memories/storage.ts +6 -2
  259. package/src/modes/action-registry.ts +165 -0
  260. package/src/modes/components/chrome.ts +40 -0
  261. package/src/modes/components/command-palette.ts +168 -0
  262. package/src/modes/components/custom-editor.ts +1 -1
  263. package/src/modes/components/custom-provider-wizard.ts +51 -14
  264. package/src/modes/components/index.ts +2 -1
  265. package/src/modes/components/pet-selector.ts +11 -17
  266. package/src/modes/components/plan-preview-overlay.ts +295 -0
  267. package/src/modes/components/queue-mode-selector.ts +10 -27
  268. package/src/modes/components/queue-pane.ts +79 -0
  269. package/src/modes/components/read-tool-group.ts +13 -0
  270. package/src/modes/components/session-observer-overlay.ts +207 -772
  271. package/src/modes/components/sessions-dashboard.ts +181 -0
  272. package/src/modes/components/settings-selector.ts +1 -1
  273. package/src/modes/components/show-images-selector.ts +10 -24
  274. package/src/modes/components/status-line/types.ts +1 -1
  275. package/src/modes/components/status-line.ts +1 -969
  276. package/src/modes/components/tasks-pane.ts +73 -0
  277. package/src/modes/components/theme-selector.ts +11 -31
  278. package/src/modes/components/tool-execution.ts +22 -0
  279. package/src/modes/components/tool-status-header.ts +1056 -0
  280. package/src/modes/components/transcript-viewer-overlay.ts +384 -0
  281. package/src/modes/controllers/btw-controller.ts +1 -0
  282. package/src/modes/controllers/event-controller.ts +3 -2
  283. package/src/modes/controllers/extension-ui-controller.ts +24 -1
  284. package/src/modes/controllers/goal-mode-controller.ts +474 -0
  285. package/src/modes/controllers/input-controller.ts +764 -229
  286. package/src/modes/controllers/mode-gate.ts +24 -0
  287. package/src/modes/controllers/plan-mode-controller.ts +517 -0
  288. package/src/modes/controllers/selector-controller.ts +225 -10
  289. package/src/modes/controllers/stt-controller.ts +125 -0
  290. package/src/modes/interactive-mode.ts +289 -1150
  291. package/src/modes/jobs-observer.ts +3 -0
  292. package/src/modes/runtime-init.ts +8 -0
  293. package/src/modes/shared/agent-wire/deep-interview-gate.ts +31 -106
  294. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +71 -16
  295. package/src/modes/shared/agent-wire/workflow-gate-types.ts +177 -0
  296. package/src/modes/tasks-aggregator.ts +199 -0
  297. package/src/modes/transcript-item-registry.ts +229 -0
  298. package/src/modes/types.ts +45 -18
  299. package/src/modes/utils/ui-helpers.ts +17 -9
  300. package/src/prompts/agent-fragments/ralplan-persistence.md +6 -0
  301. package/src/prompts/agent-fragments/restricted-bash.md +1 -0
  302. package/src/prompts/agents/architect.md +2 -8
  303. package/src/prompts/agents/critic.md +2 -8
  304. package/src/prompts/agents/executor.md +3 -0
  305. package/src/prompts/agents/planner.md +4 -12
  306. package/src/prompts/system/custom-system-prompt.md +1 -23
  307. package/src/prompts/system/plan-mode-approved.md +8 -0
  308. package/src/prompts/system/system-prompt.md +17 -96
  309. package/src/prompts/tools/bash.md +4 -4
  310. package/src/prompts/tools/browser.md +15 -52
  311. package/src/prompts/tools/find.md +2 -2
  312. package/src/prompts/tools/hashline.md +13 -55
  313. package/src/prompts/tools/read.md +3 -6
  314. package/src/prompts/tools/search-tool-bm25.md +0 -2
  315. package/src/prompts/tools/search.md +2 -4
  316. package/src/prompts/tools/skill-discovery.md +1 -2
  317. package/src/prompts/tools/task.md +1 -1
  318. package/src/runtime-mcp/manager.ts +1 -1
  319. package/src/sdk/broker/broker.ts +206 -78
  320. package/src/sdk/broker/discovery.ts +1 -1
  321. package/src/sdk/broker/ensure.ts +3 -1
  322. package/src/sdk/broker/lifecycle-codec.ts +11 -0
  323. package/src/sdk/broker/lifecycle-ledger.ts +371 -74
  324. package/src/sdk/broker/lifecycle.ts +1399 -142
  325. package/src/sdk/broker/process-incarnation.ts +5 -13
  326. package/src/sdk/broker/session-index.ts +145 -56
  327. package/src/sdk/broker/state-version.ts +21 -0
  328. package/src/sdk/broker/transport.ts +1 -1
  329. package/src/sdk/bus/chat-daemon-cli.ts +2 -0
  330. package/src/sdk/bus/chat-daemon-control.ts +8 -28
  331. package/src/sdk/bus/chat-effect-journal.ts +10 -2
  332. package/src/sdk/bus/config-commands.ts +5 -4
  333. package/src/sdk/bus/config.ts +98 -0
  334. package/src/sdk/bus/conversation-store.ts +5 -29
  335. package/src/sdk/bus/daemon-paths.ts +2 -0
  336. package/src/sdk/bus/html-format.ts +20 -3
  337. package/src/sdk/bus/index.ts +778 -93
  338. package/src/sdk/bus/lifecycle-control-runtime.ts +91 -33
  339. package/src/sdk/bus/natives-augment.d.ts +26 -1
  340. package/src/sdk/bus/notification-service.ts +168 -20
  341. package/src/sdk/bus/rate-limit-pool.ts +58 -14
  342. package/src/sdk/bus/recent-activity.ts +188 -74
  343. package/src/sdk/bus/rich-document.ts +258 -0
  344. package/src/sdk/bus/rich-render.ts +62 -70
  345. package/src/sdk/bus/telegram-daemon-cli.ts +15 -59
  346. package/src/sdk/bus/telegram-daemon-contract.ts +9 -4
  347. package/src/sdk/bus/telegram-daemon.ts +1389 -237
  348. package/src/sdk/bus/threaded-inbound.ts +8 -3
  349. package/src/sdk/bus/threaded-render.ts +57 -1
  350. package/src/sdk/bus/topic-registry.ts +120 -13
  351. package/src/sdk/host/control/dispatch.ts +14 -2
  352. package/src/sdk/host/control/operations.ts +6 -1
  353. package/src/sdk/host/host.ts +31 -1
  354. package/src/sdk/host/query/handlers.ts +20 -22
  355. package/src/sdk/host/query/revision-store.ts +80 -57
  356. package/src/sdk/index.ts +1 -0
  357. package/src/sdk/protocol/operation-inventory.generated.json +943 -1907
  358. package/src/sdk/session-directory.ts +141 -0
  359. package/src/sdk/session.ts +458 -479
  360. package/src/session/agent-session.ts +1700 -583
  361. package/src/session/agent-storage.ts +18 -0
  362. package/src/session/cache-economics.ts +25 -8
  363. package/src/session/fallback-chain-controller.ts +53 -3
  364. package/src/session/internal/managed-session-scope.ts +2226 -0
  365. package/src/session/internal/managed-session-storage.ts +453 -0
  366. package/src/session/messages.ts +91 -2
  367. package/src/session/session-manager-internal.ts +33 -0
  368. package/src/session/session-manager.ts +1112 -333
  369. package/src/session/session-storage.ts +444 -39
  370. package/src/session/volatile-context-pruning.ts +78 -0
  371. package/src/setup/credential-auto-import.ts +2 -1
  372. package/src/setup/hermes/templates/operator-instructions.v1.md +1 -1
  373. package/src/setup/provider-onboarding.ts +36 -61
  374. package/src/setup/provider-presets.json +5 -0
  375. package/src/skill-state/active-state.ts +3 -13
  376. package/src/skill-state/{deep-interview-mutation-guard.ts → workflow-mutation-guard.ts} +47 -29
  377. package/src/skill-state/workflow-state-contract.ts +6 -41
  378. package/src/slash-commands/builtin-registry.ts +46 -11
  379. package/src/system-prompt.ts +37 -44
  380. package/src/task/agents.ts +19 -1
  381. package/src/task/executor.ts +90 -6
  382. package/src/task/index.ts +36 -21
  383. package/src/thinking.ts +21 -6
  384. package/src/tool-discovery/tool-index.ts +2 -134
  385. package/src/tools/ask.ts +157 -21
  386. package/src/tools/ast-edit.ts +1 -1
  387. package/src/tools/bash.ts +38 -0
  388. package/src/tools/browser/dead-tab-recovery.ts +78 -0
  389. package/src/tools/browser/tab-supervisor.ts +282 -36
  390. package/src/tools/computer.ts +10 -3
  391. package/src/tools/cron.ts +30 -16
  392. package/src/tools/eval.ts +1 -2
  393. package/src/tools/fetch.ts +11 -4
  394. package/src/tools/index.ts +76 -24
  395. package/src/tools/output-meta.ts +13 -5
  396. package/src/tools/read.ts +37 -1
  397. package/src/tools/resource-gc.ts +2 -2
  398. package/src/tools/search-tool-bm25.ts +11 -74
  399. package/src/utils/event-bus.ts +9 -4
  400. package/src/web/search/index.ts +3 -3
  401. package/dist/types/discovery/plugin-dir-roots.d.ts +0 -15
  402. package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +0 -7
  403. package/src/discovery/plugin-dir-roots.ts +0 -28
  404. package/src/runtime-mcp/discoverable-tool-metadata.ts +0 -25
@@ -18,6 +18,11 @@ export interface DaemonState {
18
18
  startedAt: number;
19
19
  heartbeatAt: number;
20
20
  roots: string[];
21
+ /**
22
+ * Present only for the Windows source-launch handoff. `pid` starts as this
23
+ * short-lived launcher PID and may be rebound exactly once to the daemon PID.
24
+ */
25
+ launcherPid?: number;
21
26
  version: 1;
22
27
  /**
23
28
  * Operational daemon generation of the process that owns the lock, distinct
@@ -55,6 +60,8 @@ export interface TelegramDaemonDeps {
55
60
  logPath?: string;
56
61
  }) => SpawnResult;
57
62
  execPath?: string;
63
+ /** Injectable platform seam for source-linked Windows daemon spawning. */
64
+ platform?: NodeJS.Platform;
58
65
  randomId?: () => string;
59
66
  /**
60
67
  * Signal delivery + poll timing for the stale-generation reload handoff in
@@ -73,6 +80,11 @@ export declare const CLIENT_PING_PONG_CAPABILITY = "client_ping_pong";
73
80
  /** Capability required for typed controls and semantic Selected acknowledgement frames. */
74
81
  export declare const ASK_SELECTED_ACK_CAPABILITY = "ask_selected_ack_v1";
75
82
  export declare const ASK_CONTROLS_CAPABILITY = "ask_controls_v1";
83
+ /** Capability required for tool lifecycle and reasoning-summary frames. */
84
+ export declare const TOOL_ACTIVITY_CAPABILITY = "tool_activity_v1";
85
+ export declare const BTW_QUESTION_MAX_UNICODE_SCALARS = 4096;
86
+ export declare const BTW_QUESTION_MAX_UTF8_BYTES = 16384;
87
+ export declare function endpointAuthorityDigest(url: string, token: string, connectionIdentity?: string): string;
76
88
  export { type DaemonPaths, daemonPaths } from "./daemon-paths";
77
89
  export declare function deriveLifecycleAuditRedactionKey(botToken: string): Uint8Array;
78
90
  /**
@@ -126,6 +138,10 @@ export declare function acquireDaemonOwnership(input: {
126
138
  pid?: number;
127
139
  pidAlive?: (pid: number) => boolean;
128
140
  randomId?: () => string;
141
+ /** Permit one Windows source launcher PID to daemon PID handoff. */
142
+ allowPidRebind?: boolean;
143
+ /** A caller-supplied opaque owner identity, used when the launcher PID is not durable. */
144
+ ownerId?: string;
129
145
  }): Promise<{
130
146
  acquired: boolean;
131
147
  ownerId?: string;
@@ -137,13 +153,22 @@ export declare function acquireDaemonOwnership(input: {
137
153
  export declare function renewDaemonHeartbeat(input: {
138
154
  settings: Settings;
139
155
  ownerId: string;
156
+ /** Bind a daemon heartbeat to the Telegram identity that acquired the lock. */
157
+ tokenFingerprint: string;
158
+ chatId: string;
159
+ /** Require the current daemon PID after the launcher-to-daemon PID rebind. */
160
+ pid: number;
140
161
  fs?: TelegramDaemonFs;
141
162
  now?: () => number;
142
- pid?: number;
143
163
  }): Promise<boolean>;
144
164
  export declare function releaseDaemonOwnership(input: {
145
165
  settings: Settings;
146
166
  ownerId: string;
167
+ /** Bind release to the Telegram identity that acquired the lock. */
168
+ tokenFingerprint: string;
169
+ chatId: string;
170
+ /** Require the current daemon PID after the launcher-to-daemon PID rebind. */
171
+ pid: number;
147
172
  fs?: TelegramDaemonFs;
148
173
  now?: () => number;
149
174
  }): Promise<void>;
@@ -298,6 +323,9 @@ export interface TelegramDaemonOptions {
298
323
  clearTimeoutImpl?: typeof clearTimeout;
299
324
  setIntervalImpl?: typeof setInterval;
300
325
  clearIntervalImpl?: typeof clearInterval;
326
+ btw?: {
327
+ enabled: boolean;
328
+ };
301
329
  idleTimeoutMs?: number;
302
330
  scanIntervalMs?: number;
303
331
  pid?: number;
@@ -346,6 +374,8 @@ interface SessionSocket {
346
374
  logicalSessionId: string;
347
375
  token: string;
348
376
  endpointKey: string;
377
+ endpointDigest: string;
378
+ hostGeneration: number;
349
379
  ws: WebSocket;
350
380
  pending: Map<string, {
351
381
  sessionId: string;
@@ -353,6 +383,7 @@ interface SessionSocket {
353
383
  }>;
354
384
  /** True once the server advertised the `client_ping_pong` capability. */
355
385
  capable: boolean;
386
+ ephemeralCapable: boolean;
356
387
  /** Timestamp (via opts.now) of the last received pong; seeds the TTL window. */
357
388
  lastPongAt: number;
358
389
  /** Nonce of the most recent in-flight ping, if any. */
@@ -380,6 +411,7 @@ export declare class TelegramNotificationDaemon {
380
411
  private running;
381
412
  private readonly fsImpl;
382
413
  private readonly botApi;
414
+ private readonly effects;
383
415
  private readonly topics;
384
416
  /** Serializes registry snapshots so an older atomic write cannot overwrite newer rename state. */
385
417
  private topicsPersistQueue;
@@ -476,7 +508,7 @@ export declare class TelegramNotificationDaemon {
476
508
  persistSeenUpdateIds(): Promise<void>;
477
509
  private pruneSeenUpdateIds;
478
510
  private rememberSeenUpdateId;
479
- private rememberSeenUpdateIdForUnavailableNotice;
511
+ private reserveSeenUpdateId;
480
512
  scanRoots(): Promise<void>;
481
513
  connectSession(sessionId: string, url: string, token: string): void;
482
514
  /**
@@ -513,6 +545,9 @@ export declare class TelegramNotificationDaemon {
513
545
  private sessionCanClaimIdentity;
514
546
  private submitThreadedFrame;
515
547
  private existingTopicForPrivateChat;
548
+ private topicAuthorityLease;
549
+ private topicAuthorityLeaseFromRegistry;
550
+ private topicLeaseIsCurrent;
516
551
  /** Best-effort re-assertion for a durable user-owned topic name. */
517
552
  private reconcileUserTopicName;
518
553
  private rememberPendingThreadedFrame;
@@ -525,7 +560,7 @@ export declare class TelegramNotificationDaemon {
525
560
  */
526
561
  private ensureTopic;
527
562
  private topicPastOrphanGrace;
528
- private deleteOrphanedTopic;
563
+ private observeOrphanedTopic;
529
564
  /** Best-effort delete of a session topic once its local notification endpoint shuts down. */
530
565
  private deleteTopic;
531
566
  private persistTopics;
@@ -563,6 +598,7 @@ export declare class TelegramNotificationDaemon {
563
598
  private flushChain;
564
599
  private flushPool;
565
600
  /** Drain the shared rate-limit pool and deliver each granted send to its topic. */
601
+ private submitPool;
566
602
  private flushPoolInner;
567
603
  /**
568
604
  * Track the Telegram message id backing a streamed `(sessionId, coalesceKey)`
@@ -593,6 +629,13 @@ export declare class TelegramNotificationDaemon {
593
629
  private notifyThreadedFallback;
594
630
  private startFlushTimer;
595
631
  private stopFlushTimer;
632
+ private renewOwnershipHeartbeat;
633
+ /**
634
+ * Ownership must be renewed independently of Telegram's 25-second long poll:
635
+ * the ownership TTL is shorter than a single poll request.
636
+ */
637
+ private startOwnershipHeartbeatTimer;
638
+ private stopOwnershipHeartbeatTimer;
596
639
  /** Run a root scan, guarding against overlapping scans from the timer + loop. */
597
640
  private runScan;
598
641
  private startScanTimer;
@@ -60,7 +60,7 @@ export type ThreadedInboundDecision = {
60
60
  text: string;
61
61
  updateId: number;
62
62
  threadId: string;
63
- messageId?: number;
63
+ messageId: number;
64
64
  attachment?: InboundAttachment;
65
65
  } | {
66
66
  kind: "duplicate";
@@ -41,6 +41,13 @@ export interface ThreadedSend {
41
41
  richMarkdown?: string;
42
42
  /** Live-turn raw markdown for opt-in draft streaming (set ONLY on non-finalized turn frames; never triggers rich-final promotion, which requires `lane === "finalized"`). */
43
43
  richDraftMarkdown?: string;
44
+ /**
45
+ * True for a terminal tool_activity frame (phase completed/failed/cancelled/
46
+ * unknown). The daemon evicts the tool's `tool:<toolCallId>` live-message entry
47
+ * after delivering it, so completed tools do not accumulate unbounded across a
48
+ * long session (concurrent in-flight `started` entries are retained).
49
+ */
50
+ terminal?: boolean;
44
51
  }
45
52
  interface ThreadedFrame {
46
53
  type?: unknown;
@@ -60,6 +67,12 @@ interface ThreadedFrame {
60
67
  finalAnswer?: boolean;
61
68
  text?: unknown;
62
69
  messageRef?: unknown;
70
+ turnRef?: unknown;
71
+ toolCallId?: unknown;
72
+ toolName?: unknown;
73
+ argsSummary?: unknown;
74
+ resultSummary?: unknown;
75
+ isError?: unknown;
63
76
  source?: unknown;
64
77
  data?: unknown;
65
78
  mime?: unknown;
@@ -20,6 +20,8 @@ export interface TopicRecord {
20
20
  identitySent: boolean;
21
21
  /** Creation timestamp (ms epoch). */
22
22
  createdAt: number;
23
+ /** First positive observation that the owning endpoint is stale, dead, or missing. */
24
+ orphanedAt?: number;
23
25
  /** Last applied or observed Telegram topic title. */
24
26
  name?: string;
25
27
  /** Naming authority. Missing values are legacy daemon-owned records. */
@@ -34,11 +36,17 @@ export interface TopicRecord {
34
36
  replayGeneration?: number;
35
37
  /** Last SDK event sequence durably consumed within replayGeneration. */
36
38
  replaySeq?: number;
39
+ /** Serialized authority epoch; a late create may commit only in its starting epoch. */
40
+ authorityEpoch?: number;
41
+ /** An uncertain delete fences future creation and inbound routing. */
42
+ authorityState?: "active" | "delete_pending";
37
43
  }
38
44
  /** Serialisable shape persisted to disk. */
39
45
  export interface TopicRegistryState {
40
46
  /** sessionId -> record. */
41
47
  topics: Record<string, TopicRecord>;
48
+ /** Durable deletion epochs retained after a definite delete. */
49
+ fences?: Record<string, number>;
42
50
  }
43
51
  export declare function emptyTopicRegistryState(): TopicRegistryState;
44
52
  /**
@@ -47,14 +55,18 @@ export declare function emptyTopicRegistryState(): TopicRegistryState;
47
55
  * `createForumTopic` call); reuse-on-resume is automatic when a record exists.
48
56
  */
49
57
  export declare class TopicRegistry {
58
+ #private;
50
59
  private readonly topics;
51
60
  /** Maps topicId -> sessionId for fast inbound routing. */
52
61
  private readonly byTopic;
53
62
  /** In-flight create promises, keyed by session, to dedupe concurrent creates. */
54
63
  private readonly inflight;
64
+ /** Monotonic authority epochs, including deletion fences for absent records. */
65
+ private readonly epochs;
55
66
  constructor(state?: TopicRegistryState);
56
67
  /** Merge serialized state and normalize authority fields from older releases. */
57
68
  load(state: TopicRegistryState): void;
69
+ private rebuildInboundRoutes;
58
70
  /** Resolve the owning session for a topic id (for fail-closed inbound routing). */
59
71
  sessionForTopic(topicId: string): string | undefined;
60
72
  /** All session ids with a persisted topic record. */
@@ -65,13 +77,17 @@ export declare class TopicRegistry {
65
77
  * Return the existing active topic for `sessionId`, or create one via
66
78
  * `create` (called only on first use).
67
79
  */
68
- getOrCreateTopic(sessionId: string, create: () => Promise<string>, now?: () => number, name?: string): Promise<TopicRecord>;
80
+ getOrCreateTopic(sessionId: string, create: () => Promise<unknown>, now?: () => number, name?: string): Promise<TopicRecord>;
69
81
  /** Mark the identity header as sent for a session. Idempotent. */
70
82
  markIdentitySent(sessionId: string): void;
71
83
  /** Whether the identity header still needs sending for this session. */
72
84
  needsIdentity(sessionId: string): boolean;
73
85
  /** Remember stable repo/branch identity independently of the displayed name. */
74
86
  markIdentityKey(sessionId: string, identityKey: string): boolean;
87
+ /** Start the orphan grace clock on the first positive liveness-loss observation. */
88
+ markOrphaned(sessionId: string, now: number): boolean;
89
+ /** Clear a prior orphan observation after the endpoint is positively live again. */
90
+ clearOrphaned(sessionId: string): boolean;
75
91
  /** Last durably consumed SDK event cursor for reconnect replay. */
76
92
  replayCursor(sessionId: string): {
77
93
  generation: number;
@@ -93,7 +109,13 @@ export declare class TopicRegistry {
93
109
  markUserNamePending(sessionId: string, name: string): boolean;
94
110
  /** Commit a successfully-applied daemon topic title. */
95
111
  markNameApplied(sessionId: string, name: string): void;
96
- /** Remove a session topic record after Telegram deletes the topic. */
112
+ /** Fence new work before the remote delete starts, including an absent in-flight create. */
113
+ beginDelete(sessionId: string): TopicRecord | undefined;
114
+ /** Wait for a revoked create to settle before admitting a later lifecycle epoch. */
115
+ awaitInflight(sessionId: string): Promise<void>;
116
+ /** Remove only after a definite remote deletion; ambiguity deliberately retains its fence. */
117
+ settleDelete(sessionId: string, topicId: string): boolean;
118
+ /** Remove a topic record immediately for local/test cleanup compatibility. */
97
119
  delete(sessionId: string): boolean;
98
120
  /** Serialise for atomic persistence beside the daemon state. */
99
121
  serialize(): TopicRegistryState;
@@ -11,7 +11,7 @@ export interface ControlSurface {
11
11
  abort(): Promise<ControlValue> | ControlValue;
12
12
  abortAndPrompt(text: string): Promise<ControlValue> | ControlValue;
13
13
  answerAsk(id: string, answer: ControlValue): Promise<ControlValue> | ControlValue;
14
- answerGate(id: string, response: ControlValue, expectedSessionId?: string): Promise<ControlValue> | ControlValue;
14
+ answerGate(id: string, response: ControlValue, expectedSessionId?: string, idempotencyKey?: string): Promise<ControlValue> | ControlValue;
15
15
  approvePlan(id: string, choice: ControlValue, expectedSessionId?: string): Promise<ControlValue> | ControlValue;
16
16
  invokeSkill(name: string, args: ControlValue): Promise<ControlValue> | ControlValue;
17
17
  setPlanMode(on: boolean): Promise<ControlValue> | ControlValue;
@@ -12,6 +12,8 @@ export interface SessionSdkHostOptions extends HostEndpointAdapters {
12
12
  installProviderDefinitions?: (capability: string, definitions: unknown) => void;
13
13
  onProviderDefinitionsRemoved?: (capability: string) => void;
14
14
  onReverseCancel?: (requestId: string, reason: "provider_disconnected" | "lease_released") => void;
15
+ /** Best-effort capabilities mirrored from the native transport for out-of-band consumers. */
16
+ connectionCapabilities?: (connectionId: string) => ReadonlySet<string>;
15
17
  }
16
18
  /** SDK hosting is independent of notification configuration. Only root sessions host an endpoint. */
17
19
  export declare function shouldHostSdk(_settings: unknown, isTopLevel: boolean, env?: NodeJS.ProcessEnv): boolean;
@@ -4,3 +4,4 @@ export * as host from "./host";
4
4
  export * as mcp from "./mcp";
5
5
  export type { Q10CurrentThinkingLevel, Q10Model, Q10SettableThinkingLevel, Q10ThinkingCapabilities, Q10ThinkingEffort, Q10ThinkingMode, } from "./models";
6
6
  export * from "./session";
7
+ export * from "./session-directory";
@@ -0,0 +1,56 @@
1
+ import type { ResumeSessionIdentity } from "../session/session-manager";
2
+ /** Version of the supported readonly managed-session directory API. */
3
+ /** Broker-owned policy for managed-session migration decisions after scope validation. */
4
+ export type DirectoryMigrationPolicy = "copy-retain" | "disabled";
5
+ export declare const SESSION_DIRECTORY_API_VERSION: 1;
6
+ /** A collision-resistant v2 managed-session scope for one canonical workspace identity. */
7
+ export interface ManagedSessionScope {
8
+ readonly apiVersion: 1;
9
+ readonly layoutVersion: 2;
10
+ readonly identityVersion: 1;
11
+ readonly agentDir: string;
12
+ readonly sessionsRoot: string;
13
+ readonly canonicalCwd: string;
14
+ readonly legacyLexicalCwd: string;
15
+ readonly directoryName: string;
16
+ readonly directoryPath: string;
17
+ }
18
+ export type ResolveManagedSessionScopeResult = {
19
+ kind: "resolved";
20
+ scope: ManagedSessionScope;
21
+ } | {
22
+ kind: "error";
23
+ code: "cwd_missing" | "cwd_not_directory" | "identity_unavailable" | "network_unsupported" | "sessions_root_unavailable" | "binding_conflict" | "binding_invalid";
24
+ message: string;
25
+ };
26
+ export interface LogicalSessionCandidate {
27
+ readonly sessionId: string;
28
+ readonly path: string;
29
+ readonly cwd: string;
30
+ readonly provenance: "v2" | "legacy";
31
+ readonly identity: Readonly<ResumeSessionIdentity>;
32
+ readonly migrationState: "native_v2" | "legacy_unmigrated" | "migrated_v2";
33
+ }
34
+ export type ListManagedSessionCandidatesResult = {
35
+ kind: "complete";
36
+ scope: ManagedSessionScope;
37
+ owned: readonly LogicalSessionCandidate[];
38
+ foreignCount: number;
39
+ invalid: readonly {
40
+ code: string;
41
+ }[];
42
+ } | {
43
+ kind: "error";
44
+ code: "scan_failed" | "unsafe_root" | "invalid_candidate";
45
+ message: string;
46
+ };
47
+ /** Resolve a v2 scope without creating, migrating, or deleting session data. */
48
+ export declare function resolveManagedSessionScope(input: {
49
+ cwd: string;
50
+ agentDir?: string;
51
+ sessionsRoot?: string;
52
+ }): Promise<ResolveManagedSessionScopeResult>;
53
+ /** List readonly v2 and validated legacy candidates for an already resolved scope. */
54
+ export declare function listManagedSessionCandidates(input: {
55
+ scope: ManagedSessionScope;
56
+ }): Promise<ListManagedSessionCandidatesResult>;
@@ -33,6 +33,25 @@ export interface PurgeQueuedCustomMessagesResult {
33
33
  displayFollowUp: number;
34
34
  totalExecutable: number;
35
35
  }
36
+ export type AbortOutcome = {
37
+ kind: "settled";
38
+ } | {
39
+ kind: "timeout";
40
+ } | {
41
+ kind: "error";
42
+ cause: unknown;
43
+ };
44
+ export type CancelAndSubmitOutcome = {
45
+ kind: "submitted";
46
+ } | {
47
+ kind: "refused";
48
+ reason: "duplicate" | "compaction";
49
+ } | {
50
+ kind: "rolled_back";
51
+ outcome: Extract<AbortOutcome, {
52
+ kind: "timeout" | "error";
53
+ }>;
54
+ };
36
55
  export interface ForkContextSeed {
37
56
  messages: Message[];
38
57
  agentMessages: AgentMessage[];
@@ -43,6 +62,7 @@ export interface ForkContextSeed {
43
62
  export interface ForkContextSeedOptions {
44
63
  maxMessages: number;
45
64
  maxTokens: number;
65
+ preserveLatestUser?: boolean;
46
66
  cacheIdentity?: string;
47
67
  signal?: AbortSignal;
48
68
  }
@@ -68,7 +88,6 @@ import type { HindsightSessionState } from "../hindsight/state";
68
88
  import { type WorkflowGateEmitter } from "../modes/shared/agent-wire/workflow-gate-broker";
69
89
  import type { PlanModeState } from "../plan-mode/state";
70
90
  import { type AgentRegistry } from "../registry/agent-registry";
71
- import { type DiscoverableMCPSearchIndex, type DiscoverableMCPTool } from "../runtime-mcp/discoverable-tool-metadata";
72
91
  import { MCPManager } from "../runtime-mcp/manager";
73
92
  import type { NotificationSessionController } from "../sdk/bus/session-control";
74
93
  import { type SecretObfuscator } from "../secrets/obfuscator";
@@ -181,6 +200,10 @@ export interface AgentSessionConfig {
181
200
  slashCommands?: FileSlashCommand[];
182
201
  /** Extension runner (created in main.ts with wrapped tools) */
183
202
  extensionRunner?: ExtensionRunner;
203
+ /** Override first-party worker integration dispatch for embedded hosts and deterministic lifecycle tests. */
204
+ workerIntegrationRequest?: (signal: AbortSignal) => Promise<void>;
205
+ /** Bound terminal worker-integration settlement for embedded hosts and deterministic lifecycle tests. */
206
+ workerIntegrationTimeoutMs?: number;
184
207
  /** Loaded skills (already discovered by SDK) */
185
208
  skills?: Skill[];
186
209
  /** Skill loading warnings (already captured by SDK) */
@@ -219,15 +242,12 @@ export interface AgentSessionConfig {
219
242
  requestedToolNames?: ReadonlySet<string>;
220
243
  /** Optional per-session allowlist for tools exposed through search_tool_bm25. */
221
244
  discoverableToolAllowedNames?: readonly string[];
222
- /**
223
- * Optional accessor for live MCP server instructions. Read by the session's
224
- * `rebuildSystemPrompt`-skip optimization to detect server-side instruction
225
- * changes (e.g. an MCP server upgrade) that would otherwise pass the tool-set
226
- * signature comparison and silently keep a stale prompt cached.
227
- */
245
+ /** Optional accessor for live MCP server instructions, injected as untrusted user-role request data. */
228
246
  getMcpServerInstructions?: () => Map<string, string> | undefined;
229
247
  /** Enable hidden-by-default MCP tool discovery for this session. */
230
248
  mcpDiscoveryEnabled?: boolean;
249
+ /** Effective discovery mode normalized by the session factory. */
250
+ discoveryMode?: "off" | "mcp-only" | "all";
231
251
  /** MCP tool names to activate for the current session when discovery mode is enabled. */
232
252
  initialSelectedMCPToolNames?: string[];
233
253
  /** Whether constructor-provided MCP defaults should be persisted immediately. */
@@ -348,6 +368,36 @@ export interface SessionStats {
348
368
  cost: number;
349
369
  costBreakdown?: Usage["cost"];
350
370
  }
371
+ export type EphemeralTurnPurpose = "btw" | "background";
372
+ interface EphemeralTurnBaseArgs {
373
+ promptText: string;
374
+ onTextDelta?: (delta: string) => void;
375
+ signal?: AbortSignal;
376
+ }
377
+ export type EphemeralTurnArgs = (EphemeralTurnBaseArgs & {
378
+ purpose: "btw";
379
+ }) | (EphemeralTurnBaseArgs & {
380
+ purpose?: "background";
381
+ /** Internal caller-supplied, non-persistent context such as the IRC roster. */
382
+ prependMessages?: AgentMessage[];
383
+ /** Revalidates optional caller context after asynchronous boundaries. */
384
+ prependMessagesValid?: () => boolean;
385
+ /**
386
+ * An existing IRC roster claim owned by the caller. `undefined` makes this
387
+ * turn claim and commit its own roster candidate; `null` opts out.
388
+ */
389
+ ircRosterClaim?: IrcRosterClaim | null;
390
+ });
391
+ interface EphemeralTurnResult {
392
+ replyText: string;
393
+ assistantMessage: AssistantMessage;
394
+ }
395
+ type IrcRosterClaim = {
396
+ token: symbol;
397
+ signature: string;
398
+ epoch: number;
399
+ message: CustomMessage;
400
+ };
351
401
  export type QueuedMessageEditMode = "steer" | "followUp";
352
402
  export interface QueuedMessageEditEntry {
353
403
  id: string;
@@ -369,8 +419,9 @@ export type BeforeAgentStartContributor = (event: {
369
419
  }) => Promise<BeforeAgentStartInternalMessage | undefined>;
370
420
  export declare class WorkerIntegrationRequestScheduler {
371
421
  #private;
372
- readonly request: () => Promise<void>;
373
- constructor(request: () => Promise<void>);
422
+ readonly request: (signal: AbortSignal) => Promise<void>;
423
+ readonly timeoutMs: number;
424
+ constructor(request: (signal: AbortSignal) => Promise<void>, timeoutMs?: number);
374
425
  enqueue(): void;
375
426
  flush(): Promise<void>;
376
427
  }
@@ -448,6 +499,7 @@ export declare class AgentSession {
448
499
  peekQueueInvoker(): ((input: unknown) => Promise<unknown> | unknown) | undefined;
449
500
  peekStandingResolveHandler(): ((input: unknown) => Promise<unknown> | unknown) | undefined;
450
501
  setStandingResolveHandler(handler: ((input: unknown) => Promise<unknown> | unknown) | null): void;
502
+ setSdkPlanModeHandler(handler: ((on: boolean) => Promise<PlanModeState | undefined>) | null): void;
451
503
  /** Provider-scoped mutable state store for transport/session caches. */
452
504
  get providerSessionState(): Map<string, ProviderSessionState>;
453
505
  /** Suspend provider state without closing it while a temporary model is active. */
@@ -499,6 +551,8 @@ export declare class AgentSession {
499
551
  * react to (e.g. background queue flush failures).
500
552
  */
501
553
  emitNotice(level: "info" | "warning" | "error", message: string, source?: string): void;
554
+ /** Await all transformations queued by externally emitted tool results. */
555
+ awaitPendingContextTransformations(): Promise<void>;
502
556
  /**
503
557
  * Subscribe to agent events.
504
558
  * Session persistence is handled internally (saves messages on message_end).
@@ -541,7 +595,7 @@ export declare class AgentSession {
541
595
  get serviceTier(): ServiceTier | undefined;
542
596
  /** Whether agent is currently streaming a response */
543
597
  get isStreaming(): boolean;
544
- /** Wait until streaming and deferred recovery work are fully settled. */
598
+ /** Wait until streaming and session settlement work are fully settled. */
545
599
  waitForIdle(): Promise<void>;
546
600
  drainAsyncJobDeliveriesForAcp(options?: {
547
601
  timeoutMs?: number;
@@ -603,15 +657,7 @@ export declare class AgentSession {
603
657
  * Get all configured tool names (built-in via --tools or default, plus custom tools).
604
658
  */
605
659
  getAllToolNames(): string[];
606
- isMCPDiscoveryEnabled(): boolean;
607
- /** @deprecated Use {@link getDiscoverableTools} with `{ source: "mcp" }` instead.
608
- * Preserves the legacy `description`-bearing MCP shape for back-compat callers. */
609
- getDiscoverableMCPTools(): DiscoverableMCPTool[];
610
- /** @deprecated Use {@link getDiscoverableToolSearchIndex} instead.
611
- * Returns the legacy MCP search index whose documents expose `tool.description`. */
612
- getDiscoverableMCPSearchIndex(): DiscoverableMCPSearchIndex;
613
660
  getSelectedMCPToolNames(): string[];
614
- activateDiscoveredMCPTools(toolNames: string[]): Promise<string[]>;
615
661
  isToolDiscoveryEnabled(): boolean;
616
662
  getDiscoverableTools(filter?: {
617
663
  source?: DiscoverableTool["source"];
@@ -657,6 +703,7 @@ export declare class AgentSession {
657
703
  get hasPostPromptWork(): boolean;
658
704
  /** All messages including custom types like BashExecutionMessage */
659
705
  get messages(): AgentMessage[];
706
+ get transcriptPromptGeneration(): number;
660
707
  /** Main startup calls this exactly once, after a strict open returned `kind: "opened"`. */
661
708
  continuePersistedHistory(): Promise<void>;
662
709
  buildDisplaySessionContext(): SessionContext;
@@ -689,7 +736,7 @@ export declare class AgentSession {
689
736
  args?: string;
690
737
  lineCount?: number;
691
738
  }>;
692
- setSdkPlanMode(on: boolean): PlanModeState | undefined;
739
+ setSdkPlanMode(on: boolean): Promise<PlanModeState | undefined>;
693
740
  operateGoal(op: "create" | "get" | "resume" | "pause" | "complete" | "drop", objective?: string): Promise<unknown>;
694
741
  getTranscript(): Array<{
695
742
  id: string;
@@ -755,6 +802,10 @@ export declare class AgentSession {
755
802
  followUp(text: string, images?: ImageContent[], options?: Pick<PromptOptions, "followUpQueuePolicy">): Promise<void>;
756
803
  queueDeferredMessage(message: CustomMessage): void;
757
804
  queueDeferredMessageForTests(message: CustomMessage, triggerTurn?: boolean): void;
805
+ /** Read-only test seam for the hidden next-turn context queue. */
806
+ getPendingNextTurnMessagesForTests(): readonly CustomMessage[];
807
+ /** Test-only abort outcome override; undefined retains the production abort race. */
808
+ setCancelAndSubmitAbortOutcomeProviderForTests(provider: (() => Promise<AbortOutcome>) | undefined): void;
758
809
  /**
759
810
  * Send a custom message to the session. Creates a CustomMessageEntry.
760
811
  *
@@ -835,19 +886,17 @@ export declare class AgentSession {
835
886
  runMidRunMaintenanceForTests(context: AgentContext, lifecycle?: MidRunMaintenanceLifecycle): Promise<MidRunMaintenanceOutcome>;
836
887
  /** Test seam: estimate mid-run context tokens for a given context view. */
837
888
  estimateMidRunContextTokensForTests(messages: readonly AgentMessage[]): number;
838
- /**
839
- * Abort current operation and wait for agent to become idle.
840
- */
889
+ /** Abort current operation and preserve the established void/rethrow contract. */
841
890
  abort(options?: {
842
891
  goalReason?: "interrupted" | "internal";
843
892
  timeoutMs?: number;
844
893
  cause?: "user_interrupt" | "new_session" | "session_switch" | "compaction" | "handoff" | "tool_abort" | "internal";
845
- /** Suppress the "Operation aborted" line on the resulting aborted message
846
- * by stamping `SILENT_ABORT_MARKER`. Used when Esc consumes a queued steer
847
- * and resumes via steer-on-interrupt, so the interrupt reads as a quiet
848
- * hand-off rather than a failure. */
849
894
  silent?: boolean;
850
895
  }): Promise<void>;
896
+ /** Atomically interrupt the active run and make text the next prompt. */
897
+ cancelAndSubmit(text: string, options?: {
898
+ queuedEntryId?: string;
899
+ }): Promise<CancelAndSubmitOutcome>;
851
900
  /**
852
901
  * Start a new session, optionally with initial messages and parent tracking.
853
902
  * Clears all messages and starts a new session.
@@ -948,6 +997,8 @@ export declare class AgentSession {
948
997
  * @returns The new model info, or undefined if only one model available
949
998
  */
950
999
  cycleModel(direction?: "forward" | "backward"): Promise<ModelCycleResult | undefined>;
1000
+ /** Number of configured role-model candidates that can be cycled. */
1001
+ getRoleModelCycleCandidateCount(roleOrder?: readonly string[]): number;
951
1002
  /**
952
1003
  * Cycle through configured role models in a fixed order.
953
1004
  * Skips missing roles.
@@ -1193,27 +1244,11 @@ export declare class AgentSession {
1193
1244
  emitSubagentSteerRelayObservation(record: CustomMessage): void;
1194
1245
  /**
1195
1246
  * Run a single ephemeral side-channel turn against this session's current
1196
- * model + system prompt + history. No tools are used; the side request
1197
- * does not block on, or interfere with, any in-flight main turn. The
1198
- * session's history and persisted state are NOT modified by this call.
1199
- *
1200
- * Used by `respondAsBackground` (IRC) and `BtwController` (`/btw`) to share
1201
- * the snapshot + stream pipeline. The snapshot includes any in-flight
1202
- * streaming assistant text so the model sees the half-finished response
1203
- * rather than missing context.
1204
- */
1205
- runEphemeralTurn(args: {
1206
- promptText: string;
1207
- onTextDelta?: (delta: string) => void;
1208
- signal?: AbortSignal;
1209
- /** Defer the successful roster-claim commit until the caller accepts its exchange. */
1210
- deferRosterCommit?: boolean;
1211
- }): Promise<{
1212
- replyText: string;
1213
- assistantMessage: AssistantMessage;
1214
- commitRosterClaim?: () => void;
1215
- releaseRosterClaim?: () => void;
1216
- }>;
1247
+ * model + system prompt + history. No tools are used and session history is
1248
+ * not modified. Background turns retain the IRC/session behavior used by
1249
+ * autoreplies; `/btw` turns use an isolated committed-context policy.
1250
+ */
1251
+ runEphemeralTurn(args: EphemeralTurnArgs): Promise<EphemeralTurnResult>;
1217
1252
  /**
1218
1253
  * Reload the current session from disk.
1219
1254
  *
@@ -98,4 +98,11 @@ export declare class AgentStorage {
98
98
  * Deletes expired cache entries. Call periodically for cleanup.
99
99
  */
100
100
  cleanExpiredCache(): void;
101
+ /**
102
+ * Release prepared statements and the shared SQLite handle.
103
+ *
104
+ * AgentStorage instances are cached by path, so closing also evicts this
105
+ * instance and allows a later open() to create a fresh handle.
106
+ */
107
+ close(): void;
101
108
  }
@@ -1,4 +1,4 @@
1
- export type FallbackTriggerClass = "rate_limit" | "quota" | "auth" | "server" | "other";
1
+ import type { FallbackTriggerClass } from "@gajae-code/ai/utils/fallback-transport";
2
2
  /** Immutable configured fallback intent. Transient attempt state never belongs here. */
3
3
  export interface ConfiguredFallbackChain {
4
4
  role: string;
@@ -30,11 +30,14 @@ export declare class FallbackChainController {
30
30
  }>;
31
31
  exhaustedForTurn: boolean;
32
32
  constructor(chain: ConfiguredFallbackChain, maxAttempts: number);
33
+ get totalAttemptsUsed(): number;
33
34
  currentSelector(): string | undefined;
34
35
  onResolutionSkip(reason: string): boolean;
35
36
  /** Charge an upstream request at its concrete transport boundary. */
36
37
  onAttemptStarted(): void;
37
- /** Start a logically new request without losing its sticky selected entry. */
38
+ /** Remove the current started request from fallback-policy accounting without erasing prior failures. */
39
+ discardStartedAttempt(): void;
40
+ /** Start a logically new request with a fresh fallback-chain budget. */
38
41
  resetAttemptBudget(): void;
39
42
  /** Seed a controller from auth-aware resolution without charging requests. */
40
43
  seedResolution(activeIndex: number, skips: Array<{
@@ -43,6 +46,11 @@ export declare class FallbackChainController {
43
46
  }>): void;
44
47
  onAttemptFailure(triggerClass: FallbackTriggerClass, reason: string): FallbackFailureResult;
45
48
  advance(): boolean;
49
+ /**
50
+ * Restore the entry that just advanced when credential rotation permits a retry.
51
+ * The chain-wide budget and failure history remain charged.
52
+ */
53
+ restorePreviousEntryForRetry(): boolean;
46
54
  isExhausted(): boolean;
47
55
  resetForNewTurn(): void;
48
56
  resetSticky(): void;