mixdog 0.9.3 → 0.9.5

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 (382) hide show
  1. package/README.md +112 -38
  2. package/package.json +10 -3
  3. package/scripts/bench/lead-review-tasks-r3.json +20 -0
  4. package/scripts/bench/lead-review-tasks.json +20 -0
  5. package/scripts/bench/r4-mixed-tasks.json +20 -0
  6. package/scripts/bench/r5-orchestrated-task.json +7 -0
  7. package/scripts/bench/review-tasks.json +20 -0
  8. package/scripts/bench/round-codex.json +114 -0
  9. package/scripts/bench/round-mixdog-lead-r3.json +269 -0
  10. package/scripts/bench/round-mixdog-lead.json +269 -0
  11. package/scripts/bench/round-mixdog.json +126 -0
  12. package/scripts/bench/round-r10-bigsample.json +679 -0
  13. package/scripts/bench/round-r11-codexalign.json +257 -0
  14. package/scripts/bench/round-r13-clientmeta.json +464 -0
  15. package/scripts/bench/round-r14-betafeatures.json +466 -0
  16. package/scripts/bench/round-r15-fulldefault.json +462 -0
  17. package/scripts/bench/round-r16-sessionid.json +466 -0
  18. package/scripts/bench/round-r17-wirebytes.json +456 -0
  19. package/scripts/bench/round-r18-prewarm.json +468 -0
  20. package/scripts/bench/round-r19-clean.json +472 -0
  21. package/scripts/bench/round-r20-prewarm-clean.json +475 -0
  22. package/scripts/bench/round-r21-delta-retry.json +473 -0
  23. package/scripts/bench/round-r22-full-probe.json +693 -0
  24. package/scripts/bench/round-r23-itemprobe.json +701 -0
  25. package/scripts/bench/round-r24-shapefix.json +677 -0
  26. package/scripts/bench/round-r25-serial.json +464 -0
  27. package/scripts/bench/round-r26-parallel3.json +671 -0
  28. package/scripts/bench/round-r27-parallel10.json +894 -0
  29. package/scripts/bench/round-r28-parallel10-stagger.json +882 -0
  30. package/scripts/bench/round-r29-parallel10-stagger166.json +886 -0
  31. package/scripts/bench/round-r30-instid.json +253 -0
  32. package/scripts/bench/round-r31-upgradeprobe.json +256 -0
  33. package/scripts/bench/round-r32-vs-codex-lead.json +254 -0
  34. package/scripts/bench/round-r33-vs-codex-codex.json +115 -0
  35. package/scripts/bench/round-r34-orchestrated.json +120 -0
  36. package/scripts/bench/round-r35-orchestrated-codex.json +61 -0
  37. package/scripts/bench/round-r36-orchestrated-capped.json +128 -0
  38. package/scripts/bench/round-r4-codex.json +114 -0
  39. package/scripts/bench/round-r4-mixed.json +225 -0
  40. package/scripts/bench/round-r5-gpt-lead.json +259 -0
  41. package/scripts/bench/round-r6-codex.json +114 -0
  42. package/scripts/bench/round-r6-solo.json +257 -0
  43. package/scripts/bench/round-r7-full.json +254 -0
  44. package/scripts/bench/round-r8-fulldefault.json +255 -0
  45. package/scripts/bench-run.mjs +251 -32
  46. package/scripts/freevar-smoke.mjs +95 -0
  47. package/scripts/internal-comms-bench.mjs +3 -4
  48. package/scripts/internal-comms-smoke.mjs +10 -9
  49. package/scripts/model-catalog-audit.mjs +209 -0
  50. package/scripts/model-list-sanitize-test.mjs +37 -0
  51. package/scripts/mouse-probe.mjs +45 -0
  52. package/scripts/output-style-bench.mjs +13 -6
  53. package/scripts/output-style-smoke.mjs +4 -4
  54. package/scripts/provider-toolcall-test.mjs +7 -3
  55. package/scripts/recall-bench.mjs +76 -13
  56. package/scripts/recall-quality-cases.json +12 -0
  57. package/scripts/recall-usecase-cases.json +18 -0
  58. package/scripts/session-bench.mjs +152 -6
  59. package/scripts/tool-smoke.mjs +25 -65
  60. package/scripts/tui-render-smoke.mjs +90 -0
  61. package/scripts/webhook-smoke.mjs +208 -0
  62. package/src/agents/debugger/AGENT.md +4 -1
  63. package/src/agents/heavy-worker/AGENT.md +9 -8
  64. package/src/agents/maintainer/AGENT.md +4 -0
  65. package/src/agents/reviewer/AGENT.md +2 -1
  66. package/src/agents/scheduler-task/AGENT.md +2 -3
  67. package/src/agents/webhook-handler/AGENT.md +2 -3
  68. package/src/agents/worker/AGENT.md +10 -7
  69. package/src/app.mjs +12 -1
  70. package/src/headless-role.mjs +7 -1
  71. package/src/lib/rules-builder.cjs +4 -0
  72. package/src/mixdog-session-runtime.mjs +647 -2056
  73. package/src/output-styles/default.md +30 -9
  74. package/src/output-styles/{oneline.md → extreme-minimal.md} +5 -4
  75. package/src/output-styles/minimal.md +8 -6
  76. package/src/output-styles/simple.md +21 -7
  77. package/src/rules/agent/00-common.md +6 -3
  78. package/src/rules/agent/30-explorer.md +16 -5
  79. package/src/rules/lead/01-general.md +5 -5
  80. package/src/rules/lead/lead-brief.md +15 -0
  81. package/src/rules/lead/lead-tool.md +6 -15
  82. package/src/rules/shared/01-tool.md +17 -21
  83. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +8 -3
  84. package/src/runtime/agent/orchestrator/agent-runtime/agent-loop-policy.mjs +25 -0
  85. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +100 -23
  86. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +6 -15
  87. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +362 -0
  88. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +410 -0
  89. package/src/runtime/agent/orchestrator/agent-trace.mjs +16 -735
  90. package/src/runtime/agent/orchestrator/config.mjs +69 -2
  91. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +62 -20
  92. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +209 -0
  93. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +489 -0
  94. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +81 -1281
  95. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +607 -0
  96. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +32 -3
  97. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +81 -0
  98. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +248 -0
  99. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +303 -0
  100. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +505 -0
  101. package/src/runtime/agent/orchestrator/providers/gemini.mjs +43 -1013
  102. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +17 -3
  103. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +105 -11
  104. package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +356 -0
  105. package/src/runtime/agent/orchestrator/providers/openai-codex-model.mjs +108 -0
  106. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +58 -0
  107. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +368 -0
  108. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +760 -0
  109. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +40 -1143
  110. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +740 -0
  111. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +193 -0
  112. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +349 -2131
  113. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +143 -1002
  114. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +229 -0
  115. package/src/runtime/agent/orchestrator/providers/openai-ws-events.mjs +67 -0
  116. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +465 -0
  117. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +1105 -0
  118. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +2 -1
  119. package/src/runtime/agent/orchestrator/providers/provider-catalog-cache.mjs +80 -0
  120. package/src/runtime/agent/orchestrator/session/compact/budget.mjs +288 -0
  121. package/src/runtime/agent/orchestrator/session/compact/constants.mjs +85 -0
  122. package/src/runtime/agent/orchestrator/session/compact/engine.mjs +749 -0
  123. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +82 -0
  124. package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +315 -0
  125. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +643 -0
  126. package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +326 -0
  127. package/src/runtime/agent/orchestrator/session/compact.mjs +40 -2282
  128. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +14 -2
  129. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +61 -0
  130. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -3
  131. package/src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs +275 -0
  132. package/src/runtime/agent/orchestrator/session/loop/steering-ladder.mjs +173 -0
  133. package/src/runtime/agent/orchestrator/session/loop/termination.mjs +58 -0
  134. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +239 -0
  135. package/src/runtime/agent/orchestrator/session/loop.mjs +278 -402
  136. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +471 -0
  137. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +7 -4
  138. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +12 -0
  139. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +406 -0
  140. package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +80 -0
  141. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +210 -0
  142. package/src/runtime/agent/orchestrator/session/manager.mjs +166 -1087
  143. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +189 -0
  144. package/src/runtime/agent/orchestrator/session/store.mjs +74 -179
  145. package/src/runtime/agent/orchestrator/stall-policy.mjs +20 -1
  146. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +70 -20
  147. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +22 -2
  148. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +35 -44
  149. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +40 -0
  150. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +29 -0
  151. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +8 -0
  152. package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +126 -0
  153. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +81 -92
  154. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-paths.mjs +161 -0
  155. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-process.mjs +108 -0
  156. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +28 -265
  157. package/src/runtime/agent/orchestrator/tools/builtin.mjs +0 -6
  158. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +57 -3
  159. package/src/runtime/agent/orchestrator/tools/code-graph/keyword-match.mjs +82 -0
  160. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +10 -122
  161. package/src/runtime/agent/orchestrator/tools/code-graph/text-columns.mjs +45 -0
  162. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +6 -6
  163. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +6 -3
  164. package/src/runtime/agent/orchestrator/tools/patch/constants.mjs +9 -0
  165. package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +171 -0
  166. package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +471 -0
  167. package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +436 -0
  168. package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +342 -0
  169. package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +359 -0
  170. package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +340 -0
  171. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +643 -0
  172. package/src/runtime/agent/orchestrator/tools/patch.mjs +36 -2959
  173. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +0 -21
  174. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +9 -72
  175. package/src/runtime/agent/orchestrator/tools/shell-powershell.mjs +77 -0
  176. package/src/runtime/agent/orchestrator/tools/shell-state.mjs +154 -0
  177. package/src/runtime/channels/backends/discord-access.mjs +32 -0
  178. package/src/runtime/channels/backends/discord-attachments.mjs +65 -0
  179. package/src/runtime/channels/backends/discord-gateway.mjs +233 -0
  180. package/src/runtime/channels/backends/discord.mjs +27 -318
  181. package/src/runtime/channels/backends/telegram.mjs +8 -12
  182. package/src/runtime/channels/index.mjs +247 -701
  183. package/src/runtime/channels/lib/backend-dispatch.mjs +46 -0
  184. package/src/runtime/channels/lib/config.mjs +37 -149
  185. package/src/runtime/channels/lib/event-pipeline.mjs +22 -5
  186. package/src/runtime/channels/lib/event-queue.mjs +78 -13
  187. package/src/runtime/channels/lib/inbound-routing.mjs +74 -0
  188. package/src/runtime/channels/lib/interaction-workflows.mjs +5 -113
  189. package/src/runtime/channels/lib/output-forwarder.mjs +1 -1
  190. package/src/runtime/channels/lib/owner-heartbeat.mjs +75 -0
  191. package/src/runtime/channels/lib/parent-bridge.mjs +88 -0
  192. package/src/runtime/channels/lib/runtime-paths.mjs +14 -4
  193. package/src/runtime/channels/lib/scheduler.mjs +27 -113
  194. package/src/runtime/channels/lib/session-discovery.mjs +56 -4
  195. package/src/runtime/channels/lib/tool-dispatch.mjs +158 -0
  196. package/src/runtime/channels/lib/tool-format.mjs +1 -1
  197. package/src/runtime/channels/lib/transcript-discovery.mjs +4 -4
  198. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +6 -3
  199. package/src/runtime/channels/lib/voice-transcription.mjs +179 -0
  200. package/src/runtime/channels/lib/webhook/deliveries.mjs +313 -0
  201. package/src/runtime/channels/lib/webhook/log.mjs +42 -0
  202. package/src/runtime/channels/lib/webhook/ngrok.mjs +181 -0
  203. package/src/runtime/channels/lib/webhook/signature.mjs +60 -0
  204. package/src/runtime/channels/lib/webhook.mjs +43 -616
  205. package/src/runtime/channels/tool-defs.mjs +11 -130
  206. package/src/runtime/memory/index.mjs +210 -1948
  207. package/src/runtime/memory/lib/core-memory-store.mjs +5 -1
  208. package/src/runtime/memory/lib/cycle-llm-adapters.mjs +58 -0
  209. package/src/runtime/memory/lib/cycle-scheduler.mjs +497 -0
  210. package/src/runtime/memory/lib/embedding-warmup.mjs +58 -0
  211. package/src/runtime/memory/lib/ko-morph.mjs +195 -0
  212. package/src/runtime/memory/lib/memory-config-flags.mjs +91 -0
  213. package/src/runtime/memory/lib/memory-cycle.mjs +1 -1
  214. package/src/runtime/memory/lib/memory-cycle2-gate.mjs +515 -0
  215. package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +324 -0
  216. package/src/runtime/memory/lib/memory-cycle2-shared.mjs +18 -0
  217. package/src/runtime/memory/lib/memory-cycle2.mjs +24 -842
  218. package/src/runtime/memory/lib/memory-embed.mjs +149 -0
  219. package/src/runtime/memory/lib/memory-process-lock.mjs +162 -0
  220. package/src/runtime/memory/lib/memory-recall-store.mjs +69 -12
  221. package/src/runtime/memory/lib/memory-text-utils.mjs +46 -0
  222. package/src/runtime/memory/lib/pg/supervisor.mjs +1 -1
  223. package/src/runtime/memory/lib/query-handlers.mjs +802 -0
  224. package/src/runtime/memory/lib/recall-format.mjs +55 -0
  225. package/src/runtime/memory/lib/runtime-fetcher.mjs +8 -3
  226. package/src/runtime/memory/lib/transcript-ingest.mjs +425 -0
  227. package/src/runtime/memory/tool-defs.mjs +5 -13
  228. package/src/runtime/search/lib/http-fetch.mjs +274 -0
  229. package/src/runtime/search/lib/ssrf-guard.mjs +333 -0
  230. package/src/runtime/search/lib/web-tools.mjs +24 -602
  231. package/src/runtime/shared/atomic-file.mjs +26 -1
  232. package/src/runtime/shared/config.mjs +14 -4
  233. package/src/runtime/shared/launcher-control.mjs +2 -2
  234. package/src/runtime/shared/markdown-frontmatter.mjs +19 -0
  235. package/src/runtime/shared/schedules-store.mjs +13 -3
  236. package/src/runtime/shared/tool-execution-contract.mjs +2 -2
  237. package/src/runtime/shared/tool-primitives.mjs +308 -0
  238. package/src/runtime/shared/tool-result-summary.mjs +515 -0
  239. package/src/runtime/shared/tool-surface.mjs +80 -898
  240. package/src/runtime/shared/transcript-writer.mjs +23 -0
  241. package/src/runtime/shared/update-checker.mjs +7 -4
  242. package/src/session-runtime/config-helpers.mjs +119 -2
  243. package/src/session-runtime/config-lifecycle.mjs +232 -0
  244. package/src/session-runtime/cwd-plugins.mjs +226 -0
  245. package/src/session-runtime/mcp-glue.mjs +177 -0
  246. package/src/session-runtime/model-recency.mjs +111 -0
  247. package/src/session-runtime/native-search.mjs +247 -0
  248. package/src/session-runtime/output-styles.mjs +11 -9
  249. package/src/session-runtime/prewarm.mjs +142 -0
  250. package/src/session-runtime/provider-models.mjs +278 -0
  251. package/src/session-runtime/provider-usage.mjs +120 -0
  252. package/src/session-runtime/quick-model-rows.mjs +205 -0
  253. package/src/session-runtime/quick-search-models.mjs +47 -0
  254. package/src/session-runtime/session-hooks.mjs +93 -0
  255. package/src/session-runtime/settings-api.mjs +352 -0
  256. package/src/session-runtime/tool-catalog.mjs +29 -29
  257. package/src/session-runtime/tool-defs.mjs +84 -0
  258. package/src/session-runtime/warmup-schedulers.mjs +201 -0
  259. package/src/session-runtime/workflow.mjs +1 -1
  260. package/src/standalone/agent-tool/helpers.mjs +237 -0
  261. package/src/standalone/agent-tool/notify.mjs +107 -0
  262. package/src/standalone/agent-tool/provider-init.mjs +143 -0
  263. package/src/standalone/agent-tool/render.mjs +152 -0
  264. package/src/standalone/agent-tool/tool-def.mjs +55 -0
  265. package/src/standalone/agent-tool.mjs +138 -669
  266. package/src/standalone/channel-admin.mjs +102 -90
  267. package/src/standalone/channel-worker.mjs +4 -7
  268. package/src/standalone/explore-tool.mjs +64 -14
  269. package/src/standalone/hook-bus/config.mjs +207 -0
  270. package/src/standalone/hook-bus/constants.mjs +90 -0
  271. package/src/standalone/hook-bus/handlers.mjs +481 -0
  272. package/src/standalone/hook-bus/payload.mjs +31 -0
  273. package/src/standalone/hook-bus/rules.mjs +77 -0
  274. package/src/standalone/hook-bus.mjs +77 -870
  275. package/src/standalone/memory-runtime-proxy.mjs +7 -0
  276. package/src/standalone/opencode-go-login.mjs +5 -1
  277. package/src/standalone/provider-admin.mjs +1 -16
  278. package/src/standalone/usage-dashboard.mjs +3 -1
  279. package/src/tui/App.jsx +1059 -8110
  280. package/src/tui/app/app-format.mjs +213 -0
  281. package/src/tui/app/channel-pickers.mjs +508 -0
  282. package/src/tui/app/clipboard.mjs +67 -0
  283. package/src/tui/app/core-memory-picker.mjs +210 -0
  284. package/src/tui/app/extension-pickers.mjs +506 -0
  285. package/src/tui/app/input-parsers.mjs +193 -0
  286. package/src/tui/app/maintenance-pickers.mjs +356 -0
  287. package/src/tui/app/model-options.mjs +334 -0
  288. package/src/tui/app/model-picker.mjs +365 -0
  289. package/src/tui/app/onboarding-steps.mjs +400 -0
  290. package/src/tui/app/project-picker.mjs +247 -0
  291. package/src/tui/app/provider-setup-picker.mjs +580 -0
  292. package/src/tui/app/resume-picker.mjs +55 -0
  293. package/src/tui/app/route-pickers.mjs +419 -0
  294. package/src/tui/app/settings-picker.mjs +489 -0
  295. package/src/tui/app/slash-commands.mjs +101 -0
  296. package/src/tui/app/slash-dispatch.mjs +427 -0
  297. package/src/tui/app/text-layout.mjs +46 -0
  298. package/src/tui/app/theme-effort-pickers.mjs +154 -0
  299. package/src/tui/app/transcript-window.mjs +677 -0
  300. package/src/tui/app/use-mouse-input.mjs +460 -0
  301. package/src/tui/app/use-prompt-handlers.mjs +310 -0
  302. package/src/tui/app/use-transcript-scroll.mjs +512 -0
  303. package/src/tui/app/use-transcript-window.mjs +607 -0
  304. package/src/tui/components/ConfirmBar.jsx +10 -7
  305. package/src/tui/components/Picker.jsx +64 -15
  306. package/src/tui/components/PromptInput.jsx +33 -102
  307. package/src/tui/components/SlashCommandPalette.jsx +8 -1
  308. package/src/tui/components/StatusLine.jsx +69 -15
  309. package/src/tui/components/TextEntryPanel.jsx +11 -0
  310. package/src/tui/components/ToolExecution.jsx +52 -594
  311. package/src/tui/components/TranscriptItem.jsx +105 -0
  312. package/src/tui/components/UsagePanel.jsx +18 -4
  313. package/src/tui/components/prompt-input/edit-helpers.mjs +72 -0
  314. package/src/tui/components/prompt-input/voice-indicator.mjs +39 -0
  315. package/src/tui/components/tool-execution/ResultBody.jsx +56 -0
  316. package/src/tui/components/tool-execution/surface-detail.mjs +405 -0
  317. package/src/tui/components/tool-execution/text-format.mjs +161 -0
  318. package/src/tui/display-width.mjs +20 -3
  319. package/src/tui/dist/index.mjs +13553 -12384
  320. package/src/tui/engine/agent-job-feed.mjs +133 -0
  321. package/src/tui/engine/notification-plan.mjs +76 -0
  322. package/src/tui/engine/render-timing.mjs +17 -0
  323. package/src/tui/engine/tool-approval.mjs +94 -0
  324. package/src/tui/engine/tool-card-results.mjs +234 -0
  325. package/src/tui/engine/tool-result-status.mjs +135 -0
  326. package/src/tui/engine.mjs +170 -574
  327. package/src/tui/figures.mjs +5 -0
  328. package/src/tui/index.jsx +65 -1
  329. package/src/tui/input-editing.mjs +2 -2
  330. package/src/tui/markdown/format-token.mjs +4 -1
  331. package/src/tui/statusline-ansi-bridge.mjs +11 -3
  332. package/src/tui/theme.mjs +6 -0
  333. package/src/ui/statusline-agents.mjs +213 -0
  334. package/src/ui/statusline-format.mjs +146 -0
  335. package/src/ui/statusline-segments.mjs +148 -0
  336. package/src/ui/statusline.mjs +77 -501
  337. package/src/ui/tool-card.mjs +0 -1
  338. package/src/vendor/statusline/bin/statusline-route.mjs +15 -2
  339. package/src/workflows/default/WORKFLOW.md +16 -18
  340. package/src/workflows/sequential/WORKFLOW.md +16 -18
  341. package/vendor/ink/build/display-width.js +19 -3
  342. package/vendor/ink/build/ink.js +112 -7
  343. package/vendor/ink/build/log-update.js +17 -3
  344. package/vendor/ink/build/wrap-text.js +125 -0
  345. package/scripts/_test-folder-dialog.mjs +0 -30
  346. package/scripts/fix-brief-fn.mjs +0 -35
  347. package/scripts/fix-format-tool-surface.mjs +0 -24
  348. package/scripts/fix-tool-exec-visible.mjs +0 -42
  349. package/scripts/patch-agent-brief.mjs +0 -48
  350. package/scripts/patch-app.mjs +0 -21
  351. package/scripts/patch-app2.mjs +0 -18
  352. package/scripts/patch-dist-brief.mjs +0 -96
  353. package/scripts/patch-tool-exec.mjs +0 -70
  354. package/src/examples/schedules/SCHEDULE.example.md +0 -32
  355. package/src/examples/webhooks/WEBHOOK.example.md +0 -40
  356. package/src/runtime/agent/orchestrator/session/manager.reactive-persist.test.mjs +0 -107
  357. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.test.mjs +0 -143
  358. package/src/runtime/agent/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -285
  359. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.test.mjs +0 -162
  360. package/src/runtime/agent/orchestrator/tools/builtin/open-config-tool.mjs +0 -26
  361. package/src/runtime/channels/lib/holidays.mjs +0 -138
  362. package/src/runtime/shared/channel-notification-routing.test.mjs +0 -45
  363. package/src/runtime/shared/task-notification-envelope.test.mjs +0 -107
  364. package/src/runtime/shared/tool-execution-contract.test.mjs +0 -183
  365. package/src/standalone/agent-task-status.test.mjs +0 -76
  366. package/src/tui/components/tool-output-format.test.mjs +0 -399
  367. package/src/tui/display-width.test.mjs +0 -35
  368. package/src/tui/engine-runtime-notification.test.mjs +0 -115
  369. package/src/tui/engine-tool-result-text.test.mjs +0 -75
  370. package/src/tui/input-editing.selection.test.mjs +0 -75
  371. package/src/tui/markdown/format-token.test.mjs +0 -354
  372. package/src/tui/markdown/render-ansi.test.mjs +0 -108
  373. package/src/tui/markdown/stream-fence.test.mjs +0 -26
  374. package/src/tui/markdown/streaming-markdown.test.mjs +0 -70
  375. package/src/tui/paste-fix.test.mjs +0 -119
  376. package/src/tui/prompt-history-store.test.mjs +0 -52
  377. package/src/tui/statusline-ansi-bridge.test.mjs +0 -159
  378. package/src/tui/transcript-tool-failures.test.mjs +0 -111
  379. package/src/ui/markdown.test.mjs +0 -70
  380. package/src/ui/statusline-context-label.test.mjs +0 -15
  381. package/src/vendor/statusline/bin/statusline-lib.mjs +0 -186
  382. package/src/vendor/statusline/bin/statusline-route.test.mjs +0 -80
