@ouro.bot/cli 0.1.0-alpha.73 → 0.1.0-alpha.731

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 (530) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -23
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/bluebubbles-host +264 -0
  14. package/changelog.json +4645 -14
  15. package/dist/a2a/card.js +57 -0
  16. package/dist/a2a/client.js +180 -0
  17. package/dist/a2a/config.js +50 -0
  18. package/dist/a2a/delegation-stores.js +56 -0
  19. package/dist/a2a/did-resolution.js +93 -0
  20. package/dist/a2a/identity.js +170 -0
  21. package/dist/a2a/inbound-share.js +107 -0
  22. package/dist/a2a/mission-result-wire.js +196 -0
  23. package/dist/a2a/onboarding.js +115 -0
  24. package/dist/a2a/pin-store.js +132 -0
  25. package/dist/a2a/seen-ledger.js +120 -0
  26. package/dist/a2a/server.js +604 -0
  27. package/dist/a2a/task-store.js +69 -0
  28. package/dist/a2a/transport.js +45 -0
  29. package/dist/a2a/types.js +3 -0
  30. package/dist/arc/attention-types.js +8 -0
  31. package/dist/arc/cares.js +144 -0
  32. package/dist/arc/episodes.js +118 -0
  33. package/dist/arc/evolution.js +490 -0
  34. package/dist/arc/flight-recorder.js +1034 -0
  35. package/dist/arc/intentions.js +134 -0
  36. package/dist/arc/json-store.js +117 -0
  37. package/dist/arc/obligations.js +348 -0
  38. package/dist/arc/packets.js +336 -0
  39. package/dist/arc/presence.js +185 -0
  40. package/dist/arc/task-lifecycle.js +57 -0
  41. package/dist/commerce/store.js +755 -0
  42. package/dist/commerce/types.js +3 -0
  43. package/dist/heart/active-work.js +874 -43
  44. package/dist/heart/agent-entry.js +190 -3
  45. package/dist/heart/approval-store.js +791 -0
  46. package/dist/heart/attachments/image-normalize.js +194 -0
  47. package/dist/heart/attachments/materialize.js +97 -0
  48. package/dist/heart/attachments/originals.js +88 -0
  49. package/dist/heart/attachments/render.js +29 -0
  50. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  51. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  52. package/dist/heart/attachments/sources/index.js +16 -0
  53. package/dist/heart/attachments/store.js +103 -0
  54. package/dist/heart/attachments/types.js +93 -0
  55. package/dist/heart/auth/auth-flow.js +479 -0
  56. package/dist/heart/autonomy-budget.js +434 -0
  57. package/dist/heart/awaiting/await-alert.js +146 -0
  58. package/dist/heart/awaiting/await-expiry.js +108 -0
  59. package/dist/heart/awaiting/await-loader.js +91 -0
  60. package/dist/heart/awaiting/await-parser.js +141 -0
  61. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  62. package/dist/heart/awaiting/await-scheduler.js +378 -0
  63. package/dist/heart/background-operations.js +281 -0
  64. package/dist/heart/bridges/manager.js +137 -17
  65. package/dist/heart/bridges/store.js +14 -2
  66. package/dist/heart/bundle-state.js +168 -0
  67. package/dist/heart/commitments.js +135 -0
  68. package/dist/heart/config-registry.js +331 -0
  69. package/dist/heart/config.js +120 -129
  70. package/dist/heart/context-loss-gauntlet.js +354 -0
  71. package/dist/heart/context-loss-sentinel.js +1155 -0
  72. package/dist/heart/core.js +1763 -320
  73. package/dist/heart/cross-chat-delivery.js +8 -22
  74. package/dist/heart/daemon/agent-config-check.js +451 -0
  75. package/dist/heart/daemon/agent-discovery.js +185 -3
  76. package/dist/heart/daemon/agent-service.js +542 -0
  77. package/dist/heart/daemon/agentic-repair.js +547 -0
  78. package/dist/heart/daemon/await-private-wake.js +59 -0
  79. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  80. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  81. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  82. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  83. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  84. package/dist/heart/daemon/cadence.js +180 -0
  85. package/dist/heart/daemon/cli-defaults.js +832 -0
  86. package/dist/heart/daemon/cli-desk.js +322 -0
  87. package/dist/heart/daemon/cli-exec.js +8620 -0
  88. package/dist/heart/daemon/cli-help.js +705 -0
  89. package/dist/heart/daemon/cli-parse.js +2712 -0
  90. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  91. package/dist/heart/daemon/cli-render.js +777 -0
  92. package/dist/heart/daemon/cli-types.js +8 -0
  93. package/dist/heart/daemon/connect-bay.js +323 -0
  94. package/dist/heart/daemon/daemon-cli.js +29 -2093
  95. package/dist/heart/daemon/daemon-entry.js +842 -10
  96. package/dist/heart/daemon/daemon-health.js +176 -0
  97. package/dist/heart/daemon/daemon-rollup.js +57 -0
  98. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  99. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  100. package/dist/heart/daemon/daemon.js +1610 -87
  101. package/dist/heart/daemon/dns-workflow.js +394 -0
  102. package/dist/heart/daemon/doctor-types.js +8 -0
  103. package/dist/heart/daemon/doctor.js +1689 -0
  104. package/dist/heart/daemon/freshness.js +345 -0
  105. package/dist/heart/daemon/habit-private-wake.js +61 -0
  106. package/dist/heart/daemon/health-monitor.js +142 -11
  107. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  108. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  109. package/dist/heart/daemon/http-health-probe.js +80 -0
  110. package/dist/heart/daemon/human-command-screens.js +234 -0
  111. package/dist/heart/daemon/human-readiness.js +114 -0
  112. package/dist/heart/daemon/inner-status.js +78 -0
  113. package/dist/heart/daemon/interactive-repair.js +394 -0
  114. package/dist/heart/daemon/launchd.js +37 -8
  115. package/dist/heart/daemon/log-tailer.js +79 -10
  116. package/dist/heart/daemon/logs-prune.js +132 -0
  117. package/dist/heart/daemon/mcp-canary.js +524 -0
  118. package/dist/heart/daemon/message-router.js +45 -5
  119. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  120. package/dist/heart/daemon/os-cron-deps.js +135 -0
  121. package/dist/heart/daemon/os-cron.js +22 -14
  122. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  123. package/dist/heart/daemon/ouro-entry.js +3 -1
  124. package/dist/heart/daemon/plugin-cli.js +432 -0
  125. package/dist/heart/daemon/process-manager.js +624 -61
  126. package/dist/heart/daemon/provider-discovery.js +137 -0
  127. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  128. package/dist/heart/daemon/prunable-bundle.js +144 -0
  129. package/dist/heart/daemon/pulse.js +511 -0
  130. package/dist/heart/daemon/readiness-repair.js +365 -0
  131. package/dist/heart/daemon/run-hooks.js +2 -0
  132. package/dist/heart/daemon/runtime-logging.js +41 -14
  133. package/dist/heart/daemon/runtime-metadata.js +2 -30
  134. package/dist/heart/daemon/safe-mode.js +161 -0
  135. package/dist/heart/daemon/sense-manager.js +670 -48
  136. package/dist/heart/daemon/session-id-resolver.js +131 -0
  137. package/dist/heart/daemon/skill-management-installer.js +1 -1
  138. package/dist/heart/daemon/socket-client.js +180 -12
  139. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  140. package/dist/heart/daemon/startup-tui.js +338 -0
  141. package/dist/heart/daemon/task-scheduler.js +117 -39
  142. package/dist/heart/daemon/terminal-ui.js +499 -0
  143. package/dist/heart/daemon/thoughts.js +255 -43
  144. package/dist/heart/daemon/up-progress.js +366 -0
  145. package/dist/heart/daemon/vault-items.js +56 -0
  146. package/dist/heart/delegation.js +1 -4
  147. package/dist/heart/external-events/router.js +121 -0
  148. package/dist/heart/habits/habit-cancel.js +810 -0
  149. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  150. package/dist/heart/habits/habit-migration.js +194 -0
  151. package/dist/heart/habits/habit-parser.js +278 -0
  152. package/dist/heart/habits/habit-runtime-state.js +93 -0
  153. package/dist/heart/habits/habit-scheduler.js +649 -0
  154. package/dist/heart/habits/habit-session-summary.js +318 -0
  155. package/dist/heart/habits/habit-session.js +636 -0
  156. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  157. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  158. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  159. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  160. package/dist/heart/identity.js +174 -59
  161. package/dist/heart/kept-notes.js +289 -0
  162. package/dist/heart/kicks.js +1 -1
  163. package/dist/heart/machine-identity.js +161 -0
  164. package/dist/heart/mail-import-discovery.js +353 -0
  165. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  166. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  167. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  168. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  169. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  170. package/dist/heart/mailbox/mailbox-http.js +99 -0
  171. package/dist/heart/mailbox/mailbox-read.js +39 -0
  172. package/dist/heart/mailbox/mailbox-types.js +27 -0
  173. package/dist/heart/mailbox/mailbox-view.js +197 -0
  174. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  175. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  176. package/dist/heart/mailbox/readers/mail.js +375 -0
  177. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  178. package/dist/heart/mailbox/readers/sessions.js +232 -0
  179. package/dist/heart/mailbox/readers/shared.js +111 -0
  180. package/dist/heart/mcp/mcp-server.js +696 -0
  181. package/dist/heart/migrate-config.js +100 -0
  182. package/dist/heart/model-capabilities.js +11 -0
  183. package/dist/heart/orientation-frame.js +345 -0
  184. package/dist/heart/platform.js +81 -0
  185. package/dist/heart/primitives.js +1 -1
  186. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  187. package/dist/heart/private-runtime/index.js +18 -0
  188. package/dist/heart/private-runtime/ledger.js +218 -0
  189. package/dist/heart/private-runtime/policy.js +214 -0
  190. package/dist/heart/private-runtime/types.js +2 -0
  191. package/dist/heart/progress-story.js +1 -1
  192. package/dist/heart/provider-attempt.js +137 -0
  193. package/dist/heart/provider-binding-resolver.js +273 -0
  194. package/dist/heart/provider-credentials.js +441 -0
  195. package/dist/heart/provider-failover.js +311 -0
  196. package/dist/heart/provider-models.js +81 -0
  197. package/dist/heart/provider-ping.js +262 -0
  198. package/dist/heart/provider-readiness-cache.js +119 -0
  199. package/dist/heart/provider-visibility.js +188 -0
  200. package/dist/heart/providers/anthropic-token.js +131 -0
  201. package/dist/heart/providers/anthropic.js +173 -60
  202. package/dist/heart/providers/azure.js +23 -11
  203. package/dist/heart/providers/error-classification.js +127 -0
  204. package/dist/heart/providers/github-copilot.js +34 -38
  205. package/dist/heart/providers/minimax-vlm.js +189 -0
  206. package/dist/heart/providers/minimax.js +26 -8
  207. package/dist/heart/providers/openai-codex-token.js +349 -0
  208. package/dist/heart/providers/openai-codex.js +55 -40
  209. package/dist/heart/run-ledger.js +247 -0
  210. package/dist/heart/runtime-capability-check.js +170 -0
  211. package/dist/heart/runtime-credentials.js +398 -0
  212. package/dist/heart/runtime-cwd.js +87 -0
  213. package/dist/heart/sense-truth.js +20 -4
  214. package/dist/heart/session-activity.js +90 -24
  215. package/dist/heart/session-events.js +1300 -0
  216. package/dist/heart/session-playback-cli-main.js +5 -0
  217. package/dist/heart/session-playback-cli.js +36 -0
  218. package/dist/heart/session-playback.js +231 -0
  219. package/dist/heart/session-stats-cli-main.js +5 -0
  220. package/dist/heart/session-stats.js +182 -0
  221. package/dist/heart/session-transcript.js +133 -0
  222. package/dist/heart/start-of-turn-packet.js +368 -0
  223. package/dist/heart/streaming.js +604 -207
  224. package/dist/heart/structured-output.js +196 -0
  225. package/dist/heart/sync-classification.js +176 -0
  226. package/dist/heart/sync.js +449 -0
  227. package/dist/heart/target-resolution.js +11 -7
  228. package/dist/heart/tempo.js +93 -0
  229. package/dist/heart/temporal-view.js +41 -0
  230. package/dist/heart/timeouts.js +101 -0
  231. package/dist/heart/tool-activity-callbacks.js +59 -0
  232. package/dist/heart/tool-approval.js +339 -0
  233. package/dist/heart/tool-description.js +155 -0
  234. package/dist/heart/tool-friction.js +55 -0
  235. package/dist/heart/tool-loop.js +200 -0
  236. package/dist/heart/turn-context.js +472 -0
  237. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  238. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  239. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  240. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  241. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  242. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  243. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  244. package/dist/heart/versioning/update-hooks.js +154 -0
  245. package/dist/heart/versioning/version-intent.js +114 -0
  246. package/dist/heart/work-card.js +380 -0
  247. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  248. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  249. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  250. package/dist/mailbox-ui/index.html +16 -0
  251. package/dist/mailroom/attention.js +167 -0
  252. package/dist/mailroom/autonomy.js +209 -0
  253. package/dist/mailroom/blob-store.js +811 -0
  254. package/dist/mailroom/body-cache.js +61 -0
  255. package/dist/mailroom/cache-sync-cli.js +54 -0
  256. package/dist/mailroom/core.js +788 -0
  257. package/dist/mailroom/entry.js +160 -0
  258. package/dist/mailroom/file-store.js +568 -0
  259. package/dist/mailroom/hosted-cache-sync.js +249 -0
  260. package/dist/mailroom/mbox-import.js +393 -0
  261. package/dist/mailroom/migration.js +164 -0
  262. package/dist/mailroom/outbound.js +380 -0
  263. package/dist/mailroom/policy.js +263 -0
  264. package/dist/mailroom/reader.js +292 -0
  265. package/dist/mailroom/search-cache.js +404 -0
  266. package/dist/mailroom/search-relevance.js +319 -0
  267. package/dist/mailroom/smtp-ingress.js +176 -0
  268. package/dist/mailroom/source-state.js +176 -0
  269. package/dist/mailroom/thread.js +109 -0
  270. package/dist/mailroom/travel-extract.js +89 -0
  271. package/dist/mind/bundle-manifest.js +24 -2
  272. package/dist/mind/context.js +273 -111
  273. package/dist/mind/desk-section.js +362 -0
  274. package/dist/mind/diary-integrity.js +60 -0
  275. package/dist/mind/{memory.js → diary.js} +68 -77
  276. package/dist/mind/embedding-provider.js +60 -0
  277. package/dist/mind/file-state.js +179 -0
  278. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  279. package/dist/mind/obligation-steering.js +227 -0
  280. package/dist/mind/pending.js +13 -8
  281. package/dist/mind/prompt-budget.js +479 -0
  282. package/dist/mind/prompt-refresh.js +3 -2
  283. package/dist/mind/prompt.js +1058 -172
  284. package/dist/mind/provenance-trust.js +26 -0
  285. package/dist/mind/record-paths.js +312 -0
  286. package/dist/mind/scrutiny.js +173 -0
  287. package/dist/mind/session-transaction.js +379 -0
  288. package/dist/nerves/cli-logging.js +7 -1
  289. package/dist/nerves/coverage/audit-rules.js +15 -6
  290. package/dist/nerves/coverage/audit.js +28 -2
  291. package/dist/nerves/coverage/cli.js +1 -1
  292. package/dist/nerves/coverage/contract.js +5 -5
  293. package/dist/nerves/coverage/file-completeness.js +139 -5
  294. package/dist/nerves/coverage/run-artifacts.js +55 -35
  295. package/dist/nerves/event-buffer.js +111 -0
  296. package/dist/nerves/index.js +234 -4
  297. package/dist/nerves/observation.js +20 -0
  298. package/dist/nerves/redact.js +79 -0
  299. package/dist/nerves/review/cli-main.js +5 -0
  300. package/dist/nerves/review/cli.js +156 -0
  301. package/dist/nerves/review/core.js +159 -0
  302. package/dist/nerves/runtime.js +5 -1
  303. package/dist/repertoire/ado-client.js +15 -56
  304. package/dist/repertoire/ado-semantic.js +16 -10
  305. package/dist/repertoire/api-client.js +97 -0
  306. package/dist/repertoire/bitwarden-store.js +1045 -0
  307. package/dist/repertoire/bundle-templates.js +71 -0
  308. package/dist/repertoire/bw-installer.js +180 -0
  309. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  310. package/dist/repertoire/coding/context-pack.js +331 -0
  311. package/dist/repertoire/coding/feedback.js +218 -30
  312. package/dist/repertoire/coding/index.js +15 -3
  313. package/dist/repertoire/coding/manager.js +166 -10
  314. package/dist/repertoire/coding/spawner.js +58 -11
  315. package/dist/repertoire/coding/tools.js +242 -14
  316. package/dist/repertoire/coding/workbench-client.js +272 -0
  317. package/dist/repertoire/coding/workbench-manager.js +346 -0
  318. package/dist/repertoire/commerce-errors.js +109 -0
  319. package/dist/repertoire/commerce-self-test.js +156 -0
  320. package/dist/repertoire/credential-access.js +178 -0
  321. package/dist/repertoire/desk/classifier.js +362 -0
  322. package/dist/repertoire/duffel-client.js +185 -0
  323. package/dist/repertoire/github-client.js +14 -55
  324. package/dist/repertoire/graph-client.js +11 -52
  325. package/dist/repertoire/guardrails.js +812 -18
  326. package/dist/repertoire/mcp-client.js +44 -3
  327. package/dist/repertoire/mcp-manager.js +259 -20
  328. package/dist/repertoire/mcp-tools.js +83 -0
  329. package/dist/repertoire/plugin-mcp.js +175 -0
  330. package/dist/repertoire/plugins.js +253 -0
  331. package/dist/repertoire/shell-sessions.js +133 -0
  332. package/dist/repertoire/skills.js +48 -4
  333. package/dist/repertoire/stripe-client.js +131 -0
  334. package/dist/repertoire/tool-arguments.js +104 -0
  335. package/dist/repertoire/tool-results.js +29 -0
  336. package/dist/repertoire/tools-a2a.js +699 -0
  337. package/dist/repertoire/tools-attachments.js +317 -0
  338. package/dist/repertoire/tools-awaiting.js +372 -0
  339. package/dist/repertoire/tools-base.js +67 -1095
  340. package/dist/repertoire/tools-bluebubbles.js +2 -0
  341. package/dist/repertoire/tools-bridge.js +144 -0
  342. package/dist/repertoire/tools-bundle.js +993 -0
  343. package/dist/repertoire/tools-commerce.js +253 -0
  344. package/dist/repertoire/tools-config.js +186 -0
  345. package/dist/repertoire/tools-continuity.js +252 -0
  346. package/dist/repertoire/tools-credential.js +383 -0
  347. package/dist/repertoire/tools-evolution.js +527 -0
  348. package/dist/repertoire/tools-files.js +344 -0
  349. package/dist/repertoire/tools-flight.js +290 -0
  350. package/dist/repertoire/tools-flow.js +119 -0
  351. package/dist/repertoire/tools-github.js +3 -8
  352. package/dist/repertoire/tools-habits.js +103 -0
  353. package/dist/repertoire/tools-mail.js +1828 -0
  354. package/dist/repertoire/tools-notes.js +459 -0
  355. package/dist/repertoire/tools-obligations.js +182 -0
  356. package/dist/repertoire/tools-orientation.js +31 -0
  357. package/dist/repertoire/tools-record.js +482 -0
  358. package/dist/repertoire/tools-rsvp.js +139 -0
  359. package/dist/repertoire/tools-runtime.js +150 -0
  360. package/dist/repertoire/tools-session.js +881 -0
  361. package/dist/repertoire/tools-shell.js +133 -0
  362. package/dist/repertoire/tools-stripe.js +224 -0
  363. package/dist/repertoire/tools-surface.js +355 -0
  364. package/dist/repertoire/tools-teams.js +12 -39
  365. package/dist/repertoire/tools-travel.js +125 -0
  366. package/dist/repertoire/tools-trip.js +982 -0
  367. package/dist/repertoire/tools-user-profile.js +146 -0
  368. package/dist/repertoire/tools-vault.js +40 -0
  369. package/dist/repertoire/tools-voice.js +145 -0
  370. package/dist/repertoire/tools.js +258 -79
  371. package/dist/repertoire/travel-api-client.js +360 -0
  372. package/dist/repertoire/user-profile.js +131 -0
  373. package/dist/repertoire/vault-setup.js +246 -0
  374. package/dist/repertoire/vault-unlock.js +594 -0
  375. package/dist/rsvp/aisleplanner-client.js +354 -0
  376. package/dist/rsvp/cli.js +926 -0
  377. package/dist/rsvp/config.js +327 -0
  378. package/dist/rsvp/cutover.js +433 -0
  379. package/dist/rsvp/diagnostics.js +232 -0
  380. package/dist/rsvp/diff-renderer.js +176 -0
  381. package/dist/rsvp/habit-policy.js +110 -0
  382. package/dist/rsvp/habit-stage.js +123 -0
  383. package/dist/rsvp/incident-bundle.js +97 -0
  384. package/dist/rsvp/migration.js +204 -0
  385. package/dist/rsvp/native-habit-runner.js +630 -0
  386. package/dist/rsvp/outbound-state.js +628 -0
  387. package/dist/rsvp/query.js +118 -0
  388. package/dist/rsvp/replay.js +233 -0
  389. package/dist/rsvp/snapshot.js +232 -0
  390. package/dist/rsvp/spend-ledger.js +175 -0
  391. package/dist/scripts/claude-code-hook.js +41 -0
  392. package/dist/scripts/claude-code-stop-hook.js +47 -0
  393. package/dist/senses/a2a-entry.js +115 -0
  394. package/dist/senses/attention-queue.js +186 -0
  395. package/dist/senses/await-turn-message.js +58 -0
  396. package/dist/senses/bluebubbles/active-turns.js +216 -0
  397. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  398. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  399. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  400. package/dist/senses/bluebubbles/context-packet.js +207 -0
  401. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  402. package/dist/senses/bluebubbles/entry.js +90 -0
  403. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  404. package/dist/senses/bluebubbles/index.js +3839 -0
  405. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  406. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  407. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  408. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  409. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  410. package/dist/senses/bluebubbles/processed-log.js +133 -0
  411. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  412. package/dist/senses/bluebubbles/replay.js +284 -0
  413. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  414. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  415. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  416. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  417. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  418. package/dist/senses/cli/bracketed-paste.js +82 -0
  419. package/dist/senses/cli/image-paste.js +287 -0
  420. package/dist/senses/cli/image-ref-navigation.js +75 -0
  421. package/dist/senses/cli/ink-app.js +156 -0
  422. package/dist/senses/cli/inline-diff.js +64 -0
  423. package/dist/senses/cli/input-keys.js +174 -0
  424. package/dist/senses/cli/kill-ring.js +86 -0
  425. package/dist/senses/cli/message-list.js +51 -0
  426. package/dist/senses/cli/ouro-tui.js +607 -0
  427. package/dist/senses/cli/spinner-imperative.js +135 -0
  428. package/dist/senses/cli/spinner.js +101 -0
  429. package/dist/senses/cli/status-line.js +60 -0
  430. package/dist/senses/cli/streaming-markdown.js +526 -0
  431. package/dist/senses/cli/tool-display.js +85 -0
  432. package/dist/senses/cli/tool-render.js +85 -0
  433. package/dist/senses/cli/tui-store.js +241 -0
  434. package/dist/senses/cli/virtual-list.js +35 -0
  435. package/dist/senses/cli-entry.js +60 -8
  436. package/dist/senses/cli-layout.js +100 -0
  437. package/dist/senses/cli.js +640 -312
  438. package/dist/senses/commands.js +66 -3
  439. package/dist/senses/context-packet-ledger.js +371 -0
  440. package/dist/senses/context-packets.js +154 -0
  441. package/dist/senses/habit-lifecycle-guard.js +24 -0
  442. package/dist/senses/habit-turn-message.js +160 -0
  443. package/dist/senses/ingress-evidence.js +2 -0
  444. package/dist/senses/mail-entry.js +66 -0
  445. package/dist/senses/mail.js +524 -0
  446. package/dist/senses/pipeline.js +1075 -176
  447. package/dist/senses/private-runtime-worker.js +740 -0
  448. package/dist/senses/private-runtime.js +1212 -0
  449. package/dist/senses/proactive-content-guard.js +51 -0
  450. package/dist/senses/shared-turn.js +424 -0
  451. package/dist/senses/surface-tool.js +109 -0
  452. package/dist/senses/teams-entry.js +60 -8
  453. package/dist/senses/teams.js +515 -217
  454. package/dist/senses/trust-gate.js +104 -9
  455. package/dist/senses/voice/audio-playback.js +237 -0
  456. package/dist/senses/voice/audio-routing.js +119 -0
  457. package/dist/senses/voice/elevenlabs.js +202 -0
  458. package/dist/senses/voice/floor-control.js +431 -0
  459. package/dist/senses/voice/floor-controller.js +115 -0
  460. package/dist/senses/voice/golden-path.js +116 -0
  461. package/dist/senses/voice/index.js +29 -0
  462. package/dist/senses/voice/meeting.js +113 -0
  463. package/dist/senses/voice/outbound.js +190 -0
  464. package/dist/senses/voice/phone.js +33 -0
  465. package/dist/senses/voice/playback.js +139 -0
  466. package/dist/senses/voice/realtime-eval.js +496 -0
  467. package/dist/senses/voice/realtime-trace.js +531 -0
  468. package/dist/senses/voice/transcript.js +70 -0
  469. package/dist/senses/voice/turn.js +191 -0
  470. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  471. package/dist/senses/voice/twilio-phone.js +5081 -0
  472. package/dist/senses/voice/types.js +2 -0
  473. package/dist/senses/voice/whisper.js +161 -0
  474. package/dist/senses/voice-entry.js +81 -0
  475. package/dist/senses/voice-realtime-eval-command.js +99 -0
  476. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  477. package/dist/senses/voice-twilio-entry.js +87 -0
  478. package/dist/trips/core.js +138 -0
  479. package/dist/trips/store.js +265 -0
  480. package/dist/util/frontmatter.js +69 -0
  481. package/package.json +65 -12
  482. package/skills/agent-commerce.md +113 -0
  483. package/skills/browser-navigation.md +117 -0
  484. package/skills/commerce-setup-guide.md +116 -0
  485. package/skills/commerce-setup.md +84 -0
  486. package/skills/configure-dev-tools.md +99 -0
  487. package/skills/travel-planning.md +138 -0
  488. package/dist/heart/daemon/auth-flow.js +0 -430
  489. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  490. package/dist/heart/daemon/update-hooks.js +0 -138
  491. package/dist/heart/safe-workspace.js +0 -228
  492. package/dist/heart/session-recall.js +0 -116
  493. package/dist/mind/friends/channel.js +0 -84
  494. package/dist/mind/friends/group-context.js +0 -144
  495. package/dist/mind/friends/resolver.js +0 -84
  496. package/dist/mind/friends/store-file.js +0 -190
  497. package/dist/mind/friends/store.js +0 -4
  498. package/dist/mind/friends/tokens.js +0 -26
  499. package/dist/mind/friends/trust-explanation.js +0 -74
  500. package/dist/mind/friends/types.js +0 -29
  501. package/dist/repertoire/tasks/board.js +0 -134
  502. package/dist/repertoire/tasks/index.js +0 -224
  503. package/dist/repertoire/tasks/lifecycle.js +0 -80
  504. package/dist/repertoire/tasks/middleware.js +0 -65
  505. package/dist/repertoire/tasks/parser.js +0 -173
  506. package/dist/repertoire/tasks/scanner.js +0 -132
  507. package/dist/repertoire/tasks/transitions.js +0 -144
  508. package/dist/senses/bluebubbles-entry.js +0 -13
  509. package/dist/senses/bluebubbles.js +0 -1180
  510. package/dist/senses/debug-activity.js +0 -148
  511. package/dist/senses/inner-dialog-worker.js +0 -90
  512. package/dist/senses/inner-dialog.js +0 -480
  513. package/subagents/README.md +0 -7
  514. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  515. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  516. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  517. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  518. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  519. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  520. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  521. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  522. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  523. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  524. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  525. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  526. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  527. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  528. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  529. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  530. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ /**
3
+ * Commerce-specific error types and helpers.
4
+ *
5
+ * These errors carry structured `code` and `meta` fields for nerves event
6
+ * compatibility and provide patterns for common commerce failure modes:
7
+ * retry, price change detection, and partial failure reporting.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.ProfileError = exports.BookingError = exports.PaymentError = exports.CommerceError = void 0;
11
+ exports.retryOnce = retryOnce;
12
+ exports.priceChangeGuard = priceChangeGuard;
13
+ exports.partialFailureReport = partialFailureReport;
14
+ // ---------------------------------------------------------------------------
15
+ // Error types
16
+ // ---------------------------------------------------------------------------
17
+ class CommerceError extends Error {
18
+ code;
19
+ meta;
20
+ constructor(message, code, meta = {}) {
21
+ super(message);
22
+ this.name = "CommerceError";
23
+ this.code = code;
24
+ this.meta = meta;
25
+ }
26
+ }
27
+ exports.CommerceError = CommerceError;
28
+ class PaymentError extends CommerceError {
29
+ constructor(message, code, meta = {}) {
30
+ super(message, code, meta);
31
+ this.name = "PaymentError";
32
+ }
33
+ }
34
+ exports.PaymentError = PaymentError;
35
+ class BookingError extends CommerceError {
36
+ constructor(message, code, meta = {}) {
37
+ super(message, code, meta);
38
+ this.name = "BookingError";
39
+ }
40
+ }
41
+ exports.BookingError = BookingError;
42
+ class ProfileError extends CommerceError {
43
+ constructor(message, code, meta = {}) {
44
+ super(message, code, meta);
45
+ this.name = "ProfileError";
46
+ }
47
+ }
48
+ exports.ProfileError = ProfileError;
49
+ // ---------------------------------------------------------------------------
50
+ // Transient error detection
51
+ // ---------------------------------------------------------------------------
52
+ const TRANSIENT_CODES = new Set(["COMMERCE_TRANSIENT", "COMMERCE_TIMEOUT", "COMMERCE_NETWORK"]);
53
+ function isTransient(err) {
54
+ return err instanceof CommerceError && TRANSIENT_CODES.has(err.code);
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // Helpers
58
+ // ---------------------------------------------------------------------------
59
+ /**
60
+ * Retry a function once on transient failure, then throw.
61
+ * Non-transient errors are thrown immediately without retry.
62
+ */
63
+ async function retryOnce(fn) {
64
+ try {
65
+ return await fn();
66
+ }
67
+ catch (err) {
68
+ if (!isTransient(err))
69
+ throw err;
70
+ // One retry
71
+ return fn();
72
+ }
73
+ }
74
+ /**
75
+ * Throw PaymentError if the actual price differs from the approved price
76
+ * by more than 5%. Used to protect against price changes between search
77
+ * and booking.
78
+ */
79
+ function priceChangeGuard(approved, actual) {
80
+ if (approved === 0 && actual === 0)
81
+ return;
82
+ if (approved === 0) {
83
+ throw new PaymentError(`price changed from $0 to $${actual} — cannot verify percentage change`, "PAYMENT_PRICE_CHANGED", { approved, actual });
84
+ }
85
+ const delta = Math.abs(actual - approved) / approved;
86
+ if (delta > 0.05) {
87
+ throw new PaymentError(`price changed by ${(delta * 100).toFixed(1)}% (approved: $${approved}, actual: $${actual})`, "PAYMENT_PRICE_CHANGED", { approved, actual, deltaPercent: delta * 100 });
88
+ }
89
+ }
90
+ /**
91
+ * Format a human-readable status report for multi-service booking attempts.
92
+ * Each entry has a service name, status, and optional error message.
93
+ */
94
+ function partialFailureReport(results) {
95
+ if (results.length === 0) {
96
+ return "no services attempted.";
97
+ }
98
+ const lines = results.map((r) => {
99
+ const status = r.status === "success" ? "success" : "failed";
100
+ const detail = r.error ? ` — ${r.error}` : "";
101
+ return ` ${r.service}: ${status}${detail}`;
102
+ });
103
+ const succeeded = results.filter((r) => r.status === "success").length;
104
+ const failed = results.length - succeeded;
105
+ return [
106
+ `booking status: ${succeeded} succeeded, ${failed} failed`,
107
+ ...lines,
108
+ ].join("\n");
109
+ }
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ /**
3
+ * Commerce self-test — per-service health checks for the agent's
4
+ * commerce infrastructure (Stripe, Duffel, LiteAPI).
5
+ *
6
+ * Used by the setup wizard to verify configuration and provide
7
+ * actionable error messages when services are misconfigured.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.commerceSelfTest = commerceSelfTest;
11
+ const stripe_client_1 = require("./stripe-client");
12
+ const duffel_client_1 = require("./duffel-client");
13
+ const credential_access_1 = require("./credential-access");
14
+ const runtime_1 = require("../nerves/runtime");
15
+ // ---------------------------------------------------------------------------
16
+ // Per-service tests
17
+ // ---------------------------------------------------------------------------
18
+ async function testStripe() {
19
+ try {
20
+ const client = await (0, stripe_client_1.createStripeClient)();
21
+ // Create a test card and immediately deactivate it
22
+ const card = await client.createVirtualCard({
23
+ type: "single_use",
24
+ spendLimit: 1,
25
+ currency: "usd",
26
+ });
27
+ await client.deactivateCard(card.cardId);
28
+ return { status: "ok", message: "Stripe Issuing working. Test card created and deactivated." };
29
+ }
30
+ catch (err) {
31
+ /* v8 ignore next -- reason @preserve */
32
+ const reason = err instanceof Error ? err.message : String(err);
33
+ if (reason.includes("no credential found") || reason.includes("restrictedKey")) {
34
+ return {
35
+ status: "error",
36
+ message: `Stripe key missing. Add your restricted key at https://dashboard.stripe.com/apikeys and store it in the vault as stripe.com/restrictedKey.`,
37
+ };
38
+ }
39
+ if (reason.includes("401") || reason.includes("Invalid API Key")) {
40
+ return {
41
+ status: "error",
42
+ message: `Stripe key returned 401. Verify it at https://dashboard.stripe.com/apikeys.`,
43
+ };
44
+ }
45
+ return {
46
+ status: "error",
47
+ message: `Stripe error: ${reason}`,
48
+ };
49
+ }
50
+ }
51
+ async function testDuffel() {
52
+ try {
53
+ const client = await (0, duffel_client_1.createDuffelClient)();
54
+ await client.searchFlights({
55
+ origin: "SFO",
56
+ destination: "JFK",
57
+ departureDate: new Date(Date.now() + 30 * 86400000).toISOString().split("T")[0],
58
+ passengers: [{ type: "adult" }],
59
+ });
60
+ return { status: "ok", message: "Duffel Flights working. Test search completed." };
61
+ }
62
+ catch (err) {
63
+ /* v8 ignore next -- reason @preserve */
64
+ const reason = err instanceof Error ? err.message : String(err);
65
+ if (reason.includes("no credential found") || reason.includes("apiKey")) {
66
+ return {
67
+ status: "error",
68
+ message: `Duffel key missing. Add your API key from https://app.duffel.com/tokens and store it in the vault as duffel.com/apiKey.`,
69
+ };
70
+ }
71
+ if (reason.includes("401") || reason.includes("Unauthorized")) {
72
+ return {
73
+ status: "error",
74
+ message: `Your Duffel key returned 401. Verify it at https://app.duffel.com/tokens.`,
75
+ };
76
+ }
77
+ return {
78
+ status: "error",
79
+ message: `Duffel error: ${reason}`,
80
+ };
81
+ }
82
+ }
83
+ async function testLiteApi() {
84
+ try {
85
+ const store = (0, credential_access_1.getCredentialStore)();
86
+ await store.getRawSecret("liteapi.travel", "apiKey");
87
+ // If we can retrieve the key, the config is present.
88
+ // LiteAPI is accessed via MCP, so we can't do a direct API call here.
89
+ // The actual health check happens when the MCP server starts.
90
+ return { status: "ok", message: "LiteAPI key found in vault. MCP server will use vault:liteapi.travel/apiKey." };
91
+ }
92
+ catch (err) {
93
+ /* v8 ignore next -- reason @preserve */
94
+ const reason = err instanceof Error ? err.message : String(err);
95
+ if (reason.includes("no credential found")) {
96
+ return {
97
+ status: "error",
98
+ message: `LiteAPI key missing. Get your API key from https://dashboard.liteapi.travel and store it in the vault as liteapi.travel/apiKey.`,
99
+ };
100
+ }
101
+ return {
102
+ status: "error",
103
+ message: `LiteAPI error: ${reason}`,
104
+ };
105
+ }
106
+ }
107
+ // ---------------------------------------------------------------------------
108
+ // Main self-test
109
+ // ---------------------------------------------------------------------------
110
+ async function commerceSelfTest() {
111
+ (0, runtime_1.emitNervesEvent)({
112
+ component: "repertoire",
113
+ event: "repertoire.commerce_self_test_start",
114
+ message: "starting commerce self-test",
115
+ meta: {},
116
+ });
117
+ const [stripe, duffel, liteapi] = await Promise.all([
118
+ testStripe(),
119
+ testDuffel(),
120
+ testLiteApi(),
121
+ ]);
122
+ const services = { stripe, duffel, liteapi };
123
+ const okCount = Object.values(services).filter((s) => s.status === "ok").length;
124
+ const total = Object.keys(services).length;
125
+ let overall;
126
+ if (okCount === total) {
127
+ overall = "healthy";
128
+ }
129
+ else if (okCount > 0) {
130
+ overall = "partial";
131
+ }
132
+ else {
133
+ overall = "unhealthy";
134
+ }
135
+ const lines = [];
136
+ if (stripe.status === "ok")
137
+ lines.push("Stripe: working");
138
+ else
139
+ lines.push(`Stripe: ${stripe.message}`);
140
+ if (duffel.status === "ok")
141
+ lines.push("Duffel: working");
142
+ else
143
+ lines.push(`Duffel: ${duffel.message}`);
144
+ if (liteapi.status === "ok")
145
+ lines.push("LiteAPI: working");
146
+ else
147
+ lines.push(`LiteAPI: ${liteapi.message}`);
148
+ const summary = `Commerce health: ${okCount}/${total} services ok.\n${lines.join("\n")}`;
149
+ (0, runtime_1.emitNervesEvent)({
150
+ component: "repertoire",
151
+ event: "repertoire.commerce_self_test_end",
152
+ message: "commerce self-test complete",
153
+ meta: { overall, okCount, total },
154
+ });
155
+ return { overall, services, summary };
156
+ }
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ /**
3
+ * Credential access layer.
4
+ *
5
+ * Bitwarden/Vaultwarden is the sole runtime credential store. The only local
6
+ * secret is the vault unlock material held by an explicit local unlock store.
7
+ *
8
+ * Each agent owns one credential vault. getCredentialStore() returns that
9
+ * agent's vault directly; item names are not shared or namespaced across
10
+ * agents.
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.getCredentialStore = getCredentialStore;
47
+ exports.probeCredentialVaultAccess = probeCredentialVaultAccess;
48
+ exports.resetCredentialStore = resetCredentialStore;
49
+ const crypto = __importStar(require("node:crypto"));
50
+ const fs = __importStar(require("node:fs"));
51
+ const os = __importStar(require("node:os"));
52
+ const path = __importStar(require("node:path"));
53
+ const runtime_1 = require("../nerves/runtime");
54
+ const identity = __importStar(require("../heart/identity"));
55
+ const bitwarden_store_1 = require("./bitwarden-store");
56
+ const vault_unlock_1 = require("./vault-unlock");
57
+ let stores = new Map();
58
+ function loadVaultSectionForAgent(agentName) {
59
+ const configPath = path.join(identity.getAgentRoot(agentName), "agent.json");
60
+ try {
61
+ const parsed = JSON.parse(fs.readFileSync(configPath, "utf-8"));
62
+ return { configPath, vault: parsed.vault };
63
+ }
64
+ catch {
65
+ return { configPath };
66
+ }
67
+ }
68
+ function bitwardenAppDataDir(agentName, vaultConfig, homeDir = os.homedir()) {
69
+ const digest = crypto
70
+ .createHash("sha256")
71
+ .update(`${agentName}:${vaultConfig.serverUrl}:${vaultConfig.email}`)
72
+ .digest("hex")
73
+ .slice(0, 24);
74
+ return path.join(homeDir, ".ouro-cli", "bitwarden", digest);
75
+ }
76
+ function getCredentialStore(agentNameInput) {
77
+ const agentName = agentNameInput ?? identity.getAgentName();
78
+ if (agentName === "SerpentGuide") {
79
+ throw new Error("SerpentGuide does not have a persistent credential vault; hatch bootstrap uses provider credentials in memory only.");
80
+ }
81
+ const { configPath, vault } = loadVaultSectionForAgent(agentName);
82
+ if (!vault || typeof vault.email !== "string" || vault.email.trim().length === 0) {
83
+ throw new Error((0, vault_unlock_1.credentialVaultNotConfiguredError)(agentName, configPath));
84
+ }
85
+ const vaultConfig = identity.resolveVaultConfig(agentName, vault);
86
+ const cacheKey = `${agentName}:${vaultConfig.serverUrl}:${vaultConfig.email}`;
87
+ const cached = stores.get(cacheKey);
88
+ if (cached)
89
+ return cached;
90
+ const unlock = (0, vault_unlock_1.readVaultUnlockSecret)({
91
+ agentName,
92
+ email: vaultConfig.email,
93
+ serverUrl: vaultConfig.serverUrl,
94
+ });
95
+ const unlockConfig = { agentName, email: vaultConfig.email, serverUrl: vaultConfig.serverUrl };
96
+ const unlockSource = unlock.source ?? unlockConfig;
97
+ let invalidUnlockCleared = false;
98
+ let canonicalUnlockStored = false;
99
+ const store = new bitwarden_store_1.BitwardenCredentialStore(vaultConfig.serverUrl, vaultConfig.email, unlock.secret, {
100
+ appDataDir: bitwardenAppDataDir(agentName, vaultConfig),
101
+ onInvalidUnlockSecret: (error) => {
102
+ if (invalidUnlockCleared)
103
+ return;
104
+ invalidUnlockCleared = true;
105
+ (0, vault_unlock_1.clearVaultUnlockSecret)({
106
+ agentName,
107
+ email: unlockSource.email,
108
+ serverUrl: unlockSource.serverUrl,
109
+ });
110
+ stores.delete(cacheKey);
111
+ (0, runtime_1.emitNervesEvent)({
112
+ level: "warn",
113
+ event: "repertoire.credential_store_invalid_unlock_cleared",
114
+ component: "repertoire",
115
+ message: "cleared rejected local vault unlock material",
116
+ meta: {
117
+ agentName,
118
+ serverUrl: vaultConfig.serverUrl,
119
+ email: vaultConfig.email,
120
+ sourceServerUrl: unlockSource.serverUrl,
121
+ error: error.message,
122
+ },
123
+ });
124
+ },
125
+ onLoginSuccess: () => {
126
+ if (canonicalUnlockStored)
127
+ return;
128
+ if (unlockSource.serverUrl === vaultConfig.serverUrl && unlockSource.email === vaultConfig.email)
129
+ return;
130
+ canonicalUnlockStored = true;
131
+ try {
132
+ (0, vault_unlock_1.storeVaultUnlockSecret)(unlockConfig, unlock.secret);
133
+ (0, vault_unlock_1.noteVaultUnlockSelfHeal)(unlockConfig, unlock.store.kind, unlockSource.serverUrl);
134
+ }
135
+ catch (error) {
136
+ (0, runtime_1.emitNervesEvent)({
137
+ level: "warn",
138
+ event: "repertoire.vault_unlock_self_heal_failed",
139
+ component: "repertoire",
140
+ message: "failed to rewrite local unlock material using canonical vault coordinates",
141
+ meta: {
142
+ store: unlock.store.kind,
143
+ email: vaultConfig.email,
144
+ sourceServerUrl: unlockSource.serverUrl,
145
+ targetServerUrl: vaultConfig.serverUrl,
146
+ error: error instanceof Error ? error.message : String(error),
147
+ },
148
+ });
149
+ }
150
+ },
151
+ });
152
+ stores.set(cacheKey, store);
153
+ (0, runtime_1.emitNervesEvent)({
154
+ event: "repertoire.credential_store_init",
155
+ component: "repertoire",
156
+ message: "credential store initialized",
157
+ meta: {
158
+ backend: "bitwarden",
159
+ agentName,
160
+ serverUrl: vaultConfig.serverUrl,
161
+ email: vaultConfig.email,
162
+ },
163
+ });
164
+ return store;
165
+ }
166
+ async function probeCredentialVaultAccess(agentNameInput, unlockSecret, options = {}) {
167
+ const agentName = agentNameInput;
168
+ const { configPath, vault } = loadVaultSectionForAgent(agentName);
169
+ if (!vault || typeof vault.email !== "string" || vault.email.trim().length === 0) {
170
+ throw new Error((0, vault_unlock_1.credentialVaultNotConfiguredError)(agentName, configPath));
171
+ }
172
+ const vaultConfig = identity.resolveVaultConfig(agentName, vault);
173
+ const store = new bitwarden_store_1.BitwardenCredentialStore(vaultConfig.serverUrl, vaultConfig.email, unlockSecret, { appDataDir: bitwardenAppDataDir(agentName, vaultConfig, options.homeDir) });
174
+ await store.get("__ouro_vault_probe__");
175
+ }
176
+ function resetCredentialStore() {
177
+ stores = new Map();
178
+ }