@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
@@ -24,6 +24,7 @@ import {
24
24
  type ServiceTier,
25
25
  } from "@gajae-code/ai/core";
26
26
  import { type JsonSchemaValidationIssue, validateJsonSchemaValue } from "@gajae-code/ai/utils/schema";
27
+ import * as canonicalSdk from "@gajae-code/coding-agent/sdk";
27
28
  import { logger, prompt, untilAborted } from "@gajae-code/utils";
28
29
  import { AsyncJobManager } from "../async";
29
30
  import { ModelRegistry } from "../config/model-registry";
@@ -42,7 +43,7 @@ import subagentSystemPromptTemplate from "../prompts/system/subagent-system-prom
42
43
  import subagentUserPromptTemplate from "../prompts/system/subagent-user-prompt.md" with { type: "text" };
43
44
  import submitReminderTemplate from "../prompts/system/subagent-yield-reminder.md" with { type: "text" };
44
45
  import { AgentRegistry } from "../registry/agent-registry";
45
- import { createAgentSession, discoverAuthStorage } from "../sdk";
46
+ import { discoverAuthStorage } from "../sdk";
46
47
  import type { AgentSession, AgentSessionEvent, ForkContextSeed } from "../session/agent-session";
47
48
  import type { ArtifactManager } from "../session/artifacts";
48
49
  import type { AuthStorage } from "../session/auth-storage";
