@ouro.bot/cli 0.1.0-alpha.58 → 0.1.0-alpha.580

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 (404) 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 +3738 -0
  13. package/dist/arc/attention-types.js +8 -0
  14. package/dist/arc/cares.js +140 -0
  15. package/dist/arc/episodes.js +117 -0
  16. package/dist/arc/intentions.js +133 -0
  17. package/dist/arc/json-store.js +117 -0
  18. package/dist/arc/obligations.js +237 -0
  19. package/dist/arc/packets.js +193 -0
  20. package/dist/arc/presence.js +185 -0
  21. package/dist/arc/task-lifecycle.js +65 -0
  22. package/dist/heart/active-work.js +837 -26
  23. package/dist/heart/agent-entry.js +69 -3
  24. package/dist/heart/attachments/image-normalize.js +194 -0
  25. package/dist/heart/attachments/materialize.js +97 -0
  26. package/dist/heart/attachments/originals.js +88 -0
  27. package/dist/heart/attachments/render.js +29 -0
  28. package/dist/heart/attachments/sources/adapter.js +2 -0
  29. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  30. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  31. package/dist/heart/attachments/sources/index.js +16 -0
  32. package/dist/heart/attachments/store.js +103 -0
  33. package/dist/heart/attachments/types.js +93 -0
  34. package/dist/heart/auth/auth-flow.js +479 -0
  35. package/dist/heart/background-operations.js +281 -0
  36. package/dist/heart/bundle-state.js +168 -0
  37. package/dist/heart/commitments.js +111 -0
  38. package/dist/heart/config-registry.js +322 -0
  39. package/dist/heart/config.js +114 -118
  40. package/dist/heart/core.js +909 -246
  41. package/dist/heart/cross-chat-delivery.js +3 -18
  42. package/dist/heart/daemon/agent-config-check.js +419 -0
  43. package/dist/heart/daemon/agent-discovery.js +102 -3
  44. package/dist/heart/daemon/agent-service.js +522 -0
  45. package/dist/heart/daemon/agentic-repair.js +547 -0
  46. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  47. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  48. package/dist/heart/daemon/cadence.js +70 -0
  49. package/dist/heart/daemon/cli-defaults.js +776 -0
  50. package/dist/heart/daemon/cli-exec.js +7559 -0
  51. package/dist/heart/daemon/cli-help.js +498 -0
  52. package/dist/heart/daemon/cli-parse.js +1592 -0
  53. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  54. package/dist/heart/daemon/cli-render.js +763 -0
  55. package/dist/heart/daemon/cli-types.js +8 -0
  56. package/dist/heart/daemon/connect-bay.js +323 -0
  57. package/dist/heart/daemon/daemon-cli.js +29 -1703
  58. package/dist/heart/daemon/daemon-entry.js +387 -2
  59. package/dist/heart/daemon/daemon-health.js +176 -0
  60. package/dist/heart/daemon/daemon-rollup.js +57 -0
  61. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  62. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  63. package/dist/heart/daemon/daemon.js +816 -71
  64. package/dist/heart/daemon/dns-workflow.js +394 -0
  65. package/dist/heart/daemon/doctor-types.js +8 -0
  66. package/dist/heart/daemon/doctor.js +826 -0
  67. package/dist/heart/daemon/health-monitor.js +122 -1
  68. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  69. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  70. package/dist/heart/daemon/http-health-probe.js +80 -0
  71. package/dist/heart/daemon/human-command-screens.js +234 -0
  72. package/dist/heart/daemon/human-readiness.js +114 -0
  73. package/dist/heart/daemon/inner-status.js +89 -0
  74. package/dist/heart/daemon/interactive-repair.js +394 -0
  75. package/dist/heart/daemon/launchd.js +37 -8
  76. package/dist/heart/daemon/log-tailer.js +82 -12
  77. package/dist/heart/daemon/logs-prune.js +110 -0
  78. package/dist/heart/daemon/mcp-canary.js +297 -0
  79. package/dist/heart/daemon/message-router.js +2 -2
  80. package/dist/heart/daemon/os-cron-deps.js +135 -0
  81. package/dist/heart/daemon/os-cron.js +14 -12
  82. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  83. package/dist/heart/daemon/ouro-entry.js +3 -1
  84. package/dist/heart/daemon/process-manager.js +375 -33
  85. package/dist/heart/daemon/provider-discovery.js +137 -0
  86. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  87. package/dist/heart/daemon/pulse.js +475 -0
  88. package/dist/heart/daemon/readiness-repair.js +365 -0
  89. package/dist/heart/daemon/run-hooks.js +2 -0
  90. package/dist/heart/daemon/runtime-logging.js +30 -6
  91. package/dist/heart/daemon/runtime-metadata.js +3 -31
  92. package/dist/heart/daemon/safe-mode.js +161 -0
  93. package/dist/heart/daemon/sense-manager.js +462 -38
  94. package/dist/heart/daemon/session-id-resolver.js +131 -0
  95. package/dist/heart/daemon/skill-management-installer.js +94 -0
  96. package/dist/heart/daemon/socket-client.js +158 -11
  97. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  98. package/dist/heart/daemon/startup-tui.js +330 -0
  99. package/dist/heart/daemon/task-scheduler.js +3 -25
  100. package/dist/heart/daemon/terminal-ui.js +499 -0
  101. package/dist/heart/daemon/thoughts.js +162 -17
  102. package/dist/heart/daemon/up-progress.js +366 -0
  103. package/dist/heart/daemon/vault-items.js +56 -0
  104. package/dist/heart/delegation.js +1 -1
  105. package/dist/heart/habits/habit-migration.js +189 -0
  106. package/dist/heart/habits/habit-parser.js +140 -0
  107. package/dist/heart/habits/habit-runtime-state.js +100 -0
  108. package/dist/heart/habits/habit-scheduler.js +372 -0
  109. package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
  110. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  111. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  112. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  113. package/dist/heart/identity.js +203 -57
  114. package/dist/heart/kept-notes.js +357 -0
  115. package/dist/heart/kicks.js +1 -1
  116. package/dist/heart/machine-identity.js +161 -0
  117. package/dist/heart/mail-import-discovery.js +353 -0
  118. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  119. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  120. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  121. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  122. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  123. package/dist/heart/mailbox/mailbox-http.js +99 -0
  124. package/dist/heart/mailbox/mailbox-read.js +31 -0
  125. package/dist/heart/mailbox/mailbox-types.js +27 -0
  126. package/dist/heart/mailbox/mailbox-view.js +195 -0
  127. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  128. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  129. package/dist/heart/mailbox/readers/mail.js +362 -0
  130. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  131. package/dist/heart/mailbox/readers/sessions.js +232 -0
  132. package/dist/heart/mailbox/readers/shared.js +111 -0
  133. package/dist/heart/mcp/mcp-server.js +656 -0
  134. package/dist/heart/migrate-config.js +100 -0
  135. package/dist/heart/model-capabilities.js +19 -0
  136. package/dist/heart/platform.js +81 -0
  137. package/dist/heart/provider-attempt.js +134 -0
  138. package/dist/heart/provider-binding-resolver.js +267 -0
  139. package/dist/heart/provider-credentials.js +425 -0
  140. package/dist/heart/provider-failover.js +301 -0
  141. package/dist/heart/provider-models.js +81 -0
  142. package/dist/heart/provider-ping.js +262 -0
  143. package/dist/heart/provider-readiness-cache.js +40 -0
  144. package/dist/heart/provider-visibility.js +188 -0
  145. package/dist/heart/providers/anthropic-token.js +131 -0
  146. package/dist/heart/providers/anthropic.js +139 -52
  147. package/dist/heart/providers/azure.js +97 -13
  148. package/dist/heart/providers/error-classification.js +127 -0
  149. package/dist/heart/providers/github-copilot.js +145 -0
  150. package/dist/heart/providers/minimax-vlm.js +189 -0
  151. package/dist/heart/providers/minimax.js +26 -8
  152. package/dist/heart/providers/openai-codex.js +55 -40
  153. package/dist/heart/runtime-capability-check.js +170 -0
  154. package/dist/heart/runtime-credentials.js +367 -0
  155. package/dist/heart/runtime-cwd.js +87 -0
  156. package/dist/heart/sense-truth.js +13 -4
  157. package/dist/heart/session-activity.js +43 -22
  158. package/dist/heart/session-events.js +1149 -0
  159. package/dist/heart/session-playback-cli-main.js +5 -0
  160. package/dist/heart/session-playback-cli.js +36 -0
  161. package/dist/heart/session-playback.js +231 -0
  162. package/dist/heart/session-stats-cli-main.js +5 -0
  163. package/dist/heart/session-stats.js +182 -0
  164. package/dist/heart/session-transcript.js +243 -0
  165. package/dist/heart/start-of-turn-packet.js +345 -0
  166. package/dist/heart/streaming.js +44 -27
  167. package/dist/heart/sync-classification.js +176 -0
  168. package/dist/heart/sync.js +449 -0
  169. package/dist/heart/target-resolution.js +9 -5
  170. package/dist/heart/tempo.js +93 -0
  171. package/dist/heart/temporal-view.js +41 -0
  172. package/dist/heart/timeouts.js +101 -0
  173. package/dist/heart/tool-activity-callbacks.js +59 -0
  174. package/dist/heart/tool-description.js +143 -0
  175. package/dist/heart/tool-friction.js +55 -0
  176. package/dist/heart/tool-loop.js +200 -0
  177. package/dist/heart/turn-context.js +421 -0
  178. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  179. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  180. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  181. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  182. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  183. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  184. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  185. package/dist/mailbox-ui/assets/index-B-461hes.js +61 -0
  186. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  187. package/dist/mailbox-ui/index.html +15 -0
  188. package/dist/mailroom/attention.js +167 -0
  189. package/dist/mailroom/autonomy.js +209 -0
  190. package/dist/mailroom/blob-store.js +674 -0
  191. package/dist/mailroom/body-cache.js +61 -0
  192. package/dist/mailroom/core.js +720 -0
  193. package/dist/mailroom/entry.js +160 -0
  194. package/dist/mailroom/file-store.js +430 -0
  195. package/dist/mailroom/mbox-import.js +383 -0
  196. package/dist/mailroom/outbound.js +380 -0
  197. package/dist/mailroom/policy.js +263 -0
  198. package/dist/mailroom/reader.js +233 -0
  199. package/dist/mailroom/search-cache.js +256 -0
  200. package/dist/mailroom/search-relevance.js +319 -0
  201. package/dist/mailroom/smtp-ingress.js +176 -0
  202. package/dist/mailroom/source-state.js +176 -0
  203. package/dist/mailroom/thread.js +109 -0
  204. package/dist/mailroom/travel-extract.js +89 -0
  205. package/dist/mind/bundle-manifest.js +7 -1
  206. package/dist/mind/context.js +165 -101
  207. package/dist/mind/diary-integrity.js +60 -0
  208. package/dist/mind/{memory.js → diary.js} +62 -75
  209. package/dist/mind/embedding-provider.js +60 -0
  210. package/dist/mind/file-state.js +179 -0
  211. package/dist/mind/friends/channel.js +39 -0
  212. package/dist/mind/friends/resolver.js +54 -2
  213. package/dist/mind/friends/store-file.js +39 -3
  214. package/dist/mind/friends/types.js +2 -2
  215. package/dist/mind/journal-index.js +161 -0
  216. package/dist/mind/note-search.js +268 -0
  217. package/dist/mind/obligation-steering.js +221 -0
  218. package/dist/mind/pending.js +4 -0
  219. package/dist/mind/prompt-refresh.js +3 -2
  220. package/dist/mind/prompt.js +1039 -135
  221. package/dist/mind/provenance-trust.js +26 -0
  222. package/dist/mind/scrutiny.js +173 -0
  223. package/dist/nerves/cli-logging.js +7 -1
  224. package/dist/nerves/coverage/audit-rules.js +15 -6
  225. package/dist/nerves/coverage/audit.js +28 -2
  226. package/dist/nerves/coverage/cli.js +1 -1
  227. package/dist/nerves/coverage/contract.js +5 -5
  228. package/dist/nerves/coverage/file-completeness.js +129 -5
  229. package/dist/nerves/coverage/run-artifacts.js +1 -1
  230. package/dist/nerves/event-buffer.js +111 -0
  231. package/dist/nerves/index.js +224 -4
  232. package/dist/nerves/observation.js +20 -0
  233. package/dist/nerves/redact.js +79 -0
  234. package/dist/nerves/review/cli-main.js +5 -0
  235. package/dist/nerves/review/cli.js +156 -0
  236. package/dist/nerves/review/core.js +152 -0
  237. package/dist/nerves/runtime.js +5 -1
  238. package/dist/repertoire/ado-client.js +15 -56
  239. package/dist/repertoire/ado-semantic.js +11 -10
  240. package/dist/repertoire/api-client.js +97 -0
  241. package/dist/repertoire/bitwarden-store.js +997 -0
  242. package/dist/repertoire/bundle-templates.js +72 -0
  243. package/dist/repertoire/bw-installer.js +180 -0
  244. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  245. package/dist/repertoire/coding/context-pack.js +330 -0
  246. package/dist/repertoire/coding/feedback.js +197 -30
  247. package/dist/repertoire/coding/manager.js +158 -9
  248. package/dist/repertoire/coding/spawner.js +55 -9
  249. package/dist/repertoire/coding/tools.js +170 -7
  250. package/dist/repertoire/commerce-errors.js +109 -0
  251. package/dist/repertoire/commerce-self-test.js +156 -0
  252. package/dist/repertoire/credential-access.js +178 -0
  253. package/dist/repertoire/duffel-client.js +185 -0
  254. package/dist/repertoire/github-client.js +14 -55
  255. package/dist/repertoire/graph-client.js +11 -52
  256. package/dist/repertoire/guardrails.js +396 -0
  257. package/dist/repertoire/mcp-client.js +295 -0
  258. package/dist/repertoire/mcp-manager.js +362 -0
  259. package/dist/repertoire/mcp-tools.js +63 -0
  260. package/dist/repertoire/shell-sessions.js +133 -0
  261. package/dist/repertoire/skills.js +15 -24
  262. package/dist/repertoire/stripe-client.js +131 -0
  263. package/dist/repertoire/tasks/board.js +31 -5
  264. package/dist/repertoire/tasks/fix.js +182 -0
  265. package/dist/repertoire/tasks/index.js +16 -4
  266. package/dist/repertoire/tasks/lifecycle.js +2 -2
  267. package/dist/repertoire/tasks/parser.js +3 -2
  268. package/dist/repertoire/tasks/scanner.js +194 -37
  269. package/dist/repertoire/tasks/transitions.js +16 -78
  270. package/dist/repertoire/tool-results.js +29 -0
  271. package/dist/repertoire/tools-attachments.js +317 -0
  272. package/dist/repertoire/tools-base.js +47 -1075
  273. package/dist/repertoire/tools-bluebubbles.js +1 -0
  274. package/dist/repertoire/tools-bridge.js +142 -0
  275. package/dist/repertoire/tools-bundle.js +984 -0
  276. package/dist/repertoire/tools-config.js +185 -0
  277. package/dist/repertoire/tools-continuity.js +248 -0
  278. package/dist/repertoire/tools-credential.js +381 -0
  279. package/dist/repertoire/tools-files.js +342 -0
  280. package/dist/repertoire/tools-flight.js +224 -0
  281. package/dist/repertoire/tools-flow.js +119 -0
  282. package/dist/repertoire/tools-github.js +1 -7
  283. package/dist/repertoire/tools-mail.js +1857 -0
  284. package/dist/repertoire/tools-notes.js +421 -0
  285. package/dist/repertoire/tools-session.js +809 -0
  286. package/dist/repertoire/tools-shell.js +120 -0
  287. package/dist/repertoire/tools-stripe.js +180 -0
  288. package/dist/repertoire/tools-surface.js +345 -0
  289. package/dist/repertoire/tools-teams.js +9 -39
  290. package/dist/repertoire/tools-travel.js +125 -0
  291. package/dist/repertoire/tools-trip.js +604 -0
  292. package/dist/repertoire/tools-user-profile.js +144 -0
  293. package/dist/repertoire/tools-vault.js +40 -0
  294. package/dist/repertoire/tools-voice.js +144 -0
  295. package/dist/repertoire/tools.js +115 -103
  296. package/dist/repertoire/travel-api-client.js +360 -0
  297. package/dist/repertoire/user-profile.js +131 -0
  298. package/dist/repertoire/vault-setup.js +246 -0
  299. package/dist/repertoire/vault-unlock.js +594 -0
  300. package/dist/scripts/claude-code-hook.js +41 -0
  301. package/dist/scripts/claude-code-stop-hook.js +47 -0
  302. package/dist/senses/attention-queue.js +116 -0
  303. package/dist/senses/bluebubbles/active-turns.js +216 -0
  304. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  305. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  306. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  307. package/dist/senses/bluebubbles/entry.js +77 -0
  308. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  309. package/dist/senses/bluebubbles/index.js +2420 -0
  310. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  311. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  312. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  313. package/dist/senses/bluebubbles/processed-log.js +133 -0
  314. package/dist/senses/bluebubbles/replay.js +137 -0
  315. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  316. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  317. package/dist/senses/bluebubbles-meta-guard.js +40 -0
  318. package/dist/senses/cli/bracketed-paste.js +82 -0
  319. package/dist/senses/cli/image-paste.js +287 -0
  320. package/dist/senses/cli/image-ref-navigation.js +75 -0
  321. package/dist/senses/cli/ink-app.js +156 -0
  322. package/dist/senses/cli/inline-diff.js +64 -0
  323. package/dist/senses/cli/input-keys.js +174 -0
  324. package/dist/senses/cli/kill-ring.js +86 -0
  325. package/dist/senses/cli/message-list.js +51 -0
  326. package/dist/senses/cli/ouro-tui.js +607 -0
  327. package/dist/senses/cli/spinner-imperative.js +135 -0
  328. package/dist/senses/cli/spinner.js +101 -0
  329. package/dist/senses/cli/status-line.js +60 -0
  330. package/dist/senses/cli/streaming-markdown.js +526 -0
  331. package/dist/senses/cli/tool-display.js +85 -0
  332. package/dist/senses/cli/tool-render.js +85 -0
  333. package/dist/senses/cli/tui-store.js +240 -0
  334. package/dist/senses/cli/virtual-list.js +35 -0
  335. package/dist/senses/cli-entry.js +60 -8
  336. package/dist/senses/cli-layout.js +100 -0
  337. package/dist/senses/cli.js +516 -204
  338. package/dist/senses/commands.js +66 -3
  339. package/dist/senses/habit-turn-message.js +108 -0
  340. package/dist/senses/inner-dialog-worker.js +175 -21
  341. package/dist/senses/inner-dialog.js +330 -27
  342. package/dist/senses/mail-entry.js +66 -0
  343. package/dist/senses/mail.js +379 -0
  344. package/dist/senses/pipeline.js +654 -181
  345. package/dist/senses/proactive-content-guard.js +51 -0
  346. package/dist/senses/shared-turn.js +392 -0
  347. package/dist/senses/surface-tool.js +70 -0
  348. package/dist/senses/teams-entry.js +60 -8
  349. package/dist/senses/teams.js +387 -98
  350. package/dist/senses/trust-gate.js +100 -5
  351. package/dist/senses/voice/audio-playback.js +237 -0
  352. package/dist/senses/voice/audio-routing.js +119 -0
  353. package/dist/senses/voice/elevenlabs.js +202 -0
  354. package/dist/senses/voice/golden-path.js +116 -0
  355. package/dist/senses/voice/index.js +28 -0
  356. package/dist/senses/voice/meeting.js +113 -0
  357. package/dist/senses/voice/outbound.js +190 -0
  358. package/dist/senses/voice/phone.js +33 -0
  359. package/dist/senses/voice/playback.js +139 -0
  360. package/dist/senses/voice/transcript.js +70 -0
  361. package/dist/senses/voice/turn.js +191 -0
  362. package/dist/senses/voice/twilio-phone-runtime.js +755 -0
  363. package/dist/senses/voice/twilio-phone.js +4484 -0
  364. package/dist/senses/voice/types.js +2 -0
  365. package/dist/senses/voice/whisper.js +161 -0
  366. package/dist/senses/voice-entry.js +81 -0
  367. package/dist/senses/voice-twilio-entry.js +87 -0
  368. package/dist/trips/core.js +138 -0
  369. package/dist/trips/store.js +146 -0
  370. package/package.json +40 -7
  371. package/skills/agent-commerce.md +106 -0
  372. package/skills/browser-navigation.md +117 -0
  373. package/skills/commerce-setup-guide.md +116 -0
  374. package/skills/commerce-setup.md +84 -0
  375. package/skills/configure-dev-tools.md +99 -0
  376. package/skills/travel-planning.md +138 -0
  377. package/dist/heart/daemon/auth-flow.js +0 -351
  378. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  379. package/dist/heart/daemon/subagent-installer.js +0 -166
  380. package/dist/heart/session-recall.js +0 -116
  381. package/dist/mind/associative-recall.js +0 -209
  382. package/dist/senses/bluebubbles-entry.js +0 -13
  383. package/dist/senses/bluebubbles.js +0 -1177
  384. package/dist/senses/debug-activity.js +0 -148
  385. package/subagents/README.md +0 -86
  386. package/subagents/work-doer.md +0 -237
  387. package/subagents/work-merger.md +0 -618
  388. package/subagents/work-planner.md +0 -390
  389. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  390. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  391. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  392. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  393. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  394. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  395. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  396. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  397. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  398. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  399. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  400. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  401. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  402. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  403. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  404. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,138 @@
