@gajae-code/coding-agent 0.11.1 → 0.11.3

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 (413) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/dist/types/cli/config-cli.d.ts +11 -1
  3. package/dist/types/cli/launch-disposition.d.ts +23 -0
  4. package/dist/types/cli/notify-cli.d.ts +1 -0
  5. package/dist/types/cli/session-picker.d.ts +2 -1
  6. package/dist/types/cli/setup-cli.d.ts +1 -1
  7. package/dist/types/commands/mcp-serve.d.ts +33 -0
  8. package/dist/types/commands/mcp.d.ts +1 -1
  9. package/dist/types/commands/notify.d.ts +0 -2
  10. package/dist/types/commands/sdk.d.ts +1 -1
  11. package/dist/types/config/atomic-yaml-patch.d.ts +18 -0
  12. package/dist/types/config/file-lock.d.ts +14 -4
  13. package/dist/types/config/keybindings.d.ts +42 -1
  14. package/dist/types/config/model-auth.d.ts +3 -0
  15. package/dist/types/config/model-bindings-applier.d.ts +13 -0
  16. package/dist/types/config/model-discovery-manager.d.ts +49 -0
  17. package/dist/types/config/model-equivalence.d.ts +20 -0
  18. package/dist/types/config/model-registry.d.ts +16 -15
  19. package/dist/types/config/model-resolver.d.ts +28 -18
  20. package/dist/types/config/models-config-schema.d.ts +11 -0
  21. package/dist/types/config/settings-schema.d.ts +141 -11
  22. package/dist/types/config/settings.d.ts +14 -11
  23. package/dist/types/coordinator-mcp/policy.d.ts +5 -0
  24. package/dist/types/coordinator-mcp/question-gate-codec.d.ts +129 -0
  25. package/dist/types/coordinator-mcp/question-state.d.ts +356 -0
  26. package/dist/types/coordinator-mcp/server.d.ts +4 -0
  27. package/dist/types/discovery/helpers.d.ts +0 -6
  28. package/dist/types/edit/index.d.ts +3 -0
  29. package/dist/types/eval/py/env.d.ts +9 -0
  30. package/dist/types/extensibility/extensions/loader.d.ts +2 -1
  31. package/dist/types/extensibility/extensions/runner.d.ts +2 -2
  32. package/dist/types/extensibility/extensions/types.d.ts +34 -3
  33. package/dist/types/extensibility/hooks/runner.d.ts +1 -1
  34. package/dist/types/extensibility/shared-events.d.ts +2 -0
  35. package/dist/types/gjc-runtime/deep-interview-recorder.d.ts +10 -1
  36. package/dist/types/gjc-runtime/deep-interview-state.d.ts +44 -0
  37. package/dist/types/gjc-runtime/goal-mode-request.d.ts +11 -1
  38. package/dist/types/gjc-runtime/launch-worktree.d.ts +4 -2
  39. package/dist/types/gjc-runtime/linux-proc.d.ts +29 -0
  40. package/dist/types/gjc-runtime/session-resolution.d.ts +2 -2
  41. package/dist/types/gjc-runtime/state-migrations.d.ts +1 -1
  42. package/dist/types/gjc-runtime/state-writer.d.ts +2 -1
  43. package/dist/types/gjc-runtime/team-launch.d.ts +59 -0
  44. package/dist/types/gjc-runtime/team-notify.d.ts +45 -0
  45. package/dist/types/gjc-runtime/team-runtime.d.ts +29 -121
  46. package/dist/types/gjc-runtime/team-store.d.ts +160 -0
  47. package/dist/types/gjc-runtime/team-workers.d.ts +78 -0
  48. package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +8 -0
  49. package/dist/types/gjc-runtime/ultragoal-change-set.d.ts +13 -0
  50. package/dist/types/gjc-runtime/ultragoal-evidence.d.ts +38 -0
  51. package/dist/types/gjc-runtime/ultragoal-guard.d.ts +7 -0
  52. package/dist/types/gjc-runtime/ultragoal-pipeline.d.ts +23 -0
  53. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +55 -33
  54. package/dist/types/gjc-runtime/workflow-cli-common.d.ts +8 -0
  55. package/dist/types/gjc-runtime/workflow-manifest.d.ts +3 -0
  56. package/dist/types/goals/continuation-timeout-guard.d.ts +22 -0
  57. package/dist/types/goals/runtime.d.ts +1 -0
  58. package/dist/types/goals/state.d.ts +8 -0
  59. package/dist/types/harness-control-plane/lifecycle-reconciliation.d.ts +17 -0
  60. package/dist/types/harness-control-plane/phase-rollup.d.ts +4 -7
  61. package/dist/types/harness-control-plane/receipt-ingest.d.ts +5 -0
  62. package/dist/types/harness-control-plane/receipt-spool.d.ts +4 -0
  63. package/dist/types/hindsight/state.d.ts +11 -4
  64. package/dist/types/lsp/lspmux.d.ts +5 -3
  65. package/dist/types/lsp/path-trust.d.ts +1 -0
  66. package/dist/types/main.d.ts +4 -2
  67. package/dist/types/memories/storage.d.ts +1 -0
  68. package/dist/types/modes/action-registry.d.ts +29 -0
  69. package/dist/types/modes/components/chrome.d.ts +14 -0
  70. package/dist/types/modes/components/command-palette.d.ts +27 -0
  71. package/dist/types/modes/components/custom-provider-wizard.d.ts +1 -0
  72. package/dist/types/modes/components/index.d.ts +2 -1
  73. package/dist/types/modes/components/pet-selector.d.ts +1 -1
  74. package/dist/types/modes/components/plan-preview-overlay.d.ts +43 -0
  75. package/dist/types/modes/components/queue-mode-selector.d.ts +1 -1
  76. package/dist/types/modes/components/queue-pane.d.ts +12 -0
  77. package/dist/types/modes/components/read-tool-group.d.ts +6 -0
  78. package/dist/types/modes/components/session-observer-overlay.d.ts +3 -4
  79. package/dist/types/modes/components/sessions-dashboard.d.ts +32 -0
  80. package/dist/types/modes/components/settings-selector.d.ts +1 -1
  81. package/dist/types/modes/components/show-images-selector.d.ts +1 -1
  82. package/dist/types/modes/components/status-line/types.d.ts +1 -1
  83. package/dist/types/modes/components/status-line.d.ts +1 -94
  84. package/dist/types/modes/components/tasks-pane.d.ts +15 -0
  85. package/dist/types/modes/components/theme-selector.d.ts +1 -1
  86. package/dist/types/modes/components/tool-execution.d.ts +15 -0
  87. package/dist/types/modes/components/tool-status-header.d.ts +111 -0
  88. package/dist/types/modes/components/transcript-viewer-overlay.d.ts +42 -0
  89. package/dist/types/modes/controllers/goal-mode-controller.d.ts +62 -0
  90. package/dist/types/modes/controllers/input-controller.d.ts +8 -1
  91. package/dist/types/modes/controllers/mode-gate.d.ts +8 -0
  92. package/dist/types/modes/controllers/plan-mode-controller.d.ts +65 -0
  93. package/dist/types/modes/controllers/selector-controller.d.ts +15 -3
  94. package/dist/types/modes/controllers/stt-controller.d.ts +26 -0
  95. package/dist/types/modes/interactive-mode.d.ts +19 -17
  96. package/dist/types/modes/jobs-observer.d.ts +2 -0
  97. package/dist/types/modes/prompt-action-autocomplete.d.ts +4 -0
  98. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -11
  99. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +20 -2
  100. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +31 -0
  101. package/dist/types/modes/tasks-aggregator.d.ts +39 -0
  102. package/dist/types/modes/transcript-item-registry.d.ts +60 -0
  103. package/dist/types/modes/types.d.ts +20 -13
  104. package/dist/types/modes/utils/ui-helpers.d.ts +2 -2
  105. package/dist/types/runtime-mcp/manager.d.ts +1 -1
  106. package/dist/types/sdk/broker/broker.d.ts +78 -12
  107. package/dist/types/sdk/broker/lifecycle-codec.d.ts +4 -0
  108. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +15 -1
  109. package/dist/types/sdk/broker/lifecycle.d.ts +6 -2
  110. package/dist/types/sdk/broker/process-incarnation.d.ts +2 -0
  111. package/dist/types/sdk/broker/session-index.d.ts +0 -1
  112. package/dist/types/sdk/broker/state-version.d.ts +2 -0
  113. package/dist/types/sdk/bus/chat-effect-journal.d.ts +1 -0
  114. package/dist/types/sdk/bus/config-commands.d.ts +1 -1
  115. package/dist/types/sdk/bus/config.d.ts +11 -0
  116. package/dist/types/sdk/bus/daemon-paths.d.ts +1 -0
  117. package/dist/types/sdk/bus/html-format.d.ts +3 -2
  118. package/dist/types/sdk/bus/index.d.ts +29 -0
  119. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +4 -0
  120. package/dist/types/sdk/bus/notification-service.d.ts +20 -0
  121. package/dist/types/sdk/bus/rate-limit-pool.d.ts +13 -2
  122. package/dist/types/sdk/bus/recent-activity.d.ts +21 -12
  123. package/dist/types/sdk/bus/rich-document.d.ts +7 -0
  124. package/dist/types/sdk/bus/rich-render.d.ts +18 -41
  125. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +9 -4
  126. package/dist/types/sdk/bus/telegram-daemon.d.ts +46 -3
  127. package/dist/types/sdk/bus/threaded-inbound.d.ts +1 -1
  128. package/dist/types/sdk/bus/threaded-render.d.ts +13 -0
  129. package/dist/types/sdk/bus/topic-registry.d.ts +24 -2
  130. package/dist/types/sdk/host/control/operations.d.ts +1 -1
  131. package/dist/types/sdk/host/host.d.ts +2 -0
  132. package/dist/types/sdk/index.d.ts +1 -0
  133. package/dist/types/sdk/session-directory.d.ts +56 -0
  134. package/dist/types/sdk/session.d.ts +2 -0
  135. package/dist/types/session/agent-session.d.ts +82 -47
  136. package/dist/types/session/agent-storage.d.ts +7 -0
  137. package/dist/types/session/fallback-chain-controller.d.ts +10 -2
  138. package/dist/types/session/internal/managed-session-scope.d.ts +102 -0
  139. package/dist/types/session/internal/managed-session-storage.d.ts +38 -0
  140. package/dist/types/session/messages.d.ts +16 -0
  141. package/dist/types/session/session-manager-internal.d.ts +14 -0
  142. package/dist/types/session/session-manager.d.ts +82 -12
  143. package/dist/types/session/session-storage.d.ts +43 -3
  144. package/dist/types/session/volatile-context-pruning.d.ts +15 -0
  145. package/dist/types/skill-state/{deep-interview-mutation-guard.d.ts → workflow-mutation-guard.d.ts} +24 -8
  146. package/dist/types/skill-state/workflow-state-contract.d.ts +1 -3
  147. package/dist/types/slash-commands/builtin-registry.d.ts +4 -1
  148. package/dist/types/system-prompt.d.ts +2 -11
  149. package/dist/types/task/executor.d.ts +3 -1
  150. package/dist/types/thinking.d.ts +7 -0
  151. package/dist/types/tool-discovery/tool-index.d.ts +1 -50
  152. package/dist/types/tools/ask.d.ts +64 -2
  153. package/dist/types/tools/bash.d.ts +3 -0
  154. package/dist/types/tools/browser/dead-tab-recovery.d.ts +24 -0
  155. package/dist/types/tools/browser/tab-supervisor.d.ts +21 -0
  156. package/dist/types/tools/cron.d.ts +2 -0
  157. package/dist/types/tools/fetch.d.ts +1 -0
  158. package/dist/types/tools/index.d.ts +30 -15
  159. package/dist/types/tools/output-meta.d.ts +1 -0
  160. package/dist/types/tools/read.d.ts +5 -0
  161. package/dist/types/tools/search-tool-bm25.d.ts +3 -4
  162. package/dist/types/tools/subagent.d.ts +1 -0
  163. package/dist/types/utils/event-bus.d.ts +1 -1
  164. package/dist/types/utils/file-mentions.d.ts +3 -3
  165. package/dist/types/web/search/index.d.ts +3 -1
  166. package/package.json +21 -9
  167. package/scripts/build-sdk-package-smoke.ts +34 -1
  168. package/scripts/generate-hotkeys-docs.ts +74 -0
  169. package/scripts/generate-sdk-operation-inventory.ts +64 -20
  170. package/scripts/verify-gjc-sdk-canonicalization.ts +182 -2
  171. package/src/async/job-manager.ts +49 -6
  172. package/src/cli/config-cli.ts +75 -2
  173. package/src/cli/launch-disposition.ts +42 -0
  174. package/src/cli/notify-cli.ts +92 -26
  175. package/src/cli/session-picker.ts +20 -3
  176. package/src/cli/setup-cli.ts +1 -1
  177. package/src/cli.ts +1 -1
  178. package/src/commands/config.ts +1 -1
  179. package/src/commands/harness.ts +34 -106
  180. package/src/commands/launch.ts +6 -4
  181. package/src/commands/mcp-serve.ts +85 -8
  182. package/src/commands/mcp.ts +2 -2
  183. package/src/commands/notify.ts +8 -4
  184. package/src/commands/sdk.ts +61 -40
  185. package/src/commands/ultragoal.ts +4 -1
  186. package/src/config/atomic-yaml-patch.ts +80 -13
  187. package/src/config/file-lock.ts +105 -43
  188. package/src/config/keybindings.ts +64 -20
  189. package/src/config/model-auth.ts +9 -0
  190. package/src/config/model-bindings-applier.ts +139 -0
  191. package/src/config/model-discovery-manager.ts +224 -0
  192. package/src/config/model-equivalence.ts +66 -0
  193. package/src/config/model-registry.ts +169 -302
  194. package/src/config/model-resolver.ts +361 -369
  195. package/src/config/models-config-schema.ts +5 -4
  196. package/src/config/settings-schema.ts +214 -12
  197. package/src/config/settings.ts +458 -482
  198. package/src/coordinator-mcp/policy.ts +76 -11
  199. package/src/coordinator-mcp/question-gate-codec.ts +274 -0
  200. package/src/coordinator-mcp/question-state.ts +778 -0
  201. package/src/coordinator-mcp/server.ts +1702 -238
  202. package/src/debug/index.ts +1 -1
  203. package/src/defaults/gjc/skills/deep-interview/SKILL.md +13 -1
  204. package/src/defaults/gjc/skills/team/SKILL.md +16 -0
  205. package/src/discovery/helpers.ts +1 -50
  206. package/src/edit/index.ts +64 -0
  207. package/src/eval/py/env.ts +26 -0
  208. package/src/eval/py/kernel.ts +5 -3
  209. package/src/extensibility/extensions/loader.ts +9 -1
  210. package/src/extensibility/extensions/runner.ts +12 -3
  211. package/src/extensibility/extensions/types.ts +39 -1
  212. package/src/extensibility/gjc-plugins/installer.ts +16 -16
  213. package/src/extensibility/hooks/runner.ts +2 -2
  214. package/src/extensibility/runtime-skill-discovery.ts +33 -13
  215. package/src/extensibility/shared-events.ts +2 -0
  216. package/src/gjc-runtime/deep-interview-recorder.ts +63 -3
  217. package/src/gjc-runtime/deep-interview-runtime.ts +76 -27
  218. package/src/gjc-runtime/deep-interview-state.ts +317 -5
  219. package/src/gjc-runtime/goal-mode-request.ts +55 -8
  220. package/src/gjc-runtime/launch-tmux.ts +2 -5
  221. package/src/gjc-runtime/launch-worktree.ts +5 -5
  222. package/src/gjc-runtime/linux-proc.ts +71 -0
  223. package/src/gjc-runtime/ralplan-runtime.ts +74 -90
  224. package/src/gjc-runtime/session-resolution.ts +18 -3
  225. package/src/gjc-runtime/session-state-sidecar.ts +6 -107
  226. package/src/gjc-runtime/state-migrations.ts +1 -1
  227. package/src/gjc-runtime/state-runtime.ts +327 -249
  228. package/src/gjc-runtime/state-writer.ts +36 -40
  229. package/src/gjc-runtime/team-launch.ts +319 -0
  230. package/src/gjc-runtime/team-notify.ts +326 -0
  231. package/src/gjc-runtime/team-runtime.ts +1099 -1482
  232. package/src/gjc-runtime/team-store.ts +828 -0
  233. package/src/gjc-runtime/team-workers.ts +962 -0
  234. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +2 -11
  235. package/src/gjc-runtime/tmux-owner-isolation.ts +14 -9
  236. package/src/gjc-runtime/tmux-sessions.ts +4 -21
  237. package/src/gjc-runtime/ultragoal-change-set.ts +172 -0
  238. package/src/gjc-runtime/ultragoal-evidence.ts +874 -0
  239. package/src/gjc-runtime/ultragoal-guard.ts +29 -5
  240. package/src/gjc-runtime/ultragoal-pipeline.ts +306 -0
  241. package/src/gjc-runtime/ultragoal-runtime.ts +84 -1311
  242. package/src/gjc-runtime/workflow-cli-common.ts +30 -0
  243. package/src/gjc-runtime/workflow-manifest.generated.json +58 -0
  244. package/src/gjc-runtime/workflow-manifest.ts +18 -0
  245. package/src/goals/continuation-timeout-guard.ts +79 -0
  246. package/src/goals/runtime.ts +7 -5
  247. package/src/goals/state.ts +18 -0
  248. package/src/harness-control-plane/lifecycle-reconciliation.ts +64 -0
  249. package/src/harness-control-plane/phase-rollup.ts +4 -7
  250. package/src/harness-control-plane/receipt-ingest.ts +5 -0
  251. package/src/harness-control-plane/receipt-spool.ts +51 -7
  252. package/src/harness-control-plane/session-lease.ts +12 -130
  253. package/src/hindsight/backend.ts +26 -27
  254. package/src/hindsight/state.ts +101 -32
  255. package/src/hooks/skill-state.ts +17 -11
  256. package/src/internal-urls/docs-index.generated.ts +21 -18
  257. package/src/lsp/client.ts +1 -1
  258. package/src/lsp/config.ts +145 -26
  259. package/src/lsp/index.ts +1 -1
  260. package/src/lsp/lspmux.ts +39 -10
  261. package/src/lsp/path-trust.ts +81 -0
  262. package/src/main.ts +127 -30
  263. package/src/memories/index.ts +1 -0
  264. package/src/memories/storage.ts +6 -2
  265. package/src/modes/action-registry.ts +165 -0
  266. package/src/modes/components/chrome.ts +40 -0
  267. package/src/modes/components/command-palette.ts +168 -0
  268. package/src/modes/components/custom-editor.ts +1 -1
  269. package/src/modes/components/custom-provider-wizard.ts +51 -14
  270. package/src/modes/components/index.ts +2 -1
  271. package/src/modes/components/pet-selector.ts +11 -17
  272. package/src/modes/components/plan-preview-overlay.ts +295 -0
  273. package/src/modes/components/queue-mode-selector.ts +10 -27
  274. package/src/modes/components/queue-pane.ts +79 -0
  275. package/src/modes/components/read-tool-group.ts +13 -0
  276. package/src/modes/components/session-observer-overlay.ts +207 -772
  277. package/src/modes/components/sessions-dashboard.ts +181 -0
  278. package/src/modes/components/settings-selector.ts +1 -1
  279. package/src/modes/components/show-images-selector.ts +10 -24
  280. package/src/modes/components/status-line/types.ts +1 -1
  281. package/src/modes/components/status-line.ts +1 -969
  282. package/src/modes/components/tasks-pane.ts +73 -0
  283. package/src/modes/components/theme-selector.ts +11 -31
  284. package/src/modes/components/tool-execution.ts +22 -0
  285. package/src/modes/components/tool-status-header.ts +1056 -0
  286. package/src/modes/components/transcript-viewer-overlay.ts +384 -0
  287. package/src/modes/controllers/btw-controller.ts +1 -0
  288. package/src/modes/controllers/event-controller.ts +3 -2
  289. package/src/modes/controllers/extension-ui-controller.ts +24 -1
  290. package/src/modes/controllers/goal-mode-controller.ts +474 -0
  291. package/src/modes/controllers/input-controller.ts +764 -229
  292. package/src/modes/controllers/mode-gate.ts +24 -0
  293. package/src/modes/controllers/plan-mode-controller.ts +517 -0
  294. package/src/modes/controllers/selector-controller.ts +225 -10
  295. package/src/modes/controllers/stt-controller.ts +125 -0
  296. package/src/modes/interactive-mode.ts +289 -1150
  297. package/src/modes/jobs-observer.ts +3 -0
  298. package/src/modes/prompt-action-autocomplete.ts +7 -0
  299. package/src/modes/runtime-init.ts +8 -0
  300. package/src/modes/shared/agent-wire/deep-interview-gate.ts +31 -106
  301. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +71 -16
  302. package/src/modes/shared/agent-wire/workflow-gate-types.ts +177 -0
  303. package/src/modes/tasks-aggregator.ts +199 -0
  304. package/src/modes/transcript-item-registry.ts +229 -0
  305. package/src/modes/types.ts +45 -18
  306. package/src/modes/utils/ui-helpers.ts +17 -9
  307. package/src/prompts/agent-fragments/ralplan-persistence.md +6 -0
  308. package/src/prompts/agent-fragments/restricted-bash.md +1 -0
  309. package/src/prompts/agents/architect.md +2 -8
  310. package/src/prompts/agents/critic.md +2 -8
  311. package/src/prompts/agents/executor.md +3 -0
  312. package/src/prompts/agents/planner.md +4 -12
  313. package/src/prompts/system/custom-system-prompt.md +1 -23
  314. package/src/prompts/system/plan-mode-approved.md +8 -0
  315. package/src/prompts/system/system-prompt.md +17 -96
  316. package/src/prompts/tools/bash.md +4 -4
  317. package/src/prompts/tools/browser.md +15 -52
  318. package/src/prompts/tools/find.md +2 -2
  319. package/src/prompts/tools/hashline.md +13 -55
  320. package/src/prompts/tools/read.md +3 -6
  321. package/src/prompts/tools/search-tool-bm25.md +0 -2
  322. package/src/prompts/tools/search.md +2 -4
  323. package/src/prompts/tools/skill-discovery.md +1 -2
  324. package/src/prompts/tools/task.md +1 -1
  325. package/src/runtime-mcp/manager.ts +1 -1
  326. package/src/sdk/broker/broker.ts +206 -78
  327. package/src/sdk/broker/discovery.ts +1 -1
  328. package/src/sdk/broker/ensure.ts +3 -1
  329. package/src/sdk/broker/lifecycle-codec.ts +11 -0
  330. package/src/sdk/broker/lifecycle-ledger.ts +371 -74
  331. package/src/sdk/broker/lifecycle.ts +1399 -142
  332. package/src/sdk/broker/process-incarnation.ts +5 -13
  333. package/src/sdk/broker/session-index.ts +145 -56
  334. package/src/sdk/broker/state-version.ts +21 -0
  335. package/src/sdk/broker/transport.ts +1 -1
  336. package/src/sdk/bus/chat-daemon-cli.ts +2 -0
  337. package/src/sdk/bus/chat-daemon-control.ts +8 -28
  338. package/src/sdk/bus/chat-effect-journal.ts +10 -2
  339. package/src/sdk/bus/config-commands.ts +5 -4
  340. package/src/sdk/bus/config.ts +98 -0
  341. package/src/sdk/bus/conversation-store.ts +5 -29
  342. package/src/sdk/bus/daemon-paths.ts +2 -0
  343. package/src/sdk/bus/html-format.ts +20 -3
  344. package/src/sdk/bus/index.ts +782 -94
  345. package/src/sdk/bus/lifecycle-control-runtime.ts +91 -33
  346. package/src/sdk/bus/natives-augment.d.ts +26 -1
  347. package/src/sdk/bus/notification-service.ts +168 -20
  348. package/src/sdk/bus/rate-limit-pool.ts +58 -14
  349. package/src/sdk/bus/recent-activity.ts +188 -74
  350. package/src/sdk/bus/rich-document.ts +258 -0
  351. package/src/sdk/bus/rich-render.ts +62 -70
  352. package/src/sdk/bus/telegram-daemon-cli.ts +15 -59
  353. package/src/sdk/bus/telegram-daemon-contract.ts +9 -4
  354. package/src/sdk/bus/telegram-daemon.ts +1389 -237
  355. package/src/sdk/bus/threaded-inbound.ts +8 -3
  356. package/src/sdk/bus/threaded-render.ts +57 -1
  357. package/src/sdk/bus/topic-registry.ts +120 -13
  358. package/src/sdk/host/control/dispatch.ts +14 -2
  359. package/src/sdk/host/control/operations.ts +6 -1
  360. package/src/sdk/host/host.ts +44 -2
  361. package/src/sdk/host/query/handlers.ts +20 -22
  362. package/src/sdk/host/query/revision-store.ts +80 -57
  363. package/src/sdk/index.ts +1 -0
  364. package/src/sdk/protocol/operation-inventory.generated.json +943 -1907
  365. package/src/sdk/session-directory.ts +141 -0
  366. package/src/sdk/session.ts +462 -480
  367. package/src/session/agent-session.ts +1700 -583
  368. package/src/session/agent-storage.ts +18 -0
  369. package/src/session/cache-economics.ts +25 -8
  370. package/src/session/fallback-chain-controller.ts +53 -3
  371. package/src/session/internal/managed-session-scope.ts +2226 -0
  372. package/src/session/internal/managed-session-storage.ts +453 -0
  373. package/src/session/messages.ts +91 -2
  374. package/src/session/session-manager-internal.ts +33 -0
  375. package/src/session/session-manager.ts +1112 -333
  376. package/src/session/session-storage.ts +444 -39
  377. package/src/session/volatile-context-pruning.ts +78 -0
  378. package/src/setup/credential-auto-import.ts +2 -1
  379. package/src/setup/hermes/templates/operator-instructions.v1.md +1 -1
  380. package/src/setup/provider-onboarding.ts +36 -61
  381. package/src/setup/provider-presets.json +5 -0
  382. package/src/skill-state/active-state.ts +3 -13
  383. package/src/skill-state/{deep-interview-mutation-guard.ts → workflow-mutation-guard.ts} +47 -29
  384. package/src/skill-state/workflow-state-contract.ts +6 -41
  385. package/src/slash-commands/builtin-registry.ts +46 -11
  386. package/src/system-prompt.ts +37 -44
  387. package/src/task/agents.ts +19 -1
  388. package/src/task/executor.ts +90 -6
  389. package/src/task/index.ts +36 -21
  390. package/src/thinking.ts +21 -6
  391. package/src/tool-discovery/tool-index.ts +2 -134
  392. package/src/tools/ask.ts +157 -21
  393. package/src/tools/ast-edit.ts +1 -1
  394. package/src/tools/bash.ts +38 -0
  395. package/src/tools/browser/dead-tab-recovery.ts +78 -0
  396. package/src/tools/browser/tab-supervisor.ts +282 -36
  397. package/src/tools/computer.ts +10 -3
  398. package/src/tools/cron.ts +30 -16
  399. package/src/tools/eval.ts +1 -2
  400. package/src/tools/fetch.ts +11 -4
  401. package/src/tools/index.ts +76 -24
  402. package/src/tools/output-meta.ts +19 -7
  403. package/src/tools/read.ts +219 -64
  404. package/src/tools/resource-gc.ts +2 -2
  405. package/src/tools/search-tool-bm25.ts +11 -74
  406. package/src/tools/subagent.ts +43 -2
  407. package/src/utils/event-bus.ts +9 -4
  408. package/src/utils/file-mentions.ts +4 -4
  409. package/src/web/search/index.ts +3 -3
  410. package/dist/types/discovery/plugin-dir-roots.d.ts +0 -15
  411. package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +0 -7
  412. package/src/discovery/plugin-dir-roots.ts +0 -28
  413. package/src/runtime-mcp/discoverable-tool-metadata.ts +0 -25