@@ -1,107 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
- import {
4
- renderShellCompletionEnvelope,
5
- shellCompletionInstruction,
6
- renderShellPromptStallEnvelope,
7
- shellPromptStallInstruction,
8
- isInternalRuntimeNotificationText,
9
- isBracketedShellNotificationEnvelope,
10
- } from './task-notification-envelope.mjs';
11
-
12
- test('completion envelope matches historical assembly plus the corrected blank-line separator', () => {
13
- const jobId = 'shell_job_1';
14
- const status = 'completed';
15
- const exitCode = 0;
16
- const elapsedMs = 1234;
17
- const detail = {
18
- command: 'npm test',
19
- summary: 'ok',
20
- stdoutPreview: 'out',
21
- stderrPreview: 'err',
22
- mergeStderr: false,
23
- };
24
- const expected = [
25
- `[task_id: ${jobId}]`,
26
- `[status: ${status}]`,
27
- `[exit: ${exitCode === null ? 'n/a' : exitCode}]`,
28
- elapsedMs !== null ? `[elapsed: ${elapsedMs} ms]` : null,
29
- detail.command ? `[command: ${detail.command}]` : null,
30
- // The historical inline assembly filtered this '' out, gluing `Summary:`
31
- // onto the header block; the corrected renderer keeps exactly one blank
32
- // line between the bracket headers and the body sections.
33
- '',
34
- detail.summary ? `Summary: ${detail.summary}` : null,
35
- detail.stdoutPreview ? `\n[stdout preview]\n${detail.stdoutPreview}` : null,
36
- (detail.mergeStderr !== true && detail.stderrPreview) ? `\n[stderr preview]\n${detail.stderrPreview}` : null,
37
- ].filter((l) => l !== null).join('\n');
38
- const actual = renderShellCompletionEnvelope({ jobId, status, exitCode, elapsedMs, ...detail });
39
- assert.equal(actual, expected);
40
- assert.equal(isInternalRuntimeNotificationText(actual), true);
41
- assert.equal(isBracketedShellNotificationEnvelope(actual), true);
42
- });
43
-
44
- test('summary-only completion envelope keeps one blank line before the body', () => {
45
- const actual = renderShellCompletionEnvelope({
46
- jobId: 'shell_job_1',
47
- status: 'completed',
48
- exitCode: 0,
49
- summary: 'ok',
50
- });
51
- const expected = [
52
- '[task_id: shell_job_1]',
53
- '[status: completed]',
54
- '[exit: 0]',
55
- '',
56
- 'Summary: ok',
57
- ].join('\n');
58
- assert.equal(actual, expected);
59
- // The blank-line separator must survive so body detectors see a body.
60
- assert.match(actual, /\n\s*\n/);
61
- });
62
-
63
- test('bodyless completion envelope has no trailing blank line', () => {
64
- const actual = renderShellCompletionEnvelope({
65
- jobId: 'shell_job_1',
66
- status: 'completed',
67
- exitCode: 0,
68
- });
69
- assert.equal(actual, ['[task_id: shell_job_1]', '[status: completed]', '[exit: 0]'].join('\n'));
70
- assert.doesNotMatch(actual, /\n\s*\n/);
71
- });
72
-
73
- test('completion instruction uses shared async wording + exit detail', () => {
74
- assert.equal(
75
- shellCompletionInstruction({ jobId: 'shell_job_1', status: 'completed', exitCode: 0 }),
76
- 'The async shell task shell_job_1 has finished (completed, exit 0) - review this result in your next step.',
77
- );
78
- assert.match(shellCompletionInstruction({ jobId: 'x', status: 'failed', exitCode: null }), /exit n\/a/);
79
- });
80
-
81
- test('prompt-stall envelope is byte-compatible with historical inline assembly', () => {
82
- const jobId = 'shell_job_1';
83
- const stalledMs = 5000;
84
- const elapsedMs = 6000;
85
- const tail = { text: 'Password:' };
86
- const detail = { command: 'ssh host' };
87
- const expected = [
88
- `[task_id: ${jobId}]`,
89
- '[status: running]',
90
- `[stalled: no output growth for ${stalledMs} ms]`,
91
- elapsedMs >= 0 ? `[elapsed: ${elapsedMs} ms]` : null,
92
- detail.command ? `[command: ${detail.command}]` : null,
93
- '',
94
- 'This background shell task appears to be waiting for interactive input. Background tasks cannot answer prompts automatically; cancel it or rerun with non-interactive flags/input.',
95
- tail.text ? `\n${tail.text}` : null,
96
- ].filter((line) => line !== null && line !== '').join('\n');
97
- const actual = renderShellPromptStallEnvelope({ jobId, stalledMs, elapsedMs, command: detail.command, tailText: tail.text });
98
- assert.equal(actual, expected);
99
- assert.equal(isInternalRuntimeNotificationText(actual), true);
100
- });
101
-
102
- test('prompt-stall instruction wording unchanged', () => {
103
- assert.equal(
104
- shellPromptStallInstruction({ jobId: 'shell_job_1' }),
105
- 'The background shell task shell_job_1 appears to be waiting for interactive input; inspect the prompt, then cancel or rerun it non-interactively.',
106
- );
107
- });
@@ -1,183 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
- import {
4
- isInternalRuntimeNotificationText,
5
- isModelVisibleToolCompletionWrapper,
6
- modelVisibleToolCompletionMessage,
7
- shouldPersistModelVisibleToolCompletion,
8
- toolCompletionMeta,
9
- toolCompletionInstruction,
10
- } from './tool-execution-contract.mjs';
11
- import { _isInternalRuntimeNotificationText } from '../agent/orchestrator/session/manager.mjs';
12
-
13
- const completedBackgroundTask = [
14
- 'background task',
15
- 'task_id: task_agent_abc123',
16
- 'surface: agent',
17
- 'operation: run',
18
- 'status: completed',
19
- 'started: 2026-03-28T00:00:00.000Z',
20
- 'finished: 2026-03-28T00:00:05.000Z',
21
- '',
22
- 'worker finished successfully',
23
- ].join('\n');
24
-
25
- const runningBackgroundTask = [
26
- 'background task',
27
- 'task_id: task_agent_abc123',
28
- 'surface: agent',
29
- 'operation: run',
30
- 'status: running',
31
- 'started: 2026-03-28T00:00:00.000Z',
32
- 'notification: completion will be delivered to the owner session; use status/read only for manual recovery.',
33
- ].join('\n');
34
-
35
- test('terminal background task with body should persist as model-visible wrapper', () => {
36
- const meta = toolCompletionMeta({
37
- surface: 'agent',
38
- id: 'task_agent_abc123',
39
- status: 'completed',
40
- context: { callerSessionId: 'sess_owner' },
41
- });
42
- assert.equal(shouldPersistModelVisibleToolCompletion(completedBackgroundTask, meta), true);
43
- const visible = modelVisibleToolCompletionMessage(completedBackgroundTask, meta);
44
- assert.ok(visible);
45
- assert.equal(isInternalRuntimeNotificationText(visible), false);
46
- assert.equal(_isInternalRuntimeNotificationText(visible), false);
47
- assert.equal(isModelVisibleToolCompletionWrapper(visible), true);
48
- assert.match(visible, /worker finished successfully/);
49
- });
50
-
51
- test('model-visible completion wrapper is not a human transcript item', () => {
52
- const meta = toolCompletionMeta({
53
- surface: 'agent',
54
- id: 'task_agent_abc123',
55
- status: 'completed',
56
- instruction: toolCompletionInstruction({
57
- surface: 'agent',
58
- id: 'task_agent_abc123',
59
- status: 'completed',
60
- }),
61
- context: { callerSessionId: 'sess_owner' },
62
- });
63
- const visible = modelVisibleToolCompletionMessage(completedBackgroundTask, meta);
64
- assert.ok(visible);
65
- assert.match(visible, /^The async agent task/);
66
- assert.match(visible, /\n\nResult:\n/);
67
- assert.equal(isModelVisibleToolCompletionWrapper(visible), true);
68
- assert.equal(isModelVisibleToolCompletionWrapper('please fix the leak in engine.mjs'), false);
69
- assert.equal(isModelVisibleToolCompletionWrapper(completedBackgroundTask), false);
70
- });
71
-
72
- test('running background task stays hidden from model-visible pending drain', () => {
73
- const meta = toolCompletionMeta({
74
- surface: 'agent',
75
- id: 'task_agent_abc123',
76
- status: 'running',
77
- context: { callerSessionId: 'sess_owner' },
78
- });
79
- assert.equal(shouldPersistModelVisibleToolCompletion(runningBackgroundTask, meta), false);
80
- assert.equal(modelVisibleToolCompletionMessage(runningBackgroundTask, meta), '');
81
- });
82
-
83
- test('terminal background task persists when result body mentions task-notification', () => {
84
- const taskWithTagInBody = [
85
- ...completedBackgroundTask.split('\n').slice(0, -1),
86
- 'log line: saw <task-notification status="completed"> in worker output',
87
- ].join('\n');
88
- const meta = toolCompletionMeta({
89
- surface: 'agent',
90
- id: 'task_agent_abc123',
91
- status: 'completed',
92
- context: { callerSessionId: 'sess_owner' },
93
- });
94
- assert.equal(shouldPersistModelVisibleToolCompletion(taskWithTagInBody, meta), true);
95
- const visible = modelVisibleToolCompletionMessage(taskWithTagInBody, meta);
96
- assert.ok(visible);
97
- assert.match(visible, /<task-notification/);
98
- assert.equal(isInternalRuntimeNotificationText(visible), false);
99
- assert.equal(_isInternalRuntimeNotificationText(visible), false);
100
- });
101
-
102
- test('internal task-notification envelope does not persist', () => {
103
- const internalEnvelope = [
104
- '<task-notification>',
105
- '<status>completed</status>',
106
- '<summary>Agent completed</summary>',
107
- '<task-id>task_agent_internal</task-id>',
108
- '</task-notification>',
109
- ].join('\n');
110
- const meta = toolCompletionMeta({
111
- surface: 'agent',
112
- id: 'task_agent_internal',
113
- status: 'completed',
114
- context: { callerSessionId: 'sess_owner' },
115
- });
116
- assert.equal(shouldPersistModelVisibleToolCompletion(internalEnvelope, meta), false);
117
- assert.equal(modelVisibleToolCompletionMessage(internalEnvelope, meta), '');
118
- assert.equal(isInternalRuntimeNotificationText(internalEnvelope), true);
119
- assert.equal(_isInternalRuntimeNotificationText(internalEnvelope), true);
120
- });
121
-
122
- test('raw running background task remains internal for manager pending drain', () => {
123
- assert.equal(isInternalRuntimeNotificationText(runningBackgroundTask), true);
124
- assert.equal(_isInternalRuntimeNotificationText(runningBackgroundTask), true);
125
- });
126
-
127
-
128
-
129
- const bracketedShellCompleted = [
130
- "[task_id: shell_job_1]",
131
- "[status: completed]",
132
- "[exit: 0]",
133
- "",
134
- "done output",
135
- ].join("\n");
136
-
137
- const bracketedShellRunning = [
138
- "[task_id: shell_job_1]",
139
- "[status: running]",
140
- "[command: npm test]",
141
- ].join("\n");
142
-
143
- test("bracketed shell completed raw envelope is internal", () => {
144
- assert.equal(isInternalRuntimeNotificationText(bracketedShellCompleted), true);
145
- assert.equal(_isInternalRuntimeNotificationText(bracketedShellCompleted), true);
146
- });
147
-
148
- test("bracketed shell running raw envelope is internal", () => {
149
- assert.equal(isInternalRuntimeNotificationText(bracketedShellRunning), true);
150
- assert.equal(_isInternalRuntimeNotificationText(bracketedShellRunning), true);
151
- });
152
-
153
- test("wrapped shell completion stays model-visible and not internal", () => {
154
- const meta = toolCompletionMeta({
155
- surface: "shell",
156
- id: "shell_job_1",
157
- status: "completed",
158
- context: { callerSessionId: "sess_owner" },
159
- });
160
- const visible = modelVisibleToolCompletionMessage(bracketedShellCompleted, meta);
161
- assert.ok(visible);
162
- assert.match(visible, /done output/);
163
- assert.equal(isInternalRuntimeNotificationText(visible), false);
164
- assert.equal(_isInternalRuntimeNotificationText(visible), false);
165
- });
166
-
167
- test("model-visible wrapper bounds large completion bodies", () => {
168
- const hugeBody = "x".repeat(20_000);
169
- const hugeTask = [
170
- ...completedBackgroundTask.split("\n").slice(0, -1),
171
- hugeBody,
172
- ].join("\n");
173
- const meta = toolCompletionMeta({
174
- surface: "agent",
175
- id: "task_agent_abc123",
176
- status: "completed",
177
- context: { callerSessionId: "sess_owner" },
178
- });
179
- const visible = modelVisibleToolCompletionMessage(hugeTask, meta);
180
- assert.ok(visible);
181
- assert.match(visible, /\[result truncated for model context\]/);
182
- assert.ok(visible.length < hugeBody.length);
183
- });
@@ -1,76 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
- import {
4
- appendAgentProgressKv,
5
- buildAgentTaskProgressFields,
6
- resolveSilentForSeconds,
7
- } from './agent-task-status.mjs';
8
-
9
- test('waiting for first activity explains silence', () => {
10
- const now = 1_000_000;
11
- const fields = buildAgentTaskProgressFields({
12
- now,
13
- sessionStatus: 'running',
14
- runtimeStage: 'requesting',
15
- snapshot: {
16
- stage: 'requesting',
17
- waitingForFirstActivity: true,
18
- modelRequestStartedAt: now - 12_000,
19
- askStartedAt: now - 12_000,
20
- lastProgressAt: now - 12_000,
21
- },
22
- policy: { firstResponseMs: 120_000, idleStaleMs: 1_800_000, toolRunningMs: 600_000 },
23
- taskStatus: 'running',
24
- });
25
- assert.equal(fields.last_progress, 'awaiting first model response');
26
- assert.match(fields.diagnostic, /waiting for first response/);
27
- assert.match(fields.watchdog, /first=120s/);
28
- });
29
-
30
- test('streaming without recent deltas is called out', () => {
31
- const now = 2_000_000;
32
- const fields = buildAgentTaskProgressFields({
33
- now,
34
- sessionStatus: 'running',
35
- runtimeStage: 'streaming',
36
- snapshot: {
37
- stage: 'streaming',
38
- waitingForFirstActivity: false,
39
- lastStreamDeltaAt: now - 23_000,
40
- lastProgressAt: now - 23_000,
41
- },
42
- taskStatus: 'running',
43
- });
44
- assert.match(fields.last_progress, /no stream delta for 23s/);
45
- assert.match(fields.diagnostic, /no visible output yet \(23s\)/);
46
- assert.equal(fields.silent_for, 23);
47
- });
48
-
49
- test('queued follow-ups surface on idle worker', () => {
50
- const fields = buildAgentTaskProgressFields({
51
- sessionStatus: 'idle',
52
- runtimeStage: 'streaming',
53
- queuedFollowups: 2,
54
- taskStatus: 'running',
55
- });
56
- assert.equal(fields.queued_followups, 2);
57
- assert.match(fields.diagnostic, /2 follow-ups queued/);
58
- });
59
-
60
- test('resolveSilentForSeconds uses latest progress signal', () => {
61
- const now = 10_000;
62
- const silent = resolveSilentForSeconds(now, { lastProgressAt: now - 5_000 }, { lastStreamDeltaAt: now - 9_000 });
63
- assert.equal(silent, 5);
64
- });
65
-
66
- test('appendAgentProgressKv keeps base line first', () => {
67
- const line = appendAgentProgressKv('- job1 spawn running', {
68
- worker_stage: 'streaming',
69
- silent_for: 4,
70
- diagnostic: 'streaming',
71
- });
72
- assert.match(line, /^- job1 spawn running /);
73
- assert.match(line, /stage=streaming/);
74
- assert.match(line, /hint=streaming/);
75
- });
76
-