mixdog 0.9.2 → 0.9.4

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 (417) hide show
  1. package/package.json +8 -3
  2. package/scripts/anthropic-maxtokens-test.mjs +119 -0
  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/review-tasks.json +20 -0
  7. package/scripts/bench/round-codex.json +114 -0
  8. package/scripts/bench/round-mixdog-lead-r3.json +269 -0
  9. package/scripts/bench/round-mixdog-lead.json +269 -0
  10. package/scripts/bench/round-mixdog.json +126 -0
  11. package/scripts/bench/round-r10-bigsample.json +679 -0
  12. package/scripts/bench/round-r11-codexalign.json +257 -0
  13. package/scripts/bench/round-r4-codex.json +114 -0
  14. package/scripts/bench/round-r4-mixed.json +225 -0
  15. package/scripts/bench/round-r5-gpt-lead.json +259 -0
  16. package/scripts/bench/round-r6-codex.json +114 -0
  17. package/scripts/bench/round-r6-solo.json +257 -0
  18. package/scripts/bench/round-r7-full.json +254 -0
  19. package/scripts/bench/round-r8-fulldefault.json +255 -0
  20. package/scripts/bench-run.mjs +215 -29
  21. package/scripts/build-tui.mjs +13 -1
  22. package/scripts/explore-bench.mjs +124 -0
  23. package/scripts/freevar-smoke.mjs +95 -0
  24. package/scripts/hook-bus-test.mjs +191 -0
  25. package/scripts/internal-comms-bench.mjs +1 -0
  26. package/scripts/internal-comms-smoke.mjs +10 -9
  27. package/scripts/mouse-probe.mjs +45 -0
  28. package/scripts/output-style-bench.mjs +13 -6
  29. package/scripts/output-style-smoke.mjs +4 -4
  30. package/scripts/path-suffix-test.mjs +57 -0
  31. package/scripts/provider-toolcall-test.mjs +7 -3
  32. package/scripts/recall-bench.mjs +207 -0
  33. package/scripts/recall-usecase-cases.json +18 -0
  34. package/scripts/recall-usecase-probe.json +6 -0
  35. package/scripts/session-bench.mjs +152 -6
  36. package/scripts/tool-smoke.mjs +30 -67
  37. package/scripts/tui-render-smoke.mjs +90 -0
  38. package/scripts/webhook-smoke.mjs +208 -0
  39. package/src/agents/debugger/AGENT.md +5 -2
  40. package/src/agents/heavy-worker/AGENT.md +21 -11
  41. package/src/agents/maintainer/AGENT.md +4 -0
  42. package/src/agents/reviewer/AGENT.md +3 -2
  43. package/src/agents/worker/AGENT.md +21 -11
  44. package/src/lib/rules-builder.cjs +4 -0
  45. package/src/mixdog-session-runtime.mjs +933 -3731
  46. package/src/output-styles/default.md +34 -9
  47. package/src/output-styles/{oneline.md → extreme-minimal.md} +5 -4
  48. package/src/output-styles/minimal.md +4 -1
  49. package/src/output-styles/simple.md +22 -7
  50. package/src/repl.mjs +5 -5
  51. package/src/rules/agent/00-common.md +2 -0
  52. package/src/rules/agent/30-explorer.md +8 -11
  53. package/src/rules/lead/lead-brief.md +12 -0
  54. package/src/rules/lead/lead-tool.md +2 -9
  55. package/src/rules/shared/01-tool.md +11 -5
  56. package/src/runtime/agent/orchestrator/agent-runtime/agent-loop-policy.mjs +25 -0
  57. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +100 -23
  58. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +6 -15
  59. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +362 -0
  60. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +410 -0
  61. package/src/runtime/agent/orchestrator/agent-trace.mjs +16 -735
  62. package/src/runtime/agent/orchestrator/config.mjs +69 -2
  63. package/src/runtime/agent/orchestrator/context/collect.mjs +51 -0
  64. package/src/runtime/agent/orchestrator/mcp/client.mjs +6 -2
  65. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +63 -21
  66. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +93 -0
  67. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +209 -0
  68. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +489 -0
  69. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +97 -1343
  70. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +607 -0
  71. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +78 -10
  72. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +1 -13
  73. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +81 -0
  74. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +248 -0
  75. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +303 -0
  76. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +505 -0
  77. package/src/runtime/agent/orchestrator/providers/gemini.mjs +44 -1014
  78. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +18 -4
  79. package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +32 -0
  80. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +86 -11
  81. package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +348 -0
  82. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +54 -20
  83. package/src/runtime/agent/orchestrator/providers/openai-codex-model.mjs +108 -0
  84. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +19 -12
  85. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +58 -0
  86. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +368 -0
  87. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +760 -0
  88. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +41 -1142
  89. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +732 -0
  90. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +193 -0
  91. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +303 -2119
  92. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +140 -995
  93. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +227 -0
  94. package/src/runtime/agent/orchestrator/providers/openai-ws-events.mjs +67 -0
  95. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +436 -0
  96. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +1105 -0
  97. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +2 -1
  98. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +38 -12
  99. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +7 -8
  100. package/src/runtime/agent/orchestrator/session/compact/budget.mjs +288 -0
  101. package/src/runtime/agent/orchestrator/session/compact/constants.mjs +85 -0
  102. package/src/runtime/agent/orchestrator/session/compact/engine.mjs +749 -0
  103. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +82 -0
  104. package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +315 -0
  105. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +643 -0
  106. package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +326 -0
  107. package/src/runtime/agent/orchestrator/session/compact.mjs +40 -2282
  108. package/src/runtime/agent/orchestrator/session/loop/compact-debug.mjs +28 -0
  109. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +274 -0
  110. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +61 -0
  111. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +38 -0
  112. package/src/runtime/agent/orchestrator/session/loop/env.mjs +14 -0
  113. package/src/runtime/agent/orchestrator/session/loop/hidden-agents.mjs +21 -0
  114. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +47 -0
  115. package/src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs +182 -0
  116. package/src/runtime/agent/orchestrator/session/loop/steering-ladder.mjs +173 -0
  117. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +63 -0
  118. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +100 -0
  119. package/src/runtime/agent/orchestrator/session/loop/termination.mjs +58 -0
  120. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +52 -0
  121. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +239 -0
  122. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +218 -0
  123. package/src/runtime/agent/orchestrator/session/loop/transcript-repair.mjs +101 -0
  124. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +35 -0
  125. package/src/runtime/agent/orchestrator/session/loop.mjs +409 -1304
  126. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +471 -0
  127. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +230 -0
  128. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +235 -0
  129. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +149 -0
  130. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +155 -0
  131. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +406 -0
  132. package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +80 -0
  133. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +303 -0
  134. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +210 -0
  135. package/src/runtime/agent/orchestrator/session/manager.mjs +226 -2114
  136. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +189 -0
  137. package/src/runtime/agent/orchestrator/session/store.mjs +74 -179
  138. package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -3
  139. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +70 -20
  140. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +22 -2
  141. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +33 -42
  142. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +241 -0
  143. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +1 -1
  144. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +40 -0
  145. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +42 -2
  146. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +1 -1
  147. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +11 -4
  148. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +29 -0
  149. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +8 -0
  150. package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +126 -0
  151. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +81 -87
  152. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-paths.mjs +161 -0
  153. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-process.mjs +108 -0
  154. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +78 -304
  155. package/src/runtime/agent/orchestrator/tools/builtin.mjs +11 -6
  156. package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +303 -0
  157. package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +43 -0
  158. package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +382 -0
  159. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +551 -0
  160. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +295 -0
  161. package/src/runtime/agent/orchestrator/tools/code-graph/graph-model.mjs +158 -0
  162. package/src/runtime/agent/orchestrator/tools/code-graph/keyword-match.mjs +82 -0
  163. package/src/runtime/agent/orchestrator/tools/code-graph/lang-predicates.mjs +128 -0
  164. package/src/runtime/agent/orchestrator/tools/code-graph/memory-cache.mjs +66 -0
  165. package/src/runtime/agent/orchestrator/tools/code-graph/project-root.mjs +44 -0
  166. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1080 -0
  167. package/src/runtime/agent/orchestrator/tools/code-graph/source-access.mjs +81 -0
  168. package/src/runtime/agent/orchestrator/tools/code-graph/span.mjs +19 -0
  169. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +280 -0
  170. package/src/runtime/agent/orchestrator/tools/code-graph/text-columns.mjs +45 -0
  171. package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.mjs +347 -0
  172. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +6 -6
  173. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +36 -4277
  174. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +6 -3
  175. package/src/runtime/agent/orchestrator/tools/patch/constants.mjs +9 -0
  176. package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +171 -0
  177. package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +471 -0
  178. package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +436 -0
  179. package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +342 -0
  180. package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +359 -0
  181. package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +340 -0
  182. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +643 -0
  183. package/src/runtime/agent/orchestrator/tools/patch.mjs +36 -2959
  184. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +1 -23
  185. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +10 -74
  186. package/src/runtime/agent/orchestrator/tools/shell-powershell.mjs +77 -0
  187. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +2 -4
  188. package/src/runtime/agent/orchestrator/tools/shell-state.mjs +154 -0
  189. package/src/runtime/channels/backends/discord-access.mjs +32 -0
  190. package/src/runtime/channels/backends/discord-attachments.mjs +65 -0
  191. package/src/runtime/channels/backends/discord-gateway.mjs +233 -0
  192. package/src/runtime/channels/backends/discord.mjs +12 -292
  193. package/src/runtime/channels/index.mjs +241 -894
  194. package/src/runtime/channels/lib/backend-dispatch.mjs +44 -0
  195. package/src/runtime/channels/lib/boot-profile.mjs +23 -0
  196. package/src/runtime/channels/lib/crash-log.mjs +106 -0
  197. package/src/runtime/channels/lib/event-pipeline.mjs +18 -1
  198. package/src/runtime/channels/lib/event-queue.mjs +63 -4
  199. package/src/runtime/channels/lib/inbound-routing.mjs +111 -0
  200. package/src/runtime/channels/lib/index-drop-trace.mjs +72 -0
  201. package/src/runtime/channels/lib/output-forwarder.mjs +9 -1
  202. package/src/runtime/channels/lib/owner-heartbeat.mjs +75 -0
  203. package/src/runtime/channels/lib/parent-bridge.mjs +88 -0
  204. package/src/runtime/channels/lib/runtime-paths.mjs +14 -4
  205. package/src/runtime/channels/lib/session-discovery.mjs +56 -4
  206. package/src/runtime/channels/lib/telegram-format.mjs +19 -22
  207. package/src/runtime/channels/lib/tool-dispatch.mjs +158 -0
  208. package/src/runtime/channels/lib/tool-format.mjs +1 -1
  209. package/src/runtime/channels/lib/transcript-discovery.mjs +4 -4
  210. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +6 -3
  211. package/src/runtime/channels/lib/voice-transcription.mjs +179 -0
  212. package/src/runtime/channels/lib/webhook/deliveries.mjs +312 -0
  213. package/src/runtime/channels/lib/webhook/log.mjs +42 -0
  214. package/src/runtime/channels/lib/webhook/ngrok.mjs +181 -0
  215. package/src/runtime/channels/lib/webhook/signature.mjs +60 -0
  216. package/src/runtime/channels/lib/webhook.mjs +36 -570
  217. package/src/runtime/channels/lib/whisper-language.mjs +42 -0
  218. package/src/runtime/channels/tool-defs.mjs +11 -130
  219. package/src/runtime/memory/index.mjs +258 -2050
  220. package/src/runtime/memory/lib/core-memory-store.mjs +351 -1
  221. package/src/runtime/memory/lib/cycle-llm-adapters.mjs +58 -0
  222. package/src/runtime/memory/lib/cycle-scheduler.mjs +497 -0
  223. package/src/runtime/memory/lib/cycle-signatures.mjs +34 -0
  224. package/src/runtime/memory/lib/embedding-warmup.mjs +58 -0
  225. package/src/runtime/memory/lib/http-wire.mjs +57 -0
  226. package/src/runtime/memory/lib/memory-config-flags.mjs +91 -0
  227. package/src/runtime/memory/lib/memory-cycle.mjs +1 -1
  228. package/src/runtime/memory/lib/memory-cycle2-gate.mjs +515 -0
  229. package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +324 -0
  230. package/src/runtime/memory/lib/memory-cycle2-shared.mjs +18 -0
  231. package/src/runtime/memory/lib/memory-cycle2.mjs +72 -837
  232. package/src/runtime/memory/lib/memory-embed.mjs +149 -0
  233. package/src/runtime/memory/lib/memory-process-lock.mjs +162 -0
  234. package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +24 -0
  235. package/src/runtime/memory/lib/memory-recall-store.mjs +22 -2
  236. package/src/runtime/memory/lib/memory-retrievers.mjs +8 -0
  237. package/src/runtime/memory/lib/memory.mjs +20 -0
  238. package/src/runtime/memory/lib/pg/supervisor.mjs +1 -1
  239. package/src/runtime/memory/lib/promotion-fingerprint.mjs +50 -0
  240. package/src/runtime/memory/lib/query-handlers.mjs +780 -0
  241. package/src/runtime/memory/lib/recall-format.mjs +238 -0
  242. package/src/runtime/memory/lib/runtime-fetcher.mjs +8 -3
  243. package/src/runtime/memory/lib/transcript-ingest.mjs +425 -0
  244. package/src/runtime/memory/tool-defs.mjs +6 -14
  245. package/src/runtime/search/lib/http-fetch.mjs +274 -0
  246. package/src/runtime/search/lib/ssrf-guard.mjs +333 -0
  247. package/src/runtime/search/lib/web-tools.mjs +24 -602
  248. package/src/runtime/shared/abort-controller.mjs +1 -1
  249. package/src/runtime/shared/atomic-file.mjs +26 -1
  250. package/src/runtime/shared/background-tasks.mjs +2 -3
  251. package/src/runtime/shared/buffered-appender.mjs +149 -0
  252. package/src/runtime/shared/launcher-control.mjs +2 -2
  253. package/src/runtime/shared/task-notification-envelope.mjs +98 -0
  254. package/src/runtime/shared/tool-execution-contract.mjs +2 -2
  255. package/src/runtime/shared/tool-primitives.mjs +308 -0
  256. package/src/runtime/shared/tool-result-summary.mjs +515 -0
  257. package/src/runtime/shared/tool-surface.mjs +80 -898
  258. package/src/runtime/shared/transcript-writer.mjs +52 -2
  259. package/src/runtime/shared/update-checker.mjs +7 -4
  260. package/src/session-runtime/config-helpers.mjs +291 -0
  261. package/src/session-runtime/config-lifecycle.mjs +232 -0
  262. package/src/session-runtime/cwd-plugins.mjs +226 -0
  263. package/src/session-runtime/effort.mjs +128 -0
  264. package/src/session-runtime/fs-utils.mjs +10 -0
  265. package/src/session-runtime/mcp-glue.mjs +177 -0
  266. package/src/session-runtime/model-capabilities.mjs +130 -0
  267. package/src/session-runtime/model-recency.mjs +111 -0
  268. package/src/session-runtime/native-search.mjs +247 -0
  269. package/src/session-runtime/output-styles.mjs +126 -0
  270. package/src/session-runtime/plugin-mcp.mjs +114 -0
  271. package/src/session-runtime/prewarm.mjs +142 -0
  272. package/src/session-runtime/provider-models.mjs +278 -0
  273. package/src/session-runtime/provider-usage.mjs +120 -0
  274. package/src/session-runtime/quick-model-rows.mjs +170 -0
  275. package/src/session-runtime/quick-search-models.mjs +46 -0
  276. package/src/session-runtime/session-hooks.mjs +93 -0
  277. package/src/session-runtime/session-text.mjs +100 -0
  278. package/src/session-runtime/settings-api.mjs +319 -0
  279. package/src/session-runtime/statusline-route.mjs +35 -0
  280. package/src/session-runtime/tool-catalog.mjs +720 -0
  281. package/src/session-runtime/tool-defs.mjs +84 -0
  282. package/src/session-runtime/warmup-schedulers.mjs +201 -0
  283. package/src/session-runtime/workflow.mjs +358 -0
  284. package/src/standalone/agent-tool/helpers.mjs +237 -0
  285. package/src/standalone/agent-tool/notify.mjs +107 -0
  286. package/src/standalone/agent-tool/provider-init.mjs +143 -0
  287. package/src/standalone/agent-tool/render.mjs +152 -0
  288. package/src/standalone/agent-tool/tool-def.mjs +55 -0
  289. package/src/standalone/agent-tool.mjs +155 -677
  290. package/src/standalone/channel-worker.mjs +7 -9
  291. package/src/standalone/explore-tool.mjs +40 -12
  292. package/src/standalone/hook-bus/config.mjs +207 -0
  293. package/src/standalone/hook-bus/constants.mjs +90 -0
  294. package/src/standalone/hook-bus/handlers.mjs +481 -0
  295. package/src/standalone/hook-bus/payload.mjs +31 -0
  296. package/src/standalone/hook-bus/rules.mjs +77 -0
  297. package/src/standalone/hook-bus.mjs +110 -746
  298. package/src/standalone/memory-runtime-proxy.mjs +7 -0
  299. package/src/standalone/opencode-go-login.mjs +125 -0
  300. package/src/standalone/provider-admin.mjs +15 -19
  301. package/src/standalone/usage-dashboard.mjs +3 -1
  302. package/src/tui/App.jsx +1163 -7571
  303. package/src/tui/app/app-format.mjs +206 -0
  304. package/src/tui/app/channel-pickers.mjs +510 -0
  305. package/src/tui/app/clipboard.mjs +67 -0
  306. package/src/tui/app/core-memory-picker.mjs +210 -0
  307. package/src/tui/app/extension-pickers.mjs +506 -0
  308. package/src/tui/app/input-parsers.mjs +193 -0
  309. package/src/tui/app/maintenance-pickers.mjs +324 -0
  310. package/src/tui/app/model-options.mjs +330 -0
  311. package/src/tui/app/model-picker.mjs +365 -0
  312. package/src/tui/app/onboarding-steps.mjs +400 -0
  313. package/src/tui/app/project-picker.mjs +247 -0
  314. package/src/tui/app/provider-setup-picker.mjs +580 -0
  315. package/src/tui/app/resume-picker.mjs +55 -0
  316. package/src/tui/app/route-pickers.mjs +419 -0
  317. package/src/tui/app/settings-picker.mjs +490 -0
  318. package/src/tui/app/slash-commands.mjs +101 -0
  319. package/src/tui/app/slash-dispatch.mjs +427 -0
  320. package/src/tui/app/text-layout.mjs +46 -0
  321. package/src/tui/app/theme-effort-pickers.mjs +154 -0
  322. package/src/tui/app/transcript-window.mjs +671 -0
  323. package/src/tui/app/use-mouse-input.mjs +460 -0
  324. package/src/tui/app/use-prompt-handlers.mjs +310 -0
  325. package/src/tui/app/use-transcript-scroll.mjs +510 -0
  326. package/src/tui/app/use-transcript-window.mjs +589 -0
  327. package/src/tui/components/ConfirmBar.jsx +1 -1
  328. package/src/tui/components/Picker.jsx +32 -4
  329. package/src/tui/components/PromptInput.jsx +259 -80
  330. package/src/tui/components/SlashCommandPalette.jsx +8 -1
  331. package/src/tui/components/StatusLine.jsx +63 -12
  332. package/src/tui/components/TextEntryPanel.jsx +11 -0
  333. package/src/tui/components/ToolExecution.jsx +56 -588
  334. package/src/tui/components/TranscriptItem.jsx +105 -0
  335. package/src/tui/components/UsagePanel.jsx +18 -4
  336. package/src/tui/components/prompt-input/edit-helpers.mjs +72 -0
  337. package/src/tui/components/prompt-input/voice-indicator.mjs +39 -0
  338. package/src/tui/components/tool-execution/ResultBody.jsx +56 -0
  339. package/src/tui/components/tool-execution/surface-detail.mjs +405 -0
  340. package/src/tui/components/tool-execution/text-format.mjs +161 -0
  341. package/src/tui/components/tool-output-format.mjs +2 -2
  342. package/src/tui/display-width.mjs +20 -3
  343. package/src/tui/dist/index.mjs +18034 -17188
  344. package/src/tui/engine/agent-envelope.mjs +296 -0
  345. package/src/tui/engine/agent-job-feed.mjs +133 -0
  346. package/src/tui/engine/boot-profile.mjs +21 -0
  347. package/src/tui/engine/labels.mjs +67 -0
  348. package/src/tui/engine/notice-text.mjs +112 -0
  349. package/src/tui/engine/notification-plan.mjs +76 -0
  350. package/src/tui/engine/queue-helpers.mjs +161 -0
  351. package/src/tui/engine/render-timing.mjs +17 -0
  352. package/src/tui/engine/session-stats.mjs +46 -0
  353. package/src/tui/engine/tool-approval.mjs +94 -0
  354. package/src/tui/engine/tool-call-fields.mjs +23 -0
  355. package/src/tui/engine/tool-card-results.mjs +234 -0
  356. package/src/tui/engine/tool-result-status.mjs +135 -0
  357. package/src/tui/engine/tool-result-text.mjs +126 -0
  358. package/src/tui/engine.mjs +405 -1385
  359. package/src/tui/figures.mjs +5 -0
  360. package/src/tui/index.jsx +105 -0
  361. package/src/tui/input-editing.mjs +60 -10
  362. package/src/tui/keyboard-protocol.mjs +2 -2
  363. package/src/tui/lib/voice-recorder.mjs +35 -19
  364. package/src/tui/markdown/format-token.mjs +11 -9
  365. package/src/tui/paste-attachments.mjs +38 -0
  366. package/src/tui/statusline-ansi-bridge.mjs +11 -3
  367. package/src/tui/theme.mjs +6 -0
  368. package/src/tui/themes/base.mjs +2 -2
  369. package/src/tui/themes/kanagawa.mjs +4 -4
  370. package/src/tui/themes/teal.mjs +4 -5
  371. package/src/tui/themes/utils.mjs +1 -1
  372. package/src/ui/statusline-agents.mjs +213 -0
  373. package/src/ui/statusline-format.mjs +146 -0
  374. package/src/ui/statusline-segments.mjs +148 -0
  375. package/src/ui/statusline.mjs +77 -462
  376. package/src/ui/tool-card.mjs +0 -1
  377. package/src/vendor/statusline/bin/statusline-route.mjs +15 -2
  378. package/src/workflows/default/WORKFLOW.md +16 -9
  379. package/src/workflows/sequential/WORKFLOW.md +16 -11
  380. package/src/workflows/solo/WORKFLOW.md +5 -1
  381. package/vendor/ink/build/display-width.js +19 -3
  382. package/vendor/ink/build/ink.js +103 -6
  383. package/vendor/ink/build/log-update.js +17 -3
  384. package/vendor/ink/build/wrap-text.js +125 -0
  385. package/scripts/_test-folder-dialog.mjs +0 -30
  386. package/scripts/fix-brief-fn.mjs +0 -35
  387. package/scripts/fix-format-tool-surface.mjs +0 -24
  388. package/scripts/fix-tool-exec-visible.mjs +0 -42
  389. package/scripts/patch-agent-brief.mjs +0 -48
  390. package/scripts/patch-app.mjs +0 -21
  391. package/scripts/patch-app2.mjs +0 -18
  392. package/scripts/patch-dist-brief.mjs +0 -96
  393. package/scripts/patch-tool-exec.mjs +0 -70
  394. package/src/examples/schedules/SCHEDULE.example.md +0 -32
  395. package/src/examples/webhooks/WEBHOOK.example.md +0 -40
  396. package/src/runtime/agent/orchestrator/session/manager.reactive-persist.test.mjs +0 -107
  397. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.test.mjs +0 -143
  398. package/src/runtime/agent/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -285
  399. package/src/runtime/agent/orchestrator/tools/builtin/open-config-tool.mjs +0 -26
  400. package/src/runtime/shared/channel-notification-routing.test.mjs +0 -45
  401. package/src/runtime/shared/tool-execution-contract.test.mjs +0 -183
  402. package/src/standalone/agent-task-status.test.mjs +0 -76
  403. package/src/tui/components/tool-output-format.test.mjs +0 -399
  404. package/src/tui/display-width.test.mjs +0 -35
  405. package/src/tui/engine-runtime-notification.test.mjs +0 -115
  406. package/src/tui/engine-tool-result-text.test.mjs +0 -75
  407. package/src/tui/markdown/format-token.test.mjs +0 -354
  408. package/src/tui/markdown/render-ansi.test.mjs +0 -108
  409. package/src/tui/markdown/stream-fence.test.mjs +0 -26
  410. package/src/tui/markdown/streaming-markdown.test.mjs +0 -70
  411. package/src/tui/prompt-history-store.test.mjs +0 -52
  412. package/src/tui/statusline-ansi-bridge.test.mjs +0 -159
  413. package/src/tui/transcript-tool-failures.test.mjs +0 -111
  414. package/src/ui/markdown.test.mjs +0 -70
  415. package/src/ui/statusline-context-label.test.mjs +0 -15
  416. package/src/vendor/statusline/bin/statusline-lib.mjs +0 -186
  417. package/src/vendor/statusline/bin/statusline-route.test.mjs +0 -80
