@ouro.bot/cli 0.1.0-alpha.66 → 0.1.0-alpha.660

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 (449) hide show
  1. package/README.md +127 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +4209 -13
  13. package/dist/a2a/card.js +56 -0
  14. package/dist/a2a/client.js +143 -0
  15. package/dist/a2a/config.js +50 -0
  16. package/dist/a2a/onboarding.js +111 -0
  17. package/dist/a2a/server.js +498 -0
  18. package/dist/a2a/task-store.js +69 -0
  19. package/dist/a2a/types.js +3 -0
  20. package/dist/arc/attention-types.js +8 -0
  21. package/dist/arc/cares.js +144 -0
  22. package/dist/arc/episodes.js +118 -0
  23. package/dist/arc/evolution.js +487 -0
  24. package/dist/arc/flight-recorder.js +369 -0
  25. package/dist/arc/intentions.js +134 -0
  26. package/dist/arc/json-store.js +117 -0
  27. package/dist/arc/obligations.js +292 -0
  28. package/dist/arc/packets.js +288 -0
  29. package/dist/arc/presence.js +185 -0
  30. package/dist/arc/task-lifecycle.js +57 -0
  31. package/dist/commerce/store.js +755 -0
  32. package/dist/commerce/types.js +3 -0
  33. package/dist/heart/active-work.js +860 -43
  34. package/dist/heart/agent-entry.js +69 -3
  35. package/dist/heart/attachments/image-normalize.js +194 -0
  36. package/dist/heart/attachments/materialize.js +97 -0
  37. package/dist/heart/attachments/originals.js +88 -0
  38. package/dist/heart/attachments/render.js +29 -0
  39. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  40. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  41. package/dist/heart/attachments/sources/index.js +16 -0
  42. package/dist/heart/attachments/store.js +103 -0
  43. package/dist/heart/attachments/types.js +93 -0
  44. package/dist/heart/auth/auth-flow.js +479 -0
  45. package/dist/heart/awaiting/await-alert.js +146 -0
  46. package/dist/heart/awaiting/await-expiry.js +108 -0
  47. package/dist/heart/awaiting/await-loader.js +91 -0
  48. package/dist/heart/awaiting/await-parser.js +141 -0
  49. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  50. package/dist/heart/awaiting/await-scheduler.js +377 -0
  51. package/dist/heart/background-operations.js +281 -0
  52. package/dist/heart/bridges/manager.js +137 -17
  53. package/dist/heart/bridges/store.js +14 -2
  54. package/dist/heart/bundle-state.js +168 -0
  55. package/dist/heart/commitments.js +135 -0
  56. package/dist/heart/config-registry.js +331 -0
  57. package/dist/heart/config.js +118 -119
  58. package/dist/heart/context-loss-gauntlet.js +354 -0
  59. package/dist/heart/core.js +1123 -247
  60. package/dist/heart/cross-chat-delivery.js +3 -18
  61. package/dist/heart/daemon/agent-config-check.js +419 -0
  62. package/dist/heart/daemon/agent-discovery.js +102 -3
  63. package/dist/heart/daemon/agent-service.js +523 -0
  64. package/dist/heart/daemon/agentic-repair.js +547 -0
  65. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  66. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  67. package/dist/heart/daemon/cadence.js +70 -0
  68. package/dist/heart/daemon/cli-defaults.js +780 -0
  69. package/dist/heart/daemon/cli-desk.js +322 -0
  70. package/dist/heart/daemon/cli-exec.js +7767 -0
  71. package/dist/heart/daemon/cli-help.js +558 -0
  72. package/dist/heart/daemon/cli-parse.js +1688 -0
  73. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  74. package/dist/heart/daemon/cli-render.js +763 -0
  75. package/dist/heart/daemon/cli-types.js +8 -0
  76. package/dist/heart/daemon/connect-bay.js +323 -0
  77. package/dist/heart/daemon/daemon-cli.js +29 -1750
  78. package/dist/heart/daemon/daemon-entry.js +485 -2
  79. package/dist/heart/daemon/daemon-health.js +176 -0
  80. package/dist/heart/daemon/daemon-rollup.js +57 -0
  81. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  82. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  83. package/dist/heart/daemon/daemon.js +937 -74
  84. package/dist/heart/daemon/dns-workflow.js +394 -0
  85. package/dist/heart/daemon/doctor-types.js +8 -0
  86. package/dist/heart/daemon/doctor.js +873 -0
  87. package/dist/heart/daemon/health-monitor.js +122 -1
  88. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  89. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  90. package/dist/heart/daemon/http-health-probe.js +80 -0
  91. package/dist/heart/daemon/human-command-screens.js +234 -0
  92. package/dist/heart/daemon/human-readiness.js +114 -0
  93. package/dist/heart/daemon/inner-status.js +78 -0
  94. package/dist/heart/daemon/interactive-repair.js +394 -0
  95. package/dist/heart/daemon/launchd.js +37 -8
  96. package/dist/heart/daemon/log-tailer.js +79 -10
  97. package/dist/heart/daemon/logs-prune.js +110 -0
  98. package/dist/heart/daemon/mcp-canary.js +297 -0
  99. package/dist/heart/daemon/message-router.js +6 -2
  100. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  101. package/dist/heart/daemon/os-cron-deps.js +135 -0
  102. package/dist/heart/daemon/os-cron.js +14 -12
  103. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  104. package/dist/heart/daemon/ouro-entry.js +3 -1
  105. package/dist/heart/daemon/plugin-cli.js +432 -0
  106. package/dist/heart/daemon/process-manager.js +511 -40
  107. package/dist/heart/daemon/provider-discovery.js +137 -0
  108. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  109. package/dist/heart/daemon/pulse.js +475 -0
  110. package/dist/heart/daemon/readiness-repair.js +365 -0
  111. package/dist/heart/daemon/run-hooks.js +2 -0
  112. package/dist/heart/daemon/runtime-logging.js +35 -14
  113. package/dist/heart/daemon/runtime-metadata.js +2 -30
  114. package/dist/heart/daemon/safe-mode.js +161 -0
  115. package/dist/heart/daemon/sense-manager.js +564 -38
  116. package/dist/heart/daemon/session-id-resolver.js +131 -0
  117. package/dist/heart/daemon/skill-management-installer.js +1 -1
  118. package/dist/heart/daemon/socket-client.js +158 -11
  119. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  120. package/dist/heart/daemon/startup-tui.js +330 -0
  121. package/dist/heart/daemon/task-scheduler.js +117 -39
  122. package/dist/heart/daemon/terminal-ui.js +499 -0
  123. package/dist/heart/daemon/thoughts.js +229 -17
  124. package/dist/heart/daemon/up-progress.js +366 -0
  125. package/dist/heart/daemon/vault-items.js +56 -0
  126. package/dist/heart/delegation.js +1 -4
  127. package/dist/heart/habits/habit-migration.js +189 -0
  128. package/dist/heart/habits/habit-parser.js +203 -0
  129. package/dist/heart/habits/habit-runtime-state.js +100 -0
  130. package/dist/heart/habits/habit-scheduler.js +372 -0
  131. package/dist/heart/{daemon → hatch}/hatch-flow.js +40 -56
  132. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  133. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  134. package/dist/heart/{daemon → hatch}/specialist-tools.js +45 -18
  135. package/dist/heart/identity.js +174 -57
  136. package/dist/heart/kept-notes.js +289 -0
  137. package/dist/heart/kicks.js +1 -1
  138. package/dist/heart/machine-identity.js +161 -0
  139. package/dist/heart/mail-import-discovery.js +353 -0
  140. package/dist/heart/mailbox/mailbox-http-hooks.js +67 -0
  141. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  142. package/dist/heart/mailbox/mailbox-http-routes.js +250 -0
  143. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  144. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  145. package/dist/heart/mailbox/mailbox-http.js +99 -0
  146. package/dist/heart/mailbox/mailbox-read.js +32 -0
  147. package/dist/heart/mailbox/mailbox-types.js +27 -0
  148. package/dist/heart/mailbox/mailbox-view.js +197 -0
  149. package/dist/heart/mailbox/readers/agent-machine.js +418 -0
  150. package/dist/heart/mailbox/readers/continuity-readers.js +324 -0
  151. package/dist/heart/mailbox/readers/mail.js +375 -0
  152. package/dist/heart/mailbox/readers/runtime-readers.js +728 -0
  153. package/dist/heart/mailbox/readers/sessions.js +232 -0
  154. package/dist/heart/mailbox/readers/shared.js +111 -0
  155. package/dist/heart/mcp/mcp-server.js +696 -0
  156. package/dist/heart/migrate-config.js +100 -0
  157. package/dist/heart/model-capabilities.js +19 -0
  158. package/dist/heart/orientation-frame.js +217 -0
  159. package/dist/heart/platform.js +81 -0
  160. package/dist/heart/provider-attempt.js +134 -0
  161. package/dist/heart/provider-binding-resolver.js +272 -0
  162. package/dist/heart/provider-credentials.js +425 -0
  163. package/dist/heart/provider-failover.js +311 -0
  164. package/dist/heart/provider-models.js +81 -0
  165. package/dist/heart/provider-ping.js +262 -0
  166. package/dist/heart/provider-readiness-cache.js +40 -0
  167. package/dist/heart/provider-visibility.js +188 -0
  168. package/dist/heart/providers/anthropic-token.js +131 -0
  169. package/dist/heart/providers/anthropic.js +139 -52
  170. package/dist/heart/providers/azure.js +23 -11
  171. package/dist/heart/providers/error-classification.js +127 -0
  172. package/dist/heart/providers/github-copilot.js +145 -0
  173. package/dist/heart/providers/minimax-vlm.js +189 -0
  174. package/dist/heart/providers/minimax.js +26 -8
  175. package/dist/heart/providers/openai-codex-token.js +349 -0
  176. package/dist/heart/providers/openai-codex.js +55 -40
  177. package/dist/heart/runtime-capability-check.js +170 -0
  178. package/dist/heart/runtime-credentials.js +367 -0
  179. package/dist/heart/runtime-cwd.js +87 -0
  180. package/dist/heart/sense-truth.js +17 -4
  181. package/dist/heart/session-activity.js +48 -24
  182. package/dist/heart/session-events.js +1133 -0
  183. package/dist/heart/session-playback-cli-main.js +5 -0
  184. package/dist/heart/session-playback-cli.js +36 -0
  185. package/dist/heart/session-playback.js +231 -0
  186. package/dist/heart/session-stats-cli-main.js +5 -0
  187. package/dist/heart/session-stats.js +182 -0
  188. package/dist/heart/session-transcript.js +133 -0
  189. package/dist/heart/start-of-turn-packet.js +351 -0
  190. package/dist/heart/streaming.js +44 -27
  191. package/dist/heart/structured-output.js +196 -0
  192. package/dist/heart/sync-classification.js +176 -0
  193. package/dist/heart/sync.js +449 -0
  194. package/dist/heart/target-resolution.js +9 -5
  195. package/dist/heart/tempo.js +93 -0
  196. package/dist/heart/temporal-view.js +41 -0
  197. package/dist/heart/timeouts.js +101 -0
  198. package/dist/heart/tool-activity-callbacks.js +59 -0
  199. package/dist/heart/tool-description.js +155 -0
  200. package/dist/heart/tool-friction.js +55 -0
  201. package/dist/heart/tool-loop.js +200 -0
  202. package/dist/heart/turn-context.js +430 -0
  203. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  204. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  205. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  206. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  207. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  208. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  209. package/dist/heart/versioning/update-hooks.js +154 -0
  210. package/dist/heart/work-card.js +386 -0
  211. package/dist/mailbox-ui/assets/index-B-V9vRQ0.js +61 -0
  212. package/dist/mailbox-ui/assets/index-BOZbGbkL.css +1 -0
  213. package/dist/mailbox-ui/index.html +15 -0
  214. package/dist/mailroom/attention.js +167 -0
  215. package/dist/mailroom/autonomy.js +209 -0
  216. package/dist/mailroom/blob-store.js +715 -0
  217. package/dist/mailroom/body-cache.js +61 -0
  218. package/dist/mailroom/core.js +788 -0
  219. package/dist/mailroom/entry.js +160 -0
  220. package/dist/mailroom/file-store.js +568 -0
  221. package/dist/mailroom/mbox-import.js +393 -0
  222. package/dist/mailroom/migration.js +164 -0
  223. package/dist/mailroom/outbound.js +380 -0
  224. package/dist/mailroom/policy.js +263 -0
  225. package/dist/mailroom/reader.js +233 -0
  226. package/dist/mailroom/search-cache.js +334 -0
  227. package/dist/mailroom/search-relevance.js +319 -0
  228. package/dist/mailroom/smtp-ingress.js +176 -0
  229. package/dist/mailroom/source-state.js +176 -0
  230. package/dist/mailroom/thread.js +109 -0
  231. package/dist/mailroom/travel-extract.js +89 -0
  232. package/dist/mind/bundle-manifest.js +21 -2
  233. package/dist/mind/context.js +250 -101
  234. package/dist/mind/desk-section.js +362 -0
  235. package/dist/mind/diary-integrity.js +60 -0
  236. package/dist/mind/{memory.js → diary.js} +68 -77
  237. package/dist/mind/embedding-provider.js +60 -0
  238. package/dist/mind/file-state.js +179 -0
  239. package/dist/mind/friends/channel.js +48 -0
  240. package/dist/mind/friends/resolver.js +67 -4
  241. package/dist/mind/friends/store-file.js +61 -4
  242. package/dist/mind/friends/types.js +2 -2
  243. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  244. package/dist/mind/obligation-steering.js +221 -0
  245. package/dist/mind/pending.js +6 -1
  246. package/dist/mind/prompt-refresh.js +3 -2
  247. package/dist/mind/prompt.js +1015 -140
  248. package/dist/mind/provenance-trust.js +26 -0
  249. package/dist/mind/record-paths.js +312 -0
  250. package/dist/mind/scrutiny.js +173 -0
  251. package/dist/nerves/cli-logging.js +7 -1
  252. package/dist/nerves/coverage/audit-rules.js +15 -6
  253. package/dist/nerves/coverage/audit.js +28 -2
  254. package/dist/nerves/coverage/cli.js +1 -1
  255. package/dist/nerves/coverage/contract.js +5 -5
  256. package/dist/nerves/coverage/file-completeness.js +139 -5
  257. package/dist/nerves/event-buffer.js +111 -0
  258. package/dist/nerves/index.js +224 -4
  259. package/dist/nerves/observation.js +20 -0
  260. package/dist/nerves/redact.js +79 -0
  261. package/dist/nerves/review/cli-main.js +5 -0
  262. package/dist/nerves/review/cli.js +156 -0
  263. package/dist/nerves/review/core.js +152 -0
  264. package/dist/nerves/runtime.js +5 -1
  265. package/dist/repertoire/ado-client.js +15 -56
  266. package/dist/repertoire/ado-semantic.js +16 -10
  267. package/dist/repertoire/api-client.js +97 -0
  268. package/dist/repertoire/bitwarden-store.js +1041 -0
  269. package/dist/repertoire/bundle-templates.js +71 -0
  270. package/dist/repertoire/bw-installer.js +180 -0
  271. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  272. package/dist/repertoire/coding/context-pack.js +331 -0
  273. package/dist/repertoire/coding/feedback.js +197 -30
  274. package/dist/repertoire/coding/manager.js +166 -10
  275. package/dist/repertoire/coding/spawner.js +55 -9
  276. package/dist/repertoire/coding/tools.js +219 -7
  277. package/dist/repertoire/commerce-errors.js +109 -0
  278. package/dist/repertoire/commerce-self-test.js +156 -0
  279. package/dist/repertoire/credential-access.js +178 -0
  280. package/dist/repertoire/desk/classifier.js +362 -0
  281. package/dist/repertoire/duffel-client.js +185 -0
  282. package/dist/repertoire/github-client.js +14 -55
  283. package/dist/repertoire/graph-client.js +11 -52
  284. package/dist/repertoire/guardrails.js +159 -25
  285. package/dist/repertoire/mcp-client.js +295 -0
  286. package/dist/repertoire/mcp-manager.js +434 -0
  287. package/dist/repertoire/mcp-tools.js +83 -0
  288. package/dist/repertoire/plugin-mcp.js +175 -0
  289. package/dist/repertoire/plugins.js +253 -0
  290. package/dist/repertoire/shell-sessions.js +133 -0
  291. package/dist/repertoire/skills.js +48 -4
  292. package/dist/repertoire/stripe-client.js +131 -0
  293. package/dist/repertoire/tool-results.js +29 -0
  294. package/dist/repertoire/tools-a2a.js +283 -0
  295. package/dist/repertoire/tools-attachments.js +317 -0
  296. package/dist/repertoire/tools-awaiting.js +372 -0
  297. package/dist/repertoire/tools-base.js +63 -1082
  298. package/dist/repertoire/tools-bluebubbles.js +2 -0
  299. package/dist/repertoire/tools-bridge.js +144 -0
  300. package/dist/repertoire/tools-bundle.js +993 -0
  301. package/dist/repertoire/tools-commerce.js +253 -0
  302. package/dist/repertoire/tools-config.js +186 -0
  303. package/dist/repertoire/tools-continuity.js +252 -0
  304. package/dist/repertoire/tools-credential.js +383 -0
  305. package/dist/repertoire/tools-evolution.js +527 -0
  306. package/dist/repertoire/tools-files.js +344 -0
  307. package/dist/repertoire/tools-flight.js +290 -0
  308. package/dist/repertoire/tools-flow.js +119 -0
  309. package/dist/repertoire/tools-github.js +3 -8
  310. package/dist/repertoire/tools-mail.js +1975 -0
  311. package/dist/repertoire/tools-notes.js +418 -0
  312. package/dist/repertoire/tools-obligations.js +143 -0
  313. package/dist/repertoire/tools-orientation.js +31 -0
  314. package/dist/repertoire/tools-record.js +469 -0
  315. package/dist/repertoire/tools-runtime.js +150 -0
  316. package/dist/repertoire/tools-session.js +766 -0
  317. package/dist/repertoire/tools-shell.js +120 -0
  318. package/dist/repertoire/tools-stripe.js +224 -0
  319. package/dist/repertoire/tools-surface.js +344 -0
  320. package/dist/repertoire/tools-teams.js +12 -39
  321. package/dist/repertoire/tools-travel.js +125 -0
  322. package/dist/repertoire/tools-trip.js +982 -0
  323. package/dist/repertoire/tools-user-profile.js +146 -0
  324. package/dist/repertoire/tools-vault.js +40 -0
  325. package/dist/repertoire/tools-voice.js +145 -0
  326. package/dist/repertoire/tools.js +243 -79
  327. package/dist/repertoire/travel-api-client.js +360 -0
  328. package/dist/repertoire/user-profile.js +131 -0
  329. package/dist/repertoire/vault-setup.js +246 -0
  330. package/dist/repertoire/vault-unlock.js +594 -0
  331. package/dist/scripts/claude-code-hook.js +41 -0
  332. package/dist/scripts/claude-code-stop-hook.js +47 -0
  333. package/dist/senses/a2a-entry.js +78 -0
  334. package/dist/senses/attention-queue.js +186 -0
  335. package/dist/senses/await-turn-message.js +58 -0
  336. package/dist/senses/bluebubbles/active-turns.js +216 -0
  337. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  338. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  339. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  340. package/dist/senses/bluebubbles/entry.js +77 -0
  341. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  342. package/dist/senses/bluebubbles/index.js +2737 -0
  343. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  344. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  345. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  346. package/dist/senses/bluebubbles/processed-log.js +133 -0
  347. package/dist/senses/bluebubbles/replay.js +137 -0
  348. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  349. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  350. package/dist/senses/bluebubbles-meta-guard.js +40 -0
  351. package/dist/senses/cli/bracketed-paste.js +82 -0
  352. package/dist/senses/cli/image-paste.js +287 -0
  353. package/dist/senses/cli/image-ref-navigation.js +75 -0
  354. package/dist/senses/cli/ink-app.js +156 -0
  355. package/dist/senses/cli/inline-diff.js +64 -0
  356. package/dist/senses/cli/input-keys.js +174 -0
  357. package/dist/senses/cli/kill-ring.js +86 -0
  358. package/dist/senses/cli/message-list.js +51 -0
  359. package/dist/senses/cli/ouro-tui.js +607 -0
  360. package/dist/senses/cli/spinner-imperative.js +135 -0
  361. package/dist/senses/cli/spinner.js +101 -0
  362. package/dist/senses/cli/status-line.js +60 -0
  363. package/dist/senses/cli/streaming-markdown.js +526 -0
  364. package/dist/senses/cli/tool-display.js +85 -0
  365. package/dist/senses/cli/tool-render.js +85 -0
  366. package/dist/senses/cli/tui-store.js +240 -0
  367. package/dist/senses/cli/virtual-list.js +35 -0
  368. package/dist/senses/cli-entry.js +60 -8
  369. package/dist/senses/cli-layout.js +100 -0
  370. package/dist/senses/cli.js +517 -204
  371. package/dist/senses/commands.js +66 -3
  372. package/dist/senses/habit-turn-message.js +122 -0
  373. package/dist/senses/inner-dialog-worker.js +303 -22
  374. package/dist/senses/inner-dialog.js +525 -41
  375. package/dist/senses/mail-entry.js +66 -0
  376. package/dist/senses/mail.js +379 -0
  377. package/dist/senses/pipeline.js +857 -180
  378. package/dist/senses/proactive-content-guard.js +51 -0
  379. package/dist/senses/shared-turn.js +419 -0
  380. package/dist/senses/surface-tool.js +108 -0
  381. package/dist/senses/teams-entry.js +60 -8
  382. package/dist/senses/teams.js +390 -98
  383. package/dist/senses/trust-gate.js +100 -5
  384. package/dist/senses/voice/audio-playback.js +237 -0
  385. package/dist/senses/voice/audio-routing.js +119 -0
  386. package/dist/senses/voice/elevenlabs.js +202 -0
  387. package/dist/senses/voice/floor-control.js +431 -0
  388. package/dist/senses/voice/floor-controller.js +115 -0
  389. package/dist/senses/voice/golden-path.js +116 -0
  390. package/dist/senses/voice/index.js +29 -0
  391. package/dist/senses/voice/meeting.js +113 -0
  392. package/dist/senses/voice/outbound.js +190 -0
  393. package/dist/senses/voice/phone.js +33 -0
  394. package/dist/senses/voice/playback.js +139 -0
  395. package/dist/senses/voice/realtime-eval.js +496 -0
  396. package/dist/senses/voice/realtime-trace.js +531 -0
  397. package/dist/senses/voice/transcript.js +70 -0
  398. package/dist/senses/voice/turn.js +191 -0
  399. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  400. package/dist/senses/voice/twilio-phone.js +5079 -0
  401. package/dist/senses/voice/types.js +2 -0
  402. package/dist/senses/voice/whisper.js +161 -0
  403. package/dist/senses/voice-entry.js +81 -0
  404. package/dist/senses/voice-realtime-eval-command.js +99 -0
  405. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  406. package/dist/senses/voice-twilio-entry.js +87 -0
  407. package/dist/trips/core.js +138 -0
  408. package/dist/trips/store.js +265 -0
  409. package/dist/util/frontmatter.js +69 -0
  410. package/package.json +55 -12
  411. package/skills/agent-commerce.md +113 -0
  412. package/skills/browser-navigation.md +117 -0
  413. package/skills/commerce-setup-guide.md +116 -0
  414. package/skills/commerce-setup.md +84 -0
  415. package/skills/configure-dev-tools.md +99 -0
  416. package/skills/travel-planning.md +138 -0
  417. package/dist/heart/daemon/auth-flow.js +0 -351
  418. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  419. package/dist/heart/daemon/update-hooks.js +0 -138
  420. package/dist/heart/safe-workspace.js +0 -228
  421. package/dist/heart/session-recall.js +0 -116
  422. package/dist/repertoire/tasks/board.js +0 -134
  423. package/dist/repertoire/tasks/index.js +0 -224
  424. package/dist/repertoire/tasks/lifecycle.js +0 -80
  425. package/dist/repertoire/tasks/middleware.js +0 -65
  426. package/dist/repertoire/tasks/parser.js +0 -173
  427. package/dist/repertoire/tasks/scanner.js +0 -132
  428. package/dist/repertoire/tasks/transitions.js +0 -144
  429. package/dist/senses/bluebubbles-entry.js +0 -13
  430. package/dist/senses/bluebubbles.js +0 -1177
  431. package/dist/senses/debug-activity.js +0 -148
  432. package/subagents/README.md +0 -7
  433. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  434. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  435. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  436. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  437. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  438. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  439. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  440. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  441. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  442. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  443. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  444. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  445. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  446. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  447. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  448. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  449. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -7,22 +7,100 @@ class HealthMonitor {
7
7
  scheduler;
8
8
  alertSink;
9
9
  diskUsagePercent;
10
+ onCriticalAgent;
11
+ onCriticalSense;
12
+ senseProbes;
13
+ senseProbeProvider;
14
+ intervalHandle = null;
15
+ lastResults = [];
10
16
  constructor(options) {
11
17
  this.processManager = options.processManager;
12
18
  this.scheduler = options.scheduler;
13
19
  this.alertSink = options.alertSink ?? (() => undefined);
14
20
  this.diskUsagePercent = options.diskUsagePercent ?? (() => 0);
21
+ this.onCriticalAgent = options.onCriticalAgent ?? (() => undefined);
22
+ this.onCriticalSense = options.onCriticalSense ?? (() => undefined);
23
+ this.senseProbes = options.senseProbes ?? [];
24
+ this.senseProbeProvider = options.senseProbeProvider ?? (() => []);
25
+ }
26
+ triggerSenseRecovery(probe, detail) {
27
+ if (!probe.managedName)
28
+ return;
29
+ try {
30
+ (0, runtime_1.emitNervesEvent)({
31
+ level: "warn",
32
+ component: "daemon",
33
+ event: "daemon.health_check_sense_recovery_attempted",
34
+ message: "triggering recovery restart for failed sense probe",
35
+ meta: {
36
+ probeName: probe.name,
37
+ managedName: probe.managedName,
38
+ detail,
39
+ },
40
+ });
41
+ this.onCriticalSense(probe.managedName, probe.name);
42
+ }
43
+ catch {
44
+ // Recovery is best-effort -- callback errors must not crash runChecks
45
+ }
46
+ }
47
+ startPeriodicChecks(intervalMs) {
48
+ if (this.intervalHandle !== null)
49
+ return;
50
+ (0, runtime_1.emitNervesEvent)({
51
+ level: "info",
52
+ component: "daemon",
53
+ event: "daemon.health_check_scheduled",
54
+ message: "periodic health checks started",
55
+ meta: { intervalMs },
56
+ });
57
+ this.intervalHandle = setInterval(() => {
58
+ void this.runChecks();
59
+ }, intervalMs);
60
+ }
61
+ stopPeriodicChecks() {
62
+ if (this.intervalHandle === null)
63
+ return;
64
+ clearInterval(this.intervalHandle);
65
+ this.intervalHandle = null;
15
66
  }
16
67
  async runChecks() {
17
68
  const results = [];
18
69
  const snapshots = this.processManager.listAgentSnapshots();
19
70
  const unhealthy = snapshots.filter((snapshot) => snapshot.status !== "running");
20
71
  if (unhealthy.length > 0) {
72
+ const unhealthySummary = unhealthy.map((item) => {
73
+ const detail = [
74
+ item.errorReason ?? null,
75
+ item.fixHint ? `fix: ${item.fixHint}` : null,
76
+ ].filter((part) => part !== null).join("; ");
77
+ return detail.length > 0 ? `${item.name} (${detail})` : item.name;
78
+ }).join(", ");
21
79
  results.push({
22
80
  name: "agent-processes",
23
81
  status: "critical",
24
- message: `non-running agents: ${unhealthy.map((item) => item.name).join(", ")}`,
82
+ message: `non-running agents: ${unhealthySummary}`,
25
83
  });
84
+ for (const agent of unhealthy) {
85
+ try {
86
+ (0, runtime_1.emitNervesEvent)({
87
+ level: "warn",
88
+ component: "daemon",
89
+ event: "daemon.health_check_recovery_attempted",
90
+ message: "triggering recovery restart for non-running agent",
91
+ meta: {
92
+ agentName: agent.name,
93
+ agentStatus: agent.status,
94
+ errorReason: agent.errorReason ?? null,
95
+ fixHint: agent.fixHint ?? null,
96
+ },
97
+ });
98
+ this.onCriticalAgent(agent.name);
99
+ }
100
+ catch {
101
+ // Recovery is best-effort -- callback errors must not crash runChecks
102
+ }
103
+ }
26
104
  }
27
105
  else {
28
106
  results.push({ name: "agent-processes", status: "ok", message: "all managed agents running" });
@@ -61,6 +139,46 @@ class HealthMonitor {
61
139
  message: `disk usage healthy (${diskPercent}%)`,
62
140
  });
63
141
  }
142
+ const senseProbes = [...this.senseProbes];
143
+ try {
144
+ senseProbes.push(...this.senseProbeProvider());
145
+ }
146
+ catch (error) {
147
+ results.push({
148
+ name: "sense-probes",
149
+ status: "warn",
150
+ message: `sense probe discovery failed: ${error instanceof Error ? error.message : String(error)}`,
151
+ });
152
+ }
153
+ for (const probe of senseProbes) {
154
+ try {
155
+ const outcome = await probe.check();
156
+ if (outcome.ok) {
157
+ results.push({
158
+ name: `sense-probe:${probe.name}`,
159
+ status: "ok",
160
+ message: `${probe.name} healthy`,
161
+ });
162
+ }
163
+ else {
164
+ this.triggerSenseRecovery(probe, outcome.detail ?? "unknown");
165
+ results.push({
166
+ name: `sense-probe:${probe.name}`,
167
+ status: "critical",
168
+ message: `${probe.name} failed: ${outcome.detail ?? "unknown"}`,
169
+ });
170
+ }
171
+ }
172
+ catch (error) {
173
+ this.triggerSenseRecovery(probe, error instanceof Error ? error.message : String(error));
174
+ results.push({
175
+ name: `sense-probe:${probe.name}`,
176
+ status: "critical",
177
+ message: `${probe.name} error: ${error instanceof Error ? error.message : String(error)}`,
178
+ });
179
+ }
180
+ }
181
+ this.lastResults = results.map((result) => ({ ...result }));
64
182
  for (const result of results) {
65
183
  (0, runtime_1.emitNervesEvent)({
66
184
  level: result.status === "critical" ? "error" : result.status === "warn" ? "warn" : "info",
@@ -75,5 +193,8 @@ class HealthMonitor {
75
193
  }
76
194
  return results;
77
195
  }
196
+ getLastResults() {
197
+ return this.lastResults.map((result) => ({ ...result }));
198
+ }
78
199
  }
79
200
  exports.HealthMonitor = HealthMonitor;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.agentConfigV2Hook = agentConfigV2Hook;
4
+ const runtime_1 = require("../../../nerves/runtime");
5
+ const migrate_config_1 = require("../../migrate-config");
6
+ async function agentConfigV2Hook(ctx) {
7
+ (0, runtime_1.emitNervesEvent)({
8
+ component: "daemon",
9
+ event: "daemon.agent_config_v2_hook_start",
10
+ message: "running agent-config-v2 update hook",
11
+ meta: { agentRoot: ctx.agentRoot, currentVersion: ctx.currentVersion },
12
+ });
13
+ try {
14
+ (0, migrate_config_1.migrateAgentConfigV1ToV2)(ctx.agentRoot);
15
+ }
16
+ catch (err) {
17
+ const errorMessage = err instanceof Error ? err.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(err);
18
+ (0, runtime_1.emitNervesEvent)({
19
+ component: "daemon",
20
+ event: "daemon.agent_config_v2_hook_error",
21
+ message: "agent-config-v2 hook migration failed",
22
+ meta: { agentRoot: ctx.agentRoot, error: errorMessage },
23
+ });
24
+ return { ok: false, error: errorMessage };
25
+ }
26
+ (0, runtime_1.emitNervesEvent)({
27
+ component: "daemon",
28
+ event: "daemon.agent_config_v2_hook_end",
29
+ message: "agent-config-v2 hook completed",
30
+ meta: { agentRoot: ctx.agentRoot },
31
+ });
32
+ return { ok: true };
33
+ }
@@ -37,6 +37,120 @@ exports.bundleMetaHook = bundleMetaHook;
37
37
  const fs = __importStar(require("fs"));
38
38
  const path = __importStar(require("path"));
39
39
  const runtime_1 = require("../../../nerves/runtime");
40
+ const record_paths_1 = require("../../../mind/record-paths");
41
+ /**
42
+ * Migrate bundle from schema 1 to schema 2:
43
+ * - Move state/{episodes,obligations,cares,intentions}/* to arc/{name}/*
44
+ * - Move legacy record stores into desk/_record/
45
+ * Idempotent: skips missing sources; on collision, newer mtime wins.
46
+ */
47
+ function migrateToSchema2(agentRoot) {
48
+ (0, runtime_1.emitNervesEvent)({
49
+ component: "daemon",
50
+ event: "daemon.bundle_migration_start",
51
+ message: "migrating bundle to schema 2",
52
+ meta: { agentRoot },
53
+ });
54
+ // Migrate arc entities
55
+ for (const name of ["episodes", "obligations", "cares", "intentions"]) {
56
+ const src = path.join(agentRoot, "state", name);
57
+ const dest = path.join(agentRoot, "arc", name);
58
+ migrateDirectory(src, dest);
59
+ }
60
+ // Stage legacy diary files for schema 3 to canonicalize into Desk record.
61
+ const legacyDiarySrc = path.join(agentRoot, "psyche", "mem" + "ory");
62
+ const diaryDest = path.join(agentRoot, "diary");
63
+ migrateDirectory(legacyDiarySrc, diaryDest);
64
+ // Update bundle .gitignore
65
+ updateBundleGitignore(agentRoot);
66
+ (0, runtime_1.emitNervesEvent)({
67
+ component: "daemon",
68
+ event: "daemon.bundle_migration_end",
69
+ message: "bundle migration to schema 2 complete",
70
+ meta: { agentRoot },
71
+ });
72
+ }
73
+ /**
74
+ * Ensure bundle .gitignore has state/ ignored and does NOT ignore tracked record roots.
75
+ */
76
+ function updateBundleGitignore(agentRoot) {
77
+ const gitignorePath = path.join(agentRoot, ".gitignore");
78
+ let lines = [];
79
+ try {
80
+ if (fs.existsSync(gitignorePath)) {
81
+ lines = fs.readFileSync(gitignorePath, "utf-8").split("\n");
82
+ }
83
+ }
84
+ catch {
85
+ // If we can't read, start fresh
86
+ }
87
+ // Remove tracked bundle roots from ignore.
88
+ const toRemove = new Set(["arc/", "desk/", "diary/", "journal/"]);
89
+ lines = lines.filter((line) => !toRemove.has(line.trim()));
90
+ // Ensure state/ is in the ignore list
91
+ const hasState = lines.some((line) => line.trim() === "state/");
92
+ if (!hasState) {
93
+ lines.push("state/");
94
+ }
95
+ // Write back, trimming trailing empty lines and ensuring trailing newline
96
+ const content = lines.join("\n").replace(/\n+$/, "") + "\n";
97
+ try {
98
+ fs.writeFileSync(gitignorePath, content, "utf-8");
99
+ }
100
+ catch {
101
+ // Non-blocking: if we can't write .gitignore, migration still succeeds
102
+ }
103
+ }
104
+ function migrateToSchema3(agentRoot) {
105
+ (0, record_paths_1.migrateLegacyRecordStores)(agentRoot);
106
+ updateBundleGitignore(agentRoot);
107
+ }
108
+ /**
109
+ * Recursively copy files from src to dest.
110
+ * Creates destination directories as needed. Skips if source doesn't exist.
111
+ * When both source and destination exist, compares mtimes: newer file wins.
112
+ * Logs a warning either way when a collision is detected.
113
+ */
114
+ function migrateDirectory(src, dest) {
115
+ if (!fs.existsSync(src))
116
+ return;
117
+ fs.mkdirSync(dest, { recursive: true });
118
+ const entries = fs.readdirSync(src, { withFileTypes: true });
119
+ for (const entry of entries) {
120
+ const srcPath = path.join(src, entry.name);
121
+ const destPath = path.join(dest, entry.name);
122
+ if (entry.isDirectory()) {
123
+ migrateDirectory(srcPath, destPath);
124
+ }
125
+ else if (!fs.existsSync(destPath)) {
126
+ fs.copyFileSync(srcPath, destPath);
127
+ }
128
+ else {
129
+ // Collision: both source and destination exist — compare mtimes
130
+ const srcMtime = fs.statSync(srcPath).mtimeMs;
131
+ const destMtime = fs.statSync(destPath).mtimeMs;
132
+ if (srcMtime > destMtime) {
133
+ fs.copyFileSync(srcPath, destPath);
134
+ (0, runtime_1.emitNervesEvent)({
135
+ level: "warn",
136
+ component: "daemon",
137
+ event: "daemon.bundle_migration_collision",
138
+ message: `migration collision: source newer, overwriting destination`,
139
+ meta: { srcPath, destPath, srcMtime, destMtime },
140
+ });
141
+ }
142
+ else {
143
+ (0, runtime_1.emitNervesEvent)({
144
+ level: "warn",
145
+ component: "daemon",
146
+ event: "daemon.bundle_migration_collision",
147
+ message: `migration collision: destination newer or equal, keeping destination`,
148
+ meta: { srcPath, destPath, srcMtime, destMtime },
149
+ });
150
+ }
151
+ }
152
+ }
153
+ }
40
154
  async function bundleMetaHook(ctx) {
41
155
  (0, runtime_1.emitNervesEvent)({
42
156
  component: "daemon",
@@ -56,9 +170,29 @@ async function bundleMetaHook(ctx) {
56
170
  // Malformed JSON -- treat as missing, will overwrite with fresh
57
171
  existing = undefined;
58
172
  }
173
+ // Run schema migrations if needed.
174
+ const currentSchema = existing?.bundleSchemaVersion ?? 1;
175
+ try {
176
+ if (currentSchema < 2) {
177
+ migrateToSchema2(ctx.agentRoot);
178
+ }
179
+ if (currentSchema < 3) {
180
+ migrateToSchema3(ctx.agentRoot);
181
+ }
182
+ }
183
+ catch (err) {
184
+ const errorMessage = err instanceof Error ? err.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(err);
185
+ (0, runtime_1.emitNervesEvent)({
186
+ component: "daemon",
187
+ event: "daemon.bundle_meta_hook_error",
188
+ message: "bundle-meta hook migration failed",
189
+ meta: { agentRoot: ctx.agentRoot, error: errorMessage },
190
+ });
191
+ return { ok: false, error: errorMessage };
192
+ }
59
193
  const updated = {
60
194
  runtimeVersion: ctx.currentVersion,
61
- bundleSchemaVersion: existing?.bundleSchemaVersion ?? 1,
195
+ bundleSchemaVersion: currentSchema < 3 ? 3 : currentSchema,
62
196
  lastUpdated: new Date().toISOString(),
63
197
  };
64
198
  // Save old runtimeVersion as previousRuntimeVersion (if there was one)
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createHttpHealthProbe = createHttpHealthProbe;
37
+ const http = __importStar(require("node:http"));
38
+ function createHttpHealthProbe(name, port, timeoutMs = 5000) {
39
+ return {
40
+ name,
41
+ check: () => new Promise((resolve) => {
42
+ const req = http.get({
43
+ hostname: "127.0.0.1",
44
+ port,
45
+ path: "/health",
46
+ timeout: timeoutMs,
47
+ }, (res) => {
48
+ let body = "";
49
+ res.on("data", (chunk) => {
50
+ body += chunk.toString();
51
+ });
52
+ res.on("end", () => {
53
+ if (res.statusCode !== 200) {
54
+ resolve({ ok: false, detail: `HTTP ${res.statusCode}` });
55
+ return;
56
+ }
57
+ try {
58
+ const parsed = JSON.parse(body);
59
+ if (parsed.status === "ok") {
60
+ resolve({ ok: true });
61
+ }
62
+ else {
63
+ resolve({ ok: false, detail: `unexpected status: ${String(parsed.status)}` });
64
+ }
65
+ }
66
+ catch {
67
+ resolve({ ok: false, detail: "invalid JSON response" });
68
+ }
69
+ });
70
+ });
71
+ req.on("timeout", () => {
72
+ req.destroy();
73
+ resolve({ ok: false, detail: "timeout" });
74
+ });
75
+ req.on("error", (err) => {
76
+ resolve({ ok: false, detail: err.message });
77
+ });
78
+ }),
79
+ };
80
+ }
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildOuroHomeActions = buildOuroHomeActions;
4
+ exports.resolveOuroHomeAction = resolveOuroHomeAction;
5
+ exports.renderOuroHomeScreen = renderOuroHomeScreen;
6
+ exports.renderAgentPickerScreen = renderAgentPickerScreen;
7
+ exports.resolveNamedAgentSelection = resolveNamedAgentSelection;
8
+ exports.renderHumanReadinessBoard = renderHumanReadinessBoard;
9
+ exports.renderHumanCommandBoard = renderHumanCommandBoard;
10
+ const runtime_1 = require("../../nerves/runtime");
11
+ const terminal_ui_1 = require("./terminal-ui");
12
+ function renderScreenEvent(screen) {
13
+ (0, runtime_1.emitNervesEvent)({
14
+ component: "daemon",
15
+ event: "daemon.human_screen_rendered",
16
+ message: "rendered human command screen",
17
+ meta: { screen },
18
+ });
19
+ }
20
+ function homeActionSummary(action) {
21
+ switch (action.kind) {
22
+ case "chat":
23
+ return `Open chat with ${action.agent}.`;
24
+ case "up":
25
+ return "Start the local runtime and check what still needs attention.";
26
+ case "connect":
27
+ return "Set up providers, portable tools, and machine-specific attachments.";
28
+ case "repair":
29
+ return "Walk through repairs for anything blocking startup or chat.";
30
+ case "help":
31
+ return "Show the command guide.";
32
+ case "hatch":
33
+ return "Create a new agent on this machine.";
34
+ case "clone":
35
+ return "Bring an existing bundle onto this machine.";
36
+ case "exit":
37
+ return "Leave the prompt.";
38
+ }
39
+ }
40
+ function actionToWizardItem(action) {
41
+ return {
42
+ key: action.key,
43
+ label: action.label,
44
+ summary: homeActionSummary(action),
45
+ ...(action.key === "1" ? { recommended: true } : {}),
46
+ };
47
+ }
48
+ function buildOuroHomeActions(agents) {
49
+ if (agents.length === 0) {
50
+ return [
51
+ { key: "1", label: "Create a new agent", kind: "hatch", command: "ouro hatch" },
52
+ { key: "2", label: "Clone an existing bundle", kind: "clone", command: "ouro clone <remote>" },
53
+ { key: "3", label: "Show help", kind: "help", command: "ouro --help" },
54
+ { key: "4", label: "Exit", kind: "exit", command: "exit" },
55
+ ];
56
+ }
57
+ const actions = agents.map((agent, index) => ({
58
+ key: String(index + 1),
59
+ label: `Talk to ${agent}`,
60
+ kind: "chat",
61
+ command: `ouro chat ${agent}`,
62
+ agent,
63
+ }));
64
+ return [
65
+ ...actions,
66
+ { key: String(actions.length + 1), label: "Start or check Ouro", kind: "up", command: "ouro up" },
67
+ { key: String(actions.length + 2), label: "Set up connections", kind: "connect", command: "ouro connect --agent <agent>" },
68
+ { key: String(actions.length + 3), label: "Fix setup issues", kind: "repair", command: "ouro repair --agent <agent>" },
69
+ { key: String(actions.length + 4), label: "Show help", kind: "help", command: "ouro --help" },
70
+ { key: String(actions.length + 5), label: "Exit", kind: "exit", command: "exit" },
71
+ ];
72
+ }
73
+ function resolveOuroHomeAction(answer, actions) {
74
+ const normalized = answer.trim().toLowerCase();
75
+ if (!normalized)
76
+ return undefined;
77
+ const byKey = actions.find((action) => action.key === normalized);
78
+ if (byKey)
79
+ return byKey;
80
+ const byAgent = actions.find((action) => action.agent?.toLowerCase() === normalized);
81
+ if (byAgent)
82
+ return byAgent;
83
+ return actions.find((action) => action.kind === normalized || action.label.toLowerCase() === normalized);
84
+ }
85
+ function renderOuroHomeScreen(options) {
86
+ renderScreenEvent("home");
87
+ const actions = buildOuroHomeActions(options.agents);
88
+ const chatActions = actions.filter((action) => action.kind === "chat");
89
+ const setupActions = actions.filter((action) => action.kind !== "chat");
90
+ const sections = options.agents.length === 0
91
+ ? [
92
+ {
93
+ title: "Start here",
94
+ summary: "There are no agents on this machine yet.",
95
+ items: setupActions.map((action) => actionToWizardItem(action)),
96
+ },
97
+ ]
98
+ : [
99
+ {
100
+ title: "Agents",
101
+ summary: "Jump straight into conversation or pick a setup path below.",
102
+ items: chatActions.map((action) => actionToWizardItem(action)),
103
+ },
104
+ {
105
+ title: "System",
106
+ items: setupActions.map((action) => actionToWizardItem(action)),
107
+ },
108
+ ];
109
+ return (0, terminal_ui_1.renderTerminalWizard)({
110
+ isTTY: options.isTTY,
111
+ columns: options.columns,
112
+ masthead: {
113
+ subtitle: options.agents.length === 0
114
+ ? "No agents are set up on this machine yet."
115
+ : "Choose an agent or a setup task.",
116
+ },
117
+ title: "Ouro home",
118
+ summary: options.agents.length === 0
119
+ ? "Create a new agent or clone an existing bundle to get started."
120
+ : "Choose an agent or a setup task without memorizing commands.",
121
+ sections,
122
+ nextStep: {
123
+ label: options.agents.length === 0 ? "Start by creating or cloning an agent." : `Start with ${actions[0].label}.`,
124
+ detail: options.agents.length === 0
125
+ ? "Once one agent bundle exists here, the rest of the command surface becomes interactive."
126
+ : "You can always type the number or the agent name instead of remembering a command.",
127
+ },
128
+ prompt: `Choose [1-${actions.length}] or type a name: `,
129
+ });
130
+ }
131
+ function renderAgentPickerScreen(options) {
132
+ renderScreenEvent("agent-picker");
133
+ return (0, terminal_ui_1.renderTerminalWizard)({
134
+ isTTY: options.isTTY,
135
+ columns: options.columns,
136
+ masthead: {
137
+ subtitle: options.subtitle,
138
+ },
139
+ title: options.title,
140
+ summary: "Type the number or name that matches the agent you want.",
141
+ sections: [
142
+ {
143
+ title: "Agents",
144
+ items: options.agents.map((agent, index) => ({
145
+ key: String(index + 1),
146
+ label: agent,
147
+ summary: "Available on this machine.",
148
+ ...(index === 0 ? { recommended: true } : {}),
149
+ })),
150
+ },
151
+ ],
152
+ prompt: `Choose [1-${options.agents.length}] or type a name: `,
153
+ });
154
+ }
155
+ function resolveNamedAgentSelection(answer, agents) {
156
+ const normalized = answer.trim().toLowerCase();
157
+ if (!normalized)
158
+ return undefined;
159
+ const numbered = Number.parseInt(normalized, 10);
160
+ if (Number.isFinite(numbered))
161
+ return agents[numbered - 1];
162
+ return agents.find((agent) => agent.toLowerCase() === normalized);
163
+ }
164
+ function renderHumanReadinessBoard(options) {
165
+ renderScreenEvent("readiness");
166
+ const issueItems = options.snapshot.items.map((item) => ({
167
+ label: item.title,
168
+ status: item.status,
169
+ summary: item.summary,
170
+ detailLines: item.detailLines,
171
+ }));
172
+ const actionItems = options.snapshot.nextActions.map((action, index) => ({
173
+ key: String(index + 1),
174
+ label: action.label,
175
+ actor: action.actor,
176
+ command: action.command,
177
+ ...(action.recommended ? { recommended: true } : {}),
178
+ }));
179
+ if (options.prompt) {
180
+ actionItems.push({
181
+ key: String(actionItems.length + 1),
182
+ label: "Skip for now",
183
+ });
184
+ }
185
+ return (0, terminal_ui_1.renderTerminalWizard)({
186
+ isTTY: options.isTTY,
187
+ columns: options.columns,
188
+ masthead: {
189
+ subtitle: options.subtitle,
190
+ },
191
+ title: options.title,
192
+ summary: options.snapshot.summary,
193
+ nextStep: options.snapshot.primaryAction
194
+ ? {
195
+ label: options.snapshot.primaryAction.label,
196
+ detail: options.snapshot.summary,
197
+ command: options.snapshot.primaryAction.command,
198
+ }
199
+ : options.snapshot.status === "ready" || options.snapshot.status === "attached"
200
+ ? {
201
+ label: "Everything needed here is ready.",
202
+ detail: "You can keep going or leave this area alone.",
203
+ }
204
+ : undefined,
205
+ sections: [
206
+ {
207
+ title: "What needs attention",
208
+ items: issueItems,
209
+ },
210
+ ...(actionItems.length > 0
211
+ ? [{
212
+ title: "Ways forward",
213
+ items: actionItems,
214
+ }]
215
+ : []),
216
+ ],
217
+ prompt: options.prompt,
218
+ });
219
+ }
220
+ function renderHumanCommandBoard(options) {
221
+ renderScreenEvent("command-board");
222
+ return (0, terminal_ui_1.renderTerminalGuide)({
223
+ isTTY: options.isTTY,
224
+ columns: options.columns,
225
+ masthead: {
226
+ subtitle: options.subtitle,
227
+ },
228
+ title: options.title,
229
+ summary: options.summary,
230
+ sections: options.sections,
231
+ actions: options.actions,
232
+ prompt: options.prompt,
233
+ });
234
+ }