@gajae-code/coding-agent 0.18.11 → 0.19.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 (462) hide show
  1. package/CHANGELOG.md +760 -0
  2. package/dist/types/async/job-manager.d.ts +7 -3
  3. package/dist/types/async/result-formatting.d.ts +2 -0
  4. package/dist/types/autoresearch/git.d.ts +1 -1
  5. package/dist/types/capability/fs.d.ts +2 -2
  6. package/dist/types/capability/rule.d.ts +7 -2
  7. package/dist/types/cli/accounts-cli.d.ts +2 -2
  8. package/dist/types/cli/append-system-prompt.d.ts +6 -0
  9. package/dist/types/cli/args.d.ts +7 -2
  10. package/dist/types/cli/customize-doctor-precedence.d.ts +16 -0
  11. package/dist/types/cli/customize-doctor.d.ts +4 -3
  12. package/dist/types/cli/doctor/install-repairs.d.ts +4 -1
  13. package/dist/types/cli/install-activation.d.ts +10 -4
  14. package/dist/types/cli/public-command-errors.d.ts +2 -0
  15. package/dist/types/cli/root-flags.d.ts +0 -12
  16. package/dist/types/cli/update-cli.d.ts +21 -3
  17. package/dist/types/cli-main.d.ts +0 -6
  18. package/dist/types/cli-ordinary.d.ts +2 -2
  19. package/dist/types/commands/accounts.d.ts +2 -1
  20. package/dist/types/commands/launch.d.ts +0 -6
  21. package/dist/types/commands/migrate.d.ts +1 -1
  22. package/dist/types/commands/sdk.d.ts +13 -0
  23. package/dist/types/commit/changelog/index.d.ts +1 -0
  24. package/dist/types/commit/map-reduce/index.d.ts +4 -4
  25. package/dist/types/config/autorouting-tier-map.d.ts +53 -1
  26. package/dist/types/config/config-hot-reload-trust.d.ts +12 -0
  27. package/dist/types/config/config-hot-reload.d.ts +44 -0
  28. package/dist/types/config/file-lock.d.ts +52 -3
  29. package/dist/types/config/model-discovery-manager.d.ts +2 -0
  30. package/dist/types/config/model-profile-activation.d.ts +79 -9
  31. package/dist/types/config/model-registry.d.ts +72 -8
  32. package/dist/types/config/model-resolver.d.ts +7 -4
  33. package/dist/types/config/models-config-schema.d.ts +10 -0
  34. package/dist/types/config/settings-schema.d.ts +57 -4
  35. package/dist/types/config/settings.d.ts +33 -1
  36. package/dist/types/coordinator-mcp/server.d.ts +4 -0
  37. package/dist/types/customization/import.d.ts +2 -0
  38. package/dist/types/customization/types.d.ts +1 -1
  39. package/dist/types/dap/config.d.ts +8 -4
  40. package/dist/types/dap/session.d.ts +11 -2
  41. package/dist/types/debug/system-info.d.ts +6 -1
  42. package/dist/types/discovery/helpers.d.ts +7 -2
  43. package/dist/types/discovery/mcp-compat.d.ts +3 -1
  44. package/dist/types/edit/index.d.ts +5 -0
  45. package/dist/types/edit/modes/patch.d.ts +14 -0
  46. package/dist/types/edit/modes/replace.d.ts +3 -0
  47. package/dist/types/eval/py/runtime.d.ts +9 -0
  48. package/dist/types/exec/bash-executor.d.ts +12 -0
  49. package/dist/types/export/ttsr.d.ts +19 -0
  50. package/dist/types/extensibility/extensions/types.d.ts +5 -1
  51. package/dist/types/extensibility/slash-commands.d.ts +1 -0
  52. package/dist/types/gjc-runtime/managed-owner-admission.d.ts +3 -0
  53. package/dist/types/gjc-runtime/ralplan-current-final.d.ts +54 -0
  54. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +5 -0
  55. package/dist/types/gjc-runtime/session-state-lock.d.ts +2 -0
  56. package/dist/types/gjc-runtime/state-runtime.d.ts +0 -2
  57. package/dist/types/gjc-runtime/tmux-sessions.d.ts +24 -0
  58. package/dist/types/gjc-runtime/ultragoal-change-set.d.ts +6 -0
  59. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +1 -0
  60. package/dist/types/harness-control-plane/receipt-spool.d.ts +4 -0
  61. package/dist/types/hindsight/content.d.ts +5 -6
  62. package/dist/types/internal-urls/types.d.ts +2 -0
  63. package/dist/types/lsp/clients/swiftlint-client.d.ts +0 -4
  64. package/dist/types/main.d.ts +23 -18
  65. package/dist/types/migrate/action-planner.d.ts +10 -1
  66. package/dist/types/migrate/adapters/codex.d.ts +2 -1
  67. package/dist/types/migrate/adapters/index.d.ts +42 -1
  68. package/dist/types/migrate/executor.d.ts +3 -1
  69. package/dist/types/migrate/hook-module.d.ts +23 -0
  70. package/dist/types/migrate/report.d.ts +2 -1
  71. package/dist/types/migrate/types.d.ts +82 -3
  72. package/dist/types/modes/components/agent-dashboard.d.ts +1 -1
  73. package/dist/types/modes/components/model-selector.d.ts +43 -0
  74. package/dist/types/modes/components/settings-selector.d.ts +6 -0
  75. package/dist/types/modes/controllers/selector-controller.d.ts +2 -0
  76. package/dist/types/modes/prompt-suggestion-controller.d.ts +1 -1
  77. package/dist/types/modes/theme/theme.d.ts +1 -0
  78. package/dist/types/modes/utils/host-status.d.ts +15 -11
  79. package/dist/types/runtime-mcp/content-limits.d.ts +4 -0
  80. package/dist/types/runtime-mcp/manager.d.ts +7 -0
  81. package/dist/types/runtime-mcp/plugin-mcp-name-filter.d.ts +22 -0
  82. package/dist/types/runtime-mcp/project-host-values.d.ts +11 -5
  83. package/dist/types/runtime-mcp/tool-bridge.d.ts +4 -0
  84. package/dist/types/sdk/broker/broker-exit.d.ts +3 -3
  85. package/dist/types/sdk/broker/broker.d.ts +29 -2
  86. package/dist/types/sdk/broker/daemon-entry.d.ts +11 -1
  87. package/dist/types/sdk/broker/doctor-restart.d.ts +1 -1
  88. package/dist/types/sdk/broker/ensure.d.ts +141 -9
  89. package/dist/types/sdk/broker/hop.d.ts +45 -0
  90. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +18 -10
  91. package/dist/types/sdk/broker/lifecycle.d.ts +22 -0
  92. package/dist/types/sdk/broker/lock-host-identity.d.ts +5 -0
  93. package/dist/types/sdk/broker/session-index.d.ts +6 -1
  94. package/dist/types/sdk/broker/transport.d.ts +2 -0
  95. package/dist/types/sdk/bus/chat-command-policy.d.ts +2 -1
  96. package/dist/types/sdk/bus/index.d.ts +44 -0
  97. package/dist/types/sdk/bus/reconciliation-store.d.ts +10 -0
  98. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +9 -1
  99. package/dist/types/sdk/bus/telegram-daemon.d.ts +2 -0
  100. package/dist/types/sdk/bus/threaded-render.d.ts +2 -1
  101. package/dist/types/sdk/cli/session-cli.d.ts +0 -1
  102. package/dist/types/sdk/host/control/operations.d.ts +5 -1
  103. package/dist/types/sdk/host/events.d.ts +4 -0
  104. package/dist/types/sdk/host/host.d.ts +2 -1
  105. package/dist/types/sdk/host/prompt-image-upload.d.ts +43 -0
  106. package/dist/types/sdk/host/session-runtime.d.ts +40 -8
  107. package/dist/types/sdk/host/surface-policy.d.ts +2 -1
  108. package/dist/types/sdk/lifecycle/service.d.ts +12 -0
  109. package/dist/types/sdk/prompt-deadline-flush.d.ts +42 -4
  110. package/dist/types/sdk/prompt-deadline-manager.d.ts +2 -0
  111. package/dist/types/sdk/prompt-status.d.ts +11 -4
  112. package/dist/types/sdk/protocol/adapter-validation.d.ts +10 -4
  113. package/dist/types/sdk/reconciliation-extensions.d.ts +1 -1
  114. package/dist/types/sdk/session-list.d.ts +1 -1
  115. package/dist/types/session/agent-session.d.ts +107 -9
  116. package/dist/types/session/internal/managed-session-scope.d.ts +2 -2
  117. package/dist/types/session/internal/managed-session-storage.d.ts +1 -1
  118. package/dist/types/session/internal/native-publish-outcome.d.ts +1 -1
  119. package/dist/types/session/messages.d.ts +5 -1
  120. package/dist/types/session/session-manager.d.ts +29 -3
  121. package/dist/types/session/startup-auth-config.d.ts +24 -2
  122. package/dist/types/session/streaming-output.d.ts +11 -0
  123. package/dist/types/session/terminal-abort.d.ts +3 -1
  124. package/dist/types/session-import/service.d.ts +1 -1
  125. package/dist/types/skill-state/workflow-mutation-guard.d.ts +20 -4
  126. package/dist/types/slash-commands/helpers/mcp.d.ts +5 -0
  127. package/dist/types/slash-commands/helpers/provider-auth-status.d.ts +8 -0
  128. package/dist/types/ssh/ssh-executor.d.ts +8 -1
  129. package/dist/types/system-prompt.d.ts +3 -2
  130. package/dist/types/task/executor.d.ts +19 -2
  131. package/dist/types/task/role-body.d.ts +11 -0
  132. package/dist/types/tools/ast-edit-write-path.d.ts +10 -0
  133. package/dist/types/tools/atomic-file-write.d.ts +9 -7
  134. package/dist/types/tools/awaiting-input.d.ts +28 -0
  135. package/dist/types/tools/bash-allowed-prefixes.d.ts +17 -0
  136. package/dist/types/tools/bash-skill-urls.d.ts +4 -0
  137. package/dist/types/tools/bash.d.ts +7 -0
  138. package/dist/types/tools/descriptors.d.ts +15 -2
  139. package/dist/types/tools/fetch.d.ts +7 -1
  140. package/dist/types/tools/index.d.ts +2 -0
  141. package/dist/types/tools/irc.d.ts +5 -3
  142. package/dist/types/tools/python.d.ts +1 -1
  143. package/dist/types/tools/report-issue.d.ts +41 -0
  144. package/dist/types/tools/subagent.d.ts +23 -0
  145. package/dist/types/tools/tmux-self-injection-guard.d.ts +2 -0
  146. package/dist/types/tools/ultragoal-ask-guard.d.ts +1 -1
  147. package/dist/types/tools/write.d.ts +2 -0
  148. package/dist/types/utils/file-mentions.d.ts +5 -0
  149. package/dist/types/utils/image-limits.d.ts +7 -0
  150. package/dist/types/utils/image-loading.d.ts +0 -1
  151. package/dist/types/utils/open.d.ts +0 -1
  152. package/dist/types/utils/pasted-image-loading.d.ts +1 -5
  153. package/dist/types/utils/prompt-suggestion.d.ts +2 -2
  154. package/dist/types/utils/shell-snapshot.d.ts +2 -0
  155. package/dist/types/utils/title-generator.d.ts +13 -3
  156. package/dist/types/web/scrapers/types.d.ts +8 -1
  157. package/dist/types/web/search/providers/codex.d.ts +6 -7
  158. package/dist/types/web/search/providers/insane.d.ts +7 -1
  159. package/dist/types/web/search/providers/searxng.d.ts +5 -0
  160. package/package.json +10 -9
  161. package/scripts/acp-conformance-agent.ts +12 -2
  162. package/scripts/build-binary.ts +2 -1
  163. package/scripts/capture-subagent-compact-panel-showcase.ts +105 -0
  164. package/scripts/generate-docs-index.ts +8 -1
  165. package/scripts/generate-sdk-operation-inventory.ts +38 -4
  166. package/src/async/job-manager.ts +356 -56
  167. package/src/async/result-formatting.ts +40 -0
  168. package/src/autoresearch/git.ts +9 -2
  169. package/src/autoresearch/prompts/prompt-setup.md +1 -1
  170. package/src/capability/fs.ts +58 -22
  171. package/src/capability/index.ts +2 -2
  172. package/src/capability/rule.ts +11 -2
  173. package/src/cli/accounts-cli.ts +176 -8
  174. package/src/cli/append-system-prompt.ts +12 -0
  175. package/src/cli/args.ts +11 -7
  176. package/src/cli/auth-broker-cli.ts +21 -11
  177. package/src/cli/customize-doctor-precedence.ts +31 -0
  178. package/src/cli/customize-doctor.ts +49 -39
  179. package/src/cli/doctor/install-repairs.ts +35 -5
  180. package/src/cli/fast-help.ts +1 -3
  181. package/src/cli/install-activation.ts +47 -4
  182. package/src/cli/migrate-cli.ts +19 -6
  183. package/src/cli/public-command-errors.ts +6 -0
  184. package/src/cli/root-flags.ts +2 -4
  185. package/src/cli/stats-cli.ts +9 -5
  186. package/src/cli/update-cli.ts +471 -13
  187. package/src/cli-ordinary.ts +7 -2
  188. package/src/commands/accounts.ts +10 -5
  189. package/src/commands/harness.ts +25 -15
  190. package/src/commands/migrate.ts +3 -3
  191. package/src/commands/sdk.ts +277 -50
  192. package/src/commands/ultragoal.ts +16 -8
  193. package/src/commit/agentic/agent.ts +6 -6
  194. package/src/commit/analysis/conventional.ts +14 -5
  195. package/src/commit/changelog/index.ts +39 -1
  196. package/src/commit/map-reduce/index.ts +7 -7
  197. package/src/commit/message.ts +10 -3
  198. package/src/commit/pipeline.ts +12 -12
  199. package/src/config/autorouting-tier-map.ts +50 -1
  200. package/src/config/config-file.ts +106 -3
  201. package/src/config/config-hot-reload-trust.ts +148 -0
  202. package/src/config/config-hot-reload.ts +742 -0
  203. package/src/config/file-lock.ts +1615 -328
  204. package/src/config/keybindings.ts +154 -7
  205. package/src/config/model-bindings-applier.ts +85 -47
  206. package/src/config/model-discovery-manager.ts +10 -0
  207. package/src/config/model-profile-activation.ts +889 -148
  208. package/src/config/model-registry.ts +1706 -205
  209. package/src/config/model-resolver.ts +52 -22
  210. package/src/config/models-config-schema.ts +6 -0
  211. package/src/config/settings-schema.ts +73 -4
  212. package/src/config/settings.ts +460 -24
  213. package/src/coordinator-mcp/policy.ts +26 -1
  214. package/src/coordinator-mcp/server.ts +37 -2
  215. package/src/crash/sanitize.ts +7 -1
  216. package/src/customization/import.ts +279 -8
  217. package/src/customization/inventory.ts +24 -8
  218. package/src/customization/types.ts +1 -0
  219. package/src/dap/client.ts +3 -2
  220. package/src/dap/config.ts +31 -11
  221. package/src/dap/defaults.json +1 -1
  222. package/src/dap/session.ts +161 -36
  223. package/src/debug/crash-diagnostics.ts +89 -6
  224. package/src/debug/report-bundle.ts +90 -2
  225. package/src/debug/system-info.ts +8 -3
  226. package/src/defaults/gjc/extensions/grok-cli-vendor/src/shared/base-url.ts +21 -7
  227. package/src/discovery/agents-md.ts +1 -1
  228. package/src/discovery/builtin.ts +4 -3
  229. package/src/discovery/helpers.ts +25 -16
  230. package/src/discovery/mcp-compat.ts +120 -17
  231. package/src/edit/apply-patch/index.ts +12 -1
  232. package/src/edit/index.ts +204 -22
  233. package/src/edit/modes/patch.ts +214 -8
  234. package/src/edit/modes/replace.ts +136 -0
  235. package/src/eval/js/context-manager.ts +29 -3
  236. package/src/eval/js/worker-entry.ts +51 -18
  237. package/src/eval/py/executor.ts +14 -4
  238. package/src/eval/py/runner.py +144 -5
  239. package/src/eval/py/runtime.ts +44 -4
  240. package/src/exec/bash-executor.ts +81 -4
  241. package/src/exec/bash-shell-guardian.ts +4 -1
  242. package/src/exec/bash-shell-supervisor.ts +8 -4
  243. package/src/exec/isolated-shell.ts +5 -1
  244. package/src/exec/non-interactive-env.ts +0 -1
  245. package/src/export/html/index.ts +86 -6
  246. package/src/export/ttsr.ts +176 -1
  247. package/src/extensibility/custom-tools/wrapper.ts +3 -1
  248. package/src/extensibility/extensions/loader.ts +10 -1
  249. package/src/extensibility/extensions/ouroboros-ooo-bridge.ts +63 -1
  250. package/src/extensibility/extensions/types.ts +5 -1
  251. package/src/extensibility/hooks/loader.ts +10 -2
  252. package/src/extensibility/plugins/marketplace/fetcher.ts +2 -2
  253. package/src/extensibility/plugins/marketplace/manager.ts +36 -10
  254. package/src/extensibility/slash-commands.ts +5 -0
  255. package/src/gjc-runtime/gc-runtime.ts +37 -7
  256. package/src/gjc-runtime/launch-tmux.ts +30 -15
  257. package/src/gjc-runtime/launch-worktree.test.ts +148 -0
  258. package/src/gjc-runtime/launch-worktree.ts +101 -14
  259. package/src/gjc-runtime/managed-owner-admission.ts +46 -2
  260. package/src/gjc-runtime/ralplan-current-final.ts +294 -0
  261. package/src/gjc-runtime/ralplan-runtime.ts +95 -1
  262. package/src/gjc-runtime/session-resolution.ts +38 -6
  263. package/src/gjc-runtime/session-state-lock.ts +59 -14
  264. package/src/gjc-runtime/state-runtime.ts +23 -19
  265. package/src/gjc-runtime/state-writer.ts +109 -5
  266. package/src/gjc-runtime/tmux-sessions.ts +93 -13
  267. package/src/gjc-runtime/ultragoal-change-set.ts +90 -11
  268. package/src/gjc-runtime/ultragoal-guard.ts +9 -1
  269. package/src/gjc-runtime/ultragoal-runtime.ts +15 -5
  270. package/src/harness-control-plane/finalize.ts +11 -0
  271. package/src/harness-control-plane/receipt-spool.ts +105 -28
  272. package/src/harness-control-plane/storage.ts +124 -6
  273. package/src/hindsight/content.ts +116 -16
  274. package/src/hindsight/mental-models.ts +22 -10
  275. package/src/hindsight/state.ts +7 -4
  276. package/src/hooks/native-skill-hook.ts +17 -12
  277. package/src/internal-urls/artifact-protocol.ts +3 -1
  278. package/src/internal-urls/docs-index.generated.ts +23 -22
  279. package/src/internal-urls/local-protocol.ts +167 -8
  280. package/src/internal-urls/types.ts +2 -0
  281. package/src/lsp/client.ts +2 -1
  282. package/src/lsp/clients/biome-client.ts +2 -0
  283. package/src/lsp/clients/swiftlint-client.ts +2 -0
  284. package/src/lsp/index.ts +29 -0
  285. package/src/lsp/workspace-path.ts +23 -0
  286. package/src/main.ts +330 -92
  287. package/src/memories/index.ts +25 -2
  288. package/src/migrate/action-planner.ts +574 -2
  289. package/src/migrate/adapters/claude-code.ts +162 -5
  290. package/src/migrate/adapters/codex.ts +77 -7
  291. package/src/migrate/adapters/index.ts +258 -5
  292. package/src/migrate/adapters/opencode.ts +10 -1
  293. package/src/migrate/executor.ts +222 -7
  294. package/src/migrate/hook-module.ts +193 -0
  295. package/src/migrate/report.ts +63 -2
  296. package/src/migrate/types.ts +84 -4
  297. package/src/modes/DESIGN.md +51 -0
  298. package/src/modes/acp/acp-agent.ts +10 -1
  299. package/src/modes/acp/permission-mode.ts +18 -1
  300. package/src/modes/components/agent-dashboard.ts +20 -4
  301. package/src/modes/components/assistant-message.ts +55 -1
  302. package/src/modes/components/customization/customization-dashboard.ts +7 -0
  303. package/src/modes/components/customization/import-wizard.ts +29 -3
  304. package/src/modes/components/model-selector.ts +157 -103
  305. package/src/modes/components/settings-selector.ts +103 -37
  306. package/src/modes/components/welcome.ts +3 -1
  307. package/src/modes/controllers/command-controller.ts +300 -9
  308. package/src/modes/controllers/event-controller.ts +1 -1
  309. package/src/modes/controllers/extension-ui-controller.ts +31 -1
  310. package/src/modes/controllers/goal-mode-controller.ts +79 -10
  311. package/src/modes/controllers/input-controller.ts +2 -0
  312. package/src/modes/controllers/plan-mode-controller.ts +66 -11
  313. package/src/modes/controllers/runtime-mcp-command-controller.ts +7 -6
  314. package/src/modes/controllers/selector-controller.ts +76 -7
  315. package/src/modes/interactive-mode.ts +123 -4
  316. package/src/modes/prompt-suggestion-controller.ts +1 -1
  317. package/src/modes/runtime-init.ts +5 -1
  318. package/src/modes/theme/theme.ts +15 -0
  319. package/src/modes/utils/host-status.ts +21 -10
  320. package/src/prompts/agent-fragments/browser-aside.md +2 -2
  321. package/src/prompts/system/irc-incoming.md +3 -1
  322. package/src/prompts/tools/debug.md +1 -1
  323. package/src/prompts/tools/irc.md +1 -1
  324. package/src/prompts/tools/read.md +1 -1
  325. package/src/prompts/tools/report-issue.md +13 -0
  326. package/src/prompts/tools/task.md +1 -1
  327. package/src/runtime-credential-selector.ts +2 -2
  328. package/src/runtime-mcp/content-limits.ts +7 -0
  329. package/src/runtime-mcp/manager-pool.test.ts +5 -4
  330. package/src/runtime-mcp/manager.ts +40 -3
  331. package/src/runtime-mcp/oauth-flow.ts +32 -6
  332. package/src/runtime-mcp/plugin-mcp-name-filter.ts +62 -0
  333. package/src/runtime-mcp/project-host-values.ts +12 -8
  334. package/src/runtime-mcp/render.ts +16 -1
  335. package/src/runtime-mcp/tool-bridge.ts +194 -21
  336. package/src/runtime-mcp/transports/stdio.ts +2 -1
  337. package/src/sdk/broker/broker-exit.ts +10 -5
  338. package/src/sdk/broker/broker.ts +484 -85
  339. package/src/sdk/broker/daemon-entry.ts +338 -116
  340. package/src/sdk/broker/doctor-restart.ts +2 -1
  341. package/src/sdk/broker/ensure.ts +1214 -268
  342. package/src/sdk/broker/hop.ts +286 -0
  343. package/src/sdk/broker/lifecycle-ledger.ts +38 -11
  344. package/src/sdk/broker/lifecycle.ts +102 -6
  345. package/src/sdk/broker/lock-host-identity.ts +29 -0
  346. package/src/sdk/broker/session-index.ts +91 -16
  347. package/src/sdk/broker/transport.ts +17 -1
  348. package/src/sdk/bus/chat-command-policy.ts +16 -3
  349. package/src/sdk/bus/chat-daemon-control.ts +2 -2
  350. package/src/sdk/bus/index.ts +460 -35
  351. package/src/sdk/bus/reconciliation-store.ts +201 -8
  352. package/src/sdk/bus/session-control.ts +2 -0
  353. package/src/sdk/bus/slack-daemon.ts +105 -9
  354. package/src/sdk/bus/telegram-daemon-contract.ts +9 -1
  355. package/src/sdk/bus/telegram-daemon.ts +10 -2
  356. package/src/sdk/bus/threaded-render.ts +20 -1
  357. package/src/sdk/cli/session-cli.ts +23 -6
  358. package/src/sdk/host/control/dispatch.ts +13 -1
  359. package/src/sdk/host/control/operations.ts +10 -1
  360. package/src/sdk/host/events.ts +67 -4
  361. package/src/sdk/host/host.ts +8 -2
  362. package/src/sdk/host/prompt-image-upload.ts +438 -0
  363. package/src/sdk/host/sdk-surface-parity.test.ts +15 -0
  364. package/src/sdk/host/session-runtime.test.ts +1737 -129
  365. package/src/sdk/host/session-runtime.ts +684 -83
  366. package/src/sdk/host/surface-policy.ts +4 -0
  367. package/src/sdk/host/websocket-transport.lifecycle.test.ts +90 -2
  368. package/src/sdk/host/websocket-transport.ts +19 -7
  369. package/src/sdk/lifecycle/service.ts +15 -1
  370. package/src/sdk/prompt-deadline-flush.ts +78 -5
  371. package/src/sdk/prompt-deadline-manager.ts +68 -14
  372. package/src/sdk/prompt-status.ts +6 -4
  373. package/src/sdk/protocol/adapter-validation.ts +81 -12
  374. package/src/sdk/protocol/operation-inventory.generated.json +261 -2
  375. package/src/sdk/protocol/operation-registry.ts +33 -3
  376. package/src/sdk/reconciliation-extensions.ts +1 -0
  377. package/src/sdk/session-list.ts +1 -0
  378. package/src/sdk/session.ts +237 -97
  379. package/src/session/agent-session.ts +2726 -479
  380. package/src/session/history-storage.ts +182 -12
  381. package/src/session/internal/managed-session-scope.ts +173 -57
  382. package/src/session/internal/managed-session-storage.ts +85 -12
  383. package/src/session/internal/native-publish-outcome.ts +5 -1
  384. package/src/session/messages.ts +47 -6
  385. package/src/session/session-manager.ts +326 -19
  386. package/src/session/startup-auth-config.ts +116 -8
  387. package/src/session/streaming-output.ts +262 -4
  388. package/src/session/terminal-abort.ts +14 -2
  389. package/src/session-import/redact.ts +53 -2
  390. package/src/session-import/service.ts +1 -0
  391. package/src/skill-state/workflow-mutation-guard.ts +2145 -206
  392. package/src/slash-commands/builtin-registry.ts +21 -6
  393. package/src/slash-commands/helpers/credential-switch.ts +10 -5
  394. package/src/slash-commands/helpers/mcp.ts +11 -3
  395. package/src/slash-commands/helpers/provider-auth-status.ts +456 -0
  396. package/src/ssh/ssh-executor.ts +9 -2
  397. package/src/stt/recorder.ts +26 -9
  398. package/src/system-prompt.ts +61 -16
  399. package/src/task/executor.ts +115 -20
  400. package/src/task/index.ts +389 -175
  401. package/src/task/role-body.ts +84 -0
  402. package/src/task/token-log-mode.test.ts +162 -0
  403. package/src/task/token-log.ts +91 -2
  404. package/src/tools/archive-reader.ts +650 -37
  405. package/src/tools/ask.ts +1 -0
  406. package/src/tools/ast-edit-write-path.ts +64 -0
  407. package/src/tools/ast-edit.ts +18 -1
  408. package/src/tools/ast-grep.ts +7 -2
  409. package/src/tools/atomic-file-write.ts +46 -15
  410. package/src/tools/auto-generated-guard.ts +15 -3
  411. package/src/tools/awaiting-input.ts +114 -0
  412. package/src/tools/bash-allowed-prefixes.ts +214 -6
  413. package/src/tools/bash-interactive.ts +14 -2
  414. package/src/tools/bash-skill-urls.ts +58 -5
  415. package/src/tools/bash.ts +113 -26
  416. package/src/tools/browser/tab-worker.ts +39 -13
  417. package/src/tools/browser.ts +17 -7
  418. package/src/tools/cron.ts +10 -1
  419. package/src/tools/debug.ts +16 -8
  420. package/src/tools/descriptors.test.ts +44 -0
  421. package/src/tools/descriptors.ts +50 -6
  422. package/src/tools/eval.ts +15 -0
  423. package/src/tools/fetch.ts +93 -4
  424. package/src/tools/gh.ts +27 -12
  425. package/src/tools/image-gen.ts +20 -6
  426. package/src/tools/index.ts +2 -0
  427. package/src/tools/irc.ts +5 -3
  428. package/src/tools/monitor.ts +9 -1
  429. package/src/tools/output-meta.ts +74 -5
  430. package/src/tools/python.ts +1 -1
  431. package/src/tools/read.ts +26 -37
  432. package/src/tools/recipe/runner.ts +23 -12
  433. package/src/tools/render-utils.ts +2 -2
  434. package/src/tools/report-issue.ts +184 -0
  435. package/src/tools/search.ts +3 -2
  436. package/src/tools/ssh.ts +274 -8
  437. package/src/tools/subagent-render.ts +114 -12
  438. package/src/tools/subagent.ts +118 -5
  439. package/src/tools/tmux-self-injection-guard.ts +3301 -122
  440. package/src/tools/todo-write.ts +41 -3
  441. package/src/tools/tool-catalog.generated.ts +32 -4
  442. package/src/tools/ultragoal-ask-guard.ts +13 -1
  443. package/src/tools/write.ts +42 -3
  444. package/src/tui/tree-list.ts +15 -1
  445. package/src/utils/commit-message-generator.ts +12 -4
  446. package/src/utils/external-editor.ts +21 -7
  447. package/src/utils/file-mentions.ts +75 -7
  448. package/src/utils/git.ts +38 -7
  449. package/src/utils/image-limits.ts +8 -0
  450. package/src/utils/image-loading.ts +1 -1
  451. package/src/utils/open.ts +73 -4
  452. package/src/utils/pasted-image-loading.ts +9 -8
  453. package/src/utils/prompt-suggestion.ts +5 -4
  454. package/src/utils/shell-snapshot.ts +9 -1
  455. package/src/utils/title-generator.ts +72 -22
  456. package/src/web/scrapers/index.ts +3 -1
  457. package/src/web/scrapers/types.ts +8 -0
  458. package/src/web/scrapers/youtube.ts +3 -2
  459. package/src/web/search/index.ts +2 -1
  460. package/src/web/search/providers/codex.ts +29 -32
  461. package/src/web/search/providers/insane.ts +91 -28
  462. package/src/web/search/providers/searxng.ts +62 -10
