@gajae-code/coding-agent 0.13.2 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (610) hide show
  1. package/CHANGELOG.md +215 -8
  2. package/README.md +2 -0
  3. package/bin/gajaessi.js +4 -0
  4. package/dist/types/async/job-manager.d.ts +55 -2
  5. package/dist/types/async/support.d.ts +14 -0
  6. package/dist/types/capability/mcp.d.ts +6 -0
  7. package/dist/types/capability/types.d.ts +6 -0
  8. package/dist/types/cli/accounts-cli.d.ts +19 -0
  9. package/dist/types/cli/args.d.ts +3 -0
  10. package/dist/types/cli/config-cli.d.ts +6 -0
  11. package/dist/types/cli/crash-cli.d.ts +10 -0
  12. package/dist/types/cli/customize-doctor.d.ts +145 -0
  13. package/dist/types/cli/daemon-cli.d.ts +3 -1
  14. package/dist/types/cli/mcp-cli.d.ts +11 -0
  15. package/dist/types/cli/notify-cli.d.ts +1 -1
  16. package/dist/types/cli/root-flags.d.ts +12 -0
  17. package/dist/types/cli/setup-cli.d.ts +3 -1
  18. package/dist/types/cli/skills-cli.d.ts +2 -1
  19. package/dist/types/cli/update-cli.d.ts +19 -1
  20. package/dist/types/cli.d.ts +6 -0
  21. package/dist/types/commands/accounts.d.ts +40 -0
  22. package/dist/types/commands/crash.d.ts +24 -0
  23. package/dist/types/commands/customize.d.ts +22 -0
  24. package/dist/types/commands/daemon.d.ts +1 -1
  25. package/dist/types/commands/launch.d.ts +6 -0
  26. package/dist/types/commands/setup.d.ts +6 -0
  27. package/dist/types/commands/skills.d.ts +6 -1
  28. package/dist/types/commands/update.d.ts +7 -0
  29. package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
  30. package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
  31. package/dist/types/config/config-schema-version.d.ts +10 -0
  32. package/dist/types/config/file-lock.d.ts +18 -0
  33. package/dist/types/config/model-profile-activation.d.ts +3 -1
  34. package/dist/types/config/model-registry.d.ts +10 -1
  35. package/dist/types/config/models-config-schema.d.ts +2 -0
  36. package/dist/types/config/settings-schema.d.ts +73 -9
  37. package/dist/types/config/settings.d.ts +63 -0
  38. package/dist/types/config/skill-settings-defaults.d.ts +26 -0
  39. package/dist/types/config/task-delegation.d.ts +39 -0
  40. package/dist/types/config/update-channel.d.ts +10 -0
  41. package/dist/types/coordinator-mcp/server.d.ts +5 -1
  42. package/dist/types/crash/index-store.d.ts +87 -0
  43. package/dist/types/crash/nudge.d.ts +50 -0
  44. package/dist/types/crash/record-loader.d.ts +17 -0
  45. package/dist/types/crash/report.d.ts +134 -0
  46. package/dist/types/crash/sanitize.d.ts +25 -0
  47. package/dist/types/cursor.d.ts +13 -2
  48. package/dist/types/customization/import.d.ts +37 -0
  49. package/dist/types/customization/index.d.ts +4 -0
  50. package/dist/types/customization/inventory.d.ts +25 -0
  51. package/dist/types/customization/mutations.d.ts +32 -0
  52. package/dist/types/customization/types.d.ts +115 -0
  53. package/dist/types/daemon/control-types.d.ts +8 -1
  54. package/dist/types/daemon/operator-contract.d.ts +4 -4
  55. package/dist/types/discovery/claude.d.ts +39 -1
  56. package/dist/types/discovery/codex.d.ts +39 -1
  57. package/dist/types/discovery/index.d.ts +2 -0
  58. package/dist/types/discovery/mcp-compat.d.ts +30 -0
  59. package/dist/types/edit/renderer.d.ts +23 -0
  60. package/dist/types/extensibility/extensions/runner.d.ts +3 -0
  61. package/dist/types/extensibility/extensions/types.d.ts +21 -4
  62. package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
  63. package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
  64. package/dist/types/extensibility/hooks/loader.d.ts +19 -5
  65. package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
  66. package/dist/types/extensibility/skill-management.d.ts +107 -0
  67. package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
  68. package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
  69. package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
  70. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
  71. package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
  72. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
  73. package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
  74. package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
  75. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
  76. package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
  77. package/dist/types/hooks/events.d.ts +60 -0
  78. package/dist/types/hooks/normalize.d.ts +83 -0
  79. package/dist/types/hooks/skill-state.d.ts +9 -2
  80. package/dist/types/main.d.ts +2 -1
  81. package/dist/types/modes/acp/abort-scope.d.ts +13 -0
  82. package/dist/types/modes/acp/acp-agent.d.ts +7 -4
  83. package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
  84. package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
  85. package/dist/types/modes/components/customization/index.d.ts +1 -0
  86. package/dist/types/modes/components/dynamic-theme-text.d.ts +9 -0
  87. package/dist/types/modes/components/gajae-pet-widget.d.ts +6 -28
  88. package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
  89. package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
  90. package/dist/types/modes/components/oauth-selector.d.ts +10 -4
  91. package/dist/types/modes/components/pet-capability.d.ts +7 -21
  92. package/dist/types/modes/components/settings-selector.d.ts +5 -0
  93. package/dist/types/modes/components/status-line/gh.d.ts +6 -2
  94. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  95. package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
  96. package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
  97. package/dist/types/modes/interactive-mode.d.ts +1 -0
  98. package/dist/types/modes/theme/defaults/index.d.ts +118 -0
  99. package/dist/types/modes/types.d.ts +1 -0
  100. package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
  101. package/dist/types/runtime-mcp/config.d.ts +9 -0
  102. package/dist/types/runtime-mcp/manager.d.ts +26 -1
  103. package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
  104. package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
  105. package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
  106. package/dist/types/runtime-mcp/protocol.d.ts +278 -0
  107. package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
  108. package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
  109. package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
  110. package/dist/types/runtime-mcp/types.d.ts +102 -10
  111. package/dist/types/sdk/acp/adapter.d.ts +26 -5
  112. package/dist/types/sdk/broker/broker.d.ts +3 -55
  113. package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
  114. package/dist/types/sdk/broker/session-index.d.ts +14 -5
  115. package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
  116. package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
  117. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
  118. package/dist/types/sdk/bus/config.d.ts +11 -0
  119. package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
  120. package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
  121. package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
  122. package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
  123. package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
  124. package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
  125. package/dist/types/sdk/bus/index.d.ts +85 -99
  126. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
  127. package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
  128. package/dist/types/sdk/bus/notification-service.d.ts +52 -0
  129. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
  130. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
  131. package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
  132. package/dist/types/sdk/bus/session-control.d.ts +25 -1
  133. package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
  134. package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
  135. package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
  136. package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
  137. package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
  138. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
  139. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
  140. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
  141. package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
  142. package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
  143. package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
  144. package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
  145. package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
  146. package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
  147. package/dist/types/sdk/cli/rows.d.ts +2 -11
  148. package/dist/types/sdk/cli/session-cli.d.ts +15 -25
  149. package/dist/types/sdk/client/client.d.ts +97 -1
  150. package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
  151. package/dist/types/sdk/host/control/index.d.ts +1 -1
  152. package/dist/types/sdk/host/control/operations.d.ts +18 -5
  153. package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
  154. package/dist/types/sdk/host/host.d.ts +15 -1
  155. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  156. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  157. package/dist/types/sdk/host/session-runtime.d.ts +127 -7
  158. package/dist/types/sdk/host/types.d.ts +1 -1
  159. package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
  160. package/dist/types/sdk/index.d.ts +2 -1
  161. package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
  162. package/dist/types/sdk/lifecycle/client.d.ts +59 -0
  163. package/dist/types/sdk/lifecycle/index.d.ts +3 -0
  164. package/dist/types/sdk/lifecycle/service.d.ts +232 -0
  165. package/dist/types/sdk/mcp/server.d.ts +9 -6
  166. package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
  167. package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
  168. package/dist/types/sdk/prompt-status.d.ts +10 -3
  169. package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
  170. package/dist/types/sdk/receipt-state.d.ts +17 -0
  171. package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
  172. package/dist/types/sdk/router/index.d.ts +1 -0
  173. package/dist/types/sdk/router/session-router.d.ts +152 -0
  174. package/dist/types/sdk/session-list.d.ts +22 -0
  175. package/dist/types/sdk/session-reconnect.d.ts +43 -1
  176. package/dist/types/sdk/session.d.ts +34 -1
  177. package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
  178. package/dist/types/session/account-inventory.d.ts +86 -0
  179. package/dist/types/session/agent-session.d.ts +145 -6
  180. package/dist/types/session/agent-storage.d.ts +10 -0
  181. package/dist/types/session/coordinator-tool-label.d.ts +28 -0
  182. package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
  183. package/dist/types/session/messages.d.ts +1 -1
  184. package/dist/types/session/secure-token-file.d.ts +3 -0
  185. package/dist/types/session/session-manager.d.ts +47 -1
  186. package/dist/types/session/startup-auth-config.d.ts +44 -0
  187. package/dist/types/session/terminal-abort.d.ts +378 -0
  188. package/dist/types/session/yield-queue.d.ts +7 -0
  189. package/dist/types/session-import/claude.d.ts +26 -0
  190. package/dist/types/session-import/codex.d.ts +88 -0
  191. package/dist/types/session-import/command.d.ts +35 -0
  192. package/dist/types/session-import/detect.d.ts +22 -0
  193. package/dist/types/session-import/index.d.ts +7 -0
  194. package/dist/types/session-import/provider-codex.d.ts +22 -0
  195. package/dist/types/session-import/provider-service.d.ts +38 -0
  196. package/dist/types/session-import/redact.d.ts +23 -0
  197. package/dist/types/session-import/service.d.ts +47 -0
  198. package/dist/types/session-import/types.d.ts +120 -0
  199. package/dist/types/setup/paseo/check.d.ts +16 -0
  200. package/dist/types/setup/paseo/install-saga.d.ts +115 -0
  201. package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
  202. package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
  203. package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
  204. package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
  205. package/dist/types/setup/paseo/provider-config.d.ts +35 -0
  206. package/dist/types/setup/paseo/remove.d.ts +14 -0
  207. package/dist/types/setup/paseo/result-types.d.ts +59 -0
  208. package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
  209. package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
  210. package/dist/types/skill-state/active-state.d.ts +5 -1
  211. package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
  212. package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
  213. package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
  214. package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
  215. package/dist/types/slash-commands/types.d.ts +7 -1
  216. package/dist/types/task/executor.d.ts +10 -0
  217. package/dist/types/task/index.d.ts +3 -1
  218. package/dist/types/tools/ask-answer-registry.d.ts +6 -3
  219. package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
  220. package/dist/types/tools/bash.d.ts +2 -6
  221. package/dist/types/tools/browser/attach.d.ts +11 -0
  222. package/dist/types/tools/browser/launch.d.ts +20 -0
  223. package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
  224. package/dist/types/tools/browser/render.d.ts +1 -0
  225. package/dist/types/tools/browser.d.ts +3 -1
  226. package/dist/types/tools/image-gen.d.ts +10 -2
  227. package/dist/types/tools/index.d.ts +8 -0
  228. package/dist/types/tools/monitor.d.ts +1 -1
  229. package/dist/types/tools/skill-discovery.d.ts +8 -1
  230. package/dist/types/tools/subagent.d.ts +2 -0
  231. package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
  232. package/dist/types/utils/herdr-pane.d.ts +76 -0
  233. package/package.json +19 -9
  234. package/scripts/build-binary.ts +2 -1
  235. package/scripts/build-sdk-package-smoke.ts +2 -13
  236. package/scripts/capture-sticky-viewport-showcase.ts +0 -1
  237. package/scripts/compile-args.ts +2 -0
  238. package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
  239. package/scripts/generate-sdk-operation-inventory.ts +28 -0
  240. package/scripts/generate-telegram-baseline-manifest.ts +1 -0
  241. package/scripts/generate-tool-catalog.ts +6 -4
  242. package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
  243. package/src/async/job-manager.ts +352 -17
  244. package/src/async/support.ts +25 -0
  245. package/src/autoresearch/dashboard.ts +28 -13
  246. package/src/capability/index.ts +3 -1
  247. package/src/capability/mcp.ts +6 -0
  248. package/src/capability/types.ts +6 -0
  249. package/src/cli/accounts-cli.ts +395 -0
  250. package/src/cli/args.ts +23 -0
  251. package/src/cli/auth-broker-cli.ts +136 -66
  252. package/src/cli/auth-gateway-cli.ts +94 -70
  253. package/src/cli/config-cli.ts +27 -2
  254. package/src/cli/crash-cli.ts +78 -0
  255. package/src/cli/customize-doctor.ts +1605 -0
  256. package/src/cli/daemon-cli.ts +12 -3
  257. package/src/cli/fast-help.ts +1 -0
  258. package/src/cli/mcp-cli.ts +128 -60
  259. package/src/cli/notify-cli.ts +8 -14
  260. package/src/cli/root-flags.ts +8 -0
  261. package/src/cli/setup-cli.ts +145 -0
  262. package/src/cli/skills-cli.ts +38 -2
  263. package/src/cli/update-cli.ts +167 -12
  264. package/src/cli.ts +4 -0
  265. package/src/commands/accounts.ts +71 -0
  266. package/src/commands/crash.ts +35 -0
  267. package/src/commands/customize.ts +84 -0
  268. package/src/commands/daemon.ts +2 -2
  269. package/src/commands/deep-interview.ts +2 -0
  270. package/src/commands/launch.ts +1 -0
  271. package/src/commands/mcp.ts +12 -7
  272. package/src/commands/ralplan.ts +2 -0
  273. package/src/commands/sdk.ts +65 -32
  274. package/src/commands/setup.ts +5 -0
  275. package/src/commands/skills.ts +14 -4
  276. package/src/commands/ultragoal.ts +10 -1
  277. package/src/commands/update.ts +26 -15
  278. package/src/config/atomic-yaml-patch-worker.ts +57 -0
  279. package/src/config/atomic-yaml-patch.ts +769 -29
  280. package/src/config/config-schema-version.ts +10 -0
  281. package/src/config/file-lock.ts +70 -1
  282. package/src/config/mcp-schema.json +52 -14
  283. package/src/config/model-profile-activation.ts +23 -2
  284. package/src/config/model-profiles.ts +88 -21
  285. package/src/config/model-registry.ts +147 -21
  286. package/src/config/models-config-schema.ts +1 -1
  287. package/src/config/settings-schema.ts +77 -7
  288. package/src/config/settings.ts +4038 -199
  289. package/src/config/skill-settings-defaults.ts +41 -3
  290. package/src/config/task-delegation.ts +87 -0
  291. package/src/config/update-channel.ts +23 -0
  292. package/src/coordinator-mcp/server.ts +377 -308
  293. package/src/crash/index-store.ts +723 -0
  294. package/src/crash/nudge.ts +89 -0
  295. package/src/crash/record-loader.ts +149 -0
  296. package/src/crash/report.ts +551 -0
  297. package/src/crash/sanitize.ts +129 -0
  298. package/src/cursor.ts +36 -10
  299. package/src/customization/import.ts +946 -0
  300. package/src/customization/index.ts +4 -0
  301. package/src/customization/inventory.ts +335 -0
  302. package/src/customization/mutations.ts +141 -0
  303. package/src/customization/types.ts +223 -0
  304. package/src/daemon/control-types.ts +8 -1
  305. package/src/daemon/operator-contract.ts +6 -6
  306. package/src/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.ts +31 -6
  307. package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
  308. package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
  309. package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
  310. package/src/discovery/claude-hooks.ts +38 -0
  311. package/src/discovery/claude.ts +142 -209
  312. package/src/discovery/codex-hooks.ts +38 -0
  313. package/src/discovery/codex.ts +132 -198
  314. package/src/discovery/helpers.ts +8 -1
  315. package/src/discovery/index.ts +2 -0
  316. package/src/discovery/mcp-compat.ts +234 -0
  317. package/src/discovery/mcp-json.ts +6 -0
  318. package/src/edit/renderer.ts +40 -0
  319. package/src/edit/streaming.ts +4 -2
  320. package/src/exec/bash-executor.ts +24 -20
  321. package/src/export/html/index.ts +51 -2
  322. package/src/extensibility/extensions/loader.ts +9 -1
  323. package/src/extensibility/extensions/runner.ts +17 -4
  324. package/src/extensibility/extensions/types.ts +31 -6
  325. package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
  326. package/src/extensibility/gjc-plugins/installer.ts +9 -5
  327. package/src/extensibility/gjc-plugins/observability.ts +8 -2
  328. package/src/extensibility/gjc-plugins/registry.ts +13 -2
  329. package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
  330. package/src/extensibility/gjc-plugins/schema.ts +222 -39
  331. package/src/extensibility/hooks/loader.ts +154 -10
  332. package/src/extensibility/runtime-skill-discovery.ts +257 -60
  333. package/src/extensibility/skill-management.ts +368 -0
  334. package/src/extensibility/skills.ts +52 -16
  335. package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
  336. package/src/gjc-runtime/launch-worktree.ts +56 -2
  337. package/src/gjc-runtime/linux-proc.ts +7 -1
  338. package/src/gjc-runtime/ralplan-runtime.ts +100 -164
  339. package/src/gjc-runtime/session-state-lock.ts +992 -0
  340. package/src/gjc-runtime/session-state-sidecar.ts +644 -142
  341. package/src/gjc-runtime/state-writer.ts +39 -14
  342. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
  343. package/src/gjc-runtime/ultragoal-guard.ts +11 -4
  344. package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
  345. package/src/gjc-runtime/workflow-settings.ts +596 -0
  346. package/src/goals/tools/goal-tool.ts +6 -1
  347. package/src/hooks/events.ts +291 -0
  348. package/src/hooks/native-skill-hook.ts +4 -0
  349. package/src/hooks/normalize.ts +369 -0
  350. package/src/hooks/skill-state.ts +165 -46
  351. package/src/internal-urls/docs-index.generated.ts +41 -32
  352. package/src/main.ts +36 -5
  353. package/src/migrate/mcp-mapper.ts +25 -2
  354. package/src/modes/acp/abort-scope.ts +29 -0
  355. package/src/modes/acp/acp-agent.ts +423 -98
  356. package/src/modes/components/assistant-message.ts +6 -1
  357. package/src/modes/components/chrome.ts +4 -3
  358. package/src/modes/components/customization/customization-dashboard.ts +443 -0
  359. package/src/modes/components/customization/import-wizard.ts +372 -0
  360. package/src/modes/components/customization/index.ts +1 -0
  361. package/src/modes/components/dynamic-theme-text.ts +22 -0
  362. package/src/modes/components/gajae-pet-widget.ts +607 -193
  363. package/src/modes/components/irc-sidebar.ts +11 -0
  364. package/src/modes/components/iterm-pet-transport.ts +585 -0
  365. package/src/modes/components/model-selector.ts +1 -6
  366. package/src/modes/components/oauth-selector.ts +277 -86
  367. package/src/modes/components/pet-capability.ts +35 -31
  368. package/src/modes/components/settings-selector.ts +29 -5
  369. package/src/modes/components/status-line/gh.ts +45 -1
  370. package/src/modes/components/status-line/segments.ts +19 -4
  371. package/src/modes/components/tool-status-header.ts +13 -3
  372. package/src/modes/controllers/command-controller.ts +20 -8
  373. package/src/modes/controllers/extension-ui-controller.ts +56 -257
  374. package/src/modes/controllers/input-controller.ts +10 -0
  375. package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
  376. package/src/modes/controllers/selector-controller.ts +238 -77
  377. package/src/modes/controllers/stt-controller.ts +3 -3
  378. package/src/modes/interactive-mode.ts +88 -16
  379. package/src/modes/print-mode.ts +35 -6
  380. package/src/modes/runtime-init.ts +21 -68
  381. package/src/modes/theme/defaults/index.ts +2 -0
  382. package/src/modes/theme/defaults/ouroboros.json +118 -0
  383. package/src/modes/types.ts +1 -0
  384. package/src/modes/utils/injected-user-submission.ts +25 -0
  385. package/src/modes/utils/terminal-bell.ts +15 -1
  386. package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
  387. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  388. package/src/prompts/agents/critic.md +1 -1
  389. package/src/prompts/system/rlm-research.md +1 -1
  390. package/src/prompts/system/system-prompt.md +0 -2
  391. package/src/prompts/tools/bash.md +7 -1
  392. package/src/prompts/tools/browser.md +1 -1
  393. package/src/prompts/tools/cron.md +6 -6
  394. package/src/prompts/tools/read.md +0 -2
  395. package/src/prompts/tools/skill-discovery.md +4 -2
  396. package/src/runtime-mcp/client.ts +427 -23
  397. package/src/runtime-mcp/config.ts +37 -5
  398. package/src/runtime-mcp/manager-pool.test.ts +56 -0
  399. package/src/runtime-mcp/manager.ts +52 -2
  400. package/src/runtime-mcp/oauth-discovery.ts +13 -0
  401. package/src/runtime-mcp/oauth-flow.ts +46 -1
  402. package/src/runtime-mcp/pool-key.ts +5 -1
  403. package/src/runtime-mcp/pool.test.ts +9 -0
  404. package/src/runtime-mcp/protocol.test.ts +353 -0
  405. package/src/runtime-mcp/protocol.ts +624 -0
  406. package/src/runtime-mcp/scope-config.ts +78 -0
  407. package/src/runtime-mcp/tool-bridge.ts +44 -10
  408. package/src/runtime-mcp/transports/http.ts +84 -13
  409. package/src/runtime-mcp/types.ts +123 -12
  410. package/src/sdk/acp/adapter.ts +328 -97
  411. package/src/sdk/broker/broker.ts +160 -741
  412. package/src/sdk/broker/ensure.ts +9 -1
  413. package/src/sdk/broker/lifecycle.ts +510 -116
  414. package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
  415. package/src/sdk/broker/process-incarnation.ts +19 -0
  416. package/src/sdk/broker/session-index.ts +516 -117
  417. package/src/sdk/broker/startup-failure.ts +28 -5
  418. package/src/sdk/broker/transport.ts +1 -13
  419. package/src/sdk/bus/chat-daemon-cli.ts +4 -2
  420. package/src/sdk/bus/chat-daemon-control.ts +67 -6
  421. package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
  422. package/src/sdk/bus/config.ts +13 -0
  423. package/src/sdk/bus/conversation-store.ts +59 -171
  424. package/src/sdk/bus/daemon-paths.ts +20 -0
  425. package/src/sdk/bus/discord-conversation.ts +2 -0
  426. package/src/sdk/bus/discord-daemon.ts +524 -126
  427. package/src/sdk/bus/discord-live-provider.ts +206 -79
  428. package/src/sdk/bus/existing-thread-readiness.ts +4 -97
  429. package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
  430. package/src/sdk/bus/index.ts +2480 -456
  431. package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
  432. package/src/sdk/bus/lifecycle-commands.ts +2 -2
  433. package/src/sdk/bus/managed-daemon.ts +2 -145
  434. package/src/sdk/bus/notification-service.ts +196 -0
  435. package/src/sdk/bus/operator-runtime.ts +1 -1
  436. package/src/sdk/bus/prompt-reconciliation.ts +24 -15
  437. package/src/sdk/bus/reconciliation-store.ts +553 -24
  438. package/src/sdk/bus/session-control.ts +49 -3
  439. package/src/sdk/bus/slack-conversation.ts +4 -0
  440. package/src/sdk/bus/slack-daemon.ts +733 -134
  441. package/src/sdk/bus/slack-live-provider.ts +65 -15
  442. package/src/sdk/bus/slack-provider.ts +4 -0
  443. package/src/sdk/bus/slack-thread-binding.ts +9 -104
  444. package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
  445. package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
  446. package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
  447. package/src/sdk/bus/telegram-daemon-control.ts +3 -13
  448. package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
  449. package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
  450. package/src/sdk/bus/telegram-daemon.ts +2552 -2280
  451. package/src/sdk/bus/telegram-reference.ts +1 -226
  452. package/src/sdk/bus/telegram-setup.ts +2 -2
  453. package/src/sdk/bus/threaded-render.ts +1 -0
  454. package/src/sdk/bus/topic-registry.ts +279 -146
  455. package/src/sdk/cli/rows.ts +2 -35
  456. package/src/sdk/cli/session-cli.ts +776 -700
  457. package/src/sdk/client/client.ts +892 -1
  458. package/src/sdk/host/control/dispatch.ts +93 -58
  459. package/src/sdk/host/control/index.ts +1 -1
  460. package/src/sdk/host/control/operations.ts +18 -10
  461. package/src/sdk/host/control/runtime-gate.ts +40 -0
  462. package/src/sdk/host/host.ts +63 -12
  463. package/src/sdk/host/query/handlers.ts +66 -7
  464. package/src/sdk/host/reverse-leases.ts +2 -2
  465. package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
  466. package/src/sdk/host/session-runtime.test.ts +2787 -34
  467. package/src/sdk/host/session-runtime.ts +1489 -101
  468. package/src/sdk/host/surface-policy.ts +12 -8
  469. package/src/sdk/host/types.ts +1 -1
  470. package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
  471. package/src/sdk/host/websocket-transport.ts +85 -50
  472. package/src/sdk/index.ts +2 -1
  473. package/src/sdk/lifecycle/broker-client.ts +53 -0
  474. package/src/sdk/lifecycle/client.ts +234 -0
  475. package/src/sdk/lifecycle/index.ts +3 -0
  476. package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
  477. package/src/sdk/lifecycle/service.ts +720 -0
  478. package/src/sdk/mcp/server.ts +226 -188
  479. package/src/sdk/prompt-deadline-lease.ts +55 -0
  480. package/src/sdk/prompt-deadline-manager.ts +148 -0
  481. package/src/sdk/prompt-status.ts +11 -3
  482. package/src/sdk/protocol/operation-inventory.generated.json +272 -129
  483. package/src/sdk/protocol/operation-registry.ts +71 -8
  484. package/src/sdk/receipt-state.ts +43 -0
  485. package/src/sdk/reconciliation-extensions.ts +14 -0
  486. package/src/sdk/router/index.ts +1 -0
  487. package/src/sdk/router/session-router.ts +1658 -0
  488. package/src/sdk/session-list.ts +93 -0
  489. package/src/sdk/session-reconnect.ts +45 -1
  490. package/src/sdk/session.ts +716 -120
  491. package/src/sdk/transport/serve-cli.ts +18 -34
  492. package/src/session/account-inventory.ts +603 -0
  493. package/src/session/agent-session.ts +2873 -559
  494. package/src/session/agent-storage.ts +35 -0
  495. package/src/session/blob-store.ts +32 -1
  496. package/src/session/coordinator-tool-label.ts +40 -0
  497. package/src/session/internal/managed-session-scope.ts +4 -0
  498. package/src/session/internal/managed-session-storage.ts +199 -31
  499. package/src/session/messages.ts +1 -1
  500. package/src/session/secure-token-file.ts +80 -0
  501. package/src/session/session-manager.ts +757 -57
  502. package/src/session/session-storage.ts +25 -16
  503. package/src/session/startup-auth-config.ts +297 -0
  504. package/src/session/terminal-abort.ts +1253 -0
  505. package/src/session/yield-queue.ts +57 -15
  506. package/src/session-import/claude.ts +334 -0
  507. package/src/session-import/codex.ts +1033 -0
  508. package/src/session-import/command.ts +77 -0
  509. package/src/session-import/detect.ts +133 -0
  510. package/src/session-import/index.ts +7 -0
  511. package/src/session-import/provider-codex.ts +327 -0
  512. package/src/session-import/provider-service.ts +457 -0
  513. package/src/session-import/redact.ts +128 -0
  514. package/src/session-import/service.ts +1264 -0
  515. package/src/session-import/types.ts +148 -0
  516. package/src/setup/paseo/check.ts +213 -0
  517. package/src/setup/paseo/install-saga.ts +293 -0
  518. package/src/setup/paseo/json-publisher.ts +263 -0
  519. package/src/setup/paseo/orchestration-preferences.ts +86 -0
  520. package/src/setup/paseo/paseo-ownership.ts +224 -0
  521. package/src/setup/paseo/paseo-setup.ts +253 -0
  522. package/src/setup/paseo/provider-config.ts +139 -0
  523. package/src/setup/paseo/remove.ts +183 -0
  524. package/src/setup/paseo/result-types.ts +79 -0
  525. package/src/setup/paseo/setup-deps.ts +175 -0
  526. package/src/setup/paseo/skills-bridge.ts +260 -0
  527. package/src/skill-state/active-state.ts +21 -11
  528. package/src/slash-commands/acp-builtins.ts +9 -1
  529. package/src/slash-commands/builtin-registry.ts +117 -19
  530. package/src/slash-commands/helpers/credential-switch.ts +143 -0
  531. package/src/slash-commands/helpers/mcp.ts +9 -3
  532. package/src/slash-commands/helpers/usage-report.ts +61 -56
  533. package/src/slash-commands/types.ts +7 -2
  534. package/src/task/executor.ts +30 -11
  535. package/src/task/index.ts +66 -7
  536. package/src/task/render.ts +23 -9
  537. package/src/tools/ask-answer-registry.ts +23 -7
  538. package/src/tools/ask.ts +8 -4
  539. package/src/tools/bash-sleep-advisory.ts +115 -0
  540. package/src/tools/bash.ts +98 -18
  541. package/src/tools/browser/attach.ts +71 -3
  542. package/src/tools/browser/launch.ts +86 -13
  543. package/src/tools/browser/profile-discovery.ts +57 -7
  544. package/src/tools/browser/render.ts +8 -1
  545. package/src/tools/browser.ts +130 -21
  546. package/src/tools/computer.enforcement.test.ts +1 -1
  547. package/src/tools/computer.ts +3 -2
  548. package/src/tools/cron.ts +12 -1
  549. package/src/tools/image-gen.ts +349 -142
  550. package/src/tools/index.ts +8 -0
  551. package/src/tools/job.ts +33 -6
  552. package/src/tools/monitor.ts +41 -2
  553. package/src/tools/skill-discovery.ts +21 -29
  554. package/src/tools/subagent.ts +142 -24
  555. package/src/tools/todo-contract.ts +55 -3
  556. package/src/tools/todo-write.ts +4 -3
  557. package/src/tools/tool-catalog.generated.ts +6 -6
  558. package/src/tools/ultragoal-ask-guard.ts +10 -3
  559. package/src/utils/herdr-pane.ts +345 -0
  560. package/src/utils/title-generator.ts +2 -0
  561. package/src/web/scrapers/index.ts +6 -4
  562. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  563. package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
  564. package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
  565. package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
  566. package/dist/types/runtime/lazy-service.test.d.ts +0 -1
  567. package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
  568. package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
  569. package/dist/types/runtime-mcp/config.test.d.ts +0 -1
  570. package/dist/types/runtime-mcp/http.test.d.ts +0 -1
  571. package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
  572. package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
  573. package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
  574. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
  575. package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
  576. package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
  577. package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
  578. package/dist/types/sdk/elevation/audit.d.ts +0 -93
  579. package/dist/types/sdk/elevation/capability.d.ts +0 -3
  580. package/dist/types/sdk/elevation/digest.d.ts +0 -72
  581. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
  582. package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
  583. package/dist/types/sdk/elevation/owner.d.ts +0 -48
  584. package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
  585. package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
  586. package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
  587. package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
  588. package/dist/types/session/auth-broker-config.d.ts +0 -13
  589. package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
  590. package/dist/types/skills/skills.test.d.ts +0 -1
  591. package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
  592. package/dist/types/task/token-log.test.d.ts +0 -1
  593. package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
  594. package/dist/types/tools/descriptors.test.d.ts +0 -1
  595. package/scripts/g005-daemon-smoke.ts +0 -180
  596. package/scripts/g011-daemon-path-smoke.ts +0 -153
  597. package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
  598. package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
  599. package/src/sdk/bus/telegram-cli.ts +0 -212
  600. package/src/sdk/elevation/allowlist.ts +0 -54
  601. package/src/sdk/elevation/audit.ts +0 -208
  602. package/src/sdk/elevation/capability.ts +0 -41
  603. package/src/sdk/elevation/digest.ts +0 -129
  604. package/src/sdk/elevation/dispatch-receipt.ts +0 -184
  605. package/src/sdk/elevation/grant-ledger.ts +0 -1142
  606. package/src/sdk/elevation/owner.ts +0 -109
  607. package/src/session/auth-broker-config.ts +0 -109
  608. /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
  609. /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
  610. /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
