mixdog 0.7.18 → 0.8.1

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 (847) 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/session-context-bench.mjs +172 -0
  10. package/scripts/smoke-loop-report.mjs +221 -0
  11. package/scripts/smoke-loop.mjs +201 -0
  12. package/scripts/smoke.mjs +113 -0
  13. package/scripts/tool-failures.mjs +143 -0
  14. package/scripts/tool-smoke.mjs +452 -0
  15. package/src/agents/debugger/AGENT.md +3 -0
  16. package/src/agents/debugger/agent.json +6 -0
  17. package/src/agents/explore/AGENT.md +4 -0
  18. package/src/agents/explore/agent.json +6 -0
  19. package/src/agents/heavy-worker/AGENT.md +3 -0
  20. package/src/agents/heavy-worker/agent.json +6 -0
  21. package/src/agents/maintainer/AGENT.md +3 -0
  22. package/src/agents/maintainer/agent.json +6 -0
  23. package/src/agents/reviewer/AGENT.md +3 -0
  24. package/src/agents/reviewer/agent.json +6 -0
  25. package/src/agents/scheduler-task.md +3 -0
  26. package/src/agents/web-researcher/AGENT.md +3 -0
  27. package/src/agents/web-researcher/agent.json +6 -0
  28. package/src/agents/webhook-handler.md +3 -0
  29. package/src/agents/worker/AGENT.md +3 -0
  30. package/src/agents/worker/agent.json +6 -0
  31. package/src/app.mjs +90 -0
  32. package/src/cli.mjs +11 -0
  33. package/src/defaults/hidden-roles.json +72 -0
  34. package/src/defaults/mixdog-config.template.json +15 -0
  35. package/src/hooks/lib/permission-evaluator.cjs +488 -0
  36. package/src/hooks/lib/settings-loader.cjs +112 -0
  37. package/src/lib/keychain-cjs.cjs +332 -0
  38. package/src/lib/plugin-paths.cjs +28 -0
  39. package/src/lib/rules-builder.cjs +315 -0
  40. package/src/mixdog-session-runtime.mjs +3813 -0
  41. package/src/output-styles/default.md +38 -0
  42. package/src/output-styles/extreme-simple.md +17 -0
  43. package/src/output-styles/simple.md +17 -0
  44. package/src/repl.mjs +330 -0
  45. package/src/rules/bridge/00-common.md +5 -0
  46. package/src/rules/bridge/20-skip-protocol.md +11 -0
  47. package/src/rules/bridge/30-explorer.md +4 -0
  48. package/src/rules/bridge/40-cycle1-agent.md +28 -0
  49. package/src/rules/bridge/41-cycle2-agent.md +59 -0
  50. package/src/rules/lead/00-tool-lead.md +5 -0
  51. package/src/rules/lead/01-general.md +5 -0
  52. package/src/rules/lead/02-channels.md +3 -0
  53. package/src/rules/lead/04-workflow.md +12 -0
  54. package/src/rules/shared/00-language.md +3 -0
  55. package/src/rules/shared/01-tool.md +3 -0
  56. package/src/runtime/agent/orchestrator/bridge-trace.mjs +814 -0
  57. package/src/runtime/agent/orchestrator/cache-mtime.mjs +60 -0
  58. package/src/runtime/agent/orchestrator/config.mjs +446 -0
  59. package/src/runtime/agent/orchestrator/context/collect.mjs +796 -0
  60. package/src/runtime/agent/orchestrator/dispatch-persist.mjs +417 -0
  61. package/src/runtime/agent/orchestrator/internal-roles.mjs +188 -0
  62. package/src/runtime/agent/orchestrator/internal-tools.mjs +88 -0
  63. package/src/runtime/agent/orchestrator/mcp/client.mjs +345 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2104 -0
  65. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +784 -0
  66. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +341 -0
  67. package/src/runtime/agent/orchestrator/providers/gemini.mjs +1679 -0
  68. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +959 -0
  69. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +213 -0
  70. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +38 -0
  71. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +471 -0
  72. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +615 -0
  73. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +808 -0
  74. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +1719 -0
  75. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2587 -0
  76. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +1953 -0
  77. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +136 -0
  78. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +317 -0
  79. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +109 -0
  80. package/src/runtime/agent/orchestrator/providers/registry.mjs +247 -0
  81. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +332 -0
  82. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +11 -0
  83. package/src/runtime/agent/orchestrator/providers/trace-utils.mjs +50 -0
  84. package/src/runtime/agent/orchestrator/session/cache/post-edit-marks.mjs +42 -0
  85. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
  86. package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +318 -0
  87. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +367 -0
  88. package/src/runtime/agent/orchestrator/session/compact.mjs +882 -0
  89. package/src/runtime/agent/orchestrator/session/context-utils.mjs +233 -0
  90. package/src/runtime/agent/orchestrator/session/loop.mjs +2269 -0
  91. package/src/runtime/agent/orchestrator/session/manager.mjs +2972 -0
  92. package/src/runtime/agent/orchestrator/session/result-classification.mjs +65 -0
  93. package/src/runtime/agent/orchestrator/session/store.mjs +870 -0
  94. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +166 -0
  95. package/src/runtime/agent/orchestrator/smart-bridge/bridge-llm.mjs +339 -0
  96. package/src/runtime/agent/orchestrator/smart-bridge/cache-strategy.mjs +419 -0
  97. package/src/runtime/agent/orchestrator/stall-policy.mjs +227 -0
  98. package/src/runtime/agent/orchestrator/tool-loop-guard.mjs +235 -0
  99. package/src/runtime/agent/orchestrator/tools/bash-session.mjs +723 -0
  100. package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +171 -0
  101. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +389 -0
  102. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +637 -0
  103. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +165 -0
  104. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +104 -0
  105. package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +194 -0
  106. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +596 -0
  107. package/src/runtime/agent/orchestrator/tools/builtin/native-edit-runner.mjs +110 -0
  108. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +153 -0
  109. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
  110. package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +189 -0
  111. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +731 -0
  112. package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +168 -0
  113. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
  114. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +465 -0
  115. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +160 -0
  116. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +982 -0
  117. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1087 -0
  118. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +231 -0
  119. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +223 -0
  120. package/src/runtime/agent/orchestrator/tools/builtin.mjs +478 -0
  121. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
  122. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4102 -0
  123. package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +323 -0
  124. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +154 -0
  125. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +26 -0
  126. package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +143 -0
  127. package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +18 -0
  128. package/src/runtime/agent/orchestrator/tools/patch.mjs +2772 -0
  129. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +114 -0
  130. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +880 -0
  131. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +312 -0
  132. package/src/runtime/channels/backends/discord.mjs +781 -0
  133. package/src/runtime/channels/data/voice-runtime-manifest.json +138 -0
  134. package/src/runtime/channels/index.mjs +3309 -0
  135. package/src/runtime/channels/lib/config.mjs +285 -0
  136. package/src/runtime/channels/lib/drop-trace.mjs +71 -0
  137. package/src/runtime/channels/lib/event-pipeline.mjs +81 -0
  138. package/src/runtime/channels/lib/holidays.mjs +138 -0
  139. package/src/runtime/channels/lib/hook-pipe-server.mjs +671 -0
  140. package/src/runtime/channels/lib/output-forwarder.mjs +765 -0
  141. package/src/runtime/channels/lib/runtime-paths.mjs +497 -0
  142. package/src/runtime/channels/lib/scheduler.mjs +710 -0
  143. package/src/runtime/channels/lib/session-discovery.mjs +102 -0
  144. package/src/runtime/channels/lib/state-file.mjs +68 -0
  145. package/src/runtime/channels/lib/status-snapshot.mjs +224 -0
  146. package/src/runtime/channels/lib/tool-format.mjs +122 -0
  147. package/src/runtime/channels/lib/transcript-discovery.mjs +195 -0
  148. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +734 -0
  149. package/src/runtime/channels/lib/webhook.mjs +1288 -0
  150. package/src/runtime/channels/tool-defs.mjs +177 -0
  151. package/src/runtime/lib/keychain-cjs.cjs +289 -0
  152. package/src/runtime/memory/data/runtime-manifest.json +40 -0
  153. package/src/runtime/memory/index.mjs +3706 -0
  154. package/src/runtime/memory/lib/core-memory-store.mjs +336 -0
  155. package/src/runtime/memory/lib/embedding-provider.mjs +275 -0
  156. package/src/runtime/memory/lib/embedding-worker.mjs +331 -0
  157. package/src/runtime/memory/lib/memory-cycle-requests.mjs +276 -0
  158. package/src/runtime/memory/lib/memory-cycle1.mjs +783 -0
  159. package/src/runtime/memory/lib/memory-cycle2.mjs +1389 -0
  160. package/src/runtime/memory/lib/memory-cycle3.mjs +646 -0
  161. package/src/runtime/memory/lib/memory-embed.mjs +300 -0
  162. package/src/runtime/memory/lib/memory-ops-policy.mjs +149 -0
  163. package/src/runtime/memory/lib/memory-recall-store.mjs +644 -0
  164. package/src/runtime/memory/lib/memory.mjs +418 -0
  165. package/src/runtime/memory/lib/pg/adapter.mjs +328 -0
  166. package/src/runtime/memory/lib/pg/process.mjs +366 -0
  167. package/src/runtime/memory/lib/pg/supervisor.mjs +495 -0
  168. package/src/runtime/memory/lib/runtime-fetcher.mjs +464 -0
  169. package/src/runtime/memory/lib/trace-store.mjs +734 -0
  170. package/src/runtime/memory/tool-defs.mjs +79 -0
  171. package/src/runtime/search/index.mjs +925 -0
  172. package/src/runtime/search/lib/config.mjs +61 -0
  173. package/src/runtime/search/lib/web-tools.mjs +1278 -0
  174. package/src/runtime/search/tool-defs.mjs +64 -0
  175. package/src/runtime/shared/atomic-file.mjs +435 -0
  176. package/src/runtime/shared/background-tasks.mjs +376 -0
  177. package/src/runtime/shared/child-guardian.mjs +98 -0
  178. package/src/runtime/shared/config.mjs +393 -0
  179. package/src/runtime/shared/err-text.mjs +121 -0
  180. package/src/runtime/shared/launcher-control.mjs +259 -0
  181. package/src/runtime/shared/llm/http-agent.mjs +129 -0
  182. package/src/runtime/shared/open-url.mjs +37 -0
  183. package/src/runtime/shared/plugin-paths.mjs +25 -0
  184. package/src/runtime/shared/process-shutdown.mjs +147 -0
  185. package/src/runtime/shared/schedules-store.mjs +70 -0
  186. package/src/runtime/shared/tool-execution-contract.mjs +104 -0
  187. package/src/runtime/shared/tool-surface.mjs +947 -0
  188. package/src/runtime/shared/user-cwd.mjs +221 -0
  189. package/src/runtime/shared/user-data-guard.mjs +232 -0
  190. package/src/runtime/shared/workspace-router.mjs +259 -0
  191. package/src/standalone/bridge-tool.mjs +1414 -0
  192. package/src/standalone/channel-admin.mjs +366 -0
  193. package/src/standalone/channel-worker-preload.cjs +3 -0
  194. package/src/standalone/channel-worker.mjs +353 -0
  195. package/src/standalone/explore-tool.mjs +233 -0
  196. package/src/standalone/hook-bus.mjs +246 -0
  197. package/src/standalone/plugin-admin.mjs +247 -0
  198. package/src/standalone/provider-admin.mjs +338 -0
  199. package/src/standalone/seeds.mjs +94 -0
  200. package/src/standalone/usage-dashboard.mjs +510 -0
  201. package/src/tui/App.jsx +5446 -0
  202. package/src/tui/components/AnsiText.jsx +199 -0
  203. package/src/tui/components/ContextPanel.jsx +265 -0
  204. package/src/tui/components/Markdown.jsx +205 -0
  205. package/src/tui/components/MarkdownTable.jsx +204 -0
  206. package/src/tui/components/Message.jsx +103 -0
  207. package/src/tui/components/Picker.jsx +317 -0
  208. package/src/tui/components/PromptInput.jsx +584 -0
  209. package/src/tui/components/QueuedCommands.jsx +47 -0
  210. package/src/tui/components/SlashCommandPalette.jsx +114 -0
  211. package/src/tui/components/Spinner.jsx +317 -0
  212. package/src/tui/components/StatusLine.jsx +87 -0
  213. package/src/tui/components/TextEntryPanel.jsx +323 -0
  214. package/src/tui/components/ToolExecution.jsx +791 -0
  215. package/src/tui/components/TurnDone.jsx +78 -0
  216. package/src/tui/components/UsagePanel.jsx +331 -0
  217. package/src/tui/dist/index.mjs +12420 -0
  218. package/src/tui/engine.mjs +2410 -0
  219. package/src/tui/figures.mjs +50 -0
  220. package/src/tui/hooks/useEngine.mjs +16 -0
  221. package/src/tui/index.jsx +254 -0
  222. package/src/tui/input-editing.mjs +242 -0
  223. package/src/tui/markdown/format-token.mjs +194 -0
  224. package/src/tui/paste-attachments.mjs +198 -0
  225. package/src/tui/runtime/shared/process-shutdown.mjs +1 -0
  226. package/src/tui/spinner-verbs.mjs +45 -0
  227. package/src/tui/theme.mjs +67 -0
  228. package/src/tui/time-format.mjs +53 -0
  229. package/src/ui/ansi.mjs +115 -0
  230. package/src/ui/markdown.mjs +195 -0
  231. package/src/ui/statusline.mjs +730 -0
  232. package/src/ui/tool-card.mjs +99 -0
  233. package/src/vendor/statusline/bin/statusline-lib.mjs +805 -0
  234. package/src/vendor/statusline/bin/statusline-route.mjs +596 -0
  235. package/src/vendor/statusline/scripts/lib/gateway-settings.mjs +285 -0
  236. package/src/vendor/statusline/src/gateway/claude-current.mjs +320 -0
  237. package/src/vendor/statusline/src/gateway/route-meta.mjs +753 -0
  238. package/src/vendor/statusline/src/gateway/session-routes.mjs +244 -0
  239. package/src/workflows/default/WORKFLOW.md +7 -0
  240. package/src/workflows/default/workflow.json +14 -0
  241. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  242. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  243. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  244. package/vendor/ink/build/colorize.d.ts +3 -0
  245. package/vendor/ink/build/colorize.js +48 -0
  246. package/vendor/ink/build/colorize.js.map +1 -0
  247. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  248. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  249. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  250. package/vendor/ink/build/components/AnimationContext.d.ts +9 -0
  251. package/vendor/ink/build/components/AnimationContext.js +13 -0
  252. package/vendor/ink/build/components/AnimationContext.js.map +1 -0
  253. package/vendor/ink/build/components/App.d.ts +24 -0
  254. package/vendor/ink/build/components/App.js +554 -0
  255. package/vendor/ink/build/components/App.js.map +1 -0
  256. package/vendor/ink/build/components/AppContext.d.ts +80 -0
  257. package/vendor/ink/build/components/AppContext.js +25 -0
  258. package/vendor/ink/build/components/AppContext.js.map +1 -0
  259. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  260. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  261. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  262. package/vendor/ink/build/components/Box.d.ts +130 -0
  263. package/vendor/ink/build/components/Box.js +34 -0
  264. package/vendor/ink/build/components/Box.js.map +1 -0
  265. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  266. package/vendor/ink/build/components/CursorContext.js +8 -0
  267. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  268. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  269. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  270. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  271. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  272. package/vendor/ink/build/components/ErrorOverview.js +90 -0
  273. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  274. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  275. package/vendor/ink/build/components/FocusContext.js +17 -0
  276. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  277. package/vendor/ink/build/components/Newline.d.ts +13 -0
  278. package/vendor/ink/build/components/Newline.js +8 -0
  279. package/vendor/ink/build/components/Newline.js.map +1 -0
  280. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  281. package/vendor/ink/build/components/Spacer.js +11 -0
  282. package/vendor/ink/build/components/Spacer.js.map +1 -0
  283. package/vendor/ink/build/components/Static.d.ts +24 -0
  284. package/vendor/ink/build/components/Static.js +28 -0
  285. package/vendor/ink/build/components/Static.js.map +1 -0
  286. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  287. package/vendor/ink/build/components/StderrContext.js +13 -0
  288. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  289. package/vendor/ink/build/components/StdinContext.d.ts +28 -0
  290. package/vendor/ink/build/components/StdinContext.js +20 -0
  291. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  292. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  293. package/vendor/ink/build/components/StdoutContext.js +13 -0
  294. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  295. package/vendor/ink/build/components/Text.d.ts +55 -0
  296. package/vendor/ink/build/components/Text.js +50 -0
  297. package/vendor/ink/build/components/Text.js.map +1 -0
  298. package/vendor/ink/build/components/Transform.d.ts +16 -0
  299. package/vendor/ink/build/components/Transform.js +15 -0
  300. package/vendor/ink/build/components/Transform.js.map +1 -0
  301. package/vendor/ink/build/cursor-helpers.d.ts +39 -0
  302. package/vendor/ink/build/cursor-helpers.js +62 -0
  303. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  304. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  305. package/vendor/ink/build/devtools-window-polyfill.js +68 -0
  306. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  307. package/vendor/ink/build/devtools.d.ts +1 -0
  308. package/vendor/ink/build/devtools.js +36 -0
  309. package/vendor/ink/build/devtools.js.map +1 -0
  310. package/vendor/ink/build/dom.d.ts +62 -0
  311. package/vendor/ink/build/dom.js +143 -0
  312. package/vendor/ink/build/dom.js.map +1 -0
  313. package/vendor/ink/build/get-max-width.d.ts +3 -0
  314. package/vendor/ink/build/get-max-width.js +10 -0
  315. package/vendor/ink/build/get-max-width.js.map +1 -0
  316. package/vendor/ink/build/hooks/use-animation.d.ts +49 -0
  317. package/vendor/ink/build/hooks/use-animation.js +87 -0
  318. package/vendor/ink/build/hooks/use-animation.js.map +1 -0
  319. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  320. package/vendor/ink/build/hooks/use-app.js +8 -0
  321. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  322. package/vendor/ink/build/hooks/use-box-metrics.d.ts +59 -0
  323. package/vendor/ink/build/hooks/use-box-metrics.js +81 -0
  324. package/vendor/ink/build/hooks/use-box-metrics.js.map +1 -0
  325. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  326. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  327. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  328. package/vendor/ink/build/hooks/use-focus-manager.d.ts +43 -0
  329. package/vendor/ink/build/hooks/use-focus-manager.js +18 -0
  330. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  331. package/vendor/ink/build/hooks/use-focus.d.ts +30 -0
  332. package/vendor/ink/build/hooks/use-focus.js +43 -0
  333. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  334. package/vendor/ink/build/hooks/use-input.d.ts +132 -0
  335. package/vendor/ink/build/hooks/use-input.js +126 -0
  336. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  337. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +6 -0
  338. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +12 -0
  339. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  340. package/vendor/ink/build/hooks/use-paste.d.ts +35 -0
  341. package/vendor/ink/build/hooks/use-paste.js +62 -0
  342. package/vendor/ink/build/hooks/use-paste.js.map +1 -0
  343. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  344. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  345. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  346. package/vendor/ink/build/hooks/use-stdin.d.ts +7 -0
  347. package/vendor/ink/build/hooks/use-stdin.js +9 -0
  348. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  349. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  350. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  351. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  352. package/vendor/ink/build/hooks/use-window-size.d.ts +18 -0
  353. package/vendor/ink/build/hooks/use-window-size.js +22 -0
  354. package/vendor/ink/build/hooks/use-window-size.js.map +1 -0
  355. package/vendor/ink/build/index.d.ts +42 -0
  356. package/vendor/ink/build/index.js +24 -0
  357. package/vendor/ink/build/index.js.map +1 -0
  358. package/vendor/ink/build/ink.d.ts +146 -0
  359. package/vendor/ink/build/ink.js +1022 -0
  360. package/vendor/ink/build/ink.js.map +1 -0
  361. package/vendor/ink/build/input-parser.d.ts +10 -0
  362. package/vendor/ink/build/input-parser.js +194 -0
  363. package/vendor/ink/build/input-parser.js.map +1 -0
  364. package/vendor/ink/build/instances.d.ts +3 -0
  365. package/vendor/ink/build/instances.js +8 -0
  366. package/vendor/ink/build/instances.js.map +1 -0
  367. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  368. package/vendor/ink/build/kitty-keyboard.js +32 -0
  369. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  370. package/vendor/ink/build/log-update.d.ts +20 -0
  371. package/vendor/ink/build/log-update.js +261 -0
  372. package/vendor/ink/build/log-update.js.map +1 -0
  373. package/vendor/ink/build/measure-element.d.ts +20 -0
  374. package/vendor/ink/build/measure-element.js +13 -0
  375. package/vendor/ink/build/measure-element.js.map +1 -0
  376. package/vendor/ink/build/measure-text.d.ts +6 -0
  377. package/vendor/ink/build/measure-text.js +21 -0
  378. package/vendor/ink/build/measure-text.js.map +1 -0
  379. package/vendor/ink/build/output.d.ts +35 -0
  380. package/vendor/ink/build/output.js +328 -0
  381. package/vendor/ink/build/output.js.map +1 -0
  382. package/vendor/ink/build/parse-keypress.d.ts +20 -0
  383. package/vendor/ink/build/parse-keypress.js +495 -0
  384. package/vendor/ink/build/parse-keypress.js.map +1 -0
  385. package/vendor/ink/build/reconciler.d.ts +4 -0
  386. package/vendor/ink/build/reconciler.js +306 -0
  387. package/vendor/ink/build/reconciler.js.map +1 -0
  388. package/vendor/ink/build/render-background.d.ts +4 -0
  389. package/vendor/ink/build/render-background.js +25 -0
  390. package/vendor/ink/build/render-background.js.map +1 -0
  391. package/vendor/ink/build/render-border.d.ts +4 -0
  392. package/vendor/ink/build/render-border.js +84 -0
  393. package/vendor/ink/build/render-border.js.map +1 -0
  394. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  395. package/vendor/ink/build/render-node-to-output.js +162 -0
  396. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  397. package/vendor/ink/build/render-to-string.d.ts +38 -0
  398. package/vendor/ink/build/render-to-string.js +116 -0
  399. package/vendor/ink/build/render-to-string.js.map +1 -0
  400. package/vendor/ink/build/render.d.ts +176 -0
  401. package/vendor/ink/build/render.js +71 -0
  402. package/vendor/ink/build/render.js.map +1 -0
  403. package/vendor/ink/build/renderer.d.ts +8 -0
  404. package/vendor/ink/build/renderer.js +64 -0
  405. package/vendor/ink/build/renderer.js.map +1 -0
  406. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  407. package/vendor/ink/build/sanitize-ansi.js +27 -0
  408. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  409. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  410. package/vendor/ink/build/squash-text-nodes.js +36 -0
  411. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  412. package/vendor/ink/build/styles.d.ts +302 -0
  413. package/vendor/ink/build/styles.js +303 -0
  414. package/vendor/ink/build/styles.js.map +1 -0
  415. package/vendor/ink/build/utils.d.ts +9 -0
  416. package/vendor/ink/build/utils.js +19 -0
  417. package/vendor/ink/build/utils.js.map +1 -0
  418. package/vendor/ink/build/wrap-text.d.ts +3 -0
  419. package/vendor/ink/build/wrap-text.js +38 -0
  420. package/vendor/ink/build/wrap-text.js.map +1 -0
  421. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  422. package/vendor/ink/build/write-synchronized.js +9 -0
  423. package/vendor/ink/build/write-synchronized.js.map +1 -0
  424. package/vendor/ink/license +10 -0
  425. package/vendor/ink/package.json +137 -0
  426. package/.claude-plugin/marketplace.json +0 -34
  427. package/.claude-plugin/plugin.json +0 -20
  428. package/.gitattributes +0 -34
  429. package/.mcp.json +0 -14
  430. package/ARCHITECTURE.md +0 -77
  431. package/CHANGELOG.md +0 -30
  432. package/CONTRIBUTING.md +0 -45
  433. package/DATA-FLOW.md +0 -79
  434. package/LICENSE +0 -21
  435. package/SECURITY.md +0 -138
  436. package/UNINSTALL.md +0 -115
  437. package/agents/maintenance.md +0 -5
  438. package/agents/memory-classification.md +0 -30
  439. package/agents/scheduler-task.md +0 -18
  440. package/agents/webhook-handler.md +0 -27
  441. package/agents/worker.md +0 -24
  442. package/bin/bridge +0 -133
  443. package/bin/statusline-launcher.mjs +0 -82
  444. package/bin/statusline-lib.mjs +0 -581
  445. package/bin/statusline-route.mjs +0 -273
  446. package/bin/statusline.mjs +0 -638
  447. package/bun.lock +0 -927
  448. package/commands/config.md +0 -16
  449. package/commands/doctor.md +0 -13
  450. package/commands/model.md +0 -61
  451. package/commands/setup.md +0 -17
  452. package/defaults/hidden-roles.json +0 -68
  453. package/defaults/memory-chunk-prompt.md +0 -63
  454. package/defaults/mixdog-config.template.json +0 -27
  455. package/defaults/user-workflow.json +0 -8
  456. package/defaults/user-workflow.md +0 -17
  457. package/hooks/hooks.json +0 -73
  458. package/hooks/lib/active-instance.cjs +0 -77
  459. package/hooks/lib/permission-evaluator.cjs +0 -411
  460. package/hooks/lib/permission-route.cjs +0 -63
  461. package/hooks/lib/settings-loader.cjs +0 -117
  462. package/hooks/post-tool-use.cjs +0 -84
  463. package/hooks/pre-mcp-sandbox.cjs +0 -158
  464. package/hooks/pre-tool-subagent.cjs +0 -258
  465. package/hooks/session-start.cjs +0 -1493
  466. package/hooks/shim-launcher.cjs +0 -65
  467. package/hooks/turn-timer.cjs +0 -82
  468. package/lib/claude-md-writer.cjs +0 -386
  469. package/lib/keychain-cjs.cjs +0 -290
  470. package/lib/plugin-paths.cjs +0 -69
  471. package/lib/rules-builder.cjs +0 -241
  472. package/native/README.md +0 -117
  473. package/native/prebuilt/linux-aarch64/mixdog-shim +0 -0
  474. package/native/prebuilt/linux-x86_64/mixdog-shim +0 -0
  475. package/native/prebuilt/macos-aarch64/mixdog-shim +0 -0
  476. package/native/prebuilt/macos-x86_64/mixdog-shim +0 -0
  477. package/native/prebuilt/windows-x86_64/mixdog-shim.exe +0 -0
  478. package/prompts/code-review.txt +0 -16
  479. package/prompts/security-audit.txt +0 -17
  480. package/rules/bridge/00-common.md +0 -39
  481. package/rules/bridge/20-skip-protocol.md +0 -18
  482. package/rules/bridge/30-explorer.md +0 -33
  483. package/rules/bridge/40-cycle1-agent.md +0 -52
  484. package/rules/bridge/41-cycle2-agent.md +0 -62
  485. package/rules/lead/00-tool-lead.md +0 -61
  486. package/rules/lead/01-general.md +0 -26
  487. package/rules/lead/02-channels.md +0 -49
  488. package/rules/lead/03-team.md +0 -27
  489. package/rules/lead/04-workflow.md +0 -20
  490. package/rules/shared/00-language.md +0 -14
  491. package/rules/shared/01-tool.md +0 -138
  492. package/scripts/bootstrap.mjs +0 -130
  493. package/scripts/bridge-unify-smoke.mjs +0 -308
  494. package/scripts/build-runtime-linux.sh +0 -348
  495. package/scripts/build-runtime-macos.sh +0 -217
  496. package/scripts/build-runtime-windows.ps1 +0 -242
  497. package/scripts/builtin-utils-smoke.mjs +0 -398
  498. package/scripts/bump.mjs +0 -80
  499. package/scripts/check-json.mjs +0 -45
  500. package/scripts/check-syntax-changed.mjs +0 -102
  501. package/scripts/check-syntax.mjs +0 -58
  502. package/scripts/code-graph-batch.test.mjs +0 -33
  503. package/scripts/config-preserve-smoke.mjs +0 -180
  504. package/scripts/doctor.mjs +0 -489
  505. package/scripts/edit-normalize-fuzz.mjs +0 -130
  506. package/scripts/edit-normalize-smoke.mjs +0 -401
  507. package/scripts/edit-operation-smoke.mjs +0 -369
  508. package/scripts/edit2-smoke.mjs +0 -63
  509. package/scripts/ensure-deps.mjs +0 -259
  510. package/scripts/fuzzy-e2e.mjs +0 -28
  511. package/scripts/fuzzy-smoke.mjs +0 -26
  512. package/scripts/gateway-model.mjs +0 -596
  513. package/scripts/generate-runtime-manifest.mjs +0 -166
  514. package/scripts/guard-smoke.mjs +0 -66
  515. package/scripts/hidden-role-schema-smoke.mjs +0 -162
  516. package/scripts/hook-routing-smoke.mjs +0 -29
  517. package/scripts/inject-input.ps1 +0 -204
  518. package/scripts/io-complex-smoke.mjs +0 -667
  519. package/scripts/io-explore-bench.mjs +0 -424
  520. package/scripts/io-guardrails-smoke.mjs +0 -205
  521. package/scripts/io-mini-bench-baseline.json +0 -11
  522. package/scripts/io-mini-bench.mjs +0 -216
  523. package/scripts/io-route-harness.mjs +0 -933
  524. package/scripts/io-telemetry-report.mjs +0 -691
  525. package/scripts/lib/gateway-inventory.mjs +0 -178
  526. package/scripts/lib/gateway-settings.mjs +0 -78
  527. package/scripts/mutation-bench.mjs +0 -564
  528. package/scripts/mutation-io-smoke.mjs +0 -1097
  529. package/scripts/native-patch-bridge-smoke.mjs +0 -288
  530. package/scripts/native-patch-smoke.mjs +0 -304
  531. package/scripts/openai-oauth-catalog-smoke.mjs +0 -53
  532. package/scripts/patch-interior-context-smoke.mjs +0 -49
  533. package/scripts/patch-newline-utf8-smoke.mjs +0 -157
  534. package/scripts/perf-hook-smoke.mjs +0 -71
  535. package/scripts/permission-eval-smoke.mjs +0 -443
  536. package/scripts/prep-patch.mjs +0 -53
  537. package/scripts/prep-shim.mjs +0 -96
  538. package/scripts/provider-cache-smoke.mjs +0 -687
  539. package/scripts/report-runtime-health.mjs +0 -132
  540. package/scripts/resolve-bun.mjs +0 -60
  541. package/scripts/run-mcp.mjs +0 -1473
  542. package/scripts/salvage-v4a-shatter.test.mjs +0 -58
  543. package/scripts/scoped-cache-io-smoke.mjs +0 -103
  544. package/scripts/shell-policy-round3-smoke.mjs +0 -46
  545. package/scripts/smoke-runtime-negative.ps1 +0 -100
  546. package/scripts/smoke-runtime-negative.sh +0 -95
  547. package/scripts/stall-policy-smoke.mjs +0 -50
  548. package/scripts/start-memory-worker.mjs +0 -23
  549. package/scripts/statusline-launcher-smoke.mjs +0 -235
  550. package/scripts/stress-atomic-write.mjs +0 -1028
  551. package/scripts/test-fault-inject.mjs +0 -164
  552. package/scripts/test-large-file.mjs +0 -174
  553. package/scripts/tool-edge-smoke.mjs +0 -209
  554. package/scripts/uninstall.mjs +0 -238
  555. package/scripts/webhook-selfheal-smoke.mjs +0 -27
  556. package/scripts/write-overwrite-guard-smoke.mjs +0 -56
  557. package/server-main.mjs +0 -3350
  558. package/server.mjs +0 -468
  559. package/setup/config-merge.mjs +0 -246
  560. package/setup/install.mjs +0 -574
  561. package/setup/launch-core.mjs +0 -617
  562. package/setup/launch.mjs +0 -101
  563. package/setup/locate-claude.mjs +0 -56
  564. package/setup/mixdog-cli.mjs +0 -122
  565. package/setup/setup-server.mjs +0 -3305
  566. package/setup/setup.html +0 -3740
  567. package/setup/tui.mjs +0 -325
  568. package/skills/retro-skill-proposer/SKILL.md +0 -92
  569. package/skills/schedule-add/SKILL.md +0 -77
  570. package/skills/setup/SKILL.md +0 -356
  571. package/skills/webhook-add/SKILL.md +0 -81
  572. package/src/agent/bridge-stall-watchdog.mjs +0 -337
  573. package/src/agent/index.mjs +0 -2229
  574. package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +0 -1010
  575. package/src/agent/orchestrator/bridge-retry.mjs +0 -220
  576. package/src/agent/orchestrator/bridge-trace.mjs +0 -601
  577. package/src/agent/orchestrator/cache-mtime.mjs +0 -58
  578. package/src/agent/orchestrator/config.mjs +0 -405
  579. package/src/agent/orchestrator/context/collect.mjs +0 -651
  580. package/src/agent/orchestrator/dispatch-persist.mjs +0 -549
  581. package/src/agent/orchestrator/drain-registry.mjs +0 -50
  582. package/src/agent/orchestrator/explore-validator.mjs +0 -8
  583. package/src/agent/orchestrator/internal-roles.mjs +0 -118
  584. package/src/agent/orchestrator/internal-tools.mjs +0 -88
  585. package/src/agent/orchestrator/jobs.mjs +0 -116
  586. package/src/agent/orchestrator/mcp/client.mjs +0 -364
  587. package/src/agent/orchestrator/providers/anthropic-oauth.mjs +0 -1884
  588. package/src/agent/orchestrator/providers/anthropic.mjs +0 -598
  589. package/src/agent/orchestrator/providers/gemini.mjs +0 -1530
  590. package/src/agent/orchestrator/providers/grok-oauth.mjs +0 -779
  591. package/src/agent/orchestrator/providers/model-catalog.mjs +0 -374
  592. package/src/agent/orchestrator/providers/openai-compat-stream.mjs +0 -366
  593. package/src/agent/orchestrator/providers/openai-compat.mjs +0 -1511
  594. package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +0 -1891
  595. package/src/agent/orchestrator/providers/openai-oauth.mjs +0 -1456
  596. package/src/agent/orchestrator/providers/openai-ws.mjs +0 -127
  597. package/src/agent/orchestrator/providers/registry.mjs +0 -192
  598. package/src/agent/orchestrator/providers/retry-classifier.mjs +0 -325
  599. package/src/agent/orchestrator/session/cache/post-edit-marks.mjs +0 -42
  600. package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +0 -142
  601. package/src/agent/orchestrator/session/cache/read-cache.mjs +0 -319
  602. package/src/agent/orchestrator/session/cache/scoped-cache.mjs +0 -361
  603. package/src/agent/orchestrator/session/loop.mjs +0 -1619
  604. package/src/agent/orchestrator/session/manager.mjs +0 -1991
  605. package/src/agent/orchestrator/session/result-classification.mjs +0 -65
  606. package/src/agent/orchestrator/session/store.mjs +0 -632
  607. package/src/agent/orchestrator/session/stream-watchdog.mjs +0 -130
  608. package/src/agent/orchestrator/session/tool-result-offload.mjs +0 -166
  609. package/src/agent/orchestrator/session/trim.mjs +0 -491
  610. package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +0 -115
  611. package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +0 -331
  612. package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +0 -150
  613. package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +0 -228
  614. package/src/agent/orchestrator/smart-bridge/index.mjs +0 -215
  615. package/src/agent/orchestrator/smart-bridge/profiles.mjs +0 -37
  616. package/src/agent/orchestrator/smart-bridge/registry.mjs +0 -348
  617. package/src/agent/orchestrator/stall-policy.mjs +0 -201
  618. package/src/agent/orchestrator/tool-loop-guard.mjs +0 -75
  619. package/src/agent/orchestrator/tools/bash-session.mjs +0 -722
  620. package/src/agent/orchestrator/tools/builtin/advisory-lock.mjs +0 -171
  621. package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +0 -511
  622. package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -480
  623. package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +0 -256
  624. package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +0 -58
  625. package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +0 -240
  626. package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +0 -113
  627. package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +0 -74
  628. package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +0 -242
  629. package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +0 -211
  630. package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +0 -1364
  631. package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +0 -126
  632. package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +0 -141
  633. package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +0 -194
  634. package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +0 -60
  635. package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +0 -168
  636. package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +0 -173
  637. package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +0 -48
  638. package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +0 -99
  639. package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +0 -193
  640. package/src/agent/orchestrator/tools/builtin/list-tool.mjs +0 -597
  641. package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +0 -110
  642. package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +0 -300
  643. package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +0 -152
  644. package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -118
  645. package/src/agent/orchestrator/tools/builtin/read-open.mjs +0 -190
  646. package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +0 -728
  647. package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +0 -173
  648. package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +0 -602
  649. package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +0 -196
  650. package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +0 -422
  651. package/src/agent/orchestrator/tools/builtin/search-builders.mjs +0 -158
  652. package/src/agent/orchestrator/tools/builtin/search-tool.mjs +0 -869
  653. package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +0 -962
  654. package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +0 -223
  655. package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +0 -206
  656. package/src/agent/orchestrator/tools/builtin/write-tool.mjs +0 -401
  657. package/src/agent/orchestrator/tools/builtin.mjs +0 -503
  658. package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +0 -24
  659. package/src/agent/orchestrator/tools/code-graph.mjs +0 -4095
  660. package/src/agent/orchestrator/tools/cwd-tool.mjs +0 -298
  661. package/src/agent/orchestrator/tools/destructive-warning.mjs +0 -323
  662. package/src/agent/orchestrator/tools/edit-normalize.mjs +0 -603
  663. package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +0 -154
  664. package/src/agent/orchestrator/tools/graph-manifest.json +0 -26
  665. package/src/agent/orchestrator/tools/host-input.mjs +0 -204
  666. package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +0 -143
  667. package/src/agent/orchestrator/tools/patch-manifest.json +0 -26
  668. package/src/agent/orchestrator/tools/patch-tool-defs.mjs +0 -20
  669. package/src/agent/orchestrator/tools/patch.mjs +0 -2754
  670. package/src/agent/orchestrator/tools/progress-message.mjs +0 -118
  671. package/src/agent/orchestrator/tools/shell-command.mjs +0 -865
  672. package/src/agent/orchestrator/tools/shell-policy-imports.mjs +0 -7
  673. package/src/agent/orchestrator/tools/shell-snapshot.mjs +0 -313
  674. package/src/agent/orchestrator/workflow-store.mjs +0 -93
  675. package/src/agent/tool-defs.mjs +0 -110
  676. package/src/channels/backends/discord.mjs +0 -784
  677. package/src/channels/data/voice-runtime-manifest.json +0 -138
  678. package/src/channels/index.mjs +0 -3268
  679. package/src/channels/lib/config.mjs +0 -292
  680. package/src/channels/lib/drop-trace.mjs +0 -71
  681. package/src/channels/lib/event-pipeline.mjs +0 -81
  682. package/src/channels/lib/holidays.mjs +0 -138
  683. package/src/channels/lib/hook-pipe-server.mjs +0 -822
  684. package/src/channels/lib/output-forwarder.mjs +0 -765
  685. package/src/channels/lib/runtime-paths.mjs +0 -552
  686. package/src/channels/lib/scheduler.mjs +0 -723
  687. package/src/channels/lib/session-discovery.mjs +0 -103
  688. package/src/channels/lib/state-file.mjs +0 -68
  689. package/src/channels/lib/status-snapshot.mjs +0 -219
  690. package/src/channels/lib/tool-format.mjs +0 -140
  691. package/src/channels/lib/transcript-discovery.mjs +0 -195
  692. package/src/channels/lib/voice-runtime-fetcher.mjs +0 -734
  693. package/src/channels/lib/webhook.mjs +0 -1318
  694. package/src/channels/tool-defs.mjs +0 -170
  695. package/src/daemon/host.mjs +0 -118
  696. package/src/daemon/mcp-transport.mjs +0 -47
  697. package/src/daemon/session.mjs +0 -100
  698. package/src/daemon/thin-client.mjs +0 -71
  699. package/src/daemon/transport.mjs +0 -163
  700. package/src/gateway/claude-current.mjs +0 -255
  701. package/src/gateway/oauth-usage.mjs +0 -598
  702. package/src/gateway/route-meta.mjs +0 -629
  703. package/src/gateway/server.mjs +0 -713
  704. package/src/memory/data/runtime-manifest.json +0 -40
  705. package/src/memory/index.mjs +0 -3332
  706. package/src/memory/lib/core-memory-store.mjs +0 -330
  707. package/src/memory/lib/embedding-provider.mjs +0 -269
  708. package/src/memory/lib/embedding-worker.mjs +0 -323
  709. package/src/memory/lib/memory-cycle1.mjs +0 -645
  710. package/src/memory/lib/memory-cycle2.mjs +0 -1284
  711. package/src/memory/lib/memory-cycle3.mjs +0 -540
  712. package/src/memory/lib/memory-embed.mjs +0 -299
  713. package/src/memory/lib/memory-ops-policy.mjs +0 -190
  714. package/src/memory/lib/memory-recall-store.mjs +0 -638
  715. package/src/memory/lib/memory.mjs +0 -412
  716. package/src/memory/lib/pg/adapter.mjs +0 -308
  717. package/src/memory/lib/pg/process.mjs +0 -360
  718. package/src/memory/lib/pg/supervisor.mjs +0 -396
  719. package/src/memory/lib/runtime-fetcher.mjs +0 -458
  720. package/src/memory/lib/trace-store.mjs +0 -728
  721. package/src/memory/tool-defs.mjs +0 -79
  722. package/src/search/index.mjs +0 -1173
  723. package/src/search/lib/backends/anthropic-oauth.mjs +0 -98
  724. package/src/search/lib/backends/exa.mjs +0 -50
  725. package/src/search/lib/backends/firecrawl.mjs +0 -61
  726. package/src/search/lib/backends/gemini-api.mjs +0 -83
  727. package/src/search/lib/backends/grok-oauth.mjs +0 -86
  728. package/src/search/lib/backends/index.mjs +0 -150
  729. package/src/search/lib/backends/openai-api.mjs +0 -144
  730. package/src/search/lib/backends/openai-oauth.mjs +0 -102
  731. package/src/search/lib/backends/openai-web-search.mjs +0 -76
  732. package/src/search/lib/backends/tavily.mjs +0 -55
  733. package/src/search/lib/backends/xai-api.mjs +0 -113
  734. package/src/search/lib/config.mjs +0 -192
  735. package/src/search/lib/provider-usage.mjs +0 -67
  736. package/src/search/lib/providers.mjs +0 -47
  737. package/src/search/lib/search-intent.mjs +0 -109
  738. package/src/search/lib/setup-handler.mjs +0 -261
  739. package/src/search/lib/web-tools.mjs +0 -1219
  740. package/src/search/tool-defs.mjs +0 -83
  741. package/src/setup/defender-exclusion.mjs +0 -183
  742. package/src/shared/atomic-file.mjs +0 -436
  743. package/src/shared/config.mjs +0 -372
  744. package/src/shared/daemon-recycle.mjs +0 -108
  745. package/src/shared/disable-claude-builtins.mjs +0 -91
  746. package/src/shared/err-text.mjs +0 -12
  747. package/src/shared/llm/http-agent.mjs +0 -123
  748. package/src/shared/open-url.mjs +0 -62
  749. package/src/shared/plugin-paths.mjs +0 -58
  750. package/src/shared/schedules-store.mjs +0 -70
  751. package/src/shared/seed.mjs +0 -161
  752. package/src/shared/user-cwd.mjs +0 -225
  753. package/src/shared/user-data-guard.mjs +0 -244
  754. package/src/status/aggregator.mjs +0 -584
  755. package/src/status/server.mjs +0 -413
  756. package/tools.json +0 -1671
  757. /package/{defaults → src/defaults}/cycle3-review-prompt.md +0 -0
  758. /package/{defaults → src/defaults}/memory-promote-prompt.md +0 -0
  759. /package/{hooks → src/hooks}/lib/permission-rules.cjs +0 -0
  760. /package/{lib → src/lib}/config-cjs.cjs +0 -0
  761. /package/{lib → src/lib}/hook-pipe-path.cjs +0 -0
  762. /package/{lib → src/lib}/mixdog-debug.cjs +0 -0
  763. /package/{lib → src/lib}/text-utils.cjs +0 -0
  764. /package/{rules → src/rules}/bridge/42-cycle3-agent.md +0 -0
  765. /package/src/{agent → runtime/agent}/orchestrator/activity-bus.mjs +0 -0
  766. /package/src/{agent → runtime/agent}/orchestrator/providers/anthropic-betas.mjs +0 -0
  767. /package/src/{agent → runtime/agent}/orchestrator/session/abort-lookup.mjs +0 -0
  768. /package/src/{agent → runtime/agent}/orchestrator/session/cache/scoped-cache-outcome.mjs +0 -0
  769. /package/src/{agent → runtime/agent}/orchestrator/session/cache/util.mjs +0 -0
  770. /package/src/{agent → runtime/agent}/orchestrator/session/read-dedup.mjs +0 -0
  771. /package/src/{agent → runtime/agent}/orchestrator/session/save-session-worker.mjs +0 -0
  772. /package/src/{agent → runtime/agent}/orchestrator/smart-bridge/session-builder.mjs +0 -0
  773. /package/src/{agent → runtime/agent}/orchestrator/tools/bash-policy-scan.mjs +0 -0
  774. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/atomic-write.mjs +0 -0
  775. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/binary-file.mjs +0 -0
  776. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cache-layers.mjs +0 -0
  777. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cwd-utils.mjs +0 -0
  778. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/device-paths.mjs +0 -0
  779. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -0
  780. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diff-utils.mjs +0 -0
  781. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/fs-reachability.mjs +0 -0
  782. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/grep-formatting.mjs +0 -0
  783. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/hash-utils.mjs +0 -0
  784. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/list-formatting.mjs +0 -0
  785. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/open-config-tool.mjs +0 -0
  786. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-locks.mjs +0 -0
  787. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-utils.mjs +0 -0
  788. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-args.mjs +0 -0
  789. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-batch.mjs +0 -0
  790. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-constants.mjs +0 -0
  791. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image-resize.mjs +0 -0
  792. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image.mjs +0 -0
  793. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-lines.mjs +0 -0
  794. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-mode-tool.mjs +0 -0
  795. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-range-index.mjs +0 -0
  796. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-ranges.mjs +0 -0
  797. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-special-files.mjs +0 -0
  798. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-tool.mjs +0 -0
  799. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-windows.mjs +0 -0
  800. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-analysis.mjs +0 -0
  801. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-output.mjs +0 -0
  802. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-helpers.mjs +0 -0
  803. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-validation.mjs +0 -0
  804. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/text-stats.mjs +0 -0
  805. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/windows-roots.mjs +0 -0
  806. /package/src/{agent → runtime/agent}/orchestrator/tools/code-graph-prewarm-worker.mjs +0 -0
  807. /package/src/{agent → runtime/agent}/orchestrator/tools/env-scrub.mjs +0 -0
  808. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-content-cache.mjs +0 -0
  809. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-planner.mjs +0 -0
  810. /package/src/{agent → runtime/agent}/orchestrator/tools/next-call-utils.mjs +0 -0
  811. /package/src/{agent → runtime/agent}/orchestrator/tools/result-compression.mjs +0 -0
  812. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-exec-policy.mjs +0 -0
  813. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy-danger-target.mjs +0 -0
  814. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy.mjs +0 -0
  815. /package/src/{channels → runtime/channels}/lib/cli-worker-host.mjs +0 -0
  816. /package/src/{channels → runtime/channels}/lib/config-lock.mjs +0 -0
  817. /package/src/{channels → runtime/channels}/lib/event-queue.mjs +0 -0
  818. /package/src/{channels → runtime/channels}/lib/executor.mjs +0 -0
  819. /package/src/{channels → runtime/channels}/lib/format.mjs +0 -0
  820. /package/src/{channels → runtime/channels}/lib/interaction-workflows.mjs +0 -0
  821. /package/src/{channels → runtime/channels}/lib/memory-client.mjs +0 -0
  822. /package/src/{channels → runtime/channels}/lib/session-control.mjs +0 -0
  823. /package/src/{channels → runtime/channels}/lib/settings.mjs +0 -0
  824. /package/src/{channels → runtime/channels}/lib/whisper-server.mjs +0 -0
  825. /package/src/{memory → runtime/memory}/lib/agent-ipc.mjs +0 -0
  826. /package/src/{memory → runtime/memory}/lib/bridge-trace-queries.mjs +0 -0
  827. /package/src/{memory → runtime/memory}/lib/llm-worker-host.mjs +0 -0
  828. /package/src/{memory → runtime/memory}/lib/memory-cycle.mjs +0 -0
  829. /package/src/{memory → runtime/memory}/lib/memory-extraction.mjs +0 -0
  830. /package/src/{memory → runtime/memory}/lib/memory-maintenance-store.mjs +0 -0
  831. /package/src/{memory → runtime/memory}/lib/memory-recall-id-patch.mjs +0 -0
  832. /package/src/{memory → runtime/memory}/lib/memory-recall-read-query.mjs +0 -0
  833. /package/src/{memory → runtime/memory}/lib/memory-recall-scope-filter.mjs +0 -0
  834. /package/src/{memory → runtime/memory}/lib/memory-retrievers.mjs +0 -0
  835. /package/src/{memory → runtime/memory}/lib/memory-score.mjs +0 -0
  836. /package/src/{memory → runtime/memory}/lib/memory-text-utils.mjs +0 -0
  837. /package/src/{memory → runtime/memory}/lib/model-profile.mjs +0 -0
  838. /package/src/{memory → runtime/memory}/lib/project-id-resolver.mjs +0 -0
  839. /package/src/{search → runtime/search}/lib/cache.mjs +0 -0
  840. /package/src/{search → runtime/search}/lib/formatter.mjs +0 -0
  841. /package/src/{search → runtime/search}/lib/state.mjs +0 -0
  842. /package/src/{shared → runtime/shared}/abort-controller.mjs +0 -0
  843. /package/src/{shared → runtime/shared}/llm/cost.mjs +0 -0
  844. /package/src/{shared → runtime/shared}/llm/index.mjs +0 -0
  845. /package/src/{shared → runtime/shared}/llm/pid-cleanup.mjs +0 -0
  846. /package/src/{shared → runtime/shared}/llm/usage-log.mjs +0 -0
  847. /package/src/{shared → runtime/shared}/wsl.mjs +0 -0
