@ouro.bot/cli 0.1.0-alpha.5 → 0.1.0-alpha.500

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 (380) hide show
  1. package/README.md +226 -183
  2. package/SerpentGuide.ouro/agent.json +82 -0
  3. package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
  4. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
  5. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  6. package/assets/ouroboros.png +0 -0
  7. package/changelog.json +3418 -0
  8. package/dist/arc/attention-types.js +8 -0
  9. package/dist/arc/cares.js +140 -0
  10. package/dist/arc/episodes.js +117 -0
  11. package/dist/arc/intentions.js +133 -0
  12. package/dist/arc/json-store.js +117 -0
  13. package/dist/arc/obligations.js +237 -0
  14. package/dist/arc/packets.js +193 -0
  15. package/dist/arc/presence.js +185 -0
  16. package/dist/arc/task-lifecycle.js +65 -0
  17. package/dist/heart/active-work.js +989 -0
  18. package/dist/heart/agent-entry.js +58 -3
  19. package/dist/heart/attachments/image-normalize.js +194 -0
  20. package/dist/heart/attachments/materialize.js +97 -0
  21. package/dist/heart/attachments/originals.js +88 -0
  22. package/dist/heart/attachments/render.js +29 -0
  23. package/dist/heart/attachments/sources/adapter.js +2 -0
  24. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  25. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  26. package/dist/heart/attachments/sources/index.js +16 -0
  27. package/dist/heart/attachments/store.js +103 -0
  28. package/dist/heart/attachments/types.js +93 -0
  29. package/dist/heart/auth/auth-flow.js +426 -0
  30. package/dist/heart/background-operations.js +281 -0
  31. package/dist/heart/bridges/manager.js +358 -0
  32. package/dist/heart/bridges/state-machine.js +135 -0
  33. package/dist/heart/bridges/store.js +123 -0
  34. package/dist/heart/bundle-state.js +168 -0
  35. package/dist/heart/commitments.js +111 -0
  36. package/dist/heart/config-registry.js +304 -0
  37. package/dist/heart/config.js +193 -130
  38. package/dist/heart/core.js +1010 -261
  39. package/dist/heart/cross-chat-delivery.js +131 -0
  40. package/dist/heart/daemon/agent-config-check.js +490 -0
  41. package/dist/heart/daemon/agent-discovery.js +157 -0
  42. package/dist/heart/daemon/agent-service.js +360 -0
  43. package/dist/heart/daemon/agentic-repair.js +216 -0
  44. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  45. package/dist/heart/daemon/cadence.js +70 -0
  46. package/dist/heart/daemon/cli-defaults.js +640 -0
  47. package/dist/heart/daemon/cli-exec.js +7239 -0
  48. package/dist/heart/daemon/cli-help.js +493 -0
  49. package/dist/heart/daemon/cli-parse.js +1533 -0
  50. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  51. package/dist/heart/daemon/cli-render.js +561 -0
  52. package/dist/heart/daemon/cli-types.js +8 -0
  53. package/dist/heart/daemon/connect-bay.js +323 -0
  54. package/dist/heart/daemon/daemon-cli.js +30 -697
  55. package/dist/heart/daemon/daemon-entry.js +359 -8
  56. package/dist/heart/daemon/daemon-health.js +141 -0
  57. package/dist/heart/daemon/daemon-runtime-sync.js +268 -0
  58. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  59. package/dist/heart/daemon/daemon.js +813 -19
  60. package/dist/heart/daemon/dns-workflow.js +394 -0
  61. package/dist/heart/daemon/doctor-types.js +8 -0
  62. package/dist/heart/daemon/doctor.js +615 -0
  63. package/dist/heart/daemon/health-monitor.js +92 -1
  64. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  65. package/dist/heart/daemon/hooks/bundle-meta.js +206 -0
  66. package/dist/heart/daemon/http-health-probe.js +80 -0
  67. package/dist/heart/daemon/human-command-screens.js +234 -0
  68. package/dist/heart/daemon/human-readiness.js +114 -0
  69. package/dist/heart/daemon/inner-status.js +89 -0
  70. package/dist/heart/daemon/interactive-repair.js +394 -0
  71. package/dist/heart/daemon/launchd.js +171 -0
  72. package/dist/heart/daemon/log-tailer.js +82 -12
  73. package/dist/heart/daemon/logs-prune.js +110 -0
  74. package/dist/heart/daemon/message-router.js +17 -8
  75. package/dist/heart/daemon/os-cron-deps.js +134 -0
  76. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  77. package/dist/heart/daemon/ouro-entry.js +3 -1
  78. package/dist/heart/daemon/process-manager.js +215 -1
  79. package/dist/heart/daemon/provider-discovery.js +137 -0
  80. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  81. package/dist/heart/daemon/pulse.js +475 -0
  82. package/dist/heart/daemon/readiness-repair.js +365 -0
  83. package/dist/heart/daemon/run-hooks.js +39 -0
  84. package/dist/heart/daemon/runtime-logging.js +67 -16
  85. package/dist/heart/daemon/runtime-metadata.js +191 -0
  86. package/dist/heart/daemon/runtime-mode.js +67 -0
  87. package/dist/heart/daemon/safe-mode.js +161 -0
  88. package/dist/heart/daemon/sense-manager.js +431 -0
  89. package/dist/heart/daemon/session-id-resolver.js +131 -0
  90. package/dist/heart/daemon/skill-management-installer.js +94 -0
  91. package/dist/heart/daemon/socket-client.js +307 -0
  92. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  93. package/dist/heart/daemon/startup-tui.js +264 -0
  94. package/dist/heart/daemon/task-scheduler.js +3 -25
  95. package/dist/heart/daemon/terminal-ui.js +499 -0
  96. package/dist/heart/daemon/thoughts.js +524 -0
  97. package/dist/heart/daemon/up-progress.js +366 -0
  98. package/dist/heart/daemon/vault-items.js +56 -0
  99. package/dist/heart/delegation.js +62 -0
  100. package/dist/heart/habits/habit-migration.js +189 -0
  101. package/dist/heart/habits/habit-parser.js +140 -0
  102. package/dist/heart/habits/habit-runtime-state.js +100 -0
  103. package/dist/heart/habits/habit-scheduler.js +372 -0
  104. package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
  105. package/dist/heart/{daemon → hatch}/hatch-flow.js +54 -136
  106. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  107. package/dist/heart/hatch/specialist-orchestrator.js +129 -0
  108. package/dist/heart/hatch/specialist-prompt.js +102 -0
  109. package/dist/heart/hatch/specialist-tools.js +306 -0
  110. package/dist/heart/identity.js +274 -61
  111. package/dist/heart/kept-notes.js +357 -0
  112. package/dist/heart/kicks.js +2 -20
  113. package/dist/heart/machine-identity.js +161 -0
  114. package/dist/heart/mail-import-discovery.js +353 -0
  115. package/dist/heart/mcp/mcp-server.js +653 -0
  116. package/dist/heart/migrate-config.js +100 -0
  117. package/dist/heart/model-capabilities.js +59 -0
  118. package/dist/heart/outlook/outlook-http-hooks.js +66 -0
  119. package/dist/heart/outlook/outlook-http-response.js +7 -0
  120. package/dist/heart/outlook/outlook-http-routes.js +244 -0
  121. package/dist/heart/outlook/outlook-http-static.js +103 -0
  122. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  123. package/dist/heart/outlook/outlook-http.js +99 -0
  124. package/dist/heart/outlook/outlook-read.js +31 -0
  125. package/dist/heart/outlook/outlook-types.js +27 -0
  126. package/dist/heart/outlook/outlook-view.js +195 -0
  127. package/dist/heart/outlook/readers/agent-machine.js +382 -0
  128. package/dist/heart/outlook/readers/continuity-readers.js +336 -0
  129. package/dist/heart/outlook/readers/mail.js +362 -0
  130. package/dist/heart/outlook/readers/runtime-readers.js +644 -0
  131. package/dist/heart/outlook/readers/sessions.js +232 -0
  132. package/dist/heart/outlook/readers/shared.js +111 -0
  133. package/dist/heart/platform.js +81 -0
  134. package/dist/heart/progress-story.js +42 -0
  135. package/dist/heart/provider-attempt.js +134 -0
  136. package/dist/heart/provider-binding-resolver.js +255 -0
  137. package/dist/heart/provider-credentials.js +424 -0
  138. package/dist/heart/provider-failover.js +301 -0
  139. package/dist/heart/provider-models.js +81 -0
  140. package/dist/heart/provider-ping.js +262 -0
  141. package/dist/heart/provider-state.js +216 -0
  142. package/dist/heart/provider-visibility.js +188 -0
  143. package/dist/heart/providers/anthropic-token.js +131 -0
  144. package/dist/heart/providers/anthropic.js +202 -50
  145. package/dist/heart/providers/azure.js +104 -13
  146. package/dist/heart/providers/error-classification.js +63 -0
  147. package/dist/heart/providers/github-copilot.js +145 -0
  148. package/dist/heart/providers/minimax-vlm.js +189 -0
  149. package/dist/heart/providers/minimax.js +29 -7
  150. package/dist/heart/providers/openai-codex.js +63 -39
  151. package/dist/heart/runtime-capability-check.js +170 -0
  152. package/dist/heart/runtime-credentials.js +260 -0
  153. package/dist/heart/sense-truth.js +68 -0
  154. package/dist/heart/session-activity.js +190 -0
  155. package/dist/heart/session-events.js +1089 -0
  156. package/dist/heart/session-playback-cli-main.js +5 -0
  157. package/dist/heart/session-playback-cli.js +36 -0
  158. package/dist/heart/session-playback.js +231 -0
  159. package/dist/heart/session-transcript.js +167 -0
  160. package/dist/heart/start-of-turn-packet.js +345 -0
  161. package/dist/heart/streaming.js +129 -34
  162. package/dist/heart/sync.js +332 -0
  163. package/dist/heart/target-resolution.js +127 -0
  164. package/dist/heart/tempo.js +93 -0
  165. package/dist/heart/temporal-view.js +41 -0
  166. package/dist/heart/tool-activity-callbacks.js +36 -0
  167. package/dist/heart/tool-description.js +135 -0
  168. package/dist/heart/tool-friction.js +55 -0
  169. package/dist/heart/tool-loop.js +200 -0
  170. package/dist/heart/turn-context.js +372 -0
  171. package/dist/heart/turn-coordinator.js +28 -0
  172. package/dist/heart/versioning/ouro-bot-global-installer.js +128 -0
  173. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  174. package/dist/heart/versioning/ouro-path-installer.js +425 -0
  175. package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
  176. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  177. package/dist/heart/versioning/staged-restart.js +146 -0
  178. package/dist/heart/versioning/update-checker.js +115 -0
  179. package/dist/heart/versioning/update-hooks.js +142 -0
  180. package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
  181. package/dist/mailroom/attention.js +167 -0
  182. package/dist/mailroom/autonomy.js +209 -0
  183. package/dist/mailroom/blob-store.js +606 -0
  184. package/dist/mailroom/core.js +672 -0
  185. package/dist/mailroom/entry.js +160 -0
  186. package/dist/mailroom/file-store.js +426 -0
  187. package/dist/mailroom/mbox-import.js +382 -0
  188. package/dist/mailroom/outbound.js +380 -0
  189. package/dist/mailroom/policy.js +263 -0
  190. package/dist/mailroom/reader.js +219 -0
  191. package/dist/mailroom/search-cache.js +182 -0
  192. package/dist/mailroom/search-relevance.js +319 -0
  193. package/dist/mailroom/smtp-ingress.js +176 -0
  194. package/dist/mailroom/source-state.js +176 -0
  195. package/dist/mailroom/thread.js +109 -0
  196. package/dist/mailroom/travel-extract.js +89 -0
  197. package/dist/mind/bundle-manifest.js +77 -1
  198. package/dist/mind/context.js +173 -94
  199. package/dist/mind/diary-integrity.js +60 -0
  200. package/dist/mind/{memory.js → diary.js} +84 -96
  201. package/dist/mind/embedding-provider.js +60 -0
  202. package/dist/mind/file-state.js +179 -0
  203. package/dist/mind/first-impressions.js +16 -2
  204. package/dist/mind/friends/channel.js +73 -0
  205. package/dist/mind/friends/group-context.js +144 -0
  206. package/dist/mind/friends/resolver.js +54 -2
  207. package/dist/mind/friends/store-file.js +58 -3
  208. package/dist/mind/friends/trust-explanation.js +74 -0
  209. package/dist/mind/friends/types.js +10 -2
  210. package/dist/mind/journal-index.js +161 -0
  211. package/dist/mind/note-search.js +268 -0
  212. package/dist/mind/obligation-steering.js +221 -0
  213. package/dist/mind/pending.js +76 -9
  214. package/dist/mind/phrases.js +1 -0
  215. package/dist/mind/prompt-refresh.js +3 -2
  216. package/dist/mind/prompt.js +1144 -117
  217. package/dist/mind/provenance-trust.js +26 -0
  218. package/dist/mind/scrutiny.js +173 -0
  219. package/dist/mind/token-estimate.js +8 -12
  220. package/dist/nerves/cli-logging.js +22 -3
  221. package/dist/nerves/coverage/audit-rules.js +15 -6
  222. package/dist/nerves/coverage/audit.js +28 -2
  223. package/dist/nerves/coverage/cli.js +1 -1
  224. package/dist/nerves/coverage/contract.js +5 -5
  225. package/dist/nerves/coverage/file-completeness.js +101 -5
  226. package/dist/nerves/coverage/run-artifacts.js +1 -1
  227. package/dist/nerves/event-buffer.js +111 -0
  228. package/dist/nerves/index.js +224 -4
  229. package/dist/nerves/observation.js +20 -0
  230. package/dist/nerves/redact.js +79 -0
  231. package/dist/nerves/runtime.js +5 -1
  232. package/dist/outlook-ui/assets/index-BPr5vNuM.css +1 -0
  233. package/dist/outlook-ui/assets/index-Cm51CY9W.js +61 -0
  234. package/dist/outlook-ui/index.html +15 -0
  235. package/dist/repertoire/ado-client.js +17 -56
  236. package/dist/repertoire/ado-semantic.js +11 -10
  237. package/dist/repertoire/api-client.js +97 -0
  238. package/dist/repertoire/bitwarden-store.js +774 -0
  239. package/dist/repertoire/bundle-templates.js +72 -0
  240. package/dist/repertoire/bw-installer.js +180 -0
  241. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  242. package/dist/repertoire/coding/context-pack.js +330 -0
  243. package/dist/repertoire/coding/feedback.js +301 -0
  244. package/dist/repertoire/coding/index.js +4 -1
  245. package/dist/repertoire/coding/manager.js +220 -13
  246. package/dist/repertoire/coding/spawner.js +58 -12
  247. package/dist/repertoire/coding/tools.js +209 -7
  248. package/dist/repertoire/commerce-errors.js +109 -0
  249. package/dist/repertoire/commerce-self-test.js +156 -0
  250. package/dist/repertoire/credential-access.js +111 -0
  251. package/dist/repertoire/data/ado-endpoints.json +188 -0
  252. package/dist/repertoire/duffel-client.js +185 -0
  253. package/dist/repertoire/github-client.js +14 -55
  254. package/dist/repertoire/graph-client.js +11 -52
  255. package/dist/repertoire/guardrails.js +396 -0
  256. package/dist/repertoire/mcp-client.js +255 -0
  257. package/dist/repertoire/mcp-manager.js +305 -0
  258. package/dist/repertoire/mcp-tools.js +63 -0
  259. package/dist/repertoire/shell-sessions.js +133 -0
  260. package/dist/repertoire/skills.js +15 -24
  261. package/dist/repertoire/stripe-client.js +131 -0
  262. package/dist/repertoire/tasks/board.js +43 -5
  263. package/dist/repertoire/tasks/fix.js +182 -0
  264. package/dist/repertoire/tasks/index.js +39 -13
  265. package/dist/repertoire/tasks/lifecycle.js +2 -2
  266. package/dist/repertoire/tasks/parser.js +3 -2
  267. package/dist/repertoire/tasks/scanner.js +194 -37
  268. package/dist/repertoire/tasks/transitions.js +16 -79
  269. package/dist/repertoire/tool-results.js +29 -0
  270. package/dist/repertoire/tools-attachments.js +317 -0
  271. package/dist/repertoire/tools-base.js +49 -707
  272. package/dist/repertoire/tools-bluebubbles.js +94 -0
  273. package/dist/repertoire/tools-bridge.js +141 -0
  274. package/dist/repertoire/tools-bundle.js +984 -0
  275. package/dist/repertoire/tools-config.js +185 -0
  276. package/dist/repertoire/tools-continuity.js +248 -0
  277. package/dist/repertoire/tools-credential.js +381 -0
  278. package/dist/repertoire/tools-files.js +342 -0
  279. package/dist/repertoire/tools-flight.js +224 -0
  280. package/dist/repertoire/tools-flow.js +105 -0
  281. package/dist/repertoire/tools-github.js +1 -7
  282. package/dist/repertoire/tools-mail.js +1377 -0
  283. package/dist/repertoire/tools-notes.js +376 -0
  284. package/dist/repertoire/tools-session.js +749 -0
  285. package/dist/repertoire/tools-shell.js +120 -0
  286. package/dist/repertoire/tools-stripe.js +180 -0
  287. package/dist/repertoire/tools-surface.js +243 -0
  288. package/dist/repertoire/tools-teams.js +64 -61
  289. package/dist/repertoire/tools-travel.js +125 -0
  290. package/dist/repertoire/tools-trip.js +356 -0
  291. package/dist/repertoire/tools-user-profile.js +144 -0
  292. package/dist/repertoire/tools-vault.js +40 -0
  293. package/dist/repertoire/tools.js +149 -98
  294. package/dist/repertoire/travel-api-client.js +360 -0
  295. package/dist/repertoire/user-profile.js +131 -0
  296. package/dist/repertoire/vault-setup.js +246 -0
  297. package/dist/repertoire/vault-unlock.js +561 -0
  298. package/dist/scripts/claude-code-hook.js +41 -0
  299. package/dist/scripts/claude-code-stop-hook.js +47 -0
  300. package/dist/senses/attention-queue.js +116 -0
  301. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  302. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  303. package/dist/senses/bluebubbles/client.js +685 -0
  304. package/dist/senses/bluebubbles/entry.js +73 -0
  305. package/dist/senses/bluebubbles/inbound-log.js +126 -0
  306. package/dist/senses/bluebubbles/index.js +1881 -0
  307. package/dist/senses/bluebubbles/media.js +389 -0
  308. package/dist/senses/bluebubbles/model.js +282 -0
  309. package/dist/senses/bluebubbles/mutation-log.js +116 -0
  310. package/dist/senses/bluebubbles/processed-log.js +111 -0
  311. package/dist/senses/bluebubbles/replay.js +129 -0
  312. package/dist/senses/bluebubbles/runtime-state.js +109 -0
  313. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  314. package/dist/senses/cli/bracketed-paste.js +82 -0
  315. package/dist/senses/cli/image-paste.js +287 -0
  316. package/dist/senses/cli/image-ref-navigation.js +75 -0
  317. package/dist/senses/cli/ink-app.js +156 -0
  318. package/dist/senses/cli/inline-diff.js +64 -0
  319. package/dist/senses/cli/input-keys.js +174 -0
  320. package/dist/senses/cli/kill-ring.js +86 -0
  321. package/dist/senses/cli/message-list.js +51 -0
  322. package/dist/senses/cli/ouro-tui.js +605 -0
  323. package/dist/senses/cli/spinner-imperative.js +135 -0
  324. package/dist/senses/cli/spinner.js +101 -0
  325. package/dist/senses/cli/status-line.js +60 -0
  326. package/dist/senses/cli/streaming-markdown.js +526 -0
  327. package/dist/senses/cli/tool-display.js +83 -0
  328. package/dist/senses/cli/tool-render.js +85 -0
  329. package/dist/senses/cli/tui-store.js +240 -0
  330. package/dist/senses/cli/virtual-list.js +35 -0
  331. package/dist/senses/cli-entry.js +60 -8
  332. package/dist/senses/cli-layout.js +187 -0
  333. package/dist/senses/cli.js +768 -264
  334. package/dist/senses/commands.js +66 -3
  335. package/dist/senses/continuity.js +94 -0
  336. package/dist/senses/habit-turn-message.js +108 -0
  337. package/dist/senses/inner-dialog-worker.js +199 -16
  338. package/dist/senses/inner-dialog.js +640 -91
  339. package/dist/senses/mail-entry.js +66 -0
  340. package/dist/senses/mail.js +379 -0
  341. package/dist/senses/pipeline.js +665 -0
  342. package/dist/senses/proactive-content-guard.js +51 -0
  343. package/dist/senses/shared-turn.js +248 -0
  344. package/dist/senses/surface-tool.js +68 -0
  345. package/dist/senses/teams-entry.js +60 -8
  346. package/dist/senses/teams.js +844 -197
  347. package/dist/senses/trust-gate.js +207 -2
  348. package/dist/trips/core.js +138 -0
  349. package/dist/trips/store.js +146 -0
  350. package/package.json +47 -6
  351. package/skills/agent-commerce.md +106 -0
  352. package/skills/browser-navigation.md +117 -0
  353. package/skills/commerce-setup-guide.md +116 -0
  354. package/skills/commerce-setup.md +84 -0
  355. package/skills/configure-dev-tools.md +101 -0
  356. package/skills/travel-planning.md +138 -0
  357. package/AdoptionSpecialist.ouro/agent.json +0 -20
  358. package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
  359. package/dist/heart/daemon/specialist-orchestrator.js +0 -160
  360. package/dist/heart/daemon/specialist-prompt.js +0 -40
  361. package/dist/heart/daemon/specialist-session.js +0 -142
  362. package/dist/heart/daemon/specialist-tools.js +0 -128
  363. package/dist/heart/daemon/subagent-installer.js +0 -125
  364. package/dist/inner-worker-entry.js +0 -4
  365. package/dist/mind/associative-recall.js +0 -197
  366. package/subagents/README.md +0 -73
  367. package/subagents/work-doer.md +0 -233
  368. package/subagents/work-merger.md +0 -624
  369. package/subagents/work-planner.md +0 -373
  370. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  371. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  372. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  373. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  374. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  375. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  376. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  377. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  378. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  379. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  380. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +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
+ }