@ouro.bot/cli 0.1.0-alpha.45 → 0.1.0-alpha.450

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 (339) hide show
  1. package/README.md +127 -19
  2. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -2
  3. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  4. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  5. package/changelog.json +2853 -0
  6. package/dist/arc/attention-types.js +8 -0
  7. package/dist/arc/cares.js +140 -0
  8. package/dist/arc/episodes.js +117 -0
  9. package/dist/arc/intentions.js +133 -0
  10. package/dist/arc/json-store.js +117 -0
  11. package/dist/arc/obligations.js +237 -0
  12. package/dist/arc/packets.js +193 -0
  13. package/dist/arc/presence.js +185 -0
  14. package/dist/arc/task-lifecycle.js +65 -0
  15. package/dist/heart/active-work.js +832 -0
  16. package/dist/heart/agent-entry.js +58 -3
  17. package/dist/heart/attachments/image-normalize.js +194 -0
  18. package/dist/heart/attachments/materialize.js +97 -0
  19. package/dist/heart/attachments/originals.js +88 -0
  20. package/dist/heart/attachments/render.js +29 -0
  21. package/dist/heart/attachments/sources/adapter.js +2 -0
  22. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  23. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  24. package/dist/heart/attachments/sources/index.js +16 -0
  25. package/dist/heart/attachments/store.js +103 -0
  26. package/dist/heart/attachments/types.js +93 -0
  27. package/dist/heart/auth/auth-flow.js +426 -0
  28. package/dist/heart/bridges/manager.js +358 -0
  29. package/dist/heart/bridges/state-machine.js +135 -0
  30. package/dist/heart/bridges/store.js +123 -0
  31. package/dist/heart/bundle-state.js +168 -0
  32. package/dist/heart/commitments.js +111 -0
  33. package/dist/heart/config-registry.js +304 -0
  34. package/dist/heart/config.js +110 -128
  35. package/dist/heart/core.js +745 -227
  36. package/dist/heart/cross-chat-delivery.js +131 -0
  37. package/dist/heart/daemon/agent-config-check.js +490 -0
  38. package/dist/heart/daemon/agent-discovery.js +79 -3
  39. package/dist/heart/daemon/agent-service.js +360 -0
  40. package/dist/heart/daemon/agentic-repair.js +216 -0
  41. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  42. package/dist/heart/daemon/cadence.js +70 -0
  43. package/dist/heart/daemon/cli-defaults.js +631 -0
  44. package/dist/heart/daemon/cli-exec.js +5805 -0
  45. package/dist/heart/daemon/cli-help.js +428 -0
  46. package/dist/heart/daemon/cli-parse.js +1156 -0
  47. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  48. package/dist/heart/daemon/cli-render.js +561 -0
  49. package/dist/heart/daemon/cli-types.js +8 -0
  50. package/dist/heart/daemon/connect-bay.js +323 -0
  51. package/dist/heart/daemon/daemon-cli.js +29 -1617
  52. package/dist/heart/daemon/daemon-entry.js +356 -3
  53. package/dist/heart/daemon/daemon-health.js +141 -0
  54. package/dist/heart/daemon/daemon-runtime-sync.js +190 -12
  55. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  56. package/dist/heart/daemon/daemon.js +684 -58
  57. package/dist/heart/daemon/doctor-types.js +8 -0
  58. package/dist/heart/daemon/doctor.js +427 -0
  59. package/dist/heart/daemon/health-monitor.js +79 -1
  60. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  61. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  62. package/dist/heart/daemon/http-health-probe.js +80 -0
  63. package/dist/heart/daemon/human-command-screens.js +234 -0
  64. package/dist/heart/daemon/human-readiness.js +114 -0
  65. package/dist/heart/daemon/inner-status.js +89 -0
  66. package/dist/heart/daemon/interactive-repair.js +394 -0
  67. package/dist/heart/daemon/launchd.js +25 -5
  68. package/dist/heart/daemon/log-tailer.js +82 -12
  69. package/dist/heart/daemon/logs-prune.js +105 -0
  70. package/dist/heart/daemon/message-router.js +2 -2
  71. package/dist/heart/daemon/os-cron-deps.js +134 -0
  72. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  73. package/dist/heart/daemon/ouro-entry.js +3 -1
  74. package/dist/heart/daemon/process-manager.js +214 -0
  75. package/dist/heart/daemon/provider-discovery.js +137 -0
  76. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  77. package/dist/heart/daemon/pulse.js +475 -0
  78. package/dist/heart/daemon/readiness-repair.js +365 -0
  79. package/dist/heart/daemon/run-hooks.js +2 -0
  80. package/dist/heart/daemon/runtime-logging.js +67 -16
  81. package/dist/heart/daemon/runtime-metadata.js +73 -0
  82. package/dist/heart/daemon/runtime-mode.js +67 -0
  83. package/dist/heart/daemon/safe-mode.js +161 -0
  84. package/dist/heart/daemon/sense-manager.js +123 -34
  85. package/dist/heart/daemon/session-id-resolver.js +131 -0
  86. package/dist/heart/daemon/skill-management-installer.js +94 -0
  87. package/dist/heart/daemon/socket-client.js +307 -0
  88. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  89. package/dist/heart/daemon/startup-tui.js +264 -0
  90. package/dist/heart/daemon/task-scheduler.js +3 -25
  91. package/dist/heart/daemon/terminal-ui.js +499 -0
  92. package/dist/heart/daemon/thoughts.js +510 -0
  93. package/dist/heart/daemon/up-progress.js +366 -0
  94. package/dist/heart/delegation.js +62 -0
  95. package/dist/heart/habits/habit-migration.js +189 -0
  96. package/dist/heart/habits/habit-parser.js +140 -0
  97. package/dist/heart/habits/habit-runtime-state.js +100 -0
  98. package/dist/heart/habits/habit-scheduler.js +372 -0
  99. package/dist/heart/{daemon → hatch}/hatch-flow.js +52 -117
  100. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  101. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  102. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  103. package/dist/heart/identity.js +197 -65
  104. package/dist/heart/kept-notes.js +357 -0
  105. package/dist/heart/kicks.js +1 -1
  106. package/dist/heart/machine-identity.js +161 -0
  107. package/dist/heart/mcp/mcp-server.js +653 -0
  108. package/dist/heart/migrate-config.js +100 -0
  109. package/dist/heart/model-capabilities.js +59 -0
  110. package/dist/heart/outlook/outlook-http-hooks.js +64 -0
  111. package/dist/heart/outlook/outlook-http-response.js +7 -0
  112. package/dist/heart/outlook/outlook-http-routes.js +232 -0
  113. package/dist/heart/outlook/outlook-http-static.js +99 -0
  114. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  115. package/dist/heart/outlook/outlook-http.js +99 -0
  116. package/dist/heart/outlook/outlook-read.js +28 -0
  117. package/dist/heart/outlook/outlook-types.js +27 -0
  118. package/dist/heart/outlook/outlook-view.js +195 -0
  119. package/dist/heart/outlook/readers/agent-machine.js +359 -0
  120. package/dist/heart/outlook/readers/continuity-readers.js +332 -0
  121. package/dist/heart/outlook/readers/runtime-readers.js +644 -0
  122. package/dist/heart/outlook/readers/sessions.js +232 -0
  123. package/dist/heart/outlook/readers/shared.js +111 -0
  124. package/dist/heart/platform.js +81 -0
  125. package/dist/heart/progress-story.js +42 -0
  126. package/dist/heart/provider-attempt.js +134 -0
  127. package/dist/heart/provider-binding-resolver.js +255 -0
  128. package/dist/heart/provider-credentials.js +424 -0
  129. package/dist/heart/provider-failover.js +266 -0
  130. package/dist/heart/provider-models.js +81 -0
  131. package/dist/heart/provider-ping.js +262 -0
  132. package/dist/heart/provider-state.js +216 -0
  133. package/dist/heart/provider-visibility.js +188 -0
  134. package/dist/heart/providers/anthropic-token.js +131 -0
  135. package/dist/heart/providers/anthropic.js +193 -55
  136. package/dist/heart/providers/azure.js +103 -12
  137. package/dist/heart/providers/error-classification.js +63 -0
  138. package/dist/heart/providers/github-copilot.js +145 -0
  139. package/dist/heart/providers/minimax-vlm.js +189 -0
  140. package/dist/heart/providers/minimax.js +29 -7
  141. package/dist/heart/providers/openai-codex.js +62 -38
  142. package/dist/heart/runtime-capability-check.js +170 -0
  143. package/dist/heart/runtime-credentials.js +260 -0
  144. package/dist/heart/sense-truth.js +3 -0
  145. package/dist/heart/session-activity.js +190 -0
  146. package/dist/heart/session-events.js +855 -0
  147. package/dist/heart/session-transcript.js +167 -0
  148. package/dist/heart/start-of-turn-packet.js +345 -0
  149. package/dist/heart/streaming.js +36 -27
  150. package/dist/heart/sync.js +332 -0
  151. package/dist/heart/target-resolution.js +127 -0
  152. package/dist/heart/tempo.js +93 -0
  153. package/dist/heart/temporal-view.js +41 -0
  154. package/dist/heart/tool-activity-callbacks.js +36 -0
  155. package/dist/heart/tool-description.js +135 -0
  156. package/dist/heart/tool-friction.js +55 -0
  157. package/dist/heart/tool-loop.js +200 -0
  158. package/dist/heart/turn-context.js +351 -0
  159. package/dist/heart/turn-coordinator.js +28 -0
  160. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
  161. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  162. package/dist/heart/versioning/ouro-path-installer.js +425 -0
  163. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  164. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  165. package/dist/heart/{daemon → versioning}/update-checker.js +5 -1
  166. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  167. package/dist/mind/bundle-manifest.js +7 -1
  168. package/dist/mind/context.js +132 -93
  169. package/dist/mind/diary-integrity.js +60 -0
  170. package/dist/mind/{memory.js → diary.js} +74 -93
  171. package/dist/mind/embedding-provider.js +60 -0
  172. package/dist/mind/file-state.js +179 -0
  173. package/dist/mind/friends/channel.js +21 -0
  174. package/dist/mind/friends/group-context.js +144 -0
  175. package/dist/mind/friends/resolver.js +38 -1
  176. package/dist/mind/friends/store-file.js +39 -3
  177. package/dist/mind/friends/trust-explanation.js +74 -0
  178. package/dist/mind/friends/types.js +1 -1
  179. package/dist/mind/journal-index.js +161 -0
  180. package/dist/mind/note-search.js +268 -0
  181. package/dist/mind/obligation-steering.js +221 -0
  182. package/dist/mind/pending.js +66 -7
  183. package/dist/mind/prompt-refresh.js +3 -2
  184. package/dist/mind/prompt.js +947 -165
  185. package/dist/mind/provenance-trust.js +26 -0
  186. package/dist/mind/scrutiny.js +173 -0
  187. package/dist/nerves/cli-logging.js +7 -1
  188. package/dist/nerves/coverage/audit-rules.js +15 -6
  189. package/dist/nerves/coverage/audit.js +28 -2
  190. package/dist/nerves/coverage/cli.js +1 -1
  191. package/dist/nerves/coverage/contract.js +5 -5
  192. package/dist/nerves/coverage/file-completeness.js +83 -5
  193. package/dist/nerves/coverage/run-artifacts.js +1 -1
  194. package/dist/nerves/event-buffer.js +111 -0
  195. package/dist/nerves/index.js +224 -4
  196. package/dist/nerves/observation.js +20 -0
  197. package/dist/nerves/redact.js +79 -0
  198. package/dist/nerves/runtime.js +5 -1
  199. package/dist/outlook-ui/assets/index-BAcU08c-.css +1 -0
  200. package/dist/outlook-ui/assets/index-D7l3l4vY.js +61 -0
  201. package/dist/outlook-ui/index.html +15 -0
  202. package/dist/repertoire/ado-client.js +15 -56
  203. package/dist/repertoire/ado-semantic.js +11 -10
  204. package/dist/repertoire/api-client.js +97 -0
  205. package/dist/repertoire/bitwarden-store.js +774 -0
  206. package/dist/repertoire/bundle-templates.js +72 -0
  207. package/dist/repertoire/bw-installer.js +180 -0
  208. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  209. package/dist/repertoire/coding/context-pack.js +330 -0
  210. package/dist/repertoire/coding/feedback.js +197 -30
  211. package/dist/repertoire/coding/manager.js +158 -9
  212. package/dist/repertoire/coding/spawner.js +55 -9
  213. package/dist/repertoire/coding/tools.js +170 -7
  214. package/dist/repertoire/commerce-errors.js +109 -0
  215. package/dist/repertoire/commerce-self-test.js +156 -0
  216. package/dist/repertoire/credential-access.js +111 -0
  217. package/dist/repertoire/duffel-client.js +185 -0
  218. package/dist/repertoire/github-client.js +14 -55
  219. package/dist/repertoire/graph-client.js +11 -52
  220. package/dist/repertoire/guardrails.js +371 -0
  221. package/dist/repertoire/mcp-client.js +255 -0
  222. package/dist/repertoire/mcp-manager.js +305 -0
  223. package/dist/repertoire/mcp-tools.js +63 -0
  224. package/dist/repertoire/shell-sessions.js +133 -0
  225. package/dist/repertoire/skills.js +15 -24
  226. package/dist/repertoire/stripe-client.js +131 -0
  227. package/dist/repertoire/tasks/board.js +43 -5
  228. package/dist/repertoire/tasks/fix.js +182 -0
  229. package/dist/repertoire/tasks/index.js +37 -4
  230. package/dist/repertoire/tasks/lifecycle.js +2 -2
  231. package/dist/repertoire/tasks/parser.js +3 -2
  232. package/dist/repertoire/tasks/scanner.js +194 -37
  233. package/dist/repertoire/tasks/transitions.js +16 -78
  234. package/dist/repertoire/tool-results.js +29 -0
  235. package/dist/repertoire/tools-attachments.js +317 -0
  236. package/dist/repertoire/tools-base.js +42 -690
  237. package/dist/repertoire/tools-bluebubbles.js +1 -0
  238. package/dist/repertoire/tools-bridge.js +141 -0
  239. package/dist/repertoire/tools-bundle.js +984 -0
  240. package/dist/repertoire/tools-config.js +185 -0
  241. package/dist/repertoire/tools-continuity.js +248 -0
  242. package/dist/repertoire/tools-credential.js +361 -0
  243. package/dist/repertoire/tools-files.js +342 -0
  244. package/dist/repertoire/tools-flight.js +224 -0
  245. package/dist/repertoire/tools-flow.js +105 -0
  246. package/dist/repertoire/tools-github.js +1 -7
  247. package/dist/repertoire/tools-notes.js +376 -0
  248. package/dist/repertoire/tools-session.js +739 -0
  249. package/dist/repertoire/tools-shell.js +120 -0
  250. package/dist/repertoire/tools-stripe.js +180 -0
  251. package/dist/repertoire/tools-surface.js +243 -0
  252. package/dist/repertoire/tools-teams.js +9 -39
  253. package/dist/repertoire/tools-travel.js +125 -0
  254. package/dist/repertoire/tools-user-profile.js +144 -0
  255. package/dist/repertoire/tools-vault.js +40 -0
  256. package/dist/repertoire/tools.js +144 -113
  257. package/dist/repertoire/travel-api-client.js +360 -0
  258. package/dist/repertoire/user-profile.js +131 -0
  259. package/dist/repertoire/vault-setup.js +246 -0
  260. package/dist/repertoire/vault-unlock.js +561 -0
  261. package/dist/scripts/claude-code-hook.js +41 -0
  262. package/dist/scripts/claude-code-stop-hook.js +47 -0
  263. package/dist/senses/attention-queue.js +116 -0
  264. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  265. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  266. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  267. package/dist/senses/bluebubbles/entry.js +73 -0
  268. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +7 -3
  269. package/dist/senses/bluebubbles/index.js +1620 -0
  270. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  271. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  272. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  273. package/dist/senses/bluebubbles/replay.js +129 -0
  274. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +2 -2
  275. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  276. package/dist/senses/cli/bracketed-paste.js +82 -0
  277. package/dist/senses/cli/image-paste.js +287 -0
  278. package/dist/senses/cli/image-ref-navigation.js +75 -0
  279. package/dist/senses/cli/ink-app.js +156 -0
  280. package/dist/senses/cli/inline-diff.js +64 -0
  281. package/dist/senses/cli/input-keys.js +174 -0
  282. package/dist/senses/cli/kill-ring.js +86 -0
  283. package/dist/senses/cli/message-list.js +51 -0
  284. package/dist/senses/cli/ouro-tui.js +605 -0
  285. package/dist/senses/cli/spinner-imperative.js +135 -0
  286. package/dist/senses/cli/spinner.js +101 -0
  287. package/dist/senses/cli/status-line.js +60 -0
  288. package/dist/senses/cli/streaming-markdown.js +526 -0
  289. package/dist/senses/cli/tool-display.js +83 -0
  290. package/dist/senses/cli/tool-render.js +85 -0
  291. package/dist/senses/cli/tui-store.js +240 -0
  292. package/dist/senses/cli/virtual-list.js +35 -0
  293. package/dist/senses/cli-entry.js +60 -8
  294. package/dist/senses/cli-layout.js +187 -0
  295. package/dist/senses/cli.js +516 -211
  296. package/dist/senses/commands.js +66 -3
  297. package/dist/senses/habit-turn-message.js +108 -0
  298. package/dist/senses/inner-dialog-worker.js +102 -19
  299. package/dist/senses/inner-dialog.js +597 -95
  300. package/dist/senses/pipeline.js +533 -72
  301. package/dist/senses/proactive-content-guard.js +51 -0
  302. package/dist/senses/shared-turn.js +205 -0
  303. package/dist/senses/surface-tool.js +68 -0
  304. package/dist/senses/teams-entry.js +60 -8
  305. package/dist/senses/teams.js +413 -163
  306. package/dist/senses/trust-gate.js +5 -5
  307. package/package.json +32 -7
  308. package/skills/agent-commerce.md +106 -0
  309. package/skills/browser-navigation.md +117 -0
  310. package/skills/commerce-setup-guide.md +116 -0
  311. package/skills/commerce-setup.md +84 -0
  312. package/skills/configure-dev-tools.md +101 -0
  313. package/skills/travel-planning.md +138 -0
  314. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  315. package/dist/heart/daemon/subagent-installer.js +0 -166
  316. package/dist/mind/associative-recall.js +0 -209
  317. package/dist/senses/bluebubbles-entry.js +0 -13
  318. package/dist/senses/bluebubbles.js +0 -1028
  319. package/dist/senses/debug-activity.js +0 -127
  320. package/subagents/README.md +0 -86
  321. package/subagents/work-doer.md +0 -237
  322. package/subagents/work-merger.md +0 -618
  323. package/subagents/work-planner.md +0 -390
  324. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  325. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  326. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  327. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  328. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  329. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  330. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  331. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  332. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  333. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  334. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  335. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  336. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  337. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  338. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  339. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -39,6 +39,7 @@ const path = __importStar(require("path"));