@@ -269,6 +270,15 @@ export interface ExecutorOptions {
269
270
  */
270
271
  parentArtifactManager?: ArtifactManager;
271
272
  managedPersistence?: ManagedTaskPersistence;
273
+ /**
274
+ * The parent session's ENDPOINT-owned AsyncJobManager (resolved by the
275
+ * TaskTool via forEndpoint(sessionId) ?? instance()). Model metadata and
276
+ * live-handle state for THIS subagent are recorded in the SAME manager the
277
+ * task job runs in — with concurrent top-level sessions the process-global
278
+ * instance belongs to a different session and would surface this subagent
279
+ * under the wrong session's record (review thread P1).
280
+ */
281
+ asyncJobManager?: AsyncJobManager;
272
282
  parentHindsightSessionState?: HindsightSessionState;
273
283
  /**
274
284
  * Parent agent's OpenTelemetry configuration. When defined, the subagent's
@@ -1560,7 +1570,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
1560
1570
  // Record which model the subagent actually runs on (and any auth fallback,
1561
1571
  // see #985) so the subagent panel can surface it to the user.
1562
1572
  if (model) {
1563
- AsyncJobManager.instance()?.updateSubagentModel?.(options.subagentId ?? id, {
1573
+ (options.asyncJobManager ?? AsyncJobManager.instance())?.updateSubagentModel?.(options.subagentId ?? id, {
1564
1574
  requestedModel: modelSubstitutionWarning?.requested ?? resolvedModelString,
1565
1575
  effectiveModel: resolvedModelString,
1566
1576
  modelFellBack: authFallbackUsed === true,
@@ -1676,7 +1686,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
1676
1686
  }
1677
1687
 
1678
1688
  const { session } = await awaitAbortable(
1679
- createAgentSession({
1689
+ canonicalSdk.createAgentSession({
1680
1690
  cwd: worktree ?? cwd,
1681
1691
  authStorage,
1682
1692
  modelRegistry,
@@ -1738,6 +1748,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
1738
1748
  },
1739
1749
  parentHindsightSessionState: options.parentHindsightSessionState,
1740
1750
  parentTaskPrefix: id,
1751
+ inheritedAsyncJobManager: options.asyncJobManager,
1741
1752
  inheritedMcpManager: options.parentMcpManager,
1742
1753
  agentId: id,
1743
1754
  agentDisplayName: agent.name,
@@ -1761,7 +1772,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
1761
1772
  session.seedDefaultFallbackResolution(activeIndex ?? 0, skips);
1762
1773
  }
1763
1774
  const liveSubagentId = options.subagentId ?? id;
1764
- const manager = AsyncJobManager.instance();
1775
+ const manager = options.asyncJobManager ?? AsyncJobManager.instance();
1765
1776
  if (manager) {
1766
1777
  manager.registerLiveHandle(liveSubagentId, {
1767
1778
  requestPause: () => {
@@ -1964,12 +1975,20 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
1964
1975
  if (event.type === "model_fallback_switched") {
1965
1976
  activeProviderModelString = event.to;
1966
1977
  progress.fastMode = isFastForModel(session.model);
1967
- AsyncJobManager.instance()?.updateSubagentModel?.(options.subagentId ?? id, {
1968
- requestedModel: modelSubstitutionWarning?.requested ?? resolvedModelString,
1969
- effectiveModel: event.to,
1970
- modelFellBack: true,
1971
- fastMode: progress.fastMode,
1972
- });
1978
+ // Keep the fallback metadata on the SAME manager the initial
1979
+ // update used: another session may have become the
1980
+ // process-global instance, and writing to it would leave this
1981
+ // session's subagent metadata stale or overwrite an unrelated
1982
+ // same-ID record (review thread P2).
1983
+ (options.asyncJobManager ?? AsyncJobManager.instance())?.updateSubagentModel?.(
1984
+ options.subagentId ?? id,
1985
+ {
1986
+ requestedModel: modelSubstitutionWarning?.requested ?? resolvedModelString,
1987
+ effectiveModel: event.to,
1988
+ modelFellBack: true,
1989
+ fastMode: progress.fastMode,
1990
+ },
1991
+ );
1973
1992
  scheduleProgress(true);
1974
1993
  forwardSubagentEvent(event);
1975
1994
  return;
@@ -2108,7 +2127,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
2108
2127
  if (exitCode === 0) exitCode = 1;
2109
2128
  }
2110
2129
  sessionAbortController.abort();
2111
- AsyncJobManager.instance()?.removeLiveHandle(options.subagentId ?? id);
2130
+ (options.asyncJobManager ?? AsyncJobManager.instance())?.removeLiveHandle(options.subagentId ?? id);
2112
2131
  if (unsubscribe) {
2113
2132
  try {
2114
2133
  unsubscribe();
package/src/task/index.ts CHANGED
@@ -18,9 +18,14 @@ import * as os from "node:os";
18
18
  import path from "node:path";
19
19
  import type { AgentTool, AgentToolResult, AgentToolUpdateCallback } from "@gajae-code/agent-core";
20
20
  import type { Model, Usage } from "@gajae-code/ai/core";
21
+ import {
22
+ AsyncJobManager,
23
+ OwnerSubagentShutdownError,
24
+ type ResumeRunner,
25
+ type SubagentRunOutcome,
26
+ } from "@gajae-code/coding-agent/async";
21
27
  import { $pickenv, prompt, Snowflake } from "@gajae-code/utils";
22
28
  import type { ToolSession } from "..";
23
- import { AsyncJobManager, OwnerSubagentShutdownError, type ResumeRunner, type SubagentRunOutcome } from "../async";
24
29
  import { resolveProfileBindings } from "../config/model-profiles";
25
30
  import { resolveAgentModelPatterns } from "../config/model-resolver";
26
31
  import type { Theme } from "../modes/theme/theme";
@@ -56,8 +61,10 @@ import {
56
61
  } from "../gjc-runtime/repository-binding";
57
62
  import { initializeLocalRoot, type LocalProtocolOptions, resolveLocalUrlToPath } from "../internal-urls";
58
63
  import { ArtifactManager } from "../session/artifacts";
64
+ import { registerOwnedIfLineaged } from "../session/terminal-abort";
59
65
  import { generateCommitMessage } from "../utils/commit-message-generator";
60
66
  import * as git from "../utils/git";
67
+ import { loadBundledAgents } from "./agents";
61
68
  import { discoverAgents, filterVisibleAgents, getAgent } from "./discovery";
62
69
  import { createManagedTaskPersistence, renderSubagentUserPrompt, runSubprocess } from "./executor";
63
70
  import { adviseForkContextMode } from "./fork-context-advisory";
@@ -66,7 +73,6 @@ import { getTaskIdValidationError, validateAllocatedTaskId } from "./id";
66
73
  import { AgentOutputManager } from "./output-manager";
67
74
  import { mapWithConcurrencyLimit, Semaphore } from "./parallel";
68
75
  import { assertNoRawTaskFields, buildTaskReceipt, buildTaskRoiSummary, type TaskResultReceipt } from "./receipt";
69
-
70
76
  import { renderResult, renderCall as renderTaskCall } from "./render";
71
77
  import { reconcileSpawnRoi } from "./roi-reconciliation";
72
78
  import { getTaskSimpleModeCapabilities, type TaskSimpleMode } from "./simple-mode";
@@ -796,6 +802,30 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
796
802
  return new TaskTool(session, agents, publicRepositoryBinding(sessionRepositoryBinding));
797
803
  }
798
804
 
805
+ /** Create catalog metadata from bundled agents only, without ambient filesystem discovery. */
806
+ static async createForToolCatalog(session: ToolSession): Promise<TaskTool> {
807
+ const sessionRepositoryBinding = await captureRepositoryBinding(session.cwd, { displayPath: session.cwd });
808
+ await assertExecutionRootMatchesRepositoryBinding(session.cwd, sessionRepositoryBinding);
809
+ return new TaskTool(session, loadBundledAgents(), publicRepositoryBinding(sessionRepositoryBinding));
810
+ }
811
+
812
+ /**
813
+ * The session's ENDPOINT-owned AsyncJobManager, falling back to the
814
+ * process-global instance. Concurrent top-level sessions each register
815
+ * their manager under their endpoint (sdk/session.ts), so a task job
816
+ * created by THIS session must be registered, resumed, and reported
817
+ * through THIS session's manager — otherwise a scope:"owned" abort
818
+ * consults the endpoint manager and cannot cancel or prove the task, and
819
+ * its completion is delivered by the wrong session's callback (review
820
+ * thread P1).
821
+ */
822
+ #resolveOwnedJobManager(): AsyncJobManager | undefined {
823
+ const endpointId = this.session.getSessionId?.() ?? undefined;
824
+ return (
825
+ this.session.getAsyncJobManager?.() ?? AsyncJobManager.forEndpoint(endpointId) ?? AsyncJobManager.instance()
826
+ );
827
+ }
828
+
799
829
  async execute(
800
830
  _toolCallId: string,
801
831
  rawParams: unknown,
@@ -886,7 +916,14 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
886
916
  };
