@gajae-code/coding-agent 0.13.3 → 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 (599) hide show
  1. package/CHANGELOG.md +184 -2
  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 +9 -1
  35. package/dist/types/config/models-config-schema.d.ts +2 -0
  36. package/dist/types/config/settings-schema.d.ts +70 -6
  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 +1 -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/gajae-pet-widget.d.ts +8 -30
  87. package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
  88. package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
  89. package/dist/types/modes/components/oauth-selector.d.ts +10 -4
  90. package/dist/types/modes/components/pet-capability.d.ts +11 -25
  91. package/dist/types/modes/components/status-line/gh.d.ts +6 -2
  92. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  93. package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
  94. package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
  95. package/dist/types/modes/interactive-mode.d.ts +1 -0
  96. package/dist/types/modes/types.d.ts +1 -0
  97. package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
  98. package/dist/types/runtime-mcp/config.d.ts +9 -0
  99. package/dist/types/runtime-mcp/manager.d.ts +26 -1
  100. package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
  101. package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
  102. package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
  103. package/dist/types/runtime-mcp/protocol.d.ts +278 -0
  104. package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
  105. package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
  106. package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
  107. package/dist/types/runtime-mcp/types.d.ts +102 -10
  108. package/dist/types/sdk/acp/adapter.d.ts +26 -5
  109. package/dist/types/sdk/broker/broker.d.ts +3 -55
  110. package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
  111. package/dist/types/sdk/broker/session-index.d.ts +14 -5
  112. package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
  113. package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
  114. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
  115. package/dist/types/sdk/bus/config.d.ts +11 -0
  116. package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
  117. package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
  118. package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
  119. package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
  120. package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
  121. package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
  122. package/dist/types/sdk/bus/index.d.ts +85 -99
  123. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
  124. package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
  125. package/dist/types/sdk/bus/notification-service.d.ts +52 -0
  126. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
  127. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
  128. package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
  129. package/dist/types/sdk/bus/session-control.d.ts +25 -1
  130. package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
  131. package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
  132. package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
  133. package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
  134. package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
  135. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
  136. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
  137. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
  138. package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
  139. package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
  140. package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
  141. package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
  142. package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
  143. package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
  144. package/dist/types/sdk/cli/rows.d.ts +2 -11
  145. package/dist/types/sdk/cli/session-cli.d.ts +15 -25
  146. package/dist/types/sdk/client/client.d.ts +97 -1
  147. package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
  148. package/dist/types/sdk/host/control/index.d.ts +1 -1
  149. package/dist/types/sdk/host/control/operations.d.ts +18 -5
  150. package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
  151. package/dist/types/sdk/host/host.d.ts +15 -1
  152. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  153. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  154. package/dist/types/sdk/host/session-runtime.d.ts +127 -7
  155. package/dist/types/sdk/host/types.d.ts +1 -1
  156. package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
  157. package/dist/types/sdk/index.d.ts +2 -1
  158. package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
  159. package/dist/types/sdk/lifecycle/client.d.ts +59 -0
  160. package/dist/types/sdk/lifecycle/index.d.ts +3 -0
  161. package/dist/types/sdk/lifecycle/service.d.ts +232 -0
  162. package/dist/types/sdk/mcp/server.d.ts +9 -6
  163. package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
  164. package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
  165. package/dist/types/sdk/prompt-status.d.ts +10 -3
  166. package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
  167. package/dist/types/sdk/receipt-state.d.ts +17 -0
  168. package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
  169. package/dist/types/sdk/router/index.d.ts +1 -0
  170. package/dist/types/sdk/router/session-router.d.ts +152 -0
  171. package/dist/types/sdk/session-list.d.ts +22 -0
  172. package/dist/types/sdk/session-reconnect.d.ts +43 -1
  173. package/dist/types/sdk/session.d.ts +34 -1
  174. package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
  175. package/dist/types/session/account-inventory.d.ts +86 -0
  176. package/dist/types/session/agent-session.d.ts +145 -6
  177. package/dist/types/session/agent-storage.d.ts +10 -0
  178. package/dist/types/session/coordinator-tool-label.d.ts +28 -0
  179. package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
  180. package/dist/types/session/messages.d.ts +1 -1
  181. package/dist/types/session/secure-token-file.d.ts +3 -0
  182. package/dist/types/session/session-manager.d.ts +40 -1
  183. package/dist/types/session/startup-auth-config.d.ts +44 -0
  184. package/dist/types/session/terminal-abort.d.ts +378 -0
  185. package/dist/types/session/yield-queue.d.ts +7 -0
  186. package/dist/types/session-import/claude.d.ts +26 -0
  187. package/dist/types/session-import/codex.d.ts +88 -0
  188. package/dist/types/session-import/command.d.ts +35 -0
  189. package/dist/types/session-import/detect.d.ts +22 -0
  190. package/dist/types/session-import/index.d.ts +7 -0
  191. package/dist/types/session-import/provider-codex.d.ts +22 -0
  192. package/dist/types/session-import/provider-service.d.ts +38 -0
  193. package/dist/types/session-import/redact.d.ts +23 -0
  194. package/dist/types/session-import/service.d.ts +47 -0
  195. package/dist/types/session-import/types.d.ts +120 -0
  196. package/dist/types/setup/paseo/check.d.ts +16 -0
  197. package/dist/types/setup/paseo/install-saga.d.ts +115 -0
  198. package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
  199. package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
  200. package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
  201. package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
  202. package/dist/types/setup/paseo/provider-config.d.ts +35 -0
  203. package/dist/types/setup/paseo/remove.d.ts +14 -0
  204. package/dist/types/setup/paseo/result-types.d.ts +59 -0
  205. package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
  206. package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
  207. package/dist/types/skill-state/active-state.d.ts +5 -1
  208. package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
  209. package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
  210. package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
  211. package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
  212. package/dist/types/slash-commands/types.d.ts +7 -1
  213. package/dist/types/task/executor.d.ts +10 -0
  214. package/dist/types/task/index.d.ts +3 -1
  215. package/dist/types/tools/ask-answer-registry.d.ts +6 -3
  216. package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
  217. package/dist/types/tools/bash.d.ts +2 -6
  218. package/dist/types/tools/browser/attach.d.ts +11 -0
  219. package/dist/types/tools/browser/launch.d.ts +20 -0
  220. package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
  221. package/dist/types/tools/browser/render.d.ts +1 -0
  222. package/dist/types/tools/browser.d.ts +3 -1
  223. package/dist/types/tools/image-gen.d.ts +9 -2
  224. package/dist/types/tools/index.d.ts +8 -0
  225. package/dist/types/tools/monitor.d.ts +1 -1
  226. package/dist/types/tools/skill-discovery.d.ts +8 -1
  227. package/dist/types/tools/subagent.d.ts +2 -0
  228. package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
  229. package/dist/types/utils/herdr-pane.d.ts +76 -0
  230. package/package.json +19 -9
  231. package/scripts/build-binary.ts +2 -1
  232. package/scripts/build-sdk-package-smoke.ts +2 -13
  233. package/scripts/capture-sticky-viewport-showcase.ts +0 -1
  234. package/scripts/compile-args.ts +2 -0
  235. package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
  236. package/scripts/generate-sdk-operation-inventory.ts +28 -0
  237. package/scripts/generate-telegram-baseline-manifest.ts +1 -0
  238. package/scripts/generate-tool-catalog.ts +6 -4
  239. package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
  240. package/src/async/job-manager.ts +352 -17
  241. package/src/async/support.ts +25 -0
  242. package/src/autoresearch/dashboard.ts +28 -13
  243. package/src/capability/index.ts +3 -1
  244. package/src/capability/mcp.ts +6 -0
  245. package/src/capability/types.ts +6 -0
  246. package/src/cli/accounts-cli.ts +395 -0
  247. package/src/cli/args.ts +23 -0
  248. package/src/cli/auth-broker-cli.ts +136 -66
  249. package/src/cli/auth-gateway-cli.ts +94 -70
  250. package/src/cli/config-cli.ts +27 -2
  251. package/src/cli/crash-cli.ts +78 -0
  252. package/src/cli/customize-doctor.ts +1605 -0
  253. package/src/cli/daemon-cli.ts +12 -3
  254. package/src/cli/fast-help.ts +1 -0
  255. package/src/cli/mcp-cli.ts +128 -60
  256. package/src/cli/notify-cli.ts +8 -14
  257. package/src/cli/root-flags.ts +8 -0
  258. package/src/cli/setup-cli.ts +145 -0
  259. package/src/cli/skills-cli.ts +38 -2
  260. package/src/cli/update-cli.ts +167 -12
  261. package/src/cli.ts +4 -0
  262. package/src/commands/accounts.ts +71 -0
  263. package/src/commands/crash.ts +35 -0
  264. package/src/commands/customize.ts +84 -0
  265. package/src/commands/daemon.ts +2 -2
  266. package/src/commands/deep-interview.ts +2 -0
  267. package/src/commands/launch.ts +1 -0
  268. package/src/commands/mcp.ts +12 -7
  269. package/src/commands/ralplan.ts +2 -0
  270. package/src/commands/sdk.ts +65 -32
  271. package/src/commands/setup.ts +5 -0
  272. package/src/commands/skills.ts +14 -4
  273. package/src/commands/ultragoal.ts +10 -1
  274. package/src/commands/update.ts +26 -15
  275. package/src/config/atomic-yaml-patch-worker.ts +57 -0
  276. package/src/config/atomic-yaml-patch.ts +769 -29
  277. package/src/config/config-schema-version.ts +10 -0
  278. package/src/config/file-lock.ts +70 -1
  279. package/src/config/mcp-schema.json +52 -14
  280. package/src/config/model-profile-activation.ts +20 -1
  281. package/src/config/model-profiles.ts +29 -19
  282. package/src/config/model-registry.ts +132 -21
  283. package/src/config/models-config-schema.ts +1 -1
  284. package/src/config/settings-schema.ts +76 -6
  285. package/src/config/settings.ts +4038 -199
  286. package/src/config/skill-settings-defaults.ts +41 -3
  287. package/src/config/task-delegation.ts +87 -0
  288. package/src/config/update-channel.ts +23 -0
  289. package/src/coordinator-mcp/server.ts +377 -308
  290. package/src/crash/index-store.ts +723 -0
  291. package/src/crash/nudge.ts +89 -0
  292. package/src/crash/record-loader.ts +149 -0
  293. package/src/crash/report.ts +551 -0
  294. package/src/crash/sanitize.ts +129 -0
  295. package/src/cursor.ts +36 -10
  296. package/src/customization/import.ts +946 -0
  297. package/src/customization/index.ts +4 -0
  298. package/src/customization/inventory.ts +335 -0
  299. package/src/customization/mutations.ts +141 -0
  300. package/src/customization/types.ts +223 -0
  301. package/src/daemon/control-types.ts +8 -1
  302. package/src/daemon/operator-contract.ts +6 -6
  303. package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
  304. package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
  305. package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
  306. package/src/discovery/claude-hooks.ts +38 -0
  307. package/src/discovery/claude.ts +142 -209
  308. package/src/discovery/codex-hooks.ts +38 -0
  309. package/src/discovery/codex.ts +132 -198
  310. package/src/discovery/helpers.ts +8 -1
  311. package/src/discovery/index.ts +2 -0
  312. package/src/discovery/mcp-compat.ts +234 -0
  313. package/src/discovery/mcp-json.ts +6 -0
  314. package/src/edit/renderer.ts +40 -0
  315. package/src/edit/streaming.ts +4 -2
  316. package/src/exec/bash-executor.ts +24 -20
  317. package/src/export/html/index.ts +51 -2
  318. package/src/extensibility/extensions/loader.ts +9 -1
  319. package/src/extensibility/extensions/runner.ts +17 -4
  320. package/src/extensibility/extensions/types.ts +31 -6
  321. package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
  322. package/src/extensibility/gjc-plugins/installer.ts +9 -5
  323. package/src/extensibility/gjc-plugins/observability.ts +8 -2
  324. package/src/extensibility/gjc-plugins/registry.ts +13 -2
  325. package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
  326. package/src/extensibility/gjc-plugins/schema.ts +222 -39
  327. package/src/extensibility/hooks/loader.ts +154 -10
  328. package/src/extensibility/runtime-skill-discovery.ts +257 -60
  329. package/src/extensibility/skill-management.ts +368 -0
  330. package/src/extensibility/skills.ts +52 -16
  331. package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
  332. package/src/gjc-runtime/launch-worktree.ts +56 -2
  333. package/src/gjc-runtime/linux-proc.ts +7 -1
  334. package/src/gjc-runtime/ralplan-runtime.ts +100 -164
  335. package/src/gjc-runtime/session-state-lock.ts +992 -0
  336. package/src/gjc-runtime/session-state-sidecar.ts +644 -142
  337. package/src/gjc-runtime/state-writer.ts +39 -14
  338. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
  339. package/src/gjc-runtime/ultragoal-guard.ts +11 -4
  340. package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
  341. package/src/gjc-runtime/workflow-settings.ts +596 -0
  342. package/src/goals/tools/goal-tool.ts +6 -1
  343. package/src/hooks/events.ts +291 -0
  344. package/src/hooks/native-skill-hook.ts +4 -0
  345. package/src/hooks/normalize.ts +369 -0
  346. package/src/hooks/skill-state.ts +165 -46
  347. package/src/internal-urls/docs-index.generated.ts +40 -32
  348. package/src/main.ts +32 -5
  349. package/src/migrate/mcp-mapper.ts +25 -2
  350. package/src/modes/acp/abort-scope.ts +29 -0
  351. package/src/modes/acp/acp-agent.ts +423 -98
  352. package/src/modes/components/assistant-message.ts +6 -1
  353. package/src/modes/components/customization/customization-dashboard.ts +443 -0
  354. package/src/modes/components/customization/import-wizard.ts +372 -0
  355. package/src/modes/components/customization/index.ts +1 -0
  356. package/src/modes/components/gajae-pet-widget.ts +539 -213
  357. package/src/modes/components/irc-sidebar.ts +11 -0
  358. package/src/modes/components/iterm-pet-transport.ts +585 -0
  359. package/src/modes/components/oauth-selector.ts +277 -86
  360. package/src/modes/components/pet-capability.ts +39 -40
  361. package/src/modes/components/settings-selector.ts +9 -0
  362. package/src/modes/components/status-line/gh.ts +45 -1
  363. package/src/modes/components/status-line/segments.ts +16 -1
  364. package/src/modes/components/tool-status-header.ts +13 -3
  365. package/src/modes/controllers/command-controller.ts +20 -8
  366. package/src/modes/controllers/extension-ui-controller.ts +56 -257
  367. package/src/modes/controllers/input-controller.ts +10 -0
  368. package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
  369. package/src/modes/controllers/selector-controller.ts +177 -72
  370. package/src/modes/controllers/stt-controller.ts +3 -3
  371. package/src/modes/interactive-mode.ts +88 -16
  372. package/src/modes/print-mode.ts +35 -6
  373. package/src/modes/runtime-init.ts +21 -68
  374. package/src/modes/types.ts +1 -0
  375. package/src/modes/utils/injected-user-submission.ts +25 -0
  376. package/src/modes/utils/terminal-bell.ts +15 -1
  377. package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
  378. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  379. package/src/prompts/agents/critic.md +1 -1
  380. package/src/prompts/system/rlm-research.md +1 -1
  381. package/src/prompts/system/system-prompt.md +0 -2
  382. package/src/prompts/tools/bash.md +7 -1
  383. package/src/prompts/tools/browser.md +1 -1
  384. package/src/prompts/tools/cron.md +6 -6
  385. package/src/prompts/tools/read.md +0 -2
  386. package/src/prompts/tools/skill-discovery.md +4 -2
  387. package/src/runtime-mcp/client.ts +427 -23
  388. package/src/runtime-mcp/config.ts +37 -5
  389. package/src/runtime-mcp/manager-pool.test.ts +56 -0
  390. package/src/runtime-mcp/manager.ts +52 -2
  391. package/src/runtime-mcp/oauth-discovery.ts +13 -0
  392. package/src/runtime-mcp/oauth-flow.ts +46 -1
  393. package/src/runtime-mcp/pool-key.ts +5 -1
  394. package/src/runtime-mcp/pool.test.ts +9 -0
  395. package/src/runtime-mcp/protocol.test.ts +353 -0
  396. package/src/runtime-mcp/protocol.ts +624 -0
  397. package/src/runtime-mcp/scope-config.ts +78 -0
  398. package/src/runtime-mcp/tool-bridge.ts +44 -10
  399. package/src/runtime-mcp/transports/http.ts +84 -13
  400. package/src/runtime-mcp/types.ts +123 -12
  401. package/src/sdk/acp/adapter.ts +328 -97
  402. package/src/sdk/broker/broker.ts +160 -741
  403. package/src/sdk/broker/ensure.ts +9 -1
  404. package/src/sdk/broker/lifecycle.ts +510 -116
  405. package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
  406. package/src/sdk/broker/process-incarnation.ts +19 -0
  407. package/src/sdk/broker/session-index.ts +516 -117
  408. package/src/sdk/broker/startup-failure.ts +28 -5
  409. package/src/sdk/broker/transport.ts +1 -13
  410. package/src/sdk/bus/chat-daemon-cli.ts +4 -2
  411. package/src/sdk/bus/chat-daemon-control.ts +67 -6
  412. package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
  413. package/src/sdk/bus/config.ts +13 -0
  414. package/src/sdk/bus/conversation-store.ts +59 -171
  415. package/src/sdk/bus/daemon-paths.ts +20 -0
  416. package/src/sdk/bus/discord-conversation.ts +2 -0
  417. package/src/sdk/bus/discord-daemon.ts +524 -126
  418. package/src/sdk/bus/discord-live-provider.ts +206 -79
  419. package/src/sdk/bus/existing-thread-readiness.ts +4 -97
  420. package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
  421. package/src/sdk/bus/index.ts +2480 -456
  422. package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
  423. package/src/sdk/bus/lifecycle-commands.ts +2 -2
  424. package/src/sdk/bus/managed-daemon.ts +2 -145
  425. package/src/sdk/bus/notification-service.ts +196 -0
  426. package/src/sdk/bus/operator-runtime.ts +1 -1
  427. package/src/sdk/bus/prompt-reconciliation.ts +24 -15
  428. package/src/sdk/bus/reconciliation-store.ts +553 -24
  429. package/src/sdk/bus/session-control.ts +49 -3
  430. package/src/sdk/bus/slack-conversation.ts +4 -0
  431. package/src/sdk/bus/slack-daemon.ts +733 -134
  432. package/src/sdk/bus/slack-live-provider.ts +65 -15
  433. package/src/sdk/bus/slack-provider.ts +4 -0
  434. package/src/sdk/bus/slack-thread-binding.ts +9 -104
  435. package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
  436. package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
  437. package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
  438. package/src/sdk/bus/telegram-daemon-control.ts +3 -13
  439. package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
  440. package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
  441. package/src/sdk/bus/telegram-daemon.ts +2552 -2280
  442. package/src/sdk/bus/telegram-reference.ts +1 -226
  443. package/src/sdk/bus/telegram-setup.ts +2 -2
  444. package/src/sdk/bus/threaded-render.ts +1 -0
  445. package/src/sdk/bus/topic-registry.ts +279 -146
  446. package/src/sdk/cli/rows.ts +2 -35
  447. package/src/sdk/cli/session-cli.ts +776 -700
  448. package/src/sdk/client/client.ts +892 -1
  449. package/src/sdk/host/control/dispatch.ts +93 -58
  450. package/src/sdk/host/control/index.ts +1 -1
  451. package/src/sdk/host/control/operations.ts +18 -10
  452. package/src/sdk/host/control/runtime-gate.ts +40 -0
  453. package/src/sdk/host/host.ts +63 -12
  454. package/src/sdk/host/query/handlers.ts +66 -7
  455. package/src/sdk/host/reverse-leases.ts +2 -2
  456. package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
  457. package/src/sdk/host/session-runtime.test.ts +2787 -34
  458. package/src/sdk/host/session-runtime.ts +1489 -101
  459. package/src/sdk/host/surface-policy.ts +12 -8
  460. package/src/sdk/host/types.ts +1 -1
  461. package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
  462. package/src/sdk/host/websocket-transport.ts +85 -50
  463. package/src/sdk/index.ts +2 -1
  464. package/src/sdk/lifecycle/broker-client.ts +53 -0
  465. package/src/sdk/lifecycle/client.ts +234 -0
  466. package/src/sdk/lifecycle/index.ts +3 -0
  467. package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
  468. package/src/sdk/lifecycle/service.ts +720 -0
  469. package/src/sdk/mcp/server.ts +226 -188
  470. package/src/sdk/prompt-deadline-lease.ts +55 -0
  471. package/src/sdk/prompt-deadline-manager.ts +148 -0
  472. package/src/sdk/prompt-status.ts +11 -3
  473. package/src/sdk/protocol/operation-inventory.generated.json +272 -129
  474. package/src/sdk/protocol/operation-registry.ts +71 -8
  475. package/src/sdk/receipt-state.ts +43 -0
  476. package/src/sdk/reconciliation-extensions.ts +14 -0
  477. package/src/sdk/router/index.ts +1 -0
  478. package/src/sdk/router/session-router.ts +1658 -0
  479. package/src/sdk/session-list.ts +93 -0
  480. package/src/sdk/session-reconnect.ts +45 -1
  481. package/src/sdk/session.ts +716 -120
  482. package/src/sdk/transport/serve-cli.ts +18 -34
  483. package/src/session/account-inventory.ts +603 -0
  484. package/src/session/agent-session.ts +2857 -582
  485. package/src/session/agent-storage.ts +35 -0
  486. package/src/session/blob-store.ts +32 -1
  487. package/src/session/coordinator-tool-label.ts +40 -0
  488. package/src/session/internal/managed-session-scope.ts +4 -0
  489. package/src/session/internal/managed-session-storage.ts +173 -12
  490. package/src/session/messages.ts +1 -1
  491. package/src/session/secure-token-file.ts +80 -0
  492. package/src/session/session-manager.ts +730 -58
  493. package/src/session/session-storage.ts +25 -16
  494. package/src/session/startup-auth-config.ts +297 -0
  495. package/src/session/terminal-abort.ts +1253 -0
  496. package/src/session/yield-queue.ts +57 -15
  497. package/src/session-import/claude.ts +334 -0
  498. package/src/session-import/codex.ts +1033 -0
  499. package/src/session-import/command.ts +77 -0
  500. package/src/session-import/detect.ts +133 -0
  501. package/src/session-import/index.ts +7 -0
  502. package/src/session-import/provider-codex.ts +327 -0
  503. package/src/session-import/provider-service.ts +457 -0
  504. package/src/session-import/redact.ts +128 -0
  505. package/src/session-import/service.ts +1264 -0
  506. package/src/session-import/types.ts +148 -0
  507. package/src/setup/paseo/check.ts +213 -0
  508. package/src/setup/paseo/install-saga.ts +293 -0
  509. package/src/setup/paseo/json-publisher.ts +263 -0
  510. package/src/setup/paseo/orchestration-preferences.ts +86 -0
  511. package/src/setup/paseo/paseo-ownership.ts +224 -0
  512. package/src/setup/paseo/paseo-setup.ts +253 -0
  513. package/src/setup/paseo/provider-config.ts +139 -0
  514. package/src/setup/paseo/remove.ts +183 -0
  515. package/src/setup/paseo/result-types.ts +79 -0
  516. package/src/setup/paseo/setup-deps.ts +175 -0
  517. package/src/setup/paseo/skills-bridge.ts +260 -0
  518. package/src/skill-state/active-state.ts +21 -11
  519. package/src/slash-commands/acp-builtins.ts +9 -1
  520. package/src/slash-commands/builtin-registry.ts +98 -16
  521. package/src/slash-commands/helpers/credential-switch.ts +143 -0
  522. package/src/slash-commands/helpers/mcp.ts +9 -3
  523. package/src/slash-commands/helpers/usage-report.ts +61 -56
  524. package/src/slash-commands/types.ts +7 -2
  525. package/src/task/executor.ts +30 -11
  526. package/src/task/index.ts +66 -7
  527. package/src/task/render.ts +23 -9
  528. package/src/tools/ask-answer-registry.ts +23 -7
  529. package/src/tools/ask.ts +8 -4
  530. package/src/tools/bash-sleep-advisory.ts +115 -0
  531. package/src/tools/bash.ts +98 -18
  532. package/src/tools/browser/attach.ts +71 -3
  533. package/src/tools/browser/launch.ts +86 -13
  534. package/src/tools/browser/profile-discovery.ts +57 -7
  535. package/src/tools/browser/render.ts +8 -1
  536. package/src/tools/browser.ts +130 -21
  537. package/src/tools/computer.enforcement.test.ts +1 -1
  538. package/src/tools/computer.ts +3 -2
  539. package/src/tools/cron.ts +12 -1
  540. package/src/tools/image-gen.ts +27 -16
  541. package/src/tools/index.ts +8 -0
  542. package/src/tools/job.ts +33 -6
  543. package/src/tools/monitor.ts +41 -2
  544. package/src/tools/skill-discovery.ts +21 -29
  545. package/src/tools/subagent.ts +142 -24
  546. package/src/tools/tool-catalog.generated.ts +6 -6
  547. package/src/tools/ultragoal-ask-guard.ts +10 -3
  548. package/src/utils/herdr-pane.ts +345 -0
  549. package/src/utils/title-generator.ts +2 -0
  550. package/src/web/scrapers/index.ts +6 -4
  551. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  552. package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
  553. package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
  554. package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
  555. package/dist/types/runtime/lazy-service.test.d.ts +0 -1
  556. package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
  557. package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
  558. package/dist/types/runtime-mcp/config.test.d.ts +0 -1
  559. package/dist/types/runtime-mcp/http.test.d.ts +0 -1
  560. package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
  561. package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
  562. package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
  563. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
  564. package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
  565. package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
  566. package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
  567. package/dist/types/sdk/elevation/audit.d.ts +0 -93
  568. package/dist/types/sdk/elevation/capability.d.ts +0 -3
  569. package/dist/types/sdk/elevation/digest.d.ts +0 -72
  570. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
  571. package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
  572. package/dist/types/sdk/elevation/owner.d.ts +0 -48
  573. package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
  574. package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
  575. package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
  576. package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
  577. package/dist/types/session/auth-broker-config.d.ts +0 -13
  578. package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
  579. package/dist/types/skills/skills.test.d.ts +0 -1
  580. package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
  581. package/dist/types/task/token-log.test.d.ts +0 -1
  582. package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
  583. package/dist/types/tools/descriptors.test.d.ts +0 -1
  584. package/scripts/g005-daemon-smoke.ts +0 -180
  585. package/scripts/g011-daemon-path-smoke.ts +0 -153
  586. package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
  587. package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
  588. package/src/sdk/bus/telegram-cli.ts +0 -212
  589. package/src/sdk/elevation/allowlist.ts +0 -54
  590. package/src/sdk/elevation/audit.ts +0 -208
  591. package/src/sdk/elevation/capability.ts +0 -41
  592. package/src/sdk/elevation/digest.ts +0 -129
  593. package/src/sdk/elevation/dispatch-receipt.ts +0 -184
  594. package/src/sdk/elevation/grant-ledger.ts +0 -1142
  595. package/src/sdk/elevation/owner.ts +0 -109
  596. package/src/session/auth-broker-config.ts +0 -109
  597. /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
  598. /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
  599. /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
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
+ }