@@ -1,5 +1,6 @@
1
1
  import * as crypto from "node:crypto";
2
2
  import * as fs from "node:fs";
3
+ import * as os from "node:os";
3
4
  import * as path from "node:path";
4
5
  import { shortenPath } from "../tools/render-utils";
5
6
 
@@ -61,6 +62,60 @@ function sanitizePathToken(value: string): string {
61
62
  return `${prefix}-${digest}`;
62
63
  }
63
64
 
65
+ /**
66
+ * Environment override for the directory that holds a repository's launch worktrees.
67
+ *
68
+ * The bucket is otherwise derived entirely from the repository path, so a machine that
69
+ * already keeps worktrees somewhere else — a dedicated volume, or a pre-existing
70
+ * `<repo>.worktrees` convention — has no way to say so and accumulates a second bucket
71
+ * beside the first.
72
+ */
73
+ const WORKTREE_BUCKET_ENV = "GJC_WORKTREE_DIR";
74
+ /**
75
+ * Expands to the repository directory name.
76
+ *
77
+ * A single exported value therefore stays repo-scoped across every checkout, which is
78
+ * what keeps two repositories that share a branch name from resolving to one worktree.
79
+ */
80
+ const REPO_NAME_PLACEHOLDER = "{repo}";
81
+ const DEFAULT_WORKTREE_BUCKET = `${REPO_NAME_PLACEHOLDER}.gajae-code-worktrees`;
82
+
83
+ function expandHomePrefix(value: string, home: string, pathApi: typeof path.posix): string {
84
+ if (value === "~") return home;
85
+ return value.startsWith(`~${pathApi.sep}`) || value.startsWith("~/") ? pathApi.join(home, value.slice(2)) : value;
86
+ }
87
+
88
+ /**
89
+ * Pure core of {@link resolveWorktreeBucket}, exported for tests.
90
+ *
91
+ * Injecting the home directory and path implementation lets tests exercise
92
+ * Windows drive/UNC/separator semantics (`path.win32`) on any host.
93
+ */
94
+ export function resolveWorktreeBucketForPath(
95
+ repoRoot: string,
96
+ envValue: string | undefined,
97
+ home: string,
98
+ pathApi: typeof path.posix,
99
+ ): string {
100
+ const configured = envValue?.trim();
101
+ const template = expandHomePrefix(configured || DEFAULT_WORKTREE_BUCKET, home, pathApi);
102
+ return pathApi.resolve(
103
+ pathApi.dirname(repoRoot),
104
+ template.replaceAll(REPO_NAME_PLACEHOLDER, pathApi.basename(repoRoot)),
105
+ );
106
+ }
107
+
108
+ /**
109
+ * Directory that holds this repository's launch worktrees.
110
+ *
111
+ * A relative override resolves against the repository's PARENT directory, matching the
112
+ * default's own shape, so `{repo}.worktrees` adopts an existing sibling bucket and
113
+ * `.worktrees` parks a hidden bucket beside the repository. An absolute override is used verbatim.
114
+ */
115
+ function resolveWorktreeBucket(repoRoot: string): string {
116
+ return resolveWorktreeBucketForPath(repoRoot, process.env[WORKTREE_BUCKET_ENV], os.homedir(), path);
117
+ }
118
+
64
119
  function resolveSourceBranchSlug(repoRoot: string, baseRef: string): string {
65
120
  const branch = tryRunGit(repoRoot, ["symbolic-ref", "--quiet", "--short", "HEAD"]);
66
121
  if (branch) return sanitizePathToken(branch);
@@ -322,9 +377,8 @@ export function planLaunchWorktree(
322
377
  const baseRef = runGit(repoRoot, ["rev-parse", "HEAD"]);
323
378
  const branchName = mode.detached ? null : mode.name;
324
379
  if (branchName) validateBranchName(repoRoot, branchName);
325
- const bucket = `${path.basename(repoRoot)}.gajae-code-worktrees`;
326
380
  const worktreeSlug = mode.detached ? resolveSourceBranchSlug(repoRoot, baseRef) : sanitizePathToken(mode.name);
327
- const worktreePath = path.join(path.dirname(repoRoot), bucket, worktreeSlug);
381
+ const worktreePath = path.join(resolveWorktreeBucket(repoRoot), worktreeSlug);
328
382
  return { enabled: true, repoRoot, worktreePath, detached: mode.detached, baseRef, branchName };
329
383
  }
330
384
 
@@ -12,6 +12,7 @@ import * as nodeFsSync from "node:fs";
12
12
  import * as nodeFs from "node:fs/promises";
13
13
 
14
14
  export interface LinuxProcStatIdentity {
15
+ state?: string;
15
16
  startTime: string;
16
17
  ttyDevice: string;
17
18
  }
@@ -40,7 +41,7 @@ function parseLinuxProcIdentity(stat: string | null | undefined): LinuxProcStatI
40
41
  const ttyDevice = fields[4];
41
42
  const startTime = fields[19];
42
43
  if (!ttyDevice || !/^-?\d+$/.test(ttyDevice) || !/^\d+$/.test(startTime)) return null;
43
- return { startTime, ttyDevice };
44
+ return { state: fields[0], startTime, ttyDevice };
44
45
  }
