mixdog 0.7.18 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (844) hide show
  1. package/README.md +37 -331
  2. package/package.json +67 -99
  3. package/scripts/boot-smoke.mjs +94 -0
  4. package/scripts/build-tui.mjs +52 -0
  5. package/scripts/compact-smoke.mjs +199 -0
  6. package/scripts/lead-workflow-smoke.mjs +598 -0
  7. package/scripts/live-worker-smoke.mjs +239 -0
  8. package/scripts/output-style-smoke.mjs +101 -0
  9. package/scripts/smoke-loop-report.mjs +221 -0
  10. package/scripts/smoke-loop.mjs +201 -0
  11. package/scripts/smoke.mjs +113 -0
  12. package/scripts/tool-failures.mjs +143 -0
  13. package/scripts/tool-smoke.mjs +456 -0
  14. package/src/agents/debugger/AGENT.md +3 -0
  15. package/src/agents/debugger/agent.json +6 -0
  16. package/src/agents/explore/AGENT.md +4 -0
  17. package/src/agents/explore/agent.json +6 -0
  18. package/src/agents/heavy-worker/AGENT.md +3 -0
  19. package/src/agents/heavy-worker/agent.json +6 -0
  20. package/src/agents/maintainer/AGENT.md +3 -0
  21. package/src/agents/maintainer/agent.json +6 -0
  22. package/src/agents/reviewer/AGENT.md +3 -0
  23. package/src/agents/reviewer/agent.json +6 -0
  24. package/src/agents/scheduler-task.md +3 -0
  25. package/src/agents/web-researcher/AGENT.md +3 -0
  26. package/src/agents/web-researcher/agent.json +6 -0
  27. package/src/agents/webhook-handler.md +3 -0
  28. package/src/agents/worker/AGENT.md +3 -0
  29. package/src/agents/worker/agent.json +6 -0
  30. package/src/app.mjs +90 -0
  31. package/src/cli.mjs +11 -0
  32. package/src/defaults/hidden-roles.json +72 -0
  33. package/src/defaults/mixdog-config.template.json +15 -0
  34. package/src/hooks/lib/permission-evaluator.cjs +488 -0
  35. package/src/hooks/lib/settings-loader.cjs +112 -0
  36. package/src/lib/keychain-cjs.cjs +332 -0
  37. package/src/lib/plugin-paths.cjs +28 -0
  38. package/src/lib/rules-builder.cjs +315 -0
  39. package/src/mixdog-session-runtime.mjs +3704 -0
  40. package/src/output-styles/default.md +38 -0
  41. package/src/output-styles/extreme-simple.md +17 -0
  42. package/src/output-styles/simple.md +17 -0
  43. package/src/repl.mjs +322 -0
  44. package/src/rules/bridge/00-common.md +5 -0
  45. package/src/rules/bridge/20-skip-protocol.md +11 -0
  46. package/src/rules/bridge/30-explorer.md +4 -0
  47. package/src/rules/bridge/40-cycle1-agent.md +28 -0
  48. package/src/rules/bridge/41-cycle2-agent.md +59 -0
  49. package/src/rules/lead/00-tool-lead.md +5 -0
  50. package/src/rules/lead/01-general.md +5 -0
  51. package/src/rules/lead/02-channels.md +3 -0
  52. package/src/rules/lead/04-workflow.md +12 -0
  53. package/src/rules/shared/00-language.md +3 -0
  54. package/src/rules/shared/01-tool.md +3 -0
  55. package/src/runtime/agent/orchestrator/bridge-trace.mjs +814 -0
  56. package/src/runtime/agent/orchestrator/cache-mtime.mjs +60 -0
  57. package/src/runtime/agent/orchestrator/config.mjs +446 -0
  58. package/src/runtime/agent/orchestrator/context/collect.mjs +796 -0
  59. package/src/runtime/agent/orchestrator/dispatch-persist.mjs +417 -0
  60. package/src/runtime/agent/orchestrator/internal-roles.mjs +188 -0
  61. package/src/runtime/agent/orchestrator/internal-tools.mjs +88 -0
  62. package/src/runtime/agent/orchestrator/mcp/client.mjs +345 -0
  63. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2104 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +784 -0
  65. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +341 -0
  66. package/src/runtime/agent/orchestrator/providers/gemini.mjs +1679 -0
  67. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +959 -0
  68. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +213 -0
  69. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +38 -0
  70. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +471 -0
  71. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +615 -0
  72. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +808 -0
  73. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +1719 -0
  74. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2587 -0
  75. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +1953 -0
  76. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +136 -0
  77. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +317 -0
  78. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +109 -0
  79. package/src/runtime/agent/orchestrator/providers/registry.mjs +247 -0
  80. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +332 -0
  81. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +11 -0
  82. package/src/runtime/agent/orchestrator/providers/trace-utils.mjs +50 -0
  83. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
  84. package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +318 -0
  85. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +367 -0
  86. package/src/runtime/agent/orchestrator/session/compact.mjs +882 -0
  87. package/src/runtime/agent/orchestrator/session/context-utils.mjs +233 -0
  88. package/src/runtime/agent/orchestrator/session/loop.mjs +2320 -0
  89. package/src/runtime/agent/orchestrator/session/manager.mjs +2960 -0
  90. package/src/runtime/agent/orchestrator/session/result-classification.mjs +65 -0
  91. package/src/runtime/agent/orchestrator/session/store.mjs +663 -0
  92. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +166 -0
  93. package/src/runtime/agent/orchestrator/smart-bridge/bridge-llm.mjs +339 -0
  94. package/src/runtime/agent/orchestrator/smart-bridge/cache-strategy.mjs +419 -0
  95. package/src/runtime/agent/orchestrator/stall-policy.mjs +227 -0
  96. package/src/runtime/agent/orchestrator/tool-loop-guard.mjs +235 -0
  97. package/src/runtime/agent/orchestrator/tools/bash-session.mjs +723 -0
  98. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +389 -0
  99. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +637 -0
  100. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +165 -0
  101. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +104 -0
  102. package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +194 -0
  103. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +596 -0
  104. package/src/runtime/agent/orchestrator/tools/builtin/native-edit-runner.mjs +110 -0
  105. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +153 -0
  106. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
  107. package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +189 -0
  108. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +731 -0
  109. package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +168 -0
  110. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
  111. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +465 -0
  112. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +160 -0
  113. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +982 -0
  114. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1087 -0
  115. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +231 -0
  116. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +223 -0
  117. package/src/runtime/agent/orchestrator/tools/builtin.mjs +478 -0
  118. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
  119. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4102 -0
  120. package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +323 -0
  121. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +154 -0
  122. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +26 -0
  123. package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +143 -0
  124. package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +18 -0
  125. package/src/runtime/agent/orchestrator/tools/patch.mjs +2772 -0
  126. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +114 -0
  127. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +880 -0
  128. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +312 -0
  129. package/src/runtime/channels/backends/discord.mjs +781 -0
  130. package/src/runtime/channels/data/voice-runtime-manifest.json +138 -0
  131. package/src/runtime/channels/index.mjs +3309 -0
  132. package/src/runtime/channels/lib/config.mjs +285 -0
  133. package/src/runtime/channels/lib/drop-trace.mjs +71 -0
  134. package/src/runtime/channels/lib/event-pipeline.mjs +81 -0
  135. package/src/runtime/channels/lib/holidays.mjs +138 -0
  136. package/src/runtime/channels/lib/hook-pipe-server.mjs +671 -0
  137. package/src/runtime/channels/lib/output-forwarder.mjs +765 -0
  138. package/src/runtime/channels/lib/runtime-paths.mjs +497 -0
  139. package/src/runtime/channels/lib/scheduler.mjs +710 -0
  140. package/src/runtime/channels/lib/session-discovery.mjs +102 -0
  141. package/src/runtime/channels/lib/state-file.mjs +68 -0
  142. package/src/runtime/channels/lib/status-snapshot.mjs +224 -0
  143. package/src/runtime/channels/lib/tool-format.mjs +124 -0
  144. package/src/runtime/channels/lib/transcript-discovery.mjs +195 -0
  145. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +734 -0
  146. package/src/runtime/channels/lib/webhook.mjs +1288 -0
  147. package/src/runtime/channels/tool-defs.mjs +177 -0
  148. package/src/runtime/lib/keychain-cjs.cjs +289 -0
  149. package/src/runtime/memory/data/runtime-manifest.json +40 -0
  150. package/src/runtime/memory/index.mjs +3600 -0
  151. package/src/runtime/memory/lib/core-memory-store.mjs +336 -0
  152. package/src/runtime/memory/lib/embedding-provider.mjs +275 -0
  153. package/src/runtime/memory/lib/embedding-worker.mjs +331 -0
  154. package/src/runtime/memory/lib/memory-cycle-requests.mjs +276 -0
  155. package/src/runtime/memory/lib/memory-cycle1.mjs +783 -0
  156. package/src/runtime/memory/lib/memory-cycle2.mjs +1389 -0
  157. package/src/runtime/memory/lib/memory-cycle3.mjs +646 -0
  158. package/src/runtime/memory/lib/memory-embed.mjs +300 -0
  159. package/src/runtime/memory/lib/memory-ops-policy.mjs +149 -0
  160. package/src/runtime/memory/lib/memory-recall-store.mjs +644 -0
  161. package/src/runtime/memory/lib/memory.mjs +418 -0
  162. package/src/runtime/memory/lib/pg/adapter.mjs +314 -0
  163. package/src/runtime/memory/lib/pg/process.mjs +366 -0
  164. package/src/runtime/memory/lib/pg/supervisor.mjs +495 -0
  165. package/src/runtime/memory/lib/runtime-fetcher.mjs +464 -0
  166. package/src/runtime/memory/lib/trace-store.mjs +734 -0
  167. package/src/runtime/memory/tool-defs.mjs +79 -0
  168. package/src/runtime/search/index.mjs +925 -0
  169. package/src/runtime/search/lib/config.mjs +61 -0
  170. package/src/runtime/search/lib/web-tools.mjs +1278 -0
  171. package/src/runtime/search/tool-defs.mjs +64 -0
  172. package/src/runtime/shared/atomic-file.mjs +435 -0
  173. package/src/runtime/shared/background-tasks.mjs +376 -0
  174. package/src/runtime/shared/child-guardian.mjs +98 -0
  175. package/src/runtime/shared/config.mjs +393 -0
  176. package/src/runtime/shared/err-text.mjs +121 -0
  177. package/src/runtime/shared/launcher-control.mjs +259 -0
  178. package/src/runtime/shared/llm/http-agent.mjs +129 -0
  179. package/src/runtime/shared/open-url.mjs +37 -0
  180. package/src/runtime/shared/plugin-paths.mjs +25 -0
  181. package/src/runtime/shared/process-shutdown.mjs +147 -0
  182. package/src/runtime/shared/schedules-store.mjs +70 -0
  183. package/src/runtime/shared/tool-execution-contract.mjs +104 -0
  184. package/src/runtime/shared/tool-surface.mjs +950 -0
  185. package/src/runtime/shared/user-cwd.mjs +221 -0
  186. package/src/runtime/shared/user-data-guard.mjs +232 -0
  187. package/src/runtime/shared/workspace-router.mjs +259 -0
  188. package/src/standalone/bridge-tool.mjs +1414 -0
  189. package/src/standalone/channel-admin.mjs +366 -0
  190. package/src/standalone/channel-worker-preload.cjs +3 -0
  191. package/src/standalone/channel-worker.mjs +353 -0
  192. package/src/standalone/explore-tool.mjs +233 -0
  193. package/src/standalone/hook-bus.mjs +246 -0
  194. package/src/standalone/plugin-admin.mjs +247 -0
  195. package/src/standalone/provider-admin.mjs +338 -0
  196. package/src/standalone/seeds.mjs +94 -0
  197. package/src/standalone/usage-dashboard.mjs +510 -0
  198. package/src/tui/App.jsx +5438 -0
  199. package/src/tui/components/AnsiText.jsx +199 -0
  200. package/src/tui/components/ContextPanel.jsx +217 -0
  201. package/src/tui/components/Markdown.jsx +205 -0
  202. package/src/tui/components/MarkdownTable.jsx +204 -0
  203. package/src/tui/components/Message.jsx +103 -0
  204. package/src/tui/components/Picker.jsx +317 -0
  205. package/src/tui/components/PromptInput.jsx +584 -0
  206. package/src/tui/components/QueuedCommands.jsx +47 -0
  207. package/src/tui/components/SlashCommandPalette.jsx +114 -0
  208. package/src/tui/components/Spinner.jsx +317 -0
  209. package/src/tui/components/StatusLine.jsx +87 -0
  210. package/src/tui/components/TextEntryPanel.jsx +323 -0
  211. package/src/tui/components/ToolExecution.jsx +772 -0
  212. package/src/tui/components/TurnDone.jsx +78 -0
  213. package/src/tui/components/UsagePanel.jsx +331 -0
  214. package/src/tui/dist/index.mjs +12359 -0
  215. package/src/tui/engine.mjs +2410 -0
  216. package/src/tui/figures.mjs +50 -0
  217. package/src/tui/hooks/useEngine.mjs +16 -0
  218. package/src/tui/index.jsx +254 -0
  219. package/src/tui/input-editing.mjs +242 -0
  220. package/src/tui/markdown/format-token.mjs +194 -0
  221. package/src/tui/paste-attachments.mjs +198 -0
  222. package/src/tui/runtime/shared/process-shutdown.mjs +1 -0
  223. package/src/tui/spinner-verbs.mjs +45 -0
  224. package/src/tui/theme.mjs +67 -0
  225. package/src/tui/time-format.mjs +53 -0
  226. package/src/ui/ansi.mjs +115 -0
  227. package/src/ui/markdown.mjs +195 -0
  228. package/src/ui/statusline.mjs +730 -0
  229. package/src/ui/tool-card.mjs +101 -0
  230. package/src/vendor/statusline/bin/statusline-lib.mjs +805 -0
  231. package/src/vendor/statusline/bin/statusline-route.mjs +596 -0
  232. package/src/vendor/statusline/scripts/lib/gateway-settings.mjs +285 -0
  233. package/src/vendor/statusline/src/gateway/claude-current.mjs +320 -0
  234. package/src/vendor/statusline/src/gateway/route-meta.mjs +753 -0
  235. package/src/vendor/statusline/src/gateway/session-routes.mjs +244 -0
  236. package/src/workflows/default/WORKFLOW.md +7 -0
  237. package/src/workflows/default/workflow.json +14 -0
  238. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  239. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  240. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  241. package/vendor/ink/build/colorize.d.ts +3 -0
  242. package/vendor/ink/build/colorize.js +48 -0
  243. package/vendor/ink/build/colorize.js.map +1 -0
  244. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  245. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  246. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  247. package/vendor/ink/build/components/AnimationContext.d.ts +9 -0
  248. package/vendor/ink/build/components/AnimationContext.js +13 -0
  249. package/vendor/ink/build/components/AnimationContext.js.map +1 -0
  250. package/vendor/ink/build/components/App.d.ts +24 -0
  251. package/vendor/ink/build/components/App.js +554 -0
  252. package/vendor/ink/build/components/App.js.map +1 -0
  253. package/vendor/ink/build/components/AppContext.d.ts +80 -0
  254. package/vendor/ink/build/components/AppContext.js +25 -0
  255. package/vendor/ink/build/components/AppContext.js.map +1 -0
  256. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  257. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  258. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  259. package/vendor/ink/build/components/Box.d.ts +130 -0
  260. package/vendor/ink/build/components/Box.js +34 -0
  261. package/vendor/ink/build/components/Box.js.map +1 -0
  262. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  263. package/vendor/ink/build/components/CursorContext.js +8 -0
  264. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  265. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  266. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  267. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  268. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  269. package/vendor/ink/build/components/ErrorOverview.js +90 -0
  270. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  271. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  272. package/vendor/ink/build/components/FocusContext.js +17 -0
  273. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  274. package/vendor/ink/build/components/Newline.d.ts +13 -0
  275. package/vendor/ink/build/components/Newline.js +8 -0
  276. package/vendor/ink/build/components/Newline.js.map +1 -0
  277. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  278. package/vendor/ink/build/components/Spacer.js +11 -0
  279. package/vendor/ink/build/components/Spacer.js.map +1 -0
  280. package/vendor/ink/build/components/Static.d.ts +24 -0
  281. package/vendor/ink/build/components/Static.js +28 -0
  282. package/vendor/ink/build/components/Static.js.map +1 -0
  283. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  284. package/vendor/ink/build/components/StderrContext.js +13 -0
  285. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  286. package/vendor/ink/build/components/StdinContext.d.ts +28 -0
  287. package/vendor/ink/build/components/StdinContext.js +20 -0
  288. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  289. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  290. package/vendor/ink/build/components/StdoutContext.js +13 -0
  291. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  292. package/vendor/ink/build/components/Text.d.ts +55 -0
  293. package/vendor/ink/build/components/Text.js +50 -0
  294. package/vendor/ink/build/components/Text.js.map +1 -0
  295. package/vendor/ink/build/components/Transform.d.ts +16 -0
  296. package/vendor/ink/build/components/Transform.js +15 -0
  297. package/vendor/ink/build/components/Transform.js.map +1 -0
  298. package/vendor/ink/build/cursor-helpers.d.ts +39 -0
  299. package/vendor/ink/build/cursor-helpers.js +62 -0
  300. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  301. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  302. package/vendor/ink/build/devtools-window-polyfill.js +68 -0
  303. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  304. package/vendor/ink/build/devtools.d.ts +1 -0
  305. package/vendor/ink/build/devtools.js +36 -0
  306. package/vendor/ink/build/devtools.js.map +1 -0
  307. package/vendor/ink/build/dom.d.ts +62 -0
  308. package/vendor/ink/build/dom.js +143 -0
  309. package/vendor/ink/build/dom.js.map +1 -0
  310. package/vendor/ink/build/get-max-width.d.ts +3 -0
  311. package/vendor/ink/build/get-max-width.js +10 -0
  312. package/vendor/ink/build/get-max-width.js.map +1 -0
  313. package/vendor/ink/build/hooks/use-animation.d.ts +49 -0
  314. package/vendor/ink/build/hooks/use-animation.js +87 -0
  315. package/vendor/ink/build/hooks/use-animation.js.map +1 -0
  316. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  317. package/vendor/ink/build/hooks/use-app.js +8 -0
  318. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  319. package/vendor/ink/build/hooks/use-box-metrics.d.ts +59 -0
  320. package/vendor/ink/build/hooks/use-box-metrics.js +81 -0
  321. package/vendor/ink/build/hooks/use-box-metrics.js.map +1 -0
  322. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  323. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  324. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  325. package/vendor/ink/build/hooks/use-focus-manager.d.ts +43 -0
  326. package/vendor/ink/build/hooks/use-focus-manager.js +18 -0
  327. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  328. package/vendor/ink/build/hooks/use-focus.d.ts +30 -0
  329. package/vendor/ink/build/hooks/use-focus.js +43 -0
  330. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  331. package/vendor/ink/build/hooks/use-input.d.ts +132 -0
  332. package/vendor/ink/build/hooks/use-input.js +126 -0
  333. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  334. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +6 -0
  335. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +12 -0
  336. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  337. package/vendor/ink/build/hooks/use-paste.d.ts +35 -0
  338. package/vendor/ink/build/hooks/use-paste.js +62 -0
  339. package/vendor/ink/build/hooks/use-paste.js.map +1 -0
  340. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  341. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  342. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  343. package/vendor/ink/build/hooks/use-stdin.d.ts +7 -0
  344. package/vendor/ink/build/hooks/use-stdin.js +9 -0
  345. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  346. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  347. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  348. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  349. package/vendor/ink/build/hooks/use-window-size.d.ts +18 -0
  350. package/vendor/ink/build/hooks/use-window-size.js +22 -0
  351. package/vendor/ink/build/hooks/use-window-size.js.map +1 -0
  352. package/vendor/ink/build/index.d.ts +42 -0
  353. package/vendor/ink/build/index.js +24 -0
  354. package/vendor/ink/build/index.js.map +1 -0
  355. package/vendor/ink/build/ink.d.ts +146 -0
  356. package/vendor/ink/build/ink.js +1022 -0
  357. package/vendor/ink/build/ink.js.map +1 -0
  358. package/vendor/ink/build/input-parser.d.ts +10 -0
  359. package/vendor/ink/build/input-parser.js +194 -0
  360. package/vendor/ink/build/input-parser.js.map +1 -0
  361. package/vendor/ink/build/instances.d.ts +3 -0
  362. package/vendor/ink/build/instances.js +8 -0
  363. package/vendor/ink/build/instances.js.map +1 -0
  364. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  365. package/vendor/ink/build/kitty-keyboard.js +32 -0
  366. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  367. package/vendor/ink/build/log-update.d.ts +20 -0
  368. package/vendor/ink/build/log-update.js +261 -0
  369. package/vendor/ink/build/log-update.js.map +1 -0
  370. package/vendor/ink/build/measure-element.d.ts +20 -0
  371. package/vendor/ink/build/measure-element.js +13 -0
  372. package/vendor/ink/build/measure-element.js.map +1 -0
  373. package/vendor/ink/build/measure-text.d.ts +6 -0
  374. package/vendor/ink/build/measure-text.js +21 -0
  375. package/vendor/ink/build/measure-text.js.map +1 -0
  376. package/vendor/ink/build/output.d.ts +35 -0
  377. package/vendor/ink/build/output.js +328 -0
  378. package/vendor/ink/build/output.js.map +1 -0
  379. package/vendor/ink/build/parse-keypress.d.ts +20 -0
  380. package/vendor/ink/build/parse-keypress.js +495 -0
  381. package/vendor/ink/build/parse-keypress.js.map +1 -0
  382. package/vendor/ink/build/reconciler.d.ts +4 -0
  383. package/vendor/ink/build/reconciler.js +306 -0
  384. package/vendor/ink/build/reconciler.js.map +1 -0
  385. package/vendor/ink/build/render-background.d.ts +4 -0
  386. package/vendor/ink/build/render-background.js +25 -0
  387. package/vendor/ink/build/render-background.js.map +1 -0
  388. package/vendor/ink/build/render-border.d.ts +4 -0
  389. package/vendor/ink/build/render-border.js +84 -0
  390. package/vendor/ink/build/render-border.js.map +1 -0
  391. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  392. package/vendor/ink/build/render-node-to-output.js +162 -0
  393. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  394. package/vendor/ink/build/render-to-string.d.ts +38 -0
  395. package/vendor/ink/build/render-to-string.js +116 -0
  396. package/vendor/ink/build/render-to-string.js.map +1 -0
  397. package/vendor/ink/build/render.d.ts +176 -0
  398. package/vendor/ink/build/render.js +71 -0
  399. package/vendor/ink/build/render.js.map +1 -0
  400. package/vendor/ink/build/renderer.d.ts +8 -0
  401. package/vendor/ink/build/renderer.js +64 -0
  402. package/vendor/ink/build/renderer.js.map +1 -0
  403. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  404. package/vendor/ink/build/sanitize-ansi.js +27 -0
  405. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  406. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  407. package/vendor/ink/build/squash-text-nodes.js +36 -0
  408. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  409. package/vendor/ink/build/styles.d.ts +302 -0
  410. package/vendor/ink/build/styles.js +303 -0
  411. package/vendor/ink/build/styles.js.map +1 -0
  412. package/vendor/ink/build/utils.d.ts +9 -0
  413. package/vendor/ink/build/utils.js +19 -0
  414. package/vendor/ink/build/utils.js.map +1 -0
  415. package/vendor/ink/build/wrap-text.d.ts +3 -0
  416. package/vendor/ink/build/wrap-text.js +38 -0
  417. package/vendor/ink/build/wrap-text.js.map +1 -0
  418. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  419. package/vendor/ink/build/write-synchronized.js +9 -0
  420. package/vendor/ink/build/write-synchronized.js.map +1 -0
  421. package/vendor/ink/license +10 -0
  422. package/vendor/ink/package.json +137 -0
  423. package/.claude-plugin/marketplace.json +0 -34
  424. package/.claude-plugin/plugin.json +0 -20
  425. package/.gitattributes +0 -34
  426. package/.mcp.json +0 -14
  427. package/ARCHITECTURE.md +0 -77
  428. package/CHANGELOG.md +0 -30
  429. package/CONTRIBUTING.md +0 -45
  430. package/DATA-FLOW.md +0 -79
  431. package/LICENSE +0 -21
  432. package/SECURITY.md +0 -138
  433. package/UNINSTALL.md +0 -115
  434. package/agents/maintenance.md +0 -5
  435. package/agents/memory-classification.md +0 -30
  436. package/agents/scheduler-task.md +0 -18
  437. package/agents/webhook-handler.md +0 -27
  438. package/agents/worker.md +0 -24
  439. package/bin/bridge +0 -133
  440. package/bin/statusline-launcher.mjs +0 -82
  441. package/bin/statusline-lib.mjs +0 -581
  442. package/bin/statusline-route.mjs +0 -273
  443. package/bin/statusline.mjs +0 -638
  444. package/bun.lock +0 -927
  445. package/commands/config.md +0 -16
  446. package/commands/doctor.md +0 -13
  447. package/commands/model.md +0 -61
  448. package/commands/setup.md +0 -17
  449. package/defaults/hidden-roles.json +0 -68
  450. package/defaults/memory-chunk-prompt.md +0 -63
  451. package/defaults/mixdog-config.template.json +0 -27
  452. package/defaults/user-workflow.json +0 -8
  453. package/defaults/user-workflow.md +0 -17
  454. package/hooks/hooks.json +0 -73
  455. package/hooks/lib/active-instance.cjs +0 -77
  456. package/hooks/lib/permission-evaluator.cjs +0 -411
  457. package/hooks/lib/permission-route.cjs +0 -63
  458. package/hooks/lib/settings-loader.cjs +0 -117
  459. package/hooks/post-tool-use.cjs +0 -84
  460. package/hooks/pre-mcp-sandbox.cjs +0 -158
  461. package/hooks/pre-tool-subagent.cjs +0 -258
  462. package/hooks/session-start.cjs +0 -1493
  463. package/hooks/shim-launcher.cjs +0 -65
  464. package/hooks/turn-timer.cjs +0 -82
  465. package/lib/claude-md-writer.cjs +0 -386
  466. package/lib/keychain-cjs.cjs +0 -290
  467. package/lib/plugin-paths.cjs +0 -69
  468. package/lib/rules-builder.cjs +0 -241
  469. package/native/README.md +0 -117
  470. package/native/prebuilt/linux-aarch64/mixdog-shim +0 -0
  471. package/native/prebuilt/linux-x86_64/mixdog-shim +0 -0
  472. package/native/prebuilt/macos-aarch64/mixdog-shim +0 -0
  473. package/native/prebuilt/macos-x86_64/mixdog-shim +0 -0
  474. package/native/prebuilt/windows-x86_64/mixdog-shim.exe +0 -0
  475. package/prompts/code-review.txt +0 -16
  476. package/prompts/security-audit.txt +0 -17
  477. package/rules/bridge/00-common.md +0 -39
  478. package/rules/bridge/20-skip-protocol.md +0 -18
  479. package/rules/bridge/30-explorer.md +0 -33
  480. package/rules/bridge/40-cycle1-agent.md +0 -52
  481. package/rules/bridge/41-cycle2-agent.md +0 -62
  482. package/rules/lead/00-tool-lead.md +0 -61
  483. package/rules/lead/01-general.md +0 -26
  484. package/rules/lead/02-channels.md +0 -49
  485. package/rules/lead/03-team.md +0 -27
  486. package/rules/lead/04-workflow.md +0 -20
  487. package/rules/shared/00-language.md +0 -14
  488. package/rules/shared/01-tool.md +0 -138
  489. package/scripts/bootstrap.mjs +0 -130
  490. package/scripts/bridge-unify-smoke.mjs +0 -308
  491. package/scripts/build-runtime-linux.sh +0 -348
  492. package/scripts/build-runtime-macos.sh +0 -217
  493. package/scripts/build-runtime-windows.ps1 +0 -242
  494. package/scripts/builtin-utils-smoke.mjs +0 -398
  495. package/scripts/bump.mjs +0 -80
  496. package/scripts/check-json.mjs +0 -45
  497. package/scripts/check-syntax-changed.mjs +0 -102
  498. package/scripts/check-syntax.mjs +0 -58
  499. package/scripts/code-graph-batch.test.mjs +0 -33
  500. package/scripts/config-preserve-smoke.mjs +0 -180
  501. package/scripts/doctor.mjs +0 -489
  502. package/scripts/edit-normalize-fuzz.mjs +0 -130
  503. package/scripts/edit-normalize-smoke.mjs +0 -401
  504. package/scripts/edit-operation-smoke.mjs +0 -369
  505. package/scripts/edit2-smoke.mjs +0 -63
  506. package/scripts/ensure-deps.mjs +0 -259
  507. package/scripts/fuzzy-e2e.mjs +0 -28
  508. package/scripts/fuzzy-smoke.mjs +0 -26
  509. package/scripts/gateway-model.mjs +0 -596
  510. package/scripts/generate-runtime-manifest.mjs +0 -166
  511. package/scripts/guard-smoke.mjs +0 -66
  512. package/scripts/hidden-role-schema-smoke.mjs +0 -162
  513. package/scripts/hook-routing-smoke.mjs +0 -29
  514. package/scripts/inject-input.ps1 +0 -204
  515. package/scripts/io-complex-smoke.mjs +0 -667
  516. package/scripts/io-explore-bench.mjs +0 -424
  517. package/scripts/io-guardrails-smoke.mjs +0 -205
  518. package/scripts/io-mini-bench-baseline.json +0 -11
  519. package/scripts/io-mini-bench.mjs +0 -216
  520. package/scripts/io-route-harness.mjs +0 -933
  521. package/scripts/io-telemetry-report.mjs +0 -691
  522. package/scripts/lib/gateway-inventory.mjs +0 -178
  523. package/scripts/lib/gateway-settings.mjs +0 -78
  524. package/scripts/mutation-bench.mjs +0 -564
  525. package/scripts/mutation-io-smoke.mjs +0 -1097
  526. package/scripts/native-patch-bridge-smoke.mjs +0 -288
  527. package/scripts/native-patch-smoke.mjs +0 -304
  528. package/scripts/openai-oauth-catalog-smoke.mjs +0 -53
  529. package/scripts/patch-interior-context-smoke.mjs +0 -49
  530. package/scripts/patch-newline-utf8-smoke.mjs +0 -157
  531. package/scripts/perf-hook-smoke.mjs +0 -71
  532. package/scripts/permission-eval-smoke.mjs +0 -443
  533. package/scripts/prep-patch.mjs +0 -53
  534. package/scripts/prep-shim.mjs +0 -96
  535. package/scripts/provider-cache-smoke.mjs +0 -687
  536. package/scripts/report-runtime-health.mjs +0 -132
  537. package/scripts/resolve-bun.mjs +0 -60
  538. package/scripts/run-mcp.mjs +0 -1473
  539. package/scripts/salvage-v4a-shatter.test.mjs +0 -58
  540. package/scripts/scoped-cache-io-smoke.mjs +0 -103
  541. package/scripts/shell-policy-round3-smoke.mjs +0 -46
  542. package/scripts/smoke-runtime-negative.ps1 +0 -100
  543. package/scripts/smoke-runtime-negative.sh +0 -95
  544. package/scripts/stall-policy-smoke.mjs +0 -50
  545. package/scripts/start-memory-worker.mjs +0 -23
  546. package/scripts/statusline-launcher-smoke.mjs +0 -235
  547. package/scripts/stress-atomic-write.mjs +0 -1028
  548. package/scripts/test-fault-inject.mjs +0 -164
  549. package/scripts/test-large-file.mjs +0 -174
  550. package/scripts/tool-edge-smoke.mjs +0 -209
  551. package/scripts/uninstall.mjs +0 -238
  552. package/scripts/webhook-selfheal-smoke.mjs +0 -27
  553. package/scripts/write-overwrite-guard-smoke.mjs +0 -56
  554. package/server-main.mjs +0 -3350
  555. package/server.mjs +0 -468
  556. package/setup/config-merge.mjs +0 -246
  557. package/setup/install.mjs +0 -574
  558. package/setup/launch-core.mjs +0 -617
  559. package/setup/launch.mjs +0 -101
  560. package/setup/locate-claude.mjs +0 -56
  561. package/setup/mixdog-cli.mjs +0 -122
  562. package/setup/setup-server.mjs +0 -3305
  563. package/setup/setup.html +0 -3740
  564. package/setup/tui.mjs +0 -325
  565. package/skills/retro-skill-proposer/SKILL.md +0 -92
  566. package/skills/schedule-add/SKILL.md +0 -77
  567. package/skills/setup/SKILL.md +0 -356
  568. package/skills/webhook-add/SKILL.md +0 -81
  569. package/src/agent/bridge-stall-watchdog.mjs +0 -337
  570. package/src/agent/index.mjs +0 -2229
  571. package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +0 -1010
  572. package/src/agent/orchestrator/bridge-retry.mjs +0 -220
  573. package/src/agent/orchestrator/bridge-trace.mjs +0 -601
  574. package/src/agent/orchestrator/cache-mtime.mjs +0 -58
  575. package/src/agent/orchestrator/config.mjs +0 -405
  576. package/src/agent/orchestrator/context/collect.mjs +0 -651
  577. package/src/agent/orchestrator/dispatch-persist.mjs +0 -549
  578. package/src/agent/orchestrator/drain-registry.mjs +0 -50
  579. package/src/agent/orchestrator/explore-validator.mjs +0 -8
  580. package/src/agent/orchestrator/internal-roles.mjs +0 -118
  581. package/src/agent/orchestrator/internal-tools.mjs +0 -88
  582. package/src/agent/orchestrator/jobs.mjs +0 -116
  583. package/src/agent/orchestrator/mcp/client.mjs +0 -364
  584. package/src/agent/orchestrator/providers/anthropic-oauth.mjs +0 -1884
  585. package/src/agent/orchestrator/providers/anthropic.mjs +0 -598
  586. package/src/agent/orchestrator/providers/gemini.mjs +0 -1530
  587. package/src/agent/orchestrator/providers/grok-oauth.mjs +0 -779
  588. package/src/agent/orchestrator/providers/model-catalog.mjs +0 -374
  589. package/src/agent/orchestrator/providers/openai-compat-stream.mjs +0 -366
  590. package/src/agent/orchestrator/providers/openai-compat.mjs +0 -1511
  591. package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +0 -1891
  592. package/src/agent/orchestrator/providers/openai-oauth.mjs +0 -1456
  593. package/src/agent/orchestrator/providers/openai-ws.mjs +0 -127
  594. package/src/agent/orchestrator/providers/registry.mjs +0 -192
  595. package/src/agent/orchestrator/providers/retry-classifier.mjs +0 -325
  596. package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +0 -142
  597. package/src/agent/orchestrator/session/cache/read-cache.mjs +0 -319
  598. package/src/agent/orchestrator/session/cache/scoped-cache.mjs +0 -361
  599. package/src/agent/orchestrator/session/loop.mjs +0 -1619
  600. package/src/agent/orchestrator/session/manager.mjs +0 -1991
  601. package/src/agent/orchestrator/session/result-classification.mjs +0 -65
  602. package/src/agent/orchestrator/session/store.mjs +0 -632
  603. package/src/agent/orchestrator/session/stream-watchdog.mjs +0 -130
  604. package/src/agent/orchestrator/session/tool-result-offload.mjs +0 -166
  605. package/src/agent/orchestrator/session/trim.mjs +0 -491
  606. package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +0 -115
  607. package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +0 -331
  608. package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +0 -150
  609. package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +0 -228
  610. package/src/agent/orchestrator/smart-bridge/index.mjs +0 -215
  611. package/src/agent/orchestrator/smart-bridge/profiles.mjs +0 -37
  612. package/src/agent/orchestrator/smart-bridge/registry.mjs +0 -348
  613. package/src/agent/orchestrator/stall-policy.mjs +0 -201
  614. package/src/agent/orchestrator/tool-loop-guard.mjs +0 -75
  615. package/src/agent/orchestrator/tools/bash-session.mjs +0 -722
  616. package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +0 -511
  617. package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -480
  618. package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +0 -256
  619. package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +0 -58
  620. package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +0 -240
  621. package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +0 -113
  622. package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +0 -74
  623. package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +0 -242
  624. package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +0 -211
  625. package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +0 -1364
  626. package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +0 -126
  627. package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +0 -141
  628. package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +0 -194
  629. package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +0 -60
  630. package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +0 -168
  631. package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +0 -173
  632. package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +0 -48
  633. package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +0 -99
  634. package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +0 -193
  635. package/src/agent/orchestrator/tools/builtin/list-tool.mjs +0 -597
  636. package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +0 -110
  637. package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +0 -300
  638. package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +0 -152
  639. package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -118
  640. package/src/agent/orchestrator/tools/builtin/read-open.mjs +0 -190
  641. package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +0 -728
  642. package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +0 -173
  643. package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +0 -602
  644. package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +0 -196
  645. package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +0 -422
  646. package/src/agent/orchestrator/tools/builtin/search-builders.mjs +0 -158
  647. package/src/agent/orchestrator/tools/builtin/search-tool.mjs +0 -869
  648. package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +0 -962
  649. package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +0 -223
  650. package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +0 -206
  651. package/src/agent/orchestrator/tools/builtin/write-tool.mjs +0 -401
  652. package/src/agent/orchestrator/tools/builtin.mjs +0 -503
  653. package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +0 -24
  654. package/src/agent/orchestrator/tools/code-graph.mjs +0 -4095
  655. package/src/agent/orchestrator/tools/cwd-tool.mjs +0 -298
  656. package/src/agent/orchestrator/tools/destructive-warning.mjs +0 -323
  657. package/src/agent/orchestrator/tools/edit-normalize.mjs +0 -603
  658. package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +0 -154
  659. package/src/agent/orchestrator/tools/graph-manifest.json +0 -26
  660. package/src/agent/orchestrator/tools/host-input.mjs +0 -204
  661. package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +0 -143
  662. package/src/agent/orchestrator/tools/patch-manifest.json +0 -26
  663. package/src/agent/orchestrator/tools/patch-tool-defs.mjs +0 -20
  664. package/src/agent/orchestrator/tools/patch.mjs +0 -2754
  665. package/src/agent/orchestrator/tools/progress-message.mjs +0 -118
  666. package/src/agent/orchestrator/tools/shell-command.mjs +0 -865
  667. package/src/agent/orchestrator/tools/shell-policy-imports.mjs +0 -7
  668. package/src/agent/orchestrator/tools/shell-snapshot.mjs +0 -313
  669. package/src/agent/orchestrator/workflow-store.mjs +0 -93
  670. package/src/agent/tool-defs.mjs +0 -110
  671. package/src/channels/backends/discord.mjs +0 -784
  672. package/src/channels/data/voice-runtime-manifest.json +0 -138
  673. package/src/channels/index.mjs +0 -3268
  674. package/src/channels/lib/config.mjs +0 -292
  675. package/src/channels/lib/drop-trace.mjs +0 -71
  676. package/src/channels/lib/event-pipeline.mjs +0 -81
  677. package/src/channels/lib/holidays.mjs +0 -138
  678. package/src/channels/lib/hook-pipe-server.mjs +0 -822
  679. package/src/channels/lib/output-forwarder.mjs +0 -765
  680. package/src/channels/lib/runtime-paths.mjs +0 -552
  681. package/src/channels/lib/scheduler.mjs +0 -723
  682. package/src/channels/lib/session-discovery.mjs +0 -103
  683. package/src/channels/lib/state-file.mjs +0 -68
  684. package/src/channels/lib/status-snapshot.mjs +0 -219
  685. package/src/channels/lib/tool-format.mjs +0 -140
  686. package/src/channels/lib/transcript-discovery.mjs +0 -195
  687. package/src/channels/lib/voice-runtime-fetcher.mjs +0 -734
  688. package/src/channels/lib/webhook.mjs +0 -1318
  689. package/src/channels/tool-defs.mjs +0 -170
  690. package/src/daemon/host.mjs +0 -118
  691. package/src/daemon/mcp-transport.mjs +0 -47
  692. package/src/daemon/session.mjs +0 -100
  693. package/src/daemon/thin-client.mjs +0 -71
  694. package/src/daemon/transport.mjs +0 -163
  695. package/src/gateway/claude-current.mjs +0 -255
  696. package/src/gateway/oauth-usage.mjs +0 -598
  697. package/src/gateway/route-meta.mjs +0 -629
  698. package/src/gateway/server.mjs +0 -713
  699. package/src/memory/data/runtime-manifest.json +0 -40
  700. package/src/memory/index.mjs +0 -3332
  701. package/src/memory/lib/core-memory-store.mjs +0 -330
  702. package/src/memory/lib/embedding-provider.mjs +0 -269
  703. package/src/memory/lib/embedding-worker.mjs +0 -323
  704. package/src/memory/lib/memory-cycle1.mjs +0 -645
  705. package/src/memory/lib/memory-cycle2.mjs +0 -1284
  706. package/src/memory/lib/memory-cycle3.mjs +0 -540
  707. package/src/memory/lib/memory-embed.mjs +0 -299
  708. package/src/memory/lib/memory-ops-policy.mjs +0 -190
  709. package/src/memory/lib/memory-recall-store.mjs +0 -638
  710. package/src/memory/lib/memory.mjs +0 -412
  711. package/src/memory/lib/pg/adapter.mjs +0 -308
  712. package/src/memory/lib/pg/process.mjs +0 -360
  713. package/src/memory/lib/pg/supervisor.mjs +0 -396
  714. package/src/memory/lib/runtime-fetcher.mjs +0 -458
  715. package/src/memory/lib/trace-store.mjs +0 -728
  716. package/src/memory/tool-defs.mjs +0 -79
  717. package/src/search/index.mjs +0 -1173
  718. package/src/search/lib/backends/anthropic-oauth.mjs +0 -98
  719. package/src/search/lib/backends/exa.mjs +0 -50
  720. package/src/search/lib/backends/firecrawl.mjs +0 -61
  721. package/src/search/lib/backends/gemini-api.mjs +0 -83
  722. package/src/search/lib/backends/grok-oauth.mjs +0 -86
  723. package/src/search/lib/backends/index.mjs +0 -150
  724. package/src/search/lib/backends/openai-api.mjs +0 -144
  725. package/src/search/lib/backends/openai-oauth.mjs +0 -102
  726. package/src/search/lib/backends/openai-web-search.mjs +0 -76
  727. package/src/search/lib/backends/tavily.mjs +0 -55
  728. package/src/search/lib/backends/xai-api.mjs +0 -113
  729. package/src/search/lib/config.mjs +0 -192
  730. package/src/search/lib/provider-usage.mjs +0 -67
  731. package/src/search/lib/providers.mjs +0 -47
  732. package/src/search/lib/search-intent.mjs +0 -109
  733. package/src/search/lib/setup-handler.mjs +0 -261
  734. package/src/search/lib/web-tools.mjs +0 -1219
  735. package/src/search/tool-defs.mjs +0 -83
  736. package/src/setup/defender-exclusion.mjs +0 -183
  737. package/src/shared/atomic-file.mjs +0 -436
  738. package/src/shared/config.mjs +0 -372
  739. package/src/shared/daemon-recycle.mjs +0 -108
  740. package/src/shared/disable-claude-builtins.mjs +0 -91
  741. package/src/shared/err-text.mjs +0 -12
  742. package/src/shared/llm/http-agent.mjs +0 -123
  743. package/src/shared/open-url.mjs +0 -62
  744. package/src/shared/plugin-paths.mjs +0 -58
  745. package/src/shared/schedules-store.mjs +0 -70
  746. package/src/shared/seed.mjs +0 -161
  747. package/src/shared/user-cwd.mjs +0 -225
  748. package/src/shared/user-data-guard.mjs +0 -244
  749. package/src/status/aggregator.mjs +0 -584
  750. package/src/status/server.mjs +0 -413
  751. package/tools.json +0 -1671
  752. /package/{defaults → src/defaults}/cycle3-review-prompt.md +0 -0
  753. /package/{defaults → src/defaults}/memory-promote-prompt.md +0 -0
  754. /package/{hooks → src/hooks}/lib/permission-rules.cjs +0 -0
  755. /package/{lib → src/lib}/config-cjs.cjs +0 -0
  756. /package/{lib → src/lib}/hook-pipe-path.cjs +0 -0
  757. /package/{lib → src/lib}/mixdog-debug.cjs +0 -0
  758. /package/{lib → src/lib}/text-utils.cjs +0 -0
  759. /package/{rules → src/rules}/bridge/42-cycle3-agent.md +0 -0
  760. /package/src/{agent → runtime/agent}/orchestrator/activity-bus.mjs +0 -0
  761. /package/src/{agent → runtime/agent}/orchestrator/providers/anthropic-betas.mjs +0 -0
  762. /package/src/{agent → runtime/agent}/orchestrator/session/abort-lookup.mjs +0 -0
  763. /package/src/{agent → runtime/agent}/orchestrator/session/cache/post-edit-marks.mjs +0 -0
  764. /package/src/{agent → runtime/agent}/orchestrator/session/cache/scoped-cache-outcome.mjs +0 -0
  765. /package/src/{agent → runtime/agent}/orchestrator/session/cache/util.mjs +0 -0
  766. /package/src/{agent → runtime/agent}/orchestrator/session/read-dedup.mjs +0 -0
  767. /package/src/{agent → runtime/agent}/orchestrator/session/save-session-worker.mjs +0 -0
  768. /package/src/{agent → runtime/agent}/orchestrator/smart-bridge/session-builder.mjs +0 -0
  769. /package/src/{agent → runtime/agent}/orchestrator/tools/bash-policy-scan.mjs +0 -0
  770. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/advisory-lock.mjs +0 -0
  771. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/atomic-write.mjs +0 -0
  772. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/binary-file.mjs +0 -0
  773. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cache-layers.mjs +0 -0
  774. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cwd-utils.mjs +0 -0
  775. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/device-paths.mjs +0 -0
  776. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -0
  777. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diff-utils.mjs +0 -0
  778. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/fs-reachability.mjs +0 -0
  779. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/grep-formatting.mjs +0 -0
  780. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/hash-utils.mjs +0 -0
  781. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/list-formatting.mjs +0 -0
  782. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/open-config-tool.mjs +0 -0
  783. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-locks.mjs +0 -0
  784. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-utils.mjs +0 -0
  785. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-args.mjs +0 -0
  786. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-batch.mjs +0 -0
  787. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-constants.mjs +0 -0
  788. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image-resize.mjs +0 -0
  789. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image.mjs +0 -0
  790. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-lines.mjs +0 -0
  791. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-mode-tool.mjs +0 -0
  792. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-range-index.mjs +0 -0
  793. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-ranges.mjs +0 -0
  794. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-special-files.mjs +0 -0
  795. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-tool.mjs +0 -0
  796. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-windows.mjs +0 -0
  797. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-analysis.mjs +0 -0
  798. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-output.mjs +0 -0
  799. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-helpers.mjs +0 -0
  800. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-validation.mjs +0 -0
  801. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/text-stats.mjs +0 -0
  802. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/windows-roots.mjs +0 -0
  803. /package/src/{agent → runtime/agent}/orchestrator/tools/code-graph-prewarm-worker.mjs +0 -0
  804. /package/src/{agent → runtime/agent}/orchestrator/tools/env-scrub.mjs +0 -0
  805. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-content-cache.mjs +0 -0
  806. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-planner.mjs +0 -0
  807. /package/src/{agent → runtime/agent}/orchestrator/tools/next-call-utils.mjs +0 -0
  808. /package/src/{agent → runtime/agent}/orchestrator/tools/result-compression.mjs +0 -0
  809. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-exec-policy.mjs +0 -0
  810. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy-danger-target.mjs +0 -0
  811. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy.mjs +0 -0
  812. /package/src/{channels → runtime/channels}/lib/cli-worker-host.mjs +0 -0
  813. /package/src/{channels → runtime/channels}/lib/config-lock.mjs +0 -0
  814. /package/src/{channels → runtime/channels}/lib/event-queue.mjs +0 -0
  815. /package/src/{channels → runtime/channels}/lib/executor.mjs +0 -0
  816. /package/src/{channels → runtime/channels}/lib/format.mjs +0 -0
  817. /package/src/{channels → runtime/channels}/lib/interaction-workflows.mjs +0 -0
  818. /package/src/{channels → runtime/channels}/lib/memory-client.mjs +0 -0
  819. /package/src/{channels → runtime/channels}/lib/session-control.mjs +0 -0
  820. /package/src/{channels → runtime/channels}/lib/settings.mjs +0 -0
  821. /package/src/{channels → runtime/channels}/lib/whisper-server.mjs +0 -0
  822. /package/src/{memory → runtime/memory}/lib/agent-ipc.mjs +0 -0
  823. /package/src/{memory → runtime/memory}/lib/bridge-trace-queries.mjs +0 -0
  824. /package/src/{memory → runtime/memory}/lib/llm-worker-host.mjs +0 -0
  825. /package/src/{memory → runtime/memory}/lib/memory-cycle.mjs +0 -0
  826. /package/src/{memory → runtime/memory}/lib/memory-extraction.mjs +0 -0
  827. /package/src/{memory → runtime/memory}/lib/memory-maintenance-store.mjs +0 -0
  828. /package/src/{memory → runtime/memory}/lib/memory-recall-id-patch.mjs +0 -0
  829. /package/src/{memory → runtime/memory}/lib/memory-recall-read-query.mjs +0 -0
  830. /package/src/{memory → runtime/memory}/lib/memory-recall-scope-filter.mjs +0 -0
  831. /package/src/{memory → runtime/memory}/lib/memory-retrievers.mjs +0 -0
  832. /package/src/{memory → runtime/memory}/lib/memory-score.mjs +0 -0
  833. /package/src/{memory → runtime/memory}/lib/memory-text-utils.mjs +0 -0
  834. /package/src/{memory → runtime/memory}/lib/model-profile.mjs +0 -0
  835. /package/src/{memory → runtime/memory}/lib/project-id-resolver.mjs +0 -0
  836. /package/src/{search → runtime/search}/lib/cache.mjs +0 -0
  837. /package/src/{search → runtime/search}/lib/formatter.mjs +0 -0
  838. /package/src/{search → runtime/search}/lib/state.mjs +0 -0
  839. /package/src/{shared → runtime/shared}/abort-controller.mjs +0 -0
  840. /package/src/{shared → runtime/shared}/llm/cost.mjs +0 -0
  841. /package/src/{shared → runtime/shared}/llm/index.mjs +0 -0
  842. /package/src/{shared → runtime/shared}/llm/pid-cleanup.mjs +0 -0
  843. /package/src/{shared → runtime/shared}/llm/usage-log.mjs +0 -0
  844. /package/src/{shared → runtime/shared}/wsl.mjs +0 -0
