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,195 @@
1
+ // Korean morphological analysis for the recall FTS query path.
2
+ //
3
+ // Wraps kiwi-nlp (WASM). The npm package ships ONLY the WASM binary + JS glue,
4
+ // NOT the language model — so the model archive is downloaded ONCE at boot from
5
+ // the bab2min/Kiwi GitHub Release and cached under a gitignored data dir
6
+ // (precedent: the embedding ONNX model is runtime-downloaded/cached the same
7
+ // way). No per-query network. If download or WASM init fails, analyze() returns
8
+ // null and the caller (buildFtsQuery) falls back to its prior websearch path.
9
+ //
10
+ // Lifecycle:
11
+ // init(dataDir) — lazy, async, idempotent, safe to call fire-and-forget at
12
+ // boot. Downloads+extracts model on first run, then builds
13
+ // the Kiwi instance. Never throws (logs once, stays null).
14
+ // ready() — true once the Kiwi instance is built.
15
+ // analyze(text) — sync; returns TokenInfo[] or null when not ready.
16
+ // stems(text) — sync; content-morpheme stems (NNG/NNP/VV/VA/XR/SL) or null.
17
+ import fs from 'node:fs'
18
+ import path from 'node:path'
19
+ import zlib from 'node:zlib'
20
+
21
+ // Pinned model release. The WASM package version (kiwi-nlp in package.json) and
22
+ // this model version are independent; base model is format-stable across the
23
+ // 0.2x line. Bump deliberately, never floating.
24
+ // Model version MUST match the kiwi-nlp WASM version — a mismatched model
25
+ // aborts the WASM at build() with an opaque numeric error. Pinned pair:
26
+ // kiwi-nlp@0.21.0 (package.json) + model v0.21.0 KnLM. Deliberately NOT
27
+ // 0.23.0: its base model ships CoNg (72MB, ~940MB RSS after build) vs
28
+ // KnLM's 35MB download / ~560MB build peak, and recall stemming gains
29
+ // nothing from the CoNg accuracy delta.
30
+ export const KIWI_MODEL_VERSION = 'v0.21.0'
31
+ const KIWI_MODEL_ASSET = `kiwi_model_${KIWI_MODEL_VERSION}_base.tgz`
32
+ const KIWI_MODEL_URL = `https://github.com/bab2min/Kiwi/releases/download/${KIWI_MODEL_VERSION}/${KIWI_MODEL_ASSET}`
33
+
34
+ // Model files KiwiBuilder.build({ modelFiles }) needs from the extracted
35
+ // archive (v0.21.0 base layout: KnLM = sj.knlm + sj.morph).
36
+ const REQUIRED_MODEL_FILES = [
37
+ 'combiningRule.txt', 'default.dict', 'extract.mdl', 'sj.knlm', 'sj.morph',
38
+ ]
39
+ // Optional files loaded when present (loadMultiDict / loadTypoDict defaults).
40
+ const OPTIONAL_MODEL_FILES = ['multi.dict', 'skipbigram.mdl', 'typo.dict']
41
+
42
+ // Content-morpheme POS tags whose stems are worth indexing against search_tsv.
43
+ // NNG/NNP nouns, VV/VA predicate stems, XR root, SL foreign(latin) — matches
44
+ // the brief. Endings/particles/josa are intentionally dropped.
45
+ const CONTENT_TAGS = new Set(['NNG', 'NNP', 'VV', 'VA', 'XR', 'SL'])
46
+
47
+ let _state = 'idle' // idle | loading | ready | failed
48
+ let _initPromise = null
49
+ let _kiwi = null
50
+ let _log = () => {}
51
+ let _initMs = 0
52
+
53
+ export function isReady() { return _state === 'ready' && _kiwi != null }
54
+ export function state() { return _state }
55
+ export function initLatencyMs() { return _initMs }
56
+
57
+ function modelDir(dataDir) {
58
+ return path.join(dataDir, 'kiwi-model', KIWI_MODEL_VERSION)
59
+ }
60
+
61
+ function hasAllRequired(dir) {
62
+ try {
63
+ return REQUIRED_MODEL_FILES.every(f => fs.existsSync(path.join(dir, f)))
64
+ } catch { return false }
65
+ }
66
+
67
+ // Minimal POSIX/ustar tar reader over an already-gunzipped buffer. Avoids a
68
+ // node-tar dependency for a one-shot boot extraction. Handles regular files
69
+ // (typeflag '0'/'\0') and the GNU/pax long-name records well enough for the
70
+ // flat Kiwi model archive (all entries live under a single top-level dir).
71
+ function extractTar(buf, destDir) {
72
+ let offset = 0
73
+ const written = []
74
+ while (offset + 512 <= buf.length) {
75
+ const header = buf.subarray(offset, offset + 512)
76
+ // Two consecutive zero blocks mark end of archive.
77
+ if (header.every(b => b === 0)) break
78
+ let name = header.subarray(0, 100).toString('utf8').replace(/\0.*$/, '')
79
+ const sizeStr = header.subarray(124, 136).toString('utf8').replace(/\0.*$/, '').trim()
80
+ const size = parseInt(sizeStr, 8) || 0
81
+ const typeflag = String.fromCharCode(header[156]) || '0'
82
+ // ustar prefix (name continuation) at 345..500.
83
+ const prefix = header.subarray(345, 500).toString('utf8').replace(/\0.*$/, '')
84
+ if (prefix) name = `${prefix}/${name}`
85
+ offset += 512
86
+ const body = buf.subarray(offset, offset + size)
87
+ offset += Math.ceil(size / 512) * 512
88
+ if (typeflag !== '0' && typeflag !== '\0' && typeflag !== '') continue
89
+ // Flatten: take basename only; the archive nests files under one dir.
90
+ const base = name.split('/').filter(Boolean).pop()
91
+ if (!base) continue
92
+ fs.writeFileSync(path.join(destDir, base), body)
93
+ written.push(base)
94
+ }
95
+ return written
96
+ }
97
+
98
+ async function downloadAndExtractModel(dataDir) {
99
+ const dir = modelDir(dataDir)
100
+ if (hasAllRequired(dir)) return dir
101
+ fs.mkdirSync(dir, { recursive: true })
102
+ _log(`[memory-service] kiwi model missing — downloading ${KIWI_MODEL_ASSET} (~35MB) once\n`)
103
+ const res = await fetch(KIWI_MODEL_URL, { redirect: 'follow' })
104
+ if (!res.ok) throw new Error(`kiwi model download HTTP ${res.status}`)
105
+ const gz = Buffer.from(await res.arrayBuffer())
106
+ const tar = zlib.gunzipSync(gz)
107
+ extractTar(tar, dir)
108
+ if (!hasAllRequired(dir)) {
109
+ throw new Error(`kiwi model extract incomplete under ${dir}`)
110
+ }
111
+ return dir
112
+ }
113
+
114
+ function readModelFiles(dir) {
115
+ const modelFiles = {}
116
+ for (const f of REQUIRED_MODEL_FILES) {
117
+ modelFiles[f] = new Uint8Array(fs.readFileSync(path.join(dir, f)))
118
+ }
119
+ for (const f of OPTIONAL_MODEL_FILES) {
120
+ const p = path.join(dir, f)
121
+ if (fs.existsSync(p)) modelFiles[f] = new Uint8Array(fs.readFileSync(p))
122
+ }
123
+ return modelFiles
124
+ }
125
+
126
+ // Lazy, idempotent, never-throwing init. Fire-and-forget at boot.
127
+ export async function init(dataDir, log = () => {}) {
128
+ if (_state === 'ready') return true
129
+ if (_initPromise) return _initPromise
130
+ _log = typeof log === 'function' ? log : (() => {})
131
+ _state = 'loading'
132
+ const t0 = Date.now()
133
+ _initPromise = (async () => {
134
+ // Resolve the WASM path from the installed package without hard-importing
135
+ // (keeps the whole feature optional if kiwi-nlp isn't installed).
136
+ // NOTE: must go through module resolution (import.meta.resolve) — a bare
137
+ // `new URL(spec, import.meta.url)` resolves relative to THIS file's
138
+ // directory, not node_modules.
139
+ const { KiwiBuilder } = await import('kiwi-nlp')
140
+ const wasmUrl = import.meta.resolve('kiwi-nlp/dist/kiwi-wasm.wasm')
141
+ const wasmPath = wasmUrl.startsWith('file:')
142
+ ? (await import('node:url')).fileURLToPath(wasmUrl)
143
+ : wasmUrl
144
+ const dir = await downloadAndExtractModel(dataDir)
145
+ const modelFiles = readModelFiles(dir)
146
+ const builder = await KiwiBuilder.create(wasmPath)
147
+ // modelType 'knlm' = fast KnLM (sj.knlm); loadMultiDict/loadTypoDict only
148
+ // engage if the optional files were present.
149
+ _kiwi = await builder.build({ modelFiles, modelType: 'knlm' })
150
+ _state = 'ready'
151
+ _initMs = Date.now() - t0
152
+ _log(`[memory-service] kiwi morph ready in ${_initMs}ms (model ${KIWI_MODEL_VERSION}, rss≈${Math.round(process.memoryUsage().rss / 1e6)}MB)\n`)
153
+ return true
154
+ })().catch(err => {
155
+ _state = 'failed'
156
+ _kiwi = null
157
+ _log(`[memory-service] kiwi morph init failed — recall stays lexical: ${err?.message || err}\n`)
158
+ return false
159
+ })
160
+ return _initPromise
161
+ }
162
+
163
+ // Sync morphological analysis. Returns TokenInfo[] or null when not ready.
164
+ export function analyze(text) {
165
+ if (!isReady()) return null
166
+ const s = String(text ?? '')
167
+ if (!s) return null
168
+ try {
169
+ const r = _kiwi.analyze(s)
170
+ return Array.isArray(r?.tokens) ? r.tokens : null
171
+ } catch {
172
+ return null
173
+ }
174
+ }
175
+
176
+ // Content-morpheme stem forms for a Korean phrase. null when not ready.
177
+ // "개선을" → ['개선']; "개선하고" → ['개선','하'] filtered to content tags.
178
+ export function stems(text) {
179
+ const tokens = analyze(text)
180
+ if (!tokens) return null
181
+ const out = []
182
+ for (const t of tokens) {
183
+ if (!t || !CONTENT_TAGS.has(t.tag)) continue
184
+ const form = String(t.str || '').trim()
185
+ if (form.length >= 1) out.push(form)
186
+ }
187
+ return out
188
+ }
189
+
190
+ export function reset() {
191
+ _state = 'idle'
192
+ _initPromise = null
193
+ _kiwi = null
194
+ _initMs = 0
195
+ }
@@ -0,0 +1,91 @@
1
+ // Extracted from index.mjs — env/config flag helpers (pure, poll-on-use).
2
+ // These read process.env and the on-disk config section each call so runtime
3
+ // toggles (recap, secondary mode, cycle kill-switches) take effect without a
4
+ // daemon restart. No module-level mutable state; safe to import anywhere.
5
+ import os from 'node:os'
6
+ import path from 'node:path'
7
+ import fs from 'node:fs'
8
+ import { readSection } from '../../shared/config.mjs'
9
+
10
+ export function readMainConfig() {
11
+ return readSection('memory')
12
+ }
13
+
14
+ // Recap toggle lives in the `agent` config section (agent.recap.enabled,
15
+ // default true) — the same file the session runtime persists via
16
+ // saveConfigAndAdopt. The memory daemon runs as a detached cross-process HTTP
17
+ // worker, so it re-reads this section from disk each cycle tick (poll-on-use)
18
+ // rather than relying on IPC. A legacy `agent.modules.memory === false` flag is
19
+ // still honored as recap off (migration folds it on the session-runtime side).
20
+ export function readRecapEnabled() {
21
+ try {
22
+ let agent = readSection('agent')
23
+ // The agent section may be double-wrapped ({ agent: { providers, ... } })
24
+ // in legacy config files; loadConfig() unwraps the same way (config.mjs
25
+ // `raw.agent && raw.agent.providers`). Mirror it here or a migrated/toggled
26
+ // recap flag written inside the wrapper would be invisible to the daemon.
27
+ if (agent?.agent && agent.agent.providers) agent = agent.agent
28
+ const recap = agent?.recap
29
+ if (recap && typeof recap === 'object' && recap.enabled === false) return false
30
+ const legacyMemory = agent?.modules?.memory
31
+ if (legacyMemory === false) return false
32
+ if (legacyMemory && typeof legacyMemory === 'object' && legacyMemory.enabled === false) return false
33
+ return true
34
+ } catch {
35
+ return true
36
+ }
37
+ }
38
+
39
+ export function embeddingWarmupEnabled() {
40
+ const raw = String(process.env.MIXDOG_EMBED_WARMUP ?? '1').trim().toLowerCase()
41
+ return !(raw === '0' || raw === 'false' || raw === 'off' || raw === 'no')
42
+ }
43
+
44
+ export function envFlagEnabled(name) {
45
+ const raw = String(process.env[name] ?? '').trim().toLowerCase()
46
+ return raw === '1' || raw === 'true' || raw === 'on' || raw === 'yes'
47
+ }
48
+
49
+ export function memorySecondaryMode() {
50
+ return envFlagEnabled('MIXDOG_MEMORY_SECONDARY')
51
+ }
52
+
53
+ export function embeddingWarmupCanStart() {
54
+ return embeddingWarmupEnabled() && !memorySecondaryMode()
55
+ }
56
+
57
+ export function memoryLlmWorkerEnabled() {
58
+ return !memorySecondaryMode() && !envFlagEnabled('MIXDOG_MEMORY_DISABLE_LLM_WORKER')
59
+ }
60
+
61
+ export function memoryCyclesEnabled() {
62
+ // Background cycles run only when: not secondary mode, the env hard-override
63
+ // is not set, AND the user-facing recap toggle is on. The recap flag is
64
+ // re-read from disk here so toggling it at runtime takes effect without a
65
+ // daemon restart (checkCycles polls this each tick). The env override stays a
66
+ // hard kill switch regardless of recap.
67
+ return !memorySecondaryMode()
68
+ && !envFlagEnabled('MIXDOG_MEMORY_DISABLE_CYCLES')
69
+ && readRecapEnabled()
70
+ }
71
+
72
+ export function secondaryPgAdvertised(dataDir) {
73
+ if (!memorySecondaryMode()) return true
74
+ const runtimeRoot = process.env.MIXDOG_RUNTIME_ROOT
75
+ ? path.resolve(process.env.MIXDOG_RUNTIME_ROOT)
76
+ : path.join(os.tmpdir(), 'mixdog')
77
+ try {
78
+ const cur = JSON.parse(fs.readFileSync(path.join(runtimeRoot, 'active-instance.json'), 'utf8'))
79
+ const port = Number(cur?.pg_port)
80
+ const pgdata = cur?.pg_pgdata ? path.resolve(String(cur.pg_pgdata)) : ''
81
+ return Number.isInteger(port) && port > 0 && pgdata === path.resolve(path.join(dataDir, 'pgdata'))
82
+ } catch {
83
+ return false
84
+ }
85
+ }
86
+
87
+ export function assertSecondaryPgAttachable(dataDir) {
88
+ if (!secondaryPgAdvertised(dataDir)) {
89
+ throw new Error('memory-service: secondary mode requires an existing primary PG instance')
90
+ }
91
+ }
@@ -1,7 +1,7 @@
1
1
  // Barrel — original memory-cycle module split into memory-embed / memory-cycle1 / memory-cycle2.
2
2
  // External callers import from this path; the split is transparent.
3
3
  export {
4
- syncRootEmbedding, deleteRootEmbedding, flushEmbeddingDirty, inferChunkProjectId,
4
+ syncRootEmbedding, deleteRootEmbedding, flushEmbeddingDirty, flushRawEmbeddings, inferChunkProjectId,
5
5
  } from './memory-embed.mjs'
6
6
  export { runCycle1 } from './memory-cycle1.mjs'
7
7
  export {