@@ -8,8 +8,9 @@
8
8
  * producer is available (resumed-from-disk or backward-compat records).
9
9
  */
10
10
  import type { Component } from "@gajae-code/tui";
11
- import { Text } from "@gajae-code/tui";
11
+ import { getKeybindings, Text } from "@gajae-code/tui";
12
12
  import { formatNumber } from "@gajae-code/utils";
13
+ import { isSettingsInitialized, settings } from "../config/settings";
13
14
  import type { RenderResultOptions } from "../extensibility/custom-tools/types";
14
15
  import type { Theme } from "../modes/theme/theme";
15
16
  import { providerRetryPhaseLabel } from "../task/provider-retry-status";
@@ -18,21 +19,26 @@ import {
18
19
  formatDuration,
19
20
  formatStatusIcon,
20
21
  getPreviewLines,
22
+ pluralize,
21
23
  replaceTabs,
22
24
  type ToolUIStatus,
23
25
  truncateToWidth,
26
+ wrapTextWithAnsi,
24
27
  } from "./render-utils";
25
28
  import {
26
29
  SUBAGENT_ACTIVITY_BUCKET_MS,
30
+ SUBAGENT_COMPACT_IDLE_MS,
27
31
  type SubagentLiveProgress,
28
32
  type SubagentSnapshot,
29
33
  type SubagentToolDetails,
30
34
  subagentAwaitRenderedStateSignature,
35
+ summarizeSubagentGroup,
31
36
  } from "./subagent";
