@ouro.bot/cli 0.1.0-alpha.7 → 0.1.0-alpha.700

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 (514) hide show
  1. package/README.md +235 -183
  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/SerpentGuide.ouro/agent.json +83 -0
  10. package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/ouroboros.png +0 -0
  14. package/changelog.json +4827 -0
  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 +928 -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 +1002 -0
  44. package/dist/heart/agent-entry.js +190 -3
  45. package/dist/heart/attachments/image-normalize.js +194 -0
  46. package/dist/heart/attachments/materialize.js +97 -0
  47. package/dist/heart/attachments/originals.js +88 -0
  48. package/dist/heart/attachments/render.js +29 -0
  49. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  50. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  51. package/dist/heart/attachments/sources/index.js +16 -0
  52. package/dist/heart/attachments/store.js +103 -0
  53. package/dist/heart/attachments/types.js +93 -0
  54. package/dist/heart/auth/auth-flow.js +479 -0
  55. package/dist/heart/autonomy-budget.js +434 -0
  56. package/dist/heart/awaiting/await-alert.js +146 -0
  57. package/dist/heart/awaiting/await-expiry.js +108 -0
  58. package/dist/heart/awaiting/await-loader.js +91 -0
  59. package/dist/heart/awaiting/await-parser.js +141 -0
  60. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  61. package/dist/heart/awaiting/await-scheduler.js +378 -0
  62. package/dist/heart/background-operations.js +281 -0
  63. package/dist/heart/bridges/manager.js +478 -0
  64. package/dist/heart/bridges/state-machine.js +135 -0
  65. package/dist/heart/bridges/store.js +135 -0
  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 +172 -135
  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 +1480 -262
  73. package/dist/heart/cross-chat-delivery.js +132 -0
  74. package/dist/heart/daemon/agent-config-check.js +451 -0
  75. package/dist/heart/daemon/agent-discovery.js +263 -0
  76. package/dist/heart/daemon/agent-service.js +523 -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-health-diagnostics.js +122 -0
  80. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  81. package/dist/heart/daemon/cadence.js +180 -0
  82. package/dist/heart/daemon/cli-defaults.js +780 -0
  83. package/dist/heart/daemon/cli-desk.js +322 -0
  84. package/dist/heart/daemon/cli-exec.js +8142 -0
  85. package/dist/heart/daemon/cli-help.js +675 -0
  86. package/dist/heart/daemon/cli-parse.js +2461 -0
  87. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  88. package/dist/heart/daemon/cli-render.js +770 -0
  89. package/dist/heart/daemon/cli-types.js +8 -0
  90. package/dist/heart/daemon/connect-bay.js +323 -0
  91. package/dist/heart/daemon/daemon-cli.js +30 -784
  92. package/dist/heart/daemon/daemon-entry.js +874 -13
  93. package/dist/heart/daemon/daemon-health.js +176 -0
  94. package/dist/heart/daemon/daemon-rollup.js +57 -0
  95. package/dist/heart/daemon/daemon-runtime-sync.js +287 -0
  96. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  97. package/dist/heart/daemon/daemon.js +1412 -26
  98. package/dist/heart/daemon/dns-workflow.js +394 -0
  99. package/dist/heart/daemon/doctor-types.js +8 -0
  100. package/dist/heart/daemon/doctor.js +1126 -0
  101. package/dist/heart/daemon/habit-private-wake.js +56 -0
  102. package/dist/heart/daemon/health-monitor.js +142 -11
  103. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  104. package/dist/heart/daemon/hooks/bundle-meta.js +226 -0
  105. package/dist/heart/daemon/http-health-probe.js +80 -0
  106. package/dist/heart/daemon/human-command-screens.js +234 -0
  107. package/dist/heart/daemon/human-readiness.js +114 -0
  108. package/dist/heart/daemon/inner-status.js +78 -0
  109. package/dist/heart/daemon/interactive-repair.js +394 -0
  110. package/dist/heart/daemon/launchd.js +188 -0
  111. package/dist/heart/daemon/log-tailer.js +82 -12
  112. package/dist/heart/daemon/logs-prune.js +110 -0
  113. package/dist/heart/daemon/mcp-canary.js +297 -0
  114. package/dist/heart/daemon/message-router.js +60 -11
  115. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  116. package/dist/heart/daemon/os-cron-deps.js +135 -0
  117. package/dist/heart/daemon/os-cron.js +22 -14
  118. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  119. package/dist/heart/daemon/ouro-entry.js +3 -1
  120. package/dist/heart/daemon/plugin-cli.js +432 -0
  121. package/dist/heart/daemon/process-manager.js +525 -33
  122. package/dist/heart/daemon/provider-discovery.js +137 -0
  123. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  124. package/dist/heart/daemon/pulse.js +511 -0
  125. package/dist/heart/daemon/readiness-repair.js +365 -0
  126. package/dist/heart/daemon/run-hooks.js +39 -0
  127. package/dist/heart/daemon/runtime-logging.js +86 -16
  128. package/dist/heart/daemon/runtime-metadata.js +191 -0
  129. package/dist/{repertoire/tasks/lifecycle.js → heart/daemon/runtime-mode.js} +26 -39
  130. package/dist/heart/daemon/safe-mode.js +161 -0
  131. package/dist/heart/daemon/sense-manager.js +929 -0
  132. package/dist/heart/daemon/session-id-resolver.js +131 -0
  133. package/dist/heart/daemon/skill-management-installer.js +94 -0
  134. package/dist/heart/daemon/socket-client.js +361 -0
  135. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  136. package/dist/heart/daemon/startup-tui.js +338 -0
  137. package/dist/heart/daemon/task-scheduler.js +117 -39
  138. package/dist/heart/daemon/terminal-ui.js +499 -0
  139. package/dist/heart/daemon/thoughts.js +591 -0
  140. package/dist/heart/daemon/up-progress.js +366 -0
  141. package/dist/heart/daemon/vault-items.js +56 -0
  142. package/dist/heart/delegation.js +59 -0
  143. package/dist/heart/external-events/router.js +121 -0
  144. package/dist/heart/habits/habit-migration.js +189 -0
  145. package/dist/heart/habits/habit-parser.js +214 -0
  146. package/dist/heart/habits/habit-runtime-state.js +114 -0
  147. package/dist/heart/habits/habit-scheduler.js +431 -0
  148. package/dist/heart/habits/habit-session-summary.js +318 -0
  149. package/dist/heart/habits/habit-session.js +617 -0
  150. package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
  151. package/dist/heart/{daemon → hatch}/hatch-flow.js +53 -137
  152. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  153. package/dist/heart/hatch/specialist-orchestrator.js +129 -0
  154. package/dist/heart/hatch/specialist-prompt.js +102 -0
  155. package/dist/heart/hatch/specialist-tools.js +318 -0
  156. package/dist/heart/identity.js +287 -67
  157. package/dist/heart/kept-notes.js +289 -0
  158. package/dist/heart/kicks.js +2 -20
  159. package/dist/heart/machine-identity.js +161 -0
  160. package/dist/heart/mail-import-discovery.js +353 -0
  161. package/dist/heart/mailbox/mailbox-http-hooks.js +96 -0
  162. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  163. package/dist/heart/mailbox/mailbox-http-routes.js +375 -0
  164. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  165. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  166. package/dist/heart/mailbox/mailbox-http.js +99 -0
  167. package/dist/heart/mailbox/mailbox-read.js +37 -0
  168. package/dist/heart/mailbox/mailbox-types.js +27 -0
  169. package/dist/heart/mailbox/mailbox-view.js +197 -0
  170. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  171. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  172. package/dist/heart/mailbox/readers/mail.js +375 -0
  173. package/dist/heart/mailbox/readers/runtime-readers.js +815 -0
  174. package/dist/heart/mailbox/readers/sessions.js +232 -0
  175. package/dist/heart/mailbox/readers/shared.js +111 -0
  176. package/dist/heart/mcp/mcp-server.js +696 -0
  177. package/dist/heart/migrate-config.js +100 -0
  178. package/dist/heart/model-capabilities.js +59 -0
  179. package/dist/heart/orientation-frame.js +217 -0
  180. package/dist/heart/platform.js +81 -0
  181. package/dist/heart/primitives.js +1 -1
  182. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  183. package/dist/heart/private-runtime/index.js +18 -0
  184. package/dist/heart/private-runtime/ledger.js +218 -0
  185. package/dist/heart/private-runtime/policy.js +214 -0
  186. package/dist/heart/private-runtime/types.js +2 -0
  187. package/dist/heart/progress-story.js +42 -0
  188. package/dist/heart/provider-attempt.js +134 -0
  189. package/dist/heart/provider-binding-resolver.js +273 -0
  190. package/dist/heart/provider-credentials.js +441 -0
  191. package/dist/heart/provider-failover.js +311 -0
  192. package/dist/heart/provider-models.js +81 -0
  193. package/dist/heart/provider-ping.js +262 -0
  194. package/dist/heart/provider-readiness-cache.js +119 -0
  195. package/dist/heart/provider-visibility.js +188 -0
  196. package/dist/heart/providers/anthropic-token.js +131 -0
  197. package/dist/heart/providers/anthropic.js +202 -50
  198. package/dist/heart/providers/azure.js +104 -13
  199. package/dist/heart/providers/error-classification.js +127 -0
  200. package/dist/heart/providers/github-copilot.js +145 -0
  201. package/dist/heart/providers/minimax-vlm.js +189 -0
  202. package/dist/heart/providers/minimax.js +29 -7
  203. package/dist/heart/providers/openai-codex-token.js +349 -0
  204. package/dist/heart/providers/openai-codex.js +63 -39
  205. package/dist/heart/run-ledger.js +247 -0
  206. package/dist/heart/runtime-capability-check.js +170 -0
  207. package/dist/heart/runtime-credentials.js +398 -0
  208. package/dist/heart/runtime-cwd.js +87 -0
  209. package/dist/heart/sense-truth.js +77 -0
  210. package/dist/heart/session-activity.js +235 -0
  211. package/dist/heart/session-events.js +1133 -0
  212. package/dist/heart/session-playback-cli-main.js +5 -0
  213. package/dist/heart/session-playback-cli.js +36 -0
  214. package/dist/heart/session-playback.js +231 -0
  215. package/dist/heart/session-stats-cli-main.js +5 -0
  216. package/dist/heart/session-stats.js +182 -0
  217. package/dist/heart/session-transcript.js +133 -0
  218. package/dist/heart/start-of-turn-packet.js +365 -0
  219. package/dist/heart/streaming.js +129 -34
  220. package/dist/heart/structured-output.js +196 -0
  221. package/dist/heart/sync-classification.js +176 -0
  222. package/dist/heart/sync.js +449 -0
  223. package/dist/heart/target-resolution.js +127 -0
  224. package/dist/heart/tempo.js +93 -0
  225. package/dist/heart/temporal-view.js +41 -0
  226. package/dist/heart/timeouts.js +101 -0
  227. package/dist/heart/tool-activity-callbacks.js +59 -0
  228. package/dist/heart/tool-description.js +155 -0
  229. package/dist/heart/tool-friction.js +55 -0
  230. package/dist/heart/tool-loop.js +200 -0
  231. package/dist/heart/turn-context.js +472 -0
  232. package/dist/heart/turn-coordinator.js +28 -0
  233. package/dist/heart/versioning/ouro-bot-global-installer.js +129 -0
  234. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  235. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  236. package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
  237. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  238. package/dist/heart/versioning/staged-restart.js +146 -0
  239. package/dist/heart/versioning/update-checker.js +116 -0
  240. package/dist/heart/versioning/update-hooks.js +154 -0
  241. package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
  242. package/dist/heart/work-card.js +380 -0
  243. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  244. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  245. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  246. package/dist/mailbox-ui/index.html +16 -0
  247. package/dist/mailroom/attention.js +167 -0
  248. package/dist/mailroom/autonomy.js +209 -0
  249. package/dist/mailroom/blob-store.js +715 -0
  250. package/dist/mailroom/body-cache.js +61 -0
  251. package/dist/mailroom/core.js +788 -0
  252. package/dist/mailroom/entry.js +160 -0
  253. package/dist/mailroom/file-store.js +568 -0
  254. package/dist/mailroom/mbox-import.js +393 -0
  255. package/dist/mailroom/migration.js +164 -0
  256. package/dist/mailroom/outbound.js +380 -0
  257. package/dist/mailroom/policy.js +263 -0
  258. package/dist/mailroom/reader.js +233 -0
  259. package/dist/mailroom/search-cache.js +334 -0
  260. package/dist/mailroom/search-relevance.js +319 -0
  261. package/dist/mailroom/smtp-ingress.js +176 -0
  262. package/dist/mailroom/source-state.js +176 -0
  263. package/dist/mailroom/thread.js +109 -0
  264. package/dist/mailroom/travel-extract.js +89 -0
  265. package/dist/mind/bundle-manifest.js +93 -1
  266. package/dist/mind/context.js +259 -94
  267. package/dist/mind/desk-section.js +362 -0
  268. package/dist/mind/diary-integrity.js +60 -0
  269. package/dist/mind/{memory.js → diary.js} +90 -98
  270. package/dist/mind/embedding-provider.js +60 -0
  271. package/dist/mind/file-state.js +179 -0
  272. package/dist/mind/first-impressions.js +16 -2
  273. package/dist/mind/{associative-recall.js → note-search.js} +61 -60
  274. package/dist/mind/obligation-steering.js +221 -0
  275. package/dist/mind/pending.js +77 -9
  276. package/dist/mind/phrases.js +1 -0
  277. package/dist/mind/prompt-budget.js +380 -0
  278. package/dist/mind/prompt-refresh.js +3 -2
  279. package/dist/mind/prompt.js +1279 -139
  280. package/dist/mind/provenance-trust.js +26 -0
  281. package/dist/mind/record-paths.js +312 -0
  282. package/dist/mind/scrutiny.js +173 -0
  283. package/dist/mind/token-estimate.js +8 -12
  284. package/dist/nerves/cli-logging.js +22 -3
  285. package/dist/nerves/coverage/audit-rules.js +15 -6
  286. package/dist/nerves/coverage/audit.js +28 -2
  287. package/dist/nerves/coverage/cli.js +1 -1
  288. package/dist/nerves/coverage/contract.js +5 -5
  289. package/dist/nerves/coverage/file-completeness.js +139 -5
  290. package/dist/nerves/coverage/run-artifacts.js +1 -1
  291. package/dist/nerves/event-buffer.js +111 -0
  292. package/dist/nerves/index.js +234 -4
  293. package/dist/nerves/observation.js +20 -0
  294. package/dist/nerves/redact.js +79 -0
  295. package/dist/nerves/review/cli-main.js +5 -0
  296. package/dist/nerves/review/cli.js +156 -0
  297. package/dist/nerves/review/core.js +152 -0
  298. package/dist/nerves/runtime.js +5 -1
  299. package/dist/repertoire/ado-client.js +17 -56
  300. package/dist/repertoire/ado-semantic.js +16 -10
  301. package/dist/repertoire/api-client.js +97 -0
  302. package/dist/repertoire/bitwarden-store.js +1042 -0
  303. package/dist/repertoire/bundle-templates.js +71 -0
  304. package/dist/repertoire/bw-installer.js +180 -0
  305. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  306. package/dist/repertoire/coding/context-pack.js +331 -0
  307. package/dist/repertoire/coding/feedback.js +322 -0
  308. package/dist/repertoire/coding/index.js +18 -3
  309. package/dist/repertoire/coding/manager.js +228 -14
  310. package/dist/repertoire/coding/spawner.js +61 -14
  311. package/dist/repertoire/coding/tools.js +279 -12
  312. package/dist/repertoire/coding/workbench-client.js +272 -0
  313. package/dist/repertoire/coding/workbench-manager.js +346 -0
  314. package/dist/repertoire/commerce-errors.js +109 -0
  315. package/dist/repertoire/commerce-self-test.js +156 -0
  316. package/dist/repertoire/credential-access.js +178 -0
  317. package/dist/repertoire/data/ado-endpoints.json +188 -0
  318. package/dist/repertoire/desk/classifier.js +362 -0
  319. package/dist/repertoire/duffel-client.js +185 -0
  320. package/dist/repertoire/github-client.js +14 -55
  321. package/dist/repertoire/graph-client.js +11 -52
  322. package/dist/repertoire/guardrails.js +408 -0
  323. package/dist/repertoire/mcp-client.js +295 -0
  324. package/dist/repertoire/mcp-manager.js +434 -0
  325. package/dist/repertoire/mcp-tools.js +83 -0
  326. package/dist/repertoire/plugin-mcp.js +175 -0
  327. package/dist/repertoire/plugins.js +253 -0
  328. package/dist/repertoire/shell-sessions.js +133 -0
  329. package/dist/repertoire/skills.js +45 -24
  330. package/dist/repertoire/stripe-client.js +131 -0
  331. package/dist/repertoire/tool-results.js +29 -0
  332. package/dist/repertoire/tools-a2a.js +699 -0
  333. package/dist/repertoire/tools-attachments.js +317 -0
  334. package/dist/repertoire/tools-awaiting.js +372 -0
  335. package/dist/repertoire/tools-base.js +68 -707
  336. package/dist/repertoire/tools-bluebubbles.js +95 -0
  337. package/dist/repertoire/tools-bridge.js +144 -0
  338. package/dist/repertoire/tools-bundle.js +993 -0
  339. package/dist/repertoire/tools-commerce.js +253 -0
  340. package/dist/repertoire/tools-config.js +186 -0
  341. package/dist/repertoire/tools-continuity.js +252 -0
  342. package/dist/repertoire/tools-credential.js +383 -0
  343. package/dist/repertoire/tools-evolution.js +527 -0
  344. package/dist/repertoire/tools-files.js +344 -0
  345. package/dist/repertoire/tools-flight.js +290 -0
  346. package/dist/repertoire/tools-flow.js +119 -0
  347. package/dist/repertoire/tools-github.js +3 -8
  348. package/dist/repertoire/tools-mail.js +1975 -0
  349. package/dist/repertoire/tools-notes.js +459 -0
  350. package/dist/repertoire/tools-obligations.js +182 -0
  351. package/dist/repertoire/tools-orientation.js +31 -0
  352. package/dist/repertoire/tools-record.js +482 -0
  353. package/dist/repertoire/tools-rsvp.js +139 -0
  354. package/dist/repertoire/tools-runtime.js +150 -0
  355. package/dist/repertoire/tools-session.js +881 -0
  356. package/dist/repertoire/tools-shell.js +120 -0
  357. package/dist/repertoire/tools-stripe.js +224 -0
  358. package/dist/repertoire/tools-surface.js +355 -0
  359. package/dist/repertoire/tools-teams.js +67 -61
  360. package/dist/repertoire/tools-travel.js +125 -0
  361. package/dist/repertoire/tools-trip.js +982 -0
  362. package/dist/repertoire/tools-user-profile.js +146 -0
  363. package/dist/repertoire/tools-vault.js +40 -0
  364. package/dist/repertoire/tools-voice.js +145 -0
  365. package/dist/repertoire/tools.js +313 -102
  366. package/dist/repertoire/travel-api-client.js +360 -0
  367. package/dist/repertoire/user-profile.js +131 -0
  368. package/dist/repertoire/vault-setup.js +246 -0
  369. package/dist/repertoire/vault-unlock.js +594 -0
  370. package/dist/rsvp/aisleplanner-client.js +354 -0
  371. package/dist/rsvp/cli.js +704 -0
  372. package/dist/rsvp/config.js +327 -0
  373. package/dist/rsvp/cutover.js +431 -0
  374. package/dist/rsvp/diagnostics.js +222 -0
  375. package/dist/rsvp/diff-renderer.js +161 -0
  376. package/dist/rsvp/habit-policy.js +85 -0
  377. package/dist/rsvp/habit-stage.js +93 -0
  378. package/dist/rsvp/incident-bundle.js +97 -0
  379. package/dist/rsvp/migration.js +204 -0
  380. package/dist/rsvp/outbound-state.js +254 -0
  381. package/dist/rsvp/query.js +118 -0
  382. package/dist/rsvp/replay.js +233 -0
  383. package/dist/rsvp/snapshot.js +232 -0
  384. package/dist/scripts/claude-code-hook.js +41 -0
  385. package/dist/scripts/claude-code-stop-hook.js +47 -0
  386. package/dist/senses/a2a-entry.js +115 -0
  387. package/dist/senses/attention-queue.js +186 -0
  388. package/dist/senses/await-turn-message.js +58 -0
  389. package/dist/senses/bluebubbles/active-turns.js +216 -0
  390. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  391. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  392. package/dist/senses/bluebubbles/client.js +691 -0
  393. package/dist/senses/bluebubbles/entry.js +77 -0
  394. package/dist/senses/bluebubbles/inbound-log.js +126 -0
  395. package/dist/senses/bluebubbles/index.js +2937 -0
  396. package/dist/senses/bluebubbles/media.js +389 -0
  397. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +45 -16
  398. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
  399. package/dist/senses/bluebubbles/outbound-state.js +304 -0
  400. package/dist/senses/bluebubbles/processed-log.js +133 -0
  401. package/dist/senses/bluebubbles/replay.js +284 -0
  402. package/dist/senses/bluebubbles/runtime-state.js +137 -0
  403. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  404. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  405. package/dist/senses/cli/bracketed-paste.js +82 -0
  406. package/dist/senses/cli/image-paste.js +287 -0
  407. package/dist/senses/cli/image-ref-navigation.js +75 -0
  408. package/dist/senses/cli/ink-app.js +156 -0
  409. package/dist/senses/cli/inline-diff.js +64 -0
  410. package/dist/senses/cli/input-keys.js +174 -0
  411. package/dist/senses/cli/kill-ring.js +86 -0
  412. package/dist/senses/cli/message-list.js +51 -0
  413. package/dist/senses/cli/ouro-tui.js +607 -0
  414. package/dist/senses/cli/spinner-imperative.js +135 -0
  415. package/dist/senses/cli/spinner.js +101 -0
  416. package/dist/senses/cli/status-line.js +60 -0
  417. package/dist/senses/cli/streaming-markdown.js +526 -0
  418. package/dist/senses/cli/tool-display.js +85 -0
  419. package/dist/senses/cli/tool-render.js +85 -0
  420. package/dist/senses/cli/tui-store.js +240 -0
  421. package/dist/senses/cli/virtual-list.js +35 -0
  422. package/dist/senses/cli-entry.js +60 -8
  423. package/dist/senses/cli-layout.js +187 -0
  424. package/dist/senses/cli.js +780 -269
  425. package/dist/senses/commands.js +66 -3
  426. package/dist/senses/context-packet-ledger.js +245 -0
  427. package/dist/senses/context-packets.js +154 -0
  428. package/dist/senses/continuity.js +94 -0
  429. package/dist/senses/habit-turn-message.js +160 -0
  430. package/dist/senses/mail-entry.js +66 -0
  431. package/dist/senses/mail.js +395 -0
  432. package/dist/senses/pipeline.js +1052 -0
  433. package/dist/senses/private-runtime-worker.js +723 -0
  434. package/dist/senses/private-runtime.js +1157 -0
  435. package/dist/senses/proactive-content-guard.js +51 -0
  436. package/dist/senses/shared-turn.js +416 -0
  437. package/dist/senses/surface-tool.js +109 -0
  438. package/dist/senses/teams-entry.js +60 -8
  439. package/dist/senses/teams.js +928 -199
  440. package/dist/senses/trust-gate.js +207 -2
  441. package/dist/senses/voice/audio-playback.js +237 -0
  442. package/dist/senses/voice/audio-routing.js +119 -0
  443. package/dist/senses/voice/elevenlabs.js +202 -0
  444. package/dist/senses/voice/floor-control.js +431 -0
  445. package/dist/senses/voice/floor-controller.js +115 -0
  446. package/dist/senses/voice/golden-path.js +116 -0
  447. package/dist/senses/voice/index.js +29 -0
  448. package/dist/senses/voice/meeting.js +113 -0
  449. package/dist/senses/voice/outbound.js +190 -0
  450. package/dist/senses/voice/phone.js +33 -0
  451. package/dist/senses/voice/playback.js +139 -0
  452. package/dist/senses/voice/realtime-eval.js +496 -0
  453. package/dist/senses/voice/realtime-trace.js +531 -0
  454. package/dist/senses/voice/transcript.js +70 -0
  455. package/dist/senses/voice/turn.js +191 -0
  456. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  457. package/dist/senses/voice/twilio-phone.js +5081 -0
  458. package/dist/senses/voice/types.js +2 -0
  459. package/dist/senses/voice/whisper.js +161 -0
  460. package/dist/senses/voice-entry.js +81 -0
  461. package/dist/senses/voice-realtime-eval-command.js +99 -0
  462. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  463. package/dist/senses/voice-twilio-entry.js +87 -0
  464. package/dist/trips/core.js +138 -0
  465. package/dist/trips/store.js +265 -0
  466. package/dist/util/frontmatter.js +69 -0
  467. package/package.json +67 -11
  468. package/skills/agent-commerce.md +113 -0
  469. package/skills/browser-navigation.md +117 -0
  470. package/skills/commerce-setup-guide.md +116 -0
  471. package/skills/commerce-setup.md +84 -0
  472. package/skills/configure-dev-tools.md +99 -0
  473. package/skills/travel-planning.md +138 -0
  474. package/AdoptionSpecialist.ouro/agent.json +0 -20
  475. package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
  476. package/dist/heart/daemon/specialist-orchestrator.js +0 -160
  477. package/dist/heart/daemon/specialist-prompt.js +0 -40
  478. package/dist/heart/daemon/specialist-session.js +0 -142
  479. package/dist/heart/daemon/specialist-tools.js +0 -128
  480. package/dist/heart/daemon/subagent-installer.js +0 -125
  481. package/dist/inner-worker-entry.js +0 -4
  482. package/dist/mind/friends/channel.js +0 -49
  483. package/dist/mind/friends/resolver.js +0 -84
  484. package/dist/mind/friends/store-file.js +0 -171
  485. package/dist/mind/friends/store.js +0 -4
  486. package/dist/mind/friends/tokens.js +0 -26
  487. package/dist/mind/friends/types.js +0 -21
  488. package/dist/repertoire/tasks/board.js +0 -122
  489. package/dist/repertoire/tasks/index.js +0 -210
  490. package/dist/repertoire/tasks/middleware.js +0 -65
  491. package/dist/repertoire/tasks/parser.js +0 -173
  492. package/dist/repertoire/tasks/scanner.js +0 -132
  493. package/dist/repertoire/tasks/transitions.js +0 -145
  494. package/dist/senses/bluebubbles-client.js +0 -279
  495. package/dist/senses/bluebubbles-entry.js +0 -11
  496. package/dist/senses/bluebubbles.js +0 -332
  497. package/dist/senses/inner-dialog-worker.js +0 -61
  498. package/dist/senses/inner-dialog.js +0 -231
  499. package/subagents/README.md +0 -73
  500. package/subagents/work-doer.md +0 -233
  501. package/subagents/work-merger.md +0 -624
  502. package/subagents/work-planner.md +0 -373
  503. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  504. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  505. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  506. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  507. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  508. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  509. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  510. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  511. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  512. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  513. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  514. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
