mixdog 0.7.17 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (836) hide show
  1. package/README.md +37 -331
  2. package/package.json +67 -99
  3. package/scripts/boot-smoke.mjs +94 -0
  4. package/scripts/build-tui.mjs +52 -0
  5. package/scripts/compact-smoke.mjs +199 -0
  6. package/scripts/lead-workflow-smoke.mjs +598 -0
  7. package/scripts/live-worker-smoke.mjs +239 -0
  8. package/scripts/output-style-smoke.mjs +101 -0
  9. package/scripts/smoke-loop-report.mjs +221 -0
  10. package/scripts/smoke-loop.mjs +201 -0
  11. package/scripts/smoke.mjs +113 -0
  12. package/scripts/tool-failures.mjs +143 -0
  13. package/scripts/tool-smoke.mjs +456 -0
  14. package/src/agents/debugger/AGENT.md +3 -0
  15. package/src/agents/debugger/agent.json +6 -0
  16. package/src/agents/explore/AGENT.md +4 -0
  17. package/src/agents/explore/agent.json +6 -0
  18. package/src/agents/heavy-worker/AGENT.md +3 -0
  19. package/src/agents/heavy-worker/agent.json +6 -0
  20. package/src/agents/maintainer/AGENT.md +3 -0
  21. package/src/agents/maintainer/agent.json +6 -0
  22. package/src/agents/reviewer/AGENT.md +3 -0
  23. package/src/agents/reviewer/agent.json +6 -0
  24. package/src/agents/scheduler-task.md +3 -0
  25. package/src/agents/web-researcher/AGENT.md +3 -0
  26. package/src/agents/web-researcher/agent.json +6 -0
  27. package/src/agents/webhook-handler.md +3 -0
  28. package/src/agents/worker/AGENT.md +3 -0
  29. package/src/agents/worker/agent.json +6 -0
  30. package/src/app.mjs +90 -0
  31. package/src/cli.mjs +11 -0
  32. package/src/defaults/hidden-roles.json +72 -0
  33. package/src/defaults/mixdog-config.template.json +15 -0
  34. package/src/hooks/lib/permission-evaluator.cjs +488 -0
  35. package/src/hooks/lib/settings-loader.cjs +112 -0
  36. package/src/lib/keychain-cjs.cjs +332 -0
  37. package/src/lib/plugin-paths.cjs +28 -0
  38. package/src/lib/rules-builder.cjs +315 -0
  39. package/src/mixdog-session-runtime.mjs +3704 -0
  40. package/src/output-styles/default.md +38 -0
  41. package/src/output-styles/extreme-simple.md +17 -0
  42. package/src/output-styles/simple.md +17 -0
  43. package/src/repl.mjs +322 -0
  44. package/src/rules/bridge/00-common.md +5 -0
  45. package/src/rules/bridge/20-skip-protocol.md +11 -0
  46. package/src/rules/bridge/30-explorer.md +4 -0
  47. package/src/rules/bridge/40-cycle1-agent.md +28 -0
  48. package/src/rules/bridge/41-cycle2-agent.md +59 -0
  49. package/src/rules/lead/00-tool-lead.md +5 -0
  50. package/src/rules/lead/01-general.md +5 -0
  51. package/src/rules/lead/02-channels.md +3 -0
  52. package/src/rules/lead/04-workflow.md +12 -0
  53. package/src/rules/shared/00-language.md +3 -0
  54. package/src/rules/shared/01-tool.md +3 -0
  55. package/src/runtime/agent/orchestrator/bridge-trace.mjs +814 -0
  56. package/src/runtime/agent/orchestrator/cache-mtime.mjs +60 -0
  57. package/src/runtime/agent/orchestrator/config.mjs +446 -0
  58. package/src/runtime/agent/orchestrator/context/collect.mjs +796 -0
  59. package/src/runtime/agent/orchestrator/dispatch-persist.mjs +417 -0
  60. package/src/runtime/agent/orchestrator/internal-roles.mjs +188 -0
  61. package/src/runtime/agent/orchestrator/internal-tools.mjs +88 -0
  62. package/src/runtime/agent/orchestrator/mcp/client.mjs +345 -0
  63. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2104 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +784 -0
  65. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +341 -0
  66. package/src/runtime/agent/orchestrator/providers/gemini.mjs +1679 -0
  67. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +959 -0
  68. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +213 -0
  69. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +38 -0
  70. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +471 -0
  71. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +615 -0
  72. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +808 -0
  73. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +1719 -0
  74. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2587 -0
  75. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +1953 -0
  76. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +136 -0
  77. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +317 -0
  78. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +109 -0
  79. package/src/runtime/agent/orchestrator/providers/registry.mjs +247 -0
  80. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +332 -0
  81. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +11 -0
  82. package/src/runtime/agent/orchestrator/providers/trace-utils.mjs +50 -0
  83. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
  84. package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +318 -0
  85. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +367 -0
  86. package/src/runtime/agent/orchestrator/session/compact.mjs +882 -0
  87. package/src/runtime/agent/orchestrator/session/context-utils.mjs +233 -0
  88. package/src/runtime/agent/orchestrator/session/loop.mjs +2320 -0
  89. package/src/runtime/agent/orchestrator/session/manager.mjs +2960 -0
  90. package/src/runtime/agent/orchestrator/session/result-classification.mjs +65 -0
  91. package/src/runtime/agent/orchestrator/session/store.mjs +663 -0
  92. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +166 -0
  93. package/src/runtime/agent/orchestrator/smart-bridge/bridge-llm.mjs +339 -0
  94. package/src/runtime/agent/orchestrator/smart-bridge/cache-strategy.mjs +419 -0
  95. package/src/runtime/agent/orchestrator/stall-policy.mjs +227 -0
  96. package/src/runtime/agent/orchestrator/tool-loop-guard.mjs +235 -0
  97. package/src/runtime/agent/orchestrator/tools/bash-session.mjs +723 -0
  98. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +389 -0
  99. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +637 -0
  100. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +165 -0
  101. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +104 -0
  102. package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +194 -0
  103. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +596 -0
  104. package/src/runtime/agent/orchestrator/tools/builtin/native-edit-runner.mjs +110 -0
  105. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +153 -0
  106. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
  107. package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +189 -0
  108. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +731 -0
  109. package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +168 -0
  110. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
  111. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +465 -0
  112. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +160 -0
  113. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +982 -0
  114. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1087 -0
  115. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +231 -0
  116. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +223 -0
  117. package/src/runtime/agent/orchestrator/tools/builtin.mjs +478 -0
  118. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
  119. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4102 -0
  120. package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +323 -0
  121. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +154 -0
  122. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +26 -0
  123. package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +143 -0
  124. package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +18 -0
  125. package/src/runtime/agent/orchestrator/tools/patch.mjs +2772 -0
  126. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +114 -0
  127. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +880 -0
  128. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +312 -0
  129. package/src/runtime/channels/backends/discord.mjs +781 -0
  130. package/src/runtime/channels/data/voice-runtime-manifest.json +138 -0
  131. package/src/runtime/channels/index.mjs +3309 -0
  132. package/src/runtime/channels/lib/config.mjs +285 -0
  133. package/src/runtime/channels/lib/drop-trace.mjs +71 -0
  134. package/src/runtime/channels/lib/event-pipeline.mjs +81 -0
  135. package/src/runtime/channels/lib/holidays.mjs +138 -0
  136. package/src/runtime/channels/lib/hook-pipe-server.mjs +671 -0
  137. package/src/runtime/channels/lib/output-forwarder.mjs +765 -0
  138. package/src/runtime/channels/lib/runtime-paths.mjs +497 -0
  139. package/src/runtime/channels/lib/scheduler.mjs +710 -0
  140. package/src/runtime/channels/lib/session-discovery.mjs +102 -0
  141. package/src/runtime/channels/lib/state-file.mjs +68 -0
  142. package/src/runtime/channels/lib/status-snapshot.mjs +224 -0
  143. package/src/runtime/channels/lib/tool-format.mjs +124 -0
  144. package/src/runtime/channels/lib/transcript-discovery.mjs +195 -0
  145. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +734 -0
  146. package/src/runtime/channels/lib/webhook.mjs +1288 -0
  147. package/src/runtime/channels/tool-defs.mjs +177 -0
  148. package/src/runtime/lib/keychain-cjs.cjs +289 -0
  149. package/src/runtime/memory/data/runtime-manifest.json +40 -0
  150. package/src/runtime/memory/index.mjs +3600 -0
  151. package/src/runtime/memory/lib/core-memory-store.mjs +336 -0
  152. package/src/runtime/memory/lib/embedding-provider.mjs +275 -0
  153. package/src/runtime/memory/lib/embedding-worker.mjs +331 -0
  154. package/src/runtime/memory/lib/memory-cycle-requests.mjs +276 -0
  155. package/src/runtime/memory/lib/memory-cycle1.mjs +783 -0
  156. package/src/runtime/memory/lib/memory-cycle2.mjs +1389 -0
  157. package/src/runtime/memory/lib/memory-cycle3.mjs +646 -0
  158. package/src/runtime/memory/lib/memory-embed.mjs +300 -0
  159. package/src/runtime/memory/lib/memory-ops-policy.mjs +149 -0
  160. package/src/runtime/memory/lib/memory-recall-store.mjs +644 -0
  161. package/src/runtime/memory/lib/memory.mjs +418 -0
  162. package/src/runtime/memory/lib/pg/adapter.mjs +314 -0
  163. package/src/runtime/memory/lib/pg/process.mjs +366 -0
  164. package/src/runtime/memory/lib/pg/supervisor.mjs +495 -0
  165. package/src/runtime/memory/lib/runtime-fetcher.mjs +464 -0
  166. package/src/runtime/memory/lib/trace-store.mjs +734 -0
  167. package/src/runtime/memory/tool-defs.mjs +79 -0
  168. package/src/runtime/search/index.mjs +925 -0
  169. package/src/runtime/search/lib/config.mjs +61 -0
  170. package/src/runtime/search/lib/web-tools.mjs +1278 -0
  171. package/src/runtime/search/tool-defs.mjs +64 -0
  172. package/src/runtime/shared/atomic-file.mjs +435 -0
  173. package/src/runtime/shared/background-tasks.mjs +376 -0
  174. package/src/runtime/shared/child-guardian.mjs +98 -0
  175. package/src/runtime/shared/config.mjs +393 -0
  176. package/src/runtime/shared/err-text.mjs +121 -0
  177. package/src/runtime/shared/launcher-control.mjs +259 -0
  178. package/src/runtime/shared/llm/cost.mjs +66 -0
  179. package/src/runtime/shared/llm/http-agent.mjs +129 -0
  180. package/src/runtime/shared/open-url.mjs +37 -0
  181. package/src/runtime/shared/plugin-paths.mjs +25 -0
  182. package/src/runtime/shared/process-shutdown.mjs +147 -0
  183. package/src/runtime/shared/schedules-store.mjs +70 -0
  184. package/src/runtime/shared/tool-execution-contract.mjs +104 -0
  185. package/src/runtime/shared/tool-surface.mjs +950 -0
  186. package/src/runtime/shared/user-cwd.mjs +221 -0
  187. package/src/runtime/shared/user-data-guard.mjs +232 -0
  188. package/src/runtime/shared/workspace-router.mjs +259 -0
  189. package/src/standalone/bridge-tool.mjs +1414 -0
  190. package/src/standalone/channel-admin.mjs +366 -0
  191. package/src/standalone/channel-worker-preload.cjs +3 -0
  192. package/src/standalone/channel-worker.mjs +353 -0
  193. package/src/standalone/explore-tool.mjs +233 -0
  194. package/src/standalone/hook-bus.mjs +246 -0
  195. package/src/standalone/plugin-admin.mjs +247 -0
  196. package/src/standalone/provider-admin.mjs +338 -0
  197. package/src/standalone/seeds.mjs +94 -0
  198. package/src/standalone/usage-dashboard.mjs +510 -0
  199. package/src/tui/App.jsx +5438 -0
  200. package/src/tui/components/AnsiText.jsx +199 -0
  201. package/src/tui/components/ContextPanel.jsx +217 -0
  202. package/src/tui/components/Markdown.jsx +205 -0
  203. package/src/tui/components/MarkdownTable.jsx +204 -0
  204. package/src/tui/components/Message.jsx +103 -0
  205. package/src/tui/components/Picker.jsx +317 -0
  206. package/src/tui/components/PromptInput.jsx +584 -0
  207. package/src/tui/components/QueuedCommands.jsx +47 -0
  208. package/src/tui/components/SlashCommandPalette.jsx +114 -0
  209. package/src/tui/components/Spinner.jsx +317 -0
  210. package/src/tui/components/StatusLine.jsx +87 -0
  211. package/src/tui/components/TextEntryPanel.jsx +323 -0
  212. package/src/tui/components/ToolExecution.jsx +772 -0
  213. package/src/tui/components/TurnDone.jsx +78 -0
  214. package/src/tui/components/UsagePanel.jsx +331 -0
  215. package/src/tui/dist/index.mjs +12359 -0
  216. package/src/tui/engine.mjs +2410 -0
  217. package/src/tui/figures.mjs +50 -0
  218. package/src/tui/hooks/useEngine.mjs +16 -0
  219. package/src/tui/index.jsx +254 -0
  220. package/src/tui/input-editing.mjs +242 -0
  221. package/src/tui/markdown/format-token.mjs +194 -0
  222. package/src/tui/paste-attachments.mjs +198 -0
  223. package/src/tui/runtime/shared/process-shutdown.mjs +1 -0
  224. package/src/tui/spinner-verbs.mjs +45 -0
  225. package/src/tui/theme.mjs +67 -0
  226. package/src/tui/time-format.mjs +53 -0
  227. package/src/ui/ansi.mjs +115 -0
  228. package/src/ui/markdown.mjs +195 -0
  229. package/src/ui/statusline.mjs +730 -0
  230. package/src/ui/tool-card.mjs +101 -0
  231. package/src/vendor/statusline/bin/statusline-lib.mjs +805 -0
  232. package/src/vendor/statusline/bin/statusline-route.mjs +596 -0
  233. package/src/vendor/statusline/scripts/lib/gateway-settings.mjs +285 -0
  234. package/src/vendor/statusline/src/gateway/claude-current.mjs +320 -0
  235. package/src/vendor/statusline/src/gateway/route-meta.mjs +753 -0
  236. package/src/vendor/statusline/src/gateway/session-routes.mjs +244 -0
  237. package/src/workflows/default/WORKFLOW.md +7 -0
  238. package/src/workflows/default/workflow.json +14 -0
  239. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  240. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  241. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  242. package/vendor/ink/build/colorize.d.ts +3 -0
  243. package/vendor/ink/build/colorize.js +48 -0
  244. package/vendor/ink/build/colorize.js.map +1 -0
  245. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  246. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  247. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  248. package/vendor/ink/build/components/AnimationContext.d.ts +9 -0
  249. package/vendor/ink/build/components/AnimationContext.js +13 -0
  250. package/vendor/ink/build/components/AnimationContext.js.map +1 -0
  251. package/vendor/ink/build/components/App.d.ts +24 -0
  252. package/vendor/ink/build/components/App.js +554 -0
  253. package/vendor/ink/build/components/App.js.map +1 -0
  254. package/vendor/ink/build/components/AppContext.d.ts +80 -0
  255. package/vendor/ink/build/components/AppContext.js +25 -0
  256. package/vendor/ink/build/components/AppContext.js.map +1 -0
  257. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  258. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  259. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  260. package/vendor/ink/build/components/Box.d.ts +130 -0
  261. package/vendor/ink/build/components/Box.js +34 -0
  262. package/vendor/ink/build/components/Box.js.map +1 -0
  263. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  264. package/vendor/ink/build/components/CursorContext.js +8 -0
  265. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  266. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  267. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  268. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  269. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  270. package/vendor/ink/build/components/ErrorOverview.js +90 -0
  271. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  272. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  273. package/vendor/ink/build/components/FocusContext.js +17 -0
  274. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  275. package/vendor/ink/build/components/Newline.d.ts +13 -0
  276. package/vendor/ink/build/components/Newline.js +8 -0
  277. package/vendor/ink/build/components/Newline.js.map +1 -0
  278. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  279. package/vendor/ink/build/components/Spacer.js +11 -0
  280. package/vendor/ink/build/components/Spacer.js.map +1 -0
  281. package/vendor/ink/build/components/Static.d.ts +24 -0
  282. package/vendor/ink/build/components/Static.js +28 -0
  283. package/vendor/ink/build/components/Static.js.map +1 -0
  284. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  285. package/vendor/ink/build/components/StderrContext.js +13 -0
  286. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  287. package/vendor/ink/build/components/StdinContext.d.ts +28 -0
  288. package/vendor/ink/build/components/StdinContext.js +20 -0
  289. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  290. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  291. package/vendor/ink/build/components/StdoutContext.js +13 -0
  292. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  293. package/vendor/ink/build/components/Text.d.ts +55 -0
  294. package/vendor/ink/build/components/Text.js +50 -0
  295. package/vendor/ink/build/components/Text.js.map +1 -0
  296. package/vendor/ink/build/components/Transform.d.ts +16 -0
  297. package/vendor/ink/build/components/Transform.js +15 -0
  298. package/vendor/ink/build/components/Transform.js.map +1 -0
  299. package/vendor/ink/build/cursor-helpers.d.ts +39 -0
  300. package/vendor/ink/build/cursor-helpers.js +62 -0
  301. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  302. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  303. package/vendor/ink/build/devtools-window-polyfill.js +68 -0
  304. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  305. package/vendor/ink/build/devtools.d.ts +1 -0
  306. package/vendor/ink/build/devtools.js +36 -0
  307. package/vendor/ink/build/devtools.js.map +1 -0
  308. package/vendor/ink/build/dom.d.ts +62 -0
  309. package/vendor/ink/build/dom.js +143 -0
  310. package/vendor/ink/build/dom.js.map +1 -0
  311. package/vendor/ink/build/get-max-width.d.ts +3 -0
  312. package/vendor/ink/build/get-max-width.js +10 -0
  313. package/vendor/ink/build/get-max-width.js.map +1 -0
  314. package/vendor/ink/build/hooks/use-animation.d.ts +49 -0
  315. package/vendor/ink/build/hooks/use-animation.js +87 -0
  316. package/vendor/ink/build/hooks/use-animation.js.map +1 -0
  317. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  318. package/vendor/ink/build/hooks/use-app.js +8 -0
  319. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  320. package/vendor/ink/build/hooks/use-box-metrics.d.ts +59 -0
  321. package/vendor/ink/build/hooks/use-box-metrics.js +81 -0
  322. package/vendor/ink/build/hooks/use-box-metrics.js.map +1 -0
  323. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  324. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  325. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  326. package/vendor/ink/build/hooks/use-focus-manager.d.ts +43 -0
  327. package/vendor/ink/build/hooks/use-focus-manager.js +18 -0
  328. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  329. package/vendor/ink/build/hooks/use-focus.d.ts +30 -0
  330. package/vendor/ink/build/hooks/use-focus.js +43 -0
  331. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  332. package/vendor/ink/build/hooks/use-input.d.ts +132 -0
  333. package/vendor/ink/build/hooks/use-input.js +126 -0
  334. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  335. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +6 -0
  336. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +12 -0
  337. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  338. package/vendor/ink/build/hooks/use-paste.d.ts +35 -0
  339. package/vendor/ink/build/hooks/use-paste.js +62 -0
  340. package/vendor/ink/build/hooks/use-paste.js.map +1 -0
  341. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  342. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  343. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  344. package/vendor/ink/build/hooks/use-stdin.d.ts +7 -0
  345. package/vendor/ink/build/hooks/use-stdin.js +9 -0
  346. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  347. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  348. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  349. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  350. package/vendor/ink/build/hooks/use-window-size.d.ts +18 -0
  351. package/vendor/ink/build/hooks/use-window-size.js +22 -0
  352. package/vendor/ink/build/hooks/use-window-size.js.map +1 -0
  353. package/vendor/ink/build/index.d.ts +42 -0
  354. package/vendor/ink/build/index.js +24 -0
  355. package/vendor/ink/build/index.js.map +1 -0
  356. package/vendor/ink/build/ink.d.ts +146 -0
  357. package/vendor/ink/build/ink.js +1022 -0
  358. package/vendor/ink/build/ink.js.map +1 -0
  359. package/vendor/ink/build/input-parser.d.ts +10 -0
  360. package/vendor/ink/build/input-parser.js +194 -0
  361. package/vendor/ink/build/input-parser.js.map +1 -0
  362. package/vendor/ink/build/instances.d.ts +3 -0
  363. package/vendor/ink/build/instances.js +8 -0
  364. package/vendor/ink/build/instances.js.map +1 -0
  365. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  366. package/vendor/ink/build/kitty-keyboard.js +32 -0
  367. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  368. package/vendor/ink/build/log-update.d.ts +20 -0
  369. package/vendor/ink/build/log-update.js +261 -0
  370. package/vendor/ink/build/log-update.js.map +1 -0
  371. package/vendor/ink/build/measure-element.d.ts +20 -0
  372. package/vendor/ink/build/measure-element.js +13 -0
  373. package/vendor/ink/build/measure-element.js.map +1 -0
  374. package/vendor/ink/build/measure-text.d.ts +6 -0
  375. package/vendor/ink/build/measure-text.js +21 -0
  376. package/vendor/ink/build/measure-text.js.map +1 -0
  377. package/vendor/ink/build/output.d.ts +35 -0
  378. package/vendor/ink/build/output.js +328 -0
  379. package/vendor/ink/build/output.js.map +1 -0
  380. package/vendor/ink/build/parse-keypress.d.ts +20 -0
  381. package/vendor/ink/build/parse-keypress.js +495 -0
  382. package/vendor/ink/build/parse-keypress.js.map +1 -0
  383. package/vendor/ink/build/reconciler.d.ts +4 -0
  384. package/vendor/ink/build/reconciler.js +306 -0
  385. package/vendor/ink/build/reconciler.js.map +1 -0
  386. package/vendor/ink/build/render-background.d.ts +4 -0
  387. package/vendor/ink/build/render-background.js +25 -0
  388. package/vendor/ink/build/render-background.js.map +1 -0
  389. package/vendor/ink/build/render-border.d.ts +4 -0
  390. package/vendor/ink/build/render-border.js +84 -0
  391. package/vendor/ink/build/render-border.js.map +1 -0
  392. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  393. package/vendor/ink/build/render-node-to-output.js +162 -0
  394. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  395. package/vendor/ink/build/render-to-string.d.ts +38 -0
  396. package/vendor/ink/build/render-to-string.js +116 -0
  397. package/vendor/ink/build/render-to-string.js.map +1 -0
  398. package/vendor/ink/build/render.d.ts +176 -0
  399. package/vendor/ink/build/render.js +71 -0
  400. package/vendor/ink/build/render.js.map +1 -0
  401. package/vendor/ink/build/renderer.d.ts +8 -0
  402. package/vendor/ink/build/renderer.js +64 -0
  403. package/vendor/ink/build/renderer.js.map +1 -0
  404. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  405. package/vendor/ink/build/sanitize-ansi.js +27 -0
  406. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  407. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  408. package/vendor/ink/build/squash-text-nodes.js +36 -0
  409. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  410. package/vendor/ink/build/styles.d.ts +302 -0
  411. package/vendor/ink/build/styles.js +303 -0
  412. package/vendor/ink/build/styles.js.map +1 -0
  413. package/vendor/ink/build/utils.d.ts +9 -0
  414. package/vendor/ink/build/utils.js +19 -0
  415. package/vendor/ink/build/utils.js.map +1 -0
  416. package/vendor/ink/build/wrap-text.d.ts +3 -0
  417. package/vendor/ink/build/wrap-text.js +38 -0
  418. package/vendor/ink/build/wrap-text.js.map +1 -0
  419. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  420. package/vendor/ink/build/write-synchronized.js +9 -0
  421. package/vendor/ink/build/write-synchronized.js.map +1 -0
  422. package/vendor/ink/license +10 -0
  423. package/vendor/ink/package.json +137 -0
  424. package/.claude-plugin/marketplace.json +0 -34
  425. package/.claude-plugin/plugin.json +0 -20
  426. package/.gitattributes +0 -34
  427. package/.mcp.json +0 -14
  428. package/ARCHITECTURE.md +0 -77
  429. package/CHANGELOG.md +0 -30
  430. package/CONTRIBUTING.md +0 -45
  431. package/DATA-FLOW.md +0 -79
  432. package/LICENSE +0 -21
  433. package/SECURITY.md +0 -138
  434. package/UNINSTALL.md +0 -112
  435. package/agents/maintenance.md +0 -5
  436. package/agents/memory-classification.md +0 -30
  437. package/agents/scheduler-task.md +0 -18
  438. package/agents/webhook-handler.md +0 -27
  439. package/agents/worker.md +0 -24
  440. package/bin/bridge +0 -133
  441. package/bin/statusline-launcher.mjs +0 -82
  442. package/bin/statusline-lib.mjs +0 -558
  443. package/bin/statusline.mjs +0 -615
  444. package/bun.lock +0 -927
  445. package/commands/config.md +0 -16
  446. package/commands/doctor.md +0 -13
  447. package/commands/setup.md +0 -17
  448. package/defaults/hidden-roles.json +0 -68
  449. package/defaults/memory-chunk-prompt.md +0 -63
  450. package/defaults/mixdog-config.template.json +0 -27
  451. package/defaults/user-workflow.json +0 -8
  452. package/defaults/user-workflow.md +0 -17
  453. package/hooks/hooks.json +0 -73
  454. package/hooks/lib/active-instance.cjs +0 -77
  455. package/hooks/lib/permission-evaluator.cjs +0 -411
  456. package/hooks/lib/permission-route.cjs +0 -63
  457. package/hooks/lib/settings-loader.cjs +0 -117
  458. package/hooks/post-tool-use.cjs +0 -84
  459. package/hooks/pre-mcp-sandbox.cjs +0 -158
  460. package/hooks/pre-tool-subagent.cjs +0 -258
  461. package/hooks/session-start.cjs +0 -1479
  462. package/hooks/shim-launcher.cjs +0 -65
  463. package/hooks/turn-timer.cjs +0 -82
  464. package/lib/claude-md-writer.cjs +0 -386
  465. package/lib/keychain-cjs.cjs +0 -290
  466. package/lib/plugin-paths.cjs +0 -69
  467. package/lib/rules-builder.cjs +0 -241
  468. package/native/README.md +0 -117
  469. package/native/prebuilt/linux-aarch64/mixdog-shim +0 -0
  470. package/native/prebuilt/linux-x86_64/mixdog-shim +0 -0
  471. package/native/prebuilt/macos-aarch64/mixdog-shim +0 -0
  472. package/native/prebuilt/macos-x86_64/mixdog-shim +0 -0
  473. package/native/prebuilt/windows-x86_64/mixdog-shim.exe +0 -0
  474. package/prompts/code-review.txt +0 -16
  475. package/prompts/security-audit.txt +0 -17
  476. package/rules/bridge/00-common.md +0 -39
  477. package/rules/bridge/20-skip-protocol.md +0 -18
  478. package/rules/bridge/30-explorer.md +0 -33
  479. package/rules/bridge/40-cycle1-agent.md +0 -52
  480. package/rules/bridge/41-cycle2-agent.md +0 -62
  481. package/rules/lead/00-tool-lead.md +0 -61
  482. package/rules/lead/01-general.md +0 -23
  483. package/rules/lead/02-channels.md +0 -49
  484. package/rules/lead/03-team.md +0 -27
  485. package/rules/lead/04-workflow.md +0 -20
  486. package/rules/shared/00-language.md +0 -14
  487. package/rules/shared/01-tool.md +0 -138
  488. package/scripts/bootstrap.mjs +0 -130
  489. package/scripts/bridge-unify-smoke.mjs +0 -308
  490. package/scripts/build-runtime-linux.sh +0 -348
  491. package/scripts/build-runtime-macos.sh +0 -217
  492. package/scripts/build-runtime-windows.ps1 +0 -242
  493. package/scripts/builtin-utils-smoke.mjs +0 -398
  494. package/scripts/bump.mjs +0 -80
  495. package/scripts/check-json.mjs +0 -45
  496. package/scripts/check-syntax-changed.mjs +0 -102
  497. package/scripts/check-syntax.mjs +0 -58
  498. package/scripts/code-graph-batch.test.mjs +0 -33
  499. package/scripts/config-preserve-smoke.mjs +0 -180
  500. package/scripts/doctor.mjs +0 -489
  501. package/scripts/edit-normalize-fuzz.mjs +0 -130
  502. package/scripts/edit-normalize-smoke.mjs +0 -401
  503. package/scripts/edit-operation-smoke.mjs +0 -369
  504. package/scripts/edit2-smoke.mjs +0 -63
  505. package/scripts/ensure-deps.mjs +0 -259
  506. package/scripts/fuzzy-e2e.mjs +0 -28
  507. package/scripts/fuzzy-smoke.mjs +0 -26
  508. package/scripts/generate-runtime-manifest.mjs +0 -166
  509. package/scripts/guard-smoke.mjs +0 -66
  510. package/scripts/hidden-role-schema-smoke.mjs +0 -162
  511. package/scripts/hook-routing-smoke.mjs +0 -29
  512. package/scripts/inject-input.ps1 +0 -204
  513. package/scripts/io-complex-smoke.mjs +0 -667
  514. package/scripts/io-explore-bench.mjs +0 -424
  515. package/scripts/io-guardrails-smoke.mjs +0 -205
  516. package/scripts/io-mini-bench-baseline.json +0 -11
  517. package/scripts/io-mini-bench.mjs +0 -216
  518. package/scripts/io-route-harness.mjs +0 -933
  519. package/scripts/io-telemetry-report.mjs +0 -691
  520. package/scripts/mutation-bench.mjs +0 -564
  521. package/scripts/mutation-io-smoke.mjs +0 -1097
  522. package/scripts/native-patch-bridge-smoke.mjs +0 -288
  523. package/scripts/native-patch-smoke.mjs +0 -304
  524. package/scripts/openai-oauth-catalog-smoke.mjs +0 -53
  525. package/scripts/patch-interior-context-smoke.mjs +0 -49
  526. package/scripts/patch-newline-utf8-smoke.mjs +0 -157
  527. package/scripts/perf-hook-smoke.mjs +0 -71
  528. package/scripts/permission-eval-smoke.mjs +0 -443
  529. package/scripts/prep-patch.mjs +0 -53
  530. package/scripts/prep-shim.mjs +0 -96
  531. package/scripts/provider-cache-smoke.mjs +0 -687
  532. package/scripts/report-runtime-health.mjs +0 -132
  533. package/scripts/resolve-bun.mjs +0 -60
  534. package/scripts/run-mcp.mjs +0 -1448
  535. package/scripts/salvage-v4a-shatter.test.mjs +0 -58
  536. package/scripts/scoped-cache-io-smoke.mjs +0 -103
  537. package/scripts/shell-policy-round3-smoke.mjs +0 -46
  538. package/scripts/smoke-runtime-negative.ps1 +0 -100
  539. package/scripts/smoke-runtime-negative.sh +0 -95
  540. package/scripts/stall-policy-smoke.mjs +0 -50
  541. package/scripts/start-memory-worker.mjs +0 -23
  542. package/scripts/statusline-launcher-smoke.mjs +0 -82
  543. package/scripts/stress-atomic-write.mjs +0 -1028
  544. package/scripts/test-fault-inject.mjs +0 -164
  545. package/scripts/test-large-file.mjs +0 -174
  546. package/scripts/tool-edge-smoke.mjs +0 -209
  547. package/scripts/uninstall.mjs +0 -201
  548. package/scripts/webhook-selfheal-smoke.mjs +0 -27
  549. package/scripts/write-overwrite-guard-smoke.mjs +0 -56
  550. package/server-main.mjs +0 -3109
  551. package/server.mjs +0 -468
  552. package/setup/config-merge.mjs +0 -246
  553. package/setup/install.mjs +0 -574
  554. package/setup/launch-core.mjs +0 -617
  555. package/setup/launch.mjs +0 -101
  556. package/setup/locate-claude.mjs +0 -56
  557. package/setup/mixdog-cli.mjs +0 -122
  558. package/setup/setup-server.mjs +0 -3305
  559. package/setup/setup.html +0 -3740
  560. package/setup/tui.mjs +0 -325
  561. package/skills/retro-skill-proposer/SKILL.md +0 -92
  562. package/skills/schedule-add/SKILL.md +0 -77
  563. package/skills/setup/SKILL.md +0 -356
  564. package/skills/webhook-add/SKILL.md +0 -81
  565. package/src/agent/bridge-stall-watchdog.mjs +0 -337
  566. package/src/agent/index.mjs +0 -2138
  567. package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +0 -1010
  568. package/src/agent/orchestrator/bridge-retry.mjs +0 -220
  569. package/src/agent/orchestrator/bridge-trace.mjs +0 -583
  570. package/src/agent/orchestrator/cache-mtime.mjs +0 -58
  571. package/src/agent/orchestrator/config.mjs +0 -405
  572. package/src/agent/orchestrator/context/collect.mjs +0 -651
  573. package/src/agent/orchestrator/dispatch-persist.mjs +0 -549
  574. package/src/agent/orchestrator/drain-registry.mjs +0 -50
  575. package/src/agent/orchestrator/explore-validator.mjs +0 -8
  576. package/src/agent/orchestrator/internal-roles.mjs +0 -118
  577. package/src/agent/orchestrator/internal-tools.mjs +0 -88
  578. package/src/agent/orchestrator/jobs.mjs +0 -116
  579. package/src/agent/orchestrator/mcp/client.mjs +0 -364
  580. package/src/agent/orchestrator/providers/anthropic-oauth.mjs +0 -1881
  581. package/src/agent/orchestrator/providers/anthropic.mjs +0 -594
  582. package/src/agent/orchestrator/providers/gemini.mjs +0 -1530
  583. package/src/agent/orchestrator/providers/grok-oauth.mjs +0 -779
  584. package/src/agent/orchestrator/providers/model-catalog.mjs +0 -374
  585. package/src/agent/orchestrator/providers/openai-compat-stream.mjs +0 -366
  586. package/src/agent/orchestrator/providers/openai-compat.mjs +0 -1511
  587. package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +0 -1891
  588. package/src/agent/orchestrator/providers/openai-oauth.mjs +0 -1456
  589. package/src/agent/orchestrator/providers/openai-ws.mjs +0 -127
  590. package/src/agent/orchestrator/providers/registry.mjs +0 -192
  591. package/src/agent/orchestrator/providers/retry-classifier.mjs +0 -325
  592. package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +0 -142
  593. package/src/agent/orchestrator/session/cache/read-cache.mjs +0 -319
  594. package/src/agent/orchestrator/session/cache/scoped-cache.mjs +0 -361
  595. package/src/agent/orchestrator/session/loop.mjs +0 -1478
  596. package/src/agent/orchestrator/session/manager.mjs +0 -1991
  597. package/src/agent/orchestrator/session/result-classification.mjs +0 -65
  598. package/src/agent/orchestrator/session/store.mjs +0 -632
  599. package/src/agent/orchestrator/session/stream-watchdog.mjs +0 -130
  600. package/src/agent/orchestrator/session/tool-result-offload.mjs +0 -166
  601. package/src/agent/orchestrator/session/trim.mjs +0 -491
  602. package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +0 -115
  603. package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +0 -331
  604. package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +0 -150
  605. package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +0 -228
  606. package/src/agent/orchestrator/smart-bridge/index.mjs +0 -215
  607. package/src/agent/orchestrator/smart-bridge/profiles.mjs +0 -37
  608. package/src/agent/orchestrator/smart-bridge/registry.mjs +0 -348
  609. package/src/agent/orchestrator/stall-policy.mjs +0 -201
  610. package/src/agent/orchestrator/tool-loop-guard.mjs +0 -75
  611. package/src/agent/orchestrator/tools/bash-session.mjs +0 -722
  612. package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +0 -455
  613. package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -480
  614. package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +0 -256
  615. package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +0 -58
  616. package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +0 -240
  617. package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +0 -113
  618. package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +0 -74
  619. package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +0 -242
  620. package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +0 -211
  621. package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +0 -1364
  622. package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +0 -126
  623. package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +0 -141
  624. package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +0 -194
  625. package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +0 -60
  626. package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +0 -168
  627. package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +0 -173
  628. package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +0 -48
  629. package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +0 -99
  630. package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +0 -193
  631. package/src/agent/orchestrator/tools/builtin/list-tool.mjs +0 -597
  632. package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +0 -110
  633. package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +0 -300
  634. package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +0 -152
  635. package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -118
  636. package/src/agent/orchestrator/tools/builtin/read-open.mjs +0 -190
  637. package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +0 -728
  638. package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +0 -173
  639. package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +0 -602
  640. package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +0 -196
  641. package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +0 -422
  642. package/src/agent/orchestrator/tools/builtin/search-builders.mjs +0 -158
  643. package/src/agent/orchestrator/tools/builtin/search-tool.mjs +0 -869
  644. package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +0 -962
  645. package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +0 -223
  646. package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +0 -206
  647. package/src/agent/orchestrator/tools/builtin/write-tool.mjs +0 -401
  648. package/src/agent/orchestrator/tools/builtin.mjs +0 -503
  649. package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +0 -24
  650. package/src/agent/orchestrator/tools/code-graph.mjs +0 -4095
  651. package/src/agent/orchestrator/tools/cwd-tool.mjs +0 -298
  652. package/src/agent/orchestrator/tools/destructive-warning.mjs +0 -323
  653. package/src/agent/orchestrator/tools/edit-normalize.mjs +0 -603
  654. package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +0 -154
  655. package/src/agent/orchestrator/tools/graph-manifest.json +0 -26
  656. package/src/agent/orchestrator/tools/host-input.mjs +0 -204
  657. package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +0 -143
  658. package/src/agent/orchestrator/tools/patch-manifest.json +0 -26
  659. package/src/agent/orchestrator/tools/patch-tool-defs.mjs +0 -20
  660. package/src/agent/orchestrator/tools/patch.mjs +0 -2754
  661. package/src/agent/orchestrator/tools/progress-message.mjs +0 -118
  662. package/src/agent/orchestrator/tools/shell-command.mjs +0 -865
  663. package/src/agent/orchestrator/tools/shell-policy-imports.mjs +0 -7
  664. package/src/agent/orchestrator/tools/shell-snapshot.mjs +0 -313
  665. package/src/agent/orchestrator/workflow-store.mjs +0 -93
  666. package/src/agent/tool-defs.mjs +0 -103
  667. package/src/channels/backends/discord.mjs +0 -784
  668. package/src/channels/data/voice-runtime-manifest.json +0 -138
  669. package/src/channels/index.mjs +0 -3268
  670. package/src/channels/lib/config.mjs +0 -292
  671. package/src/channels/lib/drop-trace.mjs +0 -71
  672. package/src/channels/lib/event-pipeline.mjs +0 -81
  673. package/src/channels/lib/holidays.mjs +0 -138
  674. package/src/channels/lib/hook-pipe-server.mjs +0 -822
  675. package/src/channels/lib/output-forwarder.mjs +0 -765
  676. package/src/channels/lib/runtime-paths.mjs +0 -517
  677. package/src/channels/lib/scheduler.mjs +0 -723
  678. package/src/channels/lib/session-discovery.mjs +0 -103
  679. package/src/channels/lib/state-file.mjs +0 -68
  680. package/src/channels/lib/status-snapshot.mjs +0 -219
  681. package/src/channels/lib/tool-format.mjs +0 -140
  682. package/src/channels/lib/transcript-discovery.mjs +0 -195
  683. package/src/channels/lib/voice-runtime-fetcher.mjs +0 -734
  684. package/src/channels/lib/webhook.mjs +0 -1318
  685. package/src/channels/tool-defs.mjs +0 -170
  686. package/src/daemon/host.mjs +0 -118
  687. package/src/daemon/mcp-transport.mjs +0 -47
  688. package/src/daemon/session.mjs +0 -100
  689. package/src/daemon/thin-client.mjs +0 -71
  690. package/src/daemon/transport.mjs +0 -163
  691. package/src/memory/data/runtime-manifest.json +0 -40
  692. package/src/memory/index.mjs +0 -3332
  693. package/src/memory/lib/core-memory-store.mjs +0 -330
  694. package/src/memory/lib/embedding-provider.mjs +0 -269
  695. package/src/memory/lib/embedding-worker.mjs +0 -323
  696. package/src/memory/lib/memory-cycle1.mjs +0 -645
  697. package/src/memory/lib/memory-cycle2.mjs +0 -1284
  698. package/src/memory/lib/memory-cycle3.mjs +0 -540
  699. package/src/memory/lib/memory-embed.mjs +0 -299
  700. package/src/memory/lib/memory-ops-policy.mjs +0 -190
  701. package/src/memory/lib/memory-recall-store.mjs +0 -638
  702. package/src/memory/lib/memory.mjs +0 -412
  703. package/src/memory/lib/pg/adapter.mjs +0 -308
  704. package/src/memory/lib/pg/process.mjs +0 -360
  705. package/src/memory/lib/pg/supervisor.mjs +0 -396
  706. package/src/memory/lib/runtime-fetcher.mjs +0 -458
  707. package/src/memory/lib/trace-store.mjs +0 -728
  708. package/src/memory/tool-defs.mjs +0 -79
  709. package/src/search/index.mjs +0 -1173
  710. package/src/search/lib/backends/anthropic-oauth.mjs +0 -98
  711. package/src/search/lib/backends/exa.mjs +0 -50
  712. package/src/search/lib/backends/firecrawl.mjs +0 -61
  713. package/src/search/lib/backends/gemini-api.mjs +0 -83
  714. package/src/search/lib/backends/grok-oauth.mjs +0 -86
  715. package/src/search/lib/backends/index.mjs +0 -150
  716. package/src/search/lib/backends/openai-api.mjs +0 -144
  717. package/src/search/lib/backends/openai-oauth.mjs +0 -102
  718. package/src/search/lib/backends/openai-web-search.mjs +0 -76
  719. package/src/search/lib/backends/tavily.mjs +0 -55
  720. package/src/search/lib/backends/xai-api.mjs +0 -113
  721. package/src/search/lib/config.mjs +0 -192
  722. package/src/search/lib/provider-usage.mjs +0 -67
  723. package/src/search/lib/providers.mjs +0 -47
  724. package/src/search/lib/search-intent.mjs +0 -109
  725. package/src/search/lib/setup-handler.mjs +0 -261
  726. package/src/search/lib/web-tools.mjs +0 -1219
  727. package/src/search/tool-defs.mjs +0 -83
  728. package/src/setup/defender-exclusion.mjs +0 -183
  729. package/src/shared/atomic-file.mjs +0 -436
  730. package/src/shared/config.mjs +0 -372
  731. package/src/shared/daemon-recycle.mjs +0 -108
  732. package/src/shared/disable-claude-builtins.mjs +0 -91
  733. package/src/shared/err-text.mjs +0 -12
  734. package/src/shared/llm/cost.mjs +0 -66
  735. package/src/shared/llm/http-agent.mjs +0 -123
  736. package/src/shared/open-url.mjs +0 -62
  737. package/src/shared/plugin-paths.mjs +0 -58
  738. package/src/shared/schedules-store.mjs +0 -70
  739. package/src/shared/seed.mjs +0 -136
  740. package/src/shared/user-cwd.mjs +0 -225
  741. package/src/shared/user-data-guard.mjs +0 -244
  742. package/src/status/aggregator.mjs +0 -584
  743. package/src/status/server.mjs +0 -413
  744. package/tools.json +0 -1653
  745. /package/{defaults → src/defaults}/cycle3-review-prompt.md +0 -0
  746. /package/{defaults → src/defaults}/memory-promote-prompt.md +0 -0
  747. /package/{hooks → src/hooks}/lib/permission-rules.cjs +0 -0
  748. /package/{lib → src/lib}/config-cjs.cjs +0 -0
  749. /package/{lib → src/lib}/hook-pipe-path.cjs +0 -0
  750. /package/{lib → src/lib}/mixdog-debug.cjs +0 -0
  751. /package/{lib → src/lib}/text-utils.cjs +0 -0
  752. /package/{rules → src/rules}/bridge/42-cycle3-agent.md +0 -0
  753. /package/src/{agent → runtime/agent}/orchestrator/activity-bus.mjs +0 -0
  754. /package/src/{agent → runtime/agent}/orchestrator/providers/anthropic-betas.mjs +0 -0
  755. /package/src/{agent → runtime/agent}/orchestrator/session/abort-lookup.mjs +0 -0
  756. /package/src/{agent → runtime/agent}/orchestrator/session/cache/post-edit-marks.mjs +0 -0
  757. /package/src/{agent → runtime/agent}/orchestrator/session/cache/scoped-cache-outcome.mjs +0 -0
  758. /package/src/{agent → runtime/agent}/orchestrator/session/cache/util.mjs +0 -0
  759. /package/src/{agent → runtime/agent}/orchestrator/session/read-dedup.mjs +0 -0
  760. /package/src/{agent → runtime/agent}/orchestrator/session/save-session-worker.mjs +0 -0
  761. /package/src/{agent → runtime/agent}/orchestrator/smart-bridge/session-builder.mjs +0 -0
  762. /package/src/{agent → runtime/agent}/orchestrator/tools/bash-policy-scan.mjs +0 -0
  763. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/advisory-lock.mjs +0 -0
  764. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/atomic-write.mjs +0 -0
  765. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/binary-file.mjs +0 -0
  766. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cache-layers.mjs +0 -0
  767. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cwd-utils.mjs +0 -0
  768. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/device-paths.mjs +0 -0
  769. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -0
  770. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diff-utils.mjs +0 -0
  771. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/fs-reachability.mjs +0 -0
  772. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/grep-formatting.mjs +0 -0
  773. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/hash-utils.mjs +0 -0
  774. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/list-formatting.mjs +0 -0
  775. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/open-config-tool.mjs +0 -0
  776. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-locks.mjs +0 -0
  777. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-utils.mjs +0 -0
  778. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-args.mjs +0 -0
  779. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-batch.mjs +0 -0
  780. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-constants.mjs +0 -0
  781. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image-resize.mjs +0 -0
  782. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image.mjs +0 -0
  783. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-lines.mjs +0 -0
  784. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-mode-tool.mjs +0 -0
  785. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-range-index.mjs +0 -0
  786. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-ranges.mjs +0 -0
  787. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-special-files.mjs +0 -0
  788. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-tool.mjs +0 -0
  789. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-windows.mjs +0 -0
  790. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-analysis.mjs +0 -0
  791. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-output.mjs +0 -0
  792. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-helpers.mjs +0 -0
  793. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-validation.mjs +0 -0
  794. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/text-stats.mjs +0 -0
  795. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/windows-roots.mjs +0 -0
  796. /package/src/{agent → runtime/agent}/orchestrator/tools/code-graph-prewarm-worker.mjs +0 -0
  797. /package/src/{agent → runtime/agent}/orchestrator/tools/env-scrub.mjs +0 -0
  798. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-content-cache.mjs +0 -0
  799. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-planner.mjs +0 -0
  800. /package/src/{agent → runtime/agent}/orchestrator/tools/next-call-utils.mjs +0 -0
  801. /package/src/{agent → runtime/agent}/orchestrator/tools/result-compression.mjs +0 -0
  802. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-exec-policy.mjs +0 -0
  803. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy-danger-target.mjs +0 -0
  804. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy.mjs +0 -0
  805. /package/src/{channels → runtime/channels}/lib/cli-worker-host.mjs +0 -0
  806. /package/src/{channels → runtime/channels}/lib/config-lock.mjs +0 -0
  807. /package/src/{channels → runtime/channels}/lib/event-queue.mjs +0 -0
  808. /package/src/{channels → runtime/channels}/lib/executor.mjs +0 -0
  809. /package/src/{channels → runtime/channels}/lib/format.mjs +0 -0
  810. /package/src/{channels → runtime/channels}/lib/interaction-workflows.mjs +0 -0
  811. /package/src/{channels → runtime/channels}/lib/memory-client.mjs +0 -0
  812. /package/src/{channels → runtime/channels}/lib/session-control.mjs +0 -0
  813. /package/src/{channels → runtime/channels}/lib/settings.mjs +0 -0
  814. /package/src/{channels → runtime/channels}/lib/whisper-server.mjs +0 -0
  815. /package/src/{memory → runtime/memory}/lib/agent-ipc.mjs +0 -0
  816. /package/src/{memory → runtime/memory}/lib/bridge-trace-queries.mjs +0 -0
  817. /package/src/{memory → runtime/memory}/lib/llm-worker-host.mjs +0 -0
  818. /package/src/{memory → runtime/memory}/lib/memory-cycle.mjs +0 -0
  819. /package/src/{memory → runtime/memory}/lib/memory-extraction.mjs +0 -0
  820. /package/src/{memory → runtime/memory}/lib/memory-maintenance-store.mjs +0 -0
  821. /package/src/{memory → runtime/memory}/lib/memory-recall-id-patch.mjs +0 -0
  822. /package/src/{memory → runtime/memory}/lib/memory-recall-read-query.mjs +0 -0
  823. /package/src/{memory → runtime/memory}/lib/memory-recall-scope-filter.mjs +0 -0
  824. /package/src/{memory → runtime/memory}/lib/memory-retrievers.mjs +0 -0
  825. /package/src/{memory → runtime/memory}/lib/memory-score.mjs +0 -0
  826. /package/src/{memory → runtime/memory}/lib/memory-text-utils.mjs +0 -0
  827. /package/src/{memory → runtime/memory}/lib/model-profile.mjs +0 -0
  828. /package/src/{memory → runtime/memory}/lib/project-id-resolver.mjs +0 -0
  829. /package/src/{search → runtime/search}/lib/cache.mjs +0 -0
  830. /package/src/{search → runtime/search}/lib/formatter.mjs +0 -0
  831. /package/src/{search → runtime/search}/lib/state.mjs +0 -0
  832. /package/src/{shared → runtime/shared}/abort-controller.mjs +0 -0
  833. /package/src/{shared → runtime/shared}/llm/index.mjs +0 -0
  834. /package/src/{shared → runtime/shared}/llm/pid-cleanup.mjs +0 -0
  835. /package/src/{shared → runtime/shared}/llm/usage-log.mjs +0 -0
  836. /package/src/{shared → runtime/shared}/wsl.mjs +0 -0
