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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (449) hide show
  1. package/README.md +127 -23
  2. package/RepairGuide.ouro/agent.json +5 -0
  3. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  4. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  5. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  6. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  7. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  8. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  9. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  12. package/changelog.json +4216 -13
  13. package/dist/a2a/card.js +56 -0
  14. package/dist/a2a/client.js +143 -0
  15. package/dist/a2a/config.js +50 -0
  16. package/dist/a2a/onboarding.js +111 -0
  17. package/dist/a2a/server.js +498 -0
  18. package/dist/a2a/task-store.js +69 -0
  19. package/dist/a2a/types.js +3 -0
  20. package/dist/arc/attention-types.js +8 -0
  21. package/dist/arc/cares.js +144 -0
  22. package/dist/arc/episodes.js +118 -0
  23. package/dist/arc/evolution.js +487 -0
  24. package/dist/arc/flight-recorder.js +369 -0
  25. package/dist/arc/intentions.js +134 -0
  26. package/dist/arc/json-store.js +117 -0
  27. package/dist/arc/obligations.js +292 -0
  28. package/dist/arc/packets.js +288 -0
  29. package/dist/arc/presence.js +185 -0
  30. package/dist/arc/task-lifecycle.js +57 -0
  31. package/dist/commerce/store.js +755 -0
  32. package/dist/commerce/types.js +3 -0
  33. package/dist/heart/active-work.js +860 -43
  34. package/dist/heart/agent-entry.js +69 -3
  35. package/dist/heart/attachments/image-normalize.js +194 -0
  36. package/dist/heart/attachments/materialize.js +97 -0
  37. package/dist/heart/attachments/originals.js +88 -0
  38. package/dist/heart/attachments/render.js +29 -0
  39. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  40. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  41. package/dist/heart/attachments/sources/index.js +16 -0
  42. package/dist/heart/attachments/store.js +103 -0
  43. package/dist/heart/attachments/types.js +93 -0
  44. package/dist/heart/auth/auth-flow.js +479 -0
  45. package/dist/heart/awaiting/await-alert.js +146 -0
  46. package/dist/heart/awaiting/await-expiry.js +108 -0
  47. package/dist/heart/awaiting/await-loader.js +91 -0
  48. package/dist/heart/awaiting/await-parser.js +141 -0
  49. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  50. package/dist/heart/awaiting/await-scheduler.js +377 -0
  51. package/dist/heart/background-operations.js +281 -0
  52. package/dist/heart/bridges/manager.js +137 -17
  53. package/dist/heart/bridges/store.js +14 -2
  54. package/dist/heart/bundle-state.js +168 -0
  55. package/dist/heart/commitments.js +135 -0
  56. package/dist/heart/config-registry.js +331 -0
  57. package/dist/heart/config.js +118 -119
  58. package/dist/heart/context-loss-gauntlet.js +354 -0
  59. package/dist/heart/core.js +1123 -247
  60. package/dist/heart/cross-chat-delivery.js +3 -18
  61. package/dist/heart/daemon/agent-config-check.js +419 -0
  62. package/dist/heart/daemon/agent-discovery.js +102 -3
  63. package/dist/heart/daemon/agent-service.js +523 -0
  64. package/dist/heart/daemon/agentic-repair.js +547 -0
  65. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  66. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  67. package/dist/heart/daemon/cadence.js +70 -0
  68. package/dist/heart/daemon/cli-defaults.js +780 -0
  69. package/dist/heart/daemon/cli-desk.js +322 -0
  70. package/dist/heart/daemon/cli-exec.js +7767 -0
  71. package/dist/heart/daemon/cli-help.js +558 -0
  72. package/dist/heart/daemon/cli-parse.js +1688 -0
  73. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  74. package/dist/heart/daemon/cli-render.js +763 -0
  75. package/dist/heart/daemon/cli-types.js +8 -0
  76. package/dist/heart/daemon/connect-bay.js +323 -0
  77. package/dist/heart/daemon/daemon-cli.js +29 -1750
  78. package/dist/heart/daemon/daemon-entry.js +485 -2
  79. package/dist/heart/daemon/daemon-health.js +176 -0
  80. package/dist/heart/daemon/daemon-rollup.js +57 -0
  81. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  82. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  83. package/dist/heart/daemon/daemon.js +937 -74
  84. package/dist/heart/daemon/dns-workflow.js +394 -0
  85. package/dist/heart/daemon/doctor-types.js +8 -0
  86. package/dist/heart/daemon/doctor.js +873 -0
  87. package/dist/heart/daemon/health-monitor.js +122 -1
  88. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  89. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  90. package/dist/heart/daemon/http-health-probe.js +80 -0
  91. package/dist/heart/daemon/human-command-screens.js +234 -0
  92. package/dist/heart/daemon/human-readiness.js +114 -0
  93. package/dist/heart/daemon/inner-status.js +78 -0
  94. package/dist/heart/daemon/interactive-repair.js +394 -0
  95. package/dist/heart/daemon/launchd.js +37 -8
  96. package/dist/heart/daemon/log-tailer.js +79 -10
  97. package/dist/heart/daemon/logs-prune.js +110 -0
  98. package/dist/heart/daemon/mcp-canary.js +297 -0
  99. package/dist/heart/daemon/message-router.js +6 -2
  100. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  101. package/dist/heart/daemon/os-cron-deps.js +135 -0
  102. package/dist/heart/daemon/os-cron.js +14 -12
  103. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  104. package/dist/heart/daemon/ouro-entry.js +3 -1
  105. package/dist/heart/daemon/plugin-cli.js +432 -0
  106. package/dist/heart/daemon/process-manager.js +511 -40
  107. package/dist/heart/daemon/provider-discovery.js +137 -0
  108. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  109. package/dist/heart/daemon/pulse.js +475 -0
  110. package/dist/heart/daemon/readiness-repair.js +365 -0
  111. package/dist/heart/daemon/run-hooks.js +2 -0
  112. package/dist/heart/daemon/runtime-logging.js +35 -14
  113. package/dist/heart/daemon/runtime-metadata.js +2 -30
  114. package/dist/heart/daemon/safe-mode.js +161 -0
  115. package/dist/heart/daemon/sense-manager.js +564 -38
  116. package/dist/heart/daemon/session-id-resolver.js +131 -0
  117. package/dist/heart/daemon/skill-management-installer.js +1 -1
  118. package/dist/heart/daemon/socket-client.js +158 -11
  119. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  120. package/dist/heart/daemon/startup-tui.js +330 -0
  121. package/dist/heart/daemon/task-scheduler.js +117 -39
  122. package/dist/heart/daemon/terminal-ui.js +499 -0
  123. package/dist/heart/daemon/thoughts.js +229 -17
  124. package/dist/heart/daemon/up-progress.js +366 -0
  125. package/dist/heart/daemon/vault-items.js +56 -0
  126. package/dist/heart/delegation.js +1 -4
  127. package/dist/heart/habits/habit-migration.js +189 -0
  128. package/dist/heart/habits/habit-parser.js +203 -0
  129. package/dist/heart/habits/habit-runtime-state.js +100 -0
  130. package/dist/heart/habits/habit-scheduler.js +372 -0
  131. package/dist/heart/{daemon → hatch}/hatch-flow.js +40 -56
  132. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  133. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  134. package/dist/heart/{daemon → hatch}/specialist-tools.js +45 -18
  135. package/dist/heart/identity.js +174 -57
  136. package/dist/heart/kept-notes.js +289 -0
  137. package/dist/heart/kicks.js +1 -1
  138. package/dist/heart/machine-identity.js +161 -0
  139. package/dist/heart/mail-import-discovery.js +353 -0
  140. package/dist/heart/mailbox/mailbox-http-hooks.js +67 -0
  141. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  142. package/dist/heart/mailbox/mailbox-http-routes.js +250 -0
  143. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  144. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  145. package/dist/heart/mailbox/mailbox-http.js +99 -0
  146. package/dist/heart/mailbox/mailbox-read.js +32 -0
  147. package/dist/heart/mailbox/mailbox-types.js +27 -0
  148. package/dist/heart/mailbox/mailbox-view.js +197 -0
  149. package/dist/heart/mailbox/readers/agent-machine.js +418 -0
  150. package/dist/heart/mailbox/readers/continuity-readers.js +324 -0
  151. package/dist/heart/mailbox/readers/mail.js +375 -0
  152. package/dist/heart/mailbox/readers/runtime-readers.js +728 -0
  153. package/dist/heart/mailbox/readers/sessions.js +232 -0
  154. package/dist/heart/mailbox/readers/shared.js +111 -0
  155. package/dist/heart/mcp/mcp-server.js +696 -0
  156. package/dist/heart/migrate-config.js +100 -0
  157. package/dist/heart/model-capabilities.js +19 -0
  158. package/dist/heart/orientation-frame.js +217 -0
  159. package/dist/heart/platform.js +81 -0
  160. package/dist/heart/provider-attempt.js +134 -0
  161. package/dist/heart/provider-binding-resolver.js +272 -0
  162. package/dist/heart/provider-credentials.js +425 -0
  163. package/dist/heart/provider-failover.js +311 -0
  164. package/dist/heart/provider-models.js +81 -0
  165. package/dist/heart/provider-ping.js +262 -0
  166. package/dist/heart/provider-readiness-cache.js +40 -0
  167. package/dist/heart/provider-visibility.js +188 -0
  168. package/dist/heart/providers/anthropic-token.js +131 -0
  169. package/dist/heart/providers/anthropic.js +139 -52
  170. package/dist/heart/providers/azure.js +23 -11
  171. package/dist/heart/providers/error-classification.js +127 -0
  172. package/dist/heart/providers/github-copilot.js +145 -0
  173. package/dist/heart/providers/minimax-vlm.js +189 -0
  174. package/dist/heart/providers/minimax.js +26 -8
  175. package/dist/heart/providers/openai-codex-token.js +349 -0
  176. package/dist/heart/providers/openai-codex.js +55 -40
  177. package/dist/heart/runtime-capability-check.js +170 -0
  178. package/dist/heart/runtime-credentials.js +367 -0
  179. package/dist/heart/runtime-cwd.js +87 -0
  180. package/dist/heart/sense-truth.js +17 -4
  181. package/dist/heart/session-activity.js +48 -24
  182. package/dist/heart/session-events.js +1133 -0
  183. package/dist/heart/session-playback-cli-main.js +5 -0
  184. package/dist/heart/session-playback-cli.js +36 -0
  185. package/dist/heart/session-playback.js +231 -0
  186. package/dist/heart/session-stats-cli-main.js +5 -0
  187. package/dist/heart/session-stats.js +182 -0
  188. package/dist/heart/session-transcript.js +133 -0
  189. package/dist/heart/start-of-turn-packet.js +351 -0
  190. package/dist/heart/streaming.js +44 -27
  191. package/dist/heart/structured-output.js +196 -0
  192. package/dist/heart/sync-classification.js +176 -0
  193. package/dist/heart/sync.js +449 -0
  194. package/dist/heart/target-resolution.js +9 -5
  195. package/dist/heart/tempo.js +93 -0
  196. package/dist/heart/temporal-view.js +41 -0
  197. package/dist/heart/timeouts.js +101 -0
  198. package/dist/heart/tool-activity-callbacks.js +59 -0
  199. package/dist/heart/tool-description.js +155 -0
  200. package/dist/heart/tool-friction.js +55 -0
  201. package/dist/heart/tool-loop.js +200 -0
  202. package/dist/heart/turn-context.js +430 -0
  203. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  204. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  205. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  206. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  207. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  208. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  209. package/dist/heart/versioning/update-hooks.js +154 -0
  210. package/dist/heart/work-card.js +386 -0
  211. package/dist/mailbox-ui/assets/index-B-V9vRQ0.js +61 -0
  212. package/dist/mailbox-ui/assets/index-BOZbGbkL.css +1 -0
  213. package/dist/mailbox-ui/index.html +15 -0
  214. package/dist/mailroom/attention.js +167 -0
  215. package/dist/mailroom/autonomy.js +209 -0
  216. package/dist/mailroom/blob-store.js +715 -0
  217. package/dist/mailroom/body-cache.js +61 -0
  218. package/dist/mailroom/core.js +788 -0
  219. package/dist/mailroom/entry.js +160 -0
  220. package/dist/mailroom/file-store.js +568 -0
  221. package/dist/mailroom/mbox-import.js +393 -0
  222. package/dist/mailroom/migration.js +164 -0
  223. package/dist/mailroom/outbound.js +380 -0
  224. package/dist/mailroom/policy.js +263 -0
  225. package/dist/mailroom/reader.js +233 -0
  226. package/dist/mailroom/search-cache.js +334 -0
  227. package/dist/mailroom/search-relevance.js +319 -0
  228. package/dist/mailroom/smtp-ingress.js +176 -0
  229. package/dist/mailroom/source-state.js +176 -0
  230. package/dist/mailroom/thread.js +109 -0
  231. package/dist/mailroom/travel-extract.js +89 -0
  232. package/dist/mind/bundle-manifest.js +21 -2
  233. package/dist/mind/context.js +250 -101
  234. package/dist/mind/desk-section.js +362 -0
  235. package/dist/mind/diary-integrity.js +60 -0
  236. package/dist/mind/{memory.js → diary.js} +68 -77
  237. package/dist/mind/embedding-provider.js +60 -0
  238. package/dist/mind/file-state.js +179 -0
  239. package/dist/mind/friends/channel.js +48 -0
  240. package/dist/mind/friends/resolver.js +107 -4
  241. package/dist/mind/friends/store-file.js +61 -4
  242. package/dist/mind/friends/types.js +2 -2
  243. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  244. package/dist/mind/obligation-steering.js +221 -0
  245. package/dist/mind/pending.js +6 -1
  246. package/dist/mind/prompt-refresh.js +3 -2
  247. package/dist/mind/prompt.js +1015 -140
  248. package/dist/mind/provenance-trust.js +26 -0
  249. package/dist/mind/record-paths.js +312 -0
  250. package/dist/mind/scrutiny.js +173 -0
  251. package/dist/nerves/cli-logging.js +7 -1
  252. package/dist/nerves/coverage/audit-rules.js +15 -6
  253. package/dist/nerves/coverage/audit.js +28 -2
  254. package/dist/nerves/coverage/cli.js +1 -1
  255. package/dist/nerves/coverage/contract.js +5 -5
  256. package/dist/nerves/coverage/file-completeness.js +139 -5
  257. package/dist/nerves/event-buffer.js +111 -0
  258. package/dist/nerves/index.js +224 -4
  259. package/dist/nerves/observation.js +20 -0
  260. package/dist/nerves/redact.js +79 -0
  261. package/dist/nerves/review/cli-main.js +5 -0
  262. package/dist/nerves/review/cli.js +156 -0
  263. package/dist/nerves/review/core.js +152 -0
  264. package/dist/nerves/runtime.js +5 -1
  265. package/dist/repertoire/ado-client.js +15 -56
  266. package/dist/repertoire/ado-semantic.js +16 -10
  267. package/dist/repertoire/api-client.js +97 -0
  268. package/dist/repertoire/bitwarden-store.js +1041 -0
  269. package/dist/repertoire/bundle-templates.js +71 -0
  270. package/dist/repertoire/bw-installer.js +180 -0
  271. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  272. package/dist/repertoire/coding/context-pack.js +331 -0
  273. package/dist/repertoire/coding/feedback.js +197 -30
  274. package/dist/repertoire/coding/manager.js +166 -10
  275. package/dist/repertoire/coding/spawner.js +55 -9
  276. package/dist/repertoire/coding/tools.js +219 -7
  277. package/dist/repertoire/commerce-errors.js +109 -0
  278. package/dist/repertoire/commerce-self-test.js +156 -0
  279. package/dist/repertoire/credential-access.js +178 -0
  280. package/dist/repertoire/desk/classifier.js +362 -0
  281. package/dist/repertoire/duffel-client.js +185 -0
  282. package/dist/repertoire/github-client.js +14 -55
  283. package/dist/repertoire/graph-client.js +11 -52
  284. package/dist/repertoire/guardrails.js +159 -25
  285. package/dist/repertoire/mcp-client.js +295 -0
  286. package/dist/repertoire/mcp-manager.js +434 -0
  287. package/dist/repertoire/mcp-tools.js +83 -0
  288. package/dist/repertoire/plugin-mcp.js +175 -0
  289. package/dist/repertoire/plugins.js +253 -0
  290. package/dist/repertoire/shell-sessions.js +133 -0
  291. package/dist/repertoire/skills.js +48 -4
  292. package/dist/repertoire/stripe-client.js +131 -0
  293. package/dist/repertoire/tool-results.js +29 -0
  294. package/dist/repertoire/tools-a2a.js +283 -0
  295. package/dist/repertoire/tools-attachments.js +317 -0
  296. package/dist/repertoire/tools-awaiting.js +372 -0
  297. package/dist/repertoire/tools-base.js +63 -1082
  298. package/dist/repertoire/tools-bluebubbles.js +2 -0
  299. package/dist/repertoire/tools-bridge.js +144 -0
  300. package/dist/repertoire/tools-bundle.js +993 -0
  301. package/dist/repertoire/tools-commerce.js +253 -0
  302. package/dist/repertoire/tools-config.js +186 -0
  303. package/dist/repertoire/tools-continuity.js +252 -0
  304. package/dist/repertoire/tools-credential.js +383 -0
  305. package/dist/repertoire/tools-evolution.js +527 -0
  306. package/dist/repertoire/tools-files.js +344 -0
  307. package/dist/repertoire/tools-flight.js +290 -0
  308. package/dist/repertoire/tools-flow.js +119 -0
  309. package/dist/repertoire/tools-github.js +3 -8
  310. package/dist/repertoire/tools-mail.js +1975 -0
  311. package/dist/repertoire/tools-notes.js +418 -0
  312. package/dist/repertoire/tools-obligations.js +143 -0
  313. package/dist/repertoire/tools-orientation.js +31 -0
  314. package/dist/repertoire/tools-record.js +469 -0
  315. package/dist/repertoire/tools-runtime.js +150 -0
  316. package/dist/repertoire/tools-session.js +766 -0
  317. package/dist/repertoire/tools-shell.js +120 -0
  318. package/dist/repertoire/tools-stripe.js +224 -0
  319. package/dist/repertoire/tools-surface.js +344 -0
  320. package/dist/repertoire/tools-teams.js +12 -39
  321. package/dist/repertoire/tools-travel.js +125 -0
  322. package/dist/repertoire/tools-trip.js +982 -0
  323. package/dist/repertoire/tools-user-profile.js +146 -0
  324. package/dist/repertoire/tools-vault.js +40 -0
  325. package/dist/repertoire/tools-voice.js +145 -0
  326. package/dist/repertoire/tools.js +243 -79
  327. package/dist/repertoire/travel-api-client.js +360 -0
  328. package/dist/repertoire/user-profile.js +131 -0
  329. package/dist/repertoire/vault-setup.js +246 -0
  330. package/dist/repertoire/vault-unlock.js +594 -0
  331. package/dist/scripts/claude-code-hook.js +41 -0
  332. package/dist/scripts/claude-code-stop-hook.js +47 -0
  333. package/dist/senses/a2a-entry.js +78 -0
  334. package/dist/senses/attention-queue.js +186 -0
  335. package/dist/senses/await-turn-message.js +58 -0
  336. package/dist/senses/bluebubbles/active-turns.js +216 -0
  337. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  338. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  339. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  340. package/dist/senses/bluebubbles/entry.js +77 -0
  341. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  342. package/dist/senses/bluebubbles/index.js +2737 -0
  343. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  344. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  345. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  346. package/dist/senses/bluebubbles/processed-log.js +133 -0
  347. package/dist/senses/bluebubbles/replay.js +137 -0
  348. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  349. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  350. package/dist/senses/bluebubbles-meta-guard.js +40 -0
  351. package/dist/senses/cli/bracketed-paste.js +82 -0
  352. package/dist/senses/cli/image-paste.js +287 -0
  353. package/dist/senses/cli/image-ref-navigation.js +75 -0
  354. package/dist/senses/cli/ink-app.js +156 -0
  355. package/dist/senses/cli/inline-diff.js +64 -0
  356. package/dist/senses/cli/input-keys.js +174 -0
  357. package/dist/senses/cli/kill-ring.js +86 -0
  358. package/dist/senses/cli/message-list.js +51 -0
  359. package/dist/senses/cli/ouro-tui.js +607 -0
  360. package/dist/senses/cli/spinner-imperative.js +135 -0
  361. package/dist/senses/cli/spinner.js +101 -0
  362. package/dist/senses/cli/status-line.js +60 -0
  363. package/dist/senses/cli/streaming-markdown.js +526 -0
  364. package/dist/senses/cli/tool-display.js +85 -0
  365. package/dist/senses/cli/tool-render.js +85 -0
  366. package/dist/senses/cli/tui-store.js +240 -0
  367. package/dist/senses/cli/virtual-list.js +35 -0
  368. package/dist/senses/cli-entry.js +60 -8
  369. package/dist/senses/cli-layout.js +100 -0
  370. package/dist/senses/cli.js +517 -204
  371. package/dist/senses/commands.js +66 -3
  372. package/dist/senses/habit-turn-message.js +122 -0
  373. package/dist/senses/inner-dialog-worker.js +303 -22
  374. package/dist/senses/inner-dialog.js +525 -41
  375. package/dist/senses/mail-entry.js +66 -0
  376. package/dist/senses/mail.js +379 -0
  377. package/dist/senses/pipeline.js +857 -180
  378. package/dist/senses/proactive-content-guard.js +51 -0
  379. package/dist/senses/shared-turn.js +419 -0
  380. package/dist/senses/surface-tool.js +108 -0
  381. package/dist/senses/teams-entry.js +60 -8
  382. package/dist/senses/teams.js +390 -98
  383. package/dist/senses/trust-gate.js +100 -5
  384. package/dist/senses/voice/audio-playback.js +237 -0
  385. package/dist/senses/voice/audio-routing.js +119 -0
  386. package/dist/senses/voice/elevenlabs.js +202 -0
  387. package/dist/senses/voice/floor-control.js +431 -0
  388. package/dist/senses/voice/floor-controller.js +115 -0
  389. package/dist/senses/voice/golden-path.js +116 -0
  390. package/dist/senses/voice/index.js +29 -0
  391. package/dist/senses/voice/meeting.js +113 -0
  392. package/dist/senses/voice/outbound.js +190 -0
  393. package/dist/senses/voice/phone.js +33 -0
  394. package/dist/senses/voice/playback.js +139 -0
  395. package/dist/senses/voice/realtime-eval.js +496 -0
  396. package/dist/senses/voice/realtime-trace.js +531 -0
  397. package/dist/senses/voice/transcript.js +70 -0
  398. package/dist/senses/voice/turn.js +191 -0
  399. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  400. package/dist/senses/voice/twilio-phone.js +5079 -0
  401. package/dist/senses/voice/types.js +2 -0
  402. package/dist/senses/voice/whisper.js +161 -0
  403. package/dist/senses/voice-entry.js +81 -0
  404. package/dist/senses/voice-realtime-eval-command.js +99 -0
  405. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  406. package/dist/senses/voice-twilio-entry.js +87 -0
  407. package/dist/trips/core.js +138 -0
  408. package/dist/trips/store.js +265 -0
  409. package/dist/util/frontmatter.js +69 -0
  410. package/package.json +55 -12
  411. package/skills/agent-commerce.md +113 -0
  412. package/skills/browser-navigation.md +117 -0
  413. package/skills/commerce-setup-guide.md +116 -0
  414. package/skills/commerce-setup.md +84 -0
  415. package/skills/configure-dev-tools.md +99 -0
  416. package/skills/travel-planning.md +138 -0
  417. package/dist/heart/daemon/auth-flow.js +0 -351
  418. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  419. package/dist/heart/daemon/update-hooks.js +0 -138
  420. package/dist/heart/safe-workspace.js +0 -228
  421. package/dist/heart/session-recall.js +0 -116
  422. package/dist/repertoire/tasks/board.js +0 -134
  423. package/dist/repertoire/tasks/index.js +0 -224
  424. package/dist/repertoire/tasks/lifecycle.js +0 -80
  425. package/dist/repertoire/tasks/middleware.js +0 -65
  426. package/dist/repertoire/tasks/parser.js +0 -173
  427. package/dist/repertoire/tasks/scanner.js +0 -132
  428. package/dist/repertoire/tasks/transitions.js +0 -144
  429. package/dist/senses/bluebubbles-entry.js +0 -13
  430. package/dist/senses/bluebubbles.js +0 -1177
  431. package/dist/senses/debug-activity.js +0 -148
  432. package/subagents/README.md +0 -7
  433. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  434. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  435. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  436. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  437. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  438. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  439. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  440. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  441. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  442. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  443. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  444. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  445. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  446. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  447. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  448. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  449. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,265 @@
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.TripNotFoundError = void 0;
37
+ exports.ensureAgentTripLedger = ensureAgentTripLedger;
38
+ exports.readAgentTripKeypair = readAgentTripKeypair;
39
+ exports.upsertTripRecord = upsertTripRecord;
40
+ exports.readTripRecord = readTripRecord;
41
+ exports.listTripIds = listTripIds;
42
+ const fs = __importStar(require("node:fs"));
43
+ const path = __importStar(require("node:path"));
44
+ const identity_1 = require("../heart/identity");
45
+ const runtime_1 = require("../nerves/runtime");
46
+ const core_1 = require("./core");
47
+ function tripsRoot(agentName) {
48
+ return path.join((0, identity_1.getAgentRoot)(agentName), "trips");
49
+ }
50
+ function legacyTripsRoot(agentName) {
51
+ return path.join((0, identity_1.getAgentRoot)(agentName), "state", "trips");
52
+ }
53
+ function ledgerPath(agentName) {
54
+ return path.join(tripsRoot(agentName), "ledger.json");
55
+ }
56
+ function recordsDir(agentName) {
57
+ return path.join(tripsRoot(agentName), "records");
58
+ }
59
+ function recordPath(agentName, tripId) {
60
+ return path.join(recordsDir(agentName), `${tripId}.json`);
61
+ }
62
+ function ledgerPathFor(root) {
63
+ return path.join(root, "ledger.json");
64
+ }
65
+ function recordsDirFor(root) {
66
+ return path.join(root, "records");
67
+ }
68
+ function removeMigrationTempRoot(tmpRoot) {
69
+ const records = recordsDirFor(tmpRoot);
70
+ if (fs.existsSync(records)) {
71
+ for (const entry of fs.readdirSync(records)) {
72
+ fs.unlinkSync(path.join(records, entry));
73
+ }
74
+ fs.rmdirSync(records);
75
+ }
76
+ const ledger = ledgerPathFor(tmpRoot);
77
+ if (fs.existsSync(ledger)) {
78
+ fs.unlinkSync(ledger);
79
+ }
80
+ if (fs.existsSync(tmpRoot)) {
81
+ fs.rmdirSync(tmpRoot);
82
+ }
83
+ }
84
+ function copyLegacyTripsIfNeeded(agentName) {
85
+ const durableRoot = tripsRoot(agentName);
86
+ const legacyRoot = legacyTripsRoot(agentName);
87
+ if (fs.existsSync(durableRoot) || !fs.existsSync(ledgerPathFor(legacyRoot))) {
88
+ return;
89
+ }
90
+ const tmpRoot = `${durableRoot}.tmp-${process.pid}-${Date.now()}`;
91
+ removeMigrationTempRoot(tmpRoot);
92
+ try {
93
+ fs.mkdirSync(recordsDirFor(tmpRoot), { recursive: true });
94
+ fs.copyFileSync(ledgerPathFor(legacyRoot), ledgerPathFor(tmpRoot));
95
+ const legacyRecordsDir = recordsDirFor(legacyRoot);
96
+ if (fs.existsSync(legacyRecordsDir)) {
97
+ for (const entry of fs.readdirSync(legacyRecordsDir)) {
98
+ if (entry.endsWith(".json")) {
99
+ fs.copyFileSync(path.join(legacyRecordsDir, entry), path.join(recordsDirFor(tmpRoot), entry));
100
+ }
101
+ }
102
+ }
103
+ fs.renameSync(tmpRoot, durableRoot);
104
+ }
105
+ catch (error) {
106
+ removeMigrationTempRoot(tmpRoot);
107
+ throw error;
108
+ }
109
+ }
110
+ function collectStoreFiles(root) {
111
+ const files = [];
112
+ if (fs.existsSync(ledgerPathFor(root))) {
113
+ files.push("ledger.json");
114
+ }
115
+ const records = recordsDirFor(root);
116
+ if (fs.existsSync(records)) {
117
+ for (const entry of fs.readdirSync(records)) {
118
+ if (entry.endsWith(".json")) {
119
+ files.push(`records/${entry}`);
120
+ }
121
+ }
122
+ }
123
+ return files.sort();
124
+ }
125
+ function fileAt(root, relativePath) {
126
+ return path.join(root, ...relativePath.split("/"));
127
+ }
128
+ function findLegacyDifferences(durableRoot, legacyRoot) {
129
+ const paths = new Set([...collectStoreFiles(durableRoot), ...collectStoreFiles(legacyRoot)]);
130
+ const differences = [];
131
+ for (const relativePath of [...paths].sort()) {
132
+ const durablePath = fileAt(durableRoot, relativePath);
133
+ const legacyPath = fileAt(legacyRoot, relativePath);
134
+ const durableExists = fs.existsSync(durablePath);
135
+ const legacyExists = fs.existsSync(legacyPath);
136
+ if (durableExists !== legacyExists) {
137
+ differences.push(relativePath);
138
+ continue;
139
+ }
140
+ if (durableExists && !fs.readFileSync(durablePath).equals(fs.readFileSync(legacyPath))) {
141
+ differences.push(relativePath);
142
+ }
143
+ }
144
+ return differences;
145
+ }
146
+ function reportLegacyDivergence(agentName) {
147
+ const durableRoot = tripsRoot(agentName);
148
+ const legacyRoot = legacyTripsRoot(agentName);
149
+ if (!fs.existsSync(durableRoot) || !fs.existsSync(legacyRoot)) {
150
+ return;
151
+ }
152
+ const differences = findLegacyDifferences(durableRoot, legacyRoot);
153
+ if (differences.length === 0) {
154
+ return;
155
+ }
156
+ (0, runtime_1.emitNervesEvent)({
157
+ level: "warn",
158
+ component: "trips",
159
+ event: "trips.legacy_diverged",
160
+ message: "legacy trip store differs from durable trip store",
161
+ meta: {
162
+ agentId: agentName,
163
+ durablePath: "trips",
164
+ legacyPath: "state/trips",
165
+ differenceCount: differences.length,
166
+ differences: differences.slice(0, 10),
167
+ },
168
+ });
169
+ }
170
+ function prepareTripStorage(agentName) {
171
+ copyLegacyTripsIfNeeded(agentName);
172
+ reportLegacyDivergence(agentName);
173
+ }
174
+ function readJsonFile(filePath) {
175
+ if (!fs.existsSync(filePath))
176
+ return null;
177
+ return JSON.parse(fs.readFileSync(filePath, "utf-8"));
178
+ }
179
+ function writeJsonAtomic(filePath, value) {
180
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
181
+ const tmp = `${filePath}.tmp`;
182
+ fs.writeFileSync(tmp, JSON.stringify(value, null, 2), "utf-8");
183
+ fs.renameSync(tmp, filePath);
184
+ }
185
+ class TripNotFoundError extends Error {
186
+ statusCode = 404;
187
+ constructor(input) {
188
+ super(`trip not found: agent=${input.agentName} trip=${input.tripId}`);
189
+ }
190
+ }
191
+ exports.TripNotFoundError = TripNotFoundError;
192
+ /**
193
+ * Idempotent — if the agent already has a ledger on disk, return it; otherwise
194
+ * generate a fresh keypair and persist both halves.
195
+ */
196
+ function ensureAgentTripLedger(input) {
197
+ prepareTripStorage(input.agentName);
198
+ const existing = readJsonFile(ledgerPath(input.agentName));
199
+ if (existing) {
200
+ return { ledger: existing.ledger, added: false };
201
+ }
202
+ const created = (0, core_1.newTripLedgerRecord)({
203
+ agentId: input.agentName,
204
+ ...(input.label ? { label: input.label } : {}),
205
+ ...(input.now ? { now: input.now } : {}),
206
+ });
207
+ const stored = {
208
+ schemaVersion: 1,
209
+ ledger: created.ledger,
210
+ privateKeyPem: created.keypair.privateKeyPem,
211
+ };
212
+ writeJsonAtomic(ledgerPath(input.agentName), stored);
213
+ (0, runtime_1.emitNervesEvent)({
214
+ component: "trips",
215
+ event: "trips.ledger_created",
216
+ message: "agent trip ledger keypair created",
217
+ meta: { agentId: input.agentName, ledgerId: created.ledger.ledgerId, keyId: created.ledger.keyId },
218
+ });
219
+ return { ledger: created.ledger, added: true };
220
+ }
221
+ function readLedgerOrThrow(agentName) {
222
+ prepareTripStorage(agentName);
223
+ const stored = readJsonFile(ledgerPath(agentName));
224
+ if (!stored) {
225
+ throw new Error(`no trip ledger for agent ${agentName} — call ensureAgentTripLedger first`);
226
+ }
227
+ return stored;
228
+ }
229
+ function readAgentTripKeypair(agentName) {
230
+ const stored = readLedgerOrThrow(agentName);
231
+ return {
232
+ keyId: stored.ledger.keyId,
233
+ publicKeyPem: stored.ledger.publicKeyPem,
234
+ privateKeyPem: stored.privateKeyPem,
235
+ };
236
+ }
237
+ function upsertTripRecord(agentName, trip) {
238
+ const stored = readLedgerOrThrow(agentName);
239
+ const payload = (0, core_1.encryptTripRecord)(trip, stored.ledger.publicKeyPem, stored.ledger.keyId);
240
+ writeJsonAtomic(recordPath(agentName, trip.tripId), payload);
241
+ (0, runtime_1.emitNervesEvent)({
242
+ component: "trips",
243
+ event: "trips.record_upserted",
244
+ message: "trip record upserted",
245
+ meta: { agentId: agentName, tripId: trip.tripId, legCount: trip.legs.length, status: trip.status },
246
+ });
247
+ }
248
+ function readTripRecord(agentName, tripId) {
249
+ prepareTripStorage(agentName);
250
+ const payload = readJsonFile(recordPath(agentName, tripId));
251
+ if (!payload)
252
+ throw new TripNotFoundError({ agentName, tripId });
253
+ const stored = readLedgerOrThrow(agentName);
254
+ return (0, core_1.decryptTripRecord)(payload, stored.privateKeyPem);
255
+ }
256
+ function listTripIds(agentName) {
257
+ prepareTripStorage(agentName);
258
+ const dir = recordsDir(agentName);
259
+ if (!fs.existsSync(dir))
260
+ return [];
261
+ return fs.readdirSync(dir)
262
+ .filter((entry) => entry.endsWith(".json"))
263
+ .map((entry) => entry.slice(0, -".json".length))
264
+ .sort();
265
+ }
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ /**
3
+ * Shared YAML-ish frontmatter parser.
4
+ *
5
+ * Originally lived in `src/repertoire/tasks/parser.ts`. Hoisted to
6
+ * `src/util/` as part of W6 Unit 8b so habit-parser, habit-migration,
7
+ * and await-parser can consume it without depending on the deprecated
8
+ * task module. Behavior unchanged from the original implementation.
9
+ *
10
+ * This is a pure-data helper: no side effects, no nerves observability of
11
+ * its own. Callers (habit-parser, await-parser, etc.) emit nerves events
12
+ * around parse calls, which is the right ownership boundary.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.parseFrontmatter = parseFrontmatter;
16
+ function parseScalar(raw) {
17
+ const value = raw.trim();
18
+ if (value === "null")
19
+ return null;
20
+ if (value === "true")
21
+ return true;
22
+ if (value === "false")
23
+ return false;
24
+ if (value === "[]")
25
+ return [];
26
+ if ((value.startsWith("\"") && value.endsWith("\"")) || (value.startsWith("'") && value.endsWith("'"))) {
27
+ return value.slice(1, -1);
28
+ }
29
+ return value;
30
+ }
31
+ function parseFrontmatter(raw) {
32
+ const frontmatter = {};
33
+ const lines = raw.split(/\r?\n/);
34
+ for (let idx = 0; idx < lines.length; idx += 1) {
35
+ const line = lines[idx];
36
+ if (!line.trim())
37
+ continue;
38
+ const match = /^([A-Za-z0-9_:-]+):\s*(.*)$/.exec(line);
39
+ if (!match)
40
+ continue;
41
+ const key = match[1];
42
+ const inline = match[2];
43
+ if (inline.length > 0) {
44
+ frontmatter[key] = parseScalar(inline);
45
+ continue;
46
+ }
47
+ const items = [];
48
+ let cursor = idx + 1;
49
+ while (cursor < lines.length && /^\s*-\s+/.test(lines[cursor])) {
50
+ items.push(parseScalar(lines[cursor].replace(/^\s*-\s+/, "")));
51
+ cursor += 1;
52
+ }
53
+ if (items.length > 0) {
54
+ frontmatter[key] = items;
55
+ idx = cursor - 1;
56
+ continue;
57
+ }
58
+ const nested = {};
59
+ cursor = idx + 1;
60
+ while (cursor < lines.length && /^\s+[A-Za-z0-9_:-]+:\s*/.test(lines[cursor])) {
61
+ const child = /^\s+([A-Za-z0-9_:-]+):\s*(.*)$/.exec(lines[cursor]);
62
+ nested[child[1]] = parseScalar(child[2]);
63
+ cursor += 1;
64
+ }
65
+ frontmatter[key] = Object.keys(nested).length > 0 ? nested : items;
66
+ idx = cursor - 1;
67
+ }
68
+ return frontmatter;
69
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ouro.bot/cli",
3
- "version": "0.1.0-alpha.66",
3
+ "version": "0.1.0-alpha.661",
4
4
  "main": "dist/heart/daemon/ouro-entry.js",
