mixdog 0.9.2 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. package/package.json +8 -3
  2. package/scripts/anthropic-maxtokens-test.mjs +119 -0
  3. package/scripts/bench/lead-review-tasks-r3.json +20 -0
  4. package/scripts/bench/lead-review-tasks.json +20 -0
  5. package/scripts/bench/r4-mixed-tasks.json +20 -0
  6. package/scripts/bench/review-tasks.json +20 -0
  7. package/scripts/bench/round-codex.json +114 -0
  8. package/scripts/bench/round-mixdog-lead-r3.json +269 -0
  9. package/scripts/bench/round-mixdog-lead.json +269 -0
  10. package/scripts/bench/round-mixdog.json +126 -0
  11. package/scripts/bench/round-r10-bigsample.json +679 -0
  12. package/scripts/bench/round-r11-codexalign.json +257 -0
  13. package/scripts/bench/round-r4-codex.json +114 -0
  14. package/scripts/bench/round-r4-mixed.json +225 -0
  15. package/scripts/bench/round-r5-gpt-lead.json +259 -0
  16. package/scripts/bench/round-r6-codex.json +114 -0
  17. package/scripts/bench/round-r6-solo.json +257 -0
  18. package/scripts/bench/round-r7-full.json +254 -0
  19. package/scripts/bench/round-r8-fulldefault.json +255 -0
  20. package/scripts/bench-run.mjs +215 -29
  21. package/scripts/build-tui.mjs +13 -1
  22. package/scripts/explore-bench.mjs +124 -0
  23. package/scripts/freevar-smoke.mjs +95 -0
  24. package/scripts/hook-bus-test.mjs +191 -0
  25. package/scripts/internal-comms-bench.mjs +1 -0
  26. package/scripts/internal-comms-smoke.mjs +10 -9
  27. package/scripts/mouse-probe.mjs +45 -0
  28. package/scripts/output-style-bench.mjs +13 -6
  29. package/scripts/output-style-smoke.mjs +4 -4
  30. package/scripts/path-suffix-test.mjs +57 -0
  31. package/scripts/provider-toolcall-test.mjs +7 -3
  32. package/scripts/recall-bench.mjs +207 -0
  33. package/scripts/recall-usecase-cases.json +18 -0
  34. package/scripts/recall-usecase-probe.json +6 -0
  35. package/scripts/session-bench.mjs +152 -6
  36. package/scripts/tool-smoke.mjs +30 -67
  37. package/scripts/tui-render-smoke.mjs +90 -0
  38. package/scripts/webhook-smoke.mjs +208 -0
  39. package/src/agents/debugger/AGENT.md +5 -2
  40. package/src/agents/heavy-worker/AGENT.md +21 -11
  41. package/src/agents/maintainer/AGENT.md +4 -0
  42. package/src/agents/reviewer/AGENT.md +3 -2
  43. package/src/agents/worker/AGENT.md +21 -11
  44. package/src/lib/rules-builder.cjs +4 -0
  45. package/src/mixdog-session-runtime.mjs +933 -3731
  46. package/src/output-styles/default.md +34 -9
  47. package/src/output-styles/{oneline.md → extreme-minimal.md} +5 -4
  48. package/src/output-styles/minimal.md +4 -1
  49. package/src/output-styles/simple.md +22 -7
  50. package/src/repl.mjs +5 -5
  51. package/src/rules/agent/00-common.md +2 -0
  52. package/src/rules/agent/30-explorer.md +8 -11
  53. package/src/rules/lead/lead-brief.md +12 -0
  54. package/src/rules/lead/lead-tool.md +2 -9
  55. package/src/rules/shared/01-tool.md +11 -5
  56. package/src/runtime/agent/orchestrator/agent-runtime/agent-loop-policy.mjs +25 -0
  57. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +100 -23
  58. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +6 -15
  59. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +362 -0
  60. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +410 -0
  61. package/src/runtime/agent/orchestrator/agent-trace.mjs +16 -735
  62. package/src/runtime/agent/orchestrator/config.mjs +69 -2
  63. package/src/runtime/agent/orchestrator/context/collect.mjs +51 -0
  64. package/src/runtime/agent/orchestrator/mcp/client.mjs +6 -2
  65. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +63 -21
  66. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +93 -0
  67. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +209 -0
  68. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +489 -0
  69. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +97 -1343
  70. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +607 -0
  71. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +78 -10
  72. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +1 -13
  73. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +81 -0
  74. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +248 -0
  75. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +303 -0
  76. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +505 -0
  77. package/src/runtime/agent/orchestrator/providers/gemini.mjs +44 -1014
  78. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +18 -4
  79. package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +32 -0
  80. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +86 -11
  81. package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +348 -0
  82. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +54 -20
  83. package/src/runtime/agent/orchestrator/providers/openai-codex-model.mjs +108 -0
  84. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +19 -12
  85. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +58 -0
  86. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +368 -0
  87. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +760 -0
  88. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +41 -1142
  89. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +732 -0
  90. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +193 -0
  91. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +303 -2119
  92. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +140 -995
  93. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +227 -0
  94. package/src/runtime/agent/orchestrator/providers/openai-ws-events.mjs +67 -0
  95. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +436 -0
  96. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +1105 -0
  97. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +2 -1
  98. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +38 -12
  99. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +7 -8
  100. package/src/runtime/agent/orchestrator/session/compact/budget.mjs +288 -0
  101. package/src/runtime/agent/orchestrator/session/compact/constants.mjs +85 -0
  102. package/src/runtime/agent/orchestrator/session/compact/engine.mjs +749 -0
  103. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +82 -0
  104. package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +315 -0
  105. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +643 -0
  106. package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +326 -0
  107. package/src/runtime/agent/orchestrator/session/compact.mjs +40 -2282
  108. package/src/runtime/agent/orchestrator/session/loop/compact-debug.mjs +28 -0
  109. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +274 -0
  110. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +61 -0
  111. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +38 -0
  112. package/src/runtime/agent/orchestrator/session/loop/env.mjs +14 -0
  113. package/src/runtime/agent/orchestrator/session/loop/hidden-agents.mjs +21 -0
  114. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +47 -0
  115. package/src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs +182 -0
  116. package/src/runtime/agent/orchestrator/session/loop/steering-ladder.mjs +173 -0
  117. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +63 -0
  118. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +100 -0
  119. package/src/runtime/agent/orchestrator/session/loop/termination.mjs +58 -0
  120. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +52 -0
  121. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +239 -0
  122. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +218 -0
  123. package/src/runtime/agent/orchestrator/session/loop/transcript-repair.mjs +101 -0
  124. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +35 -0
  125. package/src/runtime/agent/orchestrator/session/loop.mjs +409 -1304
  126. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +471 -0
  127. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +230 -0
  128. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +235 -0
  129. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +149 -0
  130. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +155 -0
  131. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +406 -0
  132. package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +80 -0
  133. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +303 -0
  134. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +210 -0
  135. package/src/runtime/agent/orchestrator/session/manager.mjs +226 -2114
  136. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +189 -0
  137. package/src/runtime/agent/orchestrator/session/store.mjs +74 -179
  138. package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -3
  139. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +70 -20
  140. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +22 -2
  141. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +33 -42
  142. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +241 -0
  143. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +1 -1
  144. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +40 -0
  145. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +42 -2
  146. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +1 -1
  147. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +11 -4
  148. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +29 -0
  149. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +8 -0
  150. package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +126 -0
  151. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +81 -87
  152. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-paths.mjs +161 -0
  153. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-process.mjs +108 -0
  154. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +78 -304
  155. package/src/runtime/agent/orchestrator/tools/builtin.mjs +11 -6
  156. package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +303 -0
  157. package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +43 -0
  158. package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +382 -0
  159. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +551 -0
  160. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +295 -0
  161. package/src/runtime/agent/orchestrator/tools/code-graph/graph-model.mjs +158 -0
  162. package/src/runtime/agent/orchestrator/tools/code-graph/keyword-match.mjs +82 -0
  163. package/src/runtime/agent/orchestrator/tools/code-graph/lang-predicates.mjs +128 -0
  164. package/src/runtime/agent/orchestrator/tools/code-graph/memory-cache.mjs +66 -0
  165. package/src/runtime/agent/orchestrator/tools/code-graph/project-root.mjs +44 -0
  166. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1080 -0
  167. package/src/runtime/agent/orchestrator/tools/code-graph/source-access.mjs +81 -0
  168. package/src/runtime/agent/orchestrator/tools/code-graph/span.mjs +19 -0
  169. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +280 -0
  170. package/src/runtime/agent/orchestrator/tools/code-graph/text-columns.mjs +45 -0
  171. package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.mjs +347 -0
  172. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +6 -6
  173. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +36 -4277
  174. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +6 -3
  175. package/src/runtime/agent/orchestrator/tools/patch/constants.mjs +9 -0
  176. package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +171 -0
  177. package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +471 -0
  178. package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +436 -0
  179. package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +342 -0
  180. package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +359 -0
  181. package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +340 -0
  182. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +643 -0
  183. package/src/runtime/agent/orchestrator/tools/patch.mjs +36 -2959
  184. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +1 -23
  185. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +10 -74
  186. package/src/runtime/agent/orchestrator/tools/shell-powershell.mjs +77 -0
  187. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +2 -4
  188. package/src/runtime/agent/orchestrator/tools/shell-state.mjs +154 -0
  189. package/src/runtime/channels/backends/discord-access.mjs +32 -0
  190. package/src/runtime/channels/backends/discord-attachments.mjs +65 -0
  191. package/src/runtime/channels/backends/discord-gateway.mjs +233 -0
  192. package/src/runtime/channels/backends/discord.mjs +12 -292
  193. package/src/runtime/channels/index.mjs +241 -894
  194. package/src/runtime/channels/lib/backend-dispatch.mjs +44 -0
  195. package/src/runtime/channels/lib/boot-profile.mjs +23 -0
  196. package/src/runtime/channels/lib/crash-log.mjs +106 -0
  197. package/src/runtime/channels/lib/event-pipeline.mjs +18 -1
  198. package/src/runtime/channels/lib/event-queue.mjs +63 -4
  199. package/src/runtime/channels/lib/inbound-routing.mjs +111 -0
  200. package/src/runtime/channels/lib/index-drop-trace.mjs +72 -0
  201. package/src/runtime/channels/lib/output-forwarder.mjs +9 -1
  202. package/src/runtime/channels/lib/owner-heartbeat.mjs +75 -0
  203. package/src/runtime/channels/lib/parent-bridge.mjs +88 -0
  204. package/src/runtime/channels/lib/runtime-paths.mjs +14 -4
  205. package/src/runtime/channels/lib/session-discovery.mjs +56 -4
  206. package/src/runtime/channels/lib/telegram-format.mjs +19 -22
  207. package/src/runtime/channels/lib/tool-dispatch.mjs +158 -0
  208. package/src/runtime/channels/lib/tool-format.mjs +1 -1
  209. package/src/runtime/channels/lib/transcript-discovery.mjs +4 -4
  210. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +6 -3
  211. package/src/runtime/channels/lib/voice-transcription.mjs +179 -0
  212. package/src/runtime/channels/lib/webhook/deliveries.mjs +312 -0
  213. package/src/runtime/channels/lib/webhook/log.mjs +42 -0
  214. package/src/runtime/channels/lib/webhook/ngrok.mjs +181 -0
  215. package/src/runtime/channels/lib/webhook/signature.mjs +60 -0
  216. package/src/runtime/channels/lib/webhook.mjs +36 -570
  217. package/src/runtime/channels/lib/whisper-language.mjs +42 -0
  218. package/src/runtime/channels/tool-defs.mjs +11 -130
  219. package/src/runtime/memory/index.mjs +258 -2050
  220. package/src/runtime/memory/lib/core-memory-store.mjs +351 -1
  221. package/src/runtime/memory/lib/cycle-llm-adapters.mjs +58 -0
  222. package/src/runtime/memory/lib/cycle-scheduler.mjs +497 -0
  223. package/src/runtime/memory/lib/cycle-signatures.mjs +34 -0
  224. package/src/runtime/memory/lib/embedding-warmup.mjs +58 -0
  225. package/src/runtime/memory/lib/http-wire.mjs +57 -0
  226. package/src/runtime/memory/lib/memory-config-flags.mjs +91 -0
  227. package/src/runtime/memory/lib/memory-cycle.mjs +1 -1
  228. package/src/runtime/memory/lib/memory-cycle2-gate.mjs +515 -0
  229. package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +324 -0
  230. package/src/runtime/memory/lib/memory-cycle2-shared.mjs +18 -0
  231. package/src/runtime/memory/lib/memory-cycle2.mjs +72 -837
  232. package/src/runtime/memory/lib/memory-embed.mjs +149 -0
  233. package/src/runtime/memory/lib/memory-process-lock.mjs +162 -0
  234. package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +24 -0
  235. package/src/runtime/memory/lib/memory-recall-store.mjs +22 -2
  236. package/src/runtime/memory/lib/memory-retrievers.mjs +8 -0
  237. package/src/runtime/memory/lib/memory.mjs +20 -0
  238. package/src/runtime/memory/lib/pg/supervisor.mjs +1 -1
  239. package/src/runtime/memory/lib/promotion-fingerprint.mjs +50 -0
  240. package/src/runtime/memory/lib/query-handlers.mjs +780 -0
  241. package/src/runtime/memory/lib/recall-format.mjs +238 -0
  242. package/src/runtime/memory/lib/runtime-fetcher.mjs +8 -3
  243. package/src/runtime/memory/lib/transcript-ingest.mjs +425 -0
  244. package/src/runtime/memory/tool-defs.mjs +6 -14
  245. package/src/runtime/search/lib/http-fetch.mjs +274 -0
  246. package/src/runtime/search/lib/ssrf-guard.mjs +333 -0
  247. package/src/runtime/search/lib/web-tools.mjs +24 -602
  248. package/src/runtime/shared/abort-controller.mjs +1 -1
  249. package/src/runtime/shared/atomic-file.mjs +26 -1
  250. package/src/runtime/shared/background-tasks.mjs +2 -3
  251. package/src/runtime/shared/buffered-appender.mjs +149 -0
  252. package/src/runtime/shared/launcher-control.mjs +2 -2
  253. package/src/runtime/shared/task-notification-envelope.mjs +98 -0
  254. package/src/runtime/shared/tool-execution-contract.mjs +2 -2
  255. package/src/runtime/shared/tool-primitives.mjs +308 -0
  256. package/src/runtime/shared/tool-result-summary.mjs +515 -0
  257. package/src/runtime/shared/tool-surface.mjs +80 -898
  258. package/src/runtime/shared/transcript-writer.mjs +52 -2
  259. package/src/runtime/shared/update-checker.mjs +7 -4
  260. package/src/session-runtime/config-helpers.mjs +291 -0
  261. package/src/session-runtime/config-lifecycle.mjs +232 -0
  262. package/src/session-runtime/cwd-plugins.mjs +226 -0
  263. package/src/session-runtime/effort.mjs +128 -0
  264. package/src/session-runtime/fs-utils.mjs +10 -0
  265. package/src/session-runtime/mcp-glue.mjs +177 -0
  266. package/src/session-runtime/model-capabilities.mjs +130 -0
  267. package/src/session-runtime/model-recency.mjs +111 -0
  268. package/src/session-runtime/native-search.mjs +247 -0
  269. package/src/session-runtime/output-styles.mjs +126 -0
  270. package/src/session-runtime/plugin-mcp.mjs +114 -0
  271. package/src/session-runtime/prewarm.mjs +142 -0
  272. package/src/session-runtime/provider-models.mjs +278 -0
  273. package/src/session-runtime/provider-usage.mjs +120 -0
  274. package/src/session-runtime/quick-model-rows.mjs +170 -0
  275. package/src/session-runtime/quick-search-models.mjs +46 -0
  276. package/src/session-runtime/session-hooks.mjs +93 -0
  277. package/src/session-runtime/session-text.mjs +100 -0
  278. package/src/session-runtime/settings-api.mjs +319 -0
  279. package/src/session-runtime/statusline-route.mjs +35 -0
  280. package/src/session-runtime/tool-catalog.mjs +720 -0
  281. package/src/session-runtime/tool-defs.mjs +84 -0
  282. package/src/session-runtime/warmup-schedulers.mjs +201 -0
  283. package/src/session-runtime/workflow.mjs +358 -0
  284. package/src/standalone/agent-tool/helpers.mjs +237 -0
  285. package/src/standalone/agent-tool/notify.mjs +107 -0
  286. package/src/standalone/agent-tool/provider-init.mjs +143 -0
  287. package/src/standalone/agent-tool/render.mjs +152 -0
  288. package/src/standalone/agent-tool/tool-def.mjs +55 -0
  289. package/src/standalone/agent-tool.mjs +155 -677
  290. package/src/standalone/channel-worker.mjs +7 -9
  291. package/src/standalone/explore-tool.mjs +40 -12
  292. package/src/standalone/hook-bus/config.mjs +207 -0
  293. package/src/standalone/hook-bus/constants.mjs +90 -0
  294. package/src/standalone/hook-bus/handlers.mjs +481 -0
  295. package/src/standalone/hook-bus/payload.mjs +31 -0
  296. package/src/standalone/hook-bus/rules.mjs +77 -0
  297. package/src/standalone/hook-bus.mjs +110 -746
  298. package/src/standalone/memory-runtime-proxy.mjs +7 -0
  299. package/src/standalone/opencode-go-login.mjs +125 -0
  300. package/src/standalone/provider-admin.mjs +15 -19
  301. package/src/standalone/usage-dashboard.mjs +3 -1
  302. package/src/tui/App.jsx +1163 -7571
  303. package/src/tui/app/app-format.mjs +206 -0
  304. package/src/tui/app/channel-pickers.mjs +510 -0
  305. package/src/tui/app/clipboard.mjs +67 -0
  306. package/src/tui/app/core-memory-picker.mjs +210 -0
  307. package/src/tui/app/extension-pickers.mjs +506 -0
  308. package/src/tui/app/input-parsers.mjs +193 -0
  309. package/src/tui/app/maintenance-pickers.mjs +324 -0
  310. package/src/tui/app/model-options.mjs +330 -0
  311. package/src/tui/app/model-picker.mjs +365 -0
  312. package/src/tui/app/onboarding-steps.mjs +400 -0
  313. package/src/tui/app/project-picker.mjs +247 -0
  314. package/src/tui/app/provider-setup-picker.mjs +580 -0
  315. package/src/tui/app/resume-picker.mjs +55 -0
  316. package/src/tui/app/route-pickers.mjs +419 -0
  317. package/src/tui/app/settings-picker.mjs +490 -0
  318. package/src/tui/app/slash-commands.mjs +101 -0
  319. package/src/tui/app/slash-dispatch.mjs +427 -0
  320. package/src/tui/app/text-layout.mjs +46 -0
  321. package/src/tui/app/theme-effort-pickers.mjs +154 -0
  322. package/src/tui/app/transcript-window.mjs +671 -0
  323. package/src/tui/app/use-mouse-input.mjs +460 -0
  324. package/src/tui/app/use-prompt-handlers.mjs +310 -0
  325. package/src/tui/app/use-transcript-scroll.mjs +510 -0
  326. package/src/tui/app/use-transcript-window.mjs +589 -0
  327. package/src/tui/components/ConfirmBar.jsx +1 -1
  328. package/src/tui/components/Picker.jsx +32 -4
  329. package/src/tui/components/PromptInput.jsx +259 -80
  330. package/src/tui/components/SlashCommandPalette.jsx +8 -1
  331. package/src/tui/components/StatusLine.jsx +63 -12
  332. package/src/tui/components/TextEntryPanel.jsx +11 -0
  333. package/src/tui/components/ToolExecution.jsx +56 -588
  334. package/src/tui/components/TranscriptItem.jsx +105 -0
  335. package/src/tui/components/UsagePanel.jsx +18 -4
  336. package/src/tui/components/prompt-input/edit-helpers.mjs +72 -0
  337. package/src/tui/components/prompt-input/voice-indicator.mjs +39 -0
  338. package/src/tui/components/tool-execution/ResultBody.jsx +56 -0
  339. package/src/tui/components/tool-execution/surface-detail.mjs +405 -0
  340. package/src/tui/components/tool-execution/text-format.mjs +161 -0
  341. package/src/tui/components/tool-output-format.mjs +2 -2
  342. package/src/tui/display-width.mjs +20 -3
  343. package/src/tui/dist/index.mjs +18034 -17188
  344. package/src/tui/engine/agent-envelope.mjs +296 -0
  345. package/src/tui/engine/agent-job-feed.mjs +133 -0
  346. package/src/tui/engine/boot-profile.mjs +21 -0
  347. package/src/tui/engine/labels.mjs +67 -0
  348. package/src/tui/engine/notice-text.mjs +112 -0
  349. package/src/tui/engine/notification-plan.mjs +76 -0
  350. package/src/tui/engine/queue-helpers.mjs +161 -0
  351. package/src/tui/engine/render-timing.mjs +17 -0
  352. package/src/tui/engine/session-stats.mjs +46 -0
  353. package/src/tui/engine/tool-approval.mjs +94 -0
  354. package/src/tui/engine/tool-call-fields.mjs +23 -0
  355. package/src/tui/engine/tool-card-results.mjs +234 -0
  356. package/src/tui/engine/tool-result-status.mjs +135 -0
  357. package/src/tui/engine/tool-result-text.mjs +126 -0
  358. package/src/tui/engine.mjs +405 -1385
  359. package/src/tui/figures.mjs +5 -0
  360. package/src/tui/index.jsx +105 -0
  361. package/src/tui/input-editing.mjs +60 -10
  362. package/src/tui/keyboard-protocol.mjs +2 -2
  363. package/src/tui/lib/voice-recorder.mjs +35 -19
  364. package/src/tui/markdown/format-token.mjs +11 -9
  365. package/src/tui/paste-attachments.mjs +38 -0
  366. package/src/tui/statusline-ansi-bridge.mjs +11 -3
  367. package/src/tui/theme.mjs +6 -0
  368. package/src/tui/themes/base.mjs +2 -2
  369. package/src/tui/themes/kanagawa.mjs +4 -4
  370. package/src/tui/themes/teal.mjs +4 -5
  371. package/src/tui/themes/utils.mjs +1 -1
  372. package/src/ui/statusline-agents.mjs +213 -0
  373. package/src/ui/statusline-format.mjs +146 -0
  374. package/src/ui/statusline-segments.mjs +148 -0
  375. package/src/ui/statusline.mjs +77 -462
  376. package/src/ui/tool-card.mjs +0 -1
  377. package/src/vendor/statusline/bin/statusline-route.mjs +15 -2
  378. package/src/workflows/default/WORKFLOW.md +16 -9
  379. package/src/workflows/sequential/WORKFLOW.md +16 -11
  380. package/src/workflows/solo/WORKFLOW.md +5 -1
  381. package/vendor/ink/build/display-width.js +19 -3
  382. package/vendor/ink/build/ink.js +103 -6
  383. package/vendor/ink/build/log-update.js +17 -3
  384. package/vendor/ink/build/wrap-text.js +125 -0
  385. package/scripts/_test-folder-dialog.mjs +0 -30
  386. package/scripts/fix-brief-fn.mjs +0 -35
  387. package/scripts/fix-format-tool-surface.mjs +0 -24
  388. package/scripts/fix-tool-exec-visible.mjs +0 -42
  389. package/scripts/patch-agent-brief.mjs +0 -48
  390. package/scripts/patch-app.mjs +0 -21
  391. package/scripts/patch-app2.mjs +0 -18
  392. package/scripts/patch-dist-brief.mjs +0 -96
  393. package/scripts/patch-tool-exec.mjs +0 -70
  394. package/src/examples/schedules/SCHEDULE.example.md +0 -32
  395. package/src/examples/webhooks/WEBHOOK.example.md +0 -40
  396. package/src/runtime/agent/orchestrator/session/manager.reactive-persist.test.mjs +0 -107
  397. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.test.mjs +0 -143
  398. package/src/runtime/agent/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -285
  399. package/src/runtime/agent/orchestrator/tools/builtin/open-config-tool.mjs +0 -26
  400. package/src/runtime/shared/channel-notification-routing.test.mjs +0 -45
  401. package/src/runtime/shared/tool-execution-contract.test.mjs +0 -183
  402. package/src/standalone/agent-task-status.test.mjs +0 -76
  403. package/src/tui/components/tool-output-format.test.mjs +0 -399
  404. package/src/tui/display-width.test.mjs +0 -35
  405. package/src/tui/engine-runtime-notification.test.mjs +0 -115
  406. package/src/tui/engine-tool-result-text.test.mjs +0 -75
  407. package/src/tui/markdown/format-token.test.mjs +0 -354
  408. package/src/tui/markdown/render-ansi.test.mjs +0 -108
  409. package/src/tui/markdown/stream-fence.test.mjs +0 -26
  410. package/src/tui/markdown/streaming-markdown.test.mjs +0 -70
  411. package/src/tui/prompt-history-store.test.mjs +0 -52
  412. package/src/tui/statusline-ansi-bridge.test.mjs +0 -159
  413. package/src/tui/transcript-tool-failures.test.mjs +0 -111
  414. package/src/ui/markdown.test.mjs +0 -70
  415. package/src/ui/statusline-context-label.test.mjs +0 -15
  416. package/src/vendor/statusline/bin/statusline-lib.mjs +0 -186
  417. package/src/vendor/statusline/bin/statusline-route.test.mjs +0 -80