@@ -0,0 +1,319 @@
1
+ // settings-api.mjs — pure settings delegate methods extracted from the main
2
+ // runtime API object in mixdog-session-runtime.mjs. These are the small
3
+ // config/settings members with NO heavy closure deps beyond the injected
4
+ // helpers; the returned object is SPREAD into the facade's API object so the
5
+ // external surface stays byte-identical. Methods that reference `this.*`
6
+ // resolve against the spread target, so cross-member calls (e.g.
7
+ // setProfile -> this.getProfile) keep working when spread into the facade.
8
+
9
+ export function createSettingsApi({
10
+ // config accessors / mutable state
11
+ getConfig,
12
+ getRoute,
13
+ getSession,
14
+ getRemoteEnabled,
15
+ // config-lifecycle
16
+ saveConfigAndAdopt,
17
+ scheduleBackendSave,
18
+ // normalizers / helpers
19
+ cfgMod,
20
+ hasOwn,
21
+ normalizeAutoClearConfig,
22
+ autoClearIdleMsForProvider,
23
+ normalizeCompactionConfig,
24
+ normalizeCompactTypeSetting,
25
+ normalizeSystemShellConfig,
26
+ normalizeSystemShellCommand,
27
+ setConfiguredShell,
28
+ setRecapEnabledInConfig,
29
+ setModuleEnabledInConfig,
30
+ summarizeWorkflowRoutes,
31
+ parseDurationMs,
32
+ formatDurationMs,
33
+ localPackageVersion,
34
+ // state getters / feature flags
35
+ memoryEnabled,
36
+ recapEnabledFn,
37
+ channelsEnabled,
38
+ autoUpdateEnabled,
39
+ getUpdateCheckState,
40
+ getUpdateProcessState,
41
+ // side-effect callbacks
42
+ invalidateContextStatusCache,
43
+ invalidatePreSessionToolSurface,
44
+ scheduleChannelStart,
45
+ channels,
46
+ clearChannelStartTimer,
47
+ checkForUpdateInternal,
48
+ runUpdateNowInternal,
49
+ reloadChannelsSoon,
50
+ ONBOARDING_VERSION,
51
+ // channel-admin token delegates
52
+ saveDiscordToken,
53
+ forgetDiscordToken,
54
+ saveTelegramToken,
55
+ forgetTelegramToken,
56
+ saveWebhookAuthtoken,
57
+ forgetWebhookAuthtoken,
58
+ setBackend,
59
+ }) {
60
+ return {
61
+ getOnboardingStatus() {
62
+ const nextConfig = getConfig();
63
+ return {
64
+ completed: nextConfig?.onboarding?.completed === true,
65
+ version: nextConfig?.onboarding?.version || 0,
66
+ default: nextConfig?.default || null,
67
+ workflowRoutes: summarizeWorkflowRoutes(nextConfig),
68
+ };
69
+ },
70
+ // Mark onboarding as done WITHOUT touching routes/agents/provider. Used by
71
+ // the TUI "skip" (Esc) path so the wizard doesn't reappear next launch,
72
+ // while leaving any existing config routes untouched.
73
+ skipOnboarding() {
74
+ const config = getConfig();
75
+ const nextConfig = { ...config };
76
+ nextConfig.onboarding = {
77
+ ...(nextConfig.onboarding || {}),
78
+ completed: true,
79
+ version: ONBOARDING_VERSION,
80
+ completedAt: new Date().toISOString(),
81
+ skipped: true,
82
+ };
83
+ saveConfigAndAdopt(nextConfig);
84
+ return this.getOnboardingStatus();
85
+ },
86
+ getAutoClear() {
87
+ const config = getConfig();
88
+ const route = getRoute();
89
+ const normalized = normalizeAutoClearConfig(config.autoClear);
90
+ const provider = route?.provider || null;
91
+ const providerDefault = autoClearIdleMsForProvider(provider);
92
+ const idleMs = normalized.custom ? normalized.idleMs : providerDefault;
93
+ return {
94
+ enabled: normalized.enabled,
95
+ idleMs,
96
+ custom: normalized.custom,
97
+ providerDefault,
98
+ provider,
99
+ };
100
+ },
101
+ // --- User profile (/profile statusline command) ---------------------
102
+ // getProfile returns the normalized { title, language } plus the resolved
103
+ // language catalog entry and the full language list for the picker UI.
104
+ getProfile() {
105
+ const config = getConfig();
106
+ const profile = cfgMod.normalizeProfileConfig(config.profile);
107
+ return {
108
+ ...profile,
109
+ languageEntry: cfgMod.profileLanguageEntry(profile.language),
110
+ languages: cfgMod.PROFILE_LANGUAGES,
111
+ };
112
+ },
113
+ // setProfile patches title and/or language and persists. Unknown language
114
+ // ids normalize back to 'system'. Prompt-side injection is wired separately
115
+ // (composeSystemPrompt) — this only owns the stored value.
116
+ setProfile(input = {}) {
117
+ const config = getConfig();
118
+ const current = cfgMod.normalizeProfileConfig(config.profile);
119
+ const next = { ...current };
120
+ if (hasOwn(input, 'title') || hasOwn(input, 'name')) {
121
+ next.title = input.title ?? input.name ?? '';
122
+ }
123
+ if (hasOwn(input, 'language') || hasOwn(input, 'lang')) {
124
+ next.language = input.language ?? input.lang ?? 'system';
125
+ }
126
+ const normalized = cfgMod.normalizeProfileConfig(next);
127
+ saveConfigAndAdopt({ ...config, profile: normalized });
128
+ return this.getProfile();
129
+ },
130
+ getCompactionSettings() {
131
+ const config = getConfig();
132
+ return normalizeCompactionConfig(config.compaction, { memoryEnabled: memoryEnabled() });
133
+ },
134
+ setCompactionSettings(input = {}) {
135
+ const config = getConfig();
136
+ const current = normalizeCompactionConfig(config.compaction, { memoryEnabled: memoryEnabled() });
137
+ const next = { ...current };
138
+ if (hasOwn(input, 'auto')) next.auto = input.auto !== false;
139
+ if (hasOwn(input, 'enabled')) next.auto = input.enabled !== false;
140
+ if (hasOwn(input, 'type') || hasOwn(input, 'compactType') || hasOwn(input, 'compact_type')) {
141
+ const requestedType = input.type ?? input.compactType ?? input.compact_type;
142
+ const compactType = normalizeCompactTypeSetting(requestedType, current.compactType || current.type || 'semantic');
143
+ next.type = compactType;
144
+ next.compactType = compactType;
145
+ }
146
+ const nextConfig = { ...config };
147
+ nextConfig.compaction = normalizeCompactionConfig(next, { memoryEnabled: memoryEnabled() });
148
+ saveConfigAndAdopt(nextConfig);
149
+ const config2 = getConfig();
150
+ const session = getSession();
151
+ if (session) {
152
+ session.compaction = {
153
+ ...(session.compaction || {}),
154
+ ...normalizeCompactionConfig(config2.compaction, { memoryEnabled: memoryEnabled() }),
155
+ };
156
+ }
157
+ invalidateContextStatusCache();
158
+ return normalizeCompactionConfig(config2.compaction, { memoryEnabled: memoryEnabled() });
159
+ },
160
+ // Recap toggle: user-facing switch that gates ONLY the background memory
161
+ // cycles (1/2/3). The memory module (transcript watcher/ingest, on-demand
162
+ // recall/fasttrack drains) is always-on. Persisted via the same
163
+ // saveConfigAndAdopt path as compaction/autoClear. The memory daemon
164
+ // re-reads recap from the agent config section each cycle tick, so toggling
165
+ // takes effect without a restart (no memory-service stop/start here).
166
+ getRecapSettings() {
167
+ return { enabled: recapEnabledFn() };
168
+ },
169
+ setRecapEnabled(enabled) {
170
+ const config = getConfig();
171
+ const nextConfig = setRecapEnabledInConfig({ ...config }, enabled !== false);
172
+ saveConfigAndAdopt(nextConfig);
173
+ invalidatePreSessionToolSurface();
174
+ invalidateContextStatusCache();
175
+ return this.getRecapSettings();
176
+ },
177
+ // Thin aliases kept for the current TUI callsites (updated separately).
178
+ // enabled here reflects the recap toggle; memory itself is always-on.
179
+ getMemorySettings() {
180
+ return {
181
+ enabled: recapEnabledFn(),
182
+ compactFastTrackAvailable: true,
183
+ };
184
+ },
185
+ async setMemoryEnabled(enabled) {
186
+ return this.setRecapEnabled(enabled);
187
+ },
188
+ getChannelSettings(options = {}) {
189
+ return {
190
+ enabled: channelsEnabled(),
191
+ ...(options?.includeStatus === false ? {} : { status: channels.status() }),
192
+ };
193
+ },
194
+ async setChannelsEnabled(enabled) {
195
+ const config = getConfig();
196
+ const nextConfig = setModuleEnabledInConfig({ ...config }, 'channels', enabled !== false);
197
+ saveConfigAndAdopt(nextConfig);
198
+ if (!channelsEnabled()) {
199
+ clearChannelStartTimer();
200
+ await channels.stop('settings-disabled', { waitForExit: false }).catch(() => {});
201
+ } else {
202
+ // Enabling channels in settings only boots the worker when this session
203
+ // is in remote mode; otherwise the toggle just persists config.
204
+ if (getRemoteEnabled()) scheduleChannelStart(0);
205
+ }
206
+ invalidatePreSessionToolSurface();
207
+ return this.getChannelSettings();
208
+ },
209
+ getSystemShell() {
210
+ const config = getConfig();
211
+ return normalizeSystemShellConfig(config.shell);
212
+ },
213
+ setSystemShell(input = {}) {
214
+ const config = getConfig();
215
+ const command = normalizeSystemShellCommand(typeof input === 'string' ? input : input?.command);
216
+ saveConfigAndAdopt({
217
+ ...config,
218
+ shell: command ? { ...(config.shell || {}), command } : {},
219
+ });
220
+ setConfiguredShell(command);
221
+ return normalizeSystemShellConfig(getConfig().shell);
222
+ },
223
+ setAutoClear(input = {}) {
224
+ const config = getConfig();
225
+ const current = normalizeAutoClearConfig(config.autoClear);
226
+ const next = { ...current };
227
+ if (hasOwn(input, 'enabled')) next.enabled = input.enabled !== false;
228
+ if (input.reset === true || (hasOwn(input, 'idleMs') && input.idleMs == null)) {
229
+ next.idleMs = null;
230
+ } else if (hasOwn(input, 'idleMs')) {
231
+ const idleMs = Number(input.idleMs);
232
+ if (!Number.isFinite(idleMs) || idleMs <= 0) throw new Error('autoclear idleMs must be a positive number');
233
+ next.idleMs = Math.max(60_000, Math.round(idleMs));
234
+ }
235
+ if (hasOwn(input, 'duration')) {
236
+ const idleMs = parseDurationMs(input.duration);
237
+ if (!idleMs) throw new Error('usage: /autoclear [on|off|status|<minutes|1h|90m>]');
238
+ next.idleMs = idleMs;
239
+ if (!hasOwn(input, 'enabled')) next.enabled = true;
240
+ }
241
+ saveConfigAndAdopt({ ...config, autoClear: next });
242
+ const resolved = this.getAutoClear();
243
+ return { ...resolved, label: formatDurationMs(resolved.idleMs) };
244
+ },
245
+ getUpdateSettings() {
246
+ const updateCheckState = getUpdateCheckState();
247
+ return {
248
+ autoUpdate: autoUpdateEnabled(),
249
+ currentVersion: updateCheckState.currentVersion || localPackageVersion(),
250
+ latestVersion: updateCheckState.latestVersion,
251
+ updateAvailable: updateCheckState.updateAvailable,
252
+ lastCheckedAt: updateCheckState.lastCheckedAt,
253
+ };
254
+ },
255
+ setAutoUpdate(enabled) {
256
+ const config = getConfig();
257
+ saveConfigAndAdopt({
258
+ ...config,
259
+ update: { ...(config.update || {}), auto: enabled === true },
260
+ });
261
+ return this.getUpdateSettings();
262
+ },
263
+ async checkForUpdate(options = {}) {
264
+ await checkForUpdateInternal({ force: options?.force === true });
265
+ return this.getUpdateSettings();
266
+ },
267
+ async runUpdateNow() {
268
+ const state = await runUpdateNowInternal();
269
+ return { ok: state.phase === 'installed', ...state };
270
+ },
271
+ getUpdateStatus() {
272
+ return { ...getUpdateProcessState() };
273
+ },
274
+ saveDiscordToken(token) {
275
+ const result = saveDiscordToken(token);
276
+ reloadChannelsSoon();
277
+ return result;
278
+ },
279
+ forgetDiscordToken() {
280
+ const result = forgetDiscordToken();
281
+ reloadChannelsSoon();
282
+ return result;
283
+ },
284
+ saveTelegramToken(token) {
285
+ const result = saveTelegramToken(token);
286
+ reloadChannelsSoon();
287
+ return result;
288
+ },
289
+ forgetTelegramToken() {
290
+ const result = forgetTelegramToken();
291
+ reloadChannelsSoon();
292
+ return result;
293
+ },
294
+ setBackend(name) {
295
+ // Validate synchronously (same contract as before: bad input throws on
296
+ // this call so the TUI's try/catch can react immediately). The actual
297
+ // channels-section file read-modify-write is the hitch source on the
298
+ // settings-toggle key handler, so defer it through the same debounce
299
+ // pattern as saveConfigAndAdopt/flushConfigSave instead of writing to
300
+ // disk synchronously inside the key handler.
301
+ const value = String(name || '').trim();
302
+ if (value !== 'discord' && value !== 'telegram') {
303
+ throw new Error('backend must be discord or telegram');
304
+ }
305
+ scheduleBackendSave(value);
306
+ return { ok: true, backend: value };
307
+ },
308
+ saveWebhookAuthtoken(token) {
309
+ const result = saveWebhookAuthtoken(token);
310
+ reloadChannelsSoon();
311
+ return result;
312
+ },
313
+ forgetWebhookAuthtoken() {
314
+ const result = forgetWebhookAuthtoken();
315
+ reloadChannelsSoon();
316
+ return result;
317
+ },
318
+ };
319
+ }
@@ -0,0 +1,35 @@
1
+ // Statusline route serialization. Pure helpers.
2
+ import { clean, hasOwn } from './session-text.mjs';
3
+
4
+ export function routeForStatusline(route) {
5
+ const out = {
6
+ mode: 'fixed',
7
+ defaultProvider: route.provider,
8
+ defaultModel: route.model,
9
+ };
10
+ const preset = route.preset || {};
11
+ if (preset.id) out.presetId = preset.id;
12
+ if (preset.name) out.presetName = preset.name;
13
+ // Prefer the preset's curated label, then the route's resolved model display
14
+ // (set by refreshRouteEffort from the live/offline catalog). Without the
15
+ // route fallback, a preset-less direct model (e.g. claude-fable-5) reaches
16
+ // the statusline with no display and renders as the raw id.
17
+ const modelDisplay = clean(preset.modelDisplay) || clean(route.modelDisplay);
18
+ if (modelDisplay) out.modelDisplay = modelDisplay;
19
+ if (route.fast === true || route.fast === false) out.fast = route.fast;
20
+ else if (preset.fast === true || preset.fast === false) out.fast = preset.fast;
21
+ if (route.effectiveEffort) {
22
+ out.effort = route.effectiveEffort;
23
+ out.displayEffort = route.effectiveEffort;
24
+ } else if (hasOwn(route, 'effort')) {
25
+ delete out.effort;
26
+ delete out.displayEffort;
27
+ }
28
+ return out;
29
+ }
30
+
31
+ export function writeStatuslineRoute(statusRoutes, session, route) {
32
+ if (!session?.id || !route) return;
33
+ const clientHostPid = session?.clientHostPid || process.pid;
34
+ statusRoutes?.writeGatewaySessionRoute?.(session.id, routeForStatusline(route), { clientHostPid });
35
+ }