5
5
  "bin": {
6
6
  "cli": "dist/heart/daemon/ouro-bot-entry.js",
@@ -9,8 +9,9 @@
9
9
  },
10
10
  "files": [
11
11
  "dist/",
12
- "AdoptionSpecialist.ouro/",
13
- "subagents/",
12
+ "SerpentGuide.ouro/",
13
+ "RepairGuide.ouro/",
14
+ "skills/",
14
15
  "assets/",
15
16
  "changelog.json"
16
17
  ],
@@ -19,37 +20,79 @@
19
20
  "./runOuroCli": "./dist/heart/daemon/daemon-cli.js"
20
21
  },
21
22
  "scripts": {
22
- "dev": "tsc && node dist/senses/cli-entry.js --agent ouroboros",
23
+ "dev": "tsc && node dist/heart/daemon/ouro-bot-entry.js dev",
24
+ "cli": "tsc && node dist/senses/cli-entry.js",
23
25
  "daemon": "tsc && node dist/heart/daemon/daemon-entry.js",
24
26
  "ouro": "tsc && node dist/heart/daemon/ouro-entry.js",
25
27
  "teams": "tsc && node dist/senses/teams-entry.js --agent ouroboros",
26
- "bluebubbles": "tsc && node dist/senses/bluebubbles-entry.js --agent ouroboros",
28
+ "bluebubbles": "tsc && node dist/senses/bluebubbles/entry.js --agent ouroboros",
29
+ "voice:eval": "npm run build && node dist/senses/voice-realtime-eval-entry.js",
30
+ "worktree:bootstrap": "npm install --ignore-scripts",
27
31
  "test": "vitest run",
32
+ "test:integration": "npm run build && vitest run --config vitest.integration.config.ts",
33
+ "test:e2e:package": "npm run build && node scripts/package-e2e.cjs",
34
+ "test:e2e:real-smoke": "npm run build && node scripts/nightly-real-smoke.cjs",
35
+ "typecheck:mailbox-ui": "tsc --noEmit -p packages/mailbox-ui/tsconfig.json",
36
+ "test:mailbox-ui": "npm test --prefix packages/mailbox-ui",
28
37
  "test:coverage:vitest": "vitest run --coverage",
29
38
  "test:coverage": "node scripts/run-coverage-gate.cjs",
30
- "build": "tsc",
39
+ "build": "node scripts/build.cjs",
31
40
  "lint": "eslint src/",
41
+ "package:verify-assets": "node scripts/package-assets.cjs",
42
+ "prepack": "npm run build && npm run package:verify-assets",
43
+ "release:bump": "node scripts/release-bump.cjs",
44
+ "release:preflight": "node scripts/release-preflight.cjs",
45
+ "release:trust:check": "node scripts/npm-trusted-publishers.cjs check",
46
+ "release:trust:repair-plan": "node scripts/npm-trusted-publishers.cjs repair-plan",
47
+ "release:trust:repair": "node scripts/npm-trusted-publishers.cjs repair",
48
+ "release:smoke": "node scripts/release-smoke.cjs",
32
49
  "audit:nerves": "npm run build && node dist/nerves/coverage/cli-main.js"
33
50
  },