32
37
 
33
38
  export { subagentAwaitRenderedStateSignature } from "./subagent";
34
39
 
35
40
  const PREVIEW_LINES_COLLAPSED = 1;
41
+ const GUIDANCE_MAX_LINES = 12;
36
42
  const PREVIEW_LINES_EXPANDED = 4;
37
43
  const PREVIEW_LINE_WIDTH = 80;
38
44
 
@@ -114,10 +120,90 @@ function collectProviderDegradationGroups(
114
120
  .sort((a, b) => b.count - a.count || a.provider.localeCompare(b.provider));
115
121
  }
116
122
 
123
+ function compactSubagentPanelEnabled(): boolean {
124
+ return isSettingsInitialized() && settings.get("task.compactSubagentPanel") === true;
125
+ }
126
+
127
+ // One summary line for the whole group. Counts only, so the line stays O(1) in the
128
+ // number of subagents; each subagent is still one expand toggle away.
129
+ function renderCompactSubagentSummary(subagents: readonly SubagentSnapshot[], theme: Theme): string {
130
+ const summary = summarizeSubagentGroup(subagents, Date.now());
131
+ const parts: string[] = [];
132
+ if (summary.running > 0) parts.push(`${summary.running} ${pluralize("subagent", summary.running)} running`);
133
+ // Attention-worthy counts come first so a narrow terminal truncates the rest.
134
+ if (summary.failed > 0) parts.push(`${summary.failed} failed`);
135
+ if (summary.retrying > 0) parts.push(`${summary.retrying} retrying`);
136
+ if (summary.idle > 0) parts.push(`${summary.idle} idle >${SUBAGENT_COMPACT_IDLE_MS / 1000}s`);
137
+ if (summary.queued > 0) parts.push(`${summary.queued} queued`);
138
+ if (summary.paused > 0) parts.push(`${summary.paused} paused`);
139
+ if (summary.completed > 0) parts.push(`${summary.completed} done`);
140
+ if (summary.cancelled > 0) parts.push(`${summary.cancelled} cancelled`);
141
+ return ` ${theme.fg("dim", parts.join(" · "))}`;
142
+ }
143
+
144
+ // At most one warning row in compact mode, however many providers degrade, so the
145
+ // collapsed height stays independent of the subagent count. The expanded view keeps
146
+ // one row per provider.
147
+ function renderCompactDegradationLine(
148
+ groups: ReadonlyArray<{ provider: string; count: number }>,
149
+ theme: Theme,
150
+ ): string | undefined {
151
+ const [worst] = groups;
152
+ if (!worst) return undefined;
153
+ const more = groups.length > 1 ? ` (+${groups.length - 1} more ${pluralize("provider", groups.length - 1)})` : "";
154
+ return ` ${theme.fg("warning", `provider degraded: ${worst.count} subagents retrying on ${worst.provider}${more}`)}`;
155
+ }
156
+
157
+ // The expand hint gets its own line so a long summary never truncates it away.
158
+ function renderCompactSubagentHint(running: boolean, theme: Theme): string {
159
+ const expandKey = getKeybindings().getKeys("app.tools.expand")[0];
160
+ const hints = [expandKey ? `${expandKey} to list each` : "expand tool output to list each"];
161
+ if (running) hints.push("ctrl+s to observe sessions");
162
+ return ` ${theme.fg("dim", `(${hints.join(" · ")})`)}`;
163
+ }
164
+
117
165
  function boundSubagentBodyLines(lines: string[], width: number): string[] {
118
166
  return lines.map(line => (line.length > 0 ? truncateToWidth(replaceTabs(line), width, Ellipsis.Omit) : ""));
119
167
  }