887
917
  }
888
918
 
889
- const manager = AsyncJobManager.instance();
919
+ // The session's ENDPOINT-owned manager first: with concurrent top-level
920
+ // sessions the process-global instance may belong to a different
921
+ // session, and an endpoint-qualified owned registration recorded here
922
+ // must live in the SAME manager the job actually runs in — otherwise a
923
+ // scope:"owned" abort consults the endpoint manager, cannot cancel or
924
+ // prove the task, and returns uncertainty while the task continues
925
+ // (review thread P1).
926
+ const manager = this.#resolveOwnedJobManager();
890
927
  if (!manager) {
891
928
  return {
892
929
  content: [{ type: "text", text: "Subagent background execution is unavailable in this session." }],
@@ -1015,7 +1052,7 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
1015
1052
  };
1016
1053
  let resumeRunner: ResumeRunner | undefined;
1017
1054
  if (typeof manager.setResumeRunner === "function") {
1018
- resumeRunner = (_subagentId, message, resumeDescriptor) => {
1055
+ resumeRunner = (_subagentId, message, resumeDescriptor, resumeToolCallId) => {
1019
1056
  const descriptor = isTaskResumeDescriptor(resumeDescriptor?.data) ? resumeDescriptor.data : undefined;
1020
1057
  if (!descriptor) return undefined;
1021
1058
  const admission = (() => {
@@ -1066,7 +1103,7 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
1066
1103
  repositoryBinding: descriptor.repositoryBinding,
1067
1104
  duplicate_policy: descriptor.duplicatePolicy,
1068
1105
  };
1069
- return manager.register(
1106
+ const resumeJobId = manager.register(
1070
1107
  "task",
1071
1108
  descriptor.task.id,
1072
1109
  async ({ signal: runSignal }) => {
@@ -1128,6 +1165,21 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
1128
1165
  },
1129
1166
  },
1130
1167
  );
1168
+ // Bind the resumed job to the CURRENT resume request's tool call
1169
+ // (the original launch id would attribute it to the OLD turn, so a
1170
+ // scope:"owned" abort of the resuming turn could miss it — review
1171
+ // thread P1).
1172
+ // The registration is ENDPOINT-qualified: concurrent sessions can
1173
+ // receive the same provider-local tool-call id, and an
1174
+ // endpoint-less resolve would take the FIRST matching binding —
1175
+ // registering B's task under A's endpoint/lineage (review P1).
1176
+ registerOwnedIfLineaged(
1177
+ manager,
1178
+ resumeToolCallId ?? descriptor.toolCallId,
1179
+ resumeJobId,
1180
+ this.session.getSessionId?.() ?? undefined,
1181
+ );
1182
+ return resumeJobId;
1131
1183
  };
1132
1184
  manager.setResumeRunner(resumeRunner);
1133
1185
  }
@@ -1357,6 +1409,7 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
1357
1409
  },
1358
1410
  },
1359
1411
  );