34
51
  "dependencies": {
35
52
  "@anthropic-ai/sdk": "^0.78.0",
36
53
  "@azure/identity": "^4.13.0",
37
- "@microsoft/teams.apps": "^2.0.5",
38
- "@microsoft/teams.dev": "^2.0.5",
54
+ "@azure/storage-blob": "^12.31.0",
55
+ "@microsoft/teams.api": "2.0.11",
56
+ "@microsoft/teams.apps": "2.0.11",
57
+ "@microsoft/teams.cards": "2.0.11",
58
+ "@microsoft/teams.common": "2.0.11",
59
+ "@microsoft/teams.dev": "2.0.11",
60
+ "@microsoft/teams.graph": "2.0.11",
61
+ "@types/react": "^17.0.91",
62
+ "@types/ws": "^8.18.1",
39
63
  "fast-glob": "^3.3.3",
64
+ "ink": "^3.2.0",
65
+ "mailparser": "^3.9.8",
40
66
  "openai": "^6.27.0",
41
- "semver": "^7.7.4"
67
+ "react": "^17.0.2",
68
+ "semver": "^7.7.4",
69
+ "smtp-server": "^3.18.4",
70
+ "stripe": "^22.0.0",
71
+ "ws": "^8.20.0"
42
72
  },
43
73
  "repository": {
44
74
  "type": "git",
45
- "url": "https://github.com/ouroborosbot/ouroboros"
75
+ "url": "git+https://github.com/ourostack/ouroboros.git"
46
76
  },
