@ouro.bot/cli 0.1.0-alpha.44 → 0.1.0-alpha.441

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 +2789 -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 +439 -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 +214 -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 +626 -0
  44. package/dist/heart/daemon/cli-exec.js +5646 -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 +457 -0
  51. package/dist/heart/daemon/daemon-cli.js +28 -1582
  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 +175 -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 +236 -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 +307 -0
  67. package/dist/heart/daemon/launchd.js +46 -9
  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 +76 -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 +145 -32
  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 +272 -0
  90. package/dist/heart/daemon/task-scheduler.js +3 -25
  91. package/dist/heart/daemon/terminal-ui.js +224 -0
  92. package/dist/heart/daemon/thoughts.js +510 -0
  93. package/dist/heart/daemon/up-progress.js +313 -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 +239 -0
  128. package/dist/heart/provider-credentials.js +400 -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 +239 -0
  132. package/dist/heart/provider-state.js +216 -0
  133. package/dist/heart/provider-visibility.js +186 -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 +733 -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} +260 -9
  267. package/dist/senses/bluebubbles/entry.js +73 -0
  268. package/dist/senses/bluebubbles/inbound-log.js +113 -0
  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} +45 -3
  273. package/dist/senses/bluebubbles/replay.js +129 -0
  274. package/dist/senses/bluebubbles/runtime-state.js +109 -0
  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 -11
  318. package/dist/senses/bluebubbles.js +0 -854
  319. package/dist/senses/debug-activity.js +0 -127
  320. package/subagents/README.md +0 -86
  321. package/subagents/work-doer.md +0 -235
  322. package/subagents/work-merger.md +0 -618
  323. package/subagents/work-planner.md +0 -382
  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