120
168
 
169
+ // Guidance is an instruction the caller must act on (e.g. "inspect before
170
+ // cancelling" after an await timeout), so it wraps to the terminal width instead
171
+ // of being cut to one preview line.
172
+ function renderSubagentGuidanceLines(snapshot: SubagentSnapshot, width: number, theme: Theme): string[] {
173
+ const guidance = snapshot.guidance?.trim();
174
+ if (!guidance) return [];
175
+ const indent = " ";
176
+ const wrapWidth = Math.max(1, width - indent.length);
177
+ const wrapped = guidance.split("\n").flatMap(segment => wrapTextWithAnsi(replaceTabs(segment), wrapWidth));
178
+ // Still bounded: producer guidance is a short fixed sentence, so the cap only
179
+ // bites on pathologically narrow terminals.
180
+ if (wrapped.length > GUIDANCE_MAX_LINES) {
181
+ wrapped.length = GUIDANCE_MAX_LINES;
182
+ wrapped[GUIDANCE_MAX_LINES - 1] = truncateToWidth(
183
+ `${wrapped[GUIDANCE_MAX_LINES - 1]!}…`,
184
+ wrapWidth,
185
+ Ellipsis.Unicode,
186
+ );
187
+ }
188
+ return wrapped.map(line => `${indent}${theme.fg("dim", line)}`);
189
+ }
190
+
191
+ function renderBoundSubagentBody(
192
+ snapshot: SubagentSnapshot,
193
+ expanded: boolean,
194
+ width: number,
195
+ theme: Theme,
196
+ staticTime: boolean,
197
+ ): string[] {
198
+ return boundSubagentBodyLines(
199
+ [
200
+ ...renderSubagentSnapshotBody(snapshot, expanded, theme, staticTime),
201
+ ...renderSubagentGuidanceLines(snapshot, width, theme),
202
+ ],
203
+ width,
204
+ );
205
+ }
206
+
121
207
  function renderCachedSubagentBody(
122
208
  snapshot: SubagentSnapshot,
123
209
  signature: string,
@@ -133,7 +219,7 @@ function renderCachedSubagentBody(
133
219
  subagentBodyCache.set(key, hit);
134
220
  return hit;
135
221
  }
136
- const lines = boundSubagentBodyLines(renderSubagentSnapshotBody(snapshot, expanded, theme), width);
222
+ const lines = renderBoundSubagentBody(snapshot, expanded, width, theme, true);
137
223
  subagentBodyRenderCount += 1;
138
224
  subagentBodyCache.set(key, lines);
139
225
  if (subagentBodyCache.size > SUBAGENT_BODY_CACHE_MAX) {
@@ -150,7 +236,7 @@ function renderDynamicSubagentBody(
150
236
  theme: Theme,
151
237
  ): string[] {
152
238
  subagentBodyRenderCount += 1;
153
- return boundSubagentBodyLines(renderSubagentSnapshotBody(snapshot, expanded, theme, false), width);
239
+ return renderBoundSubagentBody(snapshot, expanded, width, theme, false);
154
240
  }
155
241
 
156
242
  function statusIconKind(status: SubagentSnapshot["status"]): ToolUIStatus {
@@ -363,11 +449,7 @@ function renderSubagentSnapshotBody(
363
449
  }
364
450
  }
365
451
 
366
- if (snapshot.guidance) {
367
- for (const line of getPreviewLines(snapshot.guidance, 1, PREVIEW_LINE_WIDTH, Ellipsis.Unicode)) {
368
- lines.push(` ${theme.fg("dim", replaceTabs(line))}`);
369
- }
370
- }
452
+ // `snapshot.guidance` is appended by renderBoundSubagentBody, wrapped to width.
371
453
 
372
454
  return lines;
373
455
  }
@@ -421,6 +503,29 @@ export const subagentToolRenderer = {
421
503
  theme,
422
504
  );
423
505
  const out: string[] = [truncateToWidth(replaceTabs(header), width, Ellipsis.Omit)];
506
+ const liveProgress = subagents.flatMap(snapshot =>
507
+ snapshot.progress && snapshot.liveProgressAvailable !== false ? [snapshot.progress] : [],
508
+ );
509
+ const degradationGroups = collectProviderDegradationGroups(liveProgress);
510
+ // Compact applies only to live await progress. Final results (timeout
511
+ // guidance, failure and completion receipts, status/steer replies) keep
512
+ // the full per-subagent rendering.
513
+ if (!expanded && options.isPartial && compactSubagentPanelEnabled()) {
514
+ out.push(
515
+ truncateToWidth(replaceTabs(renderCompactSubagentSummary(subagents, theme)), width, Ellipsis.Unicode),
516
+ );
517
+ const compactDegradation = renderCompactDegradationLine(degradationGroups, theme);
518
+ if (compactDegradation)
519
+ out.push(truncateToWidth(replaceTabs(compactDegradation), width, Ellipsis.Unicode));
520
+ out.push(
521
+ truncateToWidth(
522
+ replaceTabs(renderCompactSubagentHint(runningCount > 0, theme)),
523
+ width,
524
+ Ellipsis.Unicode,
525
+ ),
526
+ );
527
+ return out;
528
+ }
424
529
  // Discoverability: the inline panel is a bounded preview; the session
425
530
  // observer (ctrl+s) streams the full per-subagent message history.
426
531
  if (runningCount > 0) {
@@ -432,10 +537,7 @@ export const subagentToolRenderer = {
432
537
  ),
433
538
  );
434
539
  }
435
- const liveProgress = subagents.flatMap(snapshot =>
436
- snapshot.progress && snapshot.liveProgressAvailable !== false ? [snapshot.progress] : [],
437
- );
438
- for (const group of collectProviderDegradationGroups(liveProgress)) {
540
+ for (const group of degradationGroups) {
439
541
  out.push(
440
542
  truncateToWidth(
441
543
  replaceTabs(
@@ -6,6 +6,7 @@ import { type AsyncJob, AsyncJobManager, jobElapsedMs, type SubagentRecord } fro
6
6
  import subagentDescription from "../prompts/tools/subagent.md" with { type: "text" };
7
7
  import type { AgentProgress, AgentSource, LocalErrorSummary } from "../task/types";
8
8
  import { Ellipsis, truncateToWidth } from "../tui";
9
+ import { wrapUntrustedContent } from "./fetch";
9
10
  import type { ToolSession } from "./index";
10
11
  import { replaceTabs } from "./render-utils";
11
12
  import { ToolError } from "./tool-errors";
@@ -540,8 +541,11 @@ export class SubagentTool implements AgentTool<typeof subagentSchema, SubagentTo
540
541
  if (!onUpdate || streamingDisabled) return;
541
542
  try {
542
543
  const result = this.#progressResult(manager, records, true);
543
- const signature = subagentAwaitRenderedStateSignature(result.details?.subagents ?? []);
544
544
  const t = nowMs();
545
+ const snapshots = result.details?.subagents ?? [];
546
+ const signature = this.session.settings.get("task.compactSubagentPanel")
547
+ ? subagentCompactRenderedStateSignature(snapshots, Date.now())
548
+ : subagentAwaitRenderedStateSignature(snapshots);
545
549
  const livenessDue = force || t - lastEmitMs >= livenessIntervalMs;
546
550
  if (!livenessDue && signature === lastEmittedSignature) return;
547
551
  lastEmittedSignature = signature;
@@ -796,7 +800,11 @@ export class SubagentTool implements AgentTool<typeof subagentSchema, SubagentTo
796
800
  }
797
801
  if (snapshot.description) lines.push(`Description: ${snapshot.description}`);
798
802
  if (snapshot.outputRef) lines.push(`Output: ${snapshot.outputRef}`);
799
- if (snapshot.setupFailureSummary) lines.push(`Setup failure: ${snapshot.setupFailureSummary}`);
803
+ // A markdown fence is not a boundary: subagent text can contain ``` and
804
+ // close it, leaving the rest as raw tool-result text. Frame the data.
805
+ if (snapshot.setupFailureSummary) {
806
+ lines.push(wrapUntrustedContent(`Setup failure: ${snapshot.setupFailureSummary}`));
807
+ }
800
808
  if (snapshot.localErrorSummary) {
801
809
  const local = snapshot.localErrorSummary;
802
810
  lines.push(`Local failure (${local.kind}): ${local.summary}`);
@@ -813,13 +821,14 @@ export class SubagentTool implements AgentTool<typeof subagentSchema, SubagentTo
813
821
  );
814
822
  }
815
823
  }
816
- if (snapshot.assignment) lines.push("Assignment:", "```", snapshot.assignment, "```");
824
+ if (snapshot.assignment) lines.push(wrapUntrustedContent(`Assignment:\n${snapshot.assignment}`));
817
825
  if (snapshot.steerMessage) {
818
- lines.push(`Steer (${snapshot.steerState ?? "queued"}):`, "```", snapshot.steerMessage, "```");
826
+ lines.push(wrapUntrustedContent(`Steer (${snapshot.steerState ?? "queued"}):\n${snapshot.steerMessage}`));
819
827
  lines.push(STEER_QUEUED_GUIDANCE);
820
828
  }
821
829
  if (snapshot.resultPreview) {
822
- lines.push(snapshot.errorText ? "Error preview:" : "Result preview:", "```", snapshot.resultPreview, "```");
830
+ const previewLabel = snapshot.errorText ? "Error preview:" : "Result preview:";
831
+ lines.push(wrapUntrustedContent(`${previewLabel}\n${snapshot.resultPreview}`));
823
832
  if (snapshot.truncated)
824
833
  lines.push("Preview truncated; use the output ref or explicit ids with `verbosity=full` for more.");
825
834
  }
@@ -1136,6 +1145,110 @@ export function subagentAwaitRenderedStateSignature(
1136
1145
  });
1137
1146
  }
1138
1147
 
1148
+ /** A running subagent with no activity for longer than this counts as idle in the compact panel. */
1149
+ export const SUBAGENT_COMPACT_IDLE_MS = 30_000;
1150
+
1151
+ /** Group counts behind the compact await panel's single summary line. */
1152
+ export interface SubagentGroupSummary {
1153
+ running: number;
1154
+ idle: number;
1155
+ retrying: number;
1156
+ queued: number;
1157
+ paused: number;
1158
+ completed: number;
1159
+ failed: number;
1160
+ cancelled: number;
1161
+ /** Running subagents in provider retry, per provider; drives the degradation warning. */
1162
+ retryingByProvider: Record<string, number>;
1163
+ }
1164
+
1165
+ export function summarizeSubagentGroup(subagents: readonly SubagentSnapshot[], nowMs: number): SubagentGroupSummary {
1166
+ const summary: SubagentGroupSummary = {
1167
+ running: 0,
1168
+ idle: 0,
1169
+ retrying: 0,
1170
+ queued: 0,
1171
+ paused: 0,
1172
+ completed: 0,
1173
+ failed: 0,
1174
+ cancelled: 0,
1175
+ retryingByProvider: {},
1176
+ };
1177
+ for (const snapshot of subagents) {
1178
+ switch (snapshot.status) {
1179
+ case "running": {
1180
+ summary.running += 1;
1181
+ const live = snapshot.liveProgressAvailable !== false ? snapshot.progress : undefined;
1182
+ if (live?.status === "running" && live.retryState) {
1183
+ summary.retrying += 1;
1184
+ const provider = live.retryState.provider ?? "provider";
1185
+ summary.retryingByProvider[provider] = (summary.retryingByProvider[provider] ?? 0) + 1;
1186
+ }
1187
+ // Before its first activity a subagent has no timestamp; its elapsed job time
1188
+ // is then the age, so one stalled from the start still turns idle.
1189
+ const quietMs = live?.lastActivityMs !== undefined ? nowMs - live.lastActivityMs : snapshot.durationMs;
1190
+ if (quietMs > SUBAGENT_COMPACT_IDLE_MS) summary.idle += 1;
1191
+ break;
1192
+ }
1193
+ case "queued":
1194
+ summary.queued += 1;
1195
+ break;
1196
+ case "paused":
1197
+ summary.paused += 1;
1198
+ break;
1199
+ case "completed":
1200
+ case "already_completed":
1201
+ summary.completed += 1;
1202
+ break;
1203
+ case "failed":
1204
+ case "not_found":
1205
+ summary.failed += 1;
1206
+ break;
1207
+ case "cancelled":
1208
+ summary.cancelled += 1;
1209
+ break;
1210
+ }
1211
+ }
1212
+ return summary;
1213
+ }
1214
+
1215
+ /**
1216
+ * The compact degradation row shows only the most-degraded provider, its count, and
1217
+ * how many other providers degrade (providers with a single retrying subagent are
1218
+ * not a degradation). Signing exactly that keeps invisible per-provider churn from
1219
+ * re-emitting.
1220
+ */
1221
+ function compactDegradationSignature(
1222
+ retryingByProvider: Record<string, number>,
1223
+ ): { provider: string; count: number; moreProviders: number } | null {
1224
+ const groups = Object.entries(retryingByProvider)
1225
+ .filter(([, count]) => count > 1)
1226
+ .sort(([a, countA], [b, countB]) => countB - countA || a.localeCompare(b));
1227
+ const [worst] = groups;
1228
+ return worst ? { provider: worst[0], count: worst[1], moreProviders: groups.length - 1 } : null;
1229
+ }
1230
+
1231
+ /**
1232
+ * Rendered-state signature for the compact await panel. It covers only what the
1233
+ * compact view shows (group counts and the single degradation row), so per-subagent activity that does not move
1234
+ * a count no longer re-emits: the update rate is bounded by count transitions and
1235
+ * the liveness interval instead of growing with the number of live subagents.
1236
+ */
1237
+ export function subagentCompactRenderedStateSignature(
1238
+ subagents: readonly SubagentSnapshot[],
1239
+ nowMs: number,
1240
+ receipt?: Pick<SubagentToolDetails, "awaitOutcome" | "interrupted">,
1241
+ ): string {
1242
+ return JSON.stringify({
1243
+ awaitOutcome: receipt?.awaitOutcome ?? null,
1244
+ interrupted: receipt?.interrupted === true,
1245
+ summary: (({ retryingByProvider, ...counts }) => ({
1246
+ ...counts,
1247
+ degradation: compactDegradationSignature(retryingByProvider),
1248
+ }))(summarizeSubagentGroup(subagents, nowMs)),
1249
+ });
1250
+ }
1251
+
1139
1252
  function canonicalizeSnapshotForSignature(snapshot: SubagentSnapshot): unknown {
1140
1253
  return {
1141
1254
  id: snapshot.id,