1
+ # Travel Planning Skill
2
+
3
+ Compose all travel infrastructure to plan and book trips effectively.
4
+
5
+ ## Research Phase
6
+
7
+ ### Destination Research
8
+ 1. Use `geocode_search` to find candidate destinations and get coordinates
9
+ 2. Use `weather_lookup` to check climate for travel dates
10
+ 3. Use `travel_advisory` to check US State Dept safety levels (1-4):
11
+ - Level 1: Exercise Normal Precautions
12
+ - Level 2: Exercise Increased Caution
13
+ - Level 3: Reconsider Travel
14
+ - Level 4: Do Not Travel
15
+ 4. Use browser tools (see `browser-navigation` skill) for destination reviews, travel blogs, local tips
16
+ 5. Compare multiple destinations on weather, safety, cost, and flight availability
17
+
18
+ ### Information Gathering Workflow
19
+ ```
20
+ geocode_search -> get coordinates
21
+ weather_lookup -> check weather at coordinates
22
+ travel_advisory -> check safety level
23
+ browser tools -> reviews, local info, pricing
24
+ ```
25
+
26
+ ## Flight Search
27
+
28
+ ### Using Duffel MCP (when available)
29
+ - Search via `duffel_search_flights` tool (first-class MCP tool)
30
+ - Provide: origin, destination, dates, passengers, cabin class
31
+ - Compare options on price, duration, stops, airline
32
+
33
+ ### Using Browser (fallback)
34
+ - Use browser-navigation skill patterns for Google Flights, airline sites
35
+ - Add delays between searches to avoid detection
36
+
37
+ ### Comparison Criteria
38
+ Present top 3-5 options comparing:
39
+ - Total price (including bags, seat selection)
40
+ - Duration and number of stops
41
+ - Airline and aircraft
42
+ - Departure/arrival times
43
+ - Cancellation/change policy
44
+
45
+ ## Accommodation Search
46
+
47
+ ### Hotel Search
48
+ - Use Expedia MCP when available (`expedia_search_hotels` tool)
49
+ - Compare: price per night, total stay cost, location, rating, amenities
50
+ - Check cancellation policies (crucial for travel planning)
51
+
52
+ ### Vacation Rentals (Browser-based)
53
+ - Use browser-navigation skill for Airbnb/VRBO
54
+ - Search by location, dates, guests, budget
55
+ - Compare: price, location proximity, reviews, amenities, host rating
56
+ - Screenshot listings for user review
57
+
58
+ ### Comparison Criteria
59
+ - Price per night and total cost
60
+ - Location (distance to key attractions/activities)
61
+ - Reviews and ratings
62
+ - Amenities (WiFi, kitchen, parking, pool)
63
+ - Cancellation flexibility
64
+
65
+ ## Booking Workflow
66
+
67
+ ### Critical Safety Gates
68
+ - **ALWAYS confirm with user before any booking action**
69
+ - **ALWAYS confirm before entering payment information**
70
+ - **ALWAYS confirm before agreeing to terms**
71
+ - **Never proceed with a financial commitment without explicit approval**
72
+
73
+ ### Credential Handling
74
+
75
+ Credentials are managed through the credential access layer, which stores
76
+ agent-owned secrets in the agent's Bitwarden/Vaultwarden credential vault.
77
+ Stored passwords stay in the vault. A brand-new signup password may enter
78
+ model context briefly when the agent explicitly generates or types it during
79
+ an interactive sign-up flow.
80
+
81
+ - Use `credential_get` to check what credentials exist for a domain (metadata only, never passwords)
82
+ - Use `credential_generate_password` to mint a strong password for a new sign-up
83
+ - Use `credential_store` to save credentials the agent acquired after the site accepts them
84
+ - The credential gateway automatically injects secrets into API requests via `getRawSecret()`
85
+ - Use browser-navigation skill form patterns for entering credentials during interactive sessions
86
+
87
+ **How credentials work:**
88
+ - Agent-owned credentials live in the agent's Bitwarden/Vaultwarden vault
89
+ - Travel credentials such as Duffel and Stripe are ordinary vault credential items
90
+ - The agent can sign up for services and store its own credentials
91
+ - Existing stored passwords are never returned to the model — only metadata (domain, username, notes)
92
+
93
+ ### Post-Booking
94
+ - Save confirmation details (confirmation number, dates, hotel name, airline, booking reference)
95
+ - Save to diary/journal for future reference
96
+ - Set reminders for check-in windows
97
+ - Note cancellation deadlines
98
+
99
+ ## Preference Management
100
+
101
+ ### Storing Preferences
102
+ Track and reference these travel preferences:
103
+ - Preferred airlines and alliance status
104
+ - Preferred hotel chains and loyalty numbers
105
+ - Seat preferences (window/aisle, extra legroom)
106
+ - Dietary needs for in-flight meals
107
+ - Budget ranges (per night for hotels, per flight)
108
+ - Must-have amenities (WiFi, gym, pool)
109
+
110
+ ### Using Preferences
111
+ - Reference stored preferences when searching
112
+ - Apply airline preferences to flight comparisons
113
+ - Apply hotel brand preferences to accommodation searches
114
+ - Adjust budget ranges based on destination
115
+
116
+ ## Tool Reference
117
+
118
+ ### Native Tools (always available)
119
+ - `weather_lookup` - Current weather and daily forecast by city or coordinates (Open-Meteo, zero config)
120
+ - `travel_advisory` - US State Dept advisory by country code
121
+ - `geocode_search` - Location/POI search with coordinates
122
+ - `credential_get` - Check credential metadata for a domain (never returns passwords)
123
+ - `credential_generate_password` - Generate a strong password for a new sign-up (family trust)
124
+ - `credential_store` - Store credentials the agent acquired (family trust)
125
+ - `credential_list` - List stored credential domains
126
+ - `credential_delete` - Delete stored credentials (family trust)
127
+
128
+ ### MCP Tools (when configured)
129
+ - Browser tools via `@playwright/mcp` - see `browser-navigation` skill
130
+ - Duffel flight search (when MCP server available)
131
+ - Expedia hotel search (when MCP server available)
132
+
133
+ ### Human Confirmation Required For
134
+ - Any booking or payment
135
+ - Entering personal information
136
+ - Agreeing to terms of service
137
+ - Creating financial obligations
138
+ - Sharing credentials with third parties
@@ -1,351 +0,0 @@
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.readAgentConfigForAgent = readAgentConfigForAgent;
37
- exports.writeAgentProviderSelection = writeAgentProviderSelection;
38
- exports.loadAgentSecrets = loadAgentSecrets;
39
- exports.writeProviderCredentials = writeProviderCredentials;
40
- exports.collectRuntimeAuthCredentials = collectRuntimeAuthCredentials;
41
- exports.resolveHatchCredentials = resolveHatchCredentials;
42
- exports.runRuntimeAuthFlow = runRuntimeAuthFlow;
43
- const child_process_1 = require("child_process");
44
- const fs = __importStar(require("fs"));
45
- const os = __importStar(require("os"));
46
- const path = __importStar(require("path"));
47
- const runtime_1 = require("../../nerves/runtime");
48
- const identity_1 = require("../identity");
49
- const ANTHROPIC_SETUP_TOKEN_PREFIX = "sk-ant-oat01-";
50
- const ANTHROPIC_SETUP_TOKEN_MIN_LENGTH = 80;
51
- const DEFAULT_SECRETS_TEMPLATE = {
52
- providers: {
53
- azure: {
54
- modelName: "gpt-4o-mini",
55
- apiKey: "",
56
- endpoint: "",
57
- deployment: "",
58
- apiVersion: "2025-04-01-preview",
59
- },
60
- minimax: {
61
- model: "minimax-text-01",
62
- apiKey: "",
63
- },
64
- anthropic: {
65
- model: "claude-opus-4-6",
66
- setupToken: "",
67
- },
68
- "openai-codex": {
69
- model: "gpt-5.4",
70
- oauthAccessToken: "",
71
- },
72
- },
73
- teams: {
74
- clientId: "",
75
- clientSecret: "",
76
- tenantId: "",
77
- },
78
- oauth: {
79
- graphConnectionName: "graph",
80
- adoConnectionName: "ado",
81
- githubConnectionName: "",
82
- },
83
- teamsChannel: {
84
- skipConfirmation: true,
85
- port: 3978,
86
- },
87
- integrations: {
88
- perplexityApiKey: "",
89
- openaiEmbeddingsApiKey: "",
90
- },
91
- };
92
- function deepMerge(defaults, partial) {
93
- const result = { ...defaults };
94
- for (const key of Object.keys(partial)) {
95
- const left = result[key];
96
- const right = partial[key];
97
- if (right !== null &&
98
- typeof right === "object" &&
99
- !Array.isArray(right) &&
100
- left !== null &&
101
- typeof left === "object" &&
102
- !Array.isArray(left)) {
103
- result[key] = deepMerge(left, right);
104
- continue;
105
- }
106
- result[key] = right;
107
- }
108
- return result;
109
- }
110
- function readJsonRecord(filePath, label) {
111
- try {
112
- const raw = fs.readFileSync(filePath, "utf8");
113
- const parsed = JSON.parse(raw);
114
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
115
- throw new Error("expected object");
116
- }
117
- return parsed;
118
- }
119
- catch (error) {
120
- throw new Error(`Failed to read ${label} at ${filePath}: ${String(error)}`);
121
- }
122
- }
123
- function readAgentConfigForAgent(agentName, bundlesRoot = (0, identity_1.getAgentBundlesRoot)()) {
124
- const configPath = path.join(bundlesRoot, `${agentName}.ouro`, "agent.json");
125
- const parsed = readJsonRecord(configPath, "agent config");
126
- const provider = parsed.provider;
127
- if (provider !== "azure" &&
128
- provider !== "anthropic" &&
129
- provider !== "minimax" &&
130
- provider !== "openai-codex") {
131
- throw new Error(`agent.json at ${configPath} has unsupported provider '${String(provider)}'`);
132
- }
133
- return {
134
- configPath,
135
- config: parsed,
136
- };
137
- }
138
- function writeAgentProviderSelection(agentName, provider, bundlesRoot = (0, identity_1.getAgentBundlesRoot)()) {
139
- const { configPath, config } = readAgentConfigForAgent(agentName, bundlesRoot);
140
- const nextConfig = { ...config, provider };
141
- fs.writeFileSync(configPath, `${JSON.stringify(nextConfig, null, 2)}\n`, "utf8");
142
- (0, runtime_1.emitNervesEvent)({
143
- component: "daemon",
144
- event: "daemon.auth_provider_selected",
145
- message: "updated agent provider selection after auth flow",
146
- meta: { agentName, provider, configPath },
147
- });
148
- return configPath;
149
- }
150
- function resolveAgentSecretsPath(agentName, deps = {}) {
151
- if (deps.secretsRoot)
152
- return path.join(deps.secretsRoot, agentName, "secrets.json");
153
- const homeDir = deps.homeDir ?? os.homedir();
154
- return (0, identity_1.getAgentSecretsPath)(agentName).replace(os.homedir(), homeDir);
155
- }
156
- function loadAgentSecrets(agentName, deps = {}) {
157
- const secretsPath = resolveAgentSecretsPath(agentName, deps);
158
- const secretsDir = path.dirname(secretsPath);
159
- fs.mkdirSync(secretsDir, { recursive: true });
160
- let onDisk = {};
161
- try {
162
- onDisk = readJsonRecord(secretsPath, "secrets config");
163
- }
164
- catch (error) {
165
- const message = error.message;
166
- if (!message.includes("ENOENT"))
167
- throw error;
168
- }
169
- return {
170
- secretsPath,
171
- secrets: deepMerge(DEFAULT_SECRETS_TEMPLATE, onDisk),
172
- };
173
- }
174
- function writeSecrets(secretsPath, secrets) {
175
- fs.writeFileSync(secretsPath, `${JSON.stringify(secrets, null, 2)}\n`, "utf8");
176
- }
177
- function writeProviderCredentials(agentName, provider, credentials, deps = {}) {
178
- const { secretsPath, secrets } = loadAgentSecrets(agentName, deps);
179
- applyCredentials(secrets, provider, credentials);
180
- writeSecrets(secretsPath, secrets);
181
- return { secretsPath, secrets };
182
- }
183
- function readCodexAccessToken(homeDir) {
184
- const authPath = path.join(homeDir, ".codex", "auth.json");
185
- try {
186
- const raw = fs.readFileSync(authPath, "utf8");
187
- const parsed = JSON.parse(raw);
188
- const token = parsed?.tokens?.access_token;
189
- return typeof token === "string" ? token.trim() : "";
190
- }
191
- catch {
192
- return "";
193
- }
194
- }
195
- function ensurePromptInput(promptInput, provider) {
196
- if (promptInput)
197
- return promptInput;
198
- throw new Error(`No prompt input is available for ${provider} authentication.`);
199
- }
200
- function validateAnthropicToken(token) {
201
- const trimmed = token.trim();
202
- if (!trimmed) {
203
- throw new Error("No Anthropic setup token was provided.");
204
- }
205
- if (!trimmed.startsWith(ANTHROPIC_SETUP_TOKEN_PREFIX)) {
206
- throw new Error(`Invalid Anthropic setup token format. Expected prefix ${ANTHROPIC_SETUP_TOKEN_PREFIX}.`);
207
- }
208
- if (trimmed.length < ANTHROPIC_SETUP_TOKEN_MIN_LENGTH) {
209
- throw new Error("Anthropic setup token looks too short.");
210
- }
211
- return trimmed;
212
- }
213
- async function collectRuntimeAuthCredentials(input, deps) {
214
- const spawnSync = deps.spawnSync ?? child_process_1.spawnSync;
215
- const homeDir = deps.homeDir ?? os.homedir();
216
- if (input.provider === "openai-codex") {
217
- let token = readCodexAccessToken(homeDir);
218
- if (!token) {
219
- (0, runtime_1.emitNervesEvent)({
220
- component: "daemon",
221
- event: "daemon.auth_codex_login_start",
222
- message: "starting codex login for runtime auth",
223
- meta: { agentName: input.agentName },
224
- });
225
- const result = spawnSync("codex", ["login"], { stdio: "inherit" });
226
- if (result.error) {
227
- throw new Error(`Failed to run 'codex login': ${result.error.message}`);
228
- }
229
- if (result.status !== 0) {
230
- throw new Error(`'codex login' exited with status ${result.status}.`);
231
- }
232
- token = readCodexAccessToken(homeDir);
233
- if (!token) {
234
- throw new Error("Codex login completed but no token was found in ~/.codex/auth.json. Re-run `codex login` and try again.");
235
- }
236
- }
237
- return { oauthAccessToken: token };
238
- }
239
- if (input.provider === "anthropic") {
240
- (0, runtime_1.emitNervesEvent)({
241
- component: "daemon",
242
- event: "daemon.auth_claude_setup_start",
243
- message: "starting claude setup-token for runtime auth",
244
- meta: { agentName: input.agentName },
245
- });
246
- const result = spawnSync("claude", ["setup-token"], { stdio: "inherit" });
247
- if (result.error) {
248
- throw new Error(`Failed to run 'claude setup-token': ${result.error.message}`);
249
- }
250
- if (result.status !== 0) {
251
- throw new Error(`'claude setup-token' exited with status ${result.status}.`);
252
- }
253
- const prompt = ensurePromptInput(input.promptInput, input.provider);
254
- const setupToken = validateAnthropicToken(await prompt("Paste the setup token from `claude setup-token`: "));
255
- return { setupToken };
256
- }
257
- if (input.provider === "minimax") {
258
- const prompt = ensurePromptInput(input.promptInput, input.provider);
259
- const apiKey = (await prompt("MiniMax API key: ")).trim();
260
- if (!apiKey)
261
- throw new Error("MiniMax API key is required.");
262
- return { apiKey };
263
- }
264
- const prompt = ensurePromptInput(input.promptInput, input.provider);
265
- const apiKey = (await prompt("Azure API key: ")).trim();
266
- const endpoint = (await prompt("Azure endpoint: ")).trim();
267
- const deployment = (await prompt("Azure deployment: ")).trim();
268
- if (!apiKey || !endpoint || !deployment) {
269
- throw new Error("Azure API key, endpoint, and deployment are required.");
270
- }
271
- return { apiKey, endpoint, deployment };
272
- }
273
- async function resolveHatchCredentials(input) {
274
- const prompt = input.promptInput;
275
- const credentials = { ...(input.credentials ?? {}) };
276
- if (input.provider === "anthropic" && !credentials.setupToken && input.runAuthFlow) {
277
- const result = await input.runAuthFlow({
278
- agentName: input.agentName,
279
- provider: "anthropic",
280
- promptInput: prompt,
281
- });
282
- Object.assign(credentials, result.credentials);
283
- }
284
- if (input.provider === "anthropic" && !credentials.setupToken && prompt) {
285
- credentials.setupToken = await prompt("Anthropic setup-token: ");
286
- }
287
- if (input.provider === "openai-codex" && !credentials.oauthAccessToken && input.runAuthFlow) {
288
- const result = await input.runAuthFlow({
289
- agentName: input.agentName,
290
- provider: "openai-codex",
291
- promptInput: prompt,
292
- });
293
- Object.assign(credentials, result.credentials);
294
- }
295
- if (input.provider === "openai-codex" && !credentials.oauthAccessToken && prompt) {
296
- credentials.oauthAccessToken = await prompt("OpenAI Codex OAuth token: ");
297
- }
298
- if (input.provider === "minimax" && !credentials.apiKey && prompt) {
299
- credentials.apiKey = await prompt("MiniMax API key: ");
300
- }
301
- if (input.provider === "azure") {
302
- if (!credentials.apiKey && prompt)
303
- credentials.apiKey = await prompt("Azure API key: ");
304
- if (!credentials.endpoint && prompt)
305
- credentials.endpoint = await prompt("Azure endpoint: ");
306
- if (!credentials.deployment && prompt)
307
- credentials.deployment = await prompt("Azure deployment: ");
308
- }
309
- return credentials;
310
- }
311
- function applyCredentials(secrets, provider, credentials) {
312
- if (provider === "anthropic") {
313
- secrets.providers.anthropic.setupToken = credentials.setupToken.trim();
314
- return;
315
- }
316
- if (provider === "openai-codex") {
317
- secrets.providers["openai-codex"].oauthAccessToken = credentials.oauthAccessToken.trim();
318
- return;
319
- }
320
- if (provider === "minimax") {
321
- secrets.providers.minimax.apiKey = credentials.apiKey.trim();
322
- return;
323
- }
324
- secrets.providers.azure.apiKey = credentials.apiKey.trim();
325
- secrets.providers.azure.endpoint = credentials.endpoint.trim();
326
- secrets.providers.azure.deployment = credentials.deployment.trim();
327
- }
328
- async function runRuntimeAuthFlow(input, deps = {}) {
329
- (0, runtime_1.emitNervesEvent)({
330
- component: "daemon",
331
- event: "daemon.auth_flow_start",
332
- message: "starting runtime auth flow",
333
- meta: { agentName: input.agentName, provider: input.provider },
334
- });
335
- const homeDir = deps.homeDir ?? os.homedir();
336
- const credentials = await collectRuntimeAuthCredentials(input, deps);
337
- const { secretsPath } = writeProviderCredentials(input.agentName, input.provider, credentials, { homeDir });
338
- (0, runtime_1.emitNervesEvent)({
339
- component: "daemon",
340
- event: "daemon.auth_flow_end",
341
- message: "completed runtime auth flow",
342
- meta: { agentName: input.agentName, provider: input.provider, secretsPath },
343
- });
344
- return {
345
- agentName: input.agentName,
346
- provider: input.provider,
347
- secretsPath,
348
- message: `authenticated ${input.agentName} with ${input.provider}`,
349
- credentials,
350
- };
351
- }
@@ -1,178 +0,0 @@
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.installOuroCommand = installOuroCommand;
37
- const fs = __importStar(require("fs"));
38
- const os = __importStar(require("os"));
39
- const path = __importStar(require("path"));
40
- const runtime_1 = require("../../nerves/runtime");
41
- const CLI_PACKAGE_SPECIFIER = "@ouro.bot/cli@alpha";
42
- const WRAPPER_SCRIPT = `#!/bin/sh
43
- exec npx --yes ${CLI_PACKAGE_SPECIFIER} "$@"
44
- `;
45
- function detectShellProfile(homeDir, shell) {
46
- if (!shell)
47
- return null;
48
- const base = path.basename(shell);
49
- if (base === "zsh")
50
- return path.join(homeDir, ".zshrc");
51
- if (base === "bash") {
52
- // macOS uses .bash_profile, Linux uses .bashrc
53
- const profilePath = path.join(homeDir, ".bash_profile");
54
- return profilePath;
55
- }
56
- if (base === "fish")
57
- return path.join(homeDir, ".config", "fish", "config.fish");
58
- return null;
59
- }
60
- function isBinDirInPath(binDir, envPath) {
61
- return envPath.split(path.delimiter).some((p) => p === binDir);
62
- }
63
- function buildPathExportLine(binDir, shell) {
64
- const base = shell ? path.basename(shell) : /* v8 ignore next -- unreachable: only called when detectShellProfile returns non-null, which requires shell @preserve */ "";
65
- if (base === "fish") {
66
- return `\n# Added by ouro\nset -gx PATH ${binDir} $PATH\n`;
67
- }
68
- return `\n# Added by ouro\nexport PATH="${binDir}:$PATH"\n`;
69
- }
70
- function installOuroCommand(deps = {}) {
71
- /* v8 ignore start -- dep defaults: only used in real runtime, tests always inject @preserve */
72
- const platform = deps.platform ?? process.platform;
73
- const homeDir = deps.homeDir ?? os.homedir();
74
- const existsSync = deps.existsSync ?? fs.existsSync;
75
- const mkdirSync = deps.mkdirSync ?? fs.mkdirSync;
76
- const writeFileSync = deps.writeFileSync ?? fs.writeFileSync;
77
- const readFileSync = deps.readFileSync ?? ((p, enc) => fs.readFileSync(p, enc));
78
- const appendFileSync = deps.appendFileSync ?? fs.appendFileSync;
79
- const chmodSync = deps.chmodSync ?? fs.chmodSync;
80
- const envPath = deps.envPath ?? process.env.PATH ?? "";
81
- const shell = deps.shell ?? process.env.SHELL;
82
- /* v8 ignore stop */
83
- if (platform === "win32") {
84
- (0, runtime_1.emitNervesEvent)({
85
- component: "daemon",
86
- event: "daemon.ouro_path_install_skip",
87
- message: "skipped ouro PATH install on Windows",
88
- meta: { platform },
89
- });
90
- return { installed: false, scriptPath: null, pathReady: false, shellProfileUpdated: null, skippedReason: "windows" };
91
- }
92
- const binDir = path.join(homeDir, ".local", "bin");
93
- const scriptPath = path.join(binDir, "ouro");
94
- (0, runtime_1.emitNervesEvent)({
95
- component: "daemon",
96
- event: "daemon.ouro_path_install_start",
97
- message: "installing ouro command to PATH",
98
- meta: { scriptPath, binDir },
99
- });
100
- // If ouro already exists, check content and repair if stale
101
- if (existsSync(scriptPath)) {
102
- let existingContent = "";
103
- try {
104
- existingContent = readFileSync(scriptPath, "utf-8");
105
- }
106
- catch {
107
- // Can't read — treat as stale, will overwrite below
108
- }
109
- if (existingContent === WRAPPER_SCRIPT) {
110
- (0, runtime_1.emitNervesEvent)({
111
- component: "daemon",
112
- event: "daemon.ouro_path_install_skip",
113
- message: "ouro command already installed",
114
- meta: { scriptPath },
115
- });
116
- return { installed: false, scriptPath, pathReady: isBinDirInPath(binDir, envPath), shellProfileUpdated: null, skippedReason: "already-installed" };
117
- }
118
- // Content is stale — repair by overwriting
119
- (0, runtime_1.emitNervesEvent)({
120
- component: "daemon",
121
- event: "daemon.ouro_path_install_repair",
122
- message: "repairing stale ouro wrapper script",
123
- meta: { scriptPath },
124
- });
125
- }
126
- try {
127
- mkdirSync(binDir, { recursive: true });
128
- writeFileSync(scriptPath, WRAPPER_SCRIPT, { mode: 0o755 });
129
- chmodSync(scriptPath, 0o755);
130
- }
131
- catch (error) {
132
- (0, runtime_1.emitNervesEvent)({
133
- level: "warn",
134
- component: "daemon",
135
- event: "daemon.ouro_path_install_error",
136
- message: "failed to install ouro command",
137
- meta: { error: error instanceof Error ? error.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(error) },
138
- });
139
- return { installed: false, scriptPath: null, pathReady: false, shellProfileUpdated: null, skippedReason: error instanceof Error ? error.message : /* v8 ignore next -- defensive @preserve */ String(error) };
140
- }
141
- // Check if ~/.local/bin is already in PATH
142
- let shellProfileUpdated = null;
143
- const pathReady = isBinDirInPath(binDir, envPath);
144
- if (!pathReady) {
145
- const profilePath = detectShellProfile(homeDir, shell);
146
- if (profilePath) {
147
- try {
148
- let existing = "";
149
- try {
150
- existing = readFileSync(profilePath, "utf-8");
151
- }
152
- catch {
153
- // Profile doesn't exist yet — that's fine, we'll create it
154
- }
155
- if (!existing.includes(binDir)) {
156
- appendFileSync(profilePath, buildPathExportLine(binDir, shell));
157
- shellProfileUpdated = profilePath;
158
- }
159
- }
160
- catch (error) {
161
- (0, runtime_1.emitNervesEvent)({
162
- level: "warn",
163
- component: "daemon",
164
- event: "daemon.ouro_path_profile_error",
165
- message: "failed to update shell profile for PATH",
166
- meta: { profilePath, error: error instanceof Error ? error.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(error) },
167
- });
168
- }
169
- }
170
- }
171
- (0, runtime_1.emitNervesEvent)({
172
- component: "daemon",
173
- event: "daemon.ouro_path_install_end",
174
- message: "ouro command installed",
175
- meta: { scriptPath, pathReady, shellProfileUpdated },
176
- });
177
- return { installed: true, scriptPath, pathReady, shellProfileUpdated };
178
- }