mixdog 0.7.18 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (844) hide show
  1. package/README.md +37 -331
  2. package/package.json +67 -99
  3. package/scripts/boot-smoke.mjs +94 -0
  4. package/scripts/build-tui.mjs +52 -0
  5. package/scripts/compact-smoke.mjs +199 -0
  6. package/scripts/lead-workflow-smoke.mjs +598 -0
  7. package/scripts/live-worker-smoke.mjs +239 -0
  8. package/scripts/output-style-smoke.mjs +101 -0
  9. package/scripts/smoke-loop-report.mjs +221 -0
  10. package/scripts/smoke-loop.mjs +201 -0
  11. package/scripts/smoke.mjs +113 -0
  12. package/scripts/tool-failures.mjs +143 -0
  13. package/scripts/tool-smoke.mjs +456 -0
  14. package/src/agents/debugger/AGENT.md +3 -0
  15. package/src/agents/debugger/agent.json +6 -0
  16. package/src/agents/explore/AGENT.md +4 -0
  17. package/src/agents/explore/agent.json +6 -0
  18. package/src/agents/heavy-worker/AGENT.md +3 -0
  19. package/src/agents/heavy-worker/agent.json +6 -0
  20. package/src/agents/maintainer/AGENT.md +3 -0
  21. package/src/agents/maintainer/agent.json +6 -0
  22. package/src/agents/reviewer/AGENT.md +3 -0
  23. package/src/agents/reviewer/agent.json +6 -0
  24. package/src/agents/scheduler-task.md +3 -0
  25. package/src/agents/web-researcher/AGENT.md +3 -0
  26. package/src/agents/web-researcher/agent.json +6 -0
  27. package/src/agents/webhook-handler.md +3 -0
  28. package/src/agents/worker/AGENT.md +3 -0
  29. package/src/agents/worker/agent.json +6 -0
  30. package/src/app.mjs +90 -0
  31. package/src/cli.mjs +11 -0
  32. package/src/defaults/hidden-roles.json +72 -0
  33. package/src/defaults/mixdog-config.template.json +15 -0
  34. package/src/hooks/lib/permission-evaluator.cjs +488 -0
  35. package/src/hooks/lib/settings-loader.cjs +112 -0
  36. package/src/lib/keychain-cjs.cjs +332 -0
  37. package/src/lib/plugin-paths.cjs +28 -0
  38. package/src/lib/rules-builder.cjs +315 -0
  39. package/src/mixdog-session-runtime.mjs +3704 -0
  40. package/src/output-styles/default.md +38 -0
  41. package/src/output-styles/extreme-simple.md +17 -0
  42. package/src/output-styles/simple.md +17 -0
  43. package/src/repl.mjs +322 -0
  44. package/src/rules/bridge/00-common.md +5 -0
  45. package/src/rules/bridge/20-skip-protocol.md +11 -0
  46. package/src/rules/bridge/30-explorer.md +4 -0
  47. package/src/rules/bridge/40-cycle1-agent.md +28 -0
  48. package/src/rules/bridge/41-cycle2-agent.md +59 -0
  49. package/src/rules/lead/00-tool-lead.md +5 -0
  50. package/src/rules/lead/01-general.md +5 -0
  51. package/src/rules/lead/02-channels.md +3 -0
  52. package/src/rules/lead/04-workflow.md +12 -0
  53. package/src/rules/shared/00-language.md +3 -0
  54. package/src/rules/shared/01-tool.md +3 -0
  55. package/src/runtime/agent/orchestrator/bridge-trace.mjs +814 -0
  56. package/src/runtime/agent/orchestrator/cache-mtime.mjs +60 -0
  57. package/src/runtime/agent/orchestrator/config.mjs +446 -0
  58. package/src/runtime/agent/orchestrator/context/collect.mjs +796 -0
  59. package/src/runtime/agent/orchestrator/dispatch-persist.mjs +417 -0
  60. package/src/runtime/agent/orchestrator/internal-roles.mjs +188 -0
  61. package/src/runtime/agent/orchestrator/internal-tools.mjs +88 -0
  62. package/src/runtime/agent/orchestrator/mcp/client.mjs +345 -0
  63. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2104 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +784 -0
  65. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +341 -0
  66. package/src/runtime/agent/orchestrator/providers/gemini.mjs +1679 -0
  67. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +959 -0
  68. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +213 -0
  69. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +38 -0
  70. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +471 -0
  71. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +615 -0
  72. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +808 -0
  73. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +1719 -0
  74. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2587 -0
  75. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +1953 -0
  76. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +136 -0
  77. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +317 -0
  78. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +109 -0
  79. package/src/runtime/agent/orchestrator/providers/registry.mjs +247 -0
  80. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +332 -0
  81. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +11 -0
  82. package/src/runtime/agent/orchestrator/providers/trace-utils.mjs +50 -0
  83. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
  84. package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +318 -0
  85. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +367 -0
  86. package/src/runtime/agent/orchestrator/session/compact.mjs +882 -0
  87. package/src/runtime/agent/orchestrator/session/context-utils.mjs +233 -0
  88. package/src/runtime/agent/orchestrator/session/loop.mjs +2320 -0
  89. package/src/runtime/agent/orchestrator/session/manager.mjs +2960 -0
  90. package/src/runtime/agent/orchestrator/session/result-classification.mjs +65 -0
  91. package/src/runtime/agent/orchestrator/session/store.mjs +663 -0
  92. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +166 -0
  93. package/src/runtime/agent/orchestrator/smart-bridge/bridge-llm.mjs +339 -0
  94. package/src/runtime/agent/orchestrator/smart-bridge/cache-strategy.mjs +419 -0
  95. package/src/runtime/agent/orchestrator/stall-policy.mjs +227 -0
  96. package/src/runtime/agent/orchestrator/tool-loop-guard.mjs +235 -0
  97. package/src/runtime/agent/orchestrator/tools/bash-session.mjs +723 -0
  98. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +389 -0
  99. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +637 -0
  100. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +165 -0
  101. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +104 -0
  102. package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +194 -0
  103. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +596 -0
  104. package/src/runtime/agent/orchestrator/tools/builtin/native-edit-runner.mjs +110 -0
  105. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +153 -0
  106. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
  107. package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +189 -0
  108. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +731 -0
  109. package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +168 -0
  110. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
  111. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +465 -0
  112. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +160 -0
  113. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +982 -0
  114. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1087 -0
  115. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +231 -0
  116. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +223 -0
  117. package/src/runtime/agent/orchestrator/tools/builtin.mjs +478 -0
  118. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
  119. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4102 -0
  120. package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +323 -0
  121. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +154 -0
  122. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +26 -0
  123. package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +143 -0
  124. package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +18 -0
  125. package/src/runtime/agent/orchestrator/tools/patch.mjs +2772 -0
  126. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +114 -0
  127. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +880 -0
  128. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +312 -0
  129. package/src/runtime/channels/backends/discord.mjs +781 -0
  130. package/src/runtime/channels/data/voice-runtime-manifest.json +138 -0
  131. package/src/runtime/channels/index.mjs +3309 -0
  132. package/src/runtime/channels/lib/config.mjs +285 -0
  133. package/src/runtime/channels/lib/drop-trace.mjs +71 -0
  134. package/src/runtime/channels/lib/event-pipeline.mjs +81 -0
  135. package/src/runtime/channels/lib/holidays.mjs +138 -0
  136. package/src/runtime/channels/lib/hook-pipe-server.mjs +671 -0
  137. package/src/runtime/channels/lib/output-forwarder.mjs +765 -0
  138. package/src/runtime/channels/lib/runtime-paths.mjs +497 -0
  139. package/src/runtime/channels/lib/scheduler.mjs +710 -0
  140. package/src/runtime/channels/lib/session-discovery.mjs +102 -0
  141. package/src/runtime/channels/lib/state-file.mjs +68 -0
  142. package/src/runtime/channels/lib/status-snapshot.mjs +224 -0
  143. package/src/runtime/channels/lib/tool-format.mjs +124 -0
  144. package/src/runtime/channels/lib/transcript-discovery.mjs +195 -0
  145. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +734 -0
  146. package/src/runtime/channels/lib/webhook.mjs +1288 -0
  147. package/src/runtime/channels/tool-defs.mjs +177 -0
  148. package/src/runtime/lib/keychain-cjs.cjs +289 -0
  149. package/src/runtime/memory/data/runtime-manifest.json +40 -0
  150. package/src/runtime/memory/index.mjs +3600 -0
  151. package/src/runtime/memory/lib/core-memory-store.mjs +336 -0
  152. package/src/runtime/memory/lib/embedding-provider.mjs +275 -0
  153. package/src/runtime/memory/lib/embedding-worker.mjs +331 -0
  154. package/src/runtime/memory/lib/memory-cycle-requests.mjs +276 -0
  155. package/src/runtime/memory/lib/memory-cycle1.mjs +783 -0
  156. package/src/runtime/memory/lib/memory-cycle2.mjs +1389 -0
  157. package/src/runtime/memory/lib/memory-cycle3.mjs +646 -0
  158. package/src/runtime/memory/lib/memory-embed.mjs +300 -0
  159. package/src/runtime/memory/lib/memory-ops-policy.mjs +149 -0
  160. package/src/runtime/memory/lib/memory-recall-store.mjs +644 -0
  161. package/src/runtime/memory/lib/memory.mjs +418 -0
  162. package/src/runtime/memory/lib/pg/adapter.mjs +314 -0
  163. package/src/runtime/memory/lib/pg/process.mjs +366 -0
  164. package/src/runtime/memory/lib/pg/supervisor.mjs +495 -0
  165. package/src/runtime/memory/lib/runtime-fetcher.mjs +464 -0
  166. package/src/runtime/memory/lib/trace-store.mjs +734 -0
  167. package/src/runtime/memory/tool-defs.mjs +79 -0
  168. package/src/runtime/search/index.mjs +925 -0
  169. package/src/runtime/search/lib/config.mjs +61 -0
  170. package/src/runtime/search/lib/web-tools.mjs +1278 -0
  171. package/src/runtime/search/tool-defs.mjs +64 -0
  172. package/src/runtime/shared/atomic-file.mjs +435 -0
  173. package/src/runtime/shared/background-tasks.mjs +376 -0
  174. package/src/runtime/shared/child-guardian.mjs +98 -0
  175. package/src/runtime/shared/config.mjs +393 -0
  176. package/src/runtime/shared/err-text.mjs +121 -0
  177. package/src/runtime/shared/launcher-control.mjs +259 -0
  178. package/src/runtime/shared/llm/http-agent.mjs +129 -0
  179. package/src/runtime/shared/open-url.mjs +37 -0
  180. package/src/runtime/shared/plugin-paths.mjs +25 -0
  181. package/src/runtime/shared/process-shutdown.mjs +147 -0
  182. package/src/runtime/shared/schedules-store.mjs +70 -0
  183. package/src/runtime/shared/tool-execution-contract.mjs +104 -0
  184. package/src/runtime/shared/tool-surface.mjs +950 -0
  185. package/src/runtime/shared/user-cwd.mjs +221 -0
  186. package/src/runtime/shared/user-data-guard.mjs +232 -0
  187. package/src/runtime/shared/workspace-router.mjs +259 -0
  188. package/src/standalone/bridge-tool.mjs +1414 -0
  189. package/src/standalone/channel-admin.mjs +366 -0
  190. package/src/standalone/channel-worker-preload.cjs +3 -0
  191. package/src/standalone/channel-worker.mjs +353 -0
  192. package/src/standalone/explore-tool.mjs +233 -0
  193. package/src/standalone/hook-bus.mjs +246 -0
  194. package/src/standalone/plugin-admin.mjs +247 -0
  195. package/src/standalone/provider-admin.mjs +338 -0
  196. package/src/standalone/seeds.mjs +94 -0
  197. package/src/standalone/usage-dashboard.mjs +510 -0
  198. package/src/tui/App.jsx +5438 -0
  199. package/src/tui/components/AnsiText.jsx +199 -0
  200. package/src/tui/components/ContextPanel.jsx +217 -0
  201. package/src/tui/components/Markdown.jsx +205 -0
  202. package/src/tui/components/MarkdownTable.jsx +204 -0
  203. package/src/tui/components/Message.jsx +103 -0
  204. package/src/tui/components/Picker.jsx +317 -0
  205. package/src/tui/components/PromptInput.jsx +584 -0
  206. package/src/tui/components/QueuedCommands.jsx +47 -0
  207. package/src/tui/components/SlashCommandPalette.jsx +114 -0
  208. package/src/tui/components/Spinner.jsx +317 -0
  209. package/src/tui/components/StatusLine.jsx +87 -0
  210. package/src/tui/components/TextEntryPanel.jsx +323 -0
  211. package/src/tui/components/ToolExecution.jsx +772 -0
  212. package/src/tui/components/TurnDone.jsx +78 -0
  213. package/src/tui/components/UsagePanel.jsx +331 -0
  214. package/src/tui/dist/index.mjs +12359 -0
  215. package/src/tui/engine.mjs +2410 -0
  216. package/src/tui/figures.mjs +50 -0
  217. package/src/tui/hooks/useEngine.mjs +16 -0
  218. package/src/tui/index.jsx +254 -0
  219. package/src/tui/input-editing.mjs +242 -0
  220. package/src/tui/markdown/format-token.mjs +194 -0
  221. package/src/tui/paste-attachments.mjs +198 -0
  222. package/src/tui/runtime/shared/process-shutdown.mjs +1 -0
  223. package/src/tui/spinner-verbs.mjs +45 -0
  224. package/src/tui/theme.mjs +67 -0
  225. package/src/tui/time-format.mjs +53 -0
  226. package/src/ui/ansi.mjs +115 -0
  227. package/src/ui/markdown.mjs +195 -0
  228. package/src/ui/statusline.mjs +730 -0
  229. package/src/ui/tool-card.mjs +101 -0
  230. package/src/vendor/statusline/bin/statusline-lib.mjs +805 -0
  231. package/src/vendor/statusline/bin/statusline-route.mjs +596 -0
  232. package/src/vendor/statusline/scripts/lib/gateway-settings.mjs +285 -0
  233. package/src/vendor/statusline/src/gateway/claude-current.mjs +320 -0
  234. package/src/vendor/statusline/src/gateway/route-meta.mjs +753 -0
  235. package/src/vendor/statusline/src/gateway/session-routes.mjs +244 -0
  236. package/src/workflows/default/WORKFLOW.md +7 -0
  237. package/src/workflows/default/workflow.json +14 -0
  238. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  239. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  240. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  241. package/vendor/ink/build/colorize.d.ts +3 -0
  242. package/vendor/ink/build/colorize.js +48 -0
  243. package/vendor/ink/build/colorize.js.map +1 -0
  244. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  245. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  246. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  247. package/vendor/ink/build/components/AnimationContext.d.ts +9 -0
  248. package/vendor/ink/build/components/AnimationContext.js +13 -0
  249. package/vendor/ink/build/components/AnimationContext.js.map +1 -0
  250. package/vendor/ink/build/components/App.d.ts +24 -0
  251. package/vendor/ink/build/components/App.js +554 -0
  252. package/vendor/ink/build/components/App.js.map +1 -0
  253. package/vendor/ink/build/components/AppContext.d.ts +80 -0
  254. package/vendor/ink/build/components/AppContext.js +25 -0
  255. package/vendor/ink/build/components/AppContext.js.map +1 -0
  256. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  257. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  258. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  259. package/vendor/ink/build/components/Box.d.ts +130 -0
  260. package/vendor/ink/build/components/Box.js +34 -0
  261. package/vendor/ink/build/components/Box.js.map +1 -0
  262. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  263. package/vendor/ink/build/components/CursorContext.js +8 -0
  264. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  265. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  266. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  267. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  268. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  269. package/vendor/ink/build/components/ErrorOverview.js +90 -0
  270. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  271. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  272. package/vendor/ink/build/components/FocusContext.js +17 -0
  273. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  274. package/vendor/ink/build/components/Newline.d.ts +13 -0
  275. package/vendor/ink/build/components/Newline.js +8 -0
  276. package/vendor/ink/build/components/Newline.js.map +1 -0
  277. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  278. package/vendor/ink/build/components/Spacer.js +11 -0
  279. package/vendor/ink/build/components/Spacer.js.map +1 -0
  280. package/vendor/ink/build/components/Static.d.ts +24 -0
  281. package/vendor/ink/build/components/Static.js +28 -0
  282. package/vendor/ink/build/components/Static.js.map +1 -0
  283. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  284. package/vendor/ink/build/components/StderrContext.js +13 -0
  285. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  286. package/vendor/ink/build/components/StdinContext.d.ts +28 -0
  287. package/vendor/ink/build/components/StdinContext.js +20 -0
  288. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  289. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  290. package/vendor/ink/build/components/StdoutContext.js +13 -0
  291. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  292. package/vendor/ink/build/components/Text.d.ts +55 -0
  293. package/vendor/ink/build/components/Text.js +50 -0
  294. package/vendor/ink/build/components/Text.js.map +1 -0
  295. package/vendor/ink/build/components/Transform.d.ts +16 -0
  296. package/vendor/ink/build/components/Transform.js +15 -0
  297. package/vendor/ink/build/components/Transform.js.map +1 -0
  298. package/vendor/ink/build/cursor-helpers.d.ts +39 -0
  299. package/vendor/ink/build/cursor-helpers.js +62 -0
  300. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  301. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  302. package/vendor/ink/build/devtools-window-polyfill.js +68 -0
  303. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  304. package/vendor/ink/build/devtools.d.ts +1 -0
  305. package/vendor/ink/build/devtools.js +36 -0
  306. package/vendor/ink/build/devtools.js.map +1 -0
  307. package/vendor/ink/build/dom.d.ts +62 -0
  308. package/vendor/ink/build/dom.js +143 -0
  309. package/vendor/ink/build/dom.js.map +1 -0
  310. package/vendor/ink/build/get-max-width.d.ts +3 -0
  311. package/vendor/ink/build/get-max-width.js +10 -0
  312. package/vendor/ink/build/get-max-width.js.map +1 -0
  313. package/vendor/ink/build/hooks/use-animation.d.ts +49 -0
  314. package/vendor/ink/build/hooks/use-animation.js +87 -0
  315. package/vendor/ink/build/hooks/use-animation.js.map +1 -0
  316. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  317. package/vendor/ink/build/hooks/use-app.js +8 -0
  318. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  319. package/vendor/ink/build/hooks/use-box-metrics.d.ts +59 -0
  320. package/vendor/ink/build/hooks/use-box-metrics.js +81 -0
  321. package/vendor/ink/build/hooks/use-box-metrics.js.map +1 -0
  322. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  323. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  324. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  325. package/vendor/ink/build/hooks/use-focus-manager.d.ts +43 -0
  326. package/vendor/ink/build/hooks/use-focus-manager.js +18 -0
  327. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  328. package/vendor/ink/build/hooks/use-focus.d.ts +30 -0
  329. package/vendor/ink/build/hooks/use-focus.js +43 -0
  330. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  331. package/vendor/ink/build/hooks/use-input.d.ts +132 -0
  332. package/vendor/ink/build/hooks/use-input.js +126 -0
  333. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  334. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +6 -0
  335. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +12 -0
  336. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  337. package/vendor/ink/build/hooks/use-paste.d.ts +35 -0
  338. package/vendor/ink/build/hooks/use-paste.js +62 -0
  339. package/vendor/ink/build/hooks/use-paste.js.map +1 -0
  340. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  341. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  342. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  343. package/vendor/ink/build/hooks/use-stdin.d.ts +7 -0
  344. package/vendor/ink/build/hooks/use-stdin.js +9 -0
  345. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  346. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  347. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  348. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  349. package/vendor/ink/build/hooks/use-window-size.d.ts +18 -0
  350. package/vendor/ink/build/hooks/use-window-size.js +22 -0
  351. package/vendor/ink/build/hooks/use-window-size.js.map +1 -0
  352. package/vendor/ink/build/index.d.ts +42 -0
  353. package/vendor/ink/build/index.js +24 -0
  354. package/vendor/ink/build/index.js.map +1 -0
  355. package/vendor/ink/build/ink.d.ts +146 -0
  356. package/vendor/ink/build/ink.js +1022 -0
  357. package/vendor/ink/build/ink.js.map +1 -0
  358. package/vendor/ink/build/input-parser.d.ts +10 -0
  359. package/vendor/ink/build/input-parser.js +194 -0
  360. package/vendor/ink/build/input-parser.js.map +1 -0
  361. package/vendor/ink/build/instances.d.ts +3 -0
  362. package/vendor/ink/build/instances.js +8 -0
  363. package/vendor/ink/build/instances.js.map +1 -0
  364. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  365. package/vendor/ink/build/kitty-keyboard.js +32 -0
  366. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  367. package/vendor/ink/build/log-update.d.ts +20 -0
  368. package/vendor/ink/build/log-update.js +261 -0
  369. package/vendor/ink/build/log-update.js.map +1 -0
  370. package/vendor/ink/build/measure-element.d.ts +20 -0
  371. package/vendor/ink/build/measure-element.js +13 -0
  372. package/vendor/ink/build/measure-element.js.map +1 -0
  373. package/vendor/ink/build/measure-text.d.ts +6 -0
  374. package/vendor/ink/build/measure-text.js +21 -0
  375. package/vendor/ink/build/measure-text.js.map +1 -0
  376. package/vendor/ink/build/output.d.ts +35 -0
  377. package/vendor/ink/build/output.js +328 -0
  378. package/vendor/ink/build/output.js.map +1 -0
  379. package/vendor/ink/build/parse-keypress.d.ts +20 -0
  380. package/vendor/ink/build/parse-keypress.js +495 -0
  381. package/vendor/ink/build/parse-keypress.js.map +1 -0
  382. package/vendor/ink/build/reconciler.d.ts +4 -0
  383. package/vendor/ink/build/reconciler.js +306 -0
  384. package/vendor/ink/build/reconciler.js.map +1 -0
  385. package/vendor/ink/build/render-background.d.ts +4 -0
  386. package/vendor/ink/build/render-background.js +25 -0
  387. package/vendor/ink/build/render-background.js.map +1 -0
  388. package/vendor/ink/build/render-border.d.ts +4 -0
  389. package/vendor/ink/build/render-border.js +84 -0
  390. package/vendor/ink/build/render-border.js.map +1 -0
  391. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  392. package/vendor/ink/build/render-node-to-output.js +162 -0
  393. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  394. package/vendor/ink/build/render-to-string.d.ts +38 -0
  395. package/vendor/ink/build/render-to-string.js +116 -0
  396. package/vendor/ink/build/render-to-string.js.map +1 -0
  397. package/vendor/ink/build/render.d.ts +176 -0
  398. package/vendor/ink/build/render.js +71 -0
  399. package/vendor/ink/build/render.js.map +1 -0
  400. package/vendor/ink/build/renderer.d.ts +8 -0
  401. package/vendor/ink/build/renderer.js +64 -0
  402. package/vendor/ink/build/renderer.js.map +1 -0
  403. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  404. package/vendor/ink/build/sanitize-ansi.js +27 -0
  405. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  406. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  407. package/vendor/ink/build/squash-text-nodes.js +36 -0
  408. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  409. package/vendor/ink/build/styles.d.ts +302 -0
  410. package/vendor/ink/build/styles.js +303 -0
  411. package/vendor/ink/build/styles.js.map +1 -0
  412. package/vendor/ink/build/utils.d.ts +9 -0
  413. package/vendor/ink/build/utils.js +19 -0
  414. package/vendor/ink/build/utils.js.map +1 -0
  415. package/vendor/ink/build/wrap-text.d.ts +3 -0
  416. package/vendor/ink/build/wrap-text.js +38 -0
  417. package/vendor/ink/build/wrap-text.js.map +1 -0
  418. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  419. package/vendor/ink/build/write-synchronized.js +9 -0
  420. package/vendor/ink/build/write-synchronized.js.map +1 -0
  421. package/vendor/ink/license +10 -0
  422. package/vendor/ink/package.json +137 -0
  423. package/.claude-plugin/marketplace.json +0 -34
  424. package/.claude-plugin/plugin.json +0 -20
  425. package/.gitattributes +0 -34
  426. package/.mcp.json +0 -14
  427. package/ARCHITECTURE.md +0 -77
  428. package/CHANGELOG.md +0 -30
  429. package/CONTRIBUTING.md +0 -45
  430. package/DATA-FLOW.md +0 -79
  431. package/LICENSE +0 -21
  432. package/SECURITY.md +0 -138
  433. package/UNINSTALL.md +0 -115
  434. package/agents/maintenance.md +0 -5
  435. package/agents/memory-classification.md +0 -30
  436. package/agents/scheduler-task.md +0 -18
  437. package/agents/webhook-handler.md +0 -27
  438. package/agents/worker.md +0 -24
  439. package/bin/bridge +0 -133
  440. package/bin/statusline-launcher.mjs +0 -82
  441. package/bin/statusline-lib.mjs +0 -581
  442. package/bin/statusline-route.mjs +0 -273
  443. package/bin/statusline.mjs +0 -638
  444. package/bun.lock +0 -927
  445. package/commands/config.md +0 -16
  446. package/commands/doctor.md +0 -13
  447. package/commands/model.md +0 -61
  448. package/commands/setup.md +0 -17
  449. package/defaults/hidden-roles.json +0 -68
  450. package/defaults/memory-chunk-prompt.md +0 -63
  451. package/defaults/mixdog-config.template.json +0 -27
  452. package/defaults/user-workflow.json +0 -8
  453. package/defaults/user-workflow.md +0 -17
  454. package/hooks/hooks.json +0 -73
  455. package/hooks/lib/active-instance.cjs +0 -77
  456. package/hooks/lib/permission-evaluator.cjs +0 -411
  457. package/hooks/lib/permission-route.cjs +0 -63
  458. package/hooks/lib/settings-loader.cjs +0 -117
  459. package/hooks/post-tool-use.cjs +0 -84
  460. package/hooks/pre-mcp-sandbox.cjs +0 -158
  461. package/hooks/pre-tool-subagent.cjs +0 -258
  462. package/hooks/session-start.cjs +0 -1493
  463. package/hooks/shim-launcher.cjs +0 -65
  464. package/hooks/turn-timer.cjs +0 -82
  465. package/lib/claude-md-writer.cjs +0 -386
  466. package/lib/keychain-cjs.cjs +0 -290
  467. package/lib/plugin-paths.cjs +0 -69
  468. package/lib/rules-builder.cjs +0 -241
  469. package/native/README.md +0 -117
  470. package/native/prebuilt/linux-aarch64/mixdog-shim +0 -0
  471. package/native/prebuilt/linux-x86_64/mixdog-shim +0 -0
  472. package/native/prebuilt/macos-aarch64/mixdog-shim +0 -0
  473. package/native/prebuilt/macos-x86_64/mixdog-shim +0 -0
  474. package/native/prebuilt/windows-x86_64/mixdog-shim.exe +0 -0
  475. package/prompts/code-review.txt +0 -16
  476. package/prompts/security-audit.txt +0 -17
  477. package/rules/bridge/00-common.md +0 -39
  478. package/rules/bridge/20-skip-protocol.md +0 -18
  479. package/rules/bridge/30-explorer.md +0 -33
  480. package/rules/bridge/40-cycle1-agent.md +0 -52
  481. package/rules/bridge/41-cycle2-agent.md +0 -62
  482. package/rules/lead/00-tool-lead.md +0 -61
  483. package/rules/lead/01-general.md +0 -26
  484. package/rules/lead/02-channels.md +0 -49
  485. package/rules/lead/03-team.md +0 -27
  486. package/rules/lead/04-workflow.md +0 -20
  487. package/rules/shared/00-language.md +0 -14
  488. package/rules/shared/01-tool.md +0 -138
  489. package/scripts/bootstrap.mjs +0 -130
  490. package/scripts/bridge-unify-smoke.mjs +0 -308
  491. package/scripts/build-runtime-linux.sh +0 -348
  492. package/scripts/build-runtime-macos.sh +0 -217
  493. package/scripts/build-runtime-windows.ps1 +0 -242
  494. package/scripts/builtin-utils-smoke.mjs +0 -398
  495. package/scripts/bump.mjs +0 -80
  496. package/scripts/check-json.mjs +0 -45
  497. package/scripts/check-syntax-changed.mjs +0 -102
  498. package/scripts/check-syntax.mjs +0 -58
  499. package/scripts/code-graph-batch.test.mjs +0 -33
  500. package/scripts/config-preserve-smoke.mjs +0 -180
  501. package/scripts/doctor.mjs +0 -489
  502. package/scripts/edit-normalize-fuzz.mjs +0 -130
  503. package/scripts/edit-normalize-smoke.mjs +0 -401
  504. package/scripts/edit-operation-smoke.mjs +0 -369
  505. package/scripts/edit2-smoke.mjs +0 -63
  506. package/scripts/ensure-deps.mjs +0 -259
  507. package/scripts/fuzzy-e2e.mjs +0 -28
  508. package/scripts/fuzzy-smoke.mjs +0 -26
  509. package/scripts/gateway-model.mjs +0 -596
  510. package/scripts/generate-runtime-manifest.mjs +0 -166
  511. package/scripts/guard-smoke.mjs +0 -66
  512. package/scripts/hidden-role-schema-smoke.mjs +0 -162
  513. package/scripts/hook-routing-smoke.mjs +0 -29
  514. package/scripts/inject-input.ps1 +0 -204
  515. package/scripts/io-complex-smoke.mjs +0 -667
  516. package/scripts/io-explore-bench.mjs +0 -424
  517. package/scripts/io-guardrails-smoke.mjs +0 -205
  518. package/scripts/io-mini-bench-baseline.json +0 -11
  519. package/scripts/io-mini-bench.mjs +0 -216
  520. package/scripts/io-route-harness.mjs +0 -933
  521. package/scripts/io-telemetry-report.mjs +0 -691
  522. package/scripts/lib/gateway-inventory.mjs +0 -178
  523. package/scripts/lib/gateway-settings.mjs +0 -78
  524. package/scripts/mutation-bench.mjs +0 -564
  525. package/scripts/mutation-io-smoke.mjs +0 -1097
  526. package/scripts/native-patch-bridge-smoke.mjs +0 -288
  527. package/scripts/native-patch-smoke.mjs +0 -304
  528. package/scripts/openai-oauth-catalog-smoke.mjs +0 -53
  529. package/scripts/patch-interior-context-smoke.mjs +0 -49
  530. package/scripts/patch-newline-utf8-smoke.mjs +0 -157
  531. package/scripts/perf-hook-smoke.mjs +0 -71
  532. package/scripts/permission-eval-smoke.mjs +0 -443
  533. package/scripts/prep-patch.mjs +0 -53
  534. package/scripts/prep-shim.mjs +0 -96
  535. package/scripts/provider-cache-smoke.mjs +0 -687
  536. package/scripts/report-runtime-health.mjs +0 -132
  537. package/scripts/resolve-bun.mjs +0 -60
  538. package/scripts/run-mcp.mjs +0 -1473
  539. package/scripts/salvage-v4a-shatter.test.mjs +0 -58
  540. package/scripts/scoped-cache-io-smoke.mjs +0 -103
  541. package/scripts/shell-policy-round3-smoke.mjs +0 -46
  542. package/scripts/smoke-runtime-negative.ps1 +0 -100
  543. package/scripts/smoke-runtime-negative.sh +0 -95
  544. package/scripts/stall-policy-smoke.mjs +0 -50
  545. package/scripts/start-memory-worker.mjs +0 -23
  546. package/scripts/statusline-launcher-smoke.mjs +0 -235
  547. package/scripts/stress-atomic-write.mjs +0 -1028
  548. package/scripts/test-fault-inject.mjs +0 -164
  549. package/scripts/test-large-file.mjs +0 -174
  550. package/scripts/tool-edge-smoke.mjs +0 -209
  551. package/scripts/uninstall.mjs +0 -238
  552. package/scripts/webhook-selfheal-smoke.mjs +0 -27
  553. package/scripts/write-overwrite-guard-smoke.mjs +0 -56
  554. package/server-main.mjs +0 -3350
  555. package/server.mjs +0 -468
  556. package/setup/config-merge.mjs +0 -246
  557. package/setup/install.mjs +0 -574
  558. package/setup/launch-core.mjs +0 -617
  559. package/setup/launch.mjs +0 -101
  560. package/setup/locate-claude.mjs +0 -56
  561. package/setup/mixdog-cli.mjs +0 -122
  562. package/setup/setup-server.mjs +0 -3305
  563. package/setup/setup.html +0 -3740
  564. package/setup/tui.mjs +0 -325
  565. package/skills/retro-skill-proposer/SKILL.md +0 -92
  566. package/skills/schedule-add/SKILL.md +0 -77
  567. package/skills/setup/SKILL.md +0 -356
  568. package/skills/webhook-add/SKILL.md +0 -81
  569. package/src/agent/bridge-stall-watchdog.mjs +0 -337
  570. package/src/agent/index.mjs +0 -2229
  571. package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +0 -1010
  572. package/src/agent/orchestrator/bridge-retry.mjs +0 -220
  573. package/src/agent/orchestrator/bridge-trace.mjs +0 -601
  574. package/src/agent/orchestrator/cache-mtime.mjs +0 -58
  575. package/src/agent/orchestrator/config.mjs +0 -405
  576. package/src/agent/orchestrator/context/collect.mjs +0 -651
  577. package/src/agent/orchestrator/dispatch-persist.mjs +0 -549
  578. package/src/agent/orchestrator/drain-registry.mjs +0 -50
  579. package/src/agent/orchestrator/explore-validator.mjs +0 -8
  580. package/src/agent/orchestrator/internal-roles.mjs +0 -118
  581. package/src/agent/orchestrator/internal-tools.mjs +0 -88
  582. package/src/agent/orchestrator/jobs.mjs +0 -116
  583. package/src/agent/orchestrator/mcp/client.mjs +0 -364
  584. package/src/agent/orchestrator/providers/anthropic-oauth.mjs +0 -1884
  585. package/src/agent/orchestrator/providers/anthropic.mjs +0 -598
  586. package/src/agent/orchestrator/providers/gemini.mjs +0 -1530
  587. package/src/agent/orchestrator/providers/grok-oauth.mjs +0 -779
  588. package/src/agent/orchestrator/providers/model-catalog.mjs +0 -374
  589. package/src/agent/orchestrator/providers/openai-compat-stream.mjs +0 -366
  590. package/src/agent/orchestrator/providers/openai-compat.mjs +0 -1511
  591. package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +0 -1891
  592. package/src/agent/orchestrator/providers/openai-oauth.mjs +0 -1456
  593. package/src/agent/orchestrator/providers/openai-ws.mjs +0 -127
  594. package/src/agent/orchestrator/providers/registry.mjs +0 -192
  595. package/src/agent/orchestrator/providers/retry-classifier.mjs +0 -325
  596. package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +0 -142
  597. package/src/agent/orchestrator/session/cache/read-cache.mjs +0 -319
  598. package/src/agent/orchestrator/session/cache/scoped-cache.mjs +0 -361
  599. package/src/agent/orchestrator/session/loop.mjs +0 -1619
  600. package/src/agent/orchestrator/session/manager.mjs +0 -1991
  601. package/src/agent/orchestrator/session/result-classification.mjs +0 -65
  602. package/src/agent/orchestrator/session/store.mjs +0 -632
  603. package/src/agent/orchestrator/session/stream-watchdog.mjs +0 -130
  604. package/src/agent/orchestrator/session/tool-result-offload.mjs +0 -166
  605. package/src/agent/orchestrator/session/trim.mjs +0 -491
  606. package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +0 -115
  607. package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +0 -331
  608. package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +0 -150
  609. package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +0 -228
  610. package/src/agent/orchestrator/smart-bridge/index.mjs +0 -215
  611. package/src/agent/orchestrator/smart-bridge/profiles.mjs +0 -37
  612. package/src/agent/orchestrator/smart-bridge/registry.mjs +0 -348
  613. package/src/agent/orchestrator/stall-policy.mjs +0 -201
  614. package/src/agent/orchestrator/tool-loop-guard.mjs +0 -75
  615. package/src/agent/orchestrator/tools/bash-session.mjs +0 -722
  616. package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +0 -511
  617. package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -480
  618. package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +0 -256
  619. package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +0 -58
  620. package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +0 -240
  621. package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +0 -113
  622. package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +0 -74
  623. package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +0 -242
  624. package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +0 -211
  625. package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +0 -1364
  626. package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +0 -126
  627. package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +0 -141
  628. package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +0 -194
  629. package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +0 -60
  630. package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +0 -168
  631. package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +0 -173
  632. package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +0 -48
  633. package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +0 -99
  634. package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +0 -193
  635. package/src/agent/orchestrator/tools/builtin/list-tool.mjs +0 -597
  636. package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +0 -110
  637. package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +0 -300
  638. package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +0 -152
  639. package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -118
  640. package/src/agent/orchestrator/tools/builtin/read-open.mjs +0 -190
  641. package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +0 -728
  642. package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +0 -173
  643. package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +0 -602
  644. package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +0 -196
  645. package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +0 -422
  646. package/src/agent/orchestrator/tools/builtin/search-builders.mjs +0 -158
  647. package/src/agent/orchestrator/tools/builtin/search-tool.mjs +0 -869
  648. package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +0 -962
  649. package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +0 -223
  650. package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +0 -206
  651. package/src/agent/orchestrator/tools/builtin/write-tool.mjs +0 -401
  652. package/src/agent/orchestrator/tools/builtin.mjs +0 -503
  653. package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +0 -24
  654. package/src/agent/orchestrator/tools/code-graph.mjs +0 -4095
  655. package/src/agent/orchestrator/tools/cwd-tool.mjs +0 -298
  656. package/src/agent/orchestrator/tools/destructive-warning.mjs +0 -323
  657. package/src/agent/orchestrator/tools/edit-normalize.mjs +0 -603
  658. package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +0 -154
  659. package/src/agent/orchestrator/tools/graph-manifest.json +0 -26
  660. package/src/agent/orchestrator/tools/host-input.mjs +0 -204
  661. package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +0 -143
  662. package/src/agent/orchestrator/tools/patch-manifest.json +0 -26
  663. package/src/agent/orchestrator/tools/patch-tool-defs.mjs +0 -20
  664. package/src/agent/orchestrator/tools/patch.mjs +0 -2754
  665. package/src/agent/orchestrator/tools/progress-message.mjs +0 -118
  666. package/src/agent/orchestrator/tools/shell-command.mjs +0 -865
  667. package/src/agent/orchestrator/tools/shell-policy-imports.mjs +0 -7
  668. package/src/agent/orchestrator/tools/shell-snapshot.mjs +0 -313
  669. package/src/agent/orchestrator/workflow-store.mjs +0 -93
  670. package/src/agent/tool-defs.mjs +0 -110
  671. package/src/channels/backends/discord.mjs +0 -784
  672. package/src/channels/data/voice-runtime-manifest.json +0 -138
  673. package/src/channels/index.mjs +0 -3268
  674. package/src/channels/lib/config.mjs +0 -292
  675. package/src/channels/lib/drop-trace.mjs +0 -71
  676. package/src/channels/lib/event-pipeline.mjs +0 -81
  677. package/src/channels/lib/holidays.mjs +0 -138
  678. package/src/channels/lib/hook-pipe-server.mjs +0 -822
  679. package/src/channels/lib/output-forwarder.mjs +0 -765
  680. package/src/channels/lib/runtime-paths.mjs +0 -552
  681. package/src/channels/lib/scheduler.mjs +0 -723
  682. package/src/channels/lib/session-discovery.mjs +0 -103
  683. package/src/channels/lib/state-file.mjs +0 -68
  684. package/src/channels/lib/status-snapshot.mjs +0 -219
  685. package/src/channels/lib/tool-format.mjs +0 -140
  686. package/src/channels/lib/transcript-discovery.mjs +0 -195
  687. package/src/channels/lib/voice-runtime-fetcher.mjs +0 -734
  688. package/src/channels/lib/webhook.mjs +0 -1318
  689. package/src/channels/tool-defs.mjs +0 -170
  690. package/src/daemon/host.mjs +0 -118
  691. package/src/daemon/mcp-transport.mjs +0 -47
  692. package/src/daemon/session.mjs +0 -100
  693. package/src/daemon/thin-client.mjs +0 -71
  694. package/src/daemon/transport.mjs +0 -163
  695. package/src/gateway/claude-current.mjs +0 -255
  696. package/src/gateway/oauth-usage.mjs +0 -598
  697. package/src/gateway/route-meta.mjs +0 -629
  698. package/src/gateway/server.mjs +0 -713
  699. package/src/memory/data/runtime-manifest.json +0 -40
  700. package/src/memory/index.mjs +0 -3332
  701. package/src/memory/lib/core-memory-store.mjs +0 -330
  702. package/src/memory/lib/embedding-provider.mjs +0 -269
  703. package/src/memory/lib/embedding-worker.mjs +0 -323
  704. package/src/memory/lib/memory-cycle1.mjs +0 -645
  705. package/src/memory/lib/memory-cycle2.mjs +0 -1284
  706. package/src/memory/lib/memory-cycle3.mjs +0 -540
  707. package/src/memory/lib/memory-embed.mjs +0 -299
  708. package/src/memory/lib/memory-ops-policy.mjs +0 -190
  709. package/src/memory/lib/memory-recall-store.mjs +0 -638
  710. package/src/memory/lib/memory.mjs +0 -412
  711. package/src/memory/lib/pg/adapter.mjs +0 -308
  712. package/src/memory/lib/pg/process.mjs +0 -360
  713. package/src/memory/lib/pg/supervisor.mjs +0 -396
  714. package/src/memory/lib/runtime-fetcher.mjs +0 -458
  715. package/src/memory/lib/trace-store.mjs +0 -728
  716. package/src/memory/tool-defs.mjs +0 -79
  717. package/src/search/index.mjs +0 -1173
  718. package/src/search/lib/backends/anthropic-oauth.mjs +0 -98
  719. package/src/search/lib/backends/exa.mjs +0 -50
  720. package/src/search/lib/backends/firecrawl.mjs +0 -61
  721. package/src/search/lib/backends/gemini-api.mjs +0 -83
  722. package/src/search/lib/backends/grok-oauth.mjs +0 -86
  723. package/src/search/lib/backends/index.mjs +0 -150
  724. package/src/search/lib/backends/openai-api.mjs +0 -144
  725. package/src/search/lib/backends/openai-oauth.mjs +0 -102
  726. package/src/search/lib/backends/openai-web-search.mjs +0 -76
  727. package/src/search/lib/backends/tavily.mjs +0 -55
  728. package/src/search/lib/backends/xai-api.mjs +0 -113
  729. package/src/search/lib/config.mjs +0 -192
  730. package/src/search/lib/provider-usage.mjs +0 -67
  731. package/src/search/lib/providers.mjs +0 -47
  732. package/src/search/lib/search-intent.mjs +0 -109
  733. package/src/search/lib/setup-handler.mjs +0 -261
  734. package/src/search/lib/web-tools.mjs +0 -1219
  735. package/src/search/tool-defs.mjs +0 -83
  736. package/src/setup/defender-exclusion.mjs +0 -183
  737. package/src/shared/atomic-file.mjs +0 -436
  738. package/src/shared/config.mjs +0 -372
  739. package/src/shared/daemon-recycle.mjs +0 -108
  740. package/src/shared/disable-claude-builtins.mjs +0 -91
  741. package/src/shared/err-text.mjs +0 -12
  742. package/src/shared/llm/http-agent.mjs +0 -123
  743. package/src/shared/open-url.mjs +0 -62
  744. package/src/shared/plugin-paths.mjs +0 -58
  745. package/src/shared/schedules-store.mjs +0 -70
  746. package/src/shared/seed.mjs +0 -161
  747. package/src/shared/user-cwd.mjs +0 -225
  748. package/src/shared/user-data-guard.mjs +0 -244
  749. package/src/status/aggregator.mjs +0 -584
  750. package/src/status/server.mjs +0 -413
  751. package/tools.json +0 -1671
  752. /package/{defaults → src/defaults}/cycle3-review-prompt.md +0 -0
  753. /package/{defaults → src/defaults}/memory-promote-prompt.md +0 -0
  754. /package/{hooks → src/hooks}/lib/permission-rules.cjs +0 -0
  755. /package/{lib → src/lib}/config-cjs.cjs +0 -0
  756. /package/{lib → src/lib}/hook-pipe-path.cjs +0 -0
  757. /package/{lib → src/lib}/mixdog-debug.cjs +0 -0
  758. /package/{lib → src/lib}/text-utils.cjs +0 -0
  759. /package/{rules → src/rules}/bridge/42-cycle3-agent.md +0 -0
  760. /package/src/{agent → runtime/agent}/orchestrator/activity-bus.mjs +0 -0
  761. /package/src/{agent → runtime/agent}/orchestrator/providers/anthropic-betas.mjs +0 -0
  762. /package/src/{agent → runtime/agent}/orchestrator/session/abort-lookup.mjs +0 -0
  763. /package/src/{agent → runtime/agent}/orchestrator/session/cache/post-edit-marks.mjs +0 -0
  764. /package/src/{agent → runtime/agent}/orchestrator/session/cache/scoped-cache-outcome.mjs +0 -0
  765. /package/src/{agent → runtime/agent}/orchestrator/session/cache/util.mjs +0 -0
  766. /package/src/{agent → runtime/agent}/orchestrator/session/read-dedup.mjs +0 -0
  767. /package/src/{agent → runtime/agent}/orchestrator/session/save-session-worker.mjs +0 -0
  768. /package/src/{agent → runtime/agent}/orchestrator/smart-bridge/session-builder.mjs +0 -0
  769. /package/src/{agent → runtime/agent}/orchestrator/tools/bash-policy-scan.mjs +0 -0
  770. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/advisory-lock.mjs +0 -0
  771. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/atomic-write.mjs +0 -0
  772. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/binary-file.mjs +0 -0
  773. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cache-layers.mjs +0 -0
  774. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cwd-utils.mjs +0 -0
  775. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/device-paths.mjs +0 -0
  776. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -0
  777. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diff-utils.mjs +0 -0
  778. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/fs-reachability.mjs +0 -0
  779. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/grep-formatting.mjs +0 -0
  780. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/hash-utils.mjs +0 -0
  781. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/list-formatting.mjs +0 -0
  782. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/open-config-tool.mjs +0 -0
  783. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-locks.mjs +0 -0
  784. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-utils.mjs +0 -0
  785. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-args.mjs +0 -0
  786. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-batch.mjs +0 -0
  787. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-constants.mjs +0 -0
  788. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image-resize.mjs +0 -0
  789. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image.mjs +0 -0
  790. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-lines.mjs +0 -0
  791. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-mode-tool.mjs +0 -0
  792. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-range-index.mjs +0 -0
  793. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-ranges.mjs +0 -0
  794. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-special-files.mjs +0 -0
  795. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-tool.mjs +0 -0
  796. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-windows.mjs +0 -0
  797. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-analysis.mjs +0 -0
  798. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-output.mjs +0 -0
  799. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-helpers.mjs +0 -0
  800. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-validation.mjs +0 -0
  801. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/text-stats.mjs +0 -0
  802. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/windows-roots.mjs +0 -0
  803. /package/src/{agent → runtime/agent}/orchestrator/tools/code-graph-prewarm-worker.mjs +0 -0
  804. /package/src/{agent → runtime/agent}/orchestrator/tools/env-scrub.mjs +0 -0
  805. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-content-cache.mjs +0 -0
  806. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-planner.mjs +0 -0
  807. /package/src/{agent → runtime/agent}/orchestrator/tools/next-call-utils.mjs +0 -0
  808. /package/src/{agent → runtime/agent}/orchestrator/tools/result-compression.mjs +0 -0
  809. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-exec-policy.mjs +0 -0
  810. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy-danger-target.mjs +0 -0
  811. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy.mjs +0 -0
  812. /package/src/{channels → runtime/channels}/lib/cli-worker-host.mjs +0 -0
  813. /package/src/{channels → runtime/channels}/lib/config-lock.mjs +0 -0
  814. /package/src/{channels → runtime/channels}/lib/event-queue.mjs +0 -0
  815. /package/src/{channels → runtime/channels}/lib/executor.mjs +0 -0
  816. /package/src/{channels → runtime/channels}/lib/format.mjs +0 -0
  817. /package/src/{channels → runtime/channels}/lib/interaction-workflows.mjs +0 -0
  818. /package/src/{channels → runtime/channels}/lib/memory-client.mjs +0 -0
  819. /package/src/{channels → runtime/channels}/lib/session-control.mjs +0 -0
  820. /package/src/{channels → runtime/channels}/lib/settings.mjs +0 -0
  821. /package/src/{channels → runtime/channels}/lib/whisper-server.mjs +0 -0
  822. /package/src/{memory → runtime/memory}/lib/agent-ipc.mjs +0 -0
  823. /package/src/{memory → runtime/memory}/lib/bridge-trace-queries.mjs +0 -0
  824. /package/src/{memory → runtime/memory}/lib/llm-worker-host.mjs +0 -0
  825. /package/src/{memory → runtime/memory}/lib/memory-cycle.mjs +0 -0
  826. /package/src/{memory → runtime/memory}/lib/memory-extraction.mjs +0 -0
  827. /package/src/{memory → runtime/memory}/lib/memory-maintenance-store.mjs +0 -0
  828. /package/src/{memory → runtime/memory}/lib/memory-recall-id-patch.mjs +0 -0
  829. /package/src/{memory → runtime/memory}/lib/memory-recall-read-query.mjs +0 -0
  830. /package/src/{memory → runtime/memory}/lib/memory-recall-scope-filter.mjs +0 -0
  831. /package/src/{memory → runtime/memory}/lib/memory-retrievers.mjs +0 -0
  832. /package/src/{memory → runtime/memory}/lib/memory-score.mjs +0 -0
  833. /package/src/{memory → runtime/memory}/lib/memory-text-utils.mjs +0 -0
  834. /package/src/{memory → runtime/memory}/lib/model-profile.mjs +0 -0
  835. /package/src/{memory → runtime/memory}/lib/project-id-resolver.mjs +0 -0
  836. /package/src/{search → runtime/search}/lib/cache.mjs +0 -0
  837. /package/src/{search → runtime/search}/lib/formatter.mjs +0 -0
  838. /package/src/{search → runtime/search}/lib/state.mjs +0 -0
  839. /package/src/{shared → runtime/shared}/abort-controller.mjs +0 -0
  840. /package/src/{shared → runtime/shared}/llm/cost.mjs +0 -0
  841. /package/src/{shared → runtime/shared}/llm/index.mjs +0 -0
  842. /package/src/{shared → runtime/shared}/llm/pid-cleanup.mjs +0 -0
  843. /package/src/{shared → runtime/shared}/llm/usage-log.mjs +0 -0
  844. /package/src/{shared → runtime/shared}/wsl.mjs +0 -0
@@ -0,0 +1,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
+ };