@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
package/CHANGELOG.md CHANGED
@@ -2,6 +2,56 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.11.2] - 2026-07-19
6
+
7
+ ### Changed
8
+ - Simplified the release CI to a minimal, industry-standard workflow: a version tag builds the native addons and binaries, then publishes to npm and cuts the GitHub Release in one self-contained job graph. Removed the source-SHA re-verification gate, evidence-provenance handshake, and draft/finalize multi-job dance that made every version-bump commit fail CI. The lint/type-check job is now native-free (biome + tsc); runtime doc and SDK-canonicalization checks moved to the test job so they run with a built addon.
9
+
10
+ ### Fixed
11
+ - The Python eval runtime now honors the documented `GJC_*` environment variables instead of silently reading only legacy `PI_*` names. `GJC_PY` (tokens `0`/`bash`, `1`/`py`, `js`, `mix`/`both`) overrides the eval backend allowance with precedence over legacy `PI_PY`/`PI_JS`; `GJC_PYTHON_SKIP_CHECK`, `GJC_PYTHON_IPC_TRACE`, and `GJC_PYTHON_INTEGRATION` are read first with `PI_*` fallback (OR semantics, so either truthy name wins). Operators following `docs/environment-variables.md` and `docs/python-repl.md` who set `GJC_PY=py` previously saw no effect — a silent docs/runtime contract break. Legacy `PI_*` names remain supported for backward compatibility.
12
+
13
+ ### Fixed
14
+ - Team worker launches now receive the validated owning `GJC_SESSION_ID` for sanctioned session-scoped writes while preserving absent identity, fail-closed resolution, and separate spawn provenance (#2597).
15
+ - Managed and explicit session directories now canonicalize benign ancestor symlinks (e.g. macOS `/var -> /private/var`, a symlinked `$HOME` or project directory) to a symlink-free trusted root before the strict owner-only and reparse guards run, so session creation, moves, resume, and writes no longer fail with `reparse_point` / `Unsafe reparse storage path` under a symlinked temp root or home. The native primitive stays strict and continues to reject symlinked components at or below the trusted root.
16
+ - Skill invocation failures now list available skill names so agents can recover from typos without a blind retry loop.
17
+ - Workflow state receipts now use canonical session-layout paths, require resolved session identity, and report a `state_path` that matches native write/clear output (#2393).
18
+ - Coordinator MCP operational calls now canonically bootstrap or reuse the agent-global SDK broker when discovery is absent or stale, while coordinator/hermes JSON checks report catalog and broker-discovery readiness separately without mutating broker state (#2552).
19
+ - Coordinator MCP question polling now requires a session, reconciles pending workflow gates into bounded public questions, diagnostics, and reconciliation state, and submits bound idempotent answers through `workflow.gate_answer` without exposing private gate payloads (#2550).
20
+ - Runtime skill discovery now follows native user config-root precedence: nearest project, canonical `GJC_CONFIG_DIR`/`PI_CONFIG_DIR`/`.gjc` `agent/skills`, configured legacy `<config>/skills`, then historical legacy `~/.gjc/skills`, preserving exact fallback precedence (#2572).
21
+ - Opt-in stalled team-worker continuation now remains default-off (`GJC_TEAM_AUTO_CONTINUE_STALLED_WORKERS=1`) and sends at most two fenced, journaled fixed prompts only to a verified stale worker pane with a matching live claim and sufficient lease; unknown restart state fails closed, with no provider replay, pane lifecycle action, or claim mutation (#2580).
22
+
23
+ ### Fixed
24
+ - SDK host response delivery to a disconnected client no longer escalates a second structured-error send failure into a process-level unhandled rejection; failures stay local to that connection.
25
+
26
+ ### Fixed
27
+ - Repository LSP configuration can no longer define process-affecting server behavior: project files may control declarative matching, activation, and capabilities, but cannot set launch fields, initialization options, or opaque server settings. Trusted canonical user configuration outside the project retains those overrides; project-controlled plugin roots and the quarantined `--plugin-dir` surface cannot inject them. Automatic discovery uses trusted external executables and rejects repository-owned lexical paths as well as symlink-resolved project binaries; status uses the session cwd as its lspmux trust root. `GJC_DISABLE_LSPMUX=1` is the canonical opt-out and `PI_DISABLE_LSPMUX=1` is a supported compatibility alias; either truthy value disables lspmux probing and wrapping.
28
+ - Palette slash commands now run only from an empty composer; drafts are never touched.
29
+ - Aborting a session without an enabled active goal no longer suppresses the first reminder when a goal is activated later; active-goal abort suppression is one-shot, goal-owned, and clears across inactive or replacement-goal transitions (#2436).
30
+ - Palette slash submissions no longer clear or rewrite composer text, cursor state, history, or pending images created while an asynchronous input hook is awaiting; canonical keyboard submission cleanup remains unchanged (#2441).
31
+ - Dead browser-tab recovery now expires descriptors without releasing replacement, revived, or differently owned tabs, while exactly-once teardown closes stale targets and releases browser holds without refcount underflow (#2437).
32
+ - Local-memory Phase 1 no longer processes history from another working directory.
33
+
34
+ ### Added
35
+ - Double-Esc now clears an idle draft after a confirmation hint, saving it to prompt history; from an empty editor it follows the configured tree, branch, or disabled action.
36
+ - Added a searchable command palette with direct action dispatch; slash commands run only from an empty composer, and drafts are never touched.
37
+ - Added deep-interview intent manifests that preserve user-locked artifacts, surfaces, and integrations through Round 0.
38
+ - Added Telegram `/btw <question>` support through the `ephemeral_turn_v1` SDK capability in authorized known private-session topics. It uses current-session context in an isolated side turn without injecting or persisting user or assistant messages in main history, remains available while the main turn is busy, permits two concurrent questions per logical session, and cancels provider work at the 120-second host deadline; `notifications.telegram.btw.enabled` defaults to `true` as the local kill switch.
39
+ - Telegram `/btw` replies now use eligible complete Bot API 10.1 structured Markdown once as `{rich_message:{markdown,skip_entity_detection:true}}`, correlated in the source topic. Tables and math use Telegram Markdown support rather than outgoing native blocks or media; ineligible content and definite rich rejection use correlated HTML, while ambiguous outcomes never retry or fall back and `/rich off` remains HTML-only.
40
+
41
+ ### Fixed
42
+
43
+ - Sessions running a managed model fallback chain no longer wedge with repeated `Retry failed after N attempts: The object can not be cloned.` after a provider HTTP error whose response carried headers. The live `Headers` instance attached to the provider error was not structured-cloneable, so the managed attempt snapshot replaced the real provider failure with a local `DataCloneError` on every model in the chain — misreporting `Model fallback chain exhausted` and permanently failing every subsequent prompt while the provider kept erroring. Transport facts now retain only plain-record retry signals, and the attempt snapshot degrades gracefully instead of failing the attempt.
44
+
45
+ ### Fixed
46
+ - Active deep-interview sessions now resume automatically after a normal assistant stop while ordinary active interviewing remains eligible, using bounded workflow-state continuation; recovery, leak, stale-state, handoff, and crystallization blocks remain Stop-gate handled.
47
+
48
+ ### Changed
49
+ - Removed deprecated `DiscoverableMCPTool`, `DiscoverableMCPSearchIndex`, and related MCP-only discovery helper exports. Use the unified `DiscoverableTool` discovery APIs; the `mcp.discoveryMode` settings alias remains supported.
50
+
51
+ ### Fixed
52
+ - Connected MCP server instructions now remain untrusted user-role data instead of entering the cached system prompt; hostile file paths, working directories, and workspace-tree metadata are structurally encoded, and volatile project context is removed from durable session history between requests.
53
+ - Restored the strict G002 public-surface quarantine by removing the default README advertisement for the private coordinator MCP runtime.
54
+
5
55
  ## [0.11.1] - 2026-07-16
6
56
 
7
57
  ### Fixed
@@ -14,6 +64,7 @@
14
64
  - Input-free interactive TTY startup now keeps the TUI reachable when configured model profiles are missing required provider credentials, skips only the blocked profiles, and preserves later `--mpreset` and explicit model/thinking precedence; redirected terminals, input-bearing, resume-continuation, image-only, print/text, and unrelated activation failures remain fail-closed (#2277).
15
65
  - Windows Bun runtimes no longer crash while committing the durable workflow-gate store when directory `fsync` reports the unsupported-operation code `EPERM`; unexpected directory-sync failures remain fail-closed.
16
66
  - Browser geo settings now propagate coherently across request `Accept-Language`, navigator languages, and `Intl` locale/timezone surfaces; configured managed browsers are isolated by geo/profile posture, concurrent acquisition is serialized, and unset geo preserves Chromium's native locale/timezone instead of injecting a fixed New York profile.
67
+ - Windows startup no longer fails when the platform rejects the workflow-gate store's parent-directory durability sync with `EPERM`; file fsync and atomic replacement remain enforced.
17
68
 
18
69
  - Cooperative mid-run context maintenance now waits at a cancellation-aware FIFO consumer-drain checkpoint before flushing or rewriting session history. Materialized tool results and steering messages are synchronously canonicalized first; aborted barriers and hook/signal-cancelled compactions settle without rewriting or scheduling a continuation. Promotion, pruning, and compaction each start a clean provider/prompt-cache epoch. Script-aware #2067 unsent-delta accounting remains cache-free and distinct from the lifecycle checkpoint.
19
70
  - Classified the cooperative mid-run maintenance driver and token estimator test seams as locked non-public SDK exclusions, restoring deterministic operation-inventory generation and post-merge dev CI coverage.
@@ -27,8 +78,10 @@
27
78
  - Added the standalone `@gajae-code/bridge-client` transport-only v3 SDK package. It exports `SdkClient` and its associated types; `@gajae-code/coding-agent/sdk` remains a compatibility re-export with the exact same class identity. Historical BridgeClient backend protocol, handshake, commands, SSE, and host-control bypass surfaces remain unavailable.
28
79
  - Added explicit `--mcp-config <absolute-path>` support for one trusted, tools-only MCP config in top-level standalone sessions without enabling automatic user or project MCP discovery; exact reads reject links and identity changes, and MCP tool-name collisions fail closed.
29
80
  - Added additive v3 workflow-gate correlation compatibility surfaces (#2171): explicit Rust workflow-frame readers/registration preserve `workflowGateId` without changing legacy `ActionNeeded`, `ServerMessage`, or `register_ask`; N-API retains `registerAsk` and adds correlated/arbitrated registration and exact unclaimed-retirement APIs. Private presentation leases, routes, claims, receipts, epochs, and endpoint generations remain non-public.
81
+ - Added the versioned, readonly managed session-directory SDK: `SESSION_DIRECTORY_API_VERSION`, `resolveManagedSessionScope`, and `listManagedSessionCandidates` are exported from `@gajae-code/coding-agent/sdk`. The package boundary continues to reject private `session/internal/*` imports. Managed writes use v2 workspace scopes with validated opt-in legacy copy-retain migration (#2177).
30
82
 
31
83
  ### Changed
84
+ - Explicit fold choices from the user shortcut or extension `setToolsExpanded` now pin a block for its component lifetime, so automatic stamping no longer overwrites them; sessions that never toggle are unchanged.
32
85
 
33
86
  - Renamed the notifications SDK to the Gajae-Code SDK: `docs/notifications-sdk.md` is now `docs/sdk.md`, `src/notifications/` is now `src/sdk/bus/`, and `src/sdk.ts` is now the `src/sdk/` module directory. Old deep-import specifiers no longer resolve.
34
87
  - Moved SDK discovery from `.gjc/state/notifications/` to `.gjc/state/sdk/`. Restart sessions and daemons together when upgrading; the runtime does not dual-scan the old and new directories.
@@ -113,6 +166,7 @@
113
166
  - Cache-miss diagnostics now separate actionable, diagnostic-only, and provider-side-suspected causes instead of asserting a user-side fix for every miss (#2020). A large, costly miss with no cache reads or writes is reported as a neutral `Cache notice` marked "provider-side suspected / not user-actionable" (with what GJC cannot determine) rather than telling the user to keep a stable prefix; a miss with reads but no writes is reported as diagnostic-only without asserting a single cause; and the "cache write without enough matching reads" warning now only fires when reads actually fail to cover the writes. The existing miss cost summary and the #1929/#1936 pricing/provenance safeguards are unchanged.
114
167
 
115
168
  ### Fixed
169
+ - `/btw` side questions now start independently while the main answer is still streaming, read only committed conversation state, avoid main-session callbacks/history/IRC-roster mutation, disable silent provider retries, and fail the side request visibly if no provider event arrives within 15 seconds.
116
170
 
117
171
  - Fixed native-Windows coordinator/runtime compatibility by treating psmux's successful empty `list-sessions` response as an absent server while keeping malformed rows fail-closed, reading process incarnations through a validated PowerShell start-time query, sharing the existing BOM-free encoded PowerShell pane command, preserving multiline SDK prompts behind semantic readiness, and retaining runtime command/turn acknowledgement identity across Windows-equivalent workspace paths (#2145).
118
172
  - The coordinator MCP owner-server probe now recognizes tmux ≥3.7's missing-server diagnostic (`error connecting to <socket> (No such file or directory)`) as an absent server. tmux 3.7 changed the wording from the older `no server running on <socket>`, which the coordinator probe did not match — so a brand-new coordinator socket (which never has a server yet) was misclassified `unverifiable` instead of `absent`, and **every** `gjc_delegate_*` / session create failed closed with `coordinator_tmux_owner_server_unverifiable` on tmux ≥3.7. The coordinator and `gjc` harness probes now match the same no-server wordings the other owner-isolation probes already did.
@@ -4,7 +4,7 @@
4
4
  * Handles `gjc config <command>` subcommands for managing settings.
5
5
  * Uses the settings schema as the source of truth for available settings.
6
6
  */
7
- export type ConfigAction = "list" | "get" | "set" | "reset" | "path" | "init-xdg";
7
+ export type ConfigAction = "list" | "get" | "set" | "reset" | "path" | "doctor" | "init-xdg";
8
8
  export interface ConfigCommandArgs {
9
9
  action: ConfigAction;
10
10
  key?: string;
@@ -20,4 +20,14 @@ export interface ConfigCommandArgs {
20
20
  */
21
21
  export declare function parseConfigArgs(args: string[]): ConfigCommandArgs | undefined;
22
22
  export declare function runConfigCommand(cmd: ConfigCommandArgs): Promise<void>;
23
+ type ConfigDoctorReport = {
24
+ unknownKeys: string[];
25
+ invalidValues: Array<{
26
+ path: string;
27
+ value: unknown;
28
+ }>;
29
+ legacyShapes: string[];
30
+ };
31
+ export declare function inspectConfigFile(configPath: string): Promise<ConfigDoctorReport>;
23
32
  export declare function printConfigHelp(): void;
33
+ export {};
@@ -37,6 +37,7 @@ export interface NotifyCommandDeps {
37
37
  tokenPrompt?: () => Promise<string>;
38
38
  setExitCode?: (code: number) => void;
39
39
  exitProcess?: (code: number) => void;
40
+ valuePrompt?: (label: string, masked: boolean) => Promise<string>;
40
41
  /** Optional daemon ownership facts collected by an embedding host. */
41
42
  setupPreflight?: TelegramSetupPreflight;
42
43
  /** Injectable timers and cancellation for setup pairing. */
@@ -1,4 +1,5 @@
1
1
  import { type SessionSelectionResult } from "../modes/components/session-selector";
2
2
  import { type SessionInfo } from "../session/session-manager";
3
+ export declare function deleteSessionPickerCandidate(sessionPath: string, explicitSessionDir?: string): Promise<void>;
3
4
  /** Show the read-only TUI session picker and return the user's consent intent. */
4
- export declare function selectSession(sessions: SessionInfo[]): Promise<SessionSelectionResult>;
5
+ export declare function selectSession(sessions: SessionInfo[], explicitSessionDir?: string): Promise<SessionSelectionResult>;
@@ -58,7 +58,7 @@ export declare function runSetupCommand(cmd: SetupCommandArgs): Promise<void>;
58
58
  */
59
59
  export interface CredentialsSetupDependencies {
60
60
  openStore?: typeof SqliteAuthCredentialStore.open;
61
- createAuthStorage?: (store: Awaited<ReturnType<typeof SqliteAuthCredentialStore.open>>) => AuthStorage;
61
+ createAuthStorage?: (store: SqliteAuthCredentialStore) => AuthStorage;
62
62
  discover?: Parameters<typeof runExternalCredentialAutoImport>[0]["discover"];
63
63
  }
64
64
  export declare function handleCredentialsSetup(flags: {
@@ -1,4 +1,37 @@
1
1
  import { Command } from "@gajae-code/utils/cli";
2
+ import { COORDINATOR_MCP_PROTOCOL_VERSION, COORDINATOR_MCP_SERVER_NAME } from "../coordinator/contract";
3
+ import { type BrokerDiscovery } from "../sdk/broker/discovery";
4
+ export type CoordinatorBrokerDiscoveryStatus = "ready" | "unavailable" | "error";
5
+ export type CoordinatorBrokerDiscoveryReason = null | "absent_or_invalid" | "unsupported_state_version" | "discovery_access_denied" | "discovery_read_failed";
6
+ export interface CoordinatorBrokerObservation {
7
+ discovery_status: CoordinatorBrokerDiscoveryStatus;
8
+ reason: CoordinatorBrokerDiscoveryReason;
9
+ }
10
+ export interface CoordinatorCheckProbe {
11
+ agentDir?: string;
12
+ readBrokerDiscovery?: (agentDir: string) => Promise<BrokerDiscovery | null>;
13
+ }
14
+ export interface CoordinatorCheckPayload {
15
+ ok: true;
16
+ server: {
17
+ name: typeof COORDINATOR_MCP_SERVER_NAME;
18
+ protocolVersion: typeof COORDINATOR_MCP_PROTOCOL_VERSION;
19
+ };
20
+ readOnly: true;
21
+ tools: readonly string[];
22
+ catalog: {
23
+ ready: true;
24
+ reason: null;
25
+ };
26
+ broker: CoordinatorBrokerObservation & {
27
+ operational_ready: null;
28
+ bootstrap_supported: true;
29
+ bootstrap_attempted: false;
30
+ };
31
+ }
32
+ export declare function probeCoordinatorBrokerCheck(probe?: CoordinatorCheckProbe): Promise<CoordinatorBrokerObservation>;
33
+ export declare function formatCoordinatorCheckPayload(observation: CoordinatorBrokerObservation): CoordinatorCheckPayload;
34
+ export declare function buildCoordinatorCheckPayload(probe?: CoordinatorCheckProbe): Promise<CoordinatorCheckPayload>;
2
35
  export declare function validateMcpServeSubcommandForTest(server: string | undefined): void;
3
36
  export default class McpServe extends Command {
4
37
  static description: string;
@@ -4,6 +4,7 @@
4
4
  import { Command } from "@gajae-code/utils/cli";
5
5
  import { type MCPAction } from "../cli/mcp-cli";
6
6
  export default class MCP extends Command {
7
+ #private;
7
8
  static description: string;
8
9
  static delegateHelp: boolean;
9
10
  static examples: string[];
@@ -66,5 +67,4 @@ export default class MCP extends Command {
66
67
  };
67
68
  };
68
69
  run(): Promise<void>;
69
- private printHelp;
70
70
  }
@@ -2,14 +2,12 @@
2
2
  * Configure Telegram, Discord, or Slack notifications.
3
3
  */
4
4
  import { Command } from "@gajae-code/utils/cli";
5
- import { type NotifyAction } from "../cli/notify-cli";
6
5
  export default class Notify extends Command {
7
6
  static description: string;
8
7
  static args: {
9
8
  action: import("@gajae-code/utils/cli").ArgDescriptor & {
10
9
  description: string;
11
10
  required: false;
12
- options: NotifyAction[];
13
11
  };
14
12
  extra: import("@gajae-code/utils/cli").ArgDescriptor & {
15
13
  description: string;
@@ -2,7 +2,7 @@ import { Command } from "@gajae-code/utils/cli";
2
2
  import type { Args as ParsedArgs } from "../cli/args";
3
3
  import { type SessionLifecycleLaunchRequest } from "../sdk/broker/lifecycle";
4
4
  import { SessionManager } from "../session/session-manager";
5
- export declare function lifecycleArgs(request: SessionLifecycleLaunchRequest, cwd: string, agentDir: string): ParsedArgs;
5
+ export declare function lifecycleArgs(request: SessionLifecycleLaunchRequest, cwd: string, agentDir: string): Promise<ParsedArgs>;
6
6
  /** Opens lifecycle-authorized history without letting replacement content reach readiness. */
7
7
  export declare function openLifecycleSessionManager(request: SessionLifecycleLaunchRequest, cwd: string, agentDir: string): Promise<{
8
8
  parsed: ParsedArgs;
@@ -1,13 +1,27 @@
1
+ export interface AtomicYamlExpectedPrecondition {
2
+ path: string;
3
+ hash: string;
4
+ }
1
5
  export interface AtomicYamlSetPatch {
2
6
  path: string;
3
7
  op: "set";
4
8
  value: unknown;
9
+ expected?: AtomicYamlExpectedPrecondition;
5
10
  }
6
11
  export interface AtomicYamlUnsetPatch {
7
12
  path: string;
8
13
  op: "unset";
14
+ expected?: AtomicYamlExpectedPrecondition;
9
15
  }
10
16
  export type AtomicYamlPatch = AtomicYamlSetPatch | AtomicYamlUnsetPatch;
17
+ /** Raised when a compare-and-swap precondition no longer matches durable YAML. */
18
+ export declare class AtomicYamlConflictError extends Error {
19
+ readonly path: string;
20
+ readonly expectedHash: string;
21
+ readonly actualHash: string;
22
+ readonly code = "ATOMIC_YAML_CONFLICT";
23
+ constructor(path: string, expectedHash: string, actualHash: string);
24
+ }
11
25
  export interface AtomicYamlPatchRevision {
12
26
  path: string;
13
27
  beforeHash: string;
@@ -45,6 +59,8 @@ export interface AtomicYamlPatchOptions {
45
59
  sleep?: (ms: number) => Promise<void>;
46
60
  /** Test seam for Windows rename retry behavior. */
47
61
  platform?: NodeJS.Platform;
62
+ /** Called under the config lock before patches are applied. */
63
+ validateRoot?: (root: unknown, patches: readonly AtomicYamlPatch[]) => void | Promise<void>;
48
64
  /** Called under the config lock after a successful CAS restore. */
49
65
  onRestored?: (patches: readonly AtomicYamlPatch[]) => void | Promise<void>;
50
66
  }
@@ -60,6 +76,8 @@ export declare class AtomicYamlReplaceError extends Error {
60
76
  export declare function setByPath(value: Record<string, unknown>, segments: readonly string[], nextValue: unknown): void;
61
77
  /** Delete a dotted YAML path without disturbing sibling keys or parent objects. */
62
78
  export declare function deleteByPath(value: Record<string, unknown>, segments: readonly string[]): void;
79
+ /** Hash a dotted YAML path state for an expected-hash patch precondition. */
80
+ export declare function atomicYamlPathHash(value: Record<string, unknown>, path: string): string;
63
81
  /** Build patches from current durable YAML while holding the shared queue and file lock. */
64
82
  export declare function applyAtomicYamlPatchesWithCurrent(configPath: string, buildPatches: (current: Readonly<Record<string, unknown>>) => Promise<readonly AtomicYamlPatch[]> | readonly AtomicYamlPatch[], options?: AtomicYamlPatchOptions): Promise<CasReceipt>;
65
83
  /**
@@ -3,14 +3,18 @@ export interface FileLockOptions {
3
3
  retries?: number;
4
4
  retryDelayMs?: number;
5
5
  }
6
+ /**
7
+ * Returns the OS-provided process start timestamp for PID-reuse detection.
8
+ * `ps` is available on the supported Unix hosts (macOS and Linux), unlike
9
+ * Linux's `/proc/<pid>/stat` pseudo-file.
10
+ */
11
+ export declare function processStartTime(pid: number): string | null;
6
12
  /** @internal */
7
- export declare function readFileLockInfoForGc(lockDir: string): Promise<{
8
- pid: number;
9
- timestamp: number;
10
- } | null>;
13
+ export declare function readFileLockInfoForGc(lockDir: string): Promise<FileLockOwnerToken | null>;
11
14
  /** Owner identity stamped into a `<file>.lock/info` record. */
12
15
  export interface FileLockOwnerToken {
13
16
  pid: number;
17
+ start_time?: string;
14
18
  timestamp: number;
15
19
  }
16
20
  /** Outcome of a guarded lock-dir removal attempt (`removeFileLockDirForGc`). */
@@ -33,4 +37,10 @@ export type FileLockGcRemoval = "removed" | "owner_changed" | "missing";
33
37
  * but the reclaim-after-stale scenario the issue describes is now guarded.
34
38
  */
35
39
  export declare function removeFileLockDirForGc(lockDir: string, expected: FileLockOwnerToken): Promise<FileLockGcRemoval>;
40
+ /**
41
+ * Serializes all contenders, including callers in the same process. Because this
42
+ * API exposes no ownership token, recursive acquisition is indistinguishable
43
+ * from independent async contention; code that already holds the lock must pass
44
+ * that fact through its own `lockHeld` path instead of acquiring it again.
45
+ */
36
46
  export declare function withFileLock<T>(filePath: string, fn: () => Promise<T>, options?: FileLockOptions): Promise<T>;
@@ -29,6 +29,7 @@ interface AppKeybindings {
29
29
  "app.session.fork": true;
30
30
  "app.session.resume": true;
31
31
  "app.session.observe": true;
32
+ "app.session.dashboard": true;
32
33
  "app.jobs.open": true;
33
34
  "app.session.togglePath": true;
34
35
  "app.session.toggleSort": true;
@@ -41,6 +42,13 @@ interface AppKeybindings {
41
42
  "app.history.search": true;
42
43
  "app.stt.toggle": true;
43
44
  "app.irc.sidebar.toggle": true;
45
+ "app.transcript.browse": true;
46
+ "app.transcript.prevTurn": true;
47
+ "app.transcript.nextTurn": true;
48
+ "app.mode.cycle": true;
49
+ "app.tasks.toggle": true;
50
+ "app.queue.togglePane": true;
51
+ "app.message.sendNow": true;
44
52
  }
45
53
  export type AppKeybinding = keyof AppKeybindings;
46
54
  declare module "@gajae-code/tui" {
@@ -48,6 +56,7 @@ declare module "@gajae-code/tui" {
48
56
  }
49
57
  }
50
58
  export declare function defaultMessageQueueKeysForPlatform(platform?: NodeJS.Platform): KeyId;
59
+ export declare function defaultClipboardPasteImageKeysForPlatform(platform?: NodeJS.Platform): KeyId;
51
60
  /**
52
61
  * All keybindings definitions: TUI + app-specific.
53
62
  */
@@ -249,7 +258,7 @@ export declare const KEYBINDINGS: {
249
258
  readonly description: "Select queued message to edit";
250
259
  };
251
260
  readonly "app.clipboard.pasteImage": {
252
- readonly defaultKeys: "alt+v" | "ctrl+v";
261
+ readonly defaultKeys: KeyId;
253
262
  readonly description: "Paste image from clipboard";
254
263
  };
255
264
  readonly "app.clipboard.copyLine": {
@@ -280,6 +289,10 @@ export declare const KEYBINDINGS: {
280
289
  readonly defaultKeys: "ctrl+s";
281
290
  readonly description: "Observe subagent sessions";
282
291
  };
292
+ readonly "app.session.dashboard": {
293
+ readonly defaultKeys: [];
294
+ readonly description: "Show all persisted sessions dashboard";
295
+ };
283
296
  readonly "app.jobs.open": {
284
297
  readonly defaultKeys: "alt+j";
285
298
  readonly description: "Open monitor/cron jobs overlay";
@@ -328,6 +341,34 @@ export declare const KEYBINDINGS: {
328
341
  readonly defaultKeys: "alt+i";
329
342
  readonly description: "Toggle IRC sidebar";
330
343
  };
344
+ readonly "app.transcript.browse": {
345
+ readonly defaultKeys: [];
346
+ readonly description: "Browse the transcript";
347
+ };
348
+ readonly "app.transcript.prevTurn": {
349
+ readonly defaultKeys: [];
350
+ readonly description: "Jump to previous user turn";
351
+ };
352
+ readonly "app.transcript.nextTurn": {
353
+ readonly defaultKeys: [];
354
+ readonly description: "Jump to next user turn";
355
+ };
356
+ readonly "app.mode.cycle": {
357
+ readonly defaultKeys: [];
358
+ readonly description: "Cycle interaction mode";
359
+ };
360
+ readonly "app.tasks.toggle": {
361
+ readonly defaultKeys: "alt+t";
362
+ readonly description: "Toggle tasks pane";
363
+ };
364
+ readonly "app.queue.togglePane": {
365
+ readonly defaultKeys: [];
366
+ readonly description: "Toggle message queue pane";
367
+ };
368
+ readonly "app.message.sendNow": {
369
+ readonly defaultKeys: [];
370
+ readonly description: "Send message immediately";
371
+ };
331
372
  };
332
373
  declare function migrateKeybindingsConfigFile(agentDir: string): void;
333
374
  /**
@@ -0,0 +1,3 @@
1
+ export declare const kNoAuth = "N/A";
2
+ export declare function isAuthenticated(apiKey: string | undefined | null): apiKey is string;
3
+ export declare function isAuthenticatedOrKeyless(apiKey: string | undefined | null): boolean;
@@ -0,0 +1,13 @@
1
+ import { type ModelSelectorValue } from "./model-selector-value";
2
+ import type { Settings } from "./settings";
3
+ export interface ConfiguredModelBindings {
4
+ modelRoles?: Record<string, ModelSelectorValue>;
5
+ agentModelOverrides?: Record<string, ModelSelectorValue>;
6
+ }
7
+ /** Synchronizes config-owned model bindings while preserving user edits. */
8
+ export declare class ModelBindingsApplier {
9
+ #private;
10
+ setBindings(bindings: ConfiguredModelBindings | undefined): void;
11
+ applyTo(targetSettings: Settings): void;
12
+ apply(): void;
13
+ }
@@ -0,0 +1,49 @@
1
+ import { type Api, type Model, type ModelRefreshStrategy } from "@gajae-code/ai";
2
+ export interface DiscoveryProvider {
3
+ provider: string;
4
+ optional?: boolean;
5
+ }
6
+ export type ProviderDiscoveryStatus = "idle" | "ok" | "empty" | "cached" | "unavailable" | "unauthenticated";
7
+ export interface ProviderDiscoveryState {
8
+ provider: string;
9
+ status: ProviderDiscoveryStatus;
10
+ optional: boolean;
11
+ stale: boolean;
12
+ fetchedAt?: number;
13
+ models: string[];
14
+ error?: string;
15
+ }
16
+ export interface DiscoveryRefreshToken {
17
+ provider: string;
18
+ generation: number;
19
+ }
20
+ /** A generation-guarded, immutable result for the registry to merge into its catalog. */
21
+ export interface DiscoveryMergeInput {
22
+ provider: string;
23
+ token: DiscoveryRefreshToken;
24
+ current: boolean;
25
+ models: readonly Model<Api>[];
26
+ state: ProviderDiscoveryState;
27
+ warning?: string;
28
+ }
29
+ export interface ProviderDiscoveryCallbacks<TProvider extends DiscoveryProvider> {
30
+ cacheDbPath?: string;
31
+ requiresAuth: (provider: TProvider) => boolean;
32
+ peekApiKey: (provider: TProvider) => Promise<string | undefined>;
33
+ isAuthenticated: (apiKey: string | undefined) => boolean;
34
+ fetchModels: (provider: TProvider) => Promise<Model<Api>[]>;
35
+ }
36
+ /** Owns configured discovery inputs, status, cache lifecycle, and refresh generations. */
37
+ export declare class ModelDiscoveryManager<TProvider extends DiscoveryProvider> {
38
+ #private;
39
+ reset(): void;
40
+ setProviders(providers: readonly TProvider[]): void;
41
+ addProvider(provider: TProvider): void;
42
+ get providers(): readonly TProvider[];
43
+ providerIds(): Set<string>;
44
+ getState(provider: string): ProviderDiscoveryState | undefined;
45
+ loadCached(provider: TProvider, cacheDbPath?: string): readonly Model<Api>[];
46
+ beginRefresh(provider: string): DiscoveryRefreshToken;
47
+ isCurrent(token: DiscoveryRefreshToken): boolean;
48
+ discover(provider: TProvider, strategy: ModelRefreshStrategy, callbacks: ProviderDiscoveryCallbacks<TProvider>): Promise<DiscoveryMergeInput>;
49
+ }
@@ -21,4 +21,24 @@ export interface CanonicalModelIndex {
21
21
  bySelector: Map<string, string>;
22
22
  }
23
23
  export declare function formatCanonicalVariantSelector(model: Model<Api>): string;
24
+ /**
25
+ * Compare equivalent provider variants using the caller's ranking policy.
26
+ *
27
+ * The ordered criteria intentionally mirror the historical canonical resolver:
28
+ * vision support, configured provider rank, canonical exactness, canonical
29
+ * source, input plus cache-read cost, and original catalog order. Callers that
30
+ * do not have a canonical index can omit those axes while retaining a stable,
31
+ * total comparison.
32
+ */
33
+ export declare function compareEquivalentModelVariants(left: Model<Api>, right: Model<Api>, options?: {
34
+ providerRank?: ReadonlyMap<string, number>;
35
+ canonicalId?: string;
36
+ leftSourceRank?: number;
37
+ rightSourceRank?: number;
38
+ modelOrder?: ReadonlyMap<string, number>;
39
+ includeCost?: boolean;
40
+ finalize?: boolean;
41
+ }): number;
42
+ /** @deprecated Use compareEquivalentModelVariants for total variant ranking. */
43
+ export declare function compareModelVariantRank(left: Model<Api>, right: Model<Api>): number;
24
44
  export declare function buildCanonicalModelIndex(models: readonly Model<Api>[], equivalence?: ModelEquivalenceConfig): CanonicalModelIndex;
@@ -4,13 +4,15 @@ import { type ThemeColor } from "../modes/theme/theme";
4
4
  import type { AuthStorage } from "../session/auth-storage";
5
5
  import type { ActiveSearchModelContext, WebSearchMode } from "../web/search/types";
6
6
  import { type ConfigError, ConfigFile } from "./config-file";
7
+ import { isAuthenticated, kNoAuth } from "./model-auth";
8
+ import { type ProviderDiscoveryState } from "./model-discovery-manager";
9
+ export type { ProviderDiscoveryState, ProviderDiscoveryStatus } from "./model-discovery-manager";
7
10
  import { type CanonicalModelIndex, type CanonicalModelRecord, type CanonicalModelVariant, type ModelEquivalenceConfig } from "./model-equivalence";
8
11
  import { type ModelProfileDefinition } from "./model-profiles";
9
- import { type ModelProfileConfig } from "./models-config-schema";
12
+ import { GJC_MODEL_ASSIGNMENT_TARGET_IDS, type ModelProfileConfig } from "./models-config-schema";
10
13
  import { type Settings } from "./settings";
11
14
  export type { CanonicalModelIndex, CanonicalModelRecord, CanonicalModelVariant, ModelEquivalenceConfig };
12
- export declare const kNoAuth = "N/A";
13
- export declare function isAuthenticated(apiKey: string | undefined | null): apiKey is string;
15
+ export { isAuthenticated, kNoAuth };
14
16
  export type ModelRole = "default";
15
17
  export interface ModelRoleInfo {
16
18
  tag?: string;
@@ -21,12 +23,12 @@ export declare const MODEL_ROLES: Record<ModelRole, ModelRoleInfo>;
21
23
  export declare const MODEL_ROLE_IDS: ModelRole[];
22
24
  export declare const MODEL_PROFILE_NAME_PATTERN: RegExp;
23
25
  export declare const MODEL_PROFILE_NAME_PATTERN_DESCRIPTION = "lowercase letters, numbers, dots, underscores, or hyphens";
24
- export type GjcModelAssignmentTargetId = "default" | "executor" | "architect" | "planner" | "critic";
26
+ export type GjcModelAssignmentTargetId = (typeof GJC_MODEL_ASSIGNMENT_TARGET_IDS)[number];
25
27
  export interface GjcModelAssignmentTargetInfo extends ModelRoleInfo {
26
28
  id: GjcModelAssignmentTargetId;
27
29
  settingsPath: "modelRoles" | "task.agentModelOverrides";
28
30
  }
29
- export declare const GJC_MODEL_ASSIGNMENT_TARGET_IDS: GjcModelAssignmentTargetId[];
31
+ export { GJC_MODEL_ASSIGNMENT_TARGET_IDS };
30
32
  export declare const GJC_MODEL_ASSIGNMENT_TARGETS: Record<GjcModelAssignmentTargetId, GjcModelAssignmentTargetInfo>;
31
33
  /** Alias for ModelRoleInfo - used for both built-in and custom roles */
32
34
  export type RoleInfo = ModelRoleInfo;
@@ -306,19 +308,11 @@ interface ProviderOverride {
306
308
  * regression in `model-registry.test.ts`.
307
309
  */
308
310
  export declare function mergeDiscoveredModel<TApi extends Api>(model: Model<TApi>, existing: Model<Api> | undefined, providerOverride?: Pick<ProviderOverride, "baseUrl" | "headers" | "transport" | "requestTransform" | "cacheRetention">): Model<TApi>;
309
- export type ProviderDiscoveryStatus = "idle" | "ok" | "empty" | "cached" | "unavailable" | "unauthenticated";
310
- export interface ProviderDiscoveryState {
311
- provider: string;
312
- status: ProviderDiscoveryStatus;
313
- optional: boolean;
314
- stale: boolean;
315
- fetchedAt?: number;
316
- models: string[];
317
- error?: string;
318
- }
319
311
  export interface CanonicalModelQueryOptions {
320
312
  availableOnly?: boolean;
321
313
  candidates?: readonly Model<Api>[];
314
+ /** Stable session identity used to keep a canonical variant sticky within a session. */
315
+ sessionId?: string;
322
316
  }
323
317
  /**
324
318
  * Model registry - loads and manages models, resolves API keys via AuthStorage.
@@ -356,6 +350,11 @@ export declare class ModelRegistry {
356
350
  getCanonicalVariants(canonicalId: string, options?: CanonicalModelQueryOptions): CanonicalModelVariant[];
357
351
  resolveCanonicalModel(canonicalId: string, options?: CanonicalModelQueryOptions): Model<Api> | undefined;
358
352
  getCanonicalId(model: Model<Api>): string | undefined;
353
+ /**
354
+ * Seed a child canonical scope from a concrete parent model without touching
355
+ * the parent's canonical selection.
356
+ */
357
+ seedCanonicalVariant(sessionId: string, model: Model<Api>): boolean;
359
358
  /**
360
359
  * Get only models that have auth configured.
361
360
  * This is a fast check that doesn't refresh OAuth tokens.
@@ -425,6 +424,8 @@ export declare class ModelRegistry {
425
424
  * Check if a model selector is currently suppressed due to rate limits.
426
425
  */
427
426
  isSelectorSuppressed(selector: string): boolean;
427
+ /** Return whether a selector has an active, expired, or no rate-limit suppression. */
428
+ getSelectorSuppressionStatus(selector: string): "active" | "expired" | "none";
428
429
  }
429
430
  /**
430
431
  * Input type for registerProvider API (from extensions).