@@ -1,7 +1,7 @@
1
1
  import type { AgentMessage } from "@gajae-code/agent-core";
2
2
  import type { AssistantMessage, Message } from "@gajae-code/ai";
3
3
  import { type Component, type TUI } from "@gajae-code/tui";
4
- import type { InteractiveModeContext, IrcArrivalSnapshot, TranscriptRebuildPolicy } from "../../modes/types";
4
+ import { type ComposerSubmissionOptions, type InteractiveModeContext, type IrcArrivalSnapshot, type TranscriptRebuildPolicy } from "../../modes/types";
5
5
  import { type SessionContext } from "../../session/session-manager";
6
6
  import { type ParsedIrcMessage } from "./irc-message";
7
7
  export type { TranscriptRebuildPolicy } from "../../modes/types";
@@ -63,7 +63,7 @@ export declare class UiHelpers {
63
63
  showWarning(warningMessage: string): void;
64
64
  showNewVersionNotification(newVersion: string): void;
65
65
  updatePendingMessagesDisplay(): void;
66
- queueCompactionMessage(text: string, mode: "steer" | "followUp"): void;
66
+ queueCompactionMessage(text: string, mode: "steer" | "followUp", options?: ComposerSubmissionOptions): void;
67
67
  isKnownSlashCommand(text: string): boolean;
68
68
  flushCompactionQueue(options?: {
69
69
  willRetry?: boolean;
@@ -181,7 +181,7 @@ export declare class MCPManager {
181
181
  */
182
182
  executePrompt(name: string, promptName: string, args?: Record<string, string>, options?: MCPRequestOptions): Promise<MCPGetPromptResult | undefined>;
183
183
  /**
184
- * Get all server instructions (for system prompt injection).
184
+ * Get connected-server instructions for request-scoped untrusted user-role context.
185
185
  */
186
186
  getServerInstructions(): Map<string, string>;
187
187
  /**
@@ -1,4 +1,6 @@
1
- import { type BrokerDiscovery, redactBrokerDiscovery } from "./discovery";
1
+ import type { NativeDirectoryTreeSnapshot } from "@gajae-code/natives";
2
+ import { type DirectoryMigrationPolicy } from "../session-directory";
3
+ import { type BrokerDiscovery, type RedactedBrokerDiscovery } from "./discovery";
2
4
  import { type LifecycleDurableEffectsReceipt, LifecycleLedger, type LifecycleStartupFailureReceipt } from "./lifecycle-ledger";
3
5
  import { SessionIndex } from "./session-index";
4
6
  export interface BrokerSettings {
@@ -6,18 +8,81 @@ export interface BrokerSettings {
6
8
  packageGeneration?: string;
7
9
  port?: number;
8
10
  heartbeatTtlMs?: number;
11
+ /** Broker-owned migration policy. Client lifecycle frames cannot select it. */
12
+ resolveDirectoryMigration?: (_cwd: string) => Promise<DirectoryMigrationPolicy>;
9
13
  }
14
+ type ResolvedBrokerSettings = {
15
+ agentDir: string;
16
+ packageGeneration: string;
17
+ port: number;
18
+ heartbeatTtlMs: number;
19
+ resolveDirectoryMigration: (_cwd: string) => Promise<DirectoryMigrationPolicy>;
20
+ };
10
21
  export type BrokerErrorCode = "idempotency_conflict" | "terminal_uncertain" | "broker_restarting" | "unavailable" | "endpoint_stale" | "resource_gone" | "invalid_input" | "spawn_failed" | "readiness_timeout" | "close_refused" | "not_found" | "live_session" | "cleanup_pending" | (string & {});
22
+ export type BrokerCleanupIdentity = {
23
+ dev: string;
24
+ ino: string;
25
+ size: number;
26
+ mtimeNs: string;
27
+ sha256: string;
28
+ };
29
+ /** Exact retry evidence; detached paths are managed-receipt references, never caller authority. */
30
+ export type BrokerLifecycleCleanupFile = {
31
+ /** Original lifecycle-owned path, retained only for exact identity validation. */
32
+ path: string;
33
+ identity: BrokerCleanupIdentity;
34
+ /** Monotonic append-only cleanup attempt. */
35
+ attempt?: number;
36
+ /** Immutable no-replace quarantine destination persisted before native detach. */
37
+ plannedPath: string;
38
+ /** Native-returned detached path, persisted after a failed post-detach cleanup. */
39
+ detachedPath?: string;
40
+ /** Append-only terminal proof for this exact artifact; completed entries are never retried. */
41
+ completed?: true;
42
+ };
43
+ /** Durable root-tree authority for broker artifact cleanup. */
44
+ export type BrokerArtifactTree = {
45
+ identity: BrokerCleanupIdentity;
46
+ snapshot: NativeDirectoryTreeSnapshot;
47
+ plannedPath: string;
48
+ detachedPath?: string;
49
+ completed?: true;
50
+ };
11
51
  export type BrokerCleanupEvidence = {
12
- phase: "artifacts" | "transcript" | "metadata";
13
- artifactsIdentity?: {
14
- dev: string;
15
- ino: string;
16
- };
17
- transcriptIdentity?: {
18
- dev: string;
19
- ino: string;
20
- };
52
+ phase: "artifacts" | "transcript" | "metadata" | "lifecycle";
53
+ /** Ledger-bound deletion target; never reconstructed from a retry request. */
54
+ sessionsRoot?: string;
55
+ transcriptPath?: string;
56
+ cwd?: string;
57
+ metadataRoot?: string;
58
+ sessionId?: string;
59
+ artifactsIdentity?: BrokerCleanupIdentity;
60
+ transcriptIdentity?: BrokerCleanupIdentity;
61
+ /** Identity-bound lifecycle metadata marker retained when exact cleanup is deferred. */
62
+ metadataIdentity?: BrokerCleanupIdentity;
63
+ metadataPath?: string;
64
+ /** Monotonic append-only cleanup attempt. */
65
+ metadataAttempt?: number;
66
+ /** No-replace quarantine destination persisted before lifecycle metadata detach. */
67
+ plannedMetadataPath?: string;
68
+ /** Native-returned metadata quarantine path retained until identity-bound reconciliation succeeds. */
69
+ detachedMetadataPath?: string;
70
+ /** Append-only terminal proof for lifecycle metadata cleanup. */
71
+ metadataCompleted?: true;
72
+ detachedArtifactsPath?: string;
73
+ detachedTranscriptPath?: string;
74
+ /** Durable proof that artifact cleanup completed before transcript mutation. */
75
+ artifactsRemoved?: boolean;
76
+ /** Preauthorized no-replace artifact quarantine path persisted before detach. */
77
+ plannedArtifactsPath?: string;
78
+ /** Identity-bound artifact tree authority persisted before broker detach and replayed exactly. */
79
+ artifactTree?: BrokerArtifactTree;
80
+ /** Preauthorized no-replace transcript quarantine path persisted before detach. */
81
+ plannedTranscriptPath?: string;
82
+ /** Fully identity-bound startup-failure cleanup plan, persisted before any detach. */
83
+ lifecycleFiles?: BrokerLifecycleCleanupFile[];
84
+ /** Delete metadata receipts authorize only the canonical marker/ready sibling pair. */
85
+ lifecycleDeleteMetadata?: true;
21
86
  };
22
87
  export type BrokerResponse = {
23
88
  ok: true;
@@ -37,17 +102,18 @@ export type BrokerResponse = {
37
102
  };
38
103
  export declare class Broker {
39
104
  #private;
40
- readonly settings: Required<BrokerSettings>;
105
+ readonly settings: ResolvedBrokerSettings;
41
106
  readonly index: SessionIndex;
42
107
  readonly ledger: LifecycleLedger;
43
108
  discovery: BrokerDiscovery | null;
44
109
  constructor(settings: BrokerSettings);
45
110
  start(): Promise<BrokerDiscovery>;
46
111
  get ownsDiscovery(): boolean;
47
- status(): ReturnType<typeof redactBrokerDiscovery> | null;
112
+ status(): RedactedBrokerDiscovery | null;
48
113
  heartbeat(): Promise<void>;
49
114
  stop(): Promise<void>;
50
115
  handleRequest(operation: string, input: Record<string, unknown>, idempotencyKey?: string): Promise<BrokerResponse>;
51
116
  }
52
117
  /** Test-only hook for simulating a process crash after terminal persistence verification. */
53
118
  export declare function setTerminalPersistenceHookForTest(broker: Broker, hook: (() => void) | undefined): void;
119
+ export {};
@@ -0,0 +1,4 @@
1
+ /** Decodes persisted lifecycle bytes without replacement characters before JSON parsing. */
2
+ export declare function decodeLifecycleUtf8(bytes: Uint8Array): string;
3
+ /** Parses persisted lifecycle JSON only after fatal UTF-8 decoding. */
4
+ export declare function parseLifecycleJson(bytes: Uint8Array): unknown;
@@ -83,10 +83,24 @@ export type BeginResult = {
83
83
  kind: "in_progress";
84
84
  entry: LifecycleLedgerEntry;
85
85
  };
86
+ export interface LifecycleLedgerLimits {
87
+ maxBytes?: number;
88
+ maxLineBytes?: number;
89
+ maxRows?: number;
90
+ }
86
91
  export declare class LifecycleLedger {
87
92
  #private;
88
- constructor(agentDir: string);
93
+ constructor(agentDir: string, limits?: LifecycleLedgerLimits);
89
94
  open(): Promise<this>;
95
+ /**
96
+ * Reads terminal proof for one request without recovering or changing the ledger.
97
+ *
98
+ * This intentionally accepts an unrelated unterminated final write: concurrent
99
+ * appenders may have started a different row after this request's synced terminal
100
+ * row. Complete rows are still decoded and validated strictly, and any incomplete
101
+ * tail that identifies this request withholds proof.
102
+ */
103
+ readTerminal(identity: string, requestHash: string): Promise<LifecycleLedgerEntry | undefined>;
90
104
  get warnings(): readonly string[];
91
105
  begin(identity: string, requestHash: string): Promise<BeginResult>;
92
106
  transition(identity: string, state: LifecycleState, fields?: Omit<Partial<LifecycleLedgerEntry>, "identity" | "requestHash" | "state" | "ts">): Promise<LifecycleLedgerEntry>;
@@ -1,5 +1,5 @@
1
1
  import type { SdkStartupFailure, SdkStartupRollbackResult } from "../startup-capability";
2
- import type { Broker, BrokerResponse } from "./broker";
2
+ import type { Broker, BrokerCleanupEvidence, BrokerResponse } from "./broker";
3
3
  import type { LifecycleDurableEffectsReceipt, LifecycleStartupFailureReceipt } from "./lifecycle-ledger";
4
4
  import { type ProcessIncarnationCommandRunner, type ProcessIncarnationOptions, parseDarwinProcessIncarnation, processIncarnation } from "./process-incarnation";
5
5
  import { type SdkInternalSpawnCommand } from "./runtime";
@@ -21,6 +21,8 @@ type LifecycleCommand = SdkInternalSpawnCommand | {
21
21
  args: string[];
22
22
  };
23
23
  type LifecycleCommandResolver = () => LifecycleCommand;
24
+ /** Test-only hook for simulating a crash immediately after one exact lifecycle detach. */
25
+ export declare function setLifecycleCleanupHookForTest(broker: Broker, hook: (() => void) | undefined): void;
24
26
  export declare function setLifecycleCommandResolverForTest(broker: Broker, resolver: LifecycleCommandResolver | undefined): void;
25
27
  export declare function setLifecycleTimingForTest(broker: Broker, timing: LifecycleTiming | undefined): void;
26
28
  export declare function hasValidLifecycleDeadlines(value: LifecycleDeadlines, now?: number): boolean;
@@ -43,6 +45,7 @@ export interface SessionLifecycleTranscriptIdentity {
43
45
  size: number;
44
46
  mtimeMs: number;
45
47
  mtimeNs: string;
48
+ sha256: string;
46
49
  }
47
50
  export interface SessionLifecycleLaunchRequest {
48
51
  operation: "session.create" | "session.fork" | "session.resume";
@@ -66,6 +69,7 @@ export interface SessionLifecycleLaunchRequest {
66
69
  lifecycleCleanupDeadlineAt: number;
67
70
  }
68
71
  export declare function readSessionLifecycleLaunchRequest(value: string | undefined, now?: number): SessionLifecycleLaunchRequest;
72
+ type CleanupEvidence = BrokerCleanupEvidence;
69
73
  export declare function setProcessIncarnationForTest(broker: Broker, value: ((pid: number) => string | undefined) | undefined): void;
70
74
  /** The child writes this only after its endpoint and semantic ready event are both live. */
71
75
  export declare function writeSessionLifecycleReady(root: string, id: string, effectMarker: string): Promise<void>;
@@ -82,4 +86,4 @@ export interface LifecycleExecutionOutcome {
82
86
  deferredArtifactCleanup?: () => Promise<void>;
83
87
  }
84
88
  /** Returns the response together with every durable lifecycle fact needed for truthful replay. */
85
- export declare function executeLifecycle(broker: Broker, operation: string, input: Input, identity: string): Promise<LifecycleExecutionOutcome>;
89
+ export declare function executeLifecycle(broker: Broker, operation: string, input: Input, identity: string, cleanup?: CleanupEvidence): Promise<LifecycleExecutionOutcome>;
@@ -9,6 +9,8 @@ export interface ProcessIncarnationOptions {
9
9
  }
10
10
  /** Parse the microsecond-resolution start timestamp returned by Darwin proc_pidinfo. */
11
11
  export declare function parseDarwinProcessIncarnation(info: Uint8Array): string | undefined;
12
+ /** Whether `value` is a canonical process-incarnation string (`linux:`/`darwin:`/`windows:`). */
13
+ export declare function isProcessIncarnation(value: unknown): value is string;
12
14
  /** A PID is reusable; bind it to the strongest OS-provided process start incarnation available. */
13
15
  export declare function processIncarnation(pid: number, options?: ProcessIncarnationOptions): string | undefined;
14
16
  export {};
@@ -46,7 +46,6 @@ export declare class SessionIndex {
46
46
  get indexSeq(): number;
47
47
  append(input: Omit<SessionIndexEvent, "version" | "indexSeq" | "checksum" | "ts"> & Partial<Pick<SessionIndexEvent, "ts">>): Promise<SessionIndexEvent>;
48
48
  snapshot(): Promise<void>;
49
- assertSupportedStateVersions(): Promise<void>;
50
49
  listSessions(): SessionList;
51
50
  hostUnregisteredAfter(registration: Pick<IndexedSession, "sessionId" | "endpointGeneration" | "pid" | "indexSeq" | "lifecycleRequestId">): {
52
51
  indexSeq: number;
@@ -1,4 +1,5 @@
1
1
  export declare const SDK_STATE_VERSION = 1;
2
+ export declare const SESSION_INDEX_SNAPSHOT_VERSION = 2;
2
3
  export declare class UnsupportedStateVersionError extends Error {
3
4
  readonly file: string;
4
5
  readonly version: number;
@@ -6,3 +7,4 @@ export declare class UnsupportedStateVersionError extends Error {
6
7
  constructor(file: string, version: number);
7
8
  }
8
9
  export declare function assertSupportedStateVersion(file: string, value: unknown): void;
10
+ export declare function assertSupportedSnapshotVersion(file: string, value: unknown): void;
@@ -62,6 +62,7 @@ export declare class ChatEffectJournal {
62
62
  pidIncarnation?: (pid: number) => string | undefined;
63
63
  sleep?: (ms: number) => Promise<void>;
64
64
  lockTimeoutMs?: number;
65
+ maxTerminalEffects?: number;
65
66
  });
66
67
  get filePath(): string;
67
68
  read<TPayload = unknown>(id: string): Promise<ChatEffect<TPayload> | undefined>;
@@ -5,7 +5,7 @@
5
5
  * removed), but the user can still adjust per-surface behaviour from inside a
6
6
  * session thread with small slash commands:
7
7
  *
8
- * - `/verbose` switch the mirror to verbose (full tool output + reasoning)
8
+ * - `/verbose` switch the mirror to bounded tool-owned summaries + provider-displayable reasoning summaries
9
9
  * - `/lean` switch back to lean (assistant text + tool names)
10
10
  * - `/verbosity lean|verbose`
11
11
  * - `/redact on|off` toggle redaction of streamed content
@@ -28,6 +28,9 @@ export interface NotificationSettingsSnapshot {
28
28
  botToken?: string;
29
29
  chatId?: string;
30
30
  activation?: Record<string, unknown>;
31
+ btw: {
32
+ enabled: boolean;
33
+ };
31
34
  rich: {
32
35
  enabled: boolean;
33
36
  };
@@ -65,6 +68,11 @@ export interface NotificationSettingsReader {
65
68
  getNotificationSettingsSnapshot(): NotificationSettingsSnapshot;
66
69
  getAgentDir(): string;
67
70
  }
71
+ /**
72
+ * Validate and snapshot the raw global notification configuration used by both
73
+ * the interactive host and the lightweight daemon process.
74
+ */
75
+ export declare function parseNotificationSettingsSnapshot(rawConfig?: unknown): NotificationSettingsSnapshot;
68
76
  export interface NotificationConfig {
69
77
  enabled: boolean;
70
78
  botToken?: string;
@@ -92,6 +100,9 @@ export interface NotificationConfig {
92
100
  */
93
101
  sessionScope: "all" | "primary";
94
102
  idleTimeoutMs: number;
103
+ btw: {
104
+ enabled: boolean;
105
+ };
95
106
  rich: {
96
107
  enabled: boolean;
97
108
  };
@@ -9,6 +9,7 @@ export interface DaemonPaths {
9
9
  dir: string;
10
10
  lock: string;
11
11
  state: string;
12
+ ownership: string;
12
13
  roots: string;
13
14
  steal: string;
14
15
  aliases: string;
@@ -26,8 +26,9 @@ export declare function code(raw: string): string;
26
26
  export declare function pre(raw: string): string;
27
27
  /**
28
28
  * Convert a bounded markdown subset into Telegram HTML. Supported: fenced code,
29
- * inline code, `**bold**`, `*italic*`, `[text](url)` (safe schemes only),
30
- * `#` headers, `>` blockquotes, and GFM tables (rendered as a monospace block).
29
+ * inline code, `**bold**`, `*italic*`, `~~strikethrough~~`, `[text](url)`
30
+ * (safe schemes only), `#` headers, `>` blockquotes, and GFM tables (rendered
31
+ * as a monospace block).
31
32
  * Unsupported or malformed markdown is left as escaped literal text — never
32
33
  * emitted as unbalanced tags.
33
34
  */
@@ -17,6 +17,7 @@
17
17
  * Enable with Settings notifications config, `GJC_NOTIFICATIONS=1` (a token is
18
18
  * generated), or `GJC_NOTIFICATIONS_TOKEN`.
19
19
  */
20
+ import type { Tool } from "@gajae-code/ai";
20
21
  import { NotificationServer } from "@gajae-code/natives";
21
22
  import { Settings } from "../../config/settings";
22
23
  import type { ExtensionAPI, ExtensionContext } from "../../extensibility/extensions";
@@ -259,6 +260,9 @@ export declare class PresentationArbiter {
259
260
  cancel(gateId: string, reason: string): void;
260
261
  dispose(): void;
261
262
  }
263
+ /** Stable projection of the tool-owned safe-display seam (never the full Tool surface). */
264
+ type SafeSummaryTool = Pick<Tool, "safeSummary" | "safeSummaryFields">;
265
+ export declare function projectToolSummary(tool: SafeSummaryTool | undefined, kind: "args" | "result", value: unknown): string | undefined;
262
266
  export declare function notificationsEnabled(): boolean;
263
267
  /** Workflow-gate answer shape. */
264
268
  interface GateAnswer {
@@ -304,6 +308,26 @@ export interface NotificationControlCommandResult {
304
308
  }>;
305
309
  }
306
310
  export declare function executeNotificationControlCommand(command: NotificationControlCommandPayload | undefined, ctx: ExtensionContext, api: ExtensionAPI, expectedSessionId?: string): Promise<NotificationControlCommandResult>;
311
+ interface EphemeralTurnAuthority {
312
+ sessionId: string;
313
+ endpointDigest: string;
314
+ eventGeneration: number;
315
+ }
316
+ /** Host-owned, bounded idempotency and cancellation lifecycle for v3 side turns. */
317
+ export declare class EphemeralTurnHost {
318
+ #private;
319
+ constructor(sendTo: (connectionId: string, frame: Record<string, unknown>) => void, execute: (question: string, signal: AbortSignal) => Promise<{
320
+ replyText: string;
321
+ }>, now?: () => number);
322
+ configureAuthority(authority: EphemeralTurnAuthority): void;
323
+ disable(): void;
324
+ enable(): void;
325
+ dispose(): void;
326
+ handle(connectionId: string, frame: Record<string, unknown>): boolean;
327
+ sessionUnavailable(sessionId: string): void;
328
+ /** Testable event-ring eviction boundary; tombstones remain idempotency authority. */
329
+ evictTerminalEvents(): void;
330
+ }
307
331
  export declare function createNotificationsExtension(api: ExtensionAPI, options?: {
308
332
  settings?: Settings;
309
333
  ensureTelegramDaemon?: (input: {
@@ -314,6 +338,11 @@ export declare function createNotificationsExtension(api: ExtensionAPI, options?
314
338
  /** Suppress auto-delivery for a GJC-spawned child under `sessionScope=primary`. */
315
339
  spawnedByGjc?: boolean;
316
340
  controller?: NotificationSessionController;
341
+ /** Whether this host mode can own the root SDK endpoint. Default: true. */
342
+ sdkHostModeSupported?: boolean;
317
343
  onSdkRequest?: (kind: "control" | "query", connectionId: string, frame: Record<string, unknown>) => void;
344
+ runEphemeralTurn?: (promptText: string, signal: AbortSignal) => Promise<{
345
+ replyText: string;
346
+ }>;
318
347
  }): void;
319
348
  export {};
@@ -68,6 +68,8 @@ export declare function daemonCloseSession(env?: NodeJS.ProcessEnv, deps?: {
68
68
  * prefix against saved history and fail closed (`ambiguous`/`notFound`) before
69
69
  * cold-restarting exactly one resolved session via the daemon-safe launcher. */
70
70
  export declare function daemonResumeSession(env?: NodeJS.ProcessEnv, opts?: {
71
+ agentDir?: string;
72
+ /** Explicit managed root for isolated tests. */
71
73
  sessionsRoot?: string;
72
74
  listSessions?: (env: NodeJS.ProcessEnv) => GjcTmuxSessionStatus[];
73
75
  ownerIsolationProbe?: OwnerIsolationProbe;
@@ -100,6 +102,8 @@ export declare function buildOrchestratorDeps(input: {
100
102
  auditRedactionKey: Uint8Array;
101
103
  /** Root of saved session histories (`<agentDir>/sessions`), for resume resolution. */
102
104
  sessionsRoot?: string;
105
+ /** Agent directory used for readonly managed-session resume resolution. */
106
+ agentDir?: string;
103
107
  env?: NodeJS.ProcessEnv;
104
108
  }): OrchestratorDeps;
105
109
  /**
@@ -5,10 +5,29 @@ import type { Settings } from "../../config/settings";
5
5
  * can never leak a credential regardless of where the string originated.
6
6
  */
7
7
  export declare function sanitizeDiagnostic(text: string, token?: string): string;
8
+ /** Identity evidence required to remove precisely the endpoint that was inspected. */
9
+ export interface NotificationEndpointFileIdentity {
10
+ dev: bigint;
11
+ ino: bigint;
12
+ size: bigint;
13
+ mtimeNs: bigint;
14
+ sha256: string;
15
+ }
16
+ export interface NotificationEndpointFile {
17
+ bytes: Buffer;
18
+ identity: NotificationEndpointFileIdentity;
19
+ }
20
+ export interface NotificationExactUnlinkResult {
21
+ ok: boolean;
22
+ code?: string;
23
+ detachedPath?: string;
24
+ }
8
25
  /** Minimal filesystem surface the service needs; injectable for tests. */
9
26
  export interface NotificationServiceFs {
10
27
  readdir(dir: string): Promise<string[]>;
11
28
  readFile(file: string, encoding: "utf8"): Promise<string>;
29
+ readEndpointFile(file: string): Promise<NotificationEndpointFile>;
30
+ exactUnlink(file: string, identity: NotificationEndpointFileIdentity): Promise<NotificationExactUnlinkResult>;
12
31
  unlink(file: string): Promise<void>;
13
32
  /**
14
33
  * Atomically create `file` with O_EXCL semantics: resolves `true` when this
@@ -123,6 +142,7 @@ export interface NotificationRecoveryReport {
123
142
  endpointsRemoved: RecoveredEndpoint[];
124
143
  endpointsKept: number;
125
144
  endpointsUnreadable: number;
145
+ endpointsDetached?: string[];
126
146
  daemon: {
127
147
  action: DaemonRecoveryAction;
128
148
  detail: string;
@@ -41,6 +41,11 @@ export interface RateLimitItem<T = unknown> {
41
41
  /** Opaque payload the caller maps to an actual Telegram send. */
42
42
  payload: T;
43
43
  }
44
+ export type RateLimitDisposition = "queued" | "sending" | "accepted" | "rejected" | "ambiguous" | "removed" | "expired";
45
+ export interface RateLimitHandle {
46
+ itemId: string;
47
+ settled: Promise<Exclude<RateLimitDisposition, "queued" | "sending">>;
48
+ }
44
49
  /** Options for {@link RateLimitPool}. */
45
50
  export interface RateLimitPoolOptions {
46
51
  /** Burst capacity (max tokens). Default 20 (Telegram per-chat burst). */
@@ -74,6 +79,7 @@ export declare class RateLimitPool<T = unknown> {
74
79
  private readonly laneCursor;
75
80
  private tokens;
76
81
  private lastRefill;
82
+ private readonly settlements;
77
83
  private seqCounter;
78
84
  constructor(options?: RateLimitPoolOptions);
79
85
  /** Number of items currently queued across all lanes. */
@@ -85,7 +91,12 @@ export declare class RateLimitPool<T = unknown> {
85
91
  * item in the same `(sessionId, lane)` replace its payload (latest wins)
86
92
  * while preserving FIFO position; identified items are always appended.
87
93
  */
88
- submit(item: RateLimitItem<T>): void;
94
+ submit(item: RateLimitItem<T>): RateLimitHandle;
95
+ /** Settle a stable item after its external transport effect has a known outcome. */
96
+ settle(itemId: string, disposition: Exclude<RateLimitDisposition, "queued" | "sending">): void;
97
+ /** Mark a granted item as owned by an external transport effect. */
98
+ markSending(itemId: string): void;
99
+ private handle;
89
100
  /**
90
101
  * Grant as many queued items as tokens allow at `nowMs`. This compatibility
91
102
  * wrapper discards items that expired during the drain.
@@ -98,7 +109,7 @@ export declare class RateLimitPool<T = unknown> {
98
109
  */
99
110
  drainWithExpired(nowMs?: number): RateLimitDrainResult<T>;
100
111
  /** Remove queued items matching `predicate` without consuming tokens. Returns removed items in lane/FIFO order. */
101
- removeWhere(predicate: (item: RateLimitItem<T>) => boolean): RateLimitItem<T>[];
112
+ removeWhere(predicate: (item: RateLimitItem<T>) => boolean, disposition?: Exclude<RateLimitDisposition, "queued" | "sending">): RateLimitItem<T>[];
102
113
  /** Remove exactly one queued item by its stable id without consuming a token. */
103
114
  removeById(itemId: string): RateLimitItem<T> | undefined;
104
115
  private refill;
@@ -1,8 +1,8 @@
1
1
  /** One ranked recent-session entry surfaced to the picker. */
2
2
  export interface RecentSessionEntry {
3
- /** Session id (the `.jsonl` file stem). */
3
+ /** Session id from the validated managed candidate header. */
4
4
  sessionId: string;
5
- /** Working directory / repo path, when recoverable from the header. */
5
+ /** Validated workspace path recorded by the managed candidate. */
6
6
  path?: string;
7
7
  /** Branch, when recoverable from the header. */
8
8
  branch?: string;
@@ -18,22 +18,31 @@ export interface RecentSessionEntry {
18
18
  internal?: boolean;
19
19
  }
20
20
  export interface RecentActivityDeps {
21
- /** Root holding `<encoded-cwd>/<sessionId>.jsonl` history files. */
22
- sessionsRoot: string;
21
+ /** Workspace whose managed sessions will be listed readonly. */
22
+ cwd: string;
23
+ /** Agent directory used to resolve the managed session scope. */
24
+ agentDir?: string;
25
+ /** Explicit managed root for isolated tests. */
26
+ sessionsRoot?: string;
23
27
  /** Optional breadcrumb session-file paths (current terminals). */
24
28
  breadcrumbPaths?: string[];
25
29
  /** Max entries to return (default 20). */
26
30
  limit?: number;
27
31
  /** Include internal helper/sub-agent sessions (default true). */
28
32
  includeInternal?: boolean;
33
+ /** Search every validated v2 workspace scope below the session root (default false). */
34
+ allWorkspaces?: boolean;
29
35
  /** Injection seam for tests. */
30
36
  readInitialLines?: (file: string, maxLines: number) => string[];
31
37
  }
32
- /**
33
- * List recent sessions ranked by history-file mtime (newest first).
34
- *
35
- * Scans `<sessionsRoot>/<encoded-cwd>/<sessionId>.jsonl`, stats each file, and
36
- * returns up to `limit` entries enriched with header metadata and a
37
- * `currentTerminal` flag for any breadcrumb-referenced session file.
38
- */
39
- export declare function listRecentSessions(deps: RecentActivityDeps): RecentSessionEntry[];
38
+ /** Lists readonly managed candidates, optionally across every validated v2 workspace scope, ranked by history-file mtime. */
39
+ export type ListRecentSessionsResult = {
40
+ kind: "complete";
41
+ entries: RecentSessionEntry[];
42
+ warnings: readonly string[];
43
+ } | {
44
+ kind: "error";
45
+ code: "scope_unavailable" | "managed_scan_failed";
46
+ message: string;
47
+ };
48
+ export declare function listRecentSessions(deps: RecentActivityDeps): Promise<ListRecentSessionsResult>;
@@ -0,0 +1,7 @@
1
+ export type RichEligibility = {
2
+ kind: "eligible";
3
+ } | {
4
+ kind: "ineligible";
5
+ };
6
+ /** Conservatively recognize `/btw` Markdown that can be represented as rich content. */
7
+ export declare function parseRichEligibility(markdown: string): RichEligibility;
@@ -2,26 +2,17 @@
2
2
  * Rich-message promotion for stable non-editable Telegram text sends.
3
3
  *
4
4
  * When enabled, the daemon promotes eligible finalized `sendMessage` payloads
5
- * carrying raw markdown to the Bot API `sendRichMessage` method. On any miss or
6
- * failure the daemon keeps the unchanged HTML `sendMessage` path, so the
7
- * off-state request bodies are byte-identical.
5
+ * carrying raw markdown to Bot API `sendRichMessage`. Only an explicit
6
+ * `{ ok: false }` response selects the unchanged HTML path; ambiguous transport
7
+ * outcomes remain single-attempt and never fall back.
8
8
  */
9
9
  import type { BotApi } from "./telegram-daemon";
10
10
  import type { ThreadedSend } from "./threaded-render";
11
11
  /**
12
- * Telegram's hard per-message character ceiling (4096). Surfaced here purely as
13
- * documentation and a marker for a future native rich-message splitter — it is
14
- * intentionally NON-BEHAVIORAL and MUST stay that way: nothing in the rich path
15
- * branches on this value.
16
- *
17
- * Overflow is already safe without it. The production final-answer text is capped
18
- * at 3500 chars upstream (`summaryFromMessage(..., 3500)`), so a promoted
19
- * `sendRichMessage` never approaches this ceiling; and if the Bot API ever rejects
20
- * an oversized rich payload it returns `{ ok: false }`, which
21
- * `deliverRichWithFallback` (below) turns into the chunked HTML `splitTelegramHtml`
22
- * fallback (each chunk ≤ TELEGRAM_MESSAGE_LIMIT). This constant only marks where a
23
- * future rich splitter would read its ceiling; wiring it into a branch would change
24
- * byte-for-byte behavior and is out of scope.
12
+ * Telegram's hard per-message character ceiling (4096). Final-answer promotion
13
+ * uses this value to keep oversized Markdown on the existing chunked HTML path.
14
+ * `/btw` eligibility has its own 32,768-scalar route guard; only a definite
15
+ * rich rejection may select the correlated HTML path.
25
16
  */
26
17
  export declare const RICH_MESSAGE_LIMIT = 4096;
27
18
  /** Wrap raw markdown in the `sendRichMessage` request payload shape. */
@@ -30,9 +21,12 @@ export declare function buildRichMessage(raw: string, extras?: {
30
21
  }): {
31
22
  rich_message: {
32
23
  markdown: string;
24
+ skip_entity_detection: true;
33
25
  };
34
26
  reply_markup?: unknown;
35
27
  };
28
+ /** Whether `/btw` Markdown may use Bot API 10.1 rich delivery. */
29
+ export declare function isBtwRichEligible(markdown: string): boolean;
36
30
  /**
37
31
  * Whether a granted send should be promoted to `sendRichMessage`. Fail-closed
38
32
  * and class-aware: every clause must hold, otherwise the daemon keeps the HTML path.
@@ -42,37 +36,21 @@ export declare function shouldPromoteRich(input: {
42
36
  send: ThreadedSend;
43
37
  }): boolean;
44
38
  /**
45
- * Deliver the promoted rich message, falling back to `fallbackDeliver` (the
46
- * unchanged HTML `sendMessage` loop) on any failure. A failure is either a
47
- * thrown transport error or a `{ ok: false }` JSON response (the transport
48
- * returns `res.json()` for JSON methods, so `ok:false` does not throw). On
49
- * failure exactly one diagnostic is logged before the fallback runs; on success
50
- * the fallback never runs.
51
- *
52
- * Returns the sent message's `message_id` on success (when the response carries
53
- * one), otherwise `undefined` — including every failure/fallback path and a
54
- * success whose response omits `result.message_id`. Callers that ignore the
55
- * return value are unaffected.
39
+ * Deliver the promoted rich message, falling back to `fallbackDeliver` only
40
+ * after an explicit `{ ok: false }` response. Transport errors and malformed or
41
+ * ambiguous responses are logged but never retried or sent again through HTML.
56
42
  */
57
43
  export declare function deliverRichWithFallback(botApi: BotApi, base: {
58
44
  chat_id: string | number;
59
45
  message_thread_id?: number;
60
- }, send: ThreadedSend, fallbackDeliver: () => Promise<void>, log?: {
46
+ }, send: ThreadedSend, signal: AbortSignal, fallbackDeliver: () => Promise<void>, log?: {
61
47
  warn(msg: string): void;
62
48
  }): Promise<number | undefined>;
63
49
  /**
64
50
  * Deliver an action-needed (ask/idle) message via `sendRichMessage`, falling
65
- * back to the unchanged HTML chunk loop on any failure. Mirrors
66
- * {@link deliverRichWithFallback} but takes an explicit markdown body plus an
67
- * optional top-level `reply_markup` (probe-confirmed: `sendRichMessage` accepts
68
- * `reply_markup` alongside `rich_message`), and surfaces a structured outcome so
69
- * the daemon can route inbound replies to the resulting message id.
70
- *
71
- * On rich success: returns `{ messageId, usedRich: true, usedFallback: false }`
72
- * where `messageId` is `res.result.message_id` when present. On a `{ ok:false }`
73
- * response or a thrown transport error: warns exactly once, runs `htmlFallback`,
74
- * and returns `{ messageId, usedRich: false, usedFallback: true }` where
75
- * `messageId` is the fallback's return value (the last HTML chunk's id).
51
+ * back to the unchanged HTML chunk loop only after an explicit `{ ok:false }`
52
+ * response. Other outcomes are ambiguous, are logged, and preserve the single
53
+ * physical rich delivery.
76
54
  */
77
55
  export declare function deliverRichActionWithFallback(botApi: BotApi, base: {
78
56
  chat_id: string | number;
@@ -80,8 +58,7 @@ export declare function deliverRichActionWithFallback(botApi: BotApi, base: {
80
58
  }, opts: {
81
59
  markdown: string;
82
60
  replyMarkup?: unknown;
83
- requireMessageId?: boolean;
84
- }, htmlFallback: () => Promise<number | undefined>, log?: {
61
+ }, signal: AbortSignal, htmlFallback: () => Promise<number | undefined>, log?: {
85
62
  warn(msg: string): void;
86
63
  }): Promise<{
87
64
  messageId?: number;