@@ -0,0 +1,730 @@
1
+ /**
2
+ * src/ui/statusline.mjs — per-turn footer status line.
3
+ *
4
+ * The bottom statusline is rendered from CLI-native state. This module is the
5
+ * normalizing boundary: TUI/REPL state comes in, L1/L2 text comes out.
6
+ *
7
+ * `createSessionStats()` returns a small accumulator the REPL feeds from the
8
+ * engine's `onUsageDelta` callback. Gateway quota/balance helpers are still
9
+ * reused as read-only data sources, but display identity always belongs to the
10
+ * CLI route passed here.
11
+ */
12
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
13
+ import { homedir } from 'node:os';
14
+ import { basename, join } from 'node:path';
15
+ import { bold, colorEnabled, green, rgb } from './ansi.mjs';
16
+ import { forEachSessionRuntime } from '../runtime/agent/orchestrator/session/manager.mjs';
17
+ import { listHiddenRoleNames } from '../runtime/agent/orchestrator/internal-roles.mjs';
18
+ import { getModelMetadataSync } from '../runtime/agent/orchestrator/providers/model-catalog.mjs';
19
+ import { readCachedOAuthUsageSnapshot } from '../runtime/agent/orchestrator/providers/oauth-usage.mjs';
20
+ import { readCachedOpenCodeGoUsageSnapshot } from '../runtime/agent/orchestrator/providers/opencode-go-usage.mjs';
21
+ import { buildGatewayLimits } from '../runtime/agent/orchestrator/providers/statusline-route-meta.mjs';
22
+ import { formatGatewayLimitSegments, loadGatewayStatus } from '../vendor/statusline/bin/statusline-route.mjs';
23
+
24
+ // Token window used to compute a fallback context% from our own session usage.
25
+ // The live gateway (when up) overrides this with the real route's window. This
26
+ // is only the last resort for unknown local models.
27
+ const FALLBACK_CONTEXT_WINDOW = 200000;
28
+ const statusText = rgb(198, 198, 198);
29
+ const statusSubtle = rgb(136, 136, 136);
30
+ const statusAccent = rgb(215, 119, 87);
31
+ const DEFAULT_MIXDOG_HOME = process.env.MIXDOG_HOME || join(homedir(), '.mixdog');
32
+ const DEFAULT_STANDALONE_DATA_DIR = join(DEFAULT_MIXDOG_HOME, 'data');
33
+
34
+ function sgr(code) {
35
+ return colorEnabled() ? `\x1b[${code}m` : '';
36
+ }
37
+
38
+ const R = sgr('0');
39
+ const B = sgr('1');
40
+ const D = sgr('38;2;136;136;136');
41
+ const GRN = sgr('38;2;0;170;75');
42
+ const YLW = sgr('38;2;255;193;7');
43
+ const RED = sgr('38;2;220;70;88');
44
+ const CYN = sgr('38;2;136;136;136');
45
+ const GREY = sgr('38;2;136;136;136');
46
+ const SHELL_JOBS_SEGMENT_CACHE_MS = 1000;
47
+ const GATEWAY_QUOTA_STATUS_CACHE_MS = 500;
48
+ const DEFAULT_HIDDEN_STATUSLINE_ROLES = Object.freeze(['explorer', 'cycle1-agent', 'cycle2-agent', 'cycle3-agent', 'scheduler-task', 'webhook-handler']);
49
+ let _shellJobsSegmentCache = { ownerPid: 0, at: 0, value: '' };
50
+ let _gatewayQuotaStatusCache = { key: '', at: 0, value: null };
51
+ let _fallbackQuotaStatusCache = { key: '', at: 0, value: null };
52
+ let _hiddenStatuslineRoles = null;
53
+
54
+ function summarizeWorkerTags(tags, limit = 3) {
55
+ const cleanTags = [...new Set((Array.isArray(tags) ? tags : [])
56
+ .map((tag) => String(tag || '').trim())
57
+ .filter(Boolean))];
58
+ if (cleanTags.length <= limit) return cleanTags.join(', ');
59
+ return `${cleanTags.slice(0, limit).join(', ')}, +${cleanTags.length - limit}`;
60
+ }
61
+
62
+ /** Create a mutable session-usage accumulator. */
63
+ export function createSessionStats() {
64
+ return {
65
+ inputTokens: 0,
66
+ outputTokens: 0,
67
+ cachedTokens: 0,
68
+ cacheWriteTokens: 0,
69
+ promptTokens: 0,
70
+ latestInputTokens: 0,
71
+ latestOutputTokens: 0,
72
+ latestCachedTokens: 0,
73
+ latestCacheWriteTokens: 0,
74
+ latestPromptTokens: 0,
75
+ costUsd: 0,
76
+ turns: 0,
77
+ };
78
+ }
79
+
80
+ /**
81
+ * Fold one `onUsageDelta` event into the accumulator.
82
+ * @param {object} stats — from createSessionStats()
83
+ * @param {object} delta — { deltaInput, deltaOutput, deltaCachedRead, deltaCacheWrite, costUsd }
84
+ */
85
+ export function applyUsageDelta(stats, delta = {}) {
86
+ if (!stats || !delta) return stats;
87
+ stats.inputTokens += num(delta.deltaInput);
88
+ stats.outputTokens += num(delta.deltaOutput);
89
+ stats.cachedTokens += num(delta.deltaCachedRead);
90
+ stats.cacheWriteTokens += num(delta.deltaCacheWrite);
91
+ stats.promptTokens += num(delta.deltaPrompt);
92
+ stats.latestInputTokens = num(delta.deltaInput);
93
+ stats.latestOutputTokens = num(delta.deltaOutput);
94
+ stats.latestCachedTokens = num(delta.deltaCachedRead);
95
+ stats.latestCacheWriteTokens = num(delta.deltaCacheWrite);
96
+ stats.latestPromptTokens = num(delta.deltaPrompt);
97
+ // costUsd from the engine is cumulative-per-call; we sum the per-turn deltas.
98
+ stats.costUsd += num(delta.costUsd);
99
+ return stats;
100
+ }
101
+
102
+ /**
103
+ * Build the Claude-Code-shaped JSON the vendored renderer reads, from our REPL
104
+ * state. Only the fields `renderStatusLine()` actually consumes are emitted:
105
+ * - display_name → model name (L1)
106
+ * - effort.level → effort string
107
+ * - context_window.* → context% bar (used_percentage + raw tokens
108
+ * so the lib's activeContextTokens() also works)
109
+ * - session_id → gateway session lookup
110
+ * model / context% / effort / 5H-7D are overridden by the live gateway via
111
+ * loadGatewayStatus() when it's running; these are the standalone fallbacks.
112
+ */
113
+ function providerInputExcludesCache(provider) {
114
+ return String(provider || '').toLowerCase().includes('anthropic');
115
+ }
116
+
117
+ function promptFootprintTokens(provider, stats) {
118
+ const s = stats || createSessionStats();
119
+ const explicit = num(s.promptTokens);
120
+ if (explicit > 0) return explicit;
121
+ const input = num(s.inputTokens);
122
+ if (providerInputExcludesCache(provider)) {
123
+ return input + num(s.cachedTokens) + num(s.cacheWriteTokens);
124
+ }
125
+ return input;
126
+ }
127
+
128
+ function currentContextTokens(provider, stats) {
129
+ const s = stats || createSessionStats();
130
+ const source = String(s.currentContextSource || '').toLowerCase();
131
+ const explicit = source === 'estimated'
132
+ ? 0
133
+ : num(s.currentContextTokens ?? s.contextTokens ?? s.latestPromptTokens);
134
+ if (explicit > 0) return explicit;
135
+ const latestInput = num(s.latestInputTokens);
136
+ const latestCacheRead = num(s.latestCachedTokens);
137
+ const latestCacheWrite = num(s.latestCacheWriteTokens);
138
+ if (latestInput || latestCacheRead || latestCacheWrite) {
139
+ return providerInputExcludesCache(provider)
140
+ ? latestInput + latestCacheRead + latestCacheWrite
141
+ : latestInput;
142
+ }
143
+ return promptFootprintTokens(provider, s);
144
+ }
145
+
146
+ function modelContextWindow(provider, model, explicitContextWindow = 0) {
147
+ const explicit = num(explicitContextWindow);
148
+ if (explicit > 0) return explicit;
149
+ const metaWindow = num(getModelMetadataSync(model, provider)?.contextWindow);
150
+ if (metaWindow > 0) return metaWindow;
151
+ return FALLBACK_CONTEXT_WINDOW;
152
+ }
153
+
154
+ function normalizeBridgeWorkerForStatusline(worker = {}) {
155
+ const tag = String(worker.tag || worker.role || worker.name || '').trim();
156
+ if (!tag) return null;
157
+ const statusText = String(worker.stage || worker.status || '').toLowerCase();
158
+ const status = isTerminalBridgeStatus(statusText) ? 'idle' : 'running';
159
+ return {
160
+ tag,
161
+ status,
162
+ role: worker.role || null,
163
+ stage: worker.stage || worker.status || null,
164
+ sessionId: worker.sessionId || null,
165
+ provider: worker.provider || null,
166
+ model: worker.model || null,
167
+ };
168
+ }
169
+
170
+ function normalizeBridgeJobForStatusline(job = {}) {
171
+ const statusText = String(job.status || job.stage || '').toLowerCase();
172
+ if (!statusText) return null;
173
+ const taskId = String(job.task_id || job.taskId || '').trim();
174
+ const tag = String(job.tag || job.role || job.type || taskId || '').trim();
175
+ if (!tag && !taskId) return null;
176
+ const startedAtMs = timeMs(job.startedAt);
177
+ const finishedAtMs = timeMs(job.finishedAt);
178
+ if (isTerminalBridgeStatus(statusText) && finishedAtMs > 0) {
179
+ return {
180
+ tag,
181
+ taskId,
182
+ status: 'finished',
183
+ finalStatus: statusText,
184
+ startedAtMs,
185
+ finishedAtMs,
186
+ role: job.role || null,
187
+ stage: job.stage || job.workerStatus || job.status || null,
188
+ sessionId: job.sessionId || null,
189
+ provider: job.provider || null,
190
+ model: job.model || null,
191
+ };
192
+ }
193
+ if (!/running/.test(statusText)) return null;
194
+ return {
195
+ tag,
196
+ taskId,
197
+ status: 'running',
198
+ role: job.role || null,
199
+ stage: job.stage || job.workerStatus || job.status || null,
200
+ sessionId: job.sessionId || null,
201
+ provider: job.provider || null,
202
+ model: job.model || null,
203
+ };
204
+ }
205
+
206
+ function bridgeStatuslinePayload(bridgeWorkers = [], bridgeJobs = []) {
207
+ const byTag = new Map();
208
+ const finishedJobs = [];
209
+ for (const worker of Array.isArray(bridgeWorkers) ? bridgeWorkers : []) {
210
+ const row = normalizeBridgeWorkerForStatusline(worker);
211
+ if (row) byTag.set(row.tag, row);
212
+ }
213
+ for (const job of Array.isArray(bridgeJobs) ? bridgeJobs : []) {
214
+ const row = normalizeBridgeJobForStatusline(job);
215
+ if (!row) continue;
216
+ if (row.status === 'finished') {
217
+ finishedJobs.push(row);
218
+ continue;
219
+ }
220
+ const prev = byTag.get(row.tag);
221
+ byTag.set(row.tag, { ...(prev || {}), ...row, status: 'running' });
222
+ }
223
+ const workers = [...byTag.values()];
224
+ return {
225
+ workers,
226
+ finishedJobs: finishedJobs.sort((a, b) => (b.finishedAtMs || 0) - (a.finishedAtMs || 0)),
227
+ sessions: {
228
+ roles: workers.filter((w) => w.status !== 'idle').map((w) => w.tag),
229
+ workers,
230
+ },
231
+ };
232
+ }
233
+
234
+ /**
235
+ * Render the L1/L2 statusline footer from CLI state.
236
+ *
237
+ * ASYNC only because gateway quota helpers may touch the filesystem. On ANY
238
+ * error we fall back to a minimal one-line footer so the REPL never sees a
239
+ * throw.
240
+ *
241
+ * @param {object} opts
242
+ * @param {string} opts.provider
243
+ * @param {string} opts.model
244
+ * @param {string} opts.cwd
245
+ * @param {object} opts.stats — createSessionStats() accumulator
246
+ * @param {string} [opts.sessionId]
247
+ * @returns {Promise<string>}
248
+ */
249
+ export async function renderStatusline({ provider = '', model = '', effort = '', fast = false, cwd = '', stats, sessionId, contextWindow = 0, rawContextWindow = 0, bridgeWorkers = [], bridgeJobs = [], clientHostPid = process.pid } = {}) {
250
+ try {
251
+ return renderNativeStatusline({ provider, model, effort, fast, cwd, stats, sessionId, contextWindow, rawContextWindow, bridgeWorkers, bridgeJobs, clientHostPid });
252
+ } catch {
253
+ return fallbackLine({ provider, model, effort, fast, cwd, stats });
254
+ }
255
+ }
256
+
257
+ // --- helpers -----------------------------------------------------------------
258
+
259
+ function renderNativeStatusline({ provider = '', model = '', effort = '', fast = false, stats, sessionId, contextWindow = 0, rawContextWindow = 0, bridgeWorkers = [], bridgeJobs = [], clientHostPid = process.pid } = {}) {
260
+ const cols = terminalColumns();
261
+ const s = stats || createSessionStats();
262
+ const contextTokens = currentContextTokens(provider, s);
263
+ const resolvedContextWindow = modelContextWindow(provider, model, contextWindow);
264
+ const ctxPct = resolvedContextWindow > 0 ? clampPct((contextTokens / resolvedContextWindow) * 100) : 0;
265
+ const gatewayStatus = loadGatewayQuotaStatus({ provider, sessionId, activeContextTokens: contextTokens, clientHostPid });
266
+
267
+ const sep = ` ${D}│${R} `;
268
+ const l1Parts = [];
269
+ const l2Parts = [];
270
+ const addL1 = (seg) => { if (seg) l1Parts.push(seg); };
271
+ const addL2 = (seg) => { if (seg) l2Parts.push(seg); };
272
+
273
+ addL1(formatModelSegment({ provider, model, effort, fast, cols }));
274
+ addL1(formatContextSegment(ctxPct, cols));
275
+
276
+ const quotaStatus = gatewayStatus || fallbackQuotaStatus({ provider, model });
277
+ const quotaSegments = quotaStatus
278
+ ? formatGatewayLimitSegments(quotaStatus, { COLS: cols, D, R, GRN, YLW, RED, colourPct, epochMsToHHMM })
279
+ : [];
280
+ for (const seg of quotaSegments) addL1(seg);
281
+
282
+ const bridgePayload = bridgeStatuslinePayload([
283
+ ...(Array.isArray(bridgeWorkers) ? bridgeWorkers : []),
284
+ ...activeHiddenRoleWorkers({ sessionId, clientHostPid }),
285
+ ], bridgeJobs);
286
+ const { maintenance, runningWorkers } = classifyBridgeWorkers(bridgePayload.workers);
287
+ if (maintenance.length) addL1(maintenance.join(' '));
288
+ addL1(formatShellJobsSegment({ clientHostPid }));
289
+
290
+ if (runningWorkers.length) {
291
+ addL2(`${GRN}●${R} ${B}${runningWorkers.length} Running${R} ${D}(${R}${B}${summarizeWorkerTags(runningWorkers)}${R}${D})${R}`);
292
+ }
293
+ const l1 = l1Parts.join(sep) || 'mixdog';
294
+ const l2 = l2Parts.join(sep);
295
+ return l2 ? `${l1}\n${l2}` : l1;
296
+ }
297
+
298
+ function terminalColumns() {
299
+ const cols = Number(process.stdout?.columns);
300
+ return Number.isFinite(cols) && cols > 0 ? Math.floor(cols) : 120;
301
+ }
302
+
303
+ function dataDir() {
304
+ return process.env.MIXDOG_DATA_DIR || DEFAULT_STANDALONE_DATA_DIR;
305
+ }
306
+
307
+ function loadGatewayQuotaStatus({ provider, sessionId, activeContextTokens, clientHostPid } = {}) {
308
+ const key = [
309
+ String(provider || ''),
310
+ String(sessionId || ''),
311
+ String(clientHostPid || ''),
312
+ Math.floor((Number(activeContextTokens) || 0) / 1024),
313
+ ].join('\0');
314
+ const now = Date.now();
315
+ if (_gatewayQuotaStatusCache.key === key && now - _gatewayQuotaStatusCache.at < GATEWAY_QUOTA_STATUS_CACHE_MS) {
316
+ return _gatewayQuotaStatusCache.value;
317
+ }
318
+ let value = null;
319
+ try {
320
+ const status = loadGatewayStatus({ sessionId, activeContextTokens, clientHostPid });
321
+ if (!status) {
322
+ _gatewayQuotaStatusCache = { key, at: now, value };
323
+ return value;
324
+ }
325
+ const statusProvider = String(status.provider || '').trim();
326
+ const cliProvider = String(provider || '').trim();
327
+ if (cliProvider && statusProvider && statusProvider !== cliProvider) {
328
+ _gatewayQuotaStatusCache = { key, at: now, value };
329
+ return value;
330
+ }
331
+ value = status;
332
+ } catch {
333
+ value = null;
334
+ }
335
+ _gatewayQuotaStatusCache = { key, at: now, value };
336
+ return value;
337
+ }
338
+
339
+ function fallbackQuotaStatus({ provider, model } = {}) {
340
+ const normalizedProvider = String(provider || '').trim().toLowerCase();
341
+ if (!normalizedProvider) return null;
342
+ const cacheKey = `${normalizedProvider}\0${String(model || '').trim()}`;
343
+ const cacheNow = Date.now();
344
+ if (_fallbackQuotaStatusCache.key === cacheKey && cacheNow - _fallbackQuotaStatusCache.at < GATEWAY_QUOTA_STATUS_CACHE_MS) {
345
+ return _fallbackQuotaStatusCache.value;
346
+ }
347
+ const routeInfo = {
348
+ provider: normalizedProvider,
349
+ model: String(model || '').trim(),
350
+ providerKind: providerKindForQuota(normalizedProvider),
351
+ };
352
+ let usageSnapshot = null;
353
+ if (normalizedProvider === 'opencode-go') {
354
+ usageSnapshot = readCachedOpenCodeGoUsageSnapshot();
355
+ if (!usageSnapshot) {
356
+ _fallbackQuotaStatusCache = { key: cacheKey, at: cacheNow, value: null };
357
+ return null;
358
+ }
359
+ } else if (normalizedProvider.includes('oauth')) {
360
+ try {
361
+ usageSnapshot = readCachedOAuthUsageSnapshot(routeInfo);
362
+ } catch {}
363
+ }
364
+ try {
365
+ const limits = buildGatewayLimits(routeInfo, null, usageSnapshot);
366
+ if (!limits?.quotaWindows?.length && !limits?.balance && !limits?.routeSpend) {
367
+ _fallbackQuotaStatusCache = { key: cacheKey, at: cacheNow, value: null };
368
+ return null;
369
+ }
370
+ const value = {
371
+ ...routeInfo,
372
+ quotaWindows: limits.quotaWindows || [],
373
+ balance: limits.balance || null,
374
+ routeSpend: limits.routeSpend || null,
375
+ };
376
+ _fallbackQuotaStatusCache = { key: cacheKey, at: cacheNow, value };
377
+ return value;
378
+ } catch {
379
+ _fallbackQuotaStatusCache = { key: cacheKey, at: cacheNow, value: null };
380
+ return null;
381
+ }
382
+ }
383
+
384
+ function providerKindForQuota(provider) {
385
+ const p = String(provider || '').toLowerCase();
386
+ if (p === 'opencode-go') return 'quota-api';
387
+ if (p.includes('oauth')) return 'oauth';
388
+ if (p === 'ollama' || p === 'lmstudio') return 'local';
389
+ return 'api';
390
+ }
391
+
392
+ function formatModelSegment({ provider, model, effort, fast, cols }) {
393
+ const modelName = shortenModelName(displayModelName(provider, model), cols);
394
+ const bits = [`${CYN}◆${R} ${B}${modelName}${R}`];
395
+ if (effort) bits.push(`${B}${String(effort).toUpperCase()}${R}`);
396
+ if (fast === true) bits.push(`${B}FAST${R}`);
397
+ return bits.join(` ${D}·${R} `);
398
+ }
399
+
400
+ function displayModelName(provider, model) {
401
+ const raw = String(model || '').trim();
402
+ const meta = getModelMetadataSync(raw, provider) || {};
403
+ const display = String(meta.displayName || meta.display || meta.name || '').trim();
404
+ return display || canonicalModelDisplay(raw, provider) || raw || 'model';
405
+ }
406
+
407
+ function titleModelPart(part) {
408
+ const text = String(part || '').trim();
409
+ if (!text) return '';
410
+ const lower = text.toLowerCase();
411
+ if (lower === 'gpt') return 'GPT';
412
+ if (lower === 'api') return 'API';
413
+ if (lower === 'v4') return 'V4';
414
+ return lower.charAt(0).toUpperCase() + lower.slice(1);
415
+ }
416
+
417
+ function canonicalModelDisplay(model, provider) {
418
+ const raw = String(model || '').trim().replace(/-\d{4}-\d{2}-\d{2}$/, '');
419
+ if (!raw) return '';
420
+
421
+ const gpt = raw.match(/^gpt-(\d+(?:\.\d+)?)(?:-(.+))?$/i);
422
+ if (gpt) {
423
+ const suffix = gpt[2]
424
+ ? '-' + gpt[2].split('-').map(titleModelPart).filter(Boolean).join('-')
425
+ : '';
426
+ return `GPT-${gpt[1]}${suffix}`;
427
+ }
428
+
429
+ const codex = raw.match(/^codex-(.+)$/i);
430
+ if (codex) {
431
+ return `Codex ${codex[1].split('-').map(titleModelPart).filter(Boolean).join(' ')}`;
432
+ }
433
+
434
+ const deepseek = raw.match(/^deepseek-(.+)$/i);
435
+ if (deepseek) {
436
+ return `DeepSeek ${deepseek[1].split('-').map(titleModelPart).filter(Boolean).join(' ')}`;
437
+ }
438
+
439
+ const grok = raw.match(/^grok-(.+)$/i);
440
+ if (grok) {
441
+ return `Grok ${grok[1].split('-').map(titleModelPart).filter(Boolean).join(' ')}`;
442
+ }
443
+
444
+ const claude = raw.match(/^claude-(opus|sonnet|haiku)-(.+)$/i);
445
+ if (claude) {
446
+ return `Claude ${titleModelPart(claude[1])} ${claude[2].replace(/-/g, '.')}`;
447
+ }
448
+
449
+ return raw;
450
+ }
451
+
452
+ function shortenModelName(name, cols) {
453
+ let out = String(name || 'model').replace(/\s*\(1M context\)/i, ' (1M)');
454
+ out = out.replace(/^Claude\s+/i, '');
455
+ out = out.replace(/^OpenAI\s+/i, '');
456
+ if (cols < 80 && out.length > 18) return out.slice(0, 17) + '…';
457
+ if (cols < 120 && out.length > 28) return out.slice(0, 27) + '…';
458
+ return out;
459
+ }
460
+
461
+ function formatContextSegment(ctxPct, cols) {
462
+ const pct = clampPct(ctxPct);
463
+ const fill = pct >= 90 ? RED : pct >= 70 ? YLW : GRN;
464
+ const label = pct > 0 && pct < 1 ? String(Math.round(pct * 10) / 10) : String(Math.floor(pct));
465
+ const cells = cols >= 120 ? 14 : cols >= 80 ? 8 : 0;
466
+ if (!cells) return `${fill}${label}%${R}`;
467
+ const bar = makeBar(pct, cells);
468
+ const filled = bar.replace(/░/g, '');
469
+ const empty = bar.replace(/▓/g, '');
470
+ return `${fill}${filled}${R}${D}${empty}${R} ${label}%`;
471
+ }
472
+
473
+ function makeBar(pct, cells) {
474
+ let filled = Math.floor((Number(pct) || 0) * cells / 100);
475
+ if (filled < 0) filled = 0;
476
+ if (filled > cells) filled = cells;
477
+ if (pct >= 1 && filled === 0) filled = 1;
478
+ return '▓'.repeat(filled) + '░'.repeat(cells - filled);
479
+ }
480
+
481
+ function colourPct(p) {
482
+ if (p >= 90) return `${RED}${p}%${R}`;
483
+ if (p >= 70) return `${YLW}${p}%${R}`;
484
+ return `${GRN}${p}%${R}`;
485
+ }
486
+
487
+ function epochMsToHHMM(ms) {
488
+ const d = new Date(Number(ms));
489
+ if (!Number.isFinite(d.getTime())) return '';
490
+ return d.toLocaleTimeString('sv-SE', { hour: '2-digit', minute: '2-digit', hour12: false });
491
+ }
492
+
493
+ function classifyBridgeWorkers(workers = []) {
494
+ const maintenance = [];
495
+ const runningWorkers = [];
496
+ const seenMaintenance = new Set();
497
+ const seenRunning = new Set();
498
+ for (const w of Array.isArray(workers) ? workers : []) {
499
+ const tag = String(w?.tag || '').trim();
500
+ if (!tag) continue;
501
+ const maint = hiddenWorkerLabel(w);
502
+ if (maint) {
503
+ if (w.status !== 'idle' && !seenMaintenance.has(maint)) {
504
+ seenMaintenance.add(maint);
505
+ maintenance.push(`${GRN}↻${R} ${B}${maint}${R}`);
506
+ }
507
+ continue;
508
+ }
509
+ if (w.status !== 'idle' && !seenRunning.has(tag)) {
510
+ seenRunning.add(tag);
511
+ runningWorkers.push(tag);
512
+ }
513
+ }
514
+ return { maintenance, runningWorkers };
515
+ }
516
+
517
+ function hiddenWorkerLabel(worker = {}) {
518
+ const role = String(worker?.role || '').trim();
519
+ const tag = String(worker?.tag || '').trim();
520
+ return maintenanceLabel(role) || (!role ? maintenanceLabel(tag) : '');
521
+ }
522
+
523
+ function hiddenStatuslineRoles() {
524
+ if (_hiddenStatuslineRoles) return _hiddenStatuslineRoles;
525
+ const roles = new Set(DEFAULT_HIDDEN_STATUSLINE_ROLES);
526
+ try {
527
+ for (const role of listHiddenRoleNames()) {
528
+ const clean = String(role || '').trim();
529
+ if (clean) roles.add(clean);
530
+ }
531
+ } catch {}
532
+ _hiddenStatuslineRoles = roles;
533
+ return roles;
534
+ }
535
+
536
+ function isActiveHiddenStatus(statusText) {
537
+ return /^(connecting|requesting|streaming|tool_running|running)$/i.test(String(statusText || '').trim());
538
+ }
539
+
540
+ function activeHiddenRoleWorkers({ sessionId = '', clientHostPid = 0 } = {}) {
541
+ const roles = hiddenStatuslineRoles();
542
+ const ownerPid = positiveInt(clientHostPid);
543
+ const ownerSessionId = String(sessionId || '').trim();
544
+ const rows = [];
545
+ try {
546
+ for (const [runtimeSessionId, entry] of forEachSessionRuntime() || []) {
547
+ if (!entry || entry.closed === true) continue;
548
+ const session = entry.session || null;
549
+ if (!session || session.closed === true) continue;
550
+ const role = String(session?.role || '').trim();
551
+ if (!role || !roles.has(role)) continue;
552
+ const id = session?.id || runtimeSessionId || null;
553
+ if (ownerSessionId && id === ownerSessionId) continue;
554
+ const sessionOwnerId = String(session?.ownerSessionId || '').trim();
555
+ if (sessionOwnerId && ownerSessionId && sessionOwnerId !== ownerSessionId) continue;
556
+ const pid = positiveInt(session?.clientHostPid);
557
+ if (ownerPid && pid && pid !== ownerPid) continue;
558
+ const stage = String(entry.stage || session?.stage || session?.status || '').trim().toLowerCase();
559
+ const status = String(session?.status || stage || '').trim().toLowerCase();
560
+ if (!isActiveHiddenStatus(stage || status)) continue;
561
+ rows.push({
562
+ tag: String(session?.bridgeTag || `${role}:${id || rows.length}`).trim(),
563
+ role,
564
+ status: 'running',
565
+ stage: stage || status || 'running',
566
+ sessionId: id,
567
+ provider: session?.provider || null,
568
+ model: session?.model || null,
569
+ });
570
+ }
571
+ } catch {}
572
+ return rows;
573
+ }
574
+
575
+ function isTerminalBridgeStatus(statusText) {
576
+ return /idle|done|complete|success|closed|error|fail|cancel|killed|timeout/.test(String(statusText || '').toLowerCase());
577
+ }
578
+
579
+ function timeMs(value) {
580
+ if (typeof value === 'number' && Number.isFinite(value) && value > 0) return value;
581
+ const n = Date.parse(String(value || ''));
582
+ return Number.isFinite(n) ? n : 0;
583
+ }
584
+
585
+ function maintenanceLabel(tag) {
586
+ switch (tag) {
587
+ case 'cycle1-agent': return 'cycle1';
588
+ case 'cycle2-agent': return 'cycle2';
589
+ case 'cycle3-agent': return 'cycle3';
590
+ case 'scheduler-task': return 'scheduler';
591
+ case 'webhook-handler': return 'webhook';
592
+ case 'explorer': return 'explorer';
593
+ default: return '';
594
+ }
595
+ }
596
+
597
+ function formatShellJobsSegment({ clientHostPid } = {}) {
598
+ const ownerPid = positiveInt(clientHostPid);
599
+ if (!ownerPid) return '';
600
+ const now = Date.now();
601
+ if (_shellJobsSegmentCache.ownerPid === ownerPid && now - _shellJobsSegmentCache.at < SHELL_JOBS_SEGMENT_CACHE_MS) {
602
+ return _shellJobsSegmentCache.value;
603
+ }
604
+ let value = '';
605
+ try {
606
+ const dir = join(dataDir(), 'shell-jobs');
607
+ if (!existsSync(dir)) {
608
+ _shellJobsSegmentCache = { ownerPid, at: now, value };
609
+ return value;
610
+ }
611
+ const names = readdirSync(dir);
612
+ const done = new Set(names.filter((n) => n.endsWith('.done')).map((n) => n.slice(0, -5)));
613
+ const ownerByJob = new Map();
614
+ for (const n of names) {
615
+ const i = n.lastIndexOf('.owner-');
616
+ if (i > 0) {
617
+ const pid = positiveInt(n.slice(i + 7));
618
+ if (pid) ownerByJob.set(n.slice(0, i), pid);
619
+ }
620
+ }
621
+ const ids = names
622
+ .filter((n) => n.endsWith('.json'))
623
+ .map((n) => n.slice(0, -5))
624
+ .filter((id) => !done.has(id) && ownerByJob.get(id) === ownerPid)
625
+ .sort((a, b) => jobStampMs(b) - jobStampMs(a))
626
+ .slice(0, 30);
627
+ let count = 0;
628
+ let oldestMs = Infinity;
629
+ for (const id of ids) {
630
+ const p = join(dir, `${id}.json`);
631
+ let detail;
632
+ try { detail = JSON.parse(readFileSync(p, 'utf-8')); } catch { continue; }
633
+ if (!isShellJobAlive(detail, p, dir, id)) continue;
634
+ count++;
635
+ try {
636
+ const st = statSync(p);
637
+ if (st.mtimeMs < oldestMs) oldestMs = st.mtimeMs;
638
+ } catch {}
639
+ }
640
+ if (!count) {
641
+ _shellJobsSegmentCache = { ownerPid, at: now, value };
642
+ return value;
643
+ }
644
+ const elapsedLabel = Number.isFinite(oldestMs) ? formatElapsed(Date.now() - oldestMs) : '';
645
+ const elapsed = elapsedLabel ? ` ${elapsedLabel}` : '';
646
+ value = `${GREY}⚙ shell:${count}${elapsed}${R}`;
647
+ } catch {
648
+ value = '';
649
+ }
650
+ _shellJobsSegmentCache = { ownerPid, at: now, value };
651
+ return value;
652
+ }
653
+
654
+ function isShellJobAlive(detail, detailPath, dir, id) {
655
+ const pid = positiveInt(detail?.pid);
656
+ if (!pid) return false;
657
+ try {
658
+ const st = statSync(detailPath);
659
+ const timeoutMs = Number(detail?.timeoutMs);
660
+ const enforced = detail?.timeoutEnforced === true || existsSync(join(dir, `${id}.enforced`));
661
+ if (enforced && Number.isFinite(timeoutMs) && timeoutMs > 0 && Date.now() - st.mtimeMs > timeoutMs + 30 * 60_000) {
662
+ return false;
663
+ }
664
+ } catch {
665
+ return false;
666
+ }
667
+ try {
668
+ process.kill(pid, 0);
669
+ return true;
670
+ } catch (e) {
671
+ return e?.code === 'EPERM';
672
+ }
673
+ }
674
+
675
+ function jobStampMs(id) {
676
+ const m = /^job_(\d+)/.exec(String(id || ''));
677
+ return m ? Number(m[1]) : 0;
678
+ }
679
+
680
+ function positiveInt(value) {
681
+ const n = Number(value);
682
+ return Number.isInteger(n) && n > 0 ? n : 0;
683
+ }
684
+
685
+ function formatElapsed(ms) {
686
+ const secs = Math.max(0, Math.floor(Number(ms || 0) / 1000));
687
+ if (secs < 1) return '';
688
+ if (secs < 60) return `${secs}s`;
689
+ const mins = Math.floor(secs / 60);
690
+ if (mins < 60) return `${mins}m`;
691
+ return `${Math.floor(mins / 60)}h`;
692
+ }
693
+
694
+ /** Minimal one-line footer used when the vendored renderer is unavailable. */
695
+ function fallbackLine({ provider = '', model = '', effort = '', fast = false, cwd = '', stats } = {}) {
696
+ const s = stats || createSessionStats();
697
+ const sep = statusSubtle(' | ');
698
+ const flags = [effort ? String(effort).toUpperCase() : '', fast === true ? 'FAST' : ''].filter(Boolean).join(' | ');
699
+ const id = statusAccent(`${provider}/${model}${flags ? ` | ${flags}` : ''}`);
700
+ const tokens = statusText(
701
+ `${fmt(s.inputTokens)} in / ${fmt(s.outputTokens)} out` +
702
+ (s.cachedTokens ? ` / ${fmt(s.cachedTokens)} read` : '') +
703
+ (s.cacheWriteTokens ? ` / ${fmt(s.cacheWriteTokens)} write` : ''),
704
+ );
705
+ const cost = s.costUsd > 0 ? green('$' + s.costUsd.toFixed(4)) : statusSubtle('$0.0000');
706
+ const dir = bold(basename(cwd || process.cwd()) || cwd);
707
+ return statusSubtle('> ') + [id, tokens, cost, dir].join(sep);
708
+ }
709
+
710
+ function num(v) {
711
+ const n = Number(v);
712
+ return Number.isFinite(n) ? n : 0;
713
+ }
714
+
715
+ function clampPct(v) {
716
+ const n = Number(v);
717
+ if (!Number.isFinite(n)) return 0;
718
+ return Math.max(0, Math.min(100, n));
719
+ }
720
+
721
+ /** Human-friendly token count: 1234 -> 1.2k. */
722
+ function fmt(n) {
723
+ const v = Number(n) || 0;
724
+ if (v < 1000) return String(Math.round(v));
725
+ if (v < 1_000_000) {
726
+ const k = Math.round(v / 1000);
727
+ return k >= 1000 ? '1M' : `${k}k`;
728
+ }
729
+ return (v / 1_000_000).toFixed(1) + 'M';
730
+ }