@ouro.bot/cli 0.1.0-alpha.51 → 0.1.0-alpha.511

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 (372) hide show
  1. package/README.md +133 -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 +3253 -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 +867 -35
  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/background-operations.js +281 -0
  29. package/dist/heart/bundle-state.js +168 -0
  30. package/dist/heart/commitments.js +111 -0
  31. package/dist/heart/config-registry.js +304 -0
  32. package/dist/heart/config.js +119 -129
  33. package/dist/heart/core.js +878 -244
  34. package/dist/heart/cross-chat-delivery.js +131 -0
  35. package/dist/heart/daemon/agent-config-check.js +490 -0
  36. package/dist/heart/daemon/agent-discovery.js +79 -3
  37. package/dist/heart/daemon/agent-service.js +360 -0
  38. package/dist/heart/daemon/agentic-repair.js +216 -0
  39. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  40. package/dist/heart/daemon/cadence.js +70 -0
  41. package/dist/heart/daemon/cli-defaults.js +640 -0
  42. package/dist/heart/daemon/cli-exec.js +7241 -0
  43. package/dist/heart/daemon/cli-help.js +493 -0
  44. package/dist/heart/daemon/cli-parse.js +1536 -0
  45. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  46. package/dist/heart/daemon/cli-render.js +561 -0
  47. package/dist/heart/daemon/cli-types.js +8 -0
  48. package/dist/heart/daemon/connect-bay.js +323 -0
  49. package/dist/heart/daemon/daemon-cli.js +29 -1631
  50. package/dist/heart/daemon/daemon-entry.js +345 -3
  51. package/dist/heart/daemon/daemon-health.js +141 -0
  52. package/dist/heart/daemon/daemon-runtime-sync.js +190 -12
  53. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  54. package/dist/heart/daemon/daemon.js +677 -58
  55. package/dist/heart/daemon/dns-workflow.js +394 -0
  56. package/dist/heart/daemon/doctor-types.js +8 -0
  57. package/dist/heart/daemon/doctor.js +750 -0
  58. package/dist/heart/daemon/health-monitor.js +92 -1
  59. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  60. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  61. package/dist/heart/daemon/http-health-probe.js +80 -0
  62. package/dist/heart/daemon/human-command-screens.js +234 -0
  63. package/dist/heart/daemon/human-readiness.js +114 -0
  64. package/dist/heart/daemon/inner-status.js +89 -0
  65. package/dist/heart/daemon/interactive-repair.js +394 -0
  66. package/dist/heart/daemon/launchd.js +25 -5
  67. package/dist/heart/daemon/log-tailer.js +82 -12
  68. package/dist/heart/daemon/logs-prune.js +110 -0
  69. package/dist/heart/daemon/message-router.js +2 -2
  70. package/dist/heart/daemon/os-cron-deps.js +134 -0
  71. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  72. package/dist/heart/daemon/ouro-entry.js +3 -1
  73. package/dist/heart/daemon/process-manager.js +214 -0
  74. package/dist/heart/daemon/provider-discovery.js +137 -0
  75. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  76. package/dist/heart/daemon/pulse.js +475 -0
  77. package/dist/heart/daemon/readiness-repair.js +365 -0
  78. package/dist/heart/daemon/run-hooks.js +2 -0
  79. package/dist/heart/daemon/runtime-logging.js +67 -16
  80. package/dist/heart/daemon/runtime-metadata.js +73 -0
  81. package/dist/heart/daemon/runtime-mode.js +67 -0
  82. package/dist/heart/daemon/safe-mode.js +161 -0
  83. package/dist/heart/daemon/sense-manager.js +178 -37
  84. package/dist/heart/daemon/session-id-resolver.js +131 -0
  85. package/dist/heart/daemon/skill-management-installer.js +94 -0
  86. package/dist/heart/daemon/socket-client.js +109 -4
  87. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  88. package/dist/heart/daemon/startup-tui.js +264 -0
  89. package/dist/heart/daemon/task-scheduler.js +3 -25
  90. package/dist/heart/daemon/terminal-ui.js +499 -0
  91. package/dist/heart/daemon/thoughts.js +162 -17
  92. package/dist/heart/daemon/up-progress.js +366 -0
  93. package/dist/heart/daemon/vault-items.js +56 -0
  94. package/dist/heart/delegation.js +1 -1
  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 +205 -66
  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/mail-import-discovery.js +353 -0
  108. package/dist/heart/mcp/mcp-server.js +653 -0
  109. package/dist/heart/migrate-config.js +100 -0
  110. package/dist/heart/model-capabilities.js +19 -0
  111. package/dist/heart/outlook/outlook-http-hooks.js +66 -0
  112. package/dist/heart/outlook/outlook-http-response.js +7 -0
  113. package/dist/heart/outlook/outlook-http-routes.js +244 -0
  114. package/dist/heart/outlook/outlook-http-static.js +103 -0
  115. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  116. package/dist/heart/outlook/outlook-http.js +99 -0
  117. package/dist/heart/outlook/outlook-read.js +31 -0
  118. package/dist/heart/outlook/outlook-types.js +27 -0
  119. package/dist/heart/outlook/outlook-view.js +195 -0
  120. package/dist/heart/outlook/readers/agent-machine.js +382 -0
  121. package/dist/heart/outlook/readers/continuity-readers.js +336 -0
  122. package/dist/heart/outlook/readers/mail.js +362 -0
  123. package/dist/heart/outlook/readers/runtime-readers.js +644 -0
  124. package/dist/heart/outlook/readers/sessions.js +232 -0
  125. package/dist/heart/outlook/readers/shared.js +111 -0
  126. package/dist/heart/platform.js +81 -0
  127. package/dist/heart/provider-attempt.js +134 -0
  128. package/dist/heart/provider-binding-resolver.js +255 -0
  129. package/dist/heart/provider-credentials.js +424 -0
  130. package/dist/heart/provider-failover.js +301 -0
  131. package/dist/heart/provider-models.js +81 -0
  132. package/dist/heart/provider-ping.js +262 -0
  133. package/dist/heart/provider-state.js +216 -0
  134. package/dist/heart/provider-visibility.js +188 -0
  135. package/dist/heart/providers/anthropic-token.js +131 -0
  136. package/dist/heart/providers/anthropic.js +139 -52
  137. package/dist/heart/providers/azure.js +97 -13
  138. package/dist/heart/providers/error-classification.js +127 -0
  139. package/dist/heart/providers/github-copilot.js +145 -0
  140. package/dist/heart/providers/minimax-vlm.js +189 -0
  141. package/dist/heart/providers/minimax.js +26 -8
  142. package/dist/heart/providers/openai-codex.js +55 -40
  143. package/dist/heart/runtime-capability-check.js +170 -0
  144. package/dist/heart/runtime-credentials.js +260 -0
  145. package/dist/heart/sense-truth.js +11 -4
  146. package/dist/heart/session-activity.js +43 -22
  147. package/dist/heart/session-events.js +1150 -0
  148. package/dist/heart/session-playback-cli-main.js +5 -0
  149. package/dist/heart/session-playback-cli.js +36 -0
  150. package/dist/heart/session-playback.js +231 -0
  151. package/dist/heart/session-stats-cli-main.js +5 -0
  152. package/dist/heart/session-stats.js +182 -0
  153. package/dist/heart/session-transcript.js +167 -0
  154. package/dist/heart/start-of-turn-packet.js +345 -0
  155. package/dist/heart/streaming.js +44 -27
  156. package/dist/heart/sync.js +332 -0
  157. package/dist/heart/target-resolution.js +127 -0
  158. package/dist/heart/tempo.js +93 -0
  159. package/dist/heart/temporal-view.js +41 -0
  160. package/dist/heart/tool-activity-callbacks.js +36 -0
  161. package/dist/heart/tool-description.js +135 -0
  162. package/dist/heart/tool-friction.js +55 -0
  163. package/dist/heart/tool-loop.js +200 -0
  164. package/dist/heart/turn-context.js +372 -0
  165. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
  166. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  167. package/dist/heart/versioning/ouro-path-installer.js +425 -0
  168. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  169. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  170. package/dist/heart/{daemon → versioning}/update-checker.js +5 -1
  171. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  172. package/dist/mailroom/attention.js +167 -0
  173. package/dist/mailroom/autonomy.js +209 -0
  174. package/dist/mailroom/blob-store.js +606 -0
  175. package/dist/mailroom/body-cache.js +61 -0
  176. package/dist/mailroom/core.js +672 -0
  177. package/dist/mailroom/entry.js +160 -0
  178. package/dist/mailroom/file-store.js +426 -0
  179. package/dist/mailroom/mbox-import.js +382 -0
  180. package/dist/mailroom/outbound.js +380 -0
  181. package/dist/mailroom/policy.js +263 -0
  182. package/dist/mailroom/reader.js +219 -0
  183. package/dist/mailroom/search-cache.js +182 -0
  184. package/dist/mailroom/search-relevance.js +319 -0
  185. package/dist/mailroom/smtp-ingress.js +176 -0
  186. package/dist/mailroom/source-state.js +176 -0
  187. package/dist/mailroom/thread.js +109 -0
  188. package/dist/mailroom/travel-extract.js +89 -0
  189. package/dist/mind/bundle-manifest.js +7 -1
  190. package/dist/mind/context.js +165 -101
  191. package/dist/mind/diary-integrity.js +60 -0
  192. package/dist/mind/{memory.js → diary.js} +74 -93
  193. package/dist/mind/embedding-provider.js +60 -0
  194. package/dist/mind/file-state.js +179 -0
  195. package/dist/mind/friends/channel.js +30 -0
  196. package/dist/mind/friends/group-context.js +144 -0
  197. package/dist/mind/friends/resolver.js +54 -2
  198. package/dist/mind/friends/store-file.js +39 -3
  199. package/dist/mind/friends/trust-explanation.js +74 -0
  200. package/dist/mind/friends/types.js +2 -2
  201. package/dist/mind/journal-index.js +161 -0
  202. package/dist/mind/note-search.js +268 -0
  203. package/dist/mind/obligation-steering.js +221 -0
  204. package/dist/mind/pending.js +4 -0
  205. package/dist/mind/prompt-refresh.js +3 -2
  206. package/dist/mind/prompt.js +940 -111
  207. package/dist/mind/provenance-trust.js +26 -0
  208. package/dist/mind/scrutiny.js +173 -0
  209. package/dist/nerves/cli-logging.js +7 -1
  210. package/dist/nerves/coverage/audit-rules.js +15 -6
  211. package/dist/nerves/coverage/audit.js +28 -2
  212. package/dist/nerves/coverage/cli.js +1 -1
  213. package/dist/nerves/coverage/contract.js +5 -5
  214. package/dist/nerves/coverage/file-completeness.js +114 -5
  215. package/dist/nerves/coverage/run-artifacts.js +1 -1
  216. package/dist/nerves/event-buffer.js +111 -0
  217. package/dist/nerves/index.js +224 -4
  218. package/dist/nerves/observation.js +20 -0
  219. package/dist/nerves/redact.js +79 -0
  220. package/dist/nerves/review/cli-main.js +5 -0
  221. package/dist/nerves/review/cli.js +156 -0
  222. package/dist/nerves/review/core.js +152 -0
  223. package/dist/nerves/runtime.js +5 -1
  224. package/dist/outlook-ui/assets/index-BPr5vNuM.css +1 -0
  225. package/dist/outlook-ui/assets/index-Cm51CY9W.js +61 -0
  226. package/dist/outlook-ui/index.html +15 -0
  227. package/dist/repertoire/ado-client.js +15 -56
  228. package/dist/repertoire/ado-semantic.js +11 -10
  229. package/dist/repertoire/api-client.js +97 -0
  230. package/dist/repertoire/bitwarden-store.js +774 -0
  231. package/dist/repertoire/bundle-templates.js +72 -0
  232. package/dist/repertoire/bw-installer.js +180 -0
  233. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  234. package/dist/repertoire/coding/context-pack.js +330 -0
  235. package/dist/repertoire/coding/feedback.js +197 -30
  236. package/dist/repertoire/coding/manager.js +158 -9
  237. package/dist/repertoire/coding/spawner.js +55 -9
  238. package/dist/repertoire/coding/tools.js +170 -7
  239. package/dist/repertoire/commerce-errors.js +109 -0
  240. package/dist/repertoire/commerce-self-test.js +156 -0
  241. package/dist/repertoire/credential-access.js +111 -0
  242. package/dist/repertoire/duffel-client.js +185 -0
  243. package/dist/repertoire/github-client.js +14 -55
  244. package/dist/repertoire/graph-client.js +11 -52
  245. package/dist/repertoire/guardrails.js +396 -0
  246. package/dist/repertoire/mcp-client.js +255 -0
  247. package/dist/repertoire/mcp-manager.js +305 -0
  248. package/dist/repertoire/mcp-tools.js +63 -0
  249. package/dist/repertoire/shell-sessions.js +133 -0
  250. package/dist/repertoire/skills.js +15 -24
  251. package/dist/repertoire/stripe-client.js +131 -0
  252. package/dist/repertoire/tasks/board.js +31 -5
  253. package/dist/repertoire/tasks/fix.js +182 -0
  254. package/dist/repertoire/tasks/index.js +16 -4
  255. package/dist/repertoire/tasks/lifecycle.js +2 -2
  256. package/dist/repertoire/tasks/parser.js +3 -2
  257. package/dist/repertoire/tasks/scanner.js +194 -37
  258. package/dist/repertoire/tasks/transitions.js +16 -78
  259. package/dist/repertoire/tool-results.js +29 -0
  260. package/dist/repertoire/tools-attachments.js +317 -0
  261. package/dist/repertoire/tools-base.js +46 -955
  262. package/dist/repertoire/tools-bluebubbles.js +1 -0
  263. package/dist/repertoire/tools-bridge.js +141 -0
  264. package/dist/repertoire/tools-bundle.js +984 -0
  265. package/dist/repertoire/tools-config.js +185 -0
  266. package/dist/repertoire/tools-continuity.js +248 -0
  267. package/dist/repertoire/tools-credential.js +381 -0
  268. package/dist/repertoire/tools-files.js +342 -0
  269. package/dist/repertoire/tools-flight.js +224 -0
  270. package/dist/repertoire/tools-flow.js +105 -0
  271. package/dist/repertoire/tools-github.js +1 -7
  272. package/dist/repertoire/tools-mail.js +1477 -0
  273. package/dist/repertoire/tools-notes.js +376 -0
  274. package/dist/repertoire/tools-session.js +749 -0
  275. package/dist/repertoire/tools-shell.js +120 -0
  276. package/dist/repertoire/tools-stripe.js +180 -0
  277. package/dist/repertoire/tools-surface.js +243 -0
  278. package/dist/repertoire/tools-teams.js +9 -39
  279. package/dist/repertoire/tools-travel.js +125 -0
  280. package/dist/repertoire/tools-trip.js +422 -0
  281. package/dist/repertoire/tools-user-profile.js +144 -0
  282. package/dist/repertoire/tools-vault.js +40 -0
  283. package/dist/repertoire/tools.js +107 -100
  284. package/dist/repertoire/travel-api-client.js +360 -0
  285. package/dist/repertoire/user-profile.js +131 -0
  286. package/dist/repertoire/vault-setup.js +246 -0
  287. package/dist/repertoire/vault-unlock.js +561 -0
  288. package/dist/scripts/claude-code-hook.js +41 -0
  289. package/dist/scripts/claude-code-stop-hook.js +47 -0
  290. package/dist/senses/attention-queue.js +116 -0
  291. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  292. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  293. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  294. package/dist/senses/bluebubbles/entry.js +73 -0
  295. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  296. package/dist/senses/bluebubbles/index.js +1881 -0
  297. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  298. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  299. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  300. package/dist/senses/bluebubbles/processed-log.js +111 -0
  301. package/dist/senses/bluebubbles/replay.js +129 -0
  302. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +2 -2
  303. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  304. package/dist/senses/cli/bracketed-paste.js +82 -0
  305. package/dist/senses/cli/image-paste.js +287 -0
  306. package/dist/senses/cli/image-ref-navigation.js +75 -0
  307. package/dist/senses/cli/ink-app.js +156 -0
  308. package/dist/senses/cli/inline-diff.js +64 -0
  309. package/dist/senses/cli/input-keys.js +174 -0
  310. package/dist/senses/cli/kill-ring.js +86 -0
  311. package/dist/senses/cli/message-list.js +51 -0
  312. package/dist/senses/cli/ouro-tui.js +605 -0
  313. package/dist/senses/cli/spinner-imperative.js +135 -0
  314. package/dist/senses/cli/spinner.js +101 -0
  315. package/dist/senses/cli/status-line.js +60 -0
  316. package/dist/senses/cli/streaming-markdown.js +526 -0
  317. package/dist/senses/cli/tool-display.js +83 -0
  318. package/dist/senses/cli/tool-render.js +85 -0
  319. package/dist/senses/cli/tui-store.js +240 -0
  320. package/dist/senses/cli/virtual-list.js +35 -0
  321. package/dist/senses/cli-entry.js +60 -8
  322. package/dist/senses/cli-layout.js +187 -0
  323. package/dist/senses/cli.js +511 -209
  324. package/dist/senses/commands.js +66 -3
  325. package/dist/senses/habit-turn-message.js +108 -0
  326. package/dist/senses/inner-dialog-worker.js +175 -21
  327. package/dist/senses/inner-dialog.js +330 -27
  328. package/dist/senses/mail-entry.js +66 -0
  329. package/dist/senses/mail.js +379 -0
  330. package/dist/senses/pipeline.js +573 -164
  331. package/dist/senses/proactive-content-guard.js +51 -0
  332. package/dist/senses/shared-turn.js +248 -0
  333. package/dist/senses/surface-tool.js +68 -0
  334. package/dist/senses/teams-entry.js +60 -8
  335. package/dist/senses/teams.js +405 -170
  336. package/dist/senses/trust-gate.js +100 -5
  337. package/dist/trips/core.js +138 -0
  338. package/dist/trips/store.js +146 -0
  339. package/package.json +37 -7
  340. package/skills/agent-commerce.md +106 -0
  341. package/skills/browser-navigation.md +117 -0
  342. package/skills/commerce-setup-guide.md +116 -0
  343. package/skills/commerce-setup.md +84 -0
  344. package/skills/configure-dev-tools.md +101 -0
  345. package/skills/travel-planning.md +138 -0
  346. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  347. package/dist/heart/daemon/subagent-installer.js +0 -166
  348. package/dist/heart/session-recall.js +0 -116
  349. package/dist/mind/associative-recall.js +0 -209
  350. package/dist/senses/bluebubbles-entry.js +0 -13
  351. package/dist/senses/bluebubbles.js +0 -1142
  352. package/dist/senses/debug-activity.js +0 -148
  353. package/subagents/README.md +0 -86
  354. package/subagents/work-doer.md +0 -237
  355. package/subagents/work-merger.md +0 -618
  356. package/subagents/work-planner.md +0 -390
  357. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  358. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  359. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  360. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  361. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  362. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  363. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  364. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  365. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  366. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  367. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  368. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  369. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  370. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  371. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  372. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ /**
3
+ * Rendering for `ouro doctor` output.
4
+ *
5
+ * Pure function: takes a DoctorResult and returns a formatted string
6
+ * with ANSI colors, category grouping, and a summary line.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.formatDoctorOutput = formatDoctorOutput;
10
+ // ── ANSI color helpers ──
11
+ const RESET = "\x1b[0m";
12
+ const BOLD = "\x1b[1m";
13
+ const DIM = "\x1b[2m";
14
+ const GREEN = "\x1b[38;2;46;204;64m";
15
+ const RED = "\x1b[38;2;231;76;60m";
16
+ const YELLOW = "\x1b[38;2;230;190;50m";
17
+ const TEAL = "\x1b[38;2;78;201;176m";
18
+ function green(text) { return `${GREEN}${text}${RESET}`; }
19
+ function red(text) { return `${RED}${text}${RESET}`; }
20
+ function yellow(text) { return `${YELLOW}${text}${RESET}`; }
21
+ function bold(text) { return `${BOLD}${text}${RESET}`; }
22
+ function dim(text) { return `${DIM}${text}${RESET}`; }
23
+ function teal(text) { return `${TEAL}${text}${RESET}`; }
24
+ // ── Check status symbols ──
25
+ function statusSymbol(status) {
26
+ switch (status) {
27
+ case "pass": return green("\u2714"); // checkmark
28
+ case "warn": return yellow("\u26A0"); // warning
29
+ case "fail": return red("\u2718"); // X
30
+ }
31
+ }
32
+ // ── Main formatter ──
33
+ function formatDoctorOutput(result) {
34
+ const lines = [];
35
+ lines.push("");
36
+ lines.push(` ${bold("ouro doctor")}`);
37
+ lines.push("");
38
+ for (const category of result.categories) {
39
+ lines.push(` ${teal("--")} ${bold(category.name)} ${teal("-".repeat(Math.max(1, 40 - category.name.length)))}`);
40
+ for (const check of category.checks) {
41
+ const symbol = statusSymbol(check.status);
42
+ const detail = check.detail ? ` ${dim(check.detail)}` : "";
43
+ lines.push(` ${symbol} ${check.label}${detail}`);
44
+ }
45
+ lines.push("");
46
+ }
47
+ // Summary line
48
+ const { passed, warnings, failed } = result.summary;
49
+ const parts = [
50
+ green(`${passed} passed`),
51
+ yellow(`${warnings} warning${warnings === 1 ? "" : "s"}`),
52
+ red(`${failed} failed`),
53
+ ];
54
+ lines.push(` ${parts.join(dim(" | "))}`);
55
+ lines.push("");
56
+ return lines.join("\n");
57
+ }
@@ -0,0 +1,561 @@
1
+ "use strict";
2
+ /**
3
+ * CLI output formatting and rendering helpers.
4
+ *
5
+ * Pure functions that transform data into human-readable CLI output.
6
+ * No side effects — callers handle writing to stdout.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.parseStatusPayload = parseStatusPayload;
43
+ exports.humanizeSenseName = humanizeSenseName;
44
+ exports.formatTable = formatTable;
45
+ exports.formatDaemonStatusOutput = formatDaemonStatusOutput;
46
+ exports.formatVersionOutput = formatVersionOutput;
47
+ exports.buildStoppedStatusPayload = buildStoppedStatusPayload;
48
+ exports.daemonUnavailableStatusOutput = daemonUnavailableStatusOutput;
49
+ exports.isDaemonUnavailableError = isDaemonUnavailableError;
50
+ exports.formatMcpResponse = formatMcpResponse;
51
+ const path = __importStar(require("path"));
52
+ const runtime_metadata_1 = require("./runtime-metadata");
53
+ const runtime_mode_1 = require("./runtime-mode");
54
+ const identity_1 = require("../identity");
55
+ const daemon_tombstone_1 = require("./daemon-tombstone");
56
+ const daemon_health_1 = require("./daemon-health");
57
+ const agent_discovery_1 = require("./agent-discovery");
58
+ // ── Field extractors ──
59
+ function stringField(value) {
60
+ return typeof value === "string" ? value : null;
61
+ }
62
+ function numberField(value) {
63
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
64
+ }
65
+ function booleanField(value) {
66
+ return typeof value === "boolean" ? value : null;
67
+ }
68
+ // ── Parsers ──
69
+ function parseStatusPayload(data) {
70
+ if (!data || typeof data !== "object" || Array.isArray(data))
71
+ return null;
72
+ const raw = data;
73
+ const overview = raw.overview;
74
+ const senses = raw.senses;
75
+ const workers = raw.workers;
76
+ const sync = raw.sync;
77
+ const agents = raw.agents;
78
+ const providers = raw.providers;
79
+ if (!overview || typeof overview !== "object" || Array.isArray(overview))
80
+ return null;
81
+ if (!Array.isArray(senses) || !Array.isArray(workers))
82
+ return null;
83
+ // sync, agents, and providers are optional for backward compatibility — older daemons may omit them
84
+ if (sync !== undefined && !Array.isArray(sync))
85
+ return null;
86
+ if (agents !== undefined && !Array.isArray(agents))
87
+ return null;
88
+ if (providers !== undefined && !Array.isArray(providers))
89
+ return null;
90
+ const parsedOverview = {
91
+ daemon: stringField(overview.daemon) ?? "unknown",
92
+ health: stringField(overview.health) ?? "unknown",
93
+ socketPath: stringField(overview.socketPath) ?? "unknown",
94
+ outlookUrl: stringField(overview.outlookUrl) ?? "unavailable",
95
+ version: stringField(overview.version) ?? "unknown",
96
+ lastUpdated: stringField(overview.lastUpdated) ?? "unknown",
97
+ repoRoot: stringField(overview.repoRoot) ?? "unknown",
98
+ configFingerprint: stringField(overview.configFingerprint) ?? "unknown",
99
+ workerCount: numberField(overview.workerCount) ?? 0,
100
+ senseCount: numberField(overview.senseCount) ?? 0,
101
+ entryPath: stringField(overview.entryPath) ?? "unknown",
102
+ mode: stringField(overview.mode) ?? "unknown",
103
+ };
104
+ const parsedSenses = senses.map((entry) => {
105
+ if (!entry || typeof entry !== "object" || Array.isArray(entry))
106
+ return null;
107
+ const row = entry;
108
+ const agent = stringField(row.agent);
109
+ const sense = stringField(row.sense);
110
+ const status = stringField(row.status);
111
+ const detail = stringField(row.detail);
112
+ const enabled = booleanField(row.enabled);
113
+ if (!agent || !sense || !status || detail === null || enabled === null)
114
+ return null;
115
+ return {
116
+ agent,
117
+ sense,
118
+ label: stringField(row.label) ?? undefined,
119
+ enabled,
120
+ status,
121
+ detail,
122
+ };
123
+ });
124
+ const parsedWorkers = workers.map((entry) => {
125
+ if (!entry || typeof entry !== "object" || Array.isArray(entry))
126
+ return null;
127
+ const row = entry;
128
+ const agent = stringField(row.agent);
129
+ const worker = stringField(row.worker);
130
+ const status = stringField(row.status);
131
+ const restartCount = numberField(row.restartCount);
132
+ const hasPid = Object.prototype.hasOwnProperty.call(row, "pid");
133
+ const pid = row.pid === null ? null : numberField(row.pid);
134
+ const pidInvalid = !hasPid || (row.pid !== null && pid === null);
135
+ if (!agent || !worker || !status || restartCount === null || pidInvalid)
136
+ return null;
137
+ return {
138
+ agent,
139
+ worker,
140
+ status,
141
+ pid,
142
+ restartCount,
143
+ lastExitCode: numberField(row.lastExitCode) ?? null,
144
+ lastSignal: stringField(row.lastSignal) ?? null,
145
+ startedAt: stringField(row.startedAt) ?? null,
146
+ errorReason: stringField(row.errorReason) ?? null,
147
+ fixHint: stringField(row.fixHint) ?? null,
148
+ };
149
+ });
150
+ const parsedSync = (sync ?? []).map((entry) => {
151
+ if (!entry || typeof entry !== "object" || Array.isArray(entry))
152
+ return null;
153
+ const row = entry;
154
+ const agent = stringField(row.agent);
155
+ const enabled = booleanField(row.enabled);
156
+ const remote = stringField(row.remote);
157
+ if (!agent || enabled === null || !remote)
158
+ return null;
159
+ const parsed = { agent, enabled, remote };
160
+ const remoteUrl = stringField(row.remoteUrl);
161
+ if (remoteUrl !== null)
162
+ parsed.remoteUrl = remoteUrl;
163
+ const gitInitialized = booleanField(row.gitInitialized);
164
+ if (gitInitialized !== null)
165
+ parsed.gitInitialized = gitInitialized;
166
+ return parsed;
167
+ });
168
+ const parsedAgents = (agents ?? []).map((entry) => {
169
+ if (!entry || typeof entry !== "object" || Array.isArray(entry))
170
+ return null;
171
+ const row = entry;
172
+ const name = stringField(row.name);
173
+ const enabled = booleanField(row.enabled);
174
+ if (!name || enabled === null)
175
+ return null;
176
+ return { name, enabled };
177
+ });
178
+ const parsedProviders = (providers ?? []).map((entry) => {
179
+ if (!entry || typeof entry !== "object" || Array.isArray(entry))
180
+ return null;
181
+ const row = entry;
182
+ const agent = stringField(row.agent);
183
+ const lane = stringField(row.lane);
184
+ const provider = stringField(row.provider);
185
+ const model = stringField(row.model);
186
+ const source = stringField(row.source);
187
+ const readiness = stringField(row.readiness);
188
+ const credential = stringField(row.credential);
189
+ if (!agent || !lane || !provider || !model || !source || !readiness || !credential)
190
+ return null;
191
+ const parsed = {
192
+ agent,
193
+ lane,
194
+ provider,
195
+ model,
196
+ source,
197
+ readiness,
198
+ credential,
199
+ };
200
+ const detail = stringField(row.detail);
201
+ if (detail !== null)
202
+ parsed.detail = detail;
203
+ return parsed;
204
+ });
205
+ if (parsedSenses.some((row) => row === null) ||
206
+ parsedWorkers.some((row) => row === null) ||
207
+ parsedSync.some((row) => row === null) ||
208
+ parsedAgents.some((row) => row === null) ||
209
+ parsedProviders.some((row) => row === null))
210
+ return null;
211
+ return {
212
+ overview: parsedOverview,
213
+ senses: parsedSenses,
214
+ workers: parsedWorkers,
215
+ sync: parsedSync,
216
+ agents: parsedAgents,
217
+ providers: parsedProviders,
218
+ };
219
+ }
220
+ // ── ANSI color helpers (private) ──
221
+ const RESET = "\x1b[0m";
222
+ const BOLD = "\x1b[1m";
223
+ const DIM = "\x1b[2m";
224
+ const TEAL = "\x1b[38;2;78;201;176m";
225
+ const GREEN = "\x1b[38;2;46;204;64m";
226
+ const RED = "\x1b[38;2;231;76;60m";
227
+ const YELLOW = "\x1b[38;2;230;190;50m";
228
+ /* v8 ignore start -- cosmetic ANSI wrappers @preserve */
229
+ function teal(text) { return `${TEAL}${text}${RESET}`; }
230
+ function green(text) { return `${GREEN}${text}${RESET}`; }
231
+ function red(text) { return `${RED}${text}${RESET}`; }
232
+ function yellow(text) { return `${YELLOW}${text}${RESET}`; }
233
+ function bold(text) { return `${BOLD}${text}${RESET}`; }
234
+ function dim(text) { return `${DIM}${text}${RESET}`; }
235
+ /* v8 ignore stop */
236
+ /* v8 ignore start -- cosmetic display: status dot color mapping tested visually @preserve */
237
+ function statusDot(status) {
238
+ switch (status) {
239
+ case "running":
240
+ case "ok":
241
+ case "interactive":
242
+ case "enabled":
243
+ case "ready":
244
+ return green("●");
245
+ case "crashed":
246
+ case "warn":
247
+ case "error":
248
+ case "failed":
249
+ return red("●");
250
+ case "needs_config":
251
+ case "not_attached":
252
+ case "stale":
253
+ return yellow("●");
254
+ case "disabled":
255
+ case "stopped":
256
+ return dim("○");
257
+ default:
258
+ return dim("●");
259
+ }
260
+ }
261
+ /* v8 ignore stop */
262
+ // ── Formatters ──
263
+ function humanizeSenseName(sense, label) {
264
+ if (label)
265
+ return label;
266
+ if (sense === "cli")
267
+ return "CLI";
268
+ if (sense === "bluebubbles")
269
+ return "BlueBubbles";
270
+ if (sense === "teams")
271
+ return "Teams";
272
+ return sense;
273
+ }
274
+ /* v8 ignore start -- utility formatter; retained for non-status table output @preserve */
275
+ function formatTable(headers, rows) {
276
+ const widths = headers.map((header, index) => Math.max(header.length, ...rows.map((row) => row[index].length)));
277
+ const renderRow = (row) => `| ${row.map((cell, index) => (index === row.length - 1
278
+ ? cell
279
+ : cell.padEnd(widths[index]))).join(" | ")} |`;
280
+ const divider = `|-${widths.map((width) => "-".repeat(width)).join("-|-")}-|`;
281
+ return [
282
+ renderRow(headers),
283
+ divider,
284
+ ...rows.map(renderRow),
285
+ ].join("\n");
286
+ }
287
+ /* v8 ignore stop */
288
+ function formatDaemonStatusOutput(response, fallback) {
289
+ const payload = parseStatusPayload(response.data);
290
+ if (!payload)
291
+ return fallback;
292
+ const ov = payload.overview;
293
+ const lines = [];
294
+ // ── Header banner ──
295
+ const modeTag = ov.mode === "dev" ? "dev" : "";
296
+ const daemonStatus = ov.daemon === "running" ? green("●") + " " + bold("running") : red("●") + " " + bold(ov.daemon);
297
+ const modeStr = modeTag ? ` ${dim(`(${modeTag})`)}` : "";
298
+ const bannerContent = ` ${bold(ov.version)} ${daemonStatus}${modeStr} `;
299
+ // Measure raw content width (strip ANSI for width calc)
300
+ const rawBanner = bannerContent.replace(/\x1b\[[0-9;]*m/g, "");
301
+ const bannerWidth = Math.max(rawBanner.length, 42);
302
+ const titleLabel = " ouroboros daemon ";
303
+ const topRightPad = Math.max(0, bannerWidth - titleLabel.length - 2);
304
+ lines.push(` ${teal("╭─")}${teal(titleLabel)}${teal("─".repeat(topRightPad))}${teal("╮")}`);
305
+ lines.push(` ${teal("│")}${bannerContent}${" ".repeat(Math.max(0, bannerWidth - rawBanner.length))}${teal("│")}`);
306
+ lines.push(` ${teal("╰")}${teal("─".repeat(bannerWidth))}${teal("╯")}`);
307
+ lines.push("");
308
+ // ── Key-value overview ──
309
+ const kvLine = (label, value) => ` ${teal(label.padEnd(11))} ${value}`;
310
+ lines.push(kvLine("Socket", ov.socketPath));
311
+ lines.push(kvLine("Mailbox", ov.outlookUrl));
312
+ lines.push(kvLine("Health", `${statusDot(ov.health)} ${ov.health}`));
313
+ lines.push(kvLine("Updated", ov.lastUpdated));
314
+ lines.push("");
315
+ // ── Agents ──
316
+ // Every discovered bundle, including disabled ones. The Senses/Workers/
317
+ // Git Sync sections below only show enabled bundles, so without this
318
+ // section disabled agents would be invisible in `ouro status`.
319
+ if (payload.agents.length > 0) {
320
+ lines.push(` ${teal("──")} ${bold("Agents")} ${teal("─".repeat(37))}`);
321
+ const agentNameWidth = Math.max(12, ...payload.agents.map((r) => r.name.length));
322
+ for (const row of payload.agents) {
323
+ const name = row.name.padEnd(agentNameWidth);
324
+ const dot = row.enabled ? green("●") : dim("○");
325
+ const stateText = row.enabled ? "enabled " : "disabled";
326
+ lines.push(` ${name} ${dot} ${stateText}`);
327
+ }
328
+ lines.push("");
329
+ }
330
+ // ── Providers ──
331
+ if (payload.providers.length > 0) {
332
+ lines.push(` ${teal("──")} ${bold("Providers")} ${teal("─".repeat(34))}`);
333
+ const agentLaneWidth = Math.max(16, ...payload.providers.map((r) => `${r.agent} ${r.lane}`.length));
334
+ for (const row of payload.providers) {
335
+ const agentLane = `${row.agent} ${row.lane}`.padEnd(agentLaneWidth);
336
+ const model = `${row.provider} / ${row.model}`;
337
+ const detail = [row.readiness, row.detail, row.source, row.credential].filter(Boolean).join("; ");
338
+ lines.push(` ${agentLane} ${statusDot(row.readiness)} ${model} ${dim(detail)}`);
339
+ }
340
+ lines.push("");
341
+ }
342
+ // ── Senses ──
343
+ if (payload.senses.length > 0) {
344
+ lines.push(` ${teal("──")} ${bold("Senses")} ${teal("─".repeat(37))}`);
345
+ // Group senses by agent
346
+ const sensesByAgent = new Map();
347
+ for (const row of payload.senses) {
348
+ const list = sensesByAgent.get(row.agent) ?? [];
349
+ list.push(row);
350
+ sensesByAgent.set(row.agent, list);
351
+ }
352
+ // Calculate column widths for alignment
353
+ const allSenseNames = payload.senses.map((r) => humanizeSenseName(r.sense, r.label));
354
+ const nameWidth = Math.max(12, ...allSenseNames.map((n) => n.length));
355
+ const allStatuses = payload.senses.map((r) => r.status);
356
+ const statusWidth = Math.max(10, ...allStatuses.map((s) => s.length));
357
+ for (const [agent, rows] of sensesByAgent) {
358
+ lines.push(` ${bold(agent)}`);
359
+ for (const row of rows) {
360
+ const name = humanizeSenseName(row.sense, row.label).padEnd(nameWidth);
361
+ const dot = row.enabled ? statusDot(row.status) : dim("○");
362
+ const statusText = (row.enabled ? row.status : "disabled").padEnd(statusWidth);
363
+ lines.push(` ${name} ${dot} ${statusText} ${dim(row.detail)}`);
364
+ }
365
+ }
366
+ lines.push("");
367
+ }
368
+ // ── Workers ──
369
+ if (payload.workers.length > 0) {
370
+ lines.push(` ${teal("──")} ${bold("Workers")} ${teal("─".repeat(36))}`);
371
+ // Group workers by agent
372
+ const workersByAgent = new Map();
373
+ for (const row of payload.workers) {
374
+ const list = workersByAgent.get(row.agent) ?? [];
375
+ list.push(row);
376
+ workersByAgent.set(row.agent, list);
377
+ }
378
+ const allWorkerNames = payload.workers.map((r) => r.worker);
379
+ const workerNameWidth = Math.max(12, ...allWorkerNames.map((n) => n.length));
380
+ for (const [agent, rows] of workersByAgent) {
381
+ lines.push(` ${bold(agent)}`);
382
+ for (const row of rows) {
383
+ const name = row.worker.padEnd(workerNameWidth);
384
+ const dot = statusDot(row.status);
385
+ const pidStr = row.pid !== null ? `pid ${row.pid}` : "";
386
+ const restartStr = `restarts: ${row.restartCount}`;
387
+ /* v8 ignore start — exit info branches tested via daemon-crash-context; v8 misreports conditional chains @preserve */
388
+ let exitStr = "";
389
+ if (row.lastExitCode !== null)
390
+ exitStr = `exit=${row.lastExitCode}`;
391
+ if (row.lastSignal !== null)
392
+ exitStr = row.lastExitCode !== null ? `exit=${row.lastExitCode} sig=${row.lastSignal}` : `sig=${row.lastSignal}`;
393
+ /* v8 ignore stop */
394
+ const details = [pidStr, restartStr, exitStr].filter(Boolean).join(" ");
395
+ lines.push(` ${name} ${dot} ${row.status.padEnd(10)} ${dim(details)}`);
396
+ if (row.errorReason) {
397
+ lines.push(` ${dim(`error: ${row.errorReason}`)}`);
398
+ }
399
+ if (row.fixHint) {
400
+ lines.push(` ${dim(`fix: ${row.fixHint}`)}`);
401
+ }
402
+ }
403
+ }
404
+ lines.push("");
405
+ }
406
+ // ── Git Sync (per agent) ──
407
+ if (payload.sync.length > 0) {
408
+ lines.push(` ${teal("──")} ${bold("Git Sync")} ${teal("─".repeat(35))}`);
409
+ const agentNameWidth = Math.max(12, ...payload.sync.map((r) => r.agent.length));
410
+ for (const row of payload.sync) {
411
+ const name = row.agent.padEnd(agentNameWidth);
412
+ // Three states for enabled rows: error (not a repo), ok (remote URL), ok (local only).
413
+ // Disabled rows show the usual dim dot + "disabled".
414
+ let dot;
415
+ let stateText;
416
+ let detail;
417
+ if (!row.enabled) {
418
+ dot = dim("○");
419
+ stateText = "disabled".padEnd(10);
420
+ detail = "";
421
+ }
422
+ else if (row.gitInitialized === false) {
423
+ dot = red("●");
424
+ stateText = "error ".padEnd(10);
425
+ detail = "not a git repo — run `git init` to enable sync";
426
+ }
427
+ else if (row.remoteUrl !== undefined) {
428
+ dot = green("●");
429
+ stateText = "enabled ".padEnd(10);
430
+ detail = `${row.remote} → ${row.remoteUrl}`;
431
+ }
432
+ else {
433
+ dot = green("●");
434
+ stateText = "enabled ".padEnd(10);
435
+ detail = "local only";
436
+ }
437
+ lines.push(` ${name} ${dot} ${stateText} ${dim(detail)}`);
438
+ }
439
+ lines.push("");
440
+ }
441
+ return lines.join("\n");
442
+ }
443
+ function formatVersionOutput() {
444
+ const version = (0, runtime_metadata_1.getRuntimeMetadata)().version;
445
+ const mode = (0, runtime_mode_1.detectRuntimeMode)((0, identity_1.getRepoRoot)());
446
+ /* v8 ignore start — cosmetic display toggle; dev mode always true in test env */
447
+ return mode === "dev" ? `${version} (dev)` : version;
448
+ /* v8 ignore stop */
449
+ }
450
+ function buildStoppedStatusPayload(socketPath, syncRows = [], agentRows = []) {
451
+ const metadata = (0, runtime_metadata_1.getRuntimeMetadata)();
452
+ const repoRoot = (0, identity_1.getRepoRoot)();
453
+ return {
454
+ overview: {
455
+ daemon: "stopped",
456
+ health: "warn",
457
+ socketPath,
458
+ outlookUrl: "unavailable",
459
+ version: metadata.version,
460
+ lastUpdated: metadata.lastUpdated,
461
+ repoRoot: metadata.repoRoot,
462
+ configFingerprint: metadata.configFingerprint,
463
+ workerCount: 0,
464
+ senseCount: 0,
465
+ entryPath: path.join(repoRoot, "dist", "heart", "daemon", "daemon-entry.js"),
466
+ mode: (0, runtime_mode_1.detectRuntimeMode)(repoRoot),
467
+ },
468
+ senses: [],
469
+ workers: [],
470
+ sync: syncRows,
471
+ agents: agentRows,
472
+ providers: [],
473
+ };
474
+ }
475
+ function daemonUnavailableStatusOutput(socketPath, healthFilePath) {
476
+ // Read per-agent sync config and bundle list from disk so the user still
477
+ // sees them when the daemon is down. Best-effort: any fs error returns []
478
+ // and the corresponding section is omitted.
479
+ let syncRows = [];
480
+ let agentRows = [];
481
+ try {
482
+ syncRows = (0, agent_discovery_1.listBundleSyncRows)();
483
+ }
484
+ catch {
485
+ // listBundleSyncRows already swallows fs errors internally; this catch is a defensive
486
+ // safety net for environments where the fs module itself is partially mocked.
487
+ }
488
+ try {
489
+ agentRows = (0, agent_discovery_1.listAllBundleAgents)();
490
+ }
491
+ catch {
492
+ // Same defensive safety net for the bundle list.
493
+ }
494
+ /* v8 ignore start — tombstone read tested in daemon-status-tombstone.test; branch misreported @preserve */
495
+ const tombstone = (0, daemon_tombstone_1.readDaemonTombstone)();
496
+ const deathLine = tombstone
497
+ ? `Last death: ${tombstone.timestamp} -- ${tombstone.reason}: ${tombstone.message}`
498
+ : null;
499
+ /* v8 ignore stop */
500
+ const lines = [
501
+ formatDaemonStatusOutput({
502
+ ok: true,
503
+ summary: "daemon not running",
504
+ data: buildStoppedStatusPayload(socketPath, syncRows, agentRows),
505
+ }, "daemon not running"),
506
+ "",
507
+ ];
508
+ /* v8 ignore start — tombstone presence requires real daemon crash @preserve */
509
+ if (deathLine) {
510
+ lines.push(deathLine);
511
+ lines.push("");
512
+ /* v8 ignore stop */
513
+ }
514
+ // Read health file for last-known state (best-effort)
515
+ const resolvedHealthPath = healthFilePath ?? (0, daemon_health_1.getDefaultHealthPath)();
516
+ const health = (0, daemon_health_1.readHealth)(resolvedHealthPath);
517
+ if (health) {
518
+ lines.push(`Last known status: ${health.status} (pid ${health.pid}, uptime ${health.uptimeSeconds}s)`);
519
+ if (health.safeMode?.active) {
520
+ lines.push(`SAFE MODE: ${health.safeMode.reason}`);
521
+ }
522
+ if (health.degraded.length > 0) {
523
+ lines.push("");
524
+ lines.push("Degraded:");
525
+ for (const d of health.degraded) {
526
+ lines.push(` ${d.component}: ${d.reason} (since ${d.since})`);
527
+ }
528
+ }
529
+ lines.push("");
530
+ }
531
+ lines.push("daemon not running; run `ouro up`");
532
+ return lines.join("\n");
533
+ }
534
+ function isDaemonUnavailableError(error) {
535
+ const code = typeof error === "object" && error !== null && "code" in error
536
+ ? String(error.code ?? "")
537
+ : "";
538
+ return code === "ENOENT" || code === "ECONNREFUSED";
539
+ }
540
+ function formatMcpResponse(command, response) {
541
+ if (command.kind === "mcp.list") {
542
+ const allTools = response.data;
543
+ if (!allTools || allTools.length === 0) {
544
+ return response.message ?? "no tools available from connected MCP servers";
545
+ }
546
+ const lines = [];
547
+ for (const entry of allTools) {
548
+ lines.push(`[${entry.server}]`);
549
+ for (const tool of entry.tools) {
550
+ lines.push(` ${tool.name}: ${tool.description}`);
551
+ }
552
+ }
553
+ return lines.join("\n");
554
+ }
555
+ // mcp.call
556
+ const result = response.data;
557
+ if (!result) {
558
+ return response.message ?? "no result";
559
+ }
560
+ return result.content.map((c) => c.text).join("\n");
561
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ /**
3
+ * CLI command types and dependency interface.
4
+ *
5
+ * Extracted from daemon-cli.ts — the OuroCliCommand union and OuroCliDeps
6
+ * interface are the contract between parsing, execution, and default wiring.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });