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,734 @@
1
+ const __mixdogMemoryStderrWrite = process.stderr.write.bind(process.stderr);
2
+ function __mixdogMemoryLog(...args) {
3
+ if (process.env.MIXDOG_QUIET_MEMORY_LOG) return true;
4
+ return __mixdogMemoryStderrWrite(...args);
5
+ }
6
+
7
+ // trace-store.mjs — native-PG trace analytics store for mixdog 0.4.0.
8
+ // Uses pg-adapter (schema='trace') so trace_events live in the trace schema.
9
+ // Isolated from memory schema; shares the same PG instance.
10
+
11
+ import { ensurePgInstance, checkedConnect } from './pg/adapter.mjs'
12
+ import { resolve } from 'path'
13
+
14
+ const dbs = new Map()
15
+ const opening = new Map()
16
+ const partitionTimers = new Map()
17
+
18
+ // ---------------------------------------------------------------------------
19
+ // Schema bootstrap
20
+ // ---------------------------------------------------------------------------
21
+
22
+ // Guard: if a non-partitioned trace_events exists, drop it.
23
+ // Trace is regenerable observability data; drop on schema repair to avoid
24
+ // stale dependent pollution (indexes are NOT renamed with the table, so RENAME
25
+ // would leave old index names bound to the replaced table, making subsequent
26
+ // CREATE INDEX IF NOT EXISTS a no-op on the new partitioned root).
27
+ async function maybeDropLegacyTable(client) {
28
+ const r = await client.query(`
29
+ SELECT c.relname
30
+ FROM pg_class c
31
+ JOIN pg_namespace n ON n.oid = c.relnamespace
32
+ WHERE n.nspname = 'trace'
33
+ AND c.relname = 'trace_events'
34
+ AND c.relkind = 'r' -- ordinary (non-partitioned) table only
35
+ AND c.oid NOT IN (
36
+ SELECT partrelid FROM pg_partitioned_table
37
+ )
38
+ `)
39
+ if (r.rows.length > 0) {
40
+ await client.query(`DROP TABLE trace.trace_events CASCADE`)
41
+ }
42
+ }
43
+
44
+ async function init(client) {
45
+ await maybeDropLegacyTable(client)
46
+
47
+ // Partitioned root.
48
+ // PK is (id, ts) because PostgreSQL requires the partition key (ts) to be
49
+ // part of every unique/primary constraint on a partitioned table.
50
+ // BIGSERIAL is kept (vs GENERATED ALWAYS AS IDENTITY) for compatibility with
51
+ // the existing pg-adapter helpers that may inspect sequence names.
52
+ await client.query(`
53
+ CREATE TABLE IF NOT EXISTS trace_events (
54
+ id BIGSERIAL,
55
+ ts BIGINT NOT NULL,
56
+ session_id TEXT,
57
+ iteration INTEGER,
58
+ kind TEXT NOT NULL,
59
+ role TEXT,
60
+ model TEXT,
61
+ tool_name TEXT,
62
+ tool_ms INTEGER,
63
+ input_tokens INTEGER,
64
+ output_tokens INTEGER,
65
+ cached_tokens INTEGER,
66
+ cache_write_tokens INTEGER,
67
+ duration_ms INTEGER,
68
+ error_message TEXT,
69
+ payload JSONB NOT NULL,
70
+ parent_span_id BIGINT,
71
+ entry_id BIGINT,
72
+ PRIMARY KEY (id, ts)
73
+ ) PARTITION BY RANGE (ts)
74
+ `)
75
+
76
+ // Default catch-all partition — ensures no INSERT is lost even before named
77
+ // monthly partitions exist. Rows here cannot be auto-rerouted once a covering
78
+ // partition is added, so ensureCurrentAndNextMonthPartitions() is called on
79
+ // every boot to pre-create upcoming months before rollover.
80
+ await client.query(`
81
+ CREATE TABLE IF NOT EXISTS trace_events_default
82
+ PARTITION OF trace_events DEFAULT
83
+ `)
84
+
85
+ // Previous-month partition — created in init only (not on every boot).
86
+ await client.query(`
87
+ DO $$
88
+ DECLARE
89
+ prev_start BIGINT := extract(epoch from date_trunc('month', now() - interval '1 month'))::BIGINT * 1000;
90
+ prev_end BIGINT := extract(epoch from date_trunc('month', now()))::BIGINT * 1000;
91
+ prev_name TEXT := 'trace_events_' || to_char(now() - interval '1 month', 'YYYY_MM');
92
+ BEGIN
93
+ IF NOT EXISTS (
94
+ SELECT 1 FROM pg_class c
95
+ JOIN pg_namespace n ON n.oid = c.relnamespace
96
+ WHERE n.nspname = 'trace' AND c.relname = prev_name
97
+ ) THEN
98
+ EXECUTE format(
99
+ 'CREATE TABLE %I PARTITION OF trace_events FOR VALUES FROM (%s) TO (%s)',
100
+ prev_name, prev_start, prev_end
101
+ );
102
+ END IF;
103
+ END $$
104
+ `)
105
+
106
+ // BRIN on ts — ~1000× smaller than btree for append-only timeseries; ideal
107
+ // for time-window range scans where rows arrive in roughly ts order.
108
+ await client.query(`CREATE INDEX IF NOT EXISTS idx_trace_ts_brin ON trace_events USING BRIN (ts) WITH (pages_per_range = 32)`)
109
+ await client.query(`CREATE INDEX IF NOT EXISTS idx_trace_kind_ts ON trace_events(kind, ts DESC)`)
110
+ await client.query(`CREATE INDEX IF NOT EXISTS idx_trace_session ON trace_events(session_id, ts)`)
111
+ await client.query(`CREATE INDEX IF NOT EXISTS idx_trace_role_ts ON trace_events(role, ts DESC)`)
112
+ await client.query(`CREATE INDEX IF NOT EXISTS idx_trace_model_ts ON trace_events(model, ts DESC)`)
113
+ await client.query(`CREATE INDEX IF NOT EXISTS idx_trace_tool ON trace_events(tool_name) WHERE kind = 'tool'`)
114
+ // Span-tree and cross-schema recall↔trace correlation — partial indexes so
115
+ // they cover only the (small) fraction of rows where these FKs are set.
116
+ // No FK constraints: self-FKs on partitioned tables are fragile, and
117
+ // entry_id crosses schema boundaries (memory.entries).
118
+ await client.query(`CREATE INDEX IF NOT EXISTS idx_trace_parent ON trace_events(parent_span_id) WHERE parent_span_id IS NOT NULL`)
119
+ await client.query(`CREATE INDEX IF NOT EXISTS idx_trace_entry ON trace_events(entry_id) WHERE entry_id IS NOT NULL`)
120
+
121
+ // Current + next month created on every boot (see ensureCurrentAndNextMonthPartitions).
122
+ await ensureCurrentAndNextMonthPartitions(client)
123
+ }
124
+
125
+ // ---------------------------------------------------------------------------
126
+ // Bridge-specific analytic tables (added post-init via initBridgeTables)
127
+ // ---------------------------------------------------------------------------
128
+
129
+ // Called once per openTraceDatabase boot (after the advisory lock is released).
130
+ // Safe to call concurrently — all DDL is IF NOT EXISTS.
131
+ export async function initBridgeTables(client) {
132
+ // ── bridge_calls: one row per tool invocation ─────────────────────────────
133
+ await client.query(`
134
+ CREATE TABLE IF NOT EXISTS bridge_calls (
135
+ id BIGSERIAL PRIMARY KEY,
136
+ session_id TEXT NOT NULL,
137
+ iteration INT,
138
+ ts TIMESTAMPTZ NOT NULL,
139
+ tool_name TEXT,
140
+ tool_kind TEXT,
141
+ tool_ms INT,
142
+ tool_args JSONB
143
+ )
144
+ `)
145
+ await client.query(`CREATE INDEX IF NOT EXISTS idx_bc_session ON bridge_calls (session_id, iteration)`)
146
+ await client.query(`CREATE INDEX IF NOT EXISTS idx_bc_ts ON bridge_calls USING BRIN (ts)`)
147
+ await client.query(`CREATE INDEX IF NOT EXISTS idx_bc_tool_name ON bridge_calls (tool_name)`)
148
+ // Expression indexes covering the two actual query patterns (md5 dedup + path lookup).
149
+ // The old GIN index had no @> callers and was write-heavy; dropped in favour of these.
150
+ await client.query(`CREATE INDEX IF NOT EXISTS idx_bc_args_md5 ON bridge_calls (session_id, tool_name, md5(tool_args::text))`)
151
+ await client.query(`CREATE INDEX IF NOT EXISTS idx_bc_args_path ON bridge_calls (session_id, tool_name, (tool_args->>'path'), ts, id)`)
152
+ await client.query(`DROP INDEX IF EXISTS idx_bc_args`)
153
+
154
+ // ── bridge_llm: one row per LLM usage event ───────────────────────────────
155
+ await client.query(`
156
+ CREATE TABLE IF NOT EXISTS bridge_llm (
157
+ id BIGSERIAL PRIMARY KEY,
158
+ session_id TEXT NOT NULL,
159
+ iteration INT,
160
+ ts TIMESTAMPTZ NOT NULL,
161
+ model TEXT,
162
+ input_tokens INT,
163
+ output_tokens INT,
164
+ cached_tokens INT,
165
+ cache_write_tokens INT,
166
+ prompt_tokens INT,
167
+ response_id TEXT
168
+ )
169
+ `)
170
+ await client.query(`CREATE INDEX IF NOT EXISTS idx_bl_session ON bridge_llm (session_id, iteration)`)
171
+ await client.query(`CREATE INDEX IF NOT EXISTS idx_bl_ts ON bridge_llm USING BRIN (ts)`)
172
+ await client.query(`CREATE INDEX IF NOT EXISTS idx_bl_model ON bridge_llm (model)`)
173
+
174
+ // ── bridge_sessions: denormalised summary upserted on each insert ─────────
175
+ await client.query(`
176
+ CREATE TABLE IF NOT EXISTS bridge_sessions (
177
+ session_id TEXT PRIMARY KEY,
178
+ role TEXT,
179
+ model TEXT,
180
+ started_at TIMESTAMPTZ,
181
+ last_seen_at TIMESTAMPTZ,
182
+ tool_calls INT NOT NULL DEFAULT 0,
183
+ llm_calls INT NOT NULL DEFAULT 0,
184
+ max_iteration INT NOT NULL DEFAULT 0,
185
+ total_input_tokens BIGINT NOT NULL DEFAULT 0,
186
+ total_output_tokens BIGINT NOT NULL DEFAULT 0
187
+ )
188
+ `)
189
+ }
190
+
191
+ // ---------------------------------------------------------------------------
192
+ // insertBridgeCalls — batch insert tool rows + upsert session summary
193
+ // ---------------------------------------------------------------------------
194
+ const TOOL_ARGS_MAX_BYTES = 65536 // 64 KB cap; oversized → sha256 + truncated preview
195
+
196
+ import { createHash as _createHash } from 'crypto'
197
+ function _capToolArgsSync(args) {
198
+ if (args == null) return null
199
+ const raw = typeof args === 'string' ? args : JSON.stringify(args)
200
+ if (Buffer.byteLength(raw, 'utf8') <= TOOL_ARGS_MAX_BYTES) {
201
+ if (typeof args !== 'string') return args
202
+ // tool_args is JSONB in PG; round-trip parse for string inputs, but a
203
+ // plain non-JSON string (e.g. a bare path) would otherwise throw and
204
+ // fail the whole insert batch. Treat unparseable as the raw string.
205
+ try { return JSON.parse(raw) } catch { return raw }
206
+ }
207
+ return { _oversized: true, sha256: _createHash('sha256').update(raw).digest('hex'), preview: raw.slice(0, 512) }
208
+ }
209
+
210
+ export async function insertBridgeCalls(db, events) {
211
+ if (!Array.isArray(events) || events.length === 0) return { calls: 0, llm: 0 }
212
+ const toolRows = []
213
+ const llmRows = []
214
+ for (const ev of events) {
215
+ let ts = ev.ts; if (typeof ts === 'string') ts = Date.parse(ts); ts = Number(ts); if (!Number.isFinite(ts)) ts = Date.now()
216
+ const tsIso = new Date(ts).toISOString()
217
+ const sid = ev.session_id ?? ev.sessionId ?? null
218
+ if (!sid) continue
219
+ const iter = ev.iteration != null ? Number(ev.iteration) : null
220
+ if (ev.kind === 'tool') {
221
+ const tool_name = ev.tool_name ?? ev.toolName ?? null
222
+ const tool_kind = ev.tool_kind ?? ev.toolKind ?? null
223
+ const tool_ms = ev.tool_ms ?? ev.toolMs ?? null
224
+ const tool_args = ev.tool_args ?? ev.toolArgs ?? null
225
+ toolRows.push({ session_id: sid, iteration: iter, ts: tsIso, tool_name, tool_kind, tool_ms: tool_ms != null ? Number(tool_ms) : null, tool_args: _capToolArgsSync(tool_args) })
226
+ } else if (ev.kind === 'usage_raw' || (ev.input_tokens != null && ev.output_tokens != null)) {
227
+ llmRows.push({ session_id: sid, iteration: iter, ts: tsIso, model: ev.model ?? null,
228
+ input_tokens: ev.input_tokens ?? ev.inputTokens ?? null,
229
+ output_tokens: ev.output_tokens ?? ev.outputTokens ?? null,
230
+ cached_tokens: ev.cached_tokens ?? ev.cachedTokens ?? null,
231
+ cache_write_tokens: ev.cache_write_tokens ?? ev.cacheWriteTokens ?? null,
232
+ prompt_tokens: ev.prompt_tokens ?? ev.promptTokens ?? null,
233
+ response_id: ev.response_id ?? ev.responseId ?? null,
234
+ })
235
+ }
236
+ }
237
+
238
+ // Wrap all three inserts in a single transaction — one flush/fsync.
239
+ // checkedConnect ensures search_path = trace, public on fresh connections;
240
+ // raw _pool.connect() leaves search_path at PG default and bridge_* lookups
241
+ // resolve in the wrong schema.
242
+ const client = await checkedConnect(db._pool, 'trace')
243
+ try {
244
+ await client.query('BEGIN')
245
+
246
+ if (toolRows.length > 0) {
247
+ await client.query(
248
+ `INSERT INTO bridge_calls (session_id,iteration,ts,tool_name,tool_kind,tool_ms,tool_args)
249
+ SELECT u.session_id, u.iteration::int, u.ts::timestamptz,
250
+ u.tool_name, u.tool_kind, u.tool_ms::int, u.tool_args::jsonb
251
+ FROM unnest($1::text[],$2::int[],$3::text[],$4::text[],$5::text[],$6::int[],$7::text[])
252
+ AS u(session_id,iteration,ts,tool_name,tool_kind,tool_ms,tool_args)`,
253
+ [
254
+ toolRows.map(r => r.session_id),
255
+ toolRows.map(r => r.iteration),
256
+ toolRows.map(r => r.ts),
257
+ toolRows.map(r => r.tool_name),
258
+ toolRows.map(r => r.tool_kind),
259
+ toolRows.map(r => r.tool_ms),
260
+ toolRows.map(r => r.tool_args != null ? JSON.stringify(r.tool_args) : null),
261
+ ],
262
+ )
263
+ }
264
+
265
+ if (llmRows.length > 0) {
266
+ await client.query(
267
+ `INSERT INTO bridge_llm (session_id,iteration,ts,model,input_tokens,output_tokens,cached_tokens,cache_write_tokens,prompt_tokens,response_id)
268
+ SELECT u.session_id, u.iteration::int, u.ts::timestamptz,
269
+ u.model, u.input_tokens::int, u.output_tokens::int,
270
+ u.cached_tokens::int, u.cache_write_tokens::int,
271
+ u.prompt_tokens::int, u.response_id
272
+ FROM unnest($1::text[],$2::int[],$3::text[],$4::text[],$5::int[],$6::int[],$7::int[],$8::int[],$9::int[],$10::text[])
273
+ AS u(session_id,iteration,ts,model,input_tokens,output_tokens,cached_tokens,cache_write_tokens,prompt_tokens,response_id)`,
274
+ [
275
+ llmRows.map(r => r.session_id),
276
+ llmRows.map(r => r.iteration),
277
+ llmRows.map(r => r.ts),
278
+ llmRows.map(r => r.model),
279
+ llmRows.map(r => r.input_tokens),
280
+ llmRows.map(r => r.output_tokens),
281
+ llmRows.map(r => r.cached_tokens),
282
+ llmRows.map(r => r.cache_write_tokens),
283
+ llmRows.map(r => r.prompt_tokens),
284
+ llmRows.map(r => r.response_id),
285
+ ],
286
+ )
287
+ }
288
+
289
+ // Upsert session summaries — accumulate from tool+llm rows in this batch
290
+ const sessionMap = new Map()
291
+ for (const r of toolRows) {
292
+ const s = sessionMap.get(r.session_id) ?? { tool_calls: 0, llm_calls: 0, max_iteration: 0, total_input: 0n, total_output: 0n, ts0: r.ts, ts1: r.ts, role: null, model: null }
293
+ s.tool_calls += 1
294
+ if (r.iteration != null && r.iteration > s.max_iteration) s.max_iteration = r.iteration
295
+ if (r.ts < s.ts0) s.ts0 = r.ts; if (r.ts > s.ts1) s.ts1 = r.ts
296
+ sessionMap.set(r.session_id, s)
297
+ }
298
+ for (const r of llmRows) {
299
+ const s = sessionMap.get(r.session_id) ?? { tool_calls: 0, llm_calls: 0, max_iteration: 0, total_input: 0n, total_output: 0n, ts0: r.ts, ts1: r.ts, role: null, model: null }
300
+ s.llm_calls += 1
301
+ s.total_input += BigInt(r.input_tokens ?? 0)
302
+ s.total_output += BigInt(r.output_tokens ?? 0)
303
+ if (r.model) s.model = r.model
304
+ if (r.iteration != null && r.iteration > s.max_iteration) s.max_iteration = r.iteration
305
+ if (r.ts < s.ts0) s.ts0 = r.ts; if (r.ts > s.ts1) s.ts1 = r.ts
306
+ sessionMap.set(r.session_id, s)
307
+ }
308
+ // Also pick up role from preset_assign events in the same batch
309
+ for (const ev of events) {
310
+ if (ev.kind === 'preset_assign' && ev.role) {
311
+ const sid = ev.session_id ?? ev.sessionId ?? null
312
+ if (!sid) continue
313
+ const s = sessionMap.get(sid)
314
+ if (s) s.role = ev.role
315
+ }
316
+ }
317
+ // Fix 5 — upsert sessions for preset_assign-only batches (no tool/llm rows yet)
318
+ for (const ev of events) {
319
+ if (ev.kind !== 'preset_assign') continue
320
+ const sid = ev.session_id ?? ev.sessionId ?? null
321
+ if (!sid) continue
322
+ if (sessionMap.has(sid)) continue // already populated from tool/llm rows above
323
+ let ts = ev.ts; if (typeof ts === 'string') ts = Date.parse(ts); ts = Number(ts); if (!Number.isFinite(ts)) ts = Date.now()
324
+ const tsIso = new Date(ts).toISOString()
325
+ sessionMap.set(sid, {
326
+ tool_calls: 0, llm_calls: 0, max_iteration: 0,
327
+ total_input: 0n, total_output: 0n,
328
+ ts0: tsIso, ts1: tsIso,
329
+ role: ev.role ?? null, model: ev.model ?? null,
330
+ })
331
+ }
332
+
333
+ // Coalesce bridge_sessions upserts: batch all sessions in one unnest INSERT.
334
+ // Also within the same transaction.
335
+ if (sessionMap.size > 0) {
336
+ const sids = [], roles = [], models = [], ts0s = [], ts1s = [],
337
+ tcalls = [], lcalls = [], maxiters = [], tinputs = [], toutputs = []
338
+ for (const [sid, s] of sessionMap) {
339
+ sids.push(sid); roles.push(s.role); models.push(s.model)
340
+ ts0s.push(s.ts0); ts1s.push(s.ts1)
341
+ tcalls.push(s.tool_calls); lcalls.push(s.llm_calls)
342
+ maxiters.push(s.max_iteration)
343
+ tinputs.push(String(s.total_input)); toutputs.push(String(s.total_output))
344
+ }
345
+ await client.query(`
346
+ INSERT INTO bridge_sessions (session_id, role, model, started_at, last_seen_at, tool_calls, llm_calls, max_iteration, total_input_tokens, total_output_tokens)
347
+ SELECT u.session_id, u.role, u.model,
348
+ u.started_at::timestamptz, u.last_seen_at::timestamptz,
349
+ u.tool_calls::int, u.llm_calls::int, u.max_iteration::int,
350
+ u.total_input_tokens::bigint, u.total_output_tokens::bigint
351
+ FROM unnest($1::text[],$2::text[],$3::text[],$4::text[],$5::text[],$6::int[],$7::int[],$8::int[],$9::text[],$10::text[])
352
+ AS u(session_id,role,model,started_at,last_seen_at,tool_calls,llm_calls,max_iteration,total_input_tokens,total_output_tokens)
353
+ ON CONFLICT (session_id) DO UPDATE SET
354
+ role = COALESCE(EXCLUDED.role, bridge_sessions.role),
355
+ model = COALESCE(EXCLUDED.model, bridge_sessions.model),
356
+ started_at = LEAST(bridge_sessions.started_at, EXCLUDED.started_at),
357
+ last_seen_at = GREATEST(bridge_sessions.last_seen_at, EXCLUDED.last_seen_at),
358
+ tool_calls = bridge_sessions.tool_calls + EXCLUDED.tool_calls,
359
+ llm_calls = bridge_sessions.llm_calls + EXCLUDED.llm_calls,
360
+ max_iteration = GREATEST(bridge_sessions.max_iteration, EXCLUDED.max_iteration),
361
+ total_input_tokens = bridge_sessions.total_input_tokens + EXCLUDED.total_input_tokens,
362
+ total_output_tokens = bridge_sessions.total_output_tokens + EXCLUDED.total_output_tokens
363
+ `, [sids, roles, models, ts0s, ts1s, tcalls, lcalls, maxiters, tinputs, toutputs])
364
+ }
365
+
366
+ await client.query('COMMIT')
367
+ } catch (err) {
368
+ try { await client.query('ROLLBACK') } catch {}
369
+ throw err
370
+ } finally {
371
+ client.release()
372
+ }
373
+
374
+ return { calls: toolRows.length, llm: llmRows.length }
375
+ }
376
+
377
+ // Idempotently ensure partitions exist for the current and next calendar month.
378
+ // Called from both init() and openTraceDatabase() so the next-month partition
379
+ // is always pre-created before rollover; rows never land in the default partition
380
+ // for a range that has a covering monthly partition.
381
+ async function ensureCurrentAndNextMonthPartitions(client) {
382
+ await client.query(`
383
+ DO $$
384
+ DECLARE
385
+ cur_start BIGINT := extract(epoch from date_trunc('month', now()))::BIGINT * 1000;
386
+ cur_end BIGINT := extract(epoch from date_trunc('month', now() + interval '1 month'))::BIGINT * 1000;
387
+ next_start BIGINT := extract(epoch from date_trunc('month', now() + interval '1 month'))::BIGINT * 1000;
388
+ next_end BIGINT := extract(epoch from date_trunc('month', now() + interval '2 months'))::BIGINT * 1000;
389
+ cur_name TEXT := 'trace_events_' || to_char(now(), 'YYYY_MM');
390
+ next_name TEXT := 'trace_events_' || to_char(now() + interval '1 month', 'YYYY_MM');
391
+ BEGIN
392
+ IF NOT EXISTS (
393
+ SELECT 1 FROM pg_class c
394
+ JOIN pg_namespace n ON n.oid = c.relnamespace
395
+ WHERE n.nspname = 'trace' AND c.relname = cur_name
396
+ ) THEN
397
+ EXECUTE format(
398
+ 'CREATE TABLE %I PARTITION OF trace_events FOR VALUES FROM (%s) TO (%s)',
399
+ cur_name, cur_start, cur_end
400
+ );
401
+ END IF;
402
+ IF NOT EXISTS (
403
+ SELECT 1 FROM pg_class c
404
+ JOIN pg_namespace n ON n.oid = c.relnamespace
405
+ WHERE n.nspname = 'trace' AND c.relname = next_name
406
+ ) THEN
407
+ EXECUTE format(
408
+ 'CREATE TABLE %I PARTITION OF trace_events FOR VALUES FROM (%s) TO (%s)',
409
+ next_name, next_start, next_end
410
+ );
411
+ END IF;
412
+ END $$
413
+ `)
414
+ }
415
+
416
+ async function isBootstrapComplete(client) {
417
+ try {
418
+ // Harden the check: require (a) root is partitioned, (b) schema-version
419
+ // columns parent_span_id and entry_id exist, (c) idx_trace_ts_brin exists,
420
+ // (d) at least one named-month OR default partition exists.
421
+ // A partial failed init (crashed after CREATE TABLE, before indexes) returns
422
+ // false here, triggering a full re-run rather than silently booting broken.
423
+ const r = await client.query(`
424
+ SELECT 1 WHERE
425
+ -- (a) partitioned root exists
426
+ EXISTS (
427
+ SELECT 1 FROM pg_class c
428
+ JOIN pg_namespace n ON n.oid = c.relnamespace
429
+ JOIN pg_partitioned_table pt ON pt.partrelid = c.oid
430
+ WHERE n.nspname = 'trace' AND c.relname = 'trace_events'
431
+ )
432
+ -- (b) schema-version columns present
433
+ AND EXISTS (
434
+ SELECT 1 FROM pg_attribute a
435
+ JOIN pg_class c ON c.oid = a.attrelid
436
+ JOIN pg_namespace n ON n.oid = c.relnamespace
437
+ WHERE n.nspname = 'trace' AND c.relname = 'trace_events'
438
+ AND a.attname IN ('parent_span_id', 'entry_id')
439
+ AND a.attnum > 0 AND NOT a.attisdropped
440
+ HAVING count(*) = 2
441
+ )
442
+ -- (c) BRIN index exists
443
+ AND EXISTS (
444
+ SELECT 1 FROM pg_indexes
445
+ WHERE schemaname = 'trace' AND indexname = 'idx_trace_ts_brin'
446
+ )
447
+ -- (d) at least one partition (named-month or default catch-all) exists
448
+ AND EXISTS (
449
+ SELECT 1 FROM pg_inherits i
450
+ JOIN pg_class cp ON cp.oid = i.inhparent
451
+ JOIN pg_namespace n ON n.oid = cp.relnamespace
452
+ WHERE n.nspname = 'trace' AND cp.relname = 'trace_events'
453
+ )
454
+ `)
455
+ return r.rows.length > 0
456
+ } catch {
457
+ return false
458
+ }
459
+ }
460
+
461
+ // Advisory lock key — session-scoped, prevents cross-process bootstrap races.
462
+ const BOOTSTRAP_LOCK_KEY = `hashtext('mixdog.trace_bootstrap')`
463
+
464
+ // ---------------------------------------------------------------------------
465
+ // openTraceDatabase
466
+ // ---------------------------------------------------------------------------
467
+
468
+ export async function openTraceDatabase(dataDir) {
469
+ const key = resolve(dataDir)
470
+
471
+ if (dbs.get(key)) return dbs.get(key)
472
+ if (opening.has(key)) return opening.get(key)
473
+
474
+ const promise = (async () => {
475
+ // pg-adapter with schema='trace' sets search_path=trace,public per connection.
476
+ const { db } = await ensurePgInstance(dataDir, { schema: 'trace' })
477
+
478
+ // Acquire a dedicated pool client for bootstrap so the advisory lock is
479
+ // session-scoped to exactly one connection (advisory locks are per-session).
480
+ // The client is released in finally — in both success and error paths.
481
+ const client = await db._pool.connect()
482
+ try {
483
+ // Set search_path on the dedicated client to match the pool default.
484
+ await client.query(`SET search_path = trace, public`)
485
+ // Session-scoped advisory lock — bounded so a stuck holder can't hang
486
+ // boot indefinitely. Try non-blocking first; on contention, set a
487
+ // 30s lock_timeout for the blocking acquire and surface a clear error
488
+ // instead of an unbounded wait.
489
+ const tryAcquire = await client.query(`SELECT pg_try_advisory_lock(${BOOTSTRAP_LOCK_KEY}) AS locked`)
490
+ if (!tryAcquire.rows[0]?.locked) {
491
+ // SET LOCAL only persists inside an explicit transaction — without
492
+ // BEGIN/COMMIT PG resets it immediately, so pg_advisory_lock() would
493
+ // wait unbounded. Wrap the lock_timeout + blocking acquire so the
494
+ // 30s ceiling actually applies.
495
+ await client.query('BEGIN')
496
+ try {
497
+ await client.query(`SET LOCAL lock_timeout = '30s'`)
498
+ await client.query(`SELECT pg_advisory_lock(${BOOTSTRAP_LOCK_KEY})`)
499
+ await client.query('COMMIT')
500
+ } catch (err) {
501
+ try { await client.query('ROLLBACK') } catch {}
502
+ // lock_timeout fires as 55P03 (lock_not_available); surface with context.
503
+ throw new Error(`trace-store bootstrap advisory lock timed out (30s): ${err?.message || err}`)
504
+ }
505
+ }
506
+ try {
507
+ // Re-check after acquiring the lock: another process may have completed
508
+ // init while we were waiting.
509
+ if (!(await isBootstrapComplete(client))) {
510
+ await init(client)
511
+ } else {
512
+ // Init already done by another process; still ensure upcoming partitions
513
+ // are pre-created for this boot.
514
+ await ensureCurrentAndNextMonthPartitions(client)
515
+ }
516
+ } finally {
517
+ await client.query(`SELECT pg_advisory_unlock(${BOOTSTRAP_LOCK_KEY})`)
518
+ }
519
+ } finally {
520
+ client.release()
521
+ }
522
+ // Bridge-specific analytic tables — idempotent, no advisory lock needed.
523
+ await initBridgeTables(db)
524
+
525
+ dbs.set(key, db)
526
+
527
+ // Periodically ensure current + next-month partitions exist so a
528
+ // long-running process never hits the default catch-all partition at
529
+ // month rollover. Fires every 12 h — well ahead of any boundary.
530
+ const _partitionEnsureInterval = setInterval(async () => {
531
+ const c = await db._pool.connect()
532
+ try {
533
+ await c.query(`SET search_path = trace, public`)
534
+ await ensureCurrentAndNextMonthPartitions(c)
535
+ } catch (err) {
536
+ __mixdogMemoryLog(`[trace-store] periodic partition ensure failed: ${err?.message ?? err}\n`)
537
+ } finally {
538
+ c.release()
539
+ }
540
+ }, 12 * 60 * 60 * 1000)
541
+ _partitionEnsureInterval.unref?.()
542
+ partitionTimers.set(key, _partitionEnsureInterval)
543
+
544
+ return db
545
+ })()
546
+
547
+ opening.set(key, promise)
548
+ try {
549
+ return await promise
550
+ } finally {
551
+ opening.delete(key)
552
+ }
553
+ }
554
+
555
+ // ---------------------------------------------------------------------------
556
+ // insertTraceEvents — batch INSERT
557
+ // ---------------------------------------------------------------------------
558
+
559
+ const TRACE_COLS = [
560
+ 'ts', 'session_id', 'iteration', 'kind', 'role', 'model',
561
+ 'tool_name', 'tool_ms', 'input_tokens', 'output_tokens',
562
+ 'cached_tokens', 'cache_write_tokens', 'duration_ms',
563
+ 'error_message', 'payload', 'parent_span_id', 'entry_id',
564
+ ]
565
+
566
+ // ---------------------------------------------------------------------------
567
+ // Cross-request trace_events write queue (100ms / 500-row flush window)
568
+ // ---------------------------------------------------------------------------
569
+
570
+ const TRACE_QUEUE_FLUSH_MS = 100
571
+ const TRACE_QUEUE_MAX_ROWS = 500
572
+
573
+ // Per-db queue state (keyed by db object identity via WeakMap).
574
+ const _traceQueues = new WeakMap()
575
+
576
+ function _getQueue(db) {
577
+ let q = _traceQueues.get(db)
578
+ if (!q) {
579
+ q = { pending: [], timer: null, flushPromise: null }
580
+ _traceQueues.set(db, q)
581
+ }
582
+ return q
583
+ }
584
+
585
+ async function _flushQueue(db, q) {
586
+ // When a flush is already running, callers reuse its promise — but enqueues
587
+ // that arrive during that flush schedule a fresh timer that fires here and
588
+ // is consumed by the early return. Reschedule a follow-up flush so events
589
+ // queued mid-flush don't sit until the next unrelated enqueue.
590
+ if (q.flushPromise) {
591
+ if (q.pending.length > 0) _scheduleFlush(db, q)
592
+ return q.flushPromise
593
+ }
594
+ const wrappers = q.pending.splice(0)
595
+ if (wrappers.length === 0) return { inserted: 0 }
596
+ const MAX_RETRIES = 3
597
+ q.flushPromise = (async () => {
598
+ try {
599
+ const allEvents = wrappers.flatMap(w => w.events)
600
+ return await _insertTraceEventsDirect(db, allEvents)
601
+ } catch (err) {
602
+ for (const w of wrappers) w.attempts += 1
603
+ const keep = wrappers.filter(w => w.attempts < MAX_RETRIES)
604
+ const dropped = wrappers.filter(w => w.attempts >= MAX_RETRIES)
605
+ if (dropped.length > 0) {
606
+ __mixdogMemoryLog(`[trace-queue] dropped ${dropped.reduce((n, w) => n + w.events.length, 0)} events after ${MAX_RETRIES} retries: ${err?.message}\n`)
607
+ }
608
+ q.pending.unshift(...keep)
609
+ __mixdogMemoryLog(`[trace-queue] flush error: ${err?.message}\n`)
610
+ throw err
611
+ } finally {
612
+ q.flushPromise = null
613
+ // Drain any events that landed in the queue while this flush ran.
614
+ if (q.pending.length > 0) _scheduleFlush(db, q)
615
+ }
616
+ })()
617
+ return q.flushPromise
618
+ }
619
+
620
+ function _scheduleFlush(db, q) {
621
+ if (q.timer) return
622
+ q.timer = setTimeout(async () => {
623
+ q.timer = null
624
+ _flushQueue(db, q).catch(err =>
625
+ __mixdogMemoryLog(`[trace-queue] flush error: ${err?.message}\n`)
626
+ )
627
+ }, TRACE_QUEUE_FLUSH_MS)
628
+ q.timer.unref?.()
629
+ }
630
+
631
+ // ---------------------------------------------------------------------------
632
+ // Exit drain — flush pending trace events before process exit.
633
+ // Issue 4: timer is unref()'d so it won't prevent exit; register drain handlers.
634
+ // ---------------------------------------------------------------------------
635
+
636
+ const _registeredExitDbs = new WeakSet()
637
+
638
+ export function registerTraceExitDrain(db) {
639
+ if (_registeredExitDbs.has(db)) return
640
+ _registeredExitDbs.add(db)
641
+
642
+ async function drainOnExit() {
643
+ const q = _traceQueues.get(db)
644
+ if (!q || q.pending.length === 0) return
645
+ try {
646
+ if (q.timer) { clearTimeout(q.timer); q.timer = null }
647
+ if (q.flushPromise) await q.flushPromise.catch(() => {})
648
+ if (q.pending.length > 0) await _insertTraceEventsDirect(db, q.pending.splice(0).flatMap(w => w.events))
649
+ } catch (e) {
650
+ __mixdogMemoryLog(`[trace-queue] exit drain failed: ${e?.message}\n`)
651
+ }
652
+ }
653
+
654
+ process.on('exit', () => {
655
+ const q = _traceQueues.get(db)
656
+ if (q?.pending.length) __mixdogMemoryLog(`[trace-queue] exit with ${q.pending.length} unflushed events\n`)
657
+ })
658
+
659
+ process.on('SIGTERM', async () => { await drainOnExit(); process.exit(0) })
660
+
661
+ process.once('beforeExit', drainOnExit)
662
+ }
663
+
664
+ /**
665
+ * Enqueue events for async batched insert. Returns immediately; flush happens
666
+ * within TRACE_QUEUE_FLUSH_MS or when TRACE_QUEUE_MAX_ROWS is reached.
667
+ * Callers that need a synchronous result should use insertTraceEvents directly.
668
+ */
669
+ export function enqueueTraceEvents(db, events) {
670
+ if (!Array.isArray(events) || events.length === 0) return
671
+ const q = _getQueue(db)
672
+ q.pending.push({ events: [...events], attempts: 0 })
673
+ // Row cap counts pending EVENTS, not wrappers — a single wrapper with
674
+ // >TRACE_QUEUE_MAX_ROWS events would otherwise sit until the timer.
675
+ const pendingEvents = q.pending.reduce((n, w) => n + w.events.length, 0)
676
+ if (pendingEvents >= TRACE_QUEUE_MAX_ROWS) {
677
+ // Flush immediately when row cap reached — don't wait for timer.
678
+ if (q.timer) { clearTimeout(q.timer); q.timer = null }
679
+ _flushQueue(db, q).catch(err =>
680
+ __mixdogMemoryLog(`[trace-queue] flush error: ${err?.message}\n`)
681
+ )
682
+ } else {
683
+ _scheduleFlush(db, q)
684
+ }
685
+ }
686
+
687
+ // Renamed internal: direct DB insert without queuing (used by queue flusher and
688
+ // the existing intra-request multi-row path where immediate persistence matters).
689
+ async function _insertTraceEventsDirect(db, events) {
690
+ return insertTraceEvents(db, events)
691
+ }
692
+
693
+ export async function insertTraceEvents(db, events) {
694
+ if (!Array.isArray(events) || events.length === 0) return { inserted: 0 }
695
+
696
+ const valuePlaceholders = []
697
+ const params = []
698
+ let p = 1
699
+
700
+ for (const ev of events) {
701
+ let ts = ev.ts
702
+ if (typeof ts === 'string') ts = Date.parse(ts)
703
+ ts = Number(ts)
704
+ if (!Number.isFinite(ts)) ts = Date.now()
705
+
706
+ const payload = ev.payload != null ? ev.payload : {}
707
+
708
+ const cols = [
709
+ ts,
710
+ ev.session_id ?? null,
711
+ ev.iteration != null ? Number(ev.iteration) : null,
712
+ String(ev.kind ?? 'unknown'),
713
+ ev.role ?? null,
714
+ ev.model ?? null,
715
+ ev.tool_name ?? null,
716
+ ev.tool_ms != null ? Number(ev.tool_ms) : null,
717
+ ev.input_tokens != null ? Number(ev.input_tokens) : null,
718
+ ev.output_tokens != null ? Number(ev.output_tokens) : null,
719
+ ev.cached_tokens != null ? Number(ev.cached_tokens) : null,
720
+ ev.cache_write_tokens != null ? Number(ev.cache_write_tokens) : null,
721
+ ev.duration_ms != null ? Number(ev.duration_ms) : null,
722
+ ev.error_message ?? null,
723
+ typeof payload === 'string' ? payload : JSON.stringify(payload),
724
+ ev.parent_span_id != null ? Number(ev.parent_span_id) : null,
725
+ ev.entry_id != null ? Number(ev.entry_id) : null,
726
+ ]
727
+ valuePlaceholders.push(`(${cols.map(() => `$${p++}`).join(', ')})`)
728
+ params.push(...cols)
729
+ }
730
+
731
+ const sql = `INSERT INTO trace_events (${TRACE_COLS.join(', ')}) VALUES ${valuePlaceholders.join(', ')}`
732
+ await db.query(sql, params)
733
+ return { inserted: events.length }
734
+ }