@ouro.bot/cli 0.1.0-alpha.6 → 0.1.0-alpha.600

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 (440) hide show
  1. package/README.md +229 -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 +4182 -0
  15. package/dist/arc/attention-types.js +8 -0
  16. package/dist/arc/cares.js +140 -0
  17. package/dist/arc/episodes.js +117 -0
  18. package/dist/arc/intentions.js +133 -0
  19. package/dist/arc/json-store.js +117 -0
  20. package/dist/arc/obligations.js +254 -0
  21. package/dist/arc/packets.js +193 -0
  22. package/dist/arc/presence.js +185 -0
  23. package/dist/arc/task-lifecycle.js +65 -0
  24. package/dist/heart/active-work.js +989 -0
  25. package/dist/heart/agent-entry.js +69 -3
  26. package/dist/heart/attachments/image-normalize.js +194 -0
  27. package/dist/heart/attachments/materialize.js +97 -0
  28. package/dist/heart/attachments/originals.js +88 -0
  29. package/dist/heart/attachments/render.js +29 -0
  30. package/dist/heart/attachments/sources/adapter.js +2 -0
  31. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  32. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  33. package/dist/heart/attachments/sources/index.js +16 -0
  34. package/dist/heart/attachments/store.js +103 -0
  35. package/dist/heart/attachments/types.js +93 -0
  36. package/dist/heart/auth/auth-flow.js +479 -0
  37. package/dist/heart/awaiting/await-alert.js +146 -0
  38. package/dist/heart/awaiting/await-expiry.js +108 -0
  39. package/dist/heart/awaiting/await-loader.js +91 -0
  40. package/dist/heart/awaiting/await-parser.js +141 -0
  41. package/dist/heart/awaiting/await-runtime-state.js +97 -0
  42. package/dist/heart/awaiting/await-scheduler.js +377 -0
  43. package/dist/heart/background-operations.js +281 -0
  44. package/dist/heart/bridges/manager.js +358 -0
  45. package/dist/heart/bridges/state-machine.js +135 -0
  46. package/dist/heart/bridges/store.js +123 -0
  47. package/dist/heart/bundle-state.js +168 -0
  48. package/dist/heart/commitments.js +142 -0
  49. package/dist/heart/config-registry.js +322 -0
  50. package/dist/heart/config.js +164 -135
  51. package/dist/heart/core.js +1069 -260
  52. package/dist/heart/cross-chat-delivery.js +131 -0
  53. package/dist/heart/daemon/agent-config-check.js +419 -0
  54. package/dist/heart/daemon/agent-discovery.js +180 -0
  55. package/dist/heart/daemon/agent-service.js +522 -0
  56. package/dist/heart/daemon/agentic-repair.js +547 -0
  57. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  58. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  59. package/dist/heart/daemon/cadence.js +70 -0
  60. package/dist/heart/daemon/cli-defaults.js +776 -0
  61. package/dist/heart/daemon/cli-exec.js +7571 -0
  62. package/dist/heart/daemon/cli-help.js +498 -0
  63. package/dist/heart/daemon/cli-parse.js +1599 -0
  64. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  65. package/dist/heart/daemon/cli-render.js +763 -0
  66. package/dist/heart/daemon/cli-types.js +8 -0
  67. package/dist/heart/daemon/connect-bay.js +323 -0
  68. package/dist/heart/daemon/daemon-cli.js +30 -758
  69. package/dist/heart/daemon/daemon-entry.js +540 -8
  70. package/dist/heart/daemon/daemon-health.js +176 -0
  71. package/dist/heart/daemon/daemon-rollup.js +57 -0
  72. package/dist/heart/daemon/daemon-runtime-sync.js +287 -0
  73. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  74. package/dist/heart/daemon/daemon.js +972 -20
  75. package/dist/heart/daemon/dns-workflow.js +394 -0
  76. package/dist/heart/daemon/doctor-types.js +8 -0
  77. package/dist/heart/daemon/doctor.js +873 -0
  78. package/dist/heart/daemon/health-monitor.js +122 -1
  79. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  80. package/dist/heart/daemon/hooks/bundle-meta.js +206 -0
  81. package/dist/heart/daemon/http-health-probe.js +80 -0
  82. package/dist/heart/daemon/human-command-screens.js +234 -0
  83. package/dist/heart/daemon/human-readiness.js +114 -0
  84. package/dist/heart/daemon/inner-status.js +89 -0
  85. package/dist/heart/daemon/interactive-repair.js +394 -0
  86. package/dist/heart/daemon/launchd.js +188 -0
  87. package/dist/heart/daemon/log-tailer.js +82 -12
  88. package/dist/heart/daemon/logs-prune.js +110 -0
  89. package/dist/heart/daemon/mcp-canary.js +297 -0
  90. package/dist/heart/daemon/message-router.js +17 -8
  91. package/dist/heart/daemon/os-cron-deps.js +135 -0
  92. package/dist/heart/daemon/os-cron.js +14 -12
  93. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  94. package/dist/heart/daemon/ouro-entry.js +3 -1
  95. package/dist/heart/daemon/process-manager.js +381 -26
  96. package/dist/heart/daemon/provider-discovery.js +137 -0
  97. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  98. package/dist/heart/daemon/pulse.js +475 -0
  99. package/dist/heart/daemon/readiness-repair.js +365 -0
  100. package/dist/heart/daemon/run-hooks.js +39 -0
  101. package/dist/heart/daemon/runtime-logging.js +67 -16
  102. package/dist/heart/daemon/runtime-metadata.js +191 -0
  103. package/dist/heart/daemon/runtime-mode.js +67 -0
  104. package/dist/heart/daemon/safe-mode.js +161 -0
  105. package/dist/heart/daemon/sense-manager.js +731 -0
  106. package/dist/heart/daemon/session-id-resolver.js +131 -0
  107. package/dist/heart/daemon/skill-management-installer.js +94 -0
  108. package/dist/heart/daemon/socket-client.js +349 -0
  109. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  110. package/dist/heart/daemon/startup-tui.js +330 -0
  111. package/dist/heart/daemon/task-scheduler.js +3 -25
  112. package/dist/heart/daemon/terminal-ui.js +499 -0
  113. package/dist/heart/daemon/thoughts.js +524 -0
  114. package/dist/heart/daemon/up-progress.js +366 -0
  115. package/dist/heart/daemon/vault-items.js +56 -0
  116. package/dist/heart/delegation.js +62 -0
  117. package/dist/heart/habits/habit-migration.js +189 -0
  118. package/dist/heart/habits/habit-parser.js +140 -0
  119. package/dist/heart/habits/habit-runtime-state.js +100 -0
  120. package/dist/heart/habits/habit-scheduler.js +372 -0
  121. package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
  122. package/dist/heart/{daemon → hatch}/hatch-flow.js +34 -136
  123. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  124. package/dist/heart/hatch/specialist-orchestrator.js +129 -0
  125. package/dist/heart/hatch/specialist-prompt.js +102 -0
  126. package/dist/heart/hatch/specialist-tools.js +306 -0
  127. package/dist/heart/identity.js +281 -67
  128. package/dist/heart/kept-notes.js +357 -0
  129. package/dist/heart/kicks.js +2 -20
  130. package/dist/heart/machine-identity.js +161 -0
  131. package/dist/heart/mail-import-discovery.js +353 -0
  132. package/dist/heart/mailbox/mailbox-http-hooks.js +66 -0
  133. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  134. package/dist/heart/mailbox/mailbox-http-routes.js +246 -0
  135. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  136. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  137. package/dist/heart/mailbox/mailbox-http.js +99 -0
  138. package/dist/heart/mailbox/mailbox-read.js +31 -0
  139. package/dist/heart/mailbox/mailbox-types.js +27 -0
  140. package/dist/heart/mailbox/mailbox-view.js +195 -0
  141. package/dist/heart/mailbox/readers/agent-machine.js +382 -0
  142. package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
  143. package/dist/heart/mailbox/readers/mail.js +367 -0
  144. package/dist/heart/mailbox/readers/runtime-readers.js +651 -0
  145. package/dist/heart/mailbox/readers/sessions.js +232 -0
  146. package/dist/heart/mailbox/readers/shared.js +111 -0
  147. package/dist/heart/mcp/mcp-server.js +656 -0
  148. package/dist/heart/migrate-config.js +100 -0
  149. package/dist/heart/model-capabilities.js +59 -0
  150. package/dist/heart/platform.js +81 -0
  151. package/dist/heart/progress-story.js +42 -0
  152. package/dist/heart/provider-attempt.js +134 -0
  153. package/dist/heart/provider-binding-resolver.js +267 -0
  154. package/dist/heart/provider-credentials.js +425 -0
  155. package/dist/heart/provider-failover.js +301 -0
  156. package/dist/heart/provider-models.js +81 -0
  157. package/dist/heart/provider-ping.js +262 -0
  158. package/dist/heart/provider-readiness-cache.js +40 -0
  159. package/dist/heart/provider-visibility.js +188 -0
  160. package/dist/heart/providers/anthropic-token.js +131 -0
  161. package/dist/heart/providers/anthropic.js +202 -50
  162. package/dist/heart/providers/azure.js +104 -13
  163. package/dist/heart/providers/error-classification.js +127 -0
  164. package/dist/heart/providers/github-copilot.js +145 -0
  165. package/dist/heart/providers/minimax-vlm.js +189 -0
  166. package/dist/heart/providers/minimax.js +29 -7
  167. package/dist/heart/providers/openai-codex.js +63 -39
  168. package/dist/heart/runtime-capability-check.js +170 -0
  169. package/dist/heart/runtime-credentials.js +367 -0
  170. package/dist/heart/runtime-cwd.js +87 -0
  171. package/dist/heart/sense-truth.js +70 -0
  172. package/dist/heart/session-activity.js +190 -0
  173. package/dist/heart/session-events.js +1149 -0
  174. package/dist/heart/session-playback-cli-main.js +5 -0
  175. package/dist/heart/session-playback-cli.js +36 -0
  176. package/dist/heart/session-playback.js +231 -0
  177. package/dist/heart/session-stats-cli-main.js +5 -0
  178. package/dist/heart/session-stats.js +182 -0
  179. package/dist/heart/session-transcript.js +243 -0
  180. package/dist/heart/start-of-turn-packet.js +345 -0
  181. package/dist/heart/streaming.js +129 -34
  182. package/dist/heart/sync-classification.js +176 -0
  183. package/dist/heart/sync.js +449 -0
  184. package/dist/heart/target-resolution.js +127 -0
  185. package/dist/heart/tempo.js +93 -0
  186. package/dist/heart/temporal-view.js +41 -0
  187. package/dist/heart/timeouts.js +101 -0
  188. package/dist/heart/tool-activity-callbacks.js +59 -0
  189. package/dist/heart/tool-description.js +143 -0
  190. package/dist/heart/tool-friction.js +55 -0
  191. package/dist/heart/tool-loop.js +200 -0
  192. package/dist/heart/turn-context.js +421 -0
  193. package/dist/heart/turn-coordinator.js +28 -0
  194. package/dist/heart/versioning/ouro-bot-global-installer.js +129 -0
  195. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  196. package/dist/heart/versioning/ouro-path-installer.js +426 -0
  197. package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
  198. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  199. package/dist/heart/versioning/staged-restart.js +146 -0
  200. package/dist/heart/versioning/update-checker.js +116 -0
  201. package/dist/heart/versioning/update-hooks.js +142 -0
  202. package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
  203. package/dist/mailbox-ui/assets/index-B-461hes.js +61 -0
  204. package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
  205. package/dist/mailbox-ui/index.html +15 -0
  206. package/dist/mailroom/attention.js +167 -0
  207. package/dist/mailroom/autonomy.js +209 -0
  208. package/dist/mailroom/blob-store.js +700 -0
  209. package/dist/mailroom/body-cache.js +61 -0
  210. package/dist/mailroom/core.js +788 -0
  211. package/dist/mailroom/entry.js +160 -0
  212. package/dist/mailroom/file-store.js +457 -0
  213. package/dist/mailroom/mbox-import.js +393 -0
  214. package/dist/mailroom/migration.js +164 -0
  215. package/dist/mailroom/outbound.js +380 -0
  216. package/dist/mailroom/policy.js +263 -0
  217. package/dist/mailroom/reader.js +233 -0
  218. package/dist/mailroom/search-cache.js +268 -0
  219. package/dist/mailroom/search-relevance.js +319 -0
  220. package/dist/mailroom/smtp-ingress.js +176 -0
  221. package/dist/mailroom/source-state.js +176 -0
  222. package/dist/mailroom/thread.js +109 -0
  223. package/dist/mailroom/travel-extract.js +89 -0
  224. package/dist/mind/bundle-manifest.js +77 -1
  225. package/dist/mind/context.js +174 -94
  226. package/dist/mind/diary-integrity.js +60 -0
  227. package/dist/mind/{memory.js → diary.js} +84 -96
  228. package/dist/mind/embedding-provider.js +60 -0
  229. package/dist/mind/file-state.js +179 -0
  230. package/dist/mind/first-impressions.js +16 -2
  231. package/dist/mind/friends/channel.js +74 -0
  232. package/dist/mind/friends/group-context.js +144 -0
  233. package/dist/mind/friends/resolver.js +54 -2
  234. package/dist/mind/friends/store-file.js +58 -3
  235. package/dist/mind/friends/trust-explanation.js +74 -0
  236. package/dist/mind/friends/types.js +10 -2
  237. package/dist/mind/journal-index.js +161 -0
  238. package/dist/mind/note-search.js +268 -0
  239. package/dist/mind/obligation-steering.js +221 -0
  240. package/dist/mind/pending.js +76 -9
  241. package/dist/mind/phrases.js +1 -0
  242. package/dist/mind/prompt-refresh.js +3 -2
  243. package/dist/mind/prompt.js +1267 -130
  244. package/dist/mind/provenance-trust.js +26 -0
  245. package/dist/mind/scrutiny.js +173 -0
  246. package/dist/mind/token-estimate.js +8 -12
  247. package/dist/nerves/cli-logging.js +22 -3
  248. package/dist/nerves/coverage/audit-rules.js +15 -6
  249. package/dist/nerves/coverage/audit.js +28 -2
  250. package/dist/nerves/coverage/cli.js +1 -1
  251. package/dist/nerves/coverage/contract.js +5 -5
  252. package/dist/nerves/coverage/file-completeness.js +129 -5
  253. package/dist/nerves/coverage/run-artifacts.js +1 -1
  254. package/dist/nerves/event-buffer.js +111 -0
  255. package/dist/nerves/index.js +224 -4
  256. package/dist/nerves/observation.js +20 -0
  257. package/dist/nerves/redact.js +79 -0
  258. package/dist/nerves/review/cli-main.js +5 -0
  259. package/dist/nerves/review/cli.js +156 -0
  260. package/dist/nerves/review/core.js +152 -0
  261. package/dist/nerves/runtime.js +5 -1
  262. package/dist/repertoire/ado-client.js +17 -56
  263. package/dist/repertoire/ado-semantic.js +11 -10
  264. package/dist/repertoire/api-client.js +97 -0
  265. package/dist/repertoire/bitwarden-store.js +997 -0
  266. package/dist/repertoire/bundle-templates.js +72 -0
  267. package/dist/repertoire/bw-installer.js +180 -0
  268. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  269. package/dist/repertoire/coding/context-pack.js +330 -0
  270. package/dist/repertoire/coding/feedback.js +301 -0
  271. package/dist/repertoire/coding/index.js +4 -1
  272. package/dist/repertoire/coding/manager.js +220 -13
  273. package/dist/repertoire/coding/spawner.js +58 -12
  274. package/dist/repertoire/coding/tools.js +209 -7
  275. package/dist/repertoire/commerce-errors.js +109 -0
  276. package/dist/repertoire/commerce-self-test.js +156 -0
  277. package/dist/repertoire/credential-access.js +178 -0
  278. package/dist/repertoire/data/ado-endpoints.json +188 -0
  279. package/dist/repertoire/duffel-client.js +185 -0
  280. package/dist/repertoire/github-client.js +14 -55
  281. package/dist/repertoire/graph-client.js +11 -52
  282. package/dist/repertoire/guardrails.js +396 -0
  283. package/dist/repertoire/mcp-client.js +295 -0
  284. package/dist/repertoire/mcp-manager.js +362 -0
  285. package/dist/repertoire/mcp-tools.js +63 -0
  286. package/dist/repertoire/shell-sessions.js +133 -0
  287. package/dist/repertoire/skills.js +15 -24
  288. package/dist/repertoire/stripe-client.js +131 -0
  289. package/dist/repertoire/tasks/board.js +43 -5
  290. package/dist/repertoire/tasks/fix.js +182 -0
  291. package/dist/repertoire/tasks/index.js +39 -13
  292. package/dist/repertoire/tasks/lifecycle.js +2 -2
  293. package/dist/repertoire/tasks/parser.js +3 -2
  294. package/dist/repertoire/tasks/scanner.js +194 -37
  295. package/dist/repertoire/tasks/transitions.js +16 -79
  296. package/dist/repertoire/tool-results.js +29 -0
  297. package/dist/repertoire/tools-attachments.js +317 -0
  298. package/dist/repertoire/tools-awaiting.js +360 -0
  299. package/dist/repertoire/tools-base.js +56 -707
  300. package/dist/repertoire/tools-bluebubbles.js +94 -0
  301. package/dist/repertoire/tools-bridge.js +142 -0
  302. package/dist/repertoire/tools-bundle.js +984 -0
  303. package/dist/repertoire/tools-config.js +185 -0
  304. package/dist/repertoire/tools-continuity.js +248 -0
  305. package/dist/repertoire/tools-credential.js +381 -0
  306. package/dist/repertoire/tools-files.js +342 -0
  307. package/dist/repertoire/tools-flight.js +224 -0
  308. package/dist/repertoire/tools-flow.js +119 -0
  309. package/dist/repertoire/tools-github.js +1 -7
  310. package/dist/repertoire/tools-mail.js +1916 -0
  311. package/dist/repertoire/tools-notes.js +421 -0
  312. package/dist/repertoire/tools-obligations.js +142 -0
  313. package/dist/repertoire/tools-runtime.js +61 -0
  314. package/dist/repertoire/tools-session.js +809 -0
  315. package/dist/repertoire/tools-shell.js +120 -0
  316. package/dist/repertoire/tools-stripe.js +180 -0
  317. package/dist/repertoire/tools-surface.js +345 -0
  318. package/dist/repertoire/tools-teams.js +64 -61
  319. package/dist/repertoire/tools-travel.js +125 -0
  320. package/dist/repertoire/tools-trip.js +604 -0
  321. package/dist/repertoire/tools-user-profile.js +144 -0
  322. package/dist/repertoire/tools-vault.js +40 -0
  323. package/dist/repertoire/tools-voice.js +144 -0
  324. package/dist/repertoire/tools.js +154 -98
  325. package/dist/repertoire/travel-api-client.js +360 -0
  326. package/dist/repertoire/user-profile.js +131 -0
  327. package/dist/repertoire/vault-setup.js +246 -0
  328. package/dist/repertoire/vault-unlock.js +594 -0
  329. package/dist/scripts/claude-code-hook.js +41 -0
  330. package/dist/scripts/claude-code-stop-hook.js +47 -0
  331. package/dist/senses/attention-queue.js +116 -0
  332. package/dist/senses/await-turn-message.js +58 -0
  333. package/dist/senses/bluebubbles/active-turns.js +216 -0
  334. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  335. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  336. package/dist/senses/bluebubbles/client.js +685 -0
  337. package/dist/senses/bluebubbles/entry.js +77 -0
  338. package/dist/senses/bluebubbles/inbound-log.js +126 -0
  339. package/dist/senses/bluebubbles/index.js +2548 -0
  340. package/dist/senses/bluebubbles/media.js +389 -0
  341. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +45 -16
  342. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
  343. package/dist/senses/bluebubbles/processed-log.js +133 -0
  344. package/dist/senses/bluebubbles/replay.js +137 -0
  345. package/dist/senses/bluebubbles/runtime-state.js +137 -0
  346. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  347. package/dist/senses/bluebubbles-meta-guard.js +40 -0
  348. package/dist/senses/cli/bracketed-paste.js +82 -0
  349. package/dist/senses/cli/image-paste.js +287 -0
  350. package/dist/senses/cli/image-ref-navigation.js +75 -0
  351. package/dist/senses/cli/ink-app.js +156 -0
  352. package/dist/senses/cli/inline-diff.js +64 -0
  353. package/dist/senses/cli/input-keys.js +174 -0
  354. package/dist/senses/cli/kill-ring.js +86 -0
  355. package/dist/senses/cli/message-list.js +51 -0
  356. package/dist/senses/cli/ouro-tui.js +607 -0
  357. package/dist/senses/cli/spinner-imperative.js +135 -0
  358. package/dist/senses/cli/spinner.js +101 -0
  359. package/dist/senses/cli/status-line.js +60 -0
  360. package/dist/senses/cli/streaming-markdown.js +526 -0
  361. package/dist/senses/cli/tool-display.js +85 -0
  362. package/dist/senses/cli/tool-render.js +85 -0
  363. package/dist/senses/cli/tui-store.js +240 -0
  364. package/dist/senses/cli/virtual-list.js +35 -0
  365. package/dist/senses/cli-entry.js +60 -8
  366. package/dist/senses/cli-layout.js +187 -0
  367. package/dist/senses/cli.js +777 -264
  368. package/dist/senses/commands.js +66 -3
  369. package/dist/senses/continuity.js +94 -0
  370. package/dist/senses/habit-turn-message.js +108 -0
  371. package/dist/senses/inner-dialog-worker.js +209 -16
  372. package/dist/senses/inner-dialog.js +682 -91
  373. package/dist/senses/mail-entry.js +66 -0
  374. package/dist/senses/mail.js +379 -0
  375. package/dist/senses/pipeline.js +751 -0
  376. package/dist/senses/proactive-content-guard.js +51 -0
  377. package/dist/senses/shared-turn.js +392 -0
  378. package/dist/senses/surface-tool.js +70 -0
  379. package/dist/senses/teams-entry.js +60 -8
  380. package/dist/senses/teams.js +925 -195
  381. package/dist/senses/trust-gate.js +207 -2
  382. package/dist/senses/voice/audio-playback.js +237 -0
  383. package/dist/senses/voice/audio-routing.js +119 -0
  384. package/dist/senses/voice/elevenlabs.js +202 -0
  385. package/dist/senses/voice/floor-control.js +431 -0
  386. package/dist/senses/voice/floor-controller.js +115 -0
  387. package/dist/senses/voice/golden-path.js +116 -0
  388. package/dist/senses/voice/index.js +29 -0
  389. package/dist/senses/voice/meeting.js +113 -0
  390. package/dist/senses/voice/outbound.js +190 -0
  391. package/dist/senses/voice/phone.js +33 -0
  392. package/dist/senses/voice/playback.js +139 -0
  393. package/dist/senses/voice/realtime-eval.js +496 -0
  394. package/dist/senses/voice/realtime-trace.js +531 -0
  395. package/dist/senses/voice/transcript.js +70 -0
  396. package/dist/senses/voice/turn.js +191 -0
  397. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  398. package/dist/senses/voice/twilio-phone.js +5077 -0
  399. package/dist/senses/voice/types.js +2 -0
  400. package/dist/senses/voice/whisper.js +161 -0
  401. package/dist/senses/voice-entry.js +81 -0
  402. package/dist/senses/voice-realtime-eval-command.js +99 -0
  403. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  404. package/dist/senses/voice-twilio-entry.js +87 -0
  405. package/dist/trips/core.js +138 -0
  406. package/dist/trips/store.js +265 -0
  407. package/package.json +52 -7
  408. package/skills/agent-commerce.md +106 -0
  409. package/skills/browser-navigation.md +117 -0
  410. package/skills/commerce-setup-guide.md +116 -0
  411. package/skills/commerce-setup.md +84 -0
  412. package/skills/configure-dev-tools.md +99 -0
  413. package/skills/travel-planning.md +138 -0
  414. package/AdoptionSpecialist.ouro/agent.json +0 -20
  415. package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
  416. package/dist/heart/daemon/specialist-orchestrator.js +0 -160
  417. package/dist/heart/daemon/specialist-prompt.js +0 -40
  418. package/dist/heart/daemon/specialist-session.js +0 -142
  419. package/dist/heart/daemon/specialist-tools.js +0 -128
  420. package/dist/heart/daemon/subagent-installer.js +0 -125
  421. package/dist/inner-worker-entry.js +0 -4
  422. package/dist/mind/associative-recall.js +0 -197
  423. package/dist/senses/bluebubbles-client.js +0 -279
  424. package/dist/senses/bluebubbles-entry.js +0 -11
  425. package/dist/senses/bluebubbles.js +0 -332
  426. package/subagents/README.md +0 -73
  427. package/subagents/work-doer.md +0 -233
  428. package/subagents/work-merger.md +0 -624
  429. package/subagents/work-planner.md +0 -373
  430. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  431. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  432. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  433. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  434. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  435. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  436. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  437. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  438. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  439. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  440. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,161 @@
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.parseWhisperCppTranscriptJson = parseWhisperCppTranscriptJson;
37
+ exports.createNodeWhisperCppProcessRunner = createNodeWhisperCppProcessRunner;
38
+ exports.createWhisperCppTranscriber = createWhisperCppTranscriber;
39
+ const fs = __importStar(require("fs/promises"));
40
+ const os = __importStar(require("os"));
41
+ const path = __importStar(require("path"));
42
+ const child_process_1 = require("child_process");
43
+ const runtime_1 = require("../../nerves/runtime");
44
+ const transcript_1 = require("./transcript");
45
+ function parseWhisperCppTranscriptJson(raw) {
46
+ let parsed;
47
+ try {
48
+ parsed = JSON.parse(raw);
49
+ }
50
+ catch (error) {
51
+ throw new Error(`invalid whisper.cpp JSON: ${String(error)}`);
52
+ }
53
+ const text = typeof parsed.text === "string"
54
+ ? parsed.text.trim()
55
+ : Array.isArray(parsed.transcription)
56
+ ? parsed.transcription
57
+ .map((entry) => typeof entry.text === "string" ? entry.text.trim() : "")
58
+ .filter(Boolean)
59
+ .join(" ")
60
+ .trim()
61
+ : "";
62
+ if (!text) {
63
+ throw new Error("empty whisper.cpp transcript");
64
+ }
65
+ return text;
66
+ }
67
+ async function defaultMakeTempDir() {
68
+ return fs.mkdtemp(path.join(os.tmpdir(), "ouro-voice-whisper-"));
69
+ }
70
+ async function defaultRemoveDir(dir) {
71
+ await fs.rm(dir, { recursive: true, force: true });
72
+ }
73
+ function createNodeWhisperCppProcessRunner() {
74
+ return (command, args, options) => new Promise((resolve, reject) => {
75
+ const child = (0, child_process_1.spawn)(command, args, { stdio: ["ignore", "pipe", "pipe"] });
76
+ const stdout = [];
77
+ const stderr = [];
78
+ const timer = setTimeout(() => {
79
+ child.kill("SIGTERM");
80
+ reject(new Error(`command timed out after ${options.timeoutMs}ms`));
81
+ }, options.timeoutMs);
82
+ child.stdout.on("data", (chunk) => stdout.push(chunk));
83
+ child.stderr.on("data", (chunk) => stderr.push(chunk));
84
+ child.on("error", (error) => {
85
+ clearTimeout(timer);
86
+ reject(error);
87
+ });
88
+ child.on("close", (exitCode) => {
89
+ clearTimeout(timer);
90
+ resolve({
91
+ stdout: Buffer.concat(stdout).toString("utf8"),
92
+ stderr: Buffer.concat(stderr).toString("utf8"),
93
+ exitCode: exitCode ?? 0,
94
+ });
95
+ });
96
+ });
97
+ }
98
+ function createWhisperCppTranscriber(options) {
99
+ const timeoutMs = options.timeoutMs ?? 120_000;
100
+ const readFile = options.readFile ?? fs.readFile;
101
+ const makeTempDir = options.makeTempDir ?? defaultMakeTempDir;
102
+ const removeDir = options.removeDir ?? defaultRemoveDir;
103
+ const processRunner = options.processRunner ?? createNodeWhisperCppProcessRunner();
104
+ return {
105
+ async transcribe(request) {
106
+ const workDir = await makeTempDir();
107
+ const outputBase = path.join(workDir, "transcript");
108
+ const args = [
109
+ "-m",
110
+ options.modelPath,
111
+ "-f",
112
+ request.audioPath,
113
+ "-oj",
114
+ "-of",
115
+ outputBase,
116
+ ...(request.language ? ["-l", request.language] : []),
117
+ ];
118
+ (0, runtime_1.emitNervesEvent)({
119
+ component: "senses",
120
+ event: "senses.voice_stt_start",
121
+ message: "starting Whisper.cpp transcription",
122
+ meta: { utteranceId: request.utteranceId, audioPath: request.audioPath },
123
+ });
124
+ try {
125
+ const result = await processRunner(options.whisperCliPath, args, { timeoutMs });
126
+ if (typeof result.exitCode === "number" && result.exitCode !== 0) {
127
+ throw new Error(`exit ${result.exitCode}${result.stderr ? `: ${result.stderr}` : ""}`);
128
+ }
129
+ const raw = await readFile(`${outputBase}.json`, "utf8");
130
+ const text = parseWhisperCppTranscriptJson(raw);
131
+ const transcript = (0, transcript_1.buildVoiceTranscript)({
132
+ utteranceId: request.utteranceId,
133
+ text,
134
+ audioPath: request.audioPath,
135
+ language: request.language,
136
+ source: "whisper.cpp",
137
+ });
138
+ (0, runtime_1.emitNervesEvent)({
139
+ component: "senses",
140
+ event: "senses.voice_stt_end",
141
+ message: "finished Whisper.cpp transcription",
142
+ meta: { utteranceId: request.utteranceId, length: transcript.text.length },
143
+ });
144
+ return transcript;
145
+ }
146
+ catch (error) {
147
+ (0, runtime_1.emitNervesEvent)({
148
+ level: "error",
149
+ component: "senses",
150
+ event: "senses.voice_stt_error",
151
+ message: "Whisper.cpp transcription failed",
152
+ meta: { utteranceId: request.utteranceId, error: error instanceof Error ? error.message : String(error) },
153
+ });
154
+ throw new Error(`whisper.cpp transcription failed: ${error instanceof Error ? error.message : String(error)}`);
155
+ }
156
+ finally {
157
+ await removeDir(workDir);
158
+ }
159
+ },
160
+ };
161
+ }
@@ -0,0 +1,81 @@
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
+ const agentArgIndex = process.argv.indexOf("--agent");
37
+ const agentName = agentArgIndex >= 0 ? process.argv[agentArgIndex + 1] : undefined;
38
+ if (!agentName) {
39
+ // eslint-disable-next-line no-console -- pre-boot guard: --agent check before imports
40
+ console.error("Missing required --agent <name> argument.\nUsage: node dist/senses/voice-entry.js --agent ouroboros");
41
+ process.exit(1);
42
+ }
43
+ const runtime_logging_1 = require("../heart/daemon/runtime-logging");
44
+ const runtime_1 = require("../nerves/runtime");
45
+ (0, runtime_logging_1.configureDaemonRuntimeLogger)("voice");
46
+ (0, runtime_1.emitNervesEvent)({
47
+ component: "senses",
48
+ event: "senses.entry_boot",
49
+ message: "booting Voice entrypoint",
50
+ meta: { entry: "voice", agentName },
51
+ });
52
+ Promise.resolve().then(() => __importStar(require("./voice/twilio-phone-runtime"))).then(async ({ agentScopedTwilioPhoneBasePath, startConfiguredTwilioPhoneTransport, }) => {
53
+ const twilioPhone = await startConfiguredTwilioPhoneTransport({
54
+ agentName,
55
+ defaultBasePath: agentScopedTwilioPhoneBasePath(agentName),
56
+ });
57
+ (0, runtime_1.emitNervesEvent)({
58
+ component: "senses",
59
+ event: "senses.voice_entry_ready",
60
+ message: "Voice entrypoint is ready for managed voice turns",
61
+ meta: {
62
+ entry: "voice",
63
+ agentName,
64
+ twilioPhone: twilioPhone.status,
65
+ webhookUrl: twilioPhone.status === "started" ? twilioPhone.settings.webhookUrl : undefined,
66
+ },
67
+ });
68
+ setInterval(() => undefined, 60_000);
69
+ })
70
+ .catch((error) => {
71
+ (0, runtime_1.emitNervesEvent)({
72
+ level: "error",
73
+ component: "senses",
74
+ event: "senses.entry_error",
75
+ message: "Voice entrypoint failed",
76
+ meta: { entry: "voice", agentName, error: error instanceof Error ? error.message : String(error) },
77
+ });
78
+ // eslint-disable-next-line no-console -- fatal startup guard for sense process
79
+ console.error(error instanceof Error ? error.message : String(error));
80
+ process.exit(1);
81
+ });
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runVoiceRealtimeEvalCommand = runVoiceRealtimeEvalCommand;
4
+ const runtime_1 = require("../nerves/runtime");
5
+ const realtime_eval_1 = require("./voice/realtime-eval");
6
+ const realtime_trace_1 = require("./voice/realtime-trace");
7
+ function parseTraceArgs(argv) {
8
+ const tracePaths = [];
9
+ for (let index = 0; index < argv.length; index += 1) {
10
+ const arg = argv[index];
11
+ if (arg !== "--trace")
12
+ throw new Error(`unknown argument: ${arg}`);
13
+ const tracePath = argv[index + 1];
14
+ if (!tracePath)
15
+ throw new Error("--trace requires a file path");
16
+ tracePaths.push(tracePath);
17
+ index += 1;
18
+ }
19
+ return tracePaths;
20
+ }
21
+ function builtInPayload() {
22
+ const reports = (0, realtime_eval_1.runBuiltInVoiceRealtimeEvalSuite)();
23
+ const summary = (0, realtime_eval_1.summarizeVoiceRealtimeEvalSuite)(reports);
24
+ return {
25
+ summary,
26
+ expectedKnownBadFailed: summary.failed === 1 && summary.failedScenarioIds[0] === "voice-known-bad-latency",
27
+ happyPathPassed: reports.some((report) => report.scenarioId === "voice-happy-path" && report.passed),
28
+ };
29
+ }
30
+ function traceResultPayload(result) {
31
+ return {
32
+ traceId: result.traceId,
33
+ scenarioId: result.scenarioId,
34
+ expectedOutcome: result.expectedOutcome,
35
+ outcomeMatched: result.outcomeMatched,
36
+ report: result.report,
37
+ ignoredEvents: result.ignoredEvents.map((event) => ({
38
+ atMs: event.atMs,
39
+ event: event.event,
40
+ source: event.source,
41
+ ignoreReason: event.ignoreReason,
42
+ })),
43
+ };
44
+ }
45
+ function summarizeTraceResults(traces) {
46
+ const mismatchedScenarioIds = traces.filter((trace) => !trace.outcomeMatched).map((trace) => trace.scenarioId);
47
+ return {
48
+ matched: traces.length - mismatchedScenarioIds.length,
49
+ mismatched: mismatchedScenarioIds.length,
50
+ total: traces.length,
51
+ mismatchedScenarioIds,
52
+ };
53
+ }
54
+ function errorResult(error) {
55
+ return {
56
+ exitCode: 1,
57
+ payload: { error: String(error).replace(/^Error: /, "") },
58
+ };
59
+ }
60
+ function runVoiceRealtimeEvalCommand(argv) {
61
+ (0, runtime_1.emitNervesEvent)({
62
+ component: "senses",
63
+ event: "senses.voice_realtime_eval_command_start",
64
+ message: "starting Voice realtime eval command runner",
65
+ meta: { scenarioId: "voice-eval-command", events: argv.length },
66
+ });
67
+ try {
68
+ const tracePaths = parseTraceArgs(argv);
69
+ const payload = builtInPayload();
70
+ if (tracePaths.length > 0) {
71
+ const traces = tracePaths
72
+ .map((tracePath) => (0, realtime_trace_1.gradeVoiceRealtimeEvalTrace)((0, realtime_trace_1.loadVoiceRealtimeEvalTraceArtifact)(tracePath)))
73
+ .map(traceResultPayload);
74
+ payload.traces = traces;
75
+ payload.traceSummary = summarizeTraceResults(traces);
76
+ }
77
+ const builtInsPassed = Boolean(payload.expectedKnownBadFailed && payload.happyPathPassed);
78
+ const tracesPassed = payload.traceSummary ? payload.traceSummary.mismatched === 0 : true;
79
+ const result = { exitCode: builtInsPassed && tracesPassed ? 0 : 1, payload };
80
+ (0, runtime_1.emitNervesEvent)({
81
+ component: "senses",
82
+ event: "senses.voice_realtime_eval_command_end",
83
+ message: "finished Voice realtime eval command runner",
84
+ meta: { scenarioId: "voice-eval-command", passed: result.exitCode === 0, findings: payload.traceSummary?.mismatched ?? 0 },
85
+ });
86
+ return result;
87
+ }
88
+ catch (error) {
89
+ const result = errorResult(error);
90
+ (0, runtime_1.emitNervesEvent)({
91
+ component: "senses",
92
+ event: "senses.voice_realtime_eval_command_error",
93
+ message: "Voice realtime eval command runner failed",
94
+ meta: { scenarioId: "voice-eval-command", error: result.payload.error },
95
+ level: "error",
96
+ });
97
+ return result;
98
+ }
99
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const runtime_1 = require("../nerves/runtime");
4
+ const voice_realtime_eval_command_1 = require("./voice-realtime-eval-command");
5
+ (0, runtime_1.emitNervesEvent)({
6
+ component: "senses",
7
+ event: "senses.voice_realtime_eval_start",
8
+ message: "starting Voice realtime eval command",
9
+ meta: { scenarioId: "built-in-suite", events: 0 },
10
+ });
11
+ const result = (0, voice_realtime_eval_command_1.runVoiceRealtimeEvalCommand)(process.argv.slice(2));
12
+ (0, runtime_1.emitNervesEvent)({
13
+ component: "senses",
14
+ event: "senses.voice_realtime_eval_end",
15
+ message: "finished Voice realtime eval command",
16
+ meta: { scenarioId: "built-in-suite", passed: result.exitCode === 0, findings: result.payload.traceSummary?.mismatched ?? result.payload.summary?.failed ?? 0 },
17
+ });
18
+ // eslint-disable-next-line no-console -- terminal UX: eval command summary
19
+ console.log(JSON.stringify(result.payload, null, 2));
20
+ if (result.exitCode !== 0)
21
+ process.exit(result.exitCode);
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function readRequiredAgentName() {
4
+ const agentArgIndex = process.argv.indexOf("--agent");
5
+ const value = agentArgIndex >= 0 ? process.argv[agentArgIndex + 1] : undefined;
6
+ if (value)
7
+ return value;
8
+ process.stderr.write("Missing required --agent <name> argument.\nUsage: node dist/senses/voice-twilio-entry.js --agent ouroboros --public-url https://<tunnel>\n");
9
+ process.exit(1);
10
+ }
11
+ const agentName = readRequiredAgentName();
12
+ const runtime_logging_1 = require("../heart/daemon/runtime-logging");
13
+ const runtime_1 = require("../nerves/runtime");
14
+ const voice_1 = require("./voice");
15
+ function argValue(name) {
16
+ const index = process.argv.indexOf(name);
17
+ if (index < 0)
18
+ return undefined;
19
+ const value = process.argv[index + 1];
20
+ return value && !value.startsWith("--") ? value : undefined;
21
+ }
22
+ function numberArg(name) {
23
+ const raw = argValue(name);
24
+ if (!raw)
25
+ return undefined;
26
+ const parsed = Number(raw);
27
+ if (!Number.isFinite(parsed))
28
+ throw new Error(`${name} must be a number`);
29
+ return parsed;
30
+ }
31
+ function standaloneOverrides() {
32
+ return {
33
+ publicBaseUrl: argValue("--public-url"),
34
+ basePath: argValue("--base-path"),
35
+ port: numberArg("--port"),
36
+ host: argValue("--host"),
37
+ outputDir: argValue("--output-dir"),
38
+ defaultFriendId: argValue("--friend"),
39
+ elevenLabsVoiceId: argValue("--elevenlabs-voice-id"),
40
+ whisperCliPath: argValue("--whisper-cli-path"),
41
+ whisperModelPath: argValue("--whisper-model-path"),
42
+ recordTimeoutSeconds: numberArg("--record-timeout"),
43
+ recordMaxLengthSeconds: numberArg("--record-max-length"),
44
+ greetingPrebufferMs: numberArg("--greeting-prebuffer-ms"),
45
+ transportMode: argValue("--transport-mode"),
46
+ playbackMode: argValue("--playback-mode"),
47
+ };
48
+ }
49
+ function writeReadyInstructions(localUrl, publicBaseUrl, webhookUrl) {
50
+ process.stdout.write([
51
+ "Twilio phone voice bridge ready.",
52
+ `local: ${localUrl}`,
53
+ `public: ${publicBaseUrl}`,
54
+ `Twilio Voice webhook: POST ${webhookUrl}`,
55
+ "",
56
+ ].join("\n"));
57
+ }
58
+ (0, runtime_logging_1.configureDaemonRuntimeLogger)("voice");
59
+ (0, runtime_1.emitNervesEvent)({
60
+ component: "senses",
61
+ event: "senses.entry_boot",
62
+ message: "booting Twilio Voice entrypoint",
63
+ meta: { entry: "voice-twilio", agentName },
64
+ });
65
+ async function main() {
66
+ const transport = await (0, voice_1.startConfiguredTwilioPhoneTransport)({
67
+ agentName,
68
+ overrides: standaloneOverrides(),
69
+ defaultBasePath: voice_1.TWILIO_PHONE_WEBHOOK_BASE_PATH,
70
+ requirePublicUrl: true,
71
+ });
72
+ if (transport.status !== "started") {
73
+ throw new Error(`Twilio phone voice transport did not start: ${transport.reason}`);
74
+ }
75
+ writeReadyInstructions(transport.bridge.localUrl, transport.settings.publicBaseUrl, transport.settings.webhookUrl);
76
+ }
77
+ main().catch((error) => {
78
+ (0, runtime_1.emitNervesEvent)({
79
+ level: "error",
80
+ component: "senses",
81
+ event: "senses.entry_error",
82
+ message: "Twilio Voice entrypoint failed",
83
+ meta: { entry: "voice-twilio", agentName, error: error instanceof Error ? error.message : String(error) },
84
+ });
85
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
86
+ process.exit(1);
87
+ });
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ // Harness-side trip ledger primitive.
3
+ //
4
+ // Mirrors the substrate's @ouro/work-protocol/src/trip.ts contract (vendored
5
+ // the same way mailroom/core.ts vendors mail). Slugger's framing: today,
6
+ // doc-edits-from-mail keep falling back on freeform parsing because there is
7
+ // no structured object between "mail body" and "travel doc". TripRecord +
8
+ // TripLeg are that object — every leg fact carries non-optional provenance
9
+ // (TripEvidence with discoveryMethod) so the ledger can be audited cleanly
10
+ // and reasoned about under conflict.
11
+ //
12
+ // Per-agent ledger keypair design: in v1 each agent has ONE ledger keypair.
13
+ // All TripRecord blobs are encrypted with that key. Cross-trip sharing
14
+ // (handing one trip's facts to another party without their owning the whole
15
+ // ledger) is a follow-on; it would shard to per-trip keys, which the
16
+ // substrate's TripLedgerRegistry can already represent.
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.generateTripKeyPair = generateTripKeyPair;
52
+ exports.encryptTripRecord = encryptTripRecord;
53
+ exports.decryptTripRecord = decryptTripRecord;
54
+ exports.newTripId = newTripId;
55
+ exports.newLegId = newLegId;
56
+ exports.newTripLedgerRecord = newTripLedgerRecord;
57
+ const crypto = __importStar(require("node:crypto"));
58
+ // ── Helpers: keys + crypto ─────────────────────────────────────────
59
+ function safeLabel(label) {
60
+ return label.toLowerCase().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "");
61
+ }
62
+ function generateTripKeyPair(label) {
63
+ const { publicKey, privateKey } = crypto.generateKeyPairSync("rsa", {
64
+ modulusLength: 2048,
65
+ publicKeyEncoding: { type: "spki", format: "pem" },
66
+ privateKeyEncoding: { type: "pkcs8", format: "pem" },
67
+ });
68
+ const slug = safeLabel(label) || "ledger";
69
+ const fingerprint = crypto.createHash("sha256").update(publicKey).digest("hex").slice(0, 16);
70
+ return {
71
+ keyId: `trip_${slug}_${fingerprint}`,
72
+ publicKeyPem: publicKey,
73
+ privateKeyPem: privateKey,
74
+ };
75
+ }
76
+ function encryptTripRecord(trip, publicKeyPem, keyId) {
77
+ const contentKey = crypto.randomBytes(32);
78
+ const iv = crypto.randomBytes(12);
79
+ const cipher = crypto.createCipheriv("aes-256-gcm", contentKey, iv);
80
+ const ciphertext = Buffer.concat([cipher.update(Buffer.from(JSON.stringify(trip), "utf-8")), cipher.final()]);
81
+ const authTag = cipher.getAuthTag();
82
+ const wrappedKey = crypto.publicEncrypt({ key: publicKeyPem, oaepHash: "sha256" }, contentKey);
83
+ return {
84
+ algorithm: "RSA-OAEP-SHA256+A256GCM",
85
+ keyId,
86
+ wrappedKey: wrappedKey.toString("base64"),
87
+ iv: iv.toString("base64"),
88
+ authTag: authTag.toString("base64"),
89
+ ciphertext: ciphertext.toString("base64"),
90
+ };
91
+ }
92
+ function decryptTripRecord(payload, privateKeyPem) {
93
+ const contentKey = crypto.privateDecrypt({
94
+ key: privateKeyPem,
95
+ oaepHash: "sha256",
96
+ }, Buffer.from(payload.wrappedKey, "base64"));
97
+ const decipher = crypto.createDecipheriv("aes-256-gcm", contentKey, Buffer.from(payload.iv, "base64"));
98
+ decipher.setAuthTag(Buffer.from(payload.authTag, "base64"));
99
+ const plaintext = Buffer.concat([
100
+ decipher.update(Buffer.from(payload.ciphertext, "base64")),
101
+ decipher.final(),
102
+ ]);
103
+ return JSON.parse(plaintext.toString("utf-8"));
104
+ }
105
+ // ── Helpers: deterministic ids ─────────────────────────────────────
106
+ function newTripId(agentId, name, createdAt) {
107
+ const fingerprint = crypto.createHash("sha256")
108
+ .update(`${agentId}\n${name}\n${createdAt}`)
109
+ .digest("hex")
110
+ .slice(0, 16);
111
+ const slug = safeLabel(name) || "trip";
112
+ return `trip_${slug}_${fingerprint}`;
113
+ }
114
+ function newLegId(input) {
115
+ const distinguish = input.vendor || input.confirmationCode || crypto.randomUUID();
116
+ const fingerprint = crypto.createHash("sha256")
117
+ .update(`${input.tripId}\n${input.kind}\n${distinguish}\n${input.createdAt}`)
118
+ .digest("hex")
119
+ .slice(0, 16);
120
+ return `leg_${input.kind}_${fingerprint}`;
121
+ }
122
+ // ── Ledger record helpers ──────────────────────────────────────────
123
+ function newTripLedgerRecord(input) {
124
+ const now = (input.now ?? (() => new Date().toISOString()))();
125
+ const keypair = generateTripKeyPair(input.label ?? input.agentId);
126
+ const ledgerId = `ledger_${safeLabel(input.agentId) || "agent"}_${crypto.createHash("sha256").update(`${input.agentId}\n${now}\n${keypair.keyId}`).digest("hex").slice(0, 16)}`;
127
+ return {
128
+ ledger: {
129
+ schemaVersion: 1,
130
+ agentId: input.agentId,
131
+ ledgerId,
132
+ keyId: keypair.keyId,
133
+ publicKeyPem: keypair.publicKeyPem,
134
+ createdAt: now,
135
+ },
136
+ keypair,
137
+ };
138
+ }