mixdog 0.7.18 → 0.8.1

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