47
77
  "devDependencies": {
78
+ "@testing-library/react": "^16.3.2",
79
+ "@types/mailparser": "^3.4.6",
48
80
  "@types/semver": "^7.7.1",
49
- "@vitest/coverage-v8": "^4.0.18",
81
+ "@types/smtp-server": "^3.5.13",
82
+ "@vitest/coverage-v8": "^4.1.8",
50
83
  "eslint": "^10.0.2",
84
+ "jsdom": "^29.0.2",
51
85
  "typescript": "^5.7.0",
52
86
  "typescript-eslint": "^8.56.1",
53
- "vitest": "^4.0.18"
87
+ "vitest": "^4.1.8"
88
+ },
89
+ "overrides": {
90
+ "@microsoft/teams.apps": {
91
+ "@azure/msal-node": "^5.2.2"
92
+ },
93
+ "@testing-library/react": {
94
+ "react": "$react",
95
+ "@types/react": "$@types/react"
96
+ }
54
97
  }
55
98
  }
@@ -0,0 +1,113 @@
1
+ # Agent Commerce Skill
2
+
3
+ How to book, purchase, and pay for things on behalf of humans.
4
+
5
+ ## Three Patterns
6
+
7
+ ### Pattern A: API (Structured, Preferred)
8
+
9
+ For services with direct API access: Duffel flights, LiteAPI hotels.
10
+
11
+ 1. Search using the API tool (`flight_search`, LiteAPI MCP)
12
+ 2. Present options to the human with prices and details
13
+ 3. Create a checkout preview with `commerce_checkout_preview` for the exact merchant, item, amount, currency, allowed tool, and exact tool constraints
14
+ 4. Human approves in a new message that exactly equals the preview's `confirmationMessage`, including checkout id, digest, merchant, amount, currency, allowed tool, and constraints
15
+ 5. Commit the preview with `commerce_checkout_commit`; then call the approved payment or booking tool with the exact amount, currency, and constraints from the preview. Ouro consumes the matching authority without exposing a bearer token in the transcript.
16
+ 6. Book using the API tool with passenger data from `user_profile_get`
17
+ 7. Create a single-use virtual card via `stripe_create_card` when needed
18
+ 8. Complete payment through the API
19
+ 9. Deactivate the card via `stripe_deactivate_card`
20
+ 10. Confirm booking to the human and record/read back the receipt with `commerce_receipt_get`
21
+
22
+ **Key tools**: `commerce_checkout_preview`, `commerce_checkout_commit`, `commerce_receipt_get`, `flight_search`, `flight_book`, `flight_cancel`, `user_profile_get`, `user_profile_store`, `stripe_create_card`, `stripe_deactivate_card`, `stripe_list_cards`
23
+
24
+ ### Pattern B: Browser (Best-Effort)
25
+
26
+ For sites without API access, use browser automation via Playwright MCP.
27
+
28
+ 1. Navigate to the booking site
29
+ 2. Search for the requested service
30
+ 3. Fill forms using data from `user_profile_get`
31
+ 4. Create and commit a checkout preview before entering payment details
32
+ 5. Use a virtual card from `stripe_create_card` for payment
33
+ 6. If blocked by anti-bot measures, fall back to Pattern C
34
+ 7. Complete and confirm the booking
35
+
36
+ **Limitations**: Browser automation is fragile. Sites may block, layouts change, CAPTCHAs appear. Always have Pattern C as fallback.
37
+
38
+ ### Pattern C: Link-Only (Primary for Hostile Sites)
39
+
40
+ For sites that block automation or require complex human interaction.
41
+
42
+ 1. Research the best options using browser tools or API tools
43
+ 2. Prepare a curated link with pre-filled parameters where possible
44
+ 3. Send the link to the human with a summary of what to book
45
+ 4. Human completes the booking in their own browser
46
+
47
+ **When to use**: Always use Pattern C as the primary approach for sites known to block automation (most airline direct sites, hotel chains, rental car sites). Pattern B is best-effort, not reliable.
48
+
49
+ ## Payment autonomy Levels
50
+
51
+ - **Level 0**: No autonomous payments. Agent researches, human pays manually.
52
+ - **Level 1**: Agent creates virtual cards, human approves each transaction explicitly.
53
+ - **Level 2**: Agent can book pre-approved items (within budget, approved categories) without per-transaction approval.
54
+ - **Level 3**: Full delegation with spending limits. Agent manages a budget and books as needed.
55
+
56
+ Default is Level 1. Level changes require explicit human approval.
57
+
58
+ ## Commerce Authority
59
+
60
+ Money-moving tools (`stripe_create_card`, `flight_hold`, `flight_book`) require a one-use confirmed commerce authority. This is the local AP2-compatible primitive: an exact mandate record with merchant, amount, currency, allowed tool, exact tool constraints, reason, digest, expiry, confirmation, reservation/attempt/consumption state, and access log. `commerce_checkout_commit` confirms the authority but does not reveal a live bearer token to the model; the runtime reserves the one matching confirmed authority under a checkout lock, marks it attempted before crossing an external provider boundary, and consumes it only after the successful side effect is verified. A pre-attempt validation failure can release the reservation; an attempted Stripe/Duffel call stays non-replayable so ambiguous provider failures cannot create duplicate cards or bookings. Stripe card authority must include exact `type` and `merchant_categories` constraints so the card is counterparty/category-bound. If the tool, amount, currency, offer id, card type, merchant category, or other constraint changes, create a new preview and get a new confirmation.
61
+
62
+ ## Error Handling
63
+
64
+ ### Price Change Guard
65
+ Before completing a booking, verify the final price matches the approved price within 5%. If the price changed more than 5%, stop and report to the human. Never pay a price the human didn't approve.
66
+
67
+ ### Partial Failure Reporting
68
+ When booking involves multiple services (e.g., flight + hotel), each service may succeed or fail independently — this is a partial failure scenario. Report the status of each service separately. **Never auto-cancel a successful booking because a related booking failed.** Let the human decide.
69
+
70
+ Example: "Flight SFO-JFK booked (confirmation: ABC123). Hotel booking failed: no availability for those dates. Would you like me to search for alternative hotels?"
71
+
72
+ ### Refund Flow
73
+ If a booking fails after card creation:
74
+ 1. Deactivate the virtual card immediately
75
+ 2. Report the failure to the human
76
+ 3. If a charge was made, note it for the human to follow up with the provider
77
+
78
+ ## CAPTCHA Handling
79
+
80
+ When a CAPTCHA appears during browser automation (Pattern B):
81
+ 1. Take a screenshot and send it to the human
82
+ 2. Explain what page you're on and what you were trying to do
83
+ 3. Ask the human to solve the CAPTCHA in their own browser
84
+ 4. Switch to Pattern C (link-only) for this transaction
85
+
86
+ Never attempt to solve CAPTCHAs programmatically.
87
+
88
+ ## Card Number Isolation
89
+
90
+ Card numbers must NEVER appear in:
91
+ - Tool return values shown to the model
92
+ - Nerves events or logs
93
+ - Chat messages to the human
94
+ - Any stored state or written notes
95
+
96
+ The only place card numbers exist is inside the Stripe client's internal payment flow functions, scoped to a single function call. The model only ever sees card IDs and last-4 digits.
97
+
98
+ ## Profile Data Usage
99
+
100
+ Access profile data only when needed for the current transaction:
101
+ - `user_profile_get` to retrieve specific fields (never dump full profile)
102
+ - Passport data only for international bookings
103
+ - Loyalty program numbers only when booking with that program
104
+ - Emergency contact only when the booking service requires it
105
+
106
+ ## Self-Test
107
+
108
+ Before first use, run the commerce self-test to verify all services are configured:
109
+ - Stripe: creates and deactivates a test virtual card
110
+ - Duffel: runs a test flight search
111
+ - LiteAPI: verifies API key in vault
112
+
113
+ Report results to the human with actionable next steps for any failures.
@@ -0,0 +1,117 @@
1
+ # Browser Navigation Skill
2
+
3
+ When to use browser tools and how to navigate effectively.
4
+
5
+ ## When to Use Browser Tools
6
+
7
+ Use browser navigation when:
8
+ - The target site has no API (e.g., Airbnb, VRBO, travel blogs)
9
+ - Content is dynamic or requires JavaScript rendering
10
+ - Login-required pages need session-based access
11
+ - You need to verify visual content (screenshots, layouts)
12
+ - Price comparison requires real-time scraping
13
+
14
+ Do NOT use browser tools when:
15
+ - A dedicated API or MCP server exists (prefer `weather_lookup`, Duffel MCP, etc.)
16
+ - The data is available via a public JSON endpoint
17
+ - The task can be completed with `web_search`
18
+
19
+ ## Stealth Browsing Best Practices
20
+
21
+ The `@playwright/mcp` server is configured with realistic user-agent and viewport settings. To avoid detection on travel sites:
22
+
23
+ - **Add delays between navigations**: Wait 2-5 seconds between page loads. Never hammer requests in rapid succession.
24
+ - **Vary timing**: Use random delays rather than fixed intervals (e.g., 2-5s, not exactly 3s every time).
25
+ - **Avoid predictable patterns**: Don't navigate the same path repeatedly in short succession.
26
+ - **Use realistic scroll behavior**: Scroll gradually through pages rather than jumping to specific elements.
27
+ - **Respect robots.txt**: Check for rate limits and crawling restrictions.
28
+
29
+ ## Navigation Workflow
30
+
31
+ Follow this pattern for every page interaction:
32
+
33
+ 1. **Navigate**: Use `browser_navigate` to load the page
34
+ 2. **Wait**: Allow the page to fully load (use `browser_wait` if needed)
35
+ 3. **Snapshot**: Take a `browser_snapshot` to understand the page structure
36
+ 4. **Extract**: Parse the accessibility tree for relevant data
37
+ 5. **Screenshot** (optional): Use `browser_screenshot` for visual confirmation
38
+
39
+ ## Form Filling Patterns
40
+
41
+ ### Login Flows
42
+ 1. Navigate to the login page
43
+ 2. Take a snapshot to identify form fields
44
+ 3. Use `browser_type` for username/password fields
45
+ 4. Use `browser_click` to submit
46
+ 5. Wait for redirect, then verify login succeeded via snapshot
47
+ 6. NEVER hardcode credentials -- use `credential_get` to retrieve login info
48
+
49
+ ### Sign-up Flows
50
+ 1. Use `credential_generate_password` to mint a strong password for the target domain
51
+ 2. Fill the signup form with that password
52
+ 3. If the site rejects the password policy, generate a new one that matches the site rules
53
+ 4. Once the site accepts the exact password, call `credential_store` immediately
54
+ 5. Do not claim a new credential is saved until `credential_store` succeeds
55
+
56
+ ### Search Forms (Hotels, Flights, Rentals)
57
+ 1. Navigate to the search page
58
+ 2. Snapshot to identify input fields
59
+ 3. Fill location/date fields with `browser_type`
60
+ 4. Select options with `browser_select_option` or `browser_click`
61
+ 5. Submit the search
62
+ 6. Wait for results to load (travel sites often have loading animations)
63
+ 7. Snapshot the results page to extract listings
64
+
65
+ ### Booking Forms
66
+ 1. **ALWAYS confirm with the user before proceeding to payment**
67
+ 2. Fill traveler information
68
+ 3. Use stored credentials for payment (via `credential_get` -- NEVER type raw card numbers)
69
+ 4. Screenshot the final review page for user confirmation
70
+ 5. Only click "Book" / "Confirm" after explicit user approval
71
+
72
+ ## Anti-Bot Detection Avoidance
73
+
74
+ The stealth configuration handles most fingerprinting automatically. Additionally:
75
+
76
+ - **Don't access detection endpoints**: Avoid URLs containing "captcha", "challenge", "verify"
77
+ - **Handle CAPTCHAs**: If you encounter a CAPTCHA, pause and inform the user. Do not attempt automated solving.
78
+ - **Rotate viewport sizes occasionally**: Use different viewport sizes across sessions
79
+ - **Maintain cookies**: Use persistent `user-data-dir` to appear as a returning user
80
+ - **Avoid headless tells**: The user-agent is set to a real browser string
81
+
82
+ ## Travel Site Patterns
83
+
84
+ ### Airbnb / VRBO
85
+ 1. Search by location + check-in/check-out dates + guests
86
+ 2. Results load dynamically -- scroll to load more listings
87
+ 3. Extract: title, price per night, total price, rating, number of reviews
88
+ 4. For detailed info, click into each listing and snapshot
89
+ 5. Compare top 3-5 options
90
+
91
+ ### Hotel Sites (Booking.com, Hotels.com)
92
+ 1. Search by destination + dates + guests + rooms
93
+ 2. Filter by price range, star rating, amenities
94
+ 3. Extract: name, price, location, rating, key amenities
95
+ 4. Check cancellation policies (important for travel planning)
96
+
97
+ ### Flight Comparison
98
+ 1. Prefer Duffel MCP for flight search (structured API data)
99
+ 2. Use browser only if Duffel doesn't cover the airline
100
+ 3. Google Flights is useful for price comparison but requires careful navigation
101
+
102
+ ## Error Handling
103
+
104
+ - **Page timeouts**: Retry once after 5 seconds. If still failing, inform the user.
105
+ - **CAPTCHAs**: Stop and ask the user to solve manually.
106
+ - **Stale elements**: Re-snapshot the page and retry the interaction.
107
+ - **Blocked/403**: The site may have detected automation. Wait 30 seconds and try with a different approach (e.g., direct URL instead of navigation).
108
+ - **Session expired**: Re-login using stored credentials.
109
+
110
+ ## Human Confirmation Gates
111
+
112
+ **ALWAYS** confirm with the user before:
113
+ - Any booking or payment action
114
+ - Entering personal information (name, address, phone)
115
+ - Agreeing to terms of service
116
+ - Subscribing to any service
117
+ - Any action that creates a financial obligation