1412
+ registerOwnedIfLineaged(manager, _toolCallId, jobId, this.session.getSessionId?.() ?? undefined);
1360
1413
  startedJobs.push({ jobId, taskId: taskItem.id });
1361
1414
  if (typeof manager.registerResumeDescriptor === "function") {
1362
1415
  manager.registerResumeDescriptor(
@@ -1960,6 +2013,10 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
1960
2013
  },
1961
2014
  ) => {
1962
2015
  const forkContextSeed = prebuiltForkContextSeeds?.get(task.id) ?? (await buildForkContextSeed(task));
2016
+ // The session's ENDPOINT-owned manager (resolved once per task so
2017
+ // model metadata and live handles land in the SAME manager the
2018
+ // job runs in — review thread P1).
2019
+ const manager = this.#resolveOwnedJobManager();
1963
2020
  const forkContext = requestsForkContext(task)
1964
2021
  ? { mode: task.inheritContext, clonedTokens: forkContextSeed?.metadata.approximateTokens ?? 0 }
1965
2022
  : undefined;
@@ -2000,6 +2057,7 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
2000
2057
  runMode: overrides?.runMode ?? executionOverrides?.runMode,
2001
2058
  resumeMessage: overrides?.resumeMessage ?? executionOverrides?.resumeMessage,
2002
2059
  subagentId: task.id,
2060
+ asyncJobManager: manager,
2003
2061
  taskDepth,
2004
2062
  modelOverride,
2005
2063
  parentActiveModelPattern,
@@ -2022,7 +2080,7 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
2022
2080
  progressMap.set(index, {
2023
2081
  ...structuredClone(progress),
2024
2082
  });
2025
- AsyncJobManager.instance()?.recordSubagentProgress(task.id, progress);
2083
+ this.#resolveOwnedJobManager()?.recordSubagentProgress(task.id, progress);
2026
2084
  emitProgress();
2027
2085
  },
2028
2086
  authStorage: this.session.authStorage,
@@ -2077,6 +2135,7 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
2077
2135
  runMode: overrides?.runMode ?? executionOverrides?.runMode,
2078
2136
  resumeMessage: overrides?.resumeMessage ?? executionOverrides?.resumeMessage,
2079
2137
  subagentId: task.id,
2138
+ asyncJobManager: manager,
2080
2139
  taskDepth,
2081
2140
  modelOverride,
2082
2141
  parentActiveModelPattern,
@@ -2099,7 +2158,7 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
2099
2158
  progressMap.set(index, {
2100
2159
  ...structuredClone(progress),
2101
2160
  });
2102
- AsyncJobManager.instance()?.recordSubagentProgress(task.id, progress);
2161
+ this.#resolveOwnedJobManager()?.recordSubagentProgress(task.id, progress);
2103
2162
  emitProgress();
2104
2163
  },
2105
2164
  authStorage: this.session.authStorage,