@@ -0,0 +1,303 @@
1
+ // Graph build orchestration: worker-thread async build (buildCodeGraphAsync),
2
+ // synchronous _buildCodeGraph (imported by the prewarm worker), and the
3
+ // prewarm entry points. Owns the in-flight single-flight map. Extracted
4
+ // verbatim from code-graph.mjs.
5
+ //
6
+ // SELF-REFERENTIAL DYNAMIC IMPORT: buildCodeGraphAsync spawns the prewarm
7
+ // worker via `new URL('../code-graph-prewarm-worker.mjs', import.meta.url)`.
8
+ // That worker in turn does `import { _buildCodeGraph } from '../code-graph.mjs'`
9
+ // (the facade), which re-exports _buildCodeGraph from THIS module. The worker
10
+ // path is unchanged relative to the facade, so it keeps importing the facade —
11
+ // no module imports its own path. The URL below is resolved against THIS
12
+ // module's dir (tools/code-graph/), so it walks one level up to reach the
13
+ // worker at tools/.
14
+ import { resolve as pathResolve } from 'node:path';
15
+ import { Worker } from 'node:worker_threads';
16
+ import { acquire as acquireChildSpawnSlot } from '../../../../shared/child-spawn-gate.mjs';
17
+ import {
18
+ canonicalGraphCwd as _canonicalGraphCwd,
19
+ codeGraphCache as _codeGraphCache,
20
+ consumeCodeGraphDirtyPaths as _consumeCodeGraphDirtyPaths,
21
+ getCodeGraphGen as _getCodeGraphGen,
22
+ } from '../code-graph-state.mjs';
23
+ import {
24
+ CODE_GRAPH_TTL_MS,
25
+ CODE_GRAPH_MAX_FILES,
26
+ CODE_GRAPH_WORKER_TIMEOUT_MS,
27
+ SYMBOL_SCHEMA_VERSION,
28
+ } from './constants.mjs';
29
+ import {
30
+ _computeGraphSignature,
31
+ _deserializeGraph,
32
+ _attachGraphRuntimeCaches,
33
+ } from './graph-model.mjs';
34
+ import { _touchCodeGraphCache, _setCodeGraphCache } from './memory-cache.mjs';
35
+ import {
36
+ ensureDiskCodeGraphLoaded,
37
+ getDiskCodeGraphEntry,
38
+ _setDiskCodeGraphEntry,
39
+ } from './disk-cache.mjs';
40
+ import {
41
+ _runGraphManifest,
42
+ _runGraphWalk,
43
+ _runGraphFiles,
44
+ _fileInfoFromRustRecord,
45
+ _reuseFileInfo,
46
+ } from './graph-binary.mjs';
47
+ import { _lookupCandidateNodes } from './symbol-index.mjs';
48
+ import { _findDirProjectRoot } from './project-root.mjs';
49
+
50
+ // In-flight async builds keyed by canonical graphCwd. Same-cwd parallel
51
+ // callers (prewarm + cache-miss + multiple find_symbol) share one Worker
52
+ // spawn instead of fanning out. Entry removed on settle so the next caller
53
+ // after a failure can retry.
54
+ const _inflightAsyncBuilds = new Map();
55
+
56
+ export function prewarmCodeGraph(cwd) {
57
+ if (!cwd) return;
58
+ // Reuse the buildCodeGraphAsync single-flight path. Fire-and-forget.
59
+ buildCodeGraphAsync(cwd).catch(() => { /* best-effort */ });
60
+ }
61
+
62
+ export function prewarmCodeGraphSymbols(cwd, symbols, { language = null } = {}) {
63
+ if (!cwd) return;
64
+ const wanted = (Array.isArray(symbols) ? symbols : [symbols])
65
+ .map((s) => String(s || '').trim())
66
+ .filter(Boolean);
67
+ buildCodeGraphAsync(cwd).then((graph) => {
68
+ if (!graph) return;
69
+ for (const symbol of wanted) {
70
+ try { _lookupCandidateNodes(graph, symbol, language); } catch { /* best-effort */ }
71
+ }
72
+ }).catch(() => { /* best-effort */ });
73
+ }
74
+
75
+ export function prewarmCodeGraphIfProject(cwd) {
76
+ if (!cwd) return false;
77
+ const root = _findDirProjectRoot(cwd);
78
+ if (!root) return false;
79
+ prewarmCodeGraph(root);
80
+ return true;
81
+ }
82
+
83
+ export async function buildCodeGraphAsync(cwd, signal = null) {
84
+ if (signal?.aborted) throw new Error('aborted');
85
+ const graphCwd = _canonicalGraphCwd(cwd);
86
+ const cached = _codeGraphCache.get(graphCwd);
87
+ if (cached?.graph && Date.now() - cached.ts < CODE_GRAPH_TTL_MS) {
88
+ _touchCodeGraphCache(graphCwd);
89
+ return cached.graph;
90
+ }
91
+ const existing = _inflightAsyncBuilds.get(graphCwd);
92
+ if (existing) {
93
+ if (!signal) return existing;
94
+ let onAbort = null;
95
+ const abortP = new Promise((_, reject) => {
96
+ onAbort = () => reject(new Error('aborted'));
97
+ signal.addEventListener('abort', onAbort, { once: true });
98
+ });
99
+ const cleanup = () => {
100
+ if (onAbort) {
101
+ try { signal.removeEventListener('abort', onAbort); } catch {}
102
+ onAbort = null;
103
+ }
104
+ };
105
+ return Promise.race([existing, abortP]).then(
106
+ (v) => { cleanup(); return v; },
107
+ (e) => { cleanup(); throw e; },
108
+ );
109
+ }
110
+ const _genAtStart = _getCodeGraphGen(graphCwd);
111
+ let _worker = null;
112
+ const promise = new Promise((resolve, reject) => {
113
+ let settled = false;
114
+ let timeout = null;
115
+ let _onSignalAbort = null;
116
+ let _releaseSlot = null;
117
+ const settle = (val) => {
118
+ if (settled) return;
119
+ settled = true;
120
+ if (timeout) { clearTimeout(timeout); timeout = null; }
121
+ if (_onSignalAbort && signal) {
122
+ try { signal.removeEventListener('abort', _onSignalAbort); } catch {}
123
+ _onSignalAbort = null;
124
+ }
125
+ if (_releaseSlot) { try { _releaseSlot(); } catch {} _releaseSlot = null; }
126
+ _inflightAsyncBuilds.delete(graphCwd);
127
+ if (val instanceof Error) reject(val);
128
+ else resolve(val);
129
+ };
130
+ acquireChildSpawnSlot(signal || null).then((release) => {
131
+ _releaseSlot = release;
132
+ if (settled) { release(); _releaseSlot = null; return; }
133
+ const workerUrl = new URL('../code-graph-prewarm-worker.mjs', import.meta.url);
134
+ _worker = new Worker(workerUrl, {
135
+ workerData: { cwd },
136
+ execArgv: [],
137
+ });
138
+ const w = _worker;
139
+ timeout = setTimeout(() => {
140
+ try { _worker?.terminate(); } catch {}
141
+ settle(new Error(`code-graph worker timed out after ${CODE_GRAPH_WORKER_TIMEOUT_MS}ms for cwd=${graphCwd}`));
142
+ }, CODE_GRAPH_WORKER_TIMEOUT_MS);
143
+ timeout.unref?.();
144
+ if (signal) {
145
+ _onSignalAbort = () => {
146
+ try { _worker?.terminate(); } catch {}
147
+ settle(new Error('aborted'));
148
+ };
149
+ signal.addEventListener('abort', _onSignalAbort, { once: true });
150
+ }
151
+ w.once('message', (msg) => {
152
+ try {
153
+ if (msg && msg.ok && msg.graph && typeof msg.signature === 'string') {
154
+ if (_getCodeGraphGen(graphCwd) === _genAtStart) {
155
+ _setCodeGraphCache(graphCwd, { ts: Date.now(), signature: msg.signature, graph: msg.graph });
156
+ _setDiskCodeGraphEntry(graphCwd, msg.graph);
157
+ }
158
+ settle(msg.graph);
159
+ } else {
160
+ settle(new Error('code-graph prewarm worker failed'));
161
+ }
162
+ } catch (e) { settle(e instanceof Error ? e : new Error(String(e))); }
163
+ });
164
+ w.once('error', (e) => settle(e instanceof Error ? e : new Error(String(e))));
165
+ }, (e) => settle(e instanceof Error ? e : new Error(String(e))));
166
+ });
167
+ _inflightAsyncBuilds.set(graphCwd, promise);
168
+ return promise;
169
+ }
170
+
171
+ /**
172
+ * Internal — exported (via the facade) solely for code-graph-prewarm-worker.mjs
173
+ * to import. NOT part of the public API. External callers should use
174
+ * buildCodeGraphAsync (worker-thread isolated) or the code_graph / find_symbol
175
+ * tools, never this synchronous form on the main event loop.
176
+ */
177
+ export async function _buildCodeGraph(cwd) {
178
+ const now = Date.now();
179
+ let _tp = performance.now();
180
+ const _trace = (label) => { if (process.env.MIXDOG_GRAPH_TRACE) { const n = performance.now(); process.stderr.write(`[cg-trace] ${label}=${(n - _tp).toFixed(0)}ms\n`); _tp = n; } };
181
+ const graphCwd = _canonicalGraphCwd(cwd);
182
+ const absRoot = graphCwd;
183
+ const _genAtStart = _getCodeGraphGen(graphCwd);
184
+ const cached = _codeGraphCache.get(graphCwd);
185
+ let previousGraph = cached?.graph || null;
186
+ _consumeCodeGraphDirtyPaths(graphCwd);
187
+
188
+ // 1. Change-detect via Rust --manifest (fp/rel/size only, no parse).
189
+ const manifest = await _runGraphManifest(absRoot);
190
+ const signature = _computeGraphSignature(manifest);
191
+ _trace('manifest+sig');
192
+ const truncated = manifest.length > CODE_GRAPH_MAX_FILES;
193
+ const indexed = truncated ? manifest.slice(0, CODE_GRAPH_MAX_FILES) : manifest;
194
+
195
+ // 2. Memory cache hit.
196
+ if (cached && cached.signature === signature && now - cached.ts < CODE_GRAPH_TTL_MS) {
197
+ _touchCodeGraphCache(graphCwd);
198
+ return cached.graph;
199
+ }
200
+
201
+ // 3. Disk cache hit.
202
+ ensureDiskCodeGraphLoaded(now);
203
+ const diskEntry = getDiskCodeGraphEntry(graphCwd);
204
+ if (diskEntry?.signature === signature) {
205
+ const graph = _deserializeGraph(graphCwd, diskEntry);
206
+ if (graph) {
207
+ if (_getCodeGraphGen(graphCwd) === _genAtStart) {
208
+ _setCodeGraphCache(graphCwd, { ts: now, signature, graph });
209
+ }
210
+ return graph;
211
+ }
212
+ }
213
+ if (!previousGraph && diskEntry) previousGraph = _deserializeGraph(graphCwd, diskEntry);
214
+ if (previousGraph && previousGraph.schemaVersion !== SYMBOL_SCHEMA_VERSION) {
215
+ previousGraph = null;
216
+ }
217
+
218
+ // 4. Build fileInfos. Reuse unchanged nodes by fp; parse the rest in Rust.
219
+ const reusable = [];
220
+ const freshRels = [];
221
+ for (const meta of indexed) {
222
+ const previousNode = previousGraph?.nodes?.get(meta.rel) || null;
223
+ if (previousNode && previousNode.fingerprint === meta.fp) {
224
+ reusable.push(_reuseFileInfo(previousNode, previousGraph, absRoot));
225
+ } else {
226
+ freshRels.push(meta.rel);
227
+ }
228
+ }
229
+ let fileInfos;
230
+ if (freshRels.length === 0) {
231
+ fileInfos = reusable;
232
+ } else if (reusable.length > 0 && freshRels.length <= 256) {
233
+ const recs = await _runGraphFiles(absRoot, freshRels, reusable);
234
+ const reusedByRel = new Map(reusable.map((info) => [info.rel, info]));
235
+ const freshSet = new Set(freshRels);
236
+ fileInfos = [...reusable];
237
+ for (const rec of recs) {
238
+ if (freshSet.has(rec.rel)) {
239
+ fileInfos.push(_fileInfoFromRustRecord(rec, absRoot));
240
+ } else {
241
+ const reusedInfo = reusedByRel.get(rec.rel);
242
+ if (!reusedInfo) continue;
243
+ const resolved = Array.isArray(rec.resolvedImports)
244
+ ? rec.resolvedImports.filter((v) => typeof v === 'string')
245
+ : [];
246
+ reusedInfo.resolvedImports = resolved;
247
+ if (Array.isArray(rec.importedBy)) {
248
+ reusedInfo.importedBy = rec.importedBy.filter((v) => typeof v === 'string');
249
+ }
250
+ }
251
+ }
252
+ } else {
253
+ let recs = await _runGraphWalk(absRoot);
254
+ if (recs.length > CODE_GRAPH_MAX_FILES) recs = recs.slice(0, CODE_GRAPH_MAX_FILES);
255
+ fileInfos = recs.map((rec) => _fileInfoFromRustRecord(rec, absRoot));
256
+ }
257
+ _trace('walk+parse');
258
+ const nodes = new Map();
259
+ const reverse = new Map();
260
+ for (const info of fileInfos) {
261
+ const resolvedImportsRel = Array.isArray(info.resolvedImports) ? info.resolvedImports : [];
262
+ const importedBy = Array.isArray(info.importedBy) ? info.importedBy : [];
263
+ const node = {
264
+ abs: info.abs,
265
+ rel: info.rel,
266
+ lang: info.lang,
267
+ fingerprint: info.fingerprint,
268
+ rawImports: info.rawImports,
269
+ resolvedImportsRel,
270
+ resolvedImports: resolvedImportsRel.map((rel) => pathResolve(absRoot, rel)),
271
+ importedBy,
272
+ packageName: info.packageName,
273
+ namespaceName: info.namespaceName,
274
+ goPackageName: info.goPackageName,
275
+ topLevelTypes: info.topLevelTypes,
276
+ tokenSymbols: info.tokenSymbols,
277
+ symbols: Array.isArray(info.symbols) ? info.symbols : [],
278
+ };
279
+ nodes.set(info.rel, node);
280
+ for (const rel of resolvedImportsRel) {
281
+ if (!reverse.has(rel)) reverse.set(rel, new Set());
282
+ reverse.get(rel).add(node.rel);
283
+ }
284
+ }
285
+ _trace('assemble');
286
+ const graph = _attachGraphRuntimeCaches({ cwd: graphCwd, nodes, reverse, schemaVersion: SYMBOL_SCHEMA_VERSION, builtAt: now, signature });
287
+ graph.truncated = Boolean(truncated);
288
+ for (const info of fileInfos) {
289
+ if (typeof info.sourceText === 'string') {
290
+ graph._sourceTextCache.set(info.rel, {
291
+ fingerprint: info.fingerprint || '',
292
+ text: info.sourceText,
293
+ });
294
+ }
295
+ }
296
+ graph._symbolTokenIndexDirty = true;
297
+ if (_getCodeGraphGen(graphCwd) === _genAtStart) {
298
+ _setCodeGraphCache(graphCwd, { ts: now, signature, graph });
299
+ _setDiskCodeGraphEntry(graphCwd, graph);
300
+ _trace('cache+disk');
301
+ }
302
+ return graph;
303
+ }
@@ -0,0 +1,43 @@
1
+ // Code-graph tuning constants + cache-file name/regex patterns. Extracted
2
+ // verbatim from code-graph.mjs so the build/cache/search modules can share
3
+ // one source of truth. Behavior-identical: same env vars, same defaults.
4
+
5
+ export const CODE_GRAPH_TTL_MS = 30_000;
6
+ export const CODE_GRAPH_MAX_FILES = 10_000;
7
+ export const CODE_GRAPH_WORKER_TIMEOUT_MS = 120_000;
8
+ // Timeout for the native mixdog-graph binary child process (spawned per graph build).
9
+ export const CODE_GRAPH_BINARY_TIMEOUT_MS = Math.max(1000, Number(process.env.MIXDOG_CODE_GRAPH_BINARY_TIMEOUT_MS) || 20000);
10
+ // Legacy single-file cache. Kept as a constant for the one-shot migration
11
+ // path; new writes go into the per-cwd directory layout below.
12
+ export const CODE_GRAPH_DISK_FILE = 'code-graph-cache.json';
13
+ // Per-cwd cache: <data>/code-graph-cache/manifest.json + <hash>.json per
14
+ // indexed root. Avoids the unbounded single-file blob (observed >50 MB on
15
+ // long-running workspaces) that had to be JSON.parsed in full on every
16
+ // fresh process startup.
17
+ export const CODE_GRAPH_DISK_DIR = 'code-graph-cache';
18
+ export const CODE_GRAPH_DISK_MAX_ENTRIES = 24;
19
+ export const CODE_GRAPH_DISK_MAX_BYTES = Math.max(
20
+ 1 * 1024 * 1024,
21
+ Math.floor((Number(process.env.MIXDOG_CODE_GRAPH_CACHE_MAX_MB) || 80) * 1024 * 1024),
22
+ );
23
+ // Reap writeFileAtomicSync debris only after this age (see _sweepCodeGraphCacheDir).
24
+ // Younger .tmp files may belong to an in-flight persist still holding the sibling .lock;
25
+ // DEFAULT_LOCK_TIMEOUT_MS is 8s — 120s is a safe margin for large graph JSON writes.
26
+ export const ORPHAN_TMP_MIN_AGE_MS = 120_000;
27
+ export const RE_CACHE_TMP = /^\.[0-9a-f]{16}\.json\.[0-9a-f]{24}\.tmp$/i;
28
+ export const RE_MANIFEST_TMP = /^\.manifest\.json\.[0-9a-f]{24}\.tmp$/i;
29
+ export const RE_CACHE_LOCK = /^[0-9a-f]{16}\.json\.lock$/i;
30
+ export const CODE_GRAPH_MEMORY_MAX_ENTRIES = Math.max(
31
+ 1,
32
+ Math.floor(Number(process.env.MIXDOG_CODE_GRAPH_MEMORY_MAX_ENTRIES) || 6),
33
+ );
34
+ export const CODE_GRAPH_MEMORY_MAX_SOURCE_BYTES = Math.max(
35
+ 1 * 1024 * 1024,
36
+ Math.floor((Number(process.env.MIXDOG_CODE_GRAPH_MEMORY_MAX_MB) || 48) * 1024 * 1024),
37
+ );
38
+ // Bump when the per-symbol record SHAPE changes (e.g. adding endLine). The
39
+ // version is folded into the cache signature so graphs built by an older
40
+ // binary/schema (symbols without a finite endLine) no longer match and are
41
+ // rebuilt instead of served — otherwise a stale cache would feed endLine-less
42
+ // symbols and silently defeat body-span containment in _nearestEnclosingSymbol.
43
+ export const SYMBOL_SCHEMA_VERSION = 'sym-range-v3-rustimports';