39
39
  const identity_1 = require("../identity");
40
40
  const runtime_1 = require("../../nerves/runtime");
41
41
  const parser_1 = require("../../repertoire/tasks/parser");
42
+ const cadence_1 = require("./cadence");
42
43
  function walkMarkdownFiles(root, readdirSync, existsSync, files) {
43
44
  if (!existsSync(root))
44
45
  return;
@@ -53,29 +54,6 @@ function walkMarkdownFiles(root, readdirSync, existsSync, files) {
53
54
  }
54
55
  }
55
56
  }
56
- function parseCadence(raw) {
57
- if (typeof raw !== "string")
58
- return null;
59
- const value = raw.trim();
60
- if (!value)
61
- return null;
62
- // Cron format (minute hour day month weekday)
63
- if (/^\S+\s+\S+\s+\S+\s+\S+\s+\S+$/.test(value)) {
64
- return value;
65
- }
66
- const cadenceMatch = /^(\d+)(m|h|d)$/.exec(value);
67
- if (!cadenceMatch)
68
- return null;
69
- const interval = Number.parseInt(cadenceMatch[1], 10);
70
- if (!Number.isFinite(interval) || interval <= 0)
71
- return null;
72
- const unit = cadenceMatch[2];
73
- if (unit === "m")
74
- return `*/${interval} * * * *`;
75
- if (unit === "h")
76
- return `0 */${interval} * * *`;
77
- return `0 0 */${interval} * *`;
78
- }
79
57
  function parseScheduledAt(raw) {
80
58
  if (typeof raw !== "string")
81
59
  return null;
@@ -140,7 +118,7 @@ class TaskDrivenScheduler {
140
118
  const nextTaskPaths = new Map();
141
119
  for (const agent of this.agents) {
142
120
  const taskRoot = path.join(this.bundlesRoot, `${agent}.ouro`, "tasks");
143
- const collections = ["one-shots", "ongoing", "habits"];
121
+ const collections = ["one-shots", "ongoing"];
144
122
  const files = [];
145
123
  for (const collection of collections) {
146
124
  walkMarkdownFiles(path.join(taskRoot, collection), this.readdirSync, this.existsSync, files);
@@ -157,7 +135,7 @@ class TaskDrivenScheduler {
157
135
  nextTaskPaths.set(`${agent}:${taskId}`, filePath);
158
136
  if (task.status === "done")
159
137
  continue;
160
- const cadence = parseCadence(task.frontmatter.cadence);
138
+ const cadence = (0, cadence_1.parseCadenceToCron)(task.frontmatter.cadence);
161
139
  if (cadence) {
162
140
  const id = `${agent}:${taskId}:cadence`;
163
141
  nextJobs.set(id, {
@@ -0,0 +1,499 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stripAnsi = stripAnsi;
4
+ exports.visibleLength = visibleLength;
5
+ exports.padAnsi = padAnsi;
6
+ exports.wrapPlain = wrapPlain;
7
+ exports.renderOverwriteFrame = renderOverwriteFrame;
8
+ exports.renderOuroMasthead = renderOuroMasthead;
9
+ exports.formatActionActorLabel = formatActionActorLabel;
10
+ exports.renderTerminalWizard = renderTerminalWizard;
11
+ exports.renderTerminalBoard = renderTerminalBoard;
12
+ exports.renderTerminalGuide = renderTerminalGuide;
13
+ exports.renderTerminalOperation = renderTerminalOperation;
14
+ const runtime_1 = require("../../nerves/runtime");
15
+ const RESET = "\x1b[0m";
16
+ const BOLD = "\x1b[1m";
17
+ const CANOPY = "\x1b[38;2;30;61;40m";
18
+ const SCALE = "\x1b[38;2;45;148;71m";
19
+ const GLOW = "\x1b[38;2;74;227;108m";
20
+ const BONE = "\x1b[38;2;237;242;238m";
21
+ const MIST = "\x1b[38;2;154;174;159m";
22
+ const ALERT = "\x1b[38;2;255;106;106m";
23
+ const ANSI_RE = /\x1b\[[0-9;]*m/g;
24
+ const MASTHEAD_WORD = "OUROBOROS";
25
+ const CLASSIC_WORDMARK_GLYPHS = {
26
+ O: [" ___ ", " / _ \\ ", "| | | |", "| |_| |", " \\___/ "],
27
+ U: [" _ _ ", "| | | |", "| | | |", "| |_| |", " \\___/ "],
28
+ R: [" ____ ", "| _ \\ ", "| |_) |", "| _ < ", "|_| \\_\\"],
29
+ B: [" ____ ", "| __ ) ", "| _ \\ ", "| |_) |", "|____/ "],
30
+ S: [" ____ ", "/ ___| ", "\\___ \\ ", " ___) |", "|____/ "],
31
+ };
32
+ function color(text, tone, bold = false) {
33
+ if (!text)
34
+ return text;
35
+ return `${tone}${bold ? BOLD : ""}${text}${RESET}`;
36
+ }
37
+ function stripAnsi(text) {
38
+ return text.replace(ANSI_RE, "");
39
+ }
40
+ function visibleLength(text) {
41
+ return stripAnsi(text).length;
42
+ }
43
+ function padAnsi(text, width) {
44
+ return `${text}${" ".repeat(Math.max(0, width - visibleLength(text)))}`;
45
+ }
46
+ function wrapPlain(text, width) {
47
+ const normalized = text.trim();
48
+ if (!normalized)
49
+ return [""];
50
+ if (width <= 0)
51
+ return [normalized];
52
+ const words = normalized.split(/\s+/);
53
+ const lines = [];
54
+ let current = "";
55
+ for (const word of words) {
56
+ if (!current) {
57
+ current = word;
58
+ continue;
59
+ }
60
+ const candidate = `${current} ${word}`;
61
+ if (candidate.length <= width) {
62
+ current = candidate;
63
+ continue;
64
+ }
65
+ lines.push(current);
66
+ current = word;
67
+ }
68
+ lines.push(current);
69
+ return lines;
70
+ }
71
+ function plainLine(line) {
72
+ return stripAnsi(line);
73
+ }
74
+ function boardWidth(columns) {
75
+ const requested = columns ?? 88;
76
+ return Math.max(58, Math.min(requested, 96));
77
+ }
78
+ function renderOverwriteFrame(lines, prevLineCount, isTTY) {
79
+ if (!isTTY)
80
+ return `${lines.join("\n")}\n`;
81
+ let output = "";
82
+ if (prevLineCount > 0) {
83
+ output += `\x1b[${prevLineCount}A`;
84
+ }
85
+ for (const line of lines) {
86
+ output += `\x1b[2K${line}\n`;
87
+ }
88
+ const extraLineCount = Math.max(0, prevLineCount - lines.length);
89
+ for (let i = 0; i < extraLineCount; i++) {
90
+ output += "\x1b[2K\n";
91
+ }
92
+ if (extraLineCount > 0) {
93
+ output += `\x1b[${extraLineCount}A`;
94
+ }
95
+ return output;
96
+ }
97
+ function renderPanelTTY(title, lines, width) {
98
+ const innerWidth = Math.max(8, width - 4);
99
+ const topPrefix = `╭─ ${title} `;
100
+ const rule = "─".repeat(Math.max(0, width - topPrefix.length - 1));
101
+ const rendered = [
102
+ `${color("╭─ ", CANOPY)}${color(title, BONE, true)}${color(` ${rule}╮`, CANOPY)}`,
103
+ ];
104
+ for (const line of lines) {
105
+ const wrapped = wrapPlain(plainLine(line), innerWidth);
106
+ for (const wrappedLine of wrapped) {
107
+ rendered.push(`${color("│ ", CANOPY)}${padAnsi(wrappedLine, innerWidth)}${color(" │", CANOPY)}`);
108
+ }
109
+ }
110
+ rendered.push(color(`╰${"─".repeat(Math.max(0, width - 2))}╯`, CANOPY));
111
+ return rendered;
112
+ }
113
+ function renderPanelPlain(title, lines) {
114
+ return [
115
+ `${title}`,
116
+ ...lines.map((line) => ` ${plainLine(line)}`),
117
+ ];
118
+ }
119
+ function mastheadArt(columns) {
120
+ const rows = Array.from({ length: 5 }, () => []);
121
+ for (const letter of MASTHEAD_WORD.split("")) {
122
+ const glyph = CLASSIC_WORDMARK_GLYPHS[letter];
123
+ for (const [index, line] of glyph.entries()) {
124
+ rows[index].push(line);
125
+ }
126
+ }
127
+ const classicWordmark = rows.map((row) => row.join(" "));
128
+ const availableColumns = columns ?? 88;
129
+ const classicWidth = Math.max(...classicWordmark.map((line) => line.length));
130
+ if (availableColumns >= classicWidth) {
131
+ return classicWordmark;
132
+ }
133
+ return [MASTHEAD_WORD];
134
+ }
135
+ function renderOuroMasthead(options) {
136
+ const lines = options.isTTY ? mastheadArt(options.columns) : [MASTHEAD_WORD];
137
+ const branded = options.subtitle ? [...lines, options.subtitle] : lines;
138
+ if (!options.isTTY) {
139
+ return `${branded.join("\n")}\n`;
140
+ }
141
+ const ttyLines = [
142
+ ...lines.map((line, index) => color(line, index < 2 ? GLOW : SCALE, true)),
143
+ ...(options.subtitle ? [color(options.subtitle, MIST)] : []),
144
+ ];
145
+ return `${ttyLines.join("\n")}\n`;
146
+ }
147
+ function formatActionActorLabel(actor) {
148
+ return actor.replace(/-/g, " ");
149
+ }
150
+ function formatWizardStatusLabel(status) {
151
+ return status;
152
+ }
153
+ function isQuietWizardStatus(status) {
154
+ return status === "ready" || status === "attached" || status === "not attached";
155
+ }
156
+ function renderWizardStatusBadge(status, isTTY) {
157
+ const symbol = status === "ready" || status === "attached"
158
+ ? "●"
159
+ : status === "not attached"
160
+ ? "◌"
161
+ : "◆";
162
+ const label = `${symbol} ${formatWizardStatusLabel(status)}`;
163
+ if (!isTTY)
164
+ return label;
165
+ if (status === "ready" || status === "attached")
166
+ return color(label, GLOW, true);
167
+ if (status === "not attached")
168
+ return color(label, MIST);
169
+ return color(label, ALERT, true);
170
+ }
171
+ function renderWizardActorBadge(actor, isTTY) {
172
+ const label = `[${formatActionActorLabel(actor)}]`;
173
+ if (!isTTY)
174
+ return label;
175
+ if (actor === "human-required")
176
+ return color(label, ALERT, true);
177
+ if (actor === "human-choice")
178
+ return color(label, SCALE, true);
179
+ return color(label, MIST);
180
+ }
181
+ function renderWizardRecommendedBadge(isTTY) {
182
+ if (!isTTY)
183
+ return "[recommended]";
184
+ return color("[recommended]", GLOW, true);
185
+ }
186
+ function wrapWizardDetailLines(lines, width, isTTY, tone) {
187
+ const rendered = [];
188
+ for (const line of lines) {
189
+ const wrapped = wrapPlain(line, width);
190
+ for (const segment of wrapped) {
191
+ rendered.push(isTTY ? color(segment, tone) : segment);
192
+ }
193
+ }
194
+ return rendered;
195
+ }
196
+ function renderWizardItem(item, width, isTTY) {
197
+ const badges = [
198
+ ...(item.status ? [renderWizardStatusBadge(item.status, isTTY)] : []),
199
+ ...(item.actor ? [renderWizardActorBadge(item.actor, isTTY)] : []),
200
+ ...(item.recommended ? [renderWizardRecommendedBadge(isTTY)] : []),
201
+ ];
202
+ const keyPrefix = item.key ? `${item.key}. ` : "";
203
+ const header = `${keyPrefix}${item.label}${badges.length > 0 ? ` ${badges.join(" ")}` : ""}`;
204
+ const detailWidth = Math.max(18, width - 6);
205
+ const detailTone = item.status && !isQuietWizardStatus(item.status) ? BONE : MIST;
206
+ const lines = [isTTY ? color(header, BONE, true) : header];
207
+ if (item.summary) {
208
+ lines.push(...wrapWizardDetailLines([item.summary], detailWidth, isTTY, detailTone));
209
+ }
210
+ if (item.detailLines && item.detailLines.length > 0) {
211
+ lines.push(...wrapWizardDetailLines(item.detailLines, detailWidth, isTTY, detailTone));
212
+ }
213
+ if (item.command) {
214
+ lines.push(...wrapWizardDetailLines([`run: ${item.command}`], detailWidth, isTTY, MIST));
215
+ }
216
+ return lines.flatMap((line, index) => index === 0 ? [line] : [` ${line}`]);
217
+ }
218
+ function renderWizardSectionTTY(section, width) {
219
+ const lines = [];
220
+ if (section.summary) {
221
+ lines.push(...wrapWizardDetailLines([section.summary], Math.max(18, width - 4), true, MIST));
222
+ }
223
+ for (const [index, item] of section.items.entries()) {
224
+ if (index > 0)
225
+ lines.push("");
226
+ lines.push(...renderWizardItem(item, width, true));
227
+ }
228
+ return renderOperationSectionTTY(section.title, lines, width);
229
+ }
230
+ function renderWizardSectionPlain(section, width) {
231
+ const lines = [];
232
+ if (section.summary) {
233
+ lines.push(...wrapWizardDetailLines([section.summary], Math.max(18, width - 4), false, MIST));
234
+ }
235
+ for (const [index, item] of section.items.entries()) {
236
+ if (index > 0)
237
+ lines.push("");
238
+ lines.push(...renderWizardItem(item, width, false));
239
+ }
240
+ return renderOperationSectionPlain(section.title, lines);
241
+ }
242
+ function renderTerminalWizard(options) {
243
+ if (!options.suppressEvent) {
244
+ (0, runtime_1.emitNervesEvent)({
245
+ component: "daemon",
246
+ event: "daemon.terminal_wizard_rendered",
247
+ message: "rendered shared terminal wizard",
248
+ meta: {
249
+ title: options.title,
250
+ sections: options.sections?.length ?? 0,
251
+ items: options.sections?.reduce((count, section) => count + section.items.length, 0) ?? 0,
252
+ hasNextStep: !!options.nextStep,
253
+ tty: options.isTTY,
254
+ },
255
+ });
256
+ }
257
+ const width = boardWidth(options.columns);
258
+ const blocks = [];
259
+ blocks.push(renderOuroMasthead({
260
+ isTTY: options.isTTY,
261
+ columns: width,
262
+ subtitle: options.masthead?.subtitle,
263
+ }).trimEnd());
264
+ const introLines = [
265
+ options.isTTY ? color(options.title, BONE, true) : options.title,
266
+ ...(options.summary
267
+ ? wrapPlain(options.summary, Math.max(20, width - 2)).map((line) => options.isTTY ? color(line, MIST) : line)
268
+ : []),
269
+ ];
270
+ blocks.push(introLines.join("\n"));
271
+ if (options.nextStep) {
272
+ const nextStepLines = [
273
+ options.isTTY ? color(options.nextStep.label, BONE, true) : options.nextStep.label,
274
+ ...(options.nextStep.detail
275
+ ? wrapPlain(options.nextStep.detail, Math.max(18, width - 4)).map((line) => options.isTTY ? color(line, MIST) : line)
276
+ : []),
277
+ ...(options.nextStep.command
278
+ ? wrapPlain(`run: ${options.nextStep.command}`, Math.max(18, width - 4)).map((line) => options.isTTY ? color(line, MIST) : line)
279
+ : []),
280
+ ];
281
+ blocks.push((options.isTTY
282
+ ? renderOperationSectionTTY("Recommended next step", nextStepLines, width)
283
+ : renderOperationSectionPlain("Recommended next step", nextStepLines)).join("\n"));
284
+ }
285
+ for (const section of options.sections ?? []) {
286
+ blocks.push((options.isTTY
287
+ ? renderWizardSectionTTY(section, width)
288
+ : renderWizardSectionPlain(section, width)).join("\n"));
289
+ }
290
+ if (options.footerLines && options.footerLines.length > 0) {
291
+ blocks.push(options.footerLines.map((line) => options.isTTY ? color(line, MIST) : line).join("\n"));
292
+ }
293
+ if (options.prompt) {
294
+ blocks.push(options.isTTY ? color(options.prompt, BONE, true) : options.prompt);
295
+ }
296
+ return `${blocks.join("\n\n")}\n`;
297
+ }
298
+ function renderActionLine(action) {
299
+ const chips = [`[${formatActionActorLabel(action.actor)}]`];
300
+ if (action.recommended)
301
+ chips.push("[recommended]");
302
+ return `${action.label} ${chips.join(" ")}`;
303
+ }
304
+ function renderTerminalBoard(options) {
305
+ if (!options.suppressEvent) {
306
+ (0, runtime_1.emitNervesEvent)({
307
+ component: "daemon",
308
+ event: "daemon.terminal_board_rendered",
309
+ message: "rendered shared terminal board",
310
+ meta: {
311
+ title: options.title,
312
+ sections: options.sections?.length ?? 0,
313
+ actions: options.actions?.length ?? 0,
314
+ tty: options.isTTY,
315
+ },
316
+ });
317
+ }
318
+ const width = boardWidth(options.columns);
319
+ const blocks = [];
320
+ blocks.push(renderOuroMasthead({
321
+ isTTY: options.isTTY,
322
+ columns: width,
323
+ subtitle: options.masthead?.subtitle,
324
+ }).trimEnd());
325
+ const introLines = [
326
+ options.isTTY ? color(options.title, BONE, true) : options.title,
327
+ ...(options.summary ? wrapPlain(options.summary, Math.max(20, width - 4)).map((line) => options.isTTY ? color(line, MIST) : line) : []),
328
+ ];
329
+ blocks.push((options.isTTY ? renderPanelTTY("Overview", introLines, width) : renderPanelPlain("Overview", introLines)).join("\n"));
330
+ for (const section of options.sections ?? []) {
331
+ const lines = section.lines.map((line) => options.isTTY ? color(line, BONE) : line);
332
+ blocks.push((options.isTTY ? renderPanelTTY(section.title, lines, width) : renderPanelPlain(section.title, lines)).join("\n"));
333
+ }
334
+ const actionList = options.actions ?? [];
335
+ if (actionList.length > 0) {
336
+ const lines = [];
337
+ for (const [index, action] of actionList.entries()) {
338
+ lines.push(`${index + 1}. ${renderActionLine(action)}`);
339
+ lines.push(` ${action.command}`);
340
+ }
341
+ blocks.push((options.isTTY ? renderPanelTTY("Actions", lines, width) : renderPanelPlain("Actions", lines)).join("\n"));
342
+ }
343
+ if (options.prompt) {
344
+ blocks.push(options.isTTY ? color(options.prompt, BONE, true) : options.prompt);
345
+ }
346
+ return `${blocks.join("\n\n")}\n`;
347
+ }
348
+ function renderTerminalGuide(options) {
349
+ if (!options.suppressEvent) {
350
+ (0, runtime_1.emitNervesEvent)({
351
+ component: "daemon",
352
+ event: "daemon.terminal_guide_rendered",
353
+ message: "rendered shared terminal guide",
354
+ meta: {
355
+ title: options.title,
356
+ sections: options.sections?.length ?? 0,
357
+ actions: options.actions?.length ?? 0,
358
+ tty: options.isTTY,
359
+ },
360
+ });
361
+ }
362
+ const width = boardWidth(options.columns);
363
+ const blocks = [];
364
+ blocks.push(renderOuroMasthead({
365
+ isTTY: options.isTTY,
366
+ columns: width,
367
+ subtitle: options.masthead?.subtitle,
368
+ }).trimEnd());
369
+ const introLines = [
370
+ options.isTTY ? color(options.title, BONE, true) : options.title,
371
+ ...(options.summary
372
+ ? wrapPlain(options.summary, Math.max(20, width - 2)).map((line) => options.isTTY ? color(line, MIST) : line)
373
+ : []),
374
+ ];
375
+ blocks.push(introLines.join("\n"));
376
+ for (const section of options.sections ?? []) {
377
+ const lines = section.lines.map((line) => options.isTTY ? color(line, BONE) : line);
378
+ blocks.push((options.isTTY
379
+ ? renderOperationSectionTTY(section.title, lines, width)
380
+ : renderOperationSectionPlain(section.title, lines)).join("\n"));
381
+ }
382
+ const actionList = options.actions ?? [];
383
+ if (actionList.length > 0) {
384
+ const lines = [];
385
+ for (const [index, action] of actionList.entries()) {
386
+ lines.push(options.isTTY ? color(`${index + 1}. ${renderActionLine(action)}`, BONE, true) : `${index + 1}. ${renderActionLine(action)}`);
387
+ lines.push(options.isTTY ? color(`run: ${action.command}`, MIST) : `run: ${action.command}`);
388
+ }
389
+ blocks.push((options.isTTY
390
+ ? renderOperationSectionTTY("Next moves", lines, width)
391
+ : renderOperationSectionPlain("Next moves", lines)).join("\n"));
392
+ }
393
+ if (options.prompt) {
394
+ blocks.push(options.isTTY ? color(options.prompt, BONE, true) : options.prompt);
395
+ }
396
+ return `${blocks.join("\n\n")}\n`;
397
+ }
398
+ function formatOperationStep(step) {
399
+ const marker = step.status === "done"
400
+ ? "✓"
401
+ : step.status === "failed"
402
+ ? "✗"
403
+ : step.status === "active"
404
+ ? "→"
405
+ : "○";
406
+ const detail = step.detail ? ` — ${step.detail}` : "";
407
+ return `${marker} ${step.label}${detail}`;
408
+ }
409
+ function operationMarkerTone(status) {
410
+ switch (status) {
411
+ case "done":
412
+ return GLOW;
413
+ case "active":
414
+ return BONE;
415
+ case "failed":
416
+ return ALERT;
417
+ case "pending":
418
+ default:
419
+ return MIST;
420
+ }
421
+ }
422
+ function renderOperationStepTTY(step) {
423
+ const marker = step.status === "done"
424
+ ? "✓"
425
+ : step.status === "failed"
426
+ ? "✗"
427
+ : step.status === "active"
428
+ ? "→"
429
+ : "○";
430
+ const label = color(step.label, step.status === "pending" ? MIST : BONE, step.status !== "pending");
431
+ const detail = step.detail ? ` ${color(`— ${step.detail}`, MIST)}` : "";
432
+ return `${color(marker, operationMarkerTone(step.status), true)} ${label}${detail}`;
433
+ }
434
+ function renderOperationSectionTTY(title, lines, width) {
435
+ const rule = "─".repeat(Math.max(8, width - title.length - 3));
436
+ return [
437
+ `${color("─ ", CANOPY)}${color(title, BONE, true)} ${color(rule, CANOPY)}`,
438
+ ...lines.map((line) => ` ${line}`),
439
+ ];
440
+ }
441
+ function renderOperationSectionPlain(title, lines) {
442
+ return [
443
+ title,
444
+ ...lines.map((line) => ` ${plainLine(line)}`),
445
+ ];
446
+ }
447
+ function renderTerminalOperation(options) {
448
+ if (!options.suppressEvent) {
449
+ (0, runtime_1.emitNervesEvent)({
450
+ component: "daemon",
451
+ event: "daemon.terminal_operation_rendered",
452
+ message: "rendered terminal operation surface",
453
+ meta: {
454
+ title: options.title,
455
+ steps: options.steps?.length ?? 0,
456
+ hasCurrentStep: !!options.currentStep,
457
+ tty: options.isTTY,
458
+ },
459
+ });
460
+ }
461
+ const steps = options.steps ?? [];
462
+ const currentLines = options.currentStep
463
+ ? [
464
+ options.currentStep.label,
465
+ ...(options.currentStep.detailLines ?? []),
466
+ ]
467
+ : ["Standing by."];
468
+ const progressLines = steps.length > 0
469
+ ? options.isTTY
470
+ ? steps.map((step) => renderOperationStepTTY(step))
471
+ : steps.map((step) => formatOperationStep(step))
472
+ : ["No active steps yet."];
473
+ const width = boardWidth(options.columns);
474
+ const blocks = [];
475
+ blocks.push(renderOuroMasthead({
476
+ isTTY: options.isTTY,
477
+ columns: width,
478
+ subtitle: options.masthead?.subtitle,
479
+ }).trimEnd());
480
+ const introLines = [
481
+ options.isTTY ? color(options.title, BONE, true) : options.title,
482
+ ...(options.summary
483
+ ? wrapPlain(options.summary, Math.max(20, width - 2)).map((line) => options.isTTY ? color(line, MIST) : line)
484
+ : []),
485
+ ];
486
+ blocks.push(introLines.join("\n"));
487
+ const renderedSteps = options.isTTY
488
+ ? renderOperationSectionTTY(options.stepsTitle ?? "Checklist", progressLines, width)
489
+ : renderOperationSectionPlain(options.stepsTitle ?? "Checklist", progressLines);
490
+ const renderedCurrent = options.isTTY
491
+ ? renderOperationSectionTTY(options.currentTitle ?? "Current work", currentLines.map((line, index) => index === 0 ? color(line, BONE, true) : color(line, MIST)), width)
492
+ : renderOperationSectionPlain(options.currentTitle ?? "Current work", currentLines);
493
+ blocks.push(renderedSteps.join("\n"));
494
+ blocks.push(renderedCurrent.join("\n"));
495
+ if (options.prompt) {
496
+ blocks.push(options.isTTY ? color(options.prompt, BONE, true) : options.prompt);
497
+ }
498
+ return `${blocks.join("\n\n")}\n`;
499
+ }