@@ -0,0 +1,346 @@
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.WorkbenchCodingSessionManager = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const runtime_1 = require("../../nerves/runtime");
40
+ const spawner_1 = require("./spawner");
41
+ function cloneSession(session) {
42
+ return {
43
+ ...session,
44
+ originSession: session.originSession ? { ...session.originSession } : undefined,
45
+ failure: session.failure ? { ...session.failure, args: [...session.failure.args] } : null,
46
+ };
47
+ }
48
+ function sanitizeNamePart(value, fallback) {
49
+ const sanitized = (value ?? fallback)
50
+ .toLowerCase()
51
+ .replace(/[^a-z0-9]+/g, "-")
52
+ .replace(/^-+|-+$/g, "");
53
+ return sanitized.length > 0 ? sanitized : fallback;
54
+ }
55
+ function timestampPart(iso) {
56
+ return iso.replace(/[-:.]/g, "").replace("Z", "Z");
57
+ }
58
+ function sessionNameForRequest(request, nowIso) {
59
+ return [
60
+ "coding",
61
+ request.runner,
62
+ sanitizeNamePart(request.taskRef, "task"),
63
+ timestampPart(nowIso),
64
+ ].join("-");
65
+ }
66
+ function commandForRunner(runner) {
67
+ return runner === "claude" ? "claude" : "codex";
68
+ }
69
+ function runnerFromWorkbenchSession(session, fallback) {
70
+ const name = session.name.toLowerCase();
71
+ if (name.includes("claude"))
72
+ return "claude";
73
+ if (name.includes("codex"))
74
+ return "codex";
75
+ return fallback;
76
+ }
77
+ function mapWorkbenchStatus(session) {
78
+ switch (session.status) {
79
+ case "configured":
80
+ case "running":
81
+ return "running";
82
+ case "waitingForInput":
83
+ return "waiting_input";
84
+ case "exited":
85
+ return session.exitCode === 0 ? "completed" : "failed";
86
+ case "needsRecovery":
87
+ case "manualActionNeeded":
88
+ return "stalled";
89
+ default:
90
+ return "running";
91
+ }
92
+ }
93
+ function checkpointFor(session, status) {
94
+ if (session.attentionPrompt?.trim())
95
+ return session.attentionPrompt.trim();
96
+ if (session.attentionReason?.trim())
97
+ return session.attentionReason.trim();
98
+ if (session.attention?.trim())
99
+ return session.attention.trim();
100
+ if (status === "completed")
101
+ return "completed";
102
+ if (status === "failed")
103
+ return session.exitCode === undefined ? "exited" : `exit code ${session.exitCode}`;
104
+ if (status === "stalled")
105
+ return "needs Workbench recovery";
106
+ return null;
107
+ }
108
+ function failureFor(session, command) {
109
+ if (mapWorkbenchStatus(session) !== "failed")
110
+ return null;
111
+ return {
112
+ command,
113
+ args: [],
114
+ code: session.exitCode ?? null,
115
+ signal: null,
116
+ stdoutTail: "",
117
+ stderrTail: checkpointFor(session, "failed"),
118
+ };
119
+ }
120
+ function resultToActionResult(action, sessionId, result) {
121
+ if (result.state === "applied" || result.state === "appliedUnconfirmed") {
122
+ return { ok: true, message: `${action} applied for ${sessionId}` };
123
+ }
124
+ if (result.state === "queued") {
125
+ return { ok: false, message: `${action} queued for ${sessionId} but not confirmed` };
126
+ }
127
+ return { ok: false, message: result.result ?? `${action} ${result.state} for ${sessionId}` };
128
+ }
129
+ function promptDeliveryFailure(result) {
130
+ const sessionId = result.session.id;
131
+ if (result.promptAck.ok === false) {
132
+ return `Workbench denied initial prompt for ${sessionId}`;
133
+ }
134
+ switch (result.promptResult?.state) {
135
+ case "applied":
136
+ case "appliedUnconfirmed":
137
+ return null;
138
+ case "failed":
139
+ return `Workbench failed initial prompt for ${sessionId}`;
140
+ case "queued":
141
+ return `Workbench queued initial prompt for ${sessionId} but did not confirm delivery`;
142
+ case "unknown":
143
+ case undefined:
144
+ return `Workbench did not confirm initial prompt delivery for ${sessionId}`;
145
+ }
146
+ }
147
+ class WorkbenchCodingSessionManager {
148
+ records = new Map();
149
+ listeners = new Map();
150
+ client;
151
+ agentName;
152
+ nowIso;
153
+ existsSync;
154
+ readFileSync;
155
+ source;
156
+ constructor(options) {
157
+ this.client = options.client;
158
+ this.agentName = options.agentName;
159
+ this.nowIso = options.nowIso ?? (() => new Date().toISOString());
160
+ this.existsSync = options.existsSync ?? fs.existsSync;
161
+ this.readFileSync = options.readFileSync ?? fs.readFileSync;
162
+ this.source = options.source ?? "ouro-coding";
163
+ }
164
+ async spawnSession(request) {
165
+ const now = this.nowIso();
166
+ const name = sessionNameForRequest(request, now);
167
+ const normalizedRequest = {
168
+ ...request,
169
+ parentAgent: request.parentAgent ?? this.agentName,
170
+ };
171
+ const prompt = (0, spawner_1.buildCodingPrompt)(normalizedRequest, {
172
+ existsSync: this.existsSync,
173
+ readFileSync: this.readFileSync,
174
+ });
175
+ const result = await this.client.createCodingSession({
176
+ owner: normalizedRequest.parentAgent,
177
+ name,
178
+ command: commandForRunner(normalizedRequest.runner),
179
+ workingDirectory: normalizedRequest.workdir,
180
+ prompt,
181
+ group: path.basename(normalizedRequest.workdir),
182
+ trust: "trusted",
183
+ autoResume: normalizedRequest.autoRestartOnCrash !== false,
184
+ source: this.source,
185
+ });
186
+ const promptFailure = promptDeliveryFailure(result);
187
+ if (promptFailure) {
188
+ throw new Error(promptFailure);
189
+ }
190
+ const session = this.toCodingSession(result.session, normalizedRequest);
191
+ this.records.set(session.id, { request: normalizedRequest, session });
192
+ (0, runtime_1.emitNervesEvent)({
193
+ component: "repertoire",
194
+ event: "repertoire.workbench_coding_session_spawned",
195
+ message: "Workbench coding session spawned",
196
+ meta: { id: session.id, runner: session.runner, workdir: session.workdir },
197
+ });
198
+ this.notifyListeners(session.id, { kind: "spawned", session: cloneSession(session) });
199
+ return cloneSession(session);
200
+ }
201
+ async refreshSessions() {
202
+ const workbenchSessions = await this.client.listSessions({ owner: this.agentName, includeArchived: true });
203
+ for (const workbenchSession of workbenchSessions) {
204
+ if (!workbenchSession.name.toLowerCase().startsWith("coding-"))
205
+ continue;
206
+ const existing = this.records.get(workbenchSession.id);
207
+ const fallbackRequest = existing?.request ?? this.fallbackRequest(workbenchSession);
208
+ const session = this.toCodingSession(workbenchSession, fallbackRequest, existing?.session);
209
+ this.records.set(session.id, { request: fallbackRequest, session });
210
+ }
211
+ return this.listSessions();
212
+ }
213
+ async refreshSession(sessionId) {
214
+ const sessions = await this.refreshSessions();
215
+ const session = sessions.find((item) => item.id === sessionId) ?? null;
216
+ if (!session)
217
+ return null;
218
+ const tail = await this.client.transcriptTail(sessionId);
219
+ const record = this.records.get(sessionId);
220
+ record.session.stdoutTail = tail;
221
+ record.session.lastActivityAt = this.nowIso();
222
+ record.session.checkpoint = tail.trim().split(/\r?\n/).filter(Boolean).at(-1) ?? record.session.checkpoint;
223
+ return cloneSession(record.session);
224
+ }
225
+ listSessions() {
226
+ return [...this.records.values()]
227
+ .map((record) => cloneSession(record.session))
228
+ .sort((left, right) => left.id.localeCompare(right.id));
229
+ }
230
+ getSession(sessionId) {
231
+ const record = this.records.get(sessionId);
232
+ return record ? cloneSession(record.session) : null;
233
+ }
234
+ subscribe(sessionId, listener) {
235
+ const listeners = this.listeners.get(sessionId) ?? new Set();
236
+ listeners.add(listener);
237
+ this.listeners.set(sessionId, listeners);
238
+ return () => {
239
+ const current = this.listeners.get(sessionId);
240
+ if (!current)
241
+ return;
242
+ current.delete(listener);
243
+ if (current.size === 0)
244
+ this.listeners.delete(sessionId);
245
+ };
246
+ }
247
+ async sendInput(sessionId, input) {
248
+ return this.queueAction(sessionId, "sendInput", { text: input, appendNewline: true });
249
+ }
250
+ async killSession(sessionId) {
251
+ const actionResult = await this.queueAction(sessionId, "terminate", {});
252
+ if (actionResult.ok) {
253
+ const record = this.records.get(sessionId);
254
+ record.session.status = "killed";
255
+ record.session.endedAt = this.nowIso();
256
+ record.session.checkpoint = "terminated by parent agent";
257
+ this.notifyListeners(sessionId, { kind: "killed", session: cloneSession(record.session) });
258
+ }
259
+ return actionResult;
260
+ }
261
+ checkStalls() {
262
+ return 0;
263
+ }
264
+ shutdown() {
265
+ this.listeners.clear();
266
+ }
267
+ async queueAction(sessionId, action, extra) {
268
+ let record = this.records.get(sessionId);
269
+ if (!record) {
270
+ await this.refreshSessions();
271
+ record = this.records.get(sessionId);
272
+ }
273
+ if (!record) {
274
+ return { ok: false, message: `session not found: ${sessionId}` };
275
+ }
276
+ const ack = await this.client.requestAction({
277
+ source: this.source,
278
+ action,
279
+ entry: sessionId,
280
+ ...extra,
281
+ });
282
+ if (!ack.requestId) {
283
+ return { ok: ack.ok === true, message: ack.message ?? `${action} queued for ${sessionId}` };
284
+ }
285
+ const result = await this.client.waitForAction(ack.requestId);
286
+ const actionResult = resultToActionResult(action, sessionId, result);
287
+ if (actionResult.ok && action === "sendInput") {
288
+ record.session.status = "running";
289
+ record.session.lastActivityAt = this.nowIso();
290
+ this.notifyListeners(sessionId, { kind: "progress", session: cloneSession(record.session) });
291
+ }
292
+ return actionResult;
293
+ }
294
+ fallbackRequest(session) {
295
+ const runner = runnerFromWorkbenchSession(session, "codex");
296
+ return {
297
+ runner,
298
+ workdir: session.workingDirectory ?? "",
299
+ prompt: "",
300
+ taskRef: session.name,
301
+ parentAgent: this.agentName,
302
+ autoRestartOnCrash: session.autoResume,
303
+ };
304
+ }
305
+ toCodingSession(workbenchSession, request, previous) {
306
+ const runner = runnerFromWorkbenchSession(workbenchSession, request.runner);
307
+ const status = mapWorkbenchStatus(workbenchSession);
308
+ const workdir = workbenchSession.workingDirectory ?? request.workdir;
309
+ const lastActivityAt = workbenchSession.lastOutputAt ?? workbenchSession.startedAt ?? previous?.lastActivityAt ?? this.nowIso();
310
+ const startedAt = workbenchSession.startedAt ?? previous?.startedAt ?? this.nowIso();
311
+ const command = commandForRunner(runner);
312
+ return {
313
+ id: workbenchSession.id,
314
+ runner,
315
+ workdir,
316
+ taskRef: request.taskRef,
317
+ originSession: request.originSession ? { ...request.originSession } : undefined,
318
+ obligationId: request.obligationId,
319
+ evolutionCaseId: request.evolutionCaseId,
320
+ scopeFile: request.scopeFile,
321
+ stateFile: request.stateFile,
322
+ checkpoint: checkpointFor(workbenchSession, status),
323
+ artifactPath: workbenchSession.transcriptPath,
324
+ status,
325
+ stdoutTail: previous?.stdoutTail ?? "",
326
+ stderrTail: previous?.stderrTail ?? "",
327
+ pid: workbenchSession.pid ?? null,
328
+ startedAt,
329
+ lastActivityAt,
330
+ endedAt: status === "completed" || status === "failed" ? lastActivityAt : null,
331
+ restartCount: previous?.restartCount ?? 0,
332
+ lastExitCode: workbenchSession.exitCode ?? null,
333
+ lastSignal: null,
334
+ failure: failureFor(workbenchSession, command),
335
+ };
336
+ }
337
+ notifyListeners(sessionId, update) {
338
+ const listeners = this.listeners.get(sessionId);
339
+ if (!listeners || listeners.size === 0)
340
+ return;
341
+ for (const listener of listeners) {
342
+ void Promise.resolve(listener(update));
343
+ }
344
+ }
345
+ }
346
+ exports.WorkbenchCodingSessionManager = WorkbenchCodingSessionManager;
@@ -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
+ }