@@ -987,12 +987,17 @@ export function renderResult(
987
987
 
988
988
  const lines: string[] = [];
989
989
 
990
+ // Tool details can be restored from a persisted session or arrive through
991
+ // a runtime update, so the declared receipt array is not sufficient at
992
+ // this rendering boundary.
993
+ const resultsUnavailable = !Array.isArray(details.results);
994
+ const results = resultsUnavailable ? [] : details.results;
990
995
  const hasProgress = Boolean(details.progress && details.progress.length > 0);
991
- const shouldRenderProgress = hasProgress && (isPartial || details.results.length === 0);
992
- const hasResults = details.results.length > 0;
996
+ const shouldRenderProgress = hasProgress && (isPartial || results.length === 0);
997
+ const hasResults = results.length > 0;
993
998
  if (hasResults) {
994
- details.results.forEach((res, i) => {
995
- const isLast = !shouldRenderProgress && i === details.results.length - 1;
999
+ results.forEach((res, i) => {
1000
+ const isLast = !shouldRenderProgress && i === results.length - 1;
996
1001
  lines.push(...renderAgentResult(res, isLast, expanded, theme));
997
1002
  });
998
1003
  }
@@ -1004,10 +1009,10 @@ export function renderResult(
1004
1009
  });
1005
1010
  }
1006
1011
  if (hasResults && !shouldRenderProgress) {
1007
- const abortedCount = details.results.filter(r => r.status === "aborted").length;
1008
- const mergeFailedCount = details.results.filter(r => r.status === "merge_failed").length;
1009
- const successCount = details.results.filter(r => r.status === "completed").length;
1010
- const failCount = details.results.length - successCount - mergeFailedCount - abortedCount;
1012
+ const abortedCount = results.filter(r => r.status === "aborted").length;
1013
+ const mergeFailedCount = results.filter(r => r.status === "merge_failed").length;
1014
+ const successCount = results.filter(r => r.status === "completed").length;
1015
+ const failCount = results.length - successCount - mergeFailedCount - abortedCount;
1011
1016
  let summary = `${theme.fg("dim", "Total:")} `;
1012
1017
  if (abortedCount > 0) {
1013
1018
  summary += theme.fg("error", `${abortedCount} aborted`);
@@ -1027,9 +1032,18 @@ export function renderResult(
1027
1032
  summary += `${theme.sep.dot}${theme.fg("dim", formatDuration(details.totalDurationMs))}`;
1028
1033
  lines.push(summary);
1029
1034
  }
1035
+ if (resultsUnavailable && !isPartial) {
1036
+ lines.push(theme.fg("dim", "Task result details unavailable"));
1037
+ }
1030
1038
 
1031
1039
  if (lines.length === 0) {
1032
- const text = fallbackText.trim() ? fallbackText : "No results";
1040
+ const text = resultsUnavailable
1041
+ ? isPartial
1042
+ ? "Task results pending"
1043
+ : "Task result details unavailable"
1044
+ : fallbackText.trim()
1045
+ ? fallbackText
1046
+ : "No results";
1033
1047
  const result = [theme.fg("dim", truncateToWidth(text, width))];
1034
1048
  if (!hasDynamicRetry) cached = { key, lines: result };
1035
1049
  return result;
@@ -3,8 +3,10 @@
3
3
  *
4
4
  * Decouples the `ask` tool (which reads the source via `AgentSession`) from the
5
5
  * notifications extension (which registers one), without threading a new method
6
- * through the extension/runner/controller wiring. A session has at most one
7
- * source; registering returns a disposer.
6
+ * through the extension/runner/controller wiring. A session may have multiple
7
+ * sources. A "protocol" source always takes precedence over an "interactive"
8
+ * source regardless of registration order; within the same kind, the most
9
+ * recently registered source wins. Registering returns a disposer.
8
10
  */
9
11
 
10
12
  /** Error code a remote ask source uses to signal that its own timeout fired. */
@@ -14,19 +16,31 @@ import { logger } from "@gajae-code/utils";
14
16
  import type { WorkflowGateEmitter } from "../modes/shared/agent-wire/workflow-gate-broker";
15
17
  import type { AskAnswerSource } from "./index";
16
18
 
17
- const sources = new Map<string, AskAnswerSource[]>();
19
+ export type AskAnswerSourceKind = "protocol" | "interactive";
20
+
21
+ interface RegisteredAskAnswerSource {
22
+ readonly source: AskAnswerSource;
23
+ readonly kind: AskAnswerSourceKind;
24
+ }
25
+
26
+ const sources = new Map<string, RegisteredAskAnswerSource[]>();
18
27
  const workflowGateEmitters = new Map<string, WorkflowGateEmitter>();
19
28
  const workflowGateListeners = new Map<string, Set<(emitter: WorkflowGateEmitter | undefined) => void>>();
20
29
 
21
30
  /** Register `source` for `sessionId`. Returns a disposer that restores the prior source. */
22
- export function registerAskAnswerSource(sessionId: string, source: AskAnswerSource): () => void {
31
+ export function registerAskAnswerSource(
32
+ sessionId: string,
33
+ source: AskAnswerSource,
34
+ kind: AskAnswerSourceKind = "interactive",
35
+ ): () => void {
23
36
  const stack = sources.get(sessionId) ?? [];
24
- stack.push(source);
37
+ const entry: RegisteredAskAnswerSource = { source, kind };
38
+ stack.push(entry);
25
39
  sources.set(sessionId, stack);
26
40
  return () => {
27
41
  const current = sources.get(sessionId);
28
42
  if (!current) return;
29
- const index = current.lastIndexOf(source);
43
+ const index = current.lastIndexOf(entry);
30
44
  if (index >= 0) current.splice(index, 1);
31
45
  if (current.length === 0) sources.delete(sessionId);
32
46
  };
@@ -34,7 +48,9 @@ export function registerAskAnswerSource(sessionId: string, source: AskAnswerSour
34
48
 
35
49
  /** The highest-priority answer source for `sessionId`, if one is registered. */
36
50
  export function getAskAnswerSource(sessionId: string): AskAnswerSource | undefined {
37
- return sources.get(sessionId)?.at(-1);
51
+ const entries = sources.get(sessionId);
52
+ const protocolEntry = entries?.findLast(entry => entry.kind === "protocol");
53
+ return protocolEntry?.source ?? entries?.at(-1)?.source;
38
54
  }
39
55
 
40
56
  /** Publish a session's current workflow-gate emitter after mode initialization. */
package/src/tools/ask.ts CHANGED
@@ -803,10 +803,14 @@ export class AskTool implements AgentTool<AskParametersSchema, AskToolDetails> {
803
803
  _onUpdate?: AgentToolUpdateCallback<AskToolDetails>,
804
804
  context?: AgentToolContext,
805
805
  ): Promise<AgentToolResult<AskToolDetails>> {
806
- await assertUltragoalAskAllowed(this.session.cwd, {
807
- activeSkillState: this.session.getActiveSkillState?.(),
808
- sessionId: this.session.getSessionId?.() ?? null,
809
- });
806
+ await assertUltragoalAskAllowed(
807
+ this.session.cwd,
808
+ {
809
+ activeSkillState: this.session.getActiveSkillState?.(),
810
+ sessionId: this.session.getSessionId?.() ?? null,
811
+ },
812
+ this.session.getSessionAgentDir?.() ?? this.session.settings.getAgentDir(),
813
+ );
810
814
  assertDeepInterviewStructuredResponseWithinLimit(params);
811
815
  let activeRemoteReceipt: AskRemoteReceipt | undefined;
812
816
  let activeRemoteRequest: AskAnswerRequest | undefined;
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Advisory detection of long blocking `sleep` in bash commands (#4465).
3
+ *
4
+ * When the agent reaches for a long silent `sleep N` instead of using
5
+ * `subagent await` or `job poll` to wait for background work, the session emits
6
+ * nothing for the entire duration and looks indistinguishable from a hang to
7
+ * the operator. This module detects that pattern and returns a bounded advisory
8
+ * notice — it never blocks the command, adds no fake progress, and respects the
9
+ * authority boundary: only the tool result/guidance surfaces the warning, not a
10
+ * runtime refusal. Legitimate sleeps (daemons, test servers, rate-limit pacing)
11
+ * are not blocked; the notice is purely advisory.
12
+ *
13
+ * Detection is intentionally conservative: a standalone `sleep` with an explicit
14
+ * numeric duration at or above the threshold, or a `sleep` chained with `&&` to
15
+ * a single trailing command (the common "sleep then check" pattern from #4465).
16
+ * Compound commands where `sleep` is incidental to real work are not flagged.
17
+ /**
18
+ * Minimum sleep duration (in seconds) that triggers the advisory notice.
19
+ */
20
+ const LONG_SLEEP_THRESHOLD_SEC = 120;
21
+
22
+ /**
23
+ * Matches a standalone `sleep` command with an explicit numeric duration.
24
+ * Supports `sleep N`, `sleep Ns`, `sleep Nm`, `sleep Nh`, `sleep 1d`, and
25
+ * multiple arguments (`sleep 5 3` — sleeps 5s per POSIX, but the intent is the
26
+ * same). The number is parsed as seconds for the threshold check.
27
+ *
28
+ * Examples that trigger:
29
+ * `sleep 800`
30
+ * `sleep 800; git log --oneline -1`
31
+ * `sleep 300 && git log --oneline -1`
32
+ * `sleep 5m`
33
+ *
34
+ * Examples that do NOT trigger:
35
+ * `sleep 5`
36
+ * `sleep 10; echo done`
37
+ * `server --port 3000` (no sleep at all)
38
+ */
39
+ const SLEEP_DURATION_RE = /(?:^|[\s;&|]+)sleep\s+([0-9]+(?:\.[0-9]+)?)([smhd]?)/;
40
+
41
+ /** Parse a sleep duration token into seconds. */
42
+ function parseSleepSeconds(rawNumber: string, unit: string): number {
43
+ const value = Number.parseFloat(rawNumber);
44
+ if (!Number.isFinite(value) || value <= 0) return 0;
45
+ const unitLower = unit.toLowerCase();
46
+ switch (unitLower) {
47
+ case "":
48
+ case "s":
49
+ return value;
50
+ case "m":
51
+ return value * 60;
52
+ case "h":
53
+ return value * 3600;
54
+ case "d":
55
+ return value * 86400;
56
+ default:
57
+ return value;
58
+ }
59
+ }
60
+
61
+ /** Round seconds to the nearest whole minute for human-readable display. */
62
+ function roundToMinutes(seconds: number): number {
63
+ return Math.round(seconds / 60);
64
+ }
65
+
66
+ /**
67
+ * Format a duration in seconds as a short `Xm` / `Xs` string.
68
+ *
69
+ * `Xs` for anything under a minute (covers the zero case), otherwise `Xm`.
70
+ * Uses the same minute rounding as the notice body so the two stay consistent.
71
+ */
72
+ function formatDuration(seconds: number): string {
73
+ return seconds < 60 ? `${Math.round(seconds)}s` : `${roundToMinutes(seconds)}m`;
74
+ }
75
+
76
+ /**
77
+ * Detect a long blocking sleep in a bash command and return an advisory notice,
78
+ * or `undefined` if the command does not contain a qualifying sleep. The notice
79
+ * is appended to the bash result output; it never blocks execution.
80
+ *
81
+ * `timeoutSec` is the effective (already-clamped) execution timeout the command
82
+ * will run under, when known. The bash tool kills the command at this timeout
83
+ * whether the sleep fits inside it or not. Passing it lets the notice report
84
+ * the bounded effective silent wait the operator will actually observe, instead
85
+ * of the requested duration (which may be much longer and is never reached).
86
+ * When `timeoutSec` is `undefined` (no timeout known at the construction
87
+ * boundary), the notice reports only the requested duration and stays useful.
88
+ */
89
+ export function longSleepAdvisory(command: string, timeoutSec?: number): string | undefined {
90
+ const match = command.match(SLEEP_DURATION_RE);
91
+ if (!match) return undefined;
92
+ const requestedSeconds = parseSleepSeconds(match[1]!, match[2]!);
93
+ if (requestedSeconds < LONG_SLEEP_THRESHOLD_SEC) return undefined;
94
+
95
+ const parts = [
96
+ `Note: this command requests a sleep of ~${formatDuration(requestedSeconds)}, during which the session produces no output and is indistinguishable from a hang (#4465).`,
97
+ ];
98
+
99
+ // When the effective timeout is known and is shorter than the requested
100
+ // sleep, the command is killed at the timeout — the operator never sees the
101
+ // full requested duration. Surface the bounded wait so the notice matches
102
+ // observable behavior. (For PTY/async the same timeout applies: the tool
103
+ // kills the command at timeoutSec regardless of mode.)
104
+ if (timeoutSec !== undefined && timeoutSec < requestedSeconds) {
105
+ parts.push(
106
+ `The execution timeout will kill this command after ~${formatDuration(timeoutSec)}, so the effective silent wait is bounded by the timeout, not the requested sleep.`,
107
+ );
108
+ }
109
+
110
+ parts.push(
111
+ "Long blocking sleeps are not how to wait for subagents or background jobs.",
112
+ "Prefer `subagent await` (which emits periodic liveness) or `job poll` to wait observably.",
113
+ );
114
+ return parts.join(" ");
115
+ }