@@ -0,0 +1,710 @@
1
+ import { readFileSync, writeFileSync, appendFileSync, unlinkSync } from "fs";
2
+ import { appendFile as _appendFile } from "fs";
3
+ import { join, isAbsolute } from "path";
4
+ import { tmpdir } from "os";
5
+ import { randomUUID } from "crypto";
6
+ import { DATA_DIR, DEFAULT_HOLIDAY_COUNTRY, isInQuietWindow } from "./config.mjs";
7
+ import { runScript as execScript, ensureNopluginDir } from "./executor.mjs";
8
+ import { withFileLockSync } from "../../shared/atomic-file.mjs";
9
+ import { makeBridgeLlm } from '../../agent/orchestrator/smart-bridge/bridge-llm.mjs';
10
+
11
+ const schedulerLlm = makeBridgeLlm({ taskType: 'scheduler-task', role: 'scheduler-task', sourceType: 'scheduler' });
12
+ const SCHEDULE_LOG = join(DATA_DIR, "schedule.log");
13
+ // Buffered async logger — coalesces per-line appends into batched writes.
14
+ let _schedLogBuf = [];
15
+ let _schedLogTimer = null;
16
+ function _flushScheduleLog() {
17
+ _schedLogTimer = null;
18
+ if (_schedLogBuf.length === 0) return;
19
+ const lines = _schedLogBuf.join("");
20
+ _schedLogBuf = [];
21
+ _appendFile(SCHEDULE_LOG, lines, () => {});
22
+ }
23
+ function _flushSchedLogSync() {
24
+ if (_schedLogBuf.length === 0) return;
25
+ const lines = _schedLogBuf.join("");
26
+ _schedLogBuf = [];
27
+ try { appendFileSync(SCHEDULE_LOG, lines); } catch {}
28
+ }
29
+ process.on('exit', _flushSchedLogSync);
30
+ // Note: do not install a module-level SIGTERM handler that calls
31
+ // process.exit() here. The channels worker owns shutdown sequencing
32
+ // (drain queues, persist baselines, release the scheduler lock, etc.)
33
+ // and a library-level exit(0) preempts that drain. The `exit` listener
34
+ // above still flushes pending log lines synchronously when the worker
35
+ // finishes its own shutdown.
36
+ function logSchedule(msg) {
37
+ process.stderr.write(`mixdog scheduler: ${msg}\n`);
38
+ _schedLogBuf.push(`[${new Date().toISOString()}] ${msg}\n`);
39
+ if (!_schedLogTimer) _schedLogTimer = setTimeout(_flushScheduleLog, 2000);
40
+ }
41
+
42
+ import { isHoliday } from "./holidays.mjs";
43
+ import { tryRead } from "./settings.mjs";
44
+ // node-cron is an optional runtime dep. If the module isn't installed
45
+ // (e.g. a fresh v0.6.190 where node_modules predates the package.json
46
+ // bump), cron expressions are disabled (cron stays null below) instead
47
+ // of crashing the whole channels worker.
48
+ let cron = null;
49
+ try {
50
+ const mod = await import("node-cron");
51
+ cron = mod.default || mod;
52
+ } catch (err) {
53
+ process.stderr.write(`mixdog scheduler: node-cron unavailable, cron expressions disabled (${err?.code || err?.message || err})\n`);
54
+ }
55
+ const TICK_INTERVAL = 6e4;
56
+ // All schedule `time` values must be valid 5- or 6-field cron expressions
57
+ // (node-cron format). Legacy formats (HH:MM, everyNm, hourly, daily) are
58
+ // no longer accepted — migrate to cron: "MM HH * * *", "*/N * * * *", etc.
59
+ function isCronExpression(time) {
60
+ if (typeof time !== "string" || !time) return false;
61
+ if (!cron) return false;
62
+ const tokens = time.trim().split(/\s+/);
63
+ if (tokens.length !== 5 && tokens.length !== 6) return false;
64
+ try { return cron.validate(time); } catch { return false; }
65
+ }
66
+ /** Validate a cron expression and throw a descriptive error if invalid.
67
+ * Used by schedule_control / schedules POST before accepting input. */
68
+ export function validateCronExpression(time) {
69
+ if (typeof time !== "string" || !time) throw new Error(`invalid cron expression: ${JSON.stringify(time)}`);
70
+ if (!cron) throw new Error(`cron expression "${time}" rejected: node-cron is not available (install node-cron to use cron expressions)`);
71
+ const tokens = time.trim().split(/\s+/);
72
+ if (tokens.length !== 5 && tokens.length !== 6) {
73
+ throw new Error(`invalid cron expression "${time}": expected 5 or 6 fields, got ${tokens.length}. Legacy formats (HH:MM, everyNm, hourly, daily) are no longer supported — use a cron expression instead.`);
74
+ }
75
+ let valid = false;
76
+ try { valid = cron.validate(time); } catch (e) {
77
+ throw new Error(`invalid cron expression "${time}": ${e?.message || e}`);
78
+ }
79
+ if (!valid) throw new Error(`invalid cron expression "${time}": failed node-cron validation. Legacy formats (HH:MM, everyNm, hourly, daily) are no longer supported — use a cron expression instead.`);
80
+ }
81
+ // Build a {hhmm, dateStr, dow} snapshot in the given IANA TZ. Falls
82
+ // back to local Date math when tz is absent.
83
+ function tzSnapshot(now, tz) {
84
+ if (!tz) {
85
+ return {
86
+ hhmm: `${String(now.getHours()).padStart(2, "0")}:${String(now.getMinutes()).padStart(2, "0")}`,
87
+ dateStr: `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}`,
88
+ dow: now.getDay(),
89
+ };
90
+ }
91
+ const parts = new Intl.DateTimeFormat("en-US", {
92
+ hour12: false, timeZone: tz,
93
+ year: "numeric", month: "2-digit", day: "2-digit",
94
+ hour: "2-digit", minute: "2-digit", weekday: "short",
95
+ }).formatToParts(now).reduce((acc, p) => { acc[p.type] = p.value; return acc; }, {});
96
+ const hour = parts.hour === "24" ? "00" : parts.hour;
97
+ const dowMap = { Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6 };
98
+ return {
99
+ hhmm: `${hour}:${parts.minute}`,
100
+ dateStr: `${parts.year}-${parts.month}-${parts.day}`,
101
+ dow: dowMap[parts.weekday] ?? now.getDay(),
102
+ };
103
+ }
104
+ class Scheduler {
105
+ nonInteractive;
106
+ interactive;
107
+ channelsConfig;
108
+ promptsDir;
109
+ tickTimer = null;
110
+ lastFired = /* @__PURE__ */ new Map();
111
+ // name -> "YYYY-MM-DDTHH:MM"
112
+ running = /* @__PURE__ */ new Set();
113
+ injectFn = null;
114
+ sendFn = null;
115
+ pendingCheck = null;
116
+ // Activity tracking
117
+ lastActivity = 0;
118
+ // timestamp of last inbound message
119
+ deferred = /* @__PURE__ */ new Map();
120
+ // name -> deferred-until timestamp
121
+ skippedToday = /* @__PURE__ */ new Set();
122
+ // names skipped for today
123
+ skippedTodayDate = "";
124
+ // "YYYY-MM-DD" local date the skippedToday set belongs to
125
+ holidayCountry = null;
126
+ // ISO country code for holiday check
127
+ holidayChecked = "";
128
+ // "YYYY-MM-DD" last checked date
129
+ todayIsHoliday = false;
130
+ // cached result for today
131
+ quietSchedule = null;
132
+ // global quiet hours "HH:MM-HH:MM"
133
+ cronJobs = /* @__PURE__ */ new Map();
134
+ // name -> node-cron ScheduledTask for cron-expression entries
135
+ //
136
+ // 0.1.62 wiring:
137
+ // `topConfig` is the normalized top-level channels config from
138
+ // loadConfig()/applyDefaults() — it carries `quiet`, `schedules`
139
+ // at the top level. `channelsConfig` is still accepted separately
140
+ // (channel metadata only, not quiet config) because resolveChannel()
141
+ // needs the channel-label → platform-id map.
142
+ constructor(nonInteractive, interactive, channelsConfig, topConfig) {
143
+ this.nonInteractive = nonInteractive.filter((s) => s.enabled !== false);
144
+ this.interactive = interactive.filter((s) => s.enabled !== false);
145
+ this.channelsConfig = channelsConfig ?? null;
146
+ this.promptsDir = join(DATA_DIR, "prompts");
147
+ this._applyQuietConfig(topConfig);
148
+ }
149
+ /** Resolve quiet/schedules flags from the top-level config
150
+ * (0.1.62 shape: `topConfig.quiet`, `topConfig.schedules`). Falls
151
+ * through silently to defaults (empty schedule, holidays off,
152
+ * respect flag default true) when topConfig is missing or malformed
153
+ * — defensive, not legacy. */
154
+ _applyQuietConfig(topConfig) {
155
+ const cfg = (topConfig && typeof topConfig === "object") ? topConfig : null;
156
+ const quietSrc = cfg?.quiet ?? null;
157
+ const schedulesSrc = cfg?.schedules ?? null;
158
+ // Holidays: prefer an explicit ISO country code. Legacy boolean `true`
159
+ // from older setup UI builds is normalized to the local default country.
160
+ const hol = quietSrc?.holidays;
161
+ if (hol === true) {
162
+ this.holidayCountry = DEFAULT_HOLIDAY_COUNTRY;
163
+ } else if (typeof hol === "string" && hol) {
164
+ this.holidayCountry = hol.trim().toUpperCase();
165
+ } else {
166
+ this.holidayCountry = null;
167
+ }
168
+ // Quiet window string "HH:MM-HH:MM" from topConfig.quiet.schedule.
169
+ this.quietSchedule = quietSrc?.schedule ?? null;
170
+ // Opt-in flag: default true when unspecified, matching applyDefaults.
171
+ this.respectQuietSchedules = schedulesSrc?.respectQuiet !== false;
172
+ }
173
+ setInjectHandler(fn) {
174
+ this.injectFn = fn;
175
+ }
176
+ setSendHandler(fn) {
177
+ this.sendFn = fn;
178
+ }
179
+ setPendingCheck(fn) {
180
+ this.pendingCheck = typeof fn === 'function' ? fn : null;
181
+ }
182
+ noteActivity() {
183
+ this.lastActivity = Date.now();
184
+ }
185
+ /** Defer a schedule by N minutes from now */
186
+ defer(name, minutes) {
187
+ const mins = Number(minutes);
188
+ if (!Number.isFinite(mins) || mins <= 0) {
189
+ throw new Error(`defer: minutes must be a positive number, got ${JSON.stringify(minutes)}`);
190
+ }
191
+ const allSchedules = [...this.nonInteractive, ...this.interactive];
192
+ const exists = allSchedules.some(s => s.name === name);
193
+ if (!exists) throw new Error(`defer: unknown schedule "${name}" — use schedule_status to list valid names`);
194
+ this.deferred.set(name, Date.now() + mins * 6e4);
195
+ }
196
+ /** Skip a schedule for the rest of today */
197
+ skipToday(name) {
198
+ const allSchedules = [...this.nonInteractive, ...this.interactive];
199
+ const exists = allSchedules.some(s => s.name === name);
200
+ if (!exists) throw new Error(`skip_today: unknown schedule "${name}" — use schedule_status to list valid names`);
201
+ this.rolloverSkippedTodayIfNeeded();
202
+ this.skippedToday.add(name);
203
+ }
204
+ /** Roll the skippedToday bucket over when the local date has changed */
205
+ rolloverSkippedTodayIfNeeded() {
206
+ const today = new Date().toLocaleDateString('sv-SE');
207
+ if (this.skippedTodayDate !== today) {
208
+ this.skippedToday.clear();
209
+ this.skippedTodayDate = today;
210
+ }
211
+ }
212
+ /** Check if a schedule should be skipped (deferred or skipped today) */
213
+ shouldSkip(name) {
214
+ this.rolloverSkippedTodayIfNeeded();
215
+ if (this.skippedToday.has(name)) return true;
216
+ const until = this.deferred.get(name);
217
+ if (until && Date.now() < until) return true;
218
+ if (until && Date.now() >= until) this.deferred.delete(name);
219
+ return false;
220
+ }
221
+ /** Get current session activity state.
222
+ * Returns { lastActivityMs, pendingWork } — callers apply their own
223
+ * thresholds. pendingWork is true when pendingCheck() reports work in
224
+ * flight. lastActivityMs is 0 when no activity has been recorded. */
225
+ getSessionState() {
226
+ let pendingWork = false;
227
+ try {
228
+ if (this.pendingCheck) pendingWork = !!this.pendingCheck();
229
+ } catch { /* probe failure is not fatal */ }
230
+ return { lastActivityMs: this.lastActivity, pendingWork };
231
+ }
232
+ /** Returns true when the session is considered idle (no pending work and
233
+ * lastActivityMs is either 0 or older than the given threshold).
234
+ * threshold defaults to 15 minutes but callers should pass their own. */
235
+ isSessionIdle(thresholdMs = 15 * 6e4) {
236
+ const { lastActivityMs, pendingWork } = this.getSessionState();
237
+ if (pendingWork) return false;
238
+ if (lastActivityMs === 0) return true;
239
+ return Date.now() - lastActivityMs >= thresholdMs;
240
+ }
241
+ /** Get time context for prompt enrichment */
242
+ getTimeContext() {
243
+ const now = /* @__PURE__ */ new Date();
244
+ const days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
245
+ const dow = now.getDay();
246
+ return {
247
+ hour: now.getHours(),
248
+ dayOfWeek: days[dow],
249
+ isWeekend: dow === 0 || dow === 6
250
+ };
251
+ }
252
+ /** Wrap prompt with session context metadata */
253
+ wrapPrompt(name, prompt, type) {
254
+ const { lastActivityMs, pendingWork } = this.getSessionState();
255
+ const state = pendingWork ? "active" : lastActivityMs === 0 ? "idle" : "recent";
256
+ const time = this.getTimeContext();
257
+ const header = [
258
+ `[schedule: ${name} | type: ${type} | session: ${state}]`,
259
+ `[time: ${time.dayOfWeek} ${String(time.hour).padStart(2, "0")}:${String((/* @__PURE__ */ new Date()).getMinutes()).padStart(2, "0")} | weekend: ${time.isWeekend}]`,
260
+ `Before starting any work, briefly tell the user what you're about to do in one short sentence.`
261
+ ].join("\n");
262
+ return `${header}
263
+
264
+ ${prompt}`;
265
+ }
266
+ static SCHEDULER_LOCK = join(tmpdir(), "mixdog-scheduler.lock");
267
+ static INSTANCE_UUID = randomUUID();
268
+ start() {
269
+ if (this.tickTimer) return;
270
+ const total = this.nonInteractive.length + this.interactive.length;
271
+ if (total === 0) {
272
+ process.stderr.write("mixdog scheduler: no schedules configured\n");
273
+ return;
274
+ }
275
+ ensureNopluginDir();
276
+ const lockContent = `${process.pid}
277
+ ${Date.now()}
278
+ ${Scheduler.INSTANCE_UUID}`;
279
+ let acquiredSchedulerLock = false;
280
+ withFileLockSync(`${Scheduler.SCHEDULER_LOCK}.acquire`, () => {
281
+ try {
282
+ writeFileSync(Scheduler.SCHEDULER_LOCK, lockContent, { flag: "wx" });
283
+ acquiredSchedulerLock = true;
284
+ } catch (err) {
285
+ if (err.code === "EEXIST") {
286
+ try {
287
+ const content = readFileSync(Scheduler.SCHEDULER_LOCK, "utf8");
288
+ const lines = content.split("\n");
289
+ const pid = parseInt(lines[0]);
290
+ let isAlive = false;
291
+ try {
292
+ process.kill(pid, 0);
293
+ isAlive = true;
294
+ } catch {
295
+ }
296
+ if (isAlive) {
297
+ // No heartbeat: lock age cannot distinguish a long-running
298
+ // healthy owner from PID-reuse, so an age-only reclaim
299
+ // would double-schedule cron jobs while the original
300
+ // owner is still firing. Only proceed to reclaim when
301
+ // process.kill(pid, 0) actually proves the PID is dead —
302
+ // not by guessing from `lockAge > 1h`.
303
+ process.stderr.write(`mixdog scheduler: another session (PID ${pid}) owns the scheduler, skipping
304
+ `);
305
+ return;
306
+ }
307
+ } catch {
308
+ }
309
+ // Reclaim runs under the shared atomic-file acquisition guard.
310
+ // That guard serializes this scheduler acquisition path's
311
+ // check/unlink/wx sequence, so a second reclaimer cannot delete
312
+ // a fresh lock in the path gap between stale unlink and create.
313
+ try { unlinkSync(Scheduler.SCHEDULER_LOCK); } catch {}
314
+ try {
315
+ writeFileSync(Scheduler.SCHEDULER_LOCK, lockContent, { flag: "wx" });
316
+ acquiredSchedulerLock = true;
317
+ } catch (e2) {
318
+ if (e2.code === "EEXIST") {
319
+ process.stderr.write(`mixdog scheduler: lock reclaimed by another session during reclaim, skipping
320
+ `);
321
+ return;
322
+ }
323
+ throw e2;
324
+ }
325
+ } else {
326
+ throw err;
327
+ }
328
+ }
329
+ }, { timeoutMs: 60000, staleMs: 30000 });
330
+ if (!acquiredSchedulerLock) return;
331
+ process.on("exit", () => {
332
+ // Verify ownership before unlink: an exiting process whose lock
333
+ // was already reclaimed by a newer owner (PID-reuse / restart race)
334
+ // must NOT delete the new owner's lock file. Read-verify-then-unlink
335
+ // mirrors memory/index.mjs releaseLock().
336
+ try {
337
+ const content = readFileSync(Scheduler.SCHEDULER_LOCK, "utf8");
338
+ const lockedPid = parseInt(content.split("\n")[0]);
339
+ if (lockedPid === process.pid) unlinkSync(Scheduler.SCHEDULER_LOCK);
340
+ } catch {
341
+ }
342
+ });
343
+ logSchedule(`${this.nonInteractive.length} non-interactive, ${this.interactive.length} interactive
344
+ `);
345
+ this.registerCronJobs();
346
+ this.tick();
347
+ this.tickTimer = setInterval(() => this.tick(), TICK_INTERVAL);
348
+ }
349
+ /** Register cron-expression entries with node-cron. All schedule entries
350
+ * must use cron expressions. Entries that fail cron validation are skipped
351
+ * with a logged error. */
352
+ registerCronJobs() {
353
+ const all = [
354
+ ...this.nonInteractive.map((s) => ({ schedule: s, type: "non-interactive" })),
355
+ ...this.interactive.map((s) => ({ schedule: s, type: "interactive" })),
356
+ ];
357
+ for (const { schedule: s, type } of all) {
358
+ if (!isCronExpression(s.time)) continue;
359
+ try {
360
+ const task = cron.schedule(s.time, () => this.onCronFire(s, type), {
361
+ timezone: s.timezone || undefined,
362
+ name: s.name,
363
+ });
364
+ this.cronJobs.set(s.name, task);
365
+ logSchedule(`registered cron "${s.name}" = "${s.time}"${s.timezone ? ` tz=${s.timezone}` : ""}\n`);
366
+ } catch (err) {
367
+ process.stderr.write(`mixdog scheduler: failed to register cron "${s.name}" (${s.time}): ${err}\n`);
368
+ }
369
+ }
370
+ }
371
+ /** Fire path for a cron-triggered entry. Applies day/quiet/holiday
372
+ * guards against the schedule's TZ (or local when absent). */
373
+ async onCronFire(schedule, type) {
374
+ const now = /* @__PURE__ */ new Date();
375
+ const tz = schedule.timezone || null;
376
+ const snap = tzSnapshot(now, tz);
377
+ const isWeekend = snap.dow === 0 || snap.dow === 6;
378
+ const days = schedule.days ?? "daily";
379
+ if (!this.matchesDays(days, snap.dow, isWeekend)) return;
380
+ if (this.holidayCountry) {
381
+ try {
382
+ const holiday = await isHoliday(this.tzDate(now, tz), this.holidayCountry);
383
+ if (holiday && (schedule.skipHolidays || days === "weekday")) {
384
+ logSchedule(`skipping "${schedule.name}" \u2014 public holiday\n`);
385
+ return;
386
+ }
387
+ } catch {}
388
+ }
389
+ if ((schedule.dnd || this.respectQuietSchedules) && this.isQuietHours(now, tz)) return;
390
+ if (this.shouldSkip(schedule.name)) return;
391
+ // Record lastFired only when the fire actually proceeds past
392
+ // fireTimed's running/precondition guards (it resolves truthy on a
393
+ // real fire), so failed/skipped fires no longer display as fired.
394
+ this.fireTimed(schedule, type).then(
395
+ (fired) => { if (fired) this.lastFired.set(schedule.name, now.toISOString()); }
396
+ ).catch(
397
+ (err) => process.stderr.write(`mixdog scheduler: ${schedule.name} failed: ${err}\n`)
398
+ );
399
+ }
400
+ /** Produce a Date whose calendar day matches the TZ-adjusted dateStr,
401
+ * so holiday lookups by country work against the right day. */
402
+ tzDate(now, tz) {
403
+ if (!tz) return now;
404
+ const snap = tzSnapshot(now, tz);
405
+ return new Date(`${snap.dateStr}T12:00:00Z`);
406
+ }
407
+ stop() {
408
+ if (this.tickTimer) {
409
+ clearInterval(this.tickTimer);
410
+ this.tickTimer = null;
411
+ }
412
+ this.destroyCronJobs();
413
+ // Release the scheduler lock so a subsequent start() in the same
414
+ // process can re-acquire it. Without this, the wx-create in start()
415
+ // hits its own live lock (matching INSTANCE_UUID + recent mtime) and
416
+ // refuses to register cron jobs, leaving the scheduler silently idle
417
+ // after a reload/restart cycle. Read-verify-then-unlink so we don't
418
+ // delete another live owner's lock file (mirrors memory releaseLock).
419
+ try {
420
+ const content = readFileSync(Scheduler.SCHEDULER_LOCK, "utf8");
421
+ const lockedPid = parseInt(content.split("\n")[0]);
422
+ if (lockedPid === process.pid) unlinkSync(Scheduler.SCHEDULER_LOCK);
423
+ } catch {}
424
+ }
425
+ destroyCronJobs() {
426
+ for (const [, task] of this.cronJobs) {
427
+ try { task.destroy(); } catch {}
428
+ }
429
+ this.cronJobs.clear();
430
+ }
431
+ restart() {
432
+ if (this.tickTimer) {
433
+ clearInterval(this.tickTimer);
434
+ this.tickTimer = null;
435
+ }
436
+ this.destroyCronJobs();
437
+ // Read-verify-then-unlink so a non-owner reload can't delete the
438
+ // live owner's lock file (mirrors stop() and the exit handler).
439
+ try {
440
+ const content = readFileSync(Scheduler.SCHEDULER_LOCK, "utf8");
441
+ const lockedPid = parseInt(content.split("\n")[0]);
442
+ if (lockedPid === process.pid) unlinkSync(Scheduler.SCHEDULER_LOCK);
443
+ } catch {}
444
+ this.start();
445
+ }
446
+ reloadConfig(nonInteractive, interactive, channelsConfig, topConfig, options = {}) {
447
+ this.nonInteractive = nonInteractive.filter((s) => s.enabled !== false);
448
+ this.interactive = interactive.filter((s) => s.enabled !== false);
449
+ this.channelsConfig = channelsConfig ?? null;
450
+ this.promptsDir = join(DATA_DIR, "prompts");
451
+ this._applyQuietConfig(topConfig);
452
+ this.holidayChecked = "";
453
+ this.todayIsHoliday = false;
454
+ if (this.deferred.size > 0 || this.skippedToday.size > 0) {
455
+ process.stderr.write(`mixdog scheduler: reload clearing ${this.deferred.size} deferred, ${this.skippedToday.size} skipped
456
+ `);
457
+ }
458
+ this.deferred.clear();
459
+ this.skippedToday.clear();
460
+ if (options.restart === false) {
461
+ // Caller owns lifecycle; still drop stale cron bindings so they don't fire against old config.
462
+ this.destroyCronJobs();
463
+ return;
464
+ }
465
+ this.restart();
466
+ }
467
+ getStatus() {
468
+ const result = [];
469
+ for (const s of this.nonInteractive) {
470
+ result.push({
471
+ name: s.name,
472
+ time: s.time,
473
+ days: s.days ?? "daily",
474
+ type: "non-interactive",
475
+ running: false,
476
+ lastFired: this.lastFired.get(s.name) ?? null
477
+ });
478
+ }
479
+ for (const s of this.interactive) {
480
+ result.push({
481
+ name: s.name,
482
+ time: s.time,
483
+ days: s.days ?? "daily",
484
+ type: "interactive",
485
+ running: false,
486
+ lastFired: this.lastFired.get(s.name) ?? null
487
+ });
488
+ }
489
+ return result;
490
+ }
491
+ async triggerManual(name) {
492
+ const timed = [...this.nonInteractive, ...this.interactive].find((e) => e.name === name);
493
+ if (timed) {
494
+ if (this.running.has(name)) return `"${name}" is already running`;
495
+ const isNonInteractive = this.nonInteractive.includes(timed);
496
+ const now = /* @__PURE__ */ new Date();
497
+ const hhmm = `${String(now.getHours()).padStart(2, "0")}:${String(now.getMinutes()).padStart(2, "0")}`;
498
+ const dateStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}`;
499
+ // Match onCronFire: record lastFired only when fireTimed actually
500
+ // proceeds past its running/precondition guards (resolves truthy),
501
+ // and reflect a non-fire in the returned status.
502
+ const fired = await this.fireTimed(timed, isNonInteractive ? "non-interactive" : "interactive");
503
+ if (fired) {
504
+ this.lastFired.set(name, `${dateStr}T${hhmm}`);
505
+ return `triggered "${name}"`;
506
+ }
507
+ return `"${name}" did not fire (skipped or already running)`;
508
+ }
509
+ return `schedule "${name}" not found`;
510
+ }
511
+ // ── Tick ─────────────────────────────────────────────────────────────
512
+ tick() {
513
+ this.tickAsync().catch(
514
+ (err) => process.stderr.write(`mixdog scheduler: tick error: ${err}
515
+ `)
516
+ );
517
+ }
518
+ async tickAsync() {
519
+ const now = /* @__PURE__ */ new Date();
520
+ const dateStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}`;
521
+ // All timed schedules are now handled exclusively by node-cron (registerCronJobs).
522
+ // tick() only drives the holiday cache refresh.
523
+ if (this.holidayCountry && this.holidayChecked !== dateStr) {
524
+ this.holidayChecked = dateStr;
525
+ try {
526
+ this.todayIsHoliday = await isHoliday(now, this.holidayCountry);
527
+ if (this.todayIsHoliday) {
528
+ process.stderr.write(`mixdog scheduler: today (${dateStr}) is a holiday \u2014 weekday schedules will be skipped
529
+ `);
530
+ }
531
+ } catch (err) {
532
+ process.stderr.write(`mixdog scheduler: holiday check failed: ${err}
533
+ `);
534
+ this.todayIsHoliday = false;
535
+ }
536
+ }
537
+ }
538
+ /** Day abbreviation → JS day number (0=Sun...6=Sat) */
539
+ static DAY_ABBRS = {
540
+ sun: 0,
541
+ mon: 1,
542
+ tue: 2,
543
+ wed: 3,
544
+ thu: 4,
545
+ fri: 5,
546
+ sat: 6
547
+ };
548
+ /** Check if today matches the schedule's days setting */
549
+ matchesDays(days, dow, isWeekend) {
550
+ if (days === "daily") return true;
551
+ if (days === "weekday") return !isWeekend;
552
+ if (days === "weekend") return isWeekend;
553
+ const dayList = days.split(",").map((d) => d.trim().toLowerCase());
554
+ return dayList.some((d) => Scheduler.DAY_ABBRS[d] === dow);
555
+ }
556
+ /** Check if current time is within global quiet hours (quiet.schedule).
557
+ * tz optional — when set, HH:MM is evaluated in the given IANA zone.
558
+ *
559
+ * Delegates to the shared, now TZ-aware isInQuietWindow(cfg, now, tz)
560
+ * helper in lib/config.mjs. Holidays are passed as `false` here on
561
+ * purpose: public-holiday skips for the scheduler are handled by the
562
+ * separate holidayCountry / skipHolidays / days==="weekday" path in
563
+ * onCronFire, so this quiet-window check stays schedule-window only —
564
+ * identical to the prior local implementation. */
565
+ isQuietHours(now, tz) {
566
+ return isInQuietWindow({ schedule: this.quietSchedule, holidays: false }, now, tz);
567
+ }
568
+ // ── Fire timed schedule ─────────────────────────────────────────────
569
+ async fireTimed(schedule, type) {
570
+ const execMode = schedule.exec ?? "prompt";
571
+ if (execMode === "script" || execMode === "script+prompt") {
572
+ if (!schedule.script) {
573
+ process.stderr.write(`mixdog scheduler: no script specified for "${schedule.name}"
574
+ `);
575
+ return false;
576
+ }
577
+ if (this.running.has(schedule.name)) return false;
578
+ this.running.add(schedule.name);
579
+ const channelId2 = this.resolveChannel(schedule.channel);
580
+ logSchedule(`firing ${schedule.name} (${type}, exec=${execMode})
581
+ `);
582
+ try {
583
+ const scriptResult = await this.runScript(schedule.script);
584
+ if (execMode === "script") {
585
+ this.running.delete(schedule.name);
586
+ if (scriptResult && this.sendFn) {
587
+ await this.sendFn(channelId2, scriptResult).catch(
588
+ (err) => process.stderr.write(`mixdog scheduler: ${schedule.name} relay failed: ${err}
589
+ `)
590
+ );
591
+ }
592
+ process.stderr.write(`mixdog scheduler: ${schedule.name} script done
593
+ `);
594
+ return true;
595
+ }
596
+ const prompt2 = this.loadPrompt(schedule.prompt ?? `${schedule.name}.md`);
597
+ if (!prompt2) {
598
+ this.running.delete(schedule.name);
599
+ process.stderr.write(`mixdog scheduler: prompt not found for "${schedule.name}"
600
+ `);
601
+ return false;
602
+ }
603
+ const combinedPrompt = `${prompt2}
604
+
605
+ ---
606
+ ## Script Output
607
+ \`\`\`
608
+ ${scriptResult}
609
+ \`\`\``;
610
+ this.running.delete(schedule.name);
611
+ return await this.fireTimedPrompt(schedule, type, combinedPrompt, channelId2);
612
+ } catch (err) {
613
+ this.running.delete(schedule.name);
614
+ process.stderr.write(`mixdog scheduler: ${schedule.name} script error: ${err}
615
+ `);
616
+ return false;
617
+ }
618
+ }
619
+ const prompt = this.resolvePrompt(schedule);
620
+ if (!prompt) {
621
+ process.stderr.write(`mixdog scheduler: prompt not found for "${schedule.name}"
622
+ `);
623
+ return false;
624
+ }
625
+ const channelId = this.resolveChannel(schedule.channel);
626
+ return await this.fireTimedPrompt(schedule, type, prompt, channelId);
627
+ }
628
+ /** Fire a timed schedule with the given prompt content */
629
+ async fireTimedPrompt(schedule, type, prompt, channelId) {
630
+ logSchedule(`firing ${schedule.name} (${type})
631
+ `);
632
+ if (type === "interactive") {
633
+ if (this.injectFn) {
634
+ this.injectFn(channelId, schedule.name, " ", {
635
+ instruction: prompt,
636
+ type: "schedule"
637
+ });
638
+ return true;
639
+ }
640
+ return false;
641
+ }
642
+ if (this.running.has(schedule.name)) return false;
643
+ this.running.add(schedule.name);
644
+ const presetId = schedule.model;
645
+ if (!presetId) {
646
+ this.running.delete(schedule.name);
647
+ logSchedule(`${schedule.name}: missing required "model" in schedule config — dispatch rejected\n`);
648
+ return false;
649
+ }
650
+ schedulerLlm({ prompt, preset: presetId, sourceName: schedule.name })
651
+ .then((result) => {
652
+ this.running.delete(schedule.name);
653
+ if (result && this.sendFn) {
654
+ this.sendFn(channelId, result).catch(
655
+ (err) => process.stderr.write(`mixdog scheduler: ${schedule.name} relay failed: ${err}\n`)
656
+ );
657
+ }
658
+ logSchedule(`${schedule.name} done\n`);
659
+ })
660
+ .catch((err) => {
661
+ this.running.delete(schedule.name);
662
+ logSchedule(`${schedule.name} LLM error: ${err.message}\n`);
663
+ });
664
+ return true;
665
+ }
666
+ // ── Script execution (delegates to shared executor) ────────────────
667
+ runScript(scriptName) {
668
+ return new Promise((resolve, reject) => {
669
+ execScript(`schedule:${scriptName}`, scriptName, (result, code) => {
670
+ if (code !== 0 && code !== null) {
671
+ reject(new Error(`script exited with code ${code}`));
672
+ } else {
673
+ resolve(result);
674
+ }
675
+ });
676
+ });
677
+ }
678
+ // ── Helpers ─────────────────────────────────────────────────────────
679
+ /** Resolve a channel label to its platform ID via channelsConfig, fallback to raw value */
680
+ resolveChannel(label) {
681
+ const entry = this.channelsConfig?.[label];
682
+ if (entry?.channelId) return entry.channelId;
683
+ // Misconfigured label: no channelsConfig entry, so we fall back to
684
+ // using the raw label as the channel id. Warn once per label so the
685
+ // misconfiguration is diagnosable without spamming stderr.
686
+ if (label != null) {
687
+ this._channelFallbackWarned ??= new Set();
688
+ if (!this._channelFallbackWarned.has(label)) {
689
+ this._channelFallbackWarned.add(label);
690
+ process.stderr.write(`mixdog scheduler: channel label "${label}" not found in channelsConfig — using it as a raw channel id\n`);
691
+ }
692
+ }
693
+ return label;
694
+ }
695
+ /** Resolve prompt: try file first, fall back to inline text */
696
+ resolvePrompt(schedule) {
697
+ const ref = schedule.prompt ?? `${schedule.name}.md`;
698
+ const fromFile = this.loadPrompt(ref);
699
+ if (fromFile) return fromFile;
700
+ if (schedule.prompt) return schedule.prompt;
701
+ return null;
702
+ }
703
+ loadPrompt(nameOrPath) {
704
+ const full = isAbsolute(nameOrPath) ? nameOrPath : join(this.promptsDir, nameOrPath);
705
+ return tryRead(full);
706
+ }
707
+ }
708
+ export {
709
+ Scheduler
710
+ };