@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
@@ -1,3 +1,5 @@
1
+ import { createHash } from "node:crypto";
2
+ import * as nodeFs from "node:fs";
1
3
  import * as fs from "node:fs/promises";
2
4
  import * as path from "node:path";
3
5
  import { coordinatorMcpStateRoot, gjcRoot } from "../gjc-runtime/session-layout";
@@ -13,6 +15,35 @@ export type CoordinatorMutationClass = "sessions" | "questions" | "reports";
13
15
  export interface CoordinatorNamespace {
14
16
  profile: string | null;
15
17
  repo: string | null;
18
+ identity: string;
19
+ }
20
+
21
+ function canonicalJson(value: unknown): string {
22
+ if (value === null || typeof value === "boolean" || typeof value === "number") return JSON.stringify(value);
23
+ if (typeof value === "string") return JSON.stringify(value);
24
+ if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
25
+ if (typeof value === "object") {
26
+ const record = value as Record<string, unknown>;
27
+ return `{${Object.keys(record)
28
+ .sort()
29
+ .map(key => `${JSON.stringify(key)}:${canonicalJson(record[key])}`)
30
+ .join(",")}}`;
31
+ }
32
+ throw new Error("coordinator_namespace_invalid");
33
+ }
34
+
35
+ export function coordinatorNamespaceIdentity(env: NodeJS.ProcessEnv = process.env): string {
36
+ return `ns1_${createHash("sha256")
37
+ .update(
38
+ canonicalJson({
39
+ profile_exact: env.GJC_COORDINATOR_MCP_PROFILE ?? null,
40
+ profile_present: env.GJC_COORDINATOR_MCP_PROFILE !== undefined,
41
+ repo_exact: env.GJC_COORDINATOR_MCP_REPO ?? null,
42
+ repo_present: env.GJC_COORDINATOR_MCP_REPO !== undefined,
43
+ }),
44
+ )
45
+ .digest("hex")
46
+ .slice(0, 32)}`;
16
47
  }
17
48
 
18
49
  export interface CoordinatorMcpConfig {
@@ -114,6 +145,7 @@ export function buildCoordinatorMcpConfig(env: NodeJS.ProcessEnv = process.env):
114
145
  namespace: {
115
146
  profile: cleanScope(env.GJC_COORDINATOR_MCP_PROFILE),
116
147
  repo: cleanScope(env.GJC_COORDINATOR_MCP_REPO),
148
+ identity: coordinatorNamespaceIdentity(env),
117
149
  },
118
150
  stateRoot: path.resolve(stateRoot),
119
151
  sessionCommand: env.GJC_COORDINATOR_MCP_SESSION_COMMAND?.trim() || null,
@@ -132,12 +164,19 @@ export function buildCoordinatorMcpConfig(env: NodeJS.ProcessEnv = process.env):
132
164
  }
133
165
 