@@ -1,728 +0,0 @@
1
- // trace-store.mjs — native-PG trace analytics store for mixdog 0.4.0.
2
- // Uses pg-adapter (schema='trace') so trace_events live in the trace schema.
3
- // Isolated from memory schema; shares the same PG instance.
4
-
5
- import { ensurePgInstance, checkedConnect } from './pg/adapter.mjs'
6
- import { resolve } from 'path'
7
-
8
- const dbs = new Map()
9
- const opening = new Map()
10
- const partitionTimers = new Map()
11
-
12
- // ---------------------------------------------------------------------------
13
- // Schema bootstrap
14
- // ---------------------------------------------------------------------------
15
-
16
- // Guard: if a non-partitioned trace_events exists, drop it.
17
- // Trace is regenerable observability data; drop on schema repair to avoid
18
- // stale dependent pollution (indexes are NOT renamed with the table, so RENAME
19
- // would leave old index names bound to the replaced table, making subsequent
20
- // CREATE INDEX IF NOT EXISTS a no-op on the new partitioned root).
21
- async function maybeDropLegacyTable(client) {
22
- const r = await client.query(`
23
- SELECT c.relname
24
- FROM pg_class c
25
- JOIN pg_namespace n ON n.oid = c.relnamespace
26
- WHERE n.nspname = 'trace'
27
- AND c.relname = 'trace_events'
28
- AND c.relkind = 'r' -- ordinary (non-partitioned) table only
29
- AND c.oid NOT IN (
30
- SELECT partrelid FROM pg_partitioned_table
31
- )
32
- `)
33
- if (r.rows.length > 0) {
34
- await client.query(`DROP TABLE trace.trace_events CASCADE`)
35
- }
36
- }
37
-
38
- async function init(client) {
39
- await maybeDropLegacyTable(client)
40
-
41
- // Partitioned root.
42
- // PK is (id, ts) because PostgreSQL requires the partition key (ts) to be
43
- // part of every unique/primary constraint on a partitioned table.
44
- // BIGSERIAL is kept (vs GENERATED ALWAYS AS IDENTITY) for compatibility with
45
- // the existing pg-adapter helpers that may inspect sequence names.
46
- await client.query(`
47
- CREATE TABLE IF NOT EXISTS trace_events (
48
- id BIGSERIAL,
49
- ts BIGINT NOT NULL,
50
- session_id TEXT,
51
- iteration INTEGER,
52
- kind TEXT NOT NULL,
53
- role TEXT,
54
- model TEXT,
55
- tool_name TEXT,
56
- tool_ms INTEGER,
57
- input_tokens INTEGER,
58
- output_tokens INTEGER,
59
- cached_tokens INTEGER,
60
- cache_write_tokens INTEGER,
61
- duration_ms INTEGER,
62
- error_message TEXT,
63
- payload JSONB NOT NULL,
64
- parent_span_id BIGINT,
65
- entry_id BIGINT,
66
- PRIMARY KEY (id, ts)
67
- ) PARTITION BY RANGE (ts)
68
- `)
69
-
70
- // Default catch-all partition — ensures no INSERT is lost even before named
71
- // monthly partitions exist. Rows here cannot be auto-rerouted once a covering
72
- // partition is added, so ensureCurrentAndNextMonthPartitions() is called on
73
- // every boot to pre-create upcoming months before rollover.
74
- await client.query(`
75
- CREATE TABLE IF NOT EXISTS trace_events_default
76
- PARTITION OF trace_events DEFAULT
77
- `)
78
-
79
- // Previous-month partition — created in init only (not on every boot).
80
- await client.query(`
81
- DO $$
82
- DECLARE
83
- prev_start BIGINT := extract(epoch from date_trunc('month', now() - interval '1 month'))::BIGINT * 1000;
84
- prev_end BIGINT := extract(epoch from date_trunc('month', now()))::BIGINT * 1000;
85
- prev_name TEXT := 'trace_events_' || to_char(now() - interval '1 month', 'YYYY_MM');
86
- BEGIN
87
- IF NOT EXISTS (
88
- SELECT 1 FROM pg_class c
89
- JOIN pg_namespace n ON n.oid = c.relnamespace
90
- WHERE n.nspname = 'trace' AND c.relname = prev_name
91
- ) THEN
92
- EXECUTE format(
93
- 'CREATE TABLE %I PARTITION OF trace_events FOR VALUES FROM (%s) TO (%s)',
94
- prev_name, prev_start, prev_end
95
- );
96
- END IF;
97
- END $$
98
- `)
99
-
100
- // BRIN on ts — ~1000× smaller than btree for append-only timeseries; ideal
101
- // for time-window range scans where rows arrive in roughly ts order.
102
- await client.query(`CREATE INDEX IF NOT EXISTS idx_trace_ts_brin ON trace_events USING BRIN (ts) WITH (pages_per_range = 32)`)
103
- await client.query(`CREATE INDEX IF NOT EXISTS idx_trace_kind_ts ON trace_events(kind, ts DESC)`)
104
- await client.query(`CREATE INDEX IF NOT EXISTS idx_trace_session ON trace_events(session_id, ts)`)
105
- await client.query(`CREATE INDEX IF NOT EXISTS idx_trace_role_ts ON trace_events(role, ts DESC)`)
106
- await client.query(`CREATE INDEX IF NOT EXISTS idx_trace_model_ts ON trace_events(model, ts DESC)`)
107
- await client.query(`CREATE INDEX IF NOT EXISTS idx_trace_tool ON trace_events(tool_name) WHERE kind = 'tool'`)
108
- // Span-tree and cross-schema recall↔trace correlation — partial indexes so
109
- // they cover only the (small) fraction of rows where these FKs are set.
110
- // No FK constraints: self-FKs on partitioned tables are fragile, and
111
- // entry_id crosses schema boundaries (memory.entries).
112
- await client.query(`CREATE INDEX IF NOT EXISTS idx_trace_parent ON trace_events(parent_span_id) WHERE parent_span_id IS NOT NULL`)
113
- await client.query(`CREATE INDEX IF NOT EXISTS idx_trace_entry ON trace_events(entry_id) WHERE entry_id IS NOT NULL`)
114
-
115
- // Current + next month created on every boot (see ensureCurrentAndNextMonthPartitions).
116
- await ensureCurrentAndNextMonthPartitions(client)
117
- }
118
-
119
- // ---------------------------------------------------------------------------
120
- // Bridge-specific analytic tables (added post-init via initBridgeTables)
121
- // ---------------------------------------------------------------------------
122
-
123
- // Called once per openTraceDatabase boot (after the advisory lock is released).
124
- // Safe to call concurrently — all DDL is IF NOT EXISTS.
125
- export async function initBridgeTables(client) {
126
- // ── bridge_calls: one row per tool invocation ─────────────────────────────
127
- await client.query(`
128
- CREATE TABLE IF NOT EXISTS bridge_calls (
129
- id BIGSERIAL PRIMARY KEY,
130
- session_id TEXT NOT NULL,
131
- iteration INT,
132
- ts TIMESTAMPTZ NOT NULL,
133
- tool_name TEXT,
134
- tool_kind TEXT,
135
- tool_ms INT,
136
- tool_args JSONB
137
- )
138
- `)
139
- await client.query(`CREATE INDEX IF NOT EXISTS idx_bc_session ON bridge_calls (session_id, iteration)`)
140
- await client.query(`CREATE INDEX IF NOT EXISTS idx_bc_ts ON bridge_calls USING BRIN (ts)`)
141
- await client.query(`CREATE INDEX IF NOT EXISTS idx_bc_tool_name ON bridge_calls (tool_name)`)
142
- // Expression indexes covering the two actual query patterns (md5 dedup + path lookup).
143
- // The old GIN index had no @> callers and was write-heavy; dropped in favour of these.
144
- await client.query(`CREATE INDEX IF NOT EXISTS idx_bc_args_md5 ON bridge_calls (session_id, tool_name, md5(tool_args::text))`)
145
- await client.query(`CREATE INDEX IF NOT EXISTS idx_bc_args_path ON bridge_calls (session_id, tool_name, (tool_args->>'path'), ts, id)`)
146
- await client.query(`DROP INDEX IF EXISTS idx_bc_args`)
147
-
148
- // ── bridge_llm: one row per LLM usage event ───────────────────────────────
149
- await client.query(`
150
- CREATE TABLE IF NOT EXISTS bridge_llm (
151
- id BIGSERIAL PRIMARY KEY,
152
- session_id TEXT NOT NULL,
153
- iteration INT,
154
- ts TIMESTAMPTZ NOT NULL,
155
- model TEXT,
156
- input_tokens INT,
157
- output_tokens INT,
158
- cached_tokens INT,
159
- cache_write_tokens INT,
160
- prompt_tokens INT,
161
- response_id TEXT
162
- )
163
- `)
164
- await client.query(`CREATE INDEX IF NOT EXISTS idx_bl_session ON bridge_llm (session_id, iteration)`)
165
- await client.query(`CREATE INDEX IF NOT EXISTS idx_bl_ts ON bridge_llm USING BRIN (ts)`)
166
- await client.query(`CREATE INDEX IF NOT EXISTS idx_bl_model ON bridge_llm (model)`)
167
-
168
- // ── bridge_sessions: denormalised summary upserted on each insert ─────────
169
- await client.query(`
170
- CREATE TABLE IF NOT EXISTS bridge_sessions (
171
- session_id TEXT PRIMARY KEY,
172
- role TEXT,
173
- model TEXT,
174
- started_at TIMESTAMPTZ,
175
- last_seen_at TIMESTAMPTZ,
176
- tool_calls INT NOT NULL DEFAULT 0,
177
- llm_calls INT NOT NULL DEFAULT 0,
178
- max_iteration INT NOT NULL DEFAULT 0,
179
- total_input_tokens BIGINT NOT NULL DEFAULT 0,
180
- total_output_tokens BIGINT NOT NULL DEFAULT 0
181
- )
182
- `)
183
- }
184
-
185
- // ---------------------------------------------------------------------------
186
- // insertBridgeCalls — batch insert tool rows + upsert session summary
187
- // ---------------------------------------------------------------------------
188
- const TOOL_ARGS_MAX_BYTES = 65536 // 64 KB cap; oversized → sha256 + truncated preview
189
-
190
- import { createHash as _createHash } from 'crypto'
191
- function _capToolArgsSync(args) {
192
- if (args == null) return null
193
- const raw = typeof args === 'string' ? args : JSON.stringify(args)
194
- if (Buffer.byteLength(raw, 'utf8') <= TOOL_ARGS_MAX_BYTES) {
195
- if (typeof args !== 'string') return args
196
- // tool_args is JSONB in PG; round-trip parse for string inputs, but a
197
- // plain non-JSON string (e.g. a bare path) would otherwise throw and
198
- // fail the whole insert batch. Treat unparseable as the raw string.
199
- try { return JSON.parse(raw) } catch { return raw }
200
- }
201
- return { _oversized: true, sha256: _createHash('sha256').update(raw).digest('hex'), preview: raw.slice(0, 512) }
202
- }
203
-
204
- export async function insertBridgeCalls(db, events) {
205
- if (!Array.isArray(events) || events.length === 0) return { calls: 0, llm: 0 }
206
- const toolRows = []
207
- const llmRows = []
208
- for (const ev of events) {
209
- let ts = ev.ts; if (typeof ts === 'string') ts = Date.parse(ts); ts = Number(ts); if (!Number.isFinite(ts)) ts = Date.now()
210
- const tsIso = new Date(ts).toISOString()
211
- const sid = ev.session_id ?? ev.sessionId ?? null
212
- if (!sid) continue
213
- const iter = ev.iteration != null ? Number(ev.iteration) : null
214
- if (ev.kind === 'tool') {
215
- const tool_name = ev.tool_name ?? ev.toolName ?? null
216
- const tool_kind = ev.tool_kind ?? ev.toolKind ?? null
217
- const tool_ms = ev.tool_ms ?? ev.toolMs ?? null
218
- const tool_args = ev.tool_args ?? ev.toolArgs ?? null
219
- 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) })
220
- } else if (ev.kind === 'usage_raw' || (ev.input_tokens != null && ev.output_tokens != null)) {
221
- llmRows.push({ session_id: sid, iteration: iter, ts: tsIso, model: ev.model ?? null,
222
- input_tokens: ev.input_tokens ?? ev.inputTokens ?? null,
223
- output_tokens: ev.output_tokens ?? ev.outputTokens ?? null,
224
- cached_tokens: ev.cached_tokens ?? ev.cachedTokens ?? null,
225
- cache_write_tokens: ev.cache_write_tokens ?? ev.cacheWriteTokens ?? null,
226
- prompt_tokens: ev.prompt_tokens ?? ev.promptTokens ?? null,
227
- response_id: ev.response_id ?? ev.responseId ?? null,
228
- })
229
- }
230
- }
231
-
232
- // Wrap all three inserts in a single transaction — one flush/fsync.
233
- // checkedConnect ensures search_path = trace, public on fresh connections;
234
- // raw _pool.connect() leaves search_path at PG default and bridge_* lookups
235
- // resolve in the wrong schema.
236
- const client = await checkedConnect(db._pool, 'trace')
237
- try {
238
- await client.query('BEGIN')
239
-
240
- if (toolRows.length > 0) {
241
- await client.query(
242
- `INSERT INTO bridge_calls (session_id,iteration,ts,tool_name,tool_kind,tool_ms,tool_args)
243
- SELECT u.session_id, u.iteration::int, u.ts::timestamptz,
244
- u.tool_name, u.tool_kind, u.tool_ms::int, u.tool_args::jsonb
245
- FROM unnest($1::text[],$2::int[],$3::text[],$4::text[],$5::text[],$6::int[],$7::text[])
246
- AS u(session_id,iteration,ts,tool_name,tool_kind,tool_ms,tool_args)`,
247
- [
248
- toolRows.map(r => r.session_id),
249
- toolRows.map(r => r.iteration),
250
- toolRows.map(r => r.ts),
251
- toolRows.map(r => r.tool_name),
252
- toolRows.map(r => r.tool_kind),
253
- toolRows.map(r => r.tool_ms),
254
- toolRows.map(r => r.tool_args != null ? JSON.stringify(r.tool_args) : null),
255
- ],
256
- )
257
- }
258
-
259
- if (llmRows.length > 0) {
260
- await client.query(
261
- `INSERT INTO bridge_llm (session_id,iteration,ts,model,input_tokens,output_tokens,cached_tokens,cache_write_tokens,prompt_tokens,response_id)
262
- SELECT u.session_id, u.iteration::int, u.ts::timestamptz,
263
- u.model, u.input_tokens::int, u.output_tokens::int,
264
- u.cached_tokens::int, u.cache_write_tokens::int,
265
- u.prompt_tokens::int, u.response_id
266
- FROM unnest($1::text[],$2::int[],$3::text[],$4::text[],$5::int[],$6::int[],$7::int[],$8::int[],$9::int[],$10::text[])
267
- AS u(session_id,iteration,ts,model,input_tokens,output_tokens,cached_tokens,cache_write_tokens,prompt_tokens,response_id)`,
268
- [
269
- llmRows.map(r => r.session_id),
270
- llmRows.map(r => r.iteration),
271
- llmRows.map(r => r.ts),
272
- llmRows.map(r => r.model),
273
- llmRows.map(r => r.input_tokens),
274
- llmRows.map(r => r.output_tokens),
275
- llmRows.map(r => r.cached_tokens),
276
- llmRows.map(r => r.cache_write_tokens),
277
- llmRows.map(r => r.prompt_tokens),
278
- llmRows.map(r => r.response_id),
279
- ],
280
- )
281
- }
282
-
283
- // Upsert session summaries — accumulate from tool+llm rows in this batch
284
- const sessionMap = new Map()
285
- for (const r of toolRows) {
286
- 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 }
287
- s.tool_calls += 1
288
- if (r.iteration != null && r.iteration > s.max_iteration) s.max_iteration = r.iteration
289
- if (r.ts < s.ts0) s.ts0 = r.ts; if (r.ts > s.ts1) s.ts1 = r.ts
290
- sessionMap.set(r.session_id, s)
291
- }
292
- for (const r of llmRows) {
293
- 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 }
294
- s.llm_calls += 1
295
- s.total_input += BigInt(r.input_tokens ?? 0)
296
- s.total_output += BigInt(r.output_tokens ?? 0)
297
- if (r.model) s.model = r.model
298
- if (r.iteration != null && r.iteration > s.max_iteration) s.max_iteration = r.iteration
299
- if (r.ts < s.ts0) s.ts0 = r.ts; if (r.ts > s.ts1) s.ts1 = r.ts
300
- sessionMap.set(r.session_id, s)
301
- }
302
- // Also pick up role from preset_assign events in the same batch
303
- for (const ev of events) {
304
- if (ev.kind === 'preset_assign' && ev.role) {
305
- const sid = ev.session_id ?? ev.sessionId ?? null
306
- if (!sid) continue
307
- const s = sessionMap.get(sid)
308
- if (s) s.role = ev.role
309
- }
310
- }
311
- // Fix 5 — upsert sessions for preset_assign-only batches (no tool/llm rows yet)
312
- for (const ev of events) {
313
- if (ev.kind !== 'preset_assign') continue
314
- const sid = ev.session_id ?? ev.sessionId ?? null
315
- if (!sid) continue
316
- if (sessionMap.has(sid)) continue // already populated from tool/llm rows above
317
- let ts = ev.ts; if (typeof ts === 'string') ts = Date.parse(ts); ts = Number(ts); if (!Number.isFinite(ts)) ts = Date.now()
318
- const tsIso = new Date(ts).toISOString()
319
- sessionMap.set(sid, {
320
- tool_calls: 0, llm_calls: 0, max_iteration: 0,
321
- total_input: 0n, total_output: 0n,
322
- ts0: tsIso, ts1: tsIso,
323
- role: ev.role ?? null, model: ev.model ?? null,
324
- })
325
- }
326
-
327
- // Coalesce bridge_sessions upserts: batch all sessions in one unnest INSERT.
328
- // Also within the same transaction.
329
- if (sessionMap.size > 0) {
330
- const sids = [], roles = [], models = [], ts0s = [], ts1s = [],
331
- tcalls = [], lcalls = [], maxiters = [], tinputs = [], toutputs = []
332
- for (const [sid, s] of sessionMap) {
333
- sids.push(sid); roles.push(s.role); models.push(s.model)
334
- ts0s.push(s.ts0); ts1s.push(s.ts1)
335
- tcalls.push(s.tool_calls); lcalls.push(s.llm_calls)
336
- maxiters.push(s.max_iteration)
337
- tinputs.push(String(s.total_input)); toutputs.push(String(s.total_output))
338
- }
339
- await client.query(`
340
- 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)
341
- SELECT u.session_id, u.role, u.model,
342
- u.started_at::timestamptz, u.last_seen_at::timestamptz,
343
- u.tool_calls::int, u.llm_calls::int, u.max_iteration::int,
344
- u.total_input_tokens::bigint, u.total_output_tokens::bigint
345
- FROM unnest($1::text[],$2::text[],$3::text[],$4::text[],$5::text[],$6::int[],$7::int[],$8::int[],$9::text[],$10::text[])
346
- AS u(session_id,role,model,started_at,last_seen_at,tool_calls,llm_calls,max_iteration,total_input_tokens,total_output_tokens)
347
- ON CONFLICT (session_id) DO UPDATE SET
348
- role = COALESCE(EXCLUDED.role, bridge_sessions.role),
349
- model = COALESCE(EXCLUDED.model, bridge_sessions.model),
350
- started_at = LEAST(bridge_sessions.started_at, EXCLUDED.started_at),
351
- last_seen_at = GREATEST(bridge_sessions.last_seen_at, EXCLUDED.last_seen_at),
352
- tool_calls = bridge_sessions.tool_calls + EXCLUDED.tool_calls,
353
- llm_calls = bridge_sessions.llm_calls + EXCLUDED.llm_calls,
354
- max_iteration = GREATEST(bridge_sessions.max_iteration, EXCLUDED.max_iteration),
355
- total_input_tokens = bridge_sessions.total_input_tokens + EXCLUDED.total_input_tokens,
356
- total_output_tokens = bridge_sessions.total_output_tokens + EXCLUDED.total_output_tokens
357
- `, [sids, roles, models, ts0s, ts1s, tcalls, lcalls, maxiters, tinputs, toutputs])
358
- }
359
-
360
- await client.query('COMMIT')
361
- } catch (err) {
362
- try { await client.query('ROLLBACK') } catch {}
363
- throw err
364
- } finally {
365
- client.release()
366
- }
367
-
368
- return { calls: toolRows.length, llm: llmRows.length }
369
- }
370
-
371
- // Idempotently ensure partitions exist for the current and next calendar month.
372
- // Called from both init() and openTraceDatabase() so the next-month partition
373
- // is always pre-created before rollover; rows never land in the default partition
374
- // for a range that has a covering monthly partition.
375
- async function ensureCurrentAndNextMonthPartitions(client) {
376
- await client.query(`
377
- DO $$
378
- DECLARE
379
- cur_start BIGINT := extract(epoch from date_trunc('month', now()))::BIGINT * 1000;
380
- cur_end BIGINT := extract(epoch from date_trunc('month', now() + interval '1 month'))::BIGINT * 1000;
381
- next_start BIGINT := extract(epoch from date_trunc('month', now() + interval '1 month'))::BIGINT * 1000;
382
- next_end BIGINT := extract(epoch from date_trunc('month', now() + interval '2 months'))::BIGINT * 1000;
383
- cur_name TEXT := 'trace_events_' || to_char(now(), 'YYYY_MM');
384
- next_name TEXT := 'trace_events_' || to_char(now() + interval '1 month', 'YYYY_MM');
385
- BEGIN
386
- IF NOT EXISTS (
387
- SELECT 1 FROM pg_class c
388
- JOIN pg_namespace n ON n.oid = c.relnamespace
389
- WHERE n.nspname = 'trace' AND c.relname = cur_name
390
- ) THEN
391
- EXECUTE format(
392
- 'CREATE TABLE %I PARTITION OF trace_events FOR VALUES FROM (%s) TO (%s)',
393
- cur_name, cur_start, cur_end
394
- );
395
- END IF;
396
- IF NOT EXISTS (
397
- SELECT 1 FROM pg_class c
398
- JOIN pg_namespace n ON n.oid = c.relnamespace
399
- WHERE n.nspname = 'trace' AND c.relname = next_name
400
- ) THEN
401
- EXECUTE format(
402
- 'CREATE TABLE %I PARTITION OF trace_events FOR VALUES FROM (%s) TO (%s)',
403
- next_name, next_start, next_end
404
- );
405
- END IF;
406
- END $$
407
- `)
408
- }
409
-
410
- async function isBootstrapComplete(client) {
411
- try {
412
- // Harden the check: require (a) root is partitioned, (b) schema-version
413
- // columns parent_span_id and entry_id exist, (c) idx_trace_ts_brin exists,
414
- // (d) at least one named-month OR default partition exists.
415
- // A partial failed init (crashed after CREATE TABLE, before indexes) returns
416
- // false here, triggering a full re-run rather than silently booting broken.
417
- const r = await client.query(`
418
- SELECT 1 WHERE
419
- -- (a) partitioned root exists
420
- EXISTS (
421
- SELECT 1 FROM pg_class c
422
- JOIN pg_namespace n ON n.oid = c.relnamespace
423
- JOIN pg_partitioned_table pt ON pt.partrelid = c.oid
424
- WHERE n.nspname = 'trace' AND c.relname = 'trace_events'
425
- )
426
- -- (b) schema-version columns present
427
- AND EXISTS (
428
- SELECT 1 FROM pg_attribute a
429
- JOIN pg_class c ON c.oid = a.attrelid
430
- JOIN pg_namespace n ON n.oid = c.relnamespace
431
- WHERE n.nspname = 'trace' AND c.relname = 'trace_events'
432
- AND a.attname IN ('parent_span_id', 'entry_id')
433
- AND a.attnum > 0 AND NOT a.attisdropped
434
- HAVING count(*) = 2
435
- )
436
- -- (c) BRIN index exists
437
- AND EXISTS (
438
- SELECT 1 FROM pg_indexes
439
- WHERE schemaname = 'trace' AND indexname = 'idx_trace_ts_brin'
440
- )
441
- -- (d) at least one partition (named-month or default catch-all) exists
442
- AND EXISTS (
443
- SELECT 1 FROM pg_inherits i
444
- JOIN pg_class cp ON cp.oid = i.inhparent
445
- JOIN pg_namespace n ON n.oid = cp.relnamespace
446
- WHERE n.nspname = 'trace' AND cp.relname = 'trace_events'
447
- )
448
- `)
449
- return r.rows.length > 0
450
- } catch {
451
- return false
452
- }
453
- }
454
-
455
- // Advisory lock key — session-scoped, prevents cross-process bootstrap races.
456
- const BOOTSTRAP_LOCK_KEY = `hashtext('mixdog.trace_bootstrap')`
457
-
458
- // ---------------------------------------------------------------------------
459
- // openTraceDatabase
460
- // ---------------------------------------------------------------------------
461
-
462
- export async function openTraceDatabase(dataDir) {
463
- const key = resolve(dataDir)
464
-
465
- if (dbs.get(key)) return dbs.get(key)
466
- if (opening.has(key)) return opening.get(key)
467
-
468
- const promise = (async () => {
469
- // pg-adapter with schema='trace' sets search_path=trace,public per connection.
470
- const { db } = await ensurePgInstance(dataDir, { schema: 'trace' })
471
-
472
- // Acquire a dedicated pool client for bootstrap so the advisory lock is
473
- // session-scoped to exactly one connection (advisory locks are per-session).
474
- // The client is released in finally — in both success and error paths.
475
- const client = await db._pool.connect()
476
- try {
477
- // Set search_path on the dedicated client to match the pool default.
478
- await client.query(`SET search_path = trace, public`)
479
- // Session-scoped advisory lock — bounded so a stuck holder can't hang
480
- // boot indefinitely. Try non-blocking first; on contention, set a
481
- // 30s lock_timeout for the blocking acquire and surface a clear error
482
- // instead of an unbounded wait.
483
- const tryAcquire = await client.query(`SELECT pg_try_advisory_lock(${BOOTSTRAP_LOCK_KEY}) AS locked`)
484
- if (!tryAcquire.rows[0]?.locked) {
485
- // SET LOCAL only persists inside an explicit transaction — without
486
- // BEGIN/COMMIT PG resets it immediately, so pg_advisory_lock() would
487
- // wait unbounded. Wrap the lock_timeout + blocking acquire so the
488
- // 30s ceiling actually applies.
489
- await client.query('BEGIN')
490
- try {
491
- await client.query(`SET LOCAL lock_timeout = '30s'`)
492
- await client.query(`SELECT pg_advisory_lock(${BOOTSTRAP_LOCK_KEY})`)
493
- await client.query('COMMIT')
494
- } catch (err) {
495
- try { await client.query('ROLLBACK') } catch {}
496
- // lock_timeout fires as 55P03 (lock_not_available); surface with context.
497
- throw new Error(`trace-store bootstrap advisory lock timed out (30s): ${err?.message || err}`)
498
- }
499
- }
500
- try {
501
- // Re-check after acquiring the lock: another process may have completed
502
- // init while we were waiting.
503
- if (!(await isBootstrapComplete(client))) {
504
- await init(client)
505
- } else {
506
- // Init already done by another process; still ensure upcoming partitions
507
- // are pre-created for this boot.
508
- await ensureCurrentAndNextMonthPartitions(client)
509
- }
510
- } finally {
511
- await client.query(`SELECT pg_advisory_unlock(${BOOTSTRAP_LOCK_KEY})`)
512
- }
513
- } finally {
514
- client.release()
515
- }
516
- // Bridge-specific analytic tables — idempotent, no advisory lock needed.
517
- await initBridgeTables(db)
518
-
519
- dbs.set(key, db)
520
-
521
- // Periodically ensure current + next-month partitions exist so a
522
- // long-running process never hits the default catch-all partition at
523
- // month rollover. Fires every 12 h — well ahead of any boundary.
524
- const _partitionEnsureInterval = setInterval(async () => {
525
- const c = await db._pool.connect()
526
- try {
527
- await c.query(`SET search_path = trace, public`)
528
- await ensureCurrentAndNextMonthPartitions(c)
529
- } catch (err) {
530
- process.stderr.write(`[trace-store] periodic partition ensure failed: ${err?.message ?? err}\n`)
531
- } finally {
532
- c.release()
533
- }
534
- }, 12 * 60 * 60 * 1000)
535
- _partitionEnsureInterval.unref?.()
536
- partitionTimers.set(key, _partitionEnsureInterval)
537
-
538
- return db
539
- })()
540
-
541
- opening.set(key, promise)
542
- try {
543
- return await promise
544
- } finally {
545
- opening.delete(key)
546
- }
547
- }
548
-
549
- // ---------------------------------------------------------------------------
550
- // insertTraceEvents — batch INSERT
551
- // ---------------------------------------------------------------------------
552
-
553
- const TRACE_COLS = [
554
- 'ts', 'session_id', 'iteration', 'kind', 'role', 'model',
555
- 'tool_name', 'tool_ms', 'input_tokens', 'output_tokens',
556
- 'cached_tokens', 'cache_write_tokens', 'duration_ms',
557
- 'error_message', 'payload', 'parent_span_id', 'entry_id',
558
- ]
559
-
560
- // ---------------------------------------------------------------------------
561
- // Cross-request trace_events write queue (100ms / 500-row flush window)
562
- // ---------------------------------------------------------------------------
563
-
564
- const TRACE_QUEUE_FLUSH_MS = 100
565
- const TRACE_QUEUE_MAX_ROWS = 500
566
-
567
- // Per-db queue state (keyed by db object identity via WeakMap).
568
- const _traceQueues = new WeakMap()
569
-
570
- function _getQueue(db) {
571
- let q = _traceQueues.get(db)
572
- if (!q) {
573
- q = { pending: [], timer: null, flushPromise: null }
574
- _traceQueues.set(db, q)
575
- }
576
- return q
577
- }
578
-
579
- async function _flushQueue(db, q) {
580
- // When a flush is already running, callers reuse its promise — but enqueues
581
- // that arrive during that flush schedule a fresh timer that fires here and
582
- // is consumed by the early return. Reschedule a follow-up flush so events
583
- // queued mid-flush don't sit until the next unrelated enqueue.
584
- if (q.flushPromise) {
585
- if (q.pending.length > 0) _scheduleFlush(db, q)
586
- return q.flushPromise
587
- }
588
- const wrappers = q.pending.splice(0)
589
- if (wrappers.length === 0) return { inserted: 0 }
590
- const MAX_RETRIES = 3
591
- q.flushPromise = (async () => {
592
- try {
593
- const allEvents = wrappers.flatMap(w => w.events)
594
- return await _insertTraceEventsDirect(db, allEvents)
595
- } catch (err) {
596
- for (const w of wrappers) w.attempts += 1
597
- const keep = wrappers.filter(w => w.attempts < MAX_RETRIES)
598
- const dropped = wrappers.filter(w => w.attempts >= MAX_RETRIES)
599
- if (dropped.length > 0) {
600
- process.stderr.write(`[trace-queue] dropped ${dropped.reduce((n, w) => n + w.events.length, 0)} events after ${MAX_RETRIES} retries: ${err?.message}\n`)
601
- }
602
- q.pending.unshift(...keep)
603
- process.stderr.write(`[trace-queue] flush error: ${err?.message}\n`)
604
- throw err
605
- } finally {
606
- q.flushPromise = null
607
- // Drain any events that landed in the queue while this flush ran.
608
- if (q.pending.length > 0) _scheduleFlush(db, q)
609
- }
610
- })()
611
- return q.flushPromise
612
- }
613
-
614
- function _scheduleFlush(db, q) {
615
- if (q.timer) return
616
- q.timer = setTimeout(async () => {
617
- q.timer = null
618
- _flushQueue(db, q).catch(err =>
619
- process.stderr.write(`[trace-queue] flush error: ${err?.message}\n`)
620
- )
621
- }, TRACE_QUEUE_FLUSH_MS)
622
- q.timer.unref?.()
623
- }
624
-
625
- // ---------------------------------------------------------------------------
626
- // Exit drain — flush pending trace events before process exit.
627
- // Issue 4: timer is unref()'d so it won't prevent exit; register drain handlers.
628
- // ---------------------------------------------------------------------------
629
-
630
- const _registeredExitDbs = new WeakSet()
631
-
632
- export function registerTraceExitDrain(db) {
633
- if (_registeredExitDbs.has(db)) return
634
- _registeredExitDbs.add(db)
635
-
636
- async function drainOnExit() {
637
- const q = _traceQueues.get(db)
638
- if (!q || q.pending.length === 0) return
639
- try {
640
- if (q.timer) { clearTimeout(q.timer); q.timer = null }
641
- if (q.flushPromise) await q.flushPromise.catch(() => {})
642
- if (q.pending.length > 0) await _insertTraceEventsDirect(db, q.pending.splice(0).flatMap(w => w.events))
643
- } catch (e) {
644
- process.stderr.write(`[trace-queue] exit drain failed: ${e?.message}\n`)
645
- }
646
- }
647
-
648
- process.on('exit', () => {
649
- const q = _traceQueues.get(db)
650
- if (q?.pending.length) process.stderr.write(`[trace-queue] exit with ${q.pending.length} unflushed events\n`)
651
- })
652
-
653
- process.on('SIGTERM', async () => { await drainOnExit(); process.exit(0) })
654
-
655
- process.once('beforeExit', drainOnExit)
656
- }
657
-
658
- /**
659
- * Enqueue events for async batched insert. Returns immediately; flush happens
660
- * within TRACE_QUEUE_FLUSH_MS or when TRACE_QUEUE_MAX_ROWS is reached.
661
- * Callers that need a synchronous result should use insertTraceEvents directly.
662
- */
663
- export function enqueueTraceEvents(db, events) {
664
- if (!Array.isArray(events) || events.length === 0) return
665
- const q = _getQueue(db)
666
- q.pending.push({ events: [...events], attempts: 0 })
667
- // Row cap counts pending EVENTS, not wrappers — a single wrapper with
668
- // >TRACE_QUEUE_MAX_ROWS events would otherwise sit until the timer.
669
- const pendingEvents = q.pending.reduce((n, w) => n + w.events.length, 0)
670
- if (pendingEvents >= TRACE_QUEUE_MAX_ROWS) {
671
- // Flush immediately when row cap reached — don't wait for timer.
672
- if (q.timer) { clearTimeout(q.timer); q.timer = null }
673
- _flushQueue(db, q).catch(err =>
674
- process.stderr.write(`[trace-queue] flush error: ${err?.message}\n`)
675
- )
676
- } else {
677
- _scheduleFlush(db, q)
678
- }
679
- }
680
-
681
- // Renamed internal: direct DB insert without queuing (used by queue flusher and
682
- // the existing intra-request multi-row path where immediate persistence matters).
683
- async function _insertTraceEventsDirect(db, events) {
684
- return insertTraceEvents(db, events)
685
- }
686
-
687
- export async function insertTraceEvents(db, events) {
688
- if (!Array.isArray(events) || events.length === 0) return { inserted: 0 }
689
-
690
- const valuePlaceholders = []
691
- const params = []
692
- let p = 1
693
-
694
- for (const ev of events) {
695
- let ts = ev.ts
696
- if (typeof ts === 'string') ts = Date.parse(ts)
697
- ts = Number(ts)
698
- if (!Number.isFinite(ts)) ts = Date.now()
699
-
700
- const payload = ev.payload != null ? ev.payload : {}
701
-
702
- const cols = [
703
- ts,
704
- ev.session_id ?? null,
705
- ev.iteration != null ? Number(ev.iteration) : null,
706
- String(ev.kind ?? 'unknown'),
707
- ev.role ?? null,
708
- ev.model ?? null,
709
- ev.tool_name ?? null,
710
- ev.tool_ms != null ? Number(ev.tool_ms) : null,
711
- ev.input_tokens != null ? Number(ev.input_tokens) : null,
712
- ev.output_tokens != null ? Number(ev.output_tokens) : null,
713
- ev.cached_tokens != null ? Number(ev.cached_tokens) : null,
714
- ev.cache_write_tokens != null ? Number(ev.cache_write_tokens) : null,
715
- ev.duration_ms != null ? Number(ev.duration_ms) : null,
716
- ev.error_message ?? null,
717
- typeof payload === 'string' ? payload : JSON.stringify(payload),
718
- ev.parent_span_id != null ? Number(ev.parent_span_id) : null,
719
- ev.entry_id != null ? Number(ev.entry_id) : null,
720
- ]
721
- valuePlaceholders.push(`(${cols.map(() => `$${p++}`).join(', ')})`)
722
- params.push(...cols)
723
- }
724
-
725
- const sql = `INSERT INTO trace_events (${TRACE_COLS.join(', ')}) VALUES ${valuePlaceholders.join(', ')}`
726
- await db.query(sql, params)
727
- return { inserted: events.length }
728
- }