45
46
 
46
47
  function classifyProcReadError(error: unknown): Extract<LinuxProcPidProbeResult, { kind: "absent" | "unverifiable" }> {
@@ -60,6 +61,11 @@ export function parseLinuxProcTtyDevice(stat: string | null | undefined): string
60
61
  return parseLinuxProcIdentity(stat)?.ttyDevice ?? null;
61
62
  }
62
63
 
64
+ /** Parse field 3 (single-letter process state) from a `/proc/<pid>/stat` record. */
65
+ export function parseLinuxProcState(stat: string | null | undefined): string | null {
66
+ return parseLinuxProcIdentity(stat)?.state ?? null;
67
+ }
68
+
63
69
  export function probeLinuxProcPidSync(pid: number): LinuxProcPidProbeResult {
64
70
  if (!Number.isSafeInteger(pid) || pid <= 0) return { kind: "unverifiable", reason: "invalid_pid" };
65
71
  if (process.platform !== "linux") return { kind: "unverifiable", reason: "unsupported_platform" };
@@ -2,7 +2,7 @@ import { createHash, randomBytes } from "node:crypto";
2
2
  import type { Dirent } from "node:fs";
3
3
  import * as fs from "node:fs/promises";
4
4
  import * as path from "node:path";
5
- import { getConfigRootDir } from "@gajae-code/utils";
5
+ import { isSettingsInitialized, Settings } from "../config/settings";
6
6
  import { syncSkillActiveState } from "../skill-state/active-state";
7
7
  import { buildRalplanHudSummary } from "../skill-state/workflow-hud";
8
8
  import { WORKFLOW_STATE_VERSION } from "../skill-state/workflow-state-contract";
@@ -43,6 +43,12 @@ import {
43
43
  import { probeGjcTeamAvailability } from "./team-runtime";
44
44
  import { assertSafePathComponent, CommandError, flagValue, hasFlag } from "./workflow-cli-common";
45
45
  import { getSkillManifest } from "./workflow-manifest";
46
+ import {
47
+ resolveWorkflowSetting,
48
+ WorkflowSettingError,
49
+ type WorkflowSettingKey,
50
+ type WorkflowSettingParseResult,
51
+ } from "./workflow-settings";
46
52
  /**
47
53
  * Native implementation of `gjc ralplan`.
48
54
  *
@@ -387,38 +393,69 @@ function parseMaxIterationsValue(value: unknown): number | null {
387
393
  return parseBoundedPositiveInteger(value, RALPLAN_MAX_ITERATIONS_LIMIT);
388
394
  }
389
395
 
390
- async function readSettingsMaxIterations(settingsPath: string): Promise<number | null> {
396
+ /** Adapt a nullable parser to the shared resolver's parse-result shape. */
397
+ function workflowSettingParse<T>(
398
+ parse: (value: unknown) => T | null,
399
+ reason: string,
400
+ ): (value: unknown) => WorkflowSettingParseResult<T> {
401
+ return value => {
402
+ const parsed = parse(value);
403
+ return parsed === null ? { kind: "invalid", reason } : { kind: "valid", value: parsed };
404
+ };
405
+ }
406
+
407
+ /**
408
+ * Resolve a strict ralplan setting through the shared five-layer resolver.
409
+ * Malformed/invalid explicit sources in any layer/format fail closed (exit 2)
410
+ * and never fall through to a lower layer or the built-in default.
411
+ */
412
+ async function resolveStrictRalplanSetting<T>(
413
+ cwd: string,
414
+ key: WorkflowSettingKey,
415
+ parse: (value: unknown) => WorkflowSettingParseResult<T>,
416
+ defaultValue: T,
417
+ agentDir?: string,
418
+ ): Promise<{ value: T; source: string }> {
391
419
  try {
392
- const raw = await Bun.file(settingsPath).text();
393
- const parsed = JSON.parse(raw) as Record<string, unknown>;
394
- const flat = parseMaxIterationsValue(parsed["gjc.ralplan.maxIterations"]);
395
- if (flat !== null) return flat;
396
- const gjc = parsed.gjc;
397
- if (gjc && typeof gjc === "object") {
398
- const ralplan = (gjc as Record<string, unknown>).ralplan;
399
- if (ralplan && typeof ralplan === "object") {
400
- return parseMaxIterationsValue((ralplan as Record<string, unknown>).maxIterations);
401
- }
420
+ const resolution = await resolveWorkflowSetting(cwd, key, {
421
+ defaultValue,
422
+ parse,
423
+ invalidPolicy: "throw",
424
+ // The session's effective agent profile: an SDK session created with
425
+ // `createAgentSession({ agentDir })` resolves against that directory
426
+ // instead of the process-global default.
427
+ agentDir: agentDir ?? (isSettingsInitialized() ? Settings.instance.getAgentDir() : undefined),
428
+ });
429
+ return { value: resolution.value, source: resolution.source };
430
+ } catch (error) {
431
+ if (error instanceof WorkflowSettingError) {
432
+ throw new RalplanCommandError(2, `invalid ralplan settings at ${error.path}: ${error.reason}`);
402
433
  }
403
- return null;
404
- } catch {
405
- return null;
434
+ throw error;
406
435
  }
407
436
  }
408
437
 
409
438
  /**
410
- * Resolve ralplan consensus iteration cap. Project `./.gjc/settings.json` overrides
411
- * user settings, else default 5.
439
+ * Resolve the ralplan consensus iteration cap through the shared resolver.
440
+ * Project `.gjc/config.yml` and `.gjc/settings.json` beat user layers.
412
441
  */
413
- export async function resolveRalplanMaxIterations(cwd: string): Promise<{ maxIterations: number; source: string }> {
414
- const projectPath = path.join(gjcRoot(cwd), "settings.json");
415
- const project = await readSettingsMaxIterations(projectPath);
416
- if (project !== null) return { maxIterations: project, source: projectPath };
417
- const userPath = path.join(getConfigRootDir(), "settings.json");
418
- const user = await readSettingsMaxIterations(userPath);
419
- if (user !== null) return { maxIterations: user, source: userPath };
420
- return { maxIterations: RALPLAN_DEFAULT_MAX_ITERATIONS, source: "default" };
442
+ export async function resolveRalplanMaxIterations(
443
+ cwd: string,
444
+ agentDir?: string,
445
+ ): Promise<{ maxIterations: number; source: string }> {
446
+ const { value, source } = await resolveStrictRalplanSetting(
447
+ cwd,
448
+ "gjc.ralplan.maxIterations",
449
+ workflowSettingParse(
450
+ parseMaxIterationsValue,
451
+ `expected gjc.ralplan.maxIterations to be an integer between 1 and ${RALPLAN_MAX_ITERATIONS_LIMIT}`,
452
+ ),
453
+ RALPLAN_DEFAULT_MAX_ITERATIONS,
454
+ agentDir,
455
+ );
456
+ return { maxIterations: value, source };
421
457
  }
458
+
422
459
  function parseRalplanAutoHandoffTarget(value: unknown): RalplanAutoHandoffTarget | undefined {
423
460
  return typeof value === "string" && RALPLAN_AUTO_HANDOFF_TARGETS.has(value as RalplanAutoHandoffTarget)
424
461
  ? (value as RalplanAutoHandoffTarget)
@@ -428,83 +465,29 @@ function parseRalplanAutoHandoffTarget(value: unknown): RalplanAutoHandoffTarget
428
465
  type RalplanAutoHandoffOptions = {
429
466
  planningStuck?: boolean;
430
467
  teamAvailabilityProbe?: () => { available: true } | { available: false; reason: string };
468
+ /** The session's effective agent directory (see resolveWorkflowSetting). */
469
+ agentDir?: string;
431
470
  };
432
471
 
433
- type RalplanAutoHandoffSetting =
434
- | { kind: "absent" }
435
- | { kind: "valid"; value: RalplanAutoHandoffTarget }
436
- | { kind: "invalid"; reason: string };
437
-
438
- function parsePresentRalplanAutoHandoff(value: unknown): RalplanAutoHandoffSetting {
472
+ function parsePresentRalplanAutoHandoff(value: unknown): WorkflowSettingParseResult<RalplanAutoHandoffTarget> {
439
473
  const target = parseRalplanAutoHandoffTarget(value);
440
474
  return target === undefined
441
- ? {
442
- kind: "invalid",
443
- reason: "expected gjc.ralplan.autoHandoff to be one of off, ultragoal, team",
444
- }
475
+ ? { kind: "invalid", reason: "expected gjc.ralplan.autoHandoff to be one of off, ultragoal, team" }
445
476
  : { kind: "valid", value: target };
446
477
  }
447
478
 
448
- function parseRalplanAutoHandoffSettings(parsed: unknown): RalplanAutoHandoffSetting {
449
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return { kind: "absent" };
450
- const settings = parsed as Record<string, unknown>;
451
- if (Object.hasOwn(settings, "gjc.ralplan.autoHandoff")) {
452
- return parsePresentRalplanAutoHandoff(settings["gjc.ralplan.autoHandoff"]);
453
- }
454
- const gjc = settings.gjc;
455
- if (!gjc || typeof gjc !== "object" || Array.isArray(gjc)) return { kind: "absent" };
456
- const ralplan = (gjc as Record<string, unknown>).ralplan;
457
- if (!ralplan || typeof ralplan !== "object" || Array.isArray(ralplan)) return { kind: "absent" };
458
- const ralplanSettings = ralplan as Record<string, unknown>;
459
- if (!Object.hasOwn(ralplanSettings, "autoHandoff")) return { kind: "absent" };
460
- return parsePresentRalplanAutoHandoff(ralplanSettings.autoHandoff);
461
- }
462
-
463
- async function readSettingsAutoHandoff(settingsPath: string): Promise<RalplanAutoHandoffSetting> {
464
- let raw: string;
465
- try {
466
- raw = await Bun.file(settingsPath).text();
467
- } catch (error) {
468
- if (getErrorCode(error) === "ENOENT") return { kind: "absent" };
469
- return {
470
- kind: "invalid",
471
- reason: `unable to read settings: ${error instanceof Error ? error.message : String(error)}`,
472
- };
473
- }
474
- let parsed: unknown;
475
- try {
476
- parsed = JSON.parse(raw);
477
- } catch (error) {
478
- return {
479
- kind: "invalid",
480
- reason: `malformed JSON: ${error instanceof Error ? error.message : String(error)}`,
481
- };
482
- }
483
- return parseRalplanAutoHandoffSettings(parsed);
484
- }
485
-
486
479
  export async function resolveRalplanAutoHandoff(
487
480
  cwd: string,
488
481
  options: RalplanAutoHandoffOptions = {},
489
482
  ): Promise<RalplanAutoHandoffResolution> {
490
- const projectPath = path.join(gjcRoot(cwd), "settings.json");
491
- const project = await readSettingsAutoHandoff(projectPath);
492
- if (project.kind === "invalid") {
493
- throw new RalplanCommandError(2, `invalid ralplan settings at ${projectPath}: ${project.reason}`);
494
- }
495
- if (project.kind === "valid") {
496
- return resolveRalplanAutoHandoffTarget(project.value, projectPath, options);
497
- }
498
- const userPath = path.join(getConfigRootDir(), "settings.json");
499
- const user = await readSettingsAutoHandoff(userPath);
500
- if (user.kind === "invalid") {
501
- throw new RalplanCommandError(2, `invalid ralplan settings at ${userPath}: ${user.reason}`);
502
- }
503
- return resolveRalplanAutoHandoffTarget(
504
- user.kind === "valid" ? user.value : "off",
505
- user.kind === "valid" ? userPath : "default",
506
- options,
483
+ const { value, source } = await resolveStrictRalplanSetting(
484
+ cwd,
485
+ "gjc.ralplan.autoHandoff",
486
+ parsePresentRalplanAutoHandoff,
487
+ "off",
488
+ options.agentDir,
507
489
  );
490
+ return resolveRalplanAutoHandoffTarget(value, source, options);
508
491
  }
509
492
 
510
493
  function resolveRalplanAutoHandoffTarget(
@@ -533,78 +516,22 @@ function parseMaxReviewPassesPerLaneValue(value: unknown): number | null {
533
516
  return parseBoundedPositiveInteger(value, RALPLAN_MAX_REVIEW_PASSES_PER_LANE_LIMIT);
534
517
  }
535
518
 
536
- type RalplanReviewPassesPerLaneSetting =
537
- | { kind: "absent" }
538
- | { kind: "valid"; value: number }
539
- | { kind: "invalid"; reason: string };
540
-
541
- function parsePresentMaxReviewPassesPerLane(value: unknown): RalplanReviewPassesPerLaneSetting {
542
- const parsed = parseMaxReviewPassesPerLaneValue(value);
543
- return parsed === null
544
- ? {
545
- kind: "invalid",
546
- reason:
547
- "expected gjc.ralplan.maxReviewPassesPerLane to be an integer between 1 and " +
548
- RALPLAN_MAX_REVIEW_PASSES_PER_LANE_LIMIT,
549
- }
550
- : { kind: "valid", value: parsed };
551
- }
552
-
553
- function parseMaxReviewPassesPerLaneSettings(parsed: unknown): RalplanReviewPassesPerLaneSetting {
554
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return { kind: "absent" };
555
- const settings = parsed as Record<string, unknown>;
556
- if (Object.hasOwn(settings, "gjc.ralplan.maxReviewPassesPerLane")) {
557
- return parsePresentMaxReviewPassesPerLane(settings["gjc.ralplan.maxReviewPassesPerLane"]);
558
- }
559
- const gjc = settings.gjc;
560
- if (!gjc || typeof gjc !== "object" || Array.isArray(gjc)) return { kind: "absent" };
561
- const ralplan = (gjc as Record<string, unknown>).ralplan;
562
- if (!ralplan || typeof ralplan !== "object" || Array.isArray(ralplan)) return { kind: "absent" };
563
- const ralplanSettings = ralplan as Record<string, unknown>;
564
- if (!Object.hasOwn(ralplanSettings, "maxReviewPassesPerLane")) return { kind: "absent" };
565
- return parsePresentMaxReviewPassesPerLane(ralplanSettings.maxReviewPassesPerLane);
566
- }
567
-
568
- async function readSettingsMaxReviewPassesPerLane(settingsPath: string): Promise<RalplanReviewPassesPerLaneSetting> {
569
- let raw: string;
570
- try {
571
- raw = await Bun.file(settingsPath).text();
572
- } catch (error) {
573
- if (getErrorCode(error) === "ENOENT") return { kind: "absent" };
574
- return {
575
- kind: "invalid",
576
- reason: `unable to read settings: ${error instanceof Error ? error.message : String(error)}`,
577
- };
578
- }
579
- let parsed: unknown;
580
- try {
581
- parsed = JSON.parse(raw);
582
- } catch (error) {
583
- return {
584
- kind: "invalid",
585
- reason: `malformed JSON: ${error instanceof Error ? error.message : String(error)}`,
586
- };
587
- }
588
- return parseMaxReviewPassesPerLaneSettings(parsed);
589
- }
590
-
591
- /** Resolve the per-lane review-pass budget with project-over-user precedence. */
519
+ /** Resolve the per-lane review-pass budget through the shared resolver. */
592
520
  export async function resolveRalplanMaxReviewPassesPerLane(
593
521
  cwd: string,
522
+ agentDir?: string,
594
523
  ): Promise<{ maxReviewPassesPerLane: number; source: string }> {
595
- const projectPath = path.join(gjcRoot(cwd), "settings.json");
596
- const project = await readSettingsMaxReviewPassesPerLane(projectPath);
597
- if (project.kind === "invalid") {
598
- throw new RalplanCommandError(2, `invalid ralplan settings at ${projectPath}: ${project.reason}`);
599
- }
600
- if (project.kind === "valid") return { maxReviewPassesPerLane: project.value, source: projectPath };
601
- const userPath = path.join(getConfigRootDir(), "settings.json");
602
- const user = await readSettingsMaxReviewPassesPerLane(userPath);
603
- if (user.kind === "invalid") {
604
- throw new RalplanCommandError(2, `invalid ralplan settings at ${userPath}: ${user.reason}`);
605
- }
606
- if (user.kind === "valid") return { maxReviewPassesPerLane: user.value, source: userPath };
607
- return { maxReviewPassesPerLane: RALPLAN_DEFAULT_MAX_REVIEW_PASSES_PER_LANE, source: "default" };
524
+ const { value, source } = await resolveStrictRalplanSetting(
525
+ cwd,
526
+ "gjc.ralplan.maxReviewPassesPerLane",
527
+ workflowSettingParse(
528
+ parseMaxReviewPassesPerLaneValue,
529
+ `expected gjc.ralplan.maxReviewPassesPerLane to be an integer between 1 and ${RALPLAN_MAX_REVIEW_PASSES_PER_LANE_LIMIT}`,
530
+ ),
531
+ RALPLAN_DEFAULT_MAX_REVIEW_PASSES_PER_LANE,
532
+ agentDir,
533
+ );
534
+ return { maxReviewPassesPerLane: value, source };
608
535
  }
609
536
 
610
537
  function buildPlanningStuckResult(input: {
@@ -1915,7 +1842,11 @@ function buildIndexedReviewArtifacts(indexText: string | undefined): Map<string,
1915
1842
  return map;
1916
1843
  }
1917
1844
 
1918
- async function handleArtifactWrite(args: readonly string[], cwd: string): Promise<RalplanCommandResult> {
1845
+ async function handleArtifactWrite(
1846
+ args: readonly string[],
1847
+ cwd: string,
1848
+ agentDir?: string,
1849
+ ): Promise<RalplanCommandResult> {
1919
1850
  const resolved = await resolveArtifactArgs(args, cwd);
1920
1851
  const persistedRoleState = parsePersistedRoleStateArgs(args, resolved.stage);
1921
1852
  const laneVerdict = parseLaneVerdictArgs(args, resolved.stage, resolved.stageN);
@@ -2019,8 +1950,8 @@ async function handleArtifactWrite(args: readonly string[], cwd: string): Promis
2019
1950
  const [onDiskOpeners, onDiskLaneArtifacts, iterationLimit, laneLimit] = await Promise.all([
2020
1951
  countRalplanOnDiskOpeners(cwd, resolved.sessionId, resolved.runId),
2021
1952
  countRalplanOnDiskLaneArtifacts(cwd, resolved.sessionId, resolved.runId),
2022
- resolveRalplanMaxIterations(cwd),
2023
- resolveRalplanMaxReviewPassesPerLane(cwd),
1953
+ resolveRalplanMaxIterations(cwd, agentDir),
1954
+ resolveRalplanMaxReviewPassesPerLane(cwd, agentDir),
2024
1955
  ]);
2025
1956
  const capDecision = evaluateRalplanIterationCap({
2026
1957
  rows: indexLoad.rows,
@@ -2063,6 +1994,7 @@ async function handleArtifactWrite(args: readonly string[], cwd: string): Promis
2063
1994
  // state write. The ledger row below is the durable receipt for deduplicated
2064
1995
  // retries; state is only a current-session projection.
2065
1996
  autoHandoff = await resolveRalplanAutoHandoff(cwd, {
1997
+ agentDir,
2066
1998
  planningStuck: await readRalplanPlanningStuck(cwd, resolved.sessionId, resolved.runId),
2067
1999
  });
2068
2000
  }
@@ -2340,10 +2272,14 @@ async function handleDoctor(args: readonly string[], cwd: string): Promise<Ralpl
2340
2272
 
2341
2273
  /* -------------------------------- entry --------------------------------- */
2342
2274
 
2343
- export async function runNativeRalplanCommand(args: string[], cwd = process.cwd()): Promise<RalplanCommandResult> {
2275
+ export async function runNativeRalplanCommand(
2276
+ args: string[],
2277
+ cwd = process.cwd(),
2278
+ options: { agentDir?: string } = {},
2279
+ ): Promise<RalplanCommandResult> {
2344
2280
  try {
2345
2281
  if (isRalplanDoctorInvocation(args)) return await handleDoctor(args, cwd);
2346
- if (isRalplanArtifactWriteInvocation(args)) return await handleArtifactWrite(args, cwd);
2282
+ if (isRalplanArtifactWriteInvocation(args)) return await handleArtifactWrite(args, cwd, options.agentDir);
2347
2283
  return await handleConsensusHandoff(args, cwd);
2348
2284
  } catch (error) {
2349
2285
  if (error instanceof CommandError) return { status: error.exitStatus, stderr: `${error.message}\n` };