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
@@ -0,0 +1,229 @@
1
+ /**
2
+ * openai-ws-delta.mjs — request/response item matching + incremental-input
3
+ * delta computation for the OpenAI OAuth WebSocket transport.
4
+ *
5
+ * Extracted from openai-ws-stream.mjs (no behavior change): the pure helpers
6
+ * that decide whether a warm socket can send only the input tail
7
+ * (_computeDelta / _sansInput / _logicalResponseItemMatch / ...). No socket or
8
+ * stream state — deterministic functions over request bodies + prior-response
9
+ * snapshots. openai-ws-stream.mjs re-exports these so existing importers
10
+ * (openai-oauth-ws.mjs et al) resolve unchanged.
11
+ */
12
+
13
+ // If the cached request (sans input) matches the current one and the current
14
+ // input starts with the cached input, return only the tail. Otherwise return
15
+ // the full input (fresh turn).
16
+ export function _sansInput(body) {
17
+ const { input: _ignored, previous_response_id: _prevIgnored, ...rest } = body;
18
+ return rest;
19
+ }
20
+
21
+ export function _stableStringify(obj) {
22
+ // Shallow stable-ish: JSON.stringify with sorted top-level keys. Nested
23
+ // arrays (tools, include) are order-sensitive and reflect intent, so we
24
+ // do not sort them.
25
+ if (obj === null || typeof obj !== 'object' || Array.isArray(obj)) return JSON.stringify(obj);
26
+ const keys = Object.keys(obj).sort();
27
+ const parts = [];
28
+ for (const k of keys) parts.push(JSON.stringify(k) + ':' + _stableStringify(obj[k]));
29
+ return '{' + parts.join(',') + '}';
30
+ }
31
+
32
+ export function _cloneJson(value) {
33
+ if (value == null) return value;
34
+ try { return JSON.parse(JSON.stringify(value)); } catch { return value; }
35
+ }
36
+
37
+ function _normalizeArguments(value) {
38
+ if (value == null) return '';
39
+ if (typeof value === 'string') {
40
+ const trimmed = value.trim();
41
+ try { return _stableStringify(JSON.parse(trimmed || '{}')); } catch { return trimmed; }
42
+ }
43
+ return _stableStringify(value);
44
+ }
45
+
46
+ function _normalizeContentPart(part) {
47
+ if (!part || typeof part !== 'object') return part;
48
+ const type = part.type === 'input_text' ? 'output_text' : part.type;
49
+ if (type === 'output_text') return { type, text: part.text || '' };
50
+ return part;
51
+ }
52
+
53
+ function _contentPartsEqual(a, b) {
54
+ const aa = Array.isArray(a) ? a.map(_normalizeContentPart) : [];
55
+ const bb = Array.isArray(b) ? b.map(_normalizeContentPart) : [];
56
+ return _stableStringify(aa) === _stableStringify(bb);
57
+ }
58
+
59
+ export function _logicalResponseItemMatch(inputItem, responseItem) {
60
+ if (!inputItem || !responseItem) return false;
61
+ const inputType = inputItem.type || (inputItem.role === 'assistant' ? 'message' : '');
62
+ const responseType = responseItem.type || '';
63
+ if (responseType === 'function_call') {
64
+ if (inputType !== 'function_call') return false;
65
+ const inputCallId = String(inputItem.call_id || '');
66
+ const responseCallId = String(responseItem.call_id || '');
67
+ const inputName = String(inputItem.name || '');
68
+ const responseName = String(responseItem.name || '');
69
+ if (inputCallId && responseCallId) {
70
+ // call_id is the server-side anchor. The replayed history may carry
71
+ // locally compacted arguments, but previous_response_id already
72
+ // points at the canonical output item.
73
+ return inputCallId === responseCallId && inputName === responseName;
74
+ }
75
+ return inputName === responseName
76
+ && _normalizeArguments(inputItem.arguments) === _normalizeArguments(responseItem.arguments);
77
+ }
78
+ if (responseType === 'tool_search_call') {
79
+ if (inputType !== 'tool_search_call') return false;
80
+ const inputCallId = String(inputItem.call_id || '');
81
+ const responseCallId = String(responseItem.call_id || '');
82
+ if (inputCallId && responseCallId) return inputCallId === responseCallId;
83
+ return _normalizeArguments(inputItem.arguments) === _normalizeArguments(responseItem.arguments);
84
+ }
85
+ if (responseType === 'custom_tool_call') {
86
+ if (inputType !== 'custom_tool_call') return false;
87
+ const inputCallId = String(inputItem.call_id || '');
88
+ const responseCallId = String(responseItem.call_id || '');
89
+ const inputName = String(inputItem.name || '');
90
+ const responseName = String(responseItem.name || '');
91
+ if (inputCallId && responseCallId) return inputCallId === responseCallId && inputName === responseName;
92
+ return inputName === responseName && String(inputItem.input || '') === String(responseItem.input || '');
93
+ }
94
+ if (responseType === 'message') {
95
+ const inputRole = inputItem.role || (inputType === 'message' ? 'assistant' : '');
96
+ const responseRole = responseItem.role || 'assistant';
97
+ return inputType === 'message'
98
+ && inputRole === responseRole
99
+ && _contentPartsEqual(inputItem.content, responseItem.content);
100
+ }
101
+ if (responseType === 'reasoning') {
102
+ return inputType === 'reasoning'
103
+ && (!!responseItem.id ? inputItem.id === responseItem.id : true)
104
+ && (!!responseItem.encrypted_content
105
+ ? inputItem.encrypted_content === responseItem.encrypted_content
106
+ : true);
107
+ }
108
+ if (responseType === 'web_search_call') {
109
+ return inputType === 'web_search_call'
110
+ && (!!responseItem.id ? inputItem.id === responseItem.id : true)
111
+ && _stableStringify(inputItem.action || null) === _stableStringify(responseItem.action || null);
112
+ }
113
+ if (inputType !== responseType) return false;
114
+ const stripVolatile = (item) => {
115
+ if (!item || typeof item !== 'object') return item;
116
+ const { id: _id, status: _status, ...rest } = item;
117
+ return rest;
118
+ };
119
+ return _stableStringify(stripVolatile(inputItem)) === _stableStringify(stripVolatile(responseItem));
120
+ }
121
+
122
+ function _requestInputItemsMatch(a, b) {
123
+ return _stableStringify(a) === _stableStringify(b);
124
+ }
125
+
126
+ function _stripRequestPrefix(curInput, prevInput) {
127
+ const current = Array.isArray(curInput) ? curInput : [];
128
+ const previous = Array.isArray(prevInput) ? prevInput : [];
129
+ if (current.length < previous.length) return null;
130
+ for (let i = 0; i < previous.length; i += 1) {
131
+ if (!_requestInputItemsMatch(current[i], previous[i])) return null;
132
+ }
133
+ return current.slice(previous.length);
134
+ }
135
+
136
+ function _isReplayLikeHead(item, responseItem) {
137
+ if (!item || !responseItem) return false;
138
+ const inputType = item.type || (item.role === 'assistant' ? 'message' : '');
139
+ const responseType = responseItem.type || '';
140
+ if (responseType === 'message') return inputType === 'message';
141
+ if (responseType === 'function_call') return inputType === 'function_call';
142
+ if (responseType === 'tool_search_call') return inputType === 'tool_search_call';
143
+ return inputType === responseType;
144
+ }
145
+
146
+ export function _stripResponseItemsFromHead(items, responseItems) {
147
+ const tail = Array.isArray(items) ? items : [];
148
+ const outputs = Array.isArray(responseItems) ? responseItems : [];
149
+ let cursor = 0;
150
+ let stripped = 0;
151
+ let skipped = 0;
152
+ for (const output of outputs) {
153
+ if (cursor >= tail.length) break;
154
+ if (_logicalResponseItemMatch(tail[cursor], output)) {
155
+ cursor += 1;
156
+ stripped += 1;
157
+ continue;
158
+ }
159
+ if (_isReplayLikeHead(tail[cursor], output)) {
160
+ return {
161
+ ok: false,
162
+ reason: `response_output_mismatch:${output?.type || 'unknown'}`,
163
+ tail,
164
+ stripped,
165
+ skipped,
166
+ };
167
+ }
168
+ skipped += 1;
169
+ }
170
+ return { ok: true, reason: null, tail: tail.slice(cursor), stripped, skipped };
171
+ }
172
+
173
+ export function _computeDelta({ entry, body }) {
174
+ // DEFAULT: full-frame sends. codex's delta path is only cache-safe with
175
+ // the x-codex-turn-state sticky-routing token, which the backend issues to
176
+ // codex but never to us (R11-R14 2026-07-03: zero turn-state events across
177
+ // 200+ calls despite UA/version/beta-features/client_metadata parity;
178
+ // delta measured 18-28% warm miss vs full-frame 0.0%). Without the sticky
179
+ // token, previous_response_id requests hop cache nodes and only the first
180
+ // prefix blocks hit. Re-enable delta explicitly via MIXDOG_OAI_WS_DELTA=1
181
+ // for future probes if the backend starts issuing turn-state.
182
+ const deltaOptIn = ['1', 'true', 'yes', 'on'].includes(String(process.env.MIXDOG_OAI_WS_DELTA || '').trim().toLowerCase());
183
+ if (!deltaOptIn) {
184
+ return { mode: 'full', reason: 'full_default', frame: { type: 'response.create', ...body } };
185
+ }
186
+ if (!entry || !entry.lastRequestSansInput || !entry.lastResponseId) {
187
+ return { mode: 'full', reason: 'no_anchor', frame: { type: 'response.create', ...body } };
188
+ }
189
+ if (!Array.isArray(entry.lastRequestInput)) {
190
+ return { mode: 'full', reason: 'no_input_snapshot', frame: { type: 'response.create', ...body } };
191
+ }
192
+ const curSans = _stableStringify(_sansInput(body));
193
+ if (curSans !== entry.lastRequestSansInput) {
194
+ return { mode: 'full', reason: 'request_properties_changed', frame: { type: 'response.create', ...body } };
195
+ }
196
+ const curInput = Array.isArray(body.input) ? body.input : [];
197
+ const afterPreviousInput = _stripRequestPrefix(curInput, entry.lastRequestInput);
198
+ if (!afterPreviousInput) {
199
+ return { mode: 'full', reason: 'input_prefix_mismatch', frame: { type: 'response.create', ...body } };
200
+ }
201
+ const stripped = _stripResponseItemsFromHead(afterPreviousInput, entry.lastResponseItems);
202
+ if (!stripped.ok) {
203
+ return { mode: 'full', reason: stripped.reason, frame: { type: 'response.create', ...body } };
204
+ }
205
+ return {
206
+ mode: 'delta',
207
+ reason: null,
208
+ strippedResponseItems: stripped.stripped,
209
+ skippedResponseItems: stripped.skipped,
210
+ frame: (() => {
211
+ const { model, instructions, input: _input, ...rest } = body;
212
+ return {
213
+ type: 'response.create',
214
+ model,
215
+ ...(typeof instructions === 'string' && instructions.length ? { instructions } : {}),
216
+ previous_response_id: entry.lastResponseId,
217
+ input: stripped.tail,
218
+ ...rest,
219
+ };
220
+ })(),
221
+ };
222
+ }
223
+
224
+ export function _estimateFrameTokens(frame) {
225
+ try {
226
+ const s = JSON.stringify(frame);
227
+ return Math.ceil(s.length / 4);
228
+ } catch { return 0; }
229
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * openai-ws-events.mjs — usage assembly + event/close parsing helpers for the
3
+ * OpenAI OAuth WebSocket transport.
4
+ *
5
+ * Extracted from openai-ws-stream.mjs (no behavior change): the pure,
6
+ * socket-free helpers used by the _streamResponse loop to combine warmup +
7
+ * actual usage, parse server event frames, derive incomplete reasons, and map
8
+ * WS close codes to HTTP status. openai-ws-stream.mjs re-exports these so
9
+ * existing importers resolve unchanged.
10
+ */
11
+
12
+ function _usageNum(value) {
13
+ const n = Number(value || 0);
14
+ return Number.isFinite(n) ? n : 0;
15
+ }
16
+
17
+ export function _combineUsageWithWarmup(actual, warmup) {
18
+ if (!warmup) return actual;
19
+ if (!actual) return warmup;
20
+ const actualRaw = actual.raw || {};
21
+ const warmupRaw = warmup.raw || {};
22
+ const actualTicks = _usageNum(actualRaw.cost_in_usd_ticks);
23
+ const warmupTicks = _usageNum(warmupRaw.cost_in_usd_ticks);
24
+ return {
25
+ ...actual,
26
+ inputTokens: _usageNum(actual.inputTokens) + _usageNum(warmup.inputTokens),
27
+ outputTokens: _usageNum(actual.outputTokens) + _usageNum(warmup.outputTokens),
28
+ cachedTokens: _usageNum(actual.cachedTokens) + _usageNum(warmup.cachedTokens),
29
+ promptTokens: _usageNum(actual.promptTokens) + _usageNum(warmup.promptTokens),
30
+ warmupInputTokens: _usageNum(warmup.inputTokens),
31
+ warmupCachedTokens: _usageNum(warmup.cachedTokens),
32
+ warmupOutputTokens: _usageNum(warmup.outputTokens),
33
+ raw: {
34
+ ...actualRaw,
35
+ warmup_usage: warmupRaw,
36
+ ...(actualTicks || warmupTicks ? { cost_in_usd_ticks: actualTicks + warmupTicks } : {}),
37
+ },
38
+ };
39
+ }
40
+
41
+ export function _parseEvent(raw) {
42
+ try { return JSON.parse(raw); } catch { return null; }
43
+ }
44
+
45
+ export function _incompleteReasonFromEvent(event) {
46
+ const reasonObj = event?.response?.incomplete_details
47
+ || event?.incomplete_details
48
+ || event?.response?.status_details
49
+ || null;
50
+ return String(reasonObj?.reason || event?.response?.status || 'incomplete');
51
+ }
52
+
53
+ export function _isMaxOutputIncompleteReason(reason) {
54
+ return /^(?:max_output_tokens|max_tokens|length|output_token_limit)$/i.test(String(reason || '').trim());
55
+ }
56
+
57
+ export function _httpStatusFromWsClose(code, reason) {
58
+ const n = Number(code || 0);
59
+ const r = String(reason || '').toLowerCase();
60
+ if (n === 4401
61
+ || /\b(?:unauthorized|unauthorised|authentication|auth(?:enticated?)?|not authenticated|token expired|access token)\b/.test(r)) {
62
+ return 401;
63
+ }
64
+ if (n === 4403 || /\b(?:forbidden|policy|permission denied)\b/.test(r)) return 403;
65
+ if (n === 4429 || /\b(?:rate limit|quota)\b/.test(r)) return 429;
66
+ return 0;
67
+ }