@@ -0,0 +1,457 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.summarizeProviderLane = summarizeProviderLane;
4
+ exports.summarizeProvidersForConnect = summarizeProvidersForConnect;
5
+ exports.connectEntryNeedsAttention = connectEntryNeedsAttention;
6
+ exports.renderConnectBay = renderConnectBay;
7
+ const runtime_1 = require("../../nerves/runtime");
8
+ const terminal_ui_1 = require("./terminal-ui");
9
+ const readiness_repair_1 = require("./readiness-repair");
10
+ const CONNECT_STATUS_PRIORITY = {
11
+ "needs attention": 0,
12
+ locked: 1,
13
+ "needs credentials": 2,
14
+ "needs setup": 3,
15
+ missing: 4,
16
+ "not attached": 5,
17
+ ready: 6,
18
+ attached: 6,
19
+ };
20
+ const RESET = "\x1b[0m";
21
+ const BOLD = "\x1b[1m";
22
+ const TEAL = "\x1b[38;2;78;201;176m";
23
+ const GREEN = "\x1b[38;2;46;204;64m";
24
+ const GOLD = "\x1b[38;2;230;190;50m";
25
+ const BONE = "\x1b[38;2;238;242;234m";
26
+ const MIST = "\x1b[38;2;165;184;168m";
27
+ const ANSI_RE = /\x1b\[[0-9;]*m/g;
28
+ function stripAnsi(text) {
29
+ return text.replace(ANSI_RE, "");
30
+ }
31
+ function visibleLength(text) {
32
+ return stripAnsi(text).length;
33
+ }
34
+ function padAnsi(text, width) {
35
+ const missing = Math.max(0, width - visibleLength(text));
36
+ return `${text}${" ".repeat(missing)}`;
37
+ }
38
+ function wrapPlain(text, width) {
39
+ const normalized = text.trim();
40
+ if (!normalized)
41
+ return [""];
42
+ const words = normalized.split(/\s+/);
43
+ const lines = [];
44
+ let current = "";
45
+ for (const word of words) {
46
+ if (!current) {
47
+ current = word;
48
+ continue;
49
+ }
50
+ const candidate = `${current} ${word}`;
51
+ if (candidate.length <= width) {
52
+ current = candidate;
53
+ continue;
54
+ }
55
+ lines.push(current);
56
+ current = word;
57
+ }
58
+ lines.push(current);
59
+ return lines;
60
+ }
61
+ function tty(text, color, bold = false) {
62
+ if (bold)
63
+ return `${color}${BOLD}${text}${RESET}`;
64
+ return `${color}${text}${RESET}`;
65
+ }
66
+ function escapeRegExp(value) {
67
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
68
+ }
69
+ function cleanExtractedCommand(command) {
70
+ const cleaned = command?.trim().replace(/[`'",;:.)]+$/g, "").trim();
71
+ return cleaned && cleaned.length > 0 ? cleaned : undefined;
72
+ }
73
+ function extractCommand(fixHint, commandPrefix) {
74
+ const escapedPrefix = escapeRegExp(commandPrefix);
75
+ const commandBody = `${escapedPrefix}(?=\\s|$)[^\`'"]*`;
76
+ const quoted = fixHint.match(new RegExp(`[\`'"](${commandBody})[\`'"]`, "i"))?.[1];
77
+ const unquoted = fixHint.match(new RegExp(`(${escapedPrefix}(?=\\s|$)[^\\n,;.]+)`, "i"))?.[1];
78
+ return cleanExtractedCommand(quoted) ?? cleanExtractedCommand(unquoted);
79
+ }
80
+ function resolveProviderHealthStatus(providerHealth) {
81
+ if (!providerHealth || providerHealth.ok)
82
+ return undefined;
83
+ const issue = providerHealth.issue;
84
+ if (issue?.kind === "vault-locked")
85
+ return "locked";
86
+ if (issue?.kind === "vault-unconfigured")
87
+ return "needs setup";
88
+ if (issue?.kind === "provider-credentials-missing")
89
+ return "needs credentials";
90
+ if (issue?.kind === "provider-live-check-failed") {
91
+ return issue.actions[0]?.kind === "provider-auth" ? "needs credentials" : "needs attention";
92
+ }
93
+ const error = String(providerHealth.error).toLowerCase();
94
+ const fix = String(providerHealth.fix).toLowerCase();
95
+ if (error.includes("failed live check"))
96
+ return "needs attention";
97
+ if (error.includes("has no credentials"))
98
+ return "needs credentials";
99
+ if (error.includes("missing") && error.includes("provider"))
100
+ return "needs setup";
101
+ if (error.includes("vault is locked") || error.includes("vault locked"))
102
+ return "locked";
103
+ if (fix.includes("ouro auth verify"))
104
+ return "needs attention";
105
+ if (fix.includes("ouro auth"))
106
+ return "needs credentials";
107
+ if (fix.includes("ouro use"))
108
+ return "needs setup";
109
+ if (fix.includes("vault unlock"))
110
+ return "locked";
111
+ return "needs attention";
112
+ }
113
+ function resolveProviderHealthCommand(providerHealth, status) {
114
+ const issueCommand = (0, readiness_repair_1.preferredConnectRepairAction)(providerHealth?.issue)?.command;
115
+ if (issueCommand)
116
+ return issueCommand;
117
+ const fixHint = providerHealth?.fix;
118
+ if (!fixHint)
119
+ return undefined;
120
+ const prefixes = status === "locked"
121
+ ? ["ouro vault unlock", "ouro vault replace", "ouro vault recover"]
122
+ : status === "needs credentials"
123
+ ? ["ouro auth", "ouro connect", "ouro provider refresh", "ouro up"]
124
+ : status === "needs setup"
125
+ ? ["ouro use", "ouro connect", "ouro auth", "ouro up"]
126
+ : ["ouro auth verify", "ouro auth", "ouro provider refresh", "ouro use", "ouro connect", "ouro vault unlock", "ouro up"];
127
+ for (const prefix of prefixes) {
128
+ const command = extractCommand(fixHint, prefix);
129
+ if (command)
130
+ return command;
131
+ }
132
+ return undefined;
133
+ }
134
+ function isProblemStatus(status) {
135
+ return status !== "ready" && status !== "attached";
136
+ }
137
+ function statusChip(status) {
138
+ const symbol = status === "ready" || status === "attached"
139
+ ? "●"
140
+ : status === "not attached"
141
+ ? "◌"
142
+ : "◆";
143
+ const label = `${symbol} ${status}`;
144
+ if (status === "ready" || status === "attached")
145
+ return tty(label, GREEN, true);
146
+ if (status === "not attached")
147
+ return tty(label, MIST);
148
+ return tty(label, GOLD, true);
149
+ }
150
+ function sectionTitle(title, width) {
151
+ const plain = `╭─ ${title} `;
152
+ const rule = "─".repeat(Math.max(0, width - plain.length - 1));
153
+ return `${tty("╭─ ", TEAL)}${tty(title, BONE, true)}${tty(` ${rule}╮`, TEAL)}`;
154
+ }
155
+ function bottomRule(width) {
156
+ const line = `╰${"─".repeat(Math.max(0, width - 2))}╯`;
157
+ return tty(line, TEAL);
158
+ }
159
+ function bodyLine(text, width) {
160
+ const padded = padAnsi(text, Math.max(0, width - 4));
161
+ return `${tty("│ ", TEAL)}${padded}${tty(" │", TEAL)}`;
162
+ }
163
+ function panel(title, body, width) {
164
+ const lines = [sectionTitle(title, width)];
165
+ for (const line of body) {
166
+ lines.push(bodyLine(line, width));
167
+ }
168
+ lines.push(bottomRule(width));
169
+ return lines;
170
+ }
171
+ function renderHeader(agent, width) {
172
+ return panel(`${agent} connect bay`, [
173
+ tty("Bring one capability online.", BONE, true),
174
+ tty("Everything on this screen was checked live just now.", MIST),
175
+ ], width);
176
+ }
177
+ function nextMoveBody(entry) {
178
+ if (!entry) {
179
+ return [
180
+ tty("Everything here is ready.", BONE, true),
181
+ tty("Pick what you want to review or refresh.", MIST),
182
+ ];
183
+ }
184
+ const lines = [
185
+ `${entry.name} ${statusChip(entry.status)}`,
186
+ ];
187
+ if (entry.nextNote)
188
+ lines.push(entry.nextNote);
189
+ if (entry.nextAction)
190
+ lines.push(tty(entry.nextAction, MIST));
191
+ return lines;
192
+ }
193
+ function renderProviderBody(entry, width) {
194
+ const lines = [
195
+ `${entry.option} ${entry.name} ${statusChip(entry.status)}`,
196
+ ];
197
+ const lanes = entry.laneSummaries ?? [];
198
+ for (const [index, lane] of lanes.entries()) {
199
+ if (index > 0)
200
+ lines.push("");
201
+ const laneLabel = lane.lane === "outward" ? "Outward lane" : "Inner lane";
202
+ lines.push(tty(laneLabel, BONE, true));
203
+ lines.push(lane.title);
204
+ lines.push(isProblemStatus(lane.status) ? lane.detail : tty(lane.detail, MIST));
205
+ }
206
+ if (lanes.length === 0) {
207
+ for (const detail of entry.detailLines ?? [])
208
+ lines.push(detail);
209
+ }
210
+ return normalizeWrappedBody(lines, width);
211
+ }
212
+ function renderCapabilityBody(entries, width) {
213
+ const lines = [];
214
+ for (const [index, entry] of entries.entries()) {
215
+ if (index > 0)
216
+ lines.push("");
217
+ lines.push(`${entry.option} ${entry.name} ${statusChip(entry.status)}`);
218
+ if (entry.description) {
219
+ lines.push(isProblemStatus(entry.status) ? entry.description : tty(entry.description, MIST));
220
+ }
221
+ for (const detail of entry.detailLines ?? []) {
222
+ lines.push(detail);
223
+ }
224
+ }
225
+ return normalizeWrappedBody(lines, width);
226
+ }
227
+ function normalizeWrappedBody(lines, width) {
228
+ const wrapped = [];
229
+ for (const line of lines) {
230
+ if (!line) {
231
+ wrapped.push("");
232
+ continue;
233
+ }
234
+ const plain = stripAnsi(line);
235
+ if (plain.length <= width - 4) {
236
+ wrapped.push(line);
237
+ continue;
238
+ }
239
+ const segments = wrapPlain(plain, width - 4);
240
+ wrapped.push(...segments);
241
+ }
242
+ return wrapped;
243
+ }
244
+ function stackPanels(panels) {
245
+ const lines = [];
246
+ for (const [index, panelLines] of panels.entries()) {
247
+ if (index > 0)
248
+ lines.push("");
249
+ lines.push(...panelLines);
250
+ }
251
+ return lines;
252
+ }
253
+ function combineColumns(left, right, leftWidth, rightWidth, gap = 2) {
254
+ const total = Math.max(left.length, right.length);
255
+ const lines = [];
256
+ for (let index = 0; index < total; index += 1) {
257
+ const leftLine = left[index] ?? " ".repeat(leftWidth);
258
+ const rightLine = right[index] ?? " ".repeat(rightWidth);
259
+ lines.push(`${padAnsi(leftLine, leftWidth)}${" ".repeat(gap)}${padAnsi(rightLine, rightWidth)}`);
260
+ }
261
+ return lines;
262
+ }
263
+ function renderTtyBay(entries, options) {
264
+ const columns = Math.max(options.columns ?? 108, 72);
265
+ const fullWidth = Math.max(56, columns - 2);
266
+ const masthead = (0, terminal_ui_1.renderOuroMasthead)({
267
+ isTTY: true,
268
+ columns,
269
+ subtitle: "Bring one capability online at a time.",
270
+ }).trimEnd();
271
+ const header = renderHeader(options.agent, fullWidth);
272
+ const nextEntry = entries.find((entry) => isProblemStatus(entry.status));
273
+ const providerEntry = entries.find((entry) => entry.section === "Provider core");
274
+ const portableEntries = entries.filter((entry) => entry.section === "Portable");
275
+ const machineEntries = entries.filter((entry) => entry.section === "This machine");
276
+ const wide = columns >= 118;
277
+ const footer = [
278
+ tty("Pick a path. Type the number or the name.", MIST),
279
+ options.prompt,
280
+ ];
281
+ if (!wide) {
282
+ const panels = [
283
+ header,
284
+ panel("Next best move", nextMoveBody(nextEntry), fullWidth),
285
+ panel("Provider core", renderProviderBody(providerEntry, fullWidth), fullWidth),
286
+ panel("Portable", renderCapabilityBody(portableEntries, fullWidth), fullWidth),
287
+ panel("This machine", renderCapabilityBody(machineEntries, fullWidth), fullWidth),
288
+ ];
289
+ return [masthead, "", ...stackPanels(panels), "", ...footer].join("\n");
290
+ }
291
+ const gap = 2;
292
+ const leftWidth = Math.max(52, Math.floor((fullWidth - gap) / 2));
293
+ const rightWidth = Math.max(40, fullWidth - gap - leftWidth);
294
+ const topRow = combineColumns(panel("Next best move", nextMoveBody(nextEntry), leftWidth), panel("This machine", renderCapabilityBody(machineEntries, rightWidth), rightWidth), leftWidth, rightWidth, gap);
295
+ const bottomRow = combineColumns(panel("Provider core", renderProviderBody(providerEntry, leftWidth), leftWidth), panel("Portable", renderCapabilityBody(portableEntries, rightWidth), rightWidth), leftWidth, rightWidth, gap);
296
+ return [masthead, "", ...header, "", ...topRow, "", ...bottomRow, "", ...footer].join("\n");
297
+ }
298
+ function renderNonTtyBay(entries, options) {
299
+ const nextEntry = entries.find((entry) => isProblemStatus(entry.status));
300
+ const lines = [
301
+ `${options.agent} connect bay`,
302
+ "Bring one capability online. Provider status was checked live just now.",
303
+ "",
304
+ "Next best move",
305
+ "--------------",
306
+ ];
307
+ if (!nextEntry) {
308
+ lines.push("Everything here is ready. Pick what you want to review or refresh.");
309
+ }
310
+ else {
311
+ lines.push(`${nextEntry.name} - ${nextEntry.status}`);
312
+ if (nextEntry.nextNote)
313
+ lines.push(nextEntry.nextNote);
314
+ if (nextEntry.nextAction)
315
+ lines.push(`run: ${nextEntry.nextAction}`);
316
+ }
317
+ lines.push("");
318
+ for (const section of ["Provider core", "Portable", "This machine"]) {
319
+ lines.push(section);
320
+ lines.push("-".repeat(Math.max(6, section.length + 4)));
321
+ for (const entry of entries.filter((candidate) => candidate.section === section)) {
322
+ lines.push(`${entry.option}. ${entry.name} [${entry.status}]`);
323
+ if (entry.laneSummaries && entry.laneSummaries.length > 0) {
324
+ for (const lane of entry.laneSummaries) {
325
+ const laneLabel = lane.lane === "outward" ? "Outward lane" : "Inner lane";
326
+ lines.push(` ${laneLabel}: ${lane.title}`);
327
+ lines.push(` ${lane.detail}`);
328
+ }
329
+ }
330
+ else {
331
+ for (const detail of entry.detailLines ?? [])
332
+ lines.push(` ${detail}`);
333
+ }
334
+ if (entry.description)
335
+ lines.push(` ${entry.description}`);
336
+ lines.push("");
337
+ }
338
+ }
339
+ lines.push("6. Not now");
340
+ lines.push("");
341
+ lines.push("Pick a path. Type the number or the name.");
342
+ lines.push(options.prompt);
343
+ return lines.join("\n");
344
+ }
345
+ function summarizeProviderLane(agent, lane, providerHealth) {
346
+ const providerHealthStatus = resolveProviderHealthStatus(providerHealth);
347
+ const providerHealthCommand = resolveProviderHealthCommand(providerHealth, providerHealthStatus);
348
+ if (lane.status === "unconfigured") {
349
+ return {
350
+ lane: lane.lane,
351
+ status: "needs setup",
352
+ title: "choose provider and model",
353
+ detail: "needs setup",
354
+ action: lane.repairCommand,
355
+ };
356
+ }
357
+ const fallbackAction = providerHealthCommand ?? lane.credential.repairCommand;
358
+ if (lane.credential.status === "missing") {
359
+ return {
360
+ lane: lane.lane,
361
+ status: "needs credentials",
362
+ title: `${lane.provider} / ${lane.model}`,
363
+ detail: "credentials missing",
364
+ action: fallbackAction,
365
+ };
366
+ }
367
+ if (lane.credential.status === "invalid-pool") {
368
+ return {
369
+ lane: lane.lane,
370
+ status: providerHealthStatus === "locked" ? "locked" : "needs attention",
371
+ title: `${lane.provider} / ${lane.model}`,
372
+ detail: providerHealthStatus === "locked" ? "vault locked on this machine" : "vault unavailable",
373
+ action: fallbackAction,
374
+ };
375
+ }
376
+ if (providerHealth?.ok) {
377
+ return {
378
+ lane: lane.lane,
379
+ status: "ready",
380
+ title: `${lane.provider} / ${lane.model}`,
381
+ detail: "ready",
382
+ };
383
+ }
384
+ if (lane.readiness.status === "failed") {
385
+ return {
386
+ lane: lane.lane,
387
+ status: "needs attention",
388
+ title: `${lane.provider} / ${lane.model}`,
389
+ detail: `failed live check: ${lane.readiness.error ?? "unknown error"}`,
390
+ action: providerHealthCommand ?? providerHealth?.fix ?? `ouro auth --agent ${agent} --provider ${lane.provider}`,
391
+ };
392
+ }
393
+ if (lane.readiness.status === "stale") {
394
+ return {
395
+ lane: lane.lane,
396
+ status: "needs attention",
397
+ title: `${lane.provider} / ${lane.model}`,
398
+ detail: ["live check is stale", lane.readiness.reason].filter(Boolean).join(": "),
399
+ action: providerHealth?.fix,
400
+ };
401
+ }
402
+ if (lane.readiness.status === "ready") {
403
+ return {
404
+ lane: lane.lane,
405
+ status: "ready",
406
+ title: `${lane.provider} / ${lane.model}`,
407
+ detail: "ready",
408
+ };
409
+ }
410
+ return {
411
+ lane: lane.lane,
412
+ status: "needs attention",
413
+ title: `${lane.provider} / ${lane.model}`,
414
+ detail: "live check did not complete yet",
415
+ action: providerHealth?.fix,
416
+ };
417
+ }
418
+ function summarizeProvidersForConnect(agent, visibility, providerHealth) {
419
+ const laneSummaries = visibility.lanes.map((lane) => summarizeProviderLane(agent, lane, providerHealth));
420
+ const worstLaneStatus = laneSummaries.reduce((worst, lane) => CONNECT_STATUS_PRIORITY[lane.status] < CONNECT_STATUS_PRIORITY[worst] ? lane.status : worst, "ready");
421
+ const providerHealthStatus = resolveProviderHealthStatus(providerHealth);
422
+ const providerHealthCommand = resolveProviderHealthCommand(providerHealth, providerHealthStatus);
423
+ const nextLane = laneSummaries.find((lane) => isProblemStatus(lane.status));
424
+ return {
425
+ status: providerHealthStatus ?? worstLaneStatus,
426
+ laneSummaries,
427
+ detailLines: laneSummaries.flatMap((lane) => [
428
+ `${lane.lane === "outward" ? "Outward lane" : "Inner lane"}: ${lane.title}`,
429
+ lane.detail,
430
+ ]),
431
+ nextAction: providerHealthCommand ?? nextLane?.action,
432
+ nextNote: providerHealthStatus === "locked"
433
+ ? "Unlock this agent's credential vault on this machine."
434
+ : nextLane
435
+ ? `${nextLane.lane === "outward" ? "Outward lane" : "Inner lane"}: ${nextLane.detail}`
436
+ : undefined,
437
+ };
438
+ }
439
+ function connectEntryNeedsAttention(entry) {
440
+ return isProblemStatus(entry.status);
441
+ }
442
+ function renderConnectBay(entries, options) {
443
+ (0, runtime_1.emitNervesEvent)({
444
+ component: "daemon",
445
+ event: "daemon.connect_bay_rendered",
446
+ message: "rendered connect bay",
447
+ meta: {
448
+ agent: options.agent,
449
+ isTTY: options.isTTY,
450
+ entryCount: entries.length,
451
+ columns: options.columns ?? null,
452
+ },
453
+ });
454
+ if (!options.isTTY)
455
+ return renderNonTtyBay(entries, options);
456
+ return renderTtyBay(entries, options);
457
+ }