134
166
  async function realpathIfExists(value: string): Promise<string> {
135
- try {
136
- return await fs.realpath(value);
137
- } catch (error) {
138
- if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;
139
- const parent = await fs.realpath(path.dirname(value));
140
- return path.join(parent, path.basename(value));
167
+ let current = path.resolve(value);
168
+ const missing: string[] = [];
169
+ while (true) {
170
+ try {
171
+ const canonical = await fs.realpath(current);
172
+ return path.join(canonical, ...missing.reverse());
173
+ } catch (error) {
174
+ if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;
175
+ const parent = path.dirname(current);
176
+ if (parent === current) throw error;
177
+ missing.push(path.basename(current));
178
+ current = parent;
179
+ }
141
180
  }
142
181
  }
143
182
 
@@ -172,6 +211,8 @@ export async function assertCoordinatorArtifactPath(
172
211
  if (config.allowedRoots.length === 0) throw new Error("coordinator_artifact_roots_required");
173
212
  const requested = path.resolve(artifactPath);
174
213
  const canonicalRequested = await realpathIfExists(requested);
214
+ const canonicalStateRoot = await realpathIfExists(config.stateRoot);
215
+ if (isInside(canonicalRequested, canonicalStateRoot)) throw new Error("coordinator_artifact_state_root_denied");
175
216
  const roots = await canonicalAllowedRoots(config);
176
217
  if (!roots.some(root => isInside(canonicalRequested, root))) {
177
218
  throw new Error(`coordinator_artifact_outside_allowed_roots:${requested}`);
@@ -190,9 +231,33 @@ export function requireCoordinatorMutation(
190
231
  }
191
232
 
192
233
  export function coordinatorNamespacePath(config: CoordinatorMcpConfig): string {
193
- return path.join(
194
- config.stateRoot,
195
- config.namespace.profile ?? "unscoped-profile",
196
- config.namespace.repo ?? "unscoped-repo",
197
- );
234
+ return path.join(config.stateRoot, "v1", config.namespace.identity);
235
+ }
236
+
237
+ /** Opens and authorizes an artifact by the opened handle identity, not a racy pathname. */
238
+ export async function safeOpenCoordinatorArtifact(
239
+ config: CoordinatorMcpConfig,
240
+ artifactPath: unknown,
241
+ ): Promise<fs.FileHandle> {
242
+ if (typeof artifactPath !== "string" || artifactPath.trim().length === 0)
243
+ throw new Error("coordinator_artifact_path_required");
244
+ if (config.allowedRoots.length === 0) throw new Error("coordinator_artifact_roots_required");
245
+ if (process.platform !== "linux") throw new Error("artifact_identity_unavailable");
246
+ const requested = path.resolve(artifactPath);
247
+ await assertCoordinatorArtifactPath(config, requested);
248
+ const handle = await fs.open(requested, nodeFs.constants.O_RDONLY | nodeFs.constants.O_NOFOLLOW);
249
+ try {
250
+ const opened = await handle.stat({ bigint: true });
251
+ if (!opened.isFile()) throw new Error("artifact_identity_unavailable");
252
+ const canonicalTarget = await fs.realpath(`/proc/self/fd/${handle.fd}`);
253
+ const canonicalStateRoot = await realpathIfExists(config.stateRoot);
254
+ const roots = await canonicalAllowedRoots(config);
255
+ if (isInside(canonicalTarget, canonicalStateRoot)) throw new Error("coordinator_artifact_state_root_denied");
256
+ if (!roots.some(root => isInside(canonicalTarget, root)))
257
+ throw new Error(`coordinator_artifact_outside_allowed_roots:${requested}`);
258
+ return handle;
259
+ } catch (error) {
260
+ await handle.close();
261
+ throw error;
262
+ }
198
263
  }
@@ -0,0 +1,274 @@
1
+ import { randomBytes, timingSafeEqual } from "node:crypto";
2
+ import { schemaHash } from "../modes/shared/agent-wire/workflow-gate-schema";
3
+ import type { JsonSchema, WorkflowGate } from "../modes/shared/agent-wire/workflow-gate-types";
4
+ import { buildAskGateAnswerSchema, validateAskGateStageState } from "../modes/shared/agent-wire/workflow-gate-types";
5
+
6
+ export type PublicReason =
7
+ | "unsupported_gate"
8
+ | "query_unavailable"
9
+ | "pagination_malformed"
10
+ | "row_unrepresentable"
11
+ | "missing_runtime_turn"
12
+ | "invalid_runtime_turn"
13
+ | "invalid_gate_row"
14
+ | "wrong_session"
15
+ | "ownership_unavailable"
16
+ | "ownership_conflict"
17
+ | "gate_provenance_changed"
18
+ | "turn_terminal"
19
+ | "endpoint_changed"
20
+ | "terminal_race"
21
+ | "terminal_uncertain"
22
+ | "session_closing"
23
+ | "session_unavailable"
24
+ | "reported_failure"
25
+ | "validation_rejected";
26
+ export type CoordinatorQuestionStatusV1 = "pending" | "answered" | "stale" | "uncertain";
27
+ export interface CoordinatorQuestionOptionPublicV1 {
28
+ id: string;
29
+ label: string;
30
+ recommended: boolean;
31
+ }
32
+ export interface CoordinatorQuestionPublicV1 extends Record<string, unknown> {
33
+ schema_version: 1;
34
+ question_id: string;
35
+ session_id: string;
36
+ turn_id: string;
37
+ status: CoordinatorQuestionStatusV1;
38
+ stage: string;
39
+ kind: string;
40
+ prompt: string;
41
+ multi: boolean;
42
+ allow_empty: boolean;
43
+ options: CoordinatorQuestionOptionPublicV1[];
44
+ other_allowed: boolean;
45
+ clarification_allowed: boolean;
46
+ created_at: string;
47
+ updated_at: string;
48
+ answered_at: string | null;
49
+ reason: PublicReason | null;
50
+ answer_binding?: string;
51
+ }
52
+ export interface CoordinatorQuestionDiagnosticPublicV1 {
53
+ schema_version: 1;
54
+ session_id: string;
55
+ turn_id: string | null;
56
+ gate_id: string | null;
57
+ reason: PublicReason;
58
+ observed_at: string;
59
+ }
60
+ export interface CoordinatorQuestionReconciliationPublicV1 {
61
+ attempted: boolean;
62
+ complete: boolean;
63
+ revision: string | null;
64
+ observed_at: string;
65
+ reason: PublicReason | null;
66
+ }
67
+ export interface ListQuestionsSuccessV1 extends Record<string, unknown> {
68
+ ok: true;
69
+ schema_version: 1;
70
+ questions: CoordinatorQuestionPublicV1[];
71
+ diagnostics: CoordinatorQuestionDiagnosticPublicV1[];
72
+ reconciliation: CoordinatorQuestionReconciliationPublicV1;
73
+ }
74
+ export type CoordinatorAskAnswerV1 =
75
+ | { selected: string[]; other?: false }
76
+ | { selected: string[]; other: true; custom: string }
77
+ | { action: "clarify"; question: string };
78
+ export interface SubmitQuestionAnswerInputV1 {
79
+ session_id: string;
80
+ turn_id: string;
81
+ question_id: string;
82
+ answer_binding: string;
83
+ answer: CoordinatorAskAnswerV1;
84
+ idempotency_key: string;
85
+ allow_mutation: true;
86
+ }
87
+ export type SubmitQuestionAnswerSuccessV1 = {
88
+ ok: true;
89
+ schema_version: 1;
90
+ session_id: string;
91
+ turn_id: string;
92
+ question_id: string;
93
+ operation: "workflow.gate_answer";
94
+ status: "accepted";
95
+ replayed: boolean;
96
+ resolved_at: string;
97
+ };
98
+ export type SubmitQuestionAnswerValidationRejectedV1 = {
99
+ ok: false;
100
+ schema_version: 1;
101
+ session_id: string;
102
+ turn_id: string;
103
+ question_id: string;
104
+ error: { code: "validation_rejected"; message: string };
105
+ question_status: "pending";
106
+ };
107
+ export type SubmitQuestionAnswerFailureV1 = {
108
+ ok: false;
109
+ error: {
110
+ code: "not_found" | "resource_gone" | "ownership_mismatch" | "terminal_uncertain" | "idempotency_conflict";
111
+ message: string;
112
+ };
113
+ };
114
+ export interface PrivateAskGateCodecV1 {
115
+ schema_version: 1;
116
+ labels: string[];
117
+ recommended_index: number | null;
118
+ multi: boolean;
119
+ allow_empty: boolean;
120
+ other_allowed: true;
121
+ clarification_allowed: true;
122
+ }
123
+
124
+ const MAX_TEXT = 4096;
125
+ const isRecord = (value: unknown): value is Record<string, unknown> =>
126
+ typeof value === "object" && value !== null && !Array.isArray(value);
127
+ const boundedText = (value: unknown, max = 256): value is string =>
128
+ typeof value === "string" && value.length > 0 && Buffer.byteLength(value) <= max;
129
+ function sameKeys(value: Record<string, unknown>, permitted: readonly string[]): boolean {
130
+ return Object.keys(value).every(key => permitted.includes(key));
131
+ }
132
+ function validStageState(value: unknown, labels: string[]): value is Record<string, unknown> {
133
+ try {
134
+ validateAskGateStageState(value);
135
+ } catch {
136
+ return false;
137
+ }
138
+ const state = value as Record<string, unknown>;
139
+ return (
140
+ Array.isArray(state.options) &&
141
+ state.options.length === labels.length &&
142
+ state.options.every((item, index) => item === labels[index])
143
+ );
144
+ }
145
+ function askSchema(labels: string[], multi: boolean, allowEmpty: boolean): JsonSchema {
146
+ return buildAskGateAnswerSchema({ multi, allowEmpty }, labels);
147
+ }
148
+ export function decodeAskGateV1(gate: WorkflowGate): PrivateAskGateCodecV1 | null {
149
+ if (
150
+ gate.stage !== "deep-interview" ||
151
+ gate.kind !== "question" ||
152
+ !isRecord(gate.context) ||
153
+ !boundedText(gate.context.prompt, MAX_TEXT) ||
154
+ gate.context.prompt !== gate.context.title ||
155
+ !Array.isArray(gate.options) ||
156
+ gate.options.length > 32
157
+ )
158
+ return null;
159
+ const labels: string[] = [];
160
+ let recommendedIndex: number | null = null;
161
+ for (const option of gate.options) {
162
+ if (
163
+ !isRecord(option) ||
164
+ !boundedText(option.label) ||
165
+ option.value !== option.label ||
166
+ labels.includes(option.label)
167
+ )
168
+ return null;
169
+ if (option.description === "recommended") {
170
+ if (recommendedIndex !== null) return null;
171
+ recommendedIndex = labels.length;
172
+ } else if (option.description !== undefined) return null;
173
+ labels.push(option.label);
174
+ }
175
+ if (!validStageState(gate.context.stage_state, labels)) return null;
176
+ const multi = gate.context.stage_state.multi as boolean;
177
+ const allowEmpty = gate.context.stage_state.allow_empty as boolean;
178
+ if (gate.schema_hash !== schemaHash(askSchema(labels, multi, allowEmpty))) return null;
179
+ return {
180
+ schema_version: 1,
181
+ labels,
182
+ recommended_index: recommendedIndex,
183
+ multi,
184
+ allow_empty: allowEmpty,
185
+ other_allowed: true,
186
+ clarification_allowed: true,
187
+ };
188
+ }
189
+ export function projectAskGateQuestion(input: {
190
+ question_id: string;
191
+ session_id: string;
192
+ turn_id: string;
193
+ status: CoordinatorQuestionStatusV1;
194
+ stage: string;
195
+ kind: string;
196
+ prompt: string;
197
+ codec: PrivateAskGateCodecV1;
198
+ created_at: string;
199
+ updated_at: string;
200
+ answered_at: string | null;
201
+ reason: PublicReason | null;
202
+ answer_binding?: string;
203
+ }): CoordinatorQuestionPublicV1 {
204
+ return {
205
+ schema_version: 1,
206
+ question_id: input.question_id,
207
+ session_id: input.session_id,
208
+ turn_id: input.turn_id,
209
+ status: input.status,
210
+ stage: input.stage,
211
+ kind: input.kind,
212
+ prompt: input.prompt,
213
+ multi: input.codec.multi,
214
+ allow_empty: input.codec.allow_empty,
215
+ options: input.codec.labels.map((label, index) => ({
216
+ id: `opt_${index}`,
217
+ label,
218
+ recommended: input.codec.recommended_index === index,
219
+ })),
220
+ other_allowed: true,
221
+ clarification_allowed: true,
222
+ created_at: input.created_at,
223
+ updated_at: input.updated_at,
224
+ answered_at: input.answered_at,
225
+ reason: input.reason,
226
+ ...(input.status === "pending" && input.answer_binding ? { answer_binding: input.answer_binding } : {}),
227
+ };
228
+ }
229
+ export function validateCoordinatorAskAnswer(
230
+ codec: PrivateAskGateCodecV1,
231
+ answer: unknown,
232
+ ): CoordinatorAskAnswerV1 | null {
233
+ if (!isRecord(answer)) return null;
234
+ if (answer.action === "clarify")
235
+ return sameKeys(answer, ["action", "question"]) && boundedText(answer.question, MAX_TEXT)
236
+ ? { action: "clarify", question: answer.question }
237
+ : null;
238
+ if (
239
+ !sameKeys(answer, ["selected", "other", "custom", "action"]) ||
240
+ (answer.action !== undefined && answer.action !== "answer") ||
241
+ !Array.isArray(answer.selected) ||
242
+ answer.selected.length > 32 ||
243
+ !answer.selected.every(item => typeof item === "string") ||
244
+ new Set(answer.selected).size !== answer.selected.length ||
245
+ !answer.selected.every(
246
+ item => /^opt_([0-9]|[12][0-9]|3[01])$/.test(item) && Number(item.slice(4)) < codec.labels.length,
247
+ ) ||
248
+ (!codec.multi && answer.selected.length > 1)
249
+ )
250
+ return null;
251
+ if (answer.other === true)
252
+ return answer.selected.length === 0 && boundedText(answer.custom, MAX_TEXT)
253
+ ? { selected: [], other: true, custom: answer.custom }
254
+ : null;
255
+ if (
256
+ answer.other !== undefined ||
257
+ answer.custom !== undefined ||
258
+ (!codec.allow_empty && answer.selected.length === 0)
259
+ )
260
+ return null;
261
+ return { selected: [...answer.selected] };
262
+ }
263
+ export function translateCoordinatorAskAnswer(codec: PrivateAskGateCodecV1, answer: CoordinatorAskAnswerV1): unknown {
264
+ if ("action" in answer) return answer;
265
+ return { ...answer, selected: answer.selected.map(id => codec.labels[Number(id.slice(4))]!) };
266
+ }
267
+ export function createAnswerBinding(): string {
268
+ return randomBytes(32).toString("base64url");
269
+ }
270
+ export function answerBindingMatches(binding: string, expected: string): boolean {
271
+ const left = Buffer.from(binding);
272
+ const right = Buffer.from(expected);
273
+ return left.length === right.length && timingSafeEqual(left, right);
274
+ }