@ouro.bot/cli 0.1.0-alpha.99 → 0.1.0-alpha.990

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 (772) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +171 -23
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/bluebubbles-host +264 -0
  14. package/assets/sanctuary-host-launcher.sh +16 -0
  15. package/changelog.json +6251 -16
  16. package/deploy/unraid/Dockerfile +58 -0
  17. package/deploy/unraid/INSTALL.md +64 -0
  18. package/deploy/unraid/README.txt +2997 -0
  19. package/deploy/unraid/audit-container-spec.sh +4 -0
  20. package/deploy/unraid/container-runtime.json +1 -0
  21. package/deploy/unraid/credit-gateway.md +95 -0
  22. package/deploy/unraid/docker-man-template-transaction.mjs +727 -0
  23. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  24. package/deploy/unraid/install.sh +274 -0
  25. package/deploy/unraid/migrate-sanctuary-bundle.mjs +63 -0
  26. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  27. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  28. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  29. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  30. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  31. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  32. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  33. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  34. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  35. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  36. package/deploy/unraid/sanctuary-butler-upgrade.mjs +1499 -0
  37. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  38. package/deploy/unraid/sanctuary-replay-gate.mjs +2114 -0
  39. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  40. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2088 -0
  41. package/deploy/unraid/sanctuary-unit16-run.sh +570 -0
  42. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  43. package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
  44. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  45. package/deploy/unraid/sanctuary.ouro/awaiting/house-care-sweep.md +17 -0
  46. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  47. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  48. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +2255 -0
  49. package/deploy/unraid/sanctuary.ouro/product/PRODUCT.md +13 -0
  50. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  51. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  52. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +7 -0
  53. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +7 -0
  54. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +15 -0
  55. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +3 -0
  56. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  57. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +232 -0
  58. package/deploy/unraid/sanctuary.xml +29 -0
  59. package/dist/a2a/card.js +57 -0
  60. package/dist/a2a/client.js +290 -0
  61. package/dist/a2a/config.js +50 -0
  62. package/dist/a2a/delegated-command-grants.js +93 -0
  63. package/dist/a2a/delegated-command.js +197 -0
  64. package/dist/a2a/delegation-stores.js +56 -0
  65. package/dist/a2a/did-resolution.js +205 -0
  66. package/dist/a2a/escalation-grants.js +84 -0
  67. package/dist/a2a/escalation-wiring.js +60 -0
  68. package/dist/a2a/identity.js +258 -0
  69. package/dist/a2a/inbound-share.js +131 -0
  70. package/dist/a2a/mission-result-wire.js +265 -0
  71. package/dist/a2a/onboarding.js +133 -0
  72. package/dist/a2a/operator-trust.js +399 -0
  73. package/dist/a2a/outbox-client.js +59 -0
  74. package/dist/a2a/outbox-store.js +188 -0
  75. package/dist/a2a/outbox-wire.js +106 -0
  76. package/dist/a2a/pin-store.js +167 -0
  77. package/dist/a2a/refusals.js +53 -0
  78. package/dist/a2a/relay-client.js +106 -0
  79. package/dist/a2a/relay-config-vault.js +64 -0
  80. package/dist/a2a/relay-contacts.js +120 -0
  81. package/dist/a2a/relay-inbox.js +360 -0
  82. package/dist/a2a/relay-retirements.js +89 -0
  83. package/dist/a2a/replay-grant-holders.js +33 -0
  84. package/dist/a2a/replay-harness.js +188 -0
  85. package/dist/a2a/resolution-proof.js +53 -0
  86. package/dist/a2a/sealed-chat.js +114 -0
  87. package/dist/a2a/seen-ledger.js +214 -0
  88. package/dist/a2a/server.js +808 -0
  89. package/dist/a2a/task-store.js +69 -0
  90. package/dist/a2a/transport.js +100 -0
  91. package/dist/a2a/trust-commands.js +203 -0
  92. package/dist/a2a/trusted-files.js +185 -0
  93. package/dist/a2a/types.js +3 -0
  94. package/dist/arc/attention-types.js +8 -0
  95. package/dist/arc/cares.js +360 -0
  96. package/dist/arc/episodes.js +118 -0
  97. package/dist/arc/evolution.js +490 -0
  98. package/dist/arc/flight-recorder.js +1034 -0
  99. package/dist/arc/intentions.js +134 -0
  100. package/dist/arc/json-store.js +117 -0
  101. package/dist/arc/obligations.js +386 -0
  102. package/dist/arc/packets.js +336 -0
  103. package/dist/arc/presence.js +185 -0
  104. package/dist/arc/task-lifecycle.js +57 -0
  105. package/dist/commerce/store.js +755 -0
  106. package/dist/commerce/types.js +3 -0
  107. package/dist/gateway/keys.js +117 -0
  108. package/dist/gateway/server.js +429 -0
  109. package/dist/heart/active-work.js +798 -40
  110. package/dist/heart/agent-entry.js +252 -3
  111. package/dist/heart/approval-files.js +113 -0
  112. package/dist/heart/approval-store.js +960 -0
  113. package/dist/heart/attachments/image-normalize.js +201 -0
  114. package/dist/heart/attachments/materialize.js +97 -0
  115. package/dist/heart/attachments/originals.js +88 -0
  116. package/dist/heart/attachments/render.js +29 -0
  117. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  118. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  119. package/dist/heart/attachments/sources/index.js +18 -0
  120. package/dist/heart/attachments/sources/telegram.js +71 -0
  121. package/dist/heart/attachments/store.js +132 -0
  122. package/dist/heart/attachments/types.js +93 -0
  123. package/dist/heart/auth/auth-flow.js +511 -0
  124. package/dist/heart/autonomy-budget.js +478 -0
  125. package/dist/heart/awaiting/a2a-await-delivery.js +109 -0
  126. package/dist/heart/awaiting/await-alert.js +152 -0
  127. package/dist/heart/awaiting/await-expiry.js +143 -0
  128. package/dist/heart/awaiting/await-loader.js +91 -0
  129. package/dist/heart/awaiting/await-parser.js +152 -0
  130. package/dist/heart/awaiting/await-runtime-state.js +130 -0
  131. package/dist/heart/awaiting/await-scheduler.js +391 -0
  132. package/dist/heart/background-operations.js +281 -0
  133. package/dist/heart/bluebubbles-host-account.js +78 -0
  134. package/dist/heart/bridges/manager.js +137 -17
  135. package/dist/heart/bridges/store.js +14 -2
  136. package/dist/heart/bundle-state.js +168 -0
  137. package/dist/heart/commitments.js +44 -18
  138. package/dist/heart/config-registry.js +331 -0
  139. package/dist/heart/config.js +178 -131
  140. package/dist/heart/context-loss-gauntlet.js +387 -0
  141. package/dist/heart/context-loss-sentinel.js +1204 -0
  142. package/dist/heart/core.js +2378 -586
  143. package/dist/heart/cross-chat-delivery.js +9 -22
  144. package/dist/heart/daemon/agent-config-check.js +474 -0
  145. package/dist/heart/daemon/agent-discovery.js +283 -3
  146. package/dist/heart/daemon/agent-home.js +319 -0
  147. package/dist/heart/daemon/agent-service.js +542 -0
  148. package/dist/heart/daemon/agentic-repair.js +547 -0
  149. package/dist/heart/daemon/await-private-wake.js +59 -0
  150. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  151. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  152. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  153. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  154. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  155. package/dist/heart/daemon/cadence.js +180 -0
  156. package/dist/heart/daemon/cli-arg-redaction.js +26 -0
  157. package/dist/heart/daemon/cli-defaults.js +881 -0
  158. package/dist/heart/daemon/cli-desk.js +331 -0
  159. package/dist/heart/daemon/cli-exec.js +9280 -0
  160. package/dist/heart/daemon/cli-help.js +754 -0
  161. package/dist/heart/daemon/cli-parse.js +3329 -0
  162. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  163. package/dist/heart/daemon/cli-render.js +819 -0
  164. package/dist/heart/daemon/cli-types.js +8 -0
  165. package/dist/heart/daemon/connect-bay.js +323 -0
  166. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  167. package/dist/heart/daemon/container-healthcheck.js +112 -0
  168. package/dist/heart/daemon/container-runtime.js +97 -0
  169. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  170. package/dist/heart/daemon/container-spec-auditor.js +241 -0
  171. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  172. package/dist/heart/daemon/daemon-cli.js +29 -2373
  173. package/dist/heart/daemon/daemon-entry.js +953 -11
  174. package/dist/heart/daemon/daemon-health.js +186 -0
  175. package/dist/heart/daemon/daemon-rollup.js +57 -0
  176. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  177. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  178. package/dist/heart/daemon/daemon.js +2110 -104
  179. package/dist/heart/daemon/desk-admin.js +420 -0
  180. package/dist/heart/daemon/dns-workflow.js +394 -0
  181. package/dist/heart/daemon/doctor-types.js +8 -0
  182. package/dist/heart/daemon/doctor.js +1766 -0
  183. package/dist/heart/daemon/freshness.js +345 -0
  184. package/dist/heart/daemon/habit-private-wake.js +61 -0
  185. package/dist/heart/daemon/health-monitor.js +154 -11
  186. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  187. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  188. package/dist/heart/daemon/http-health-probe.js +80 -0
  189. package/dist/heart/daemon/human-command-screens.js +234 -0
  190. package/dist/heart/daemon/human-readiness.js +114 -0
  191. package/dist/heart/daemon/inner-status.js +78 -0
  192. package/dist/heart/daemon/interactive-repair.js +394 -0
  193. package/dist/heart/daemon/launchd.js +37 -8
  194. package/dist/heart/daemon/log-tailer.js +79 -10
  195. package/dist/heart/daemon/logs-prune.js +132 -0
  196. package/dist/heart/daemon/mcp-canary.js +524 -0
  197. package/dist/heart/daemon/message-router.js +65 -5
  198. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  199. package/dist/heart/daemon/os-cron-deps.js +135 -0
  200. package/dist/heart/daemon/os-cron.js +22 -14
  201. package/dist/heart/daemon/ouro-bot-entry.js +6 -3
  202. package/dist/heart/daemon/ouro-entry.js +9 -3
  203. package/dist/heart/daemon/plugin-cli.js +432 -0
  204. package/dist/heart/daemon/process-manager.js +760 -61
  205. package/dist/heart/daemon/provider-discovery.js +137 -0
  206. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  207. package/dist/heart/daemon/prunable-bundle.js +144 -0
  208. package/dist/heart/daemon/pulse.js +511 -0
  209. package/dist/heart/daemon/readiness-repair.js +365 -0
  210. package/dist/heart/daemon/run-hooks.js +2 -0
  211. package/dist/heart/daemon/runtime-logging.js +47 -14
  212. package/dist/heart/daemon/runtime-metadata.js +2 -30
  213. package/dist/heart/daemon/runtime-mode.js +13 -2
  214. package/dist/heart/daemon/safe-mode.js +161 -0
  215. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2662 -0
  216. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1832 -0
  217. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  218. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +956 -0
  219. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  220. package/dist/heart/daemon/sanctuary-authority-epoch.js +291 -0
  221. package/dist/heart/daemon/sanctuary-authority-installation.js +161 -0
  222. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  223. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +1332 -0
  224. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  225. package/dist/heart/daemon/sanctuary-bundle-migration.js +878 -0
  226. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  227. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +493 -0
  228. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  229. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  230. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  231. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  232. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  233. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  234. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  235. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +475 -0
  236. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  237. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +676 -0
  238. package/dist/heart/daemon/sense-manager.js +786 -48
  239. package/dist/heart/daemon/session-id-resolver.js +131 -0
  240. package/dist/heart/daemon/skill-management-installer.js +1 -1
  241. package/dist/heart/daemon/socket-client.js +180 -12
  242. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  243. package/dist/heart/daemon/startup-tui.js +339 -0
  244. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  245. package/dist/heart/daemon/task-scheduler.js +117 -39
  246. package/dist/heart/daemon/terminal-ui.js +503 -0
  247. package/dist/heart/daemon/thoughts.js +138 -54
  248. package/dist/heart/daemon/up-progress.js +366 -0
  249. package/dist/heart/daemon/vault-items.js +56 -0
  250. package/dist/heart/delegation.js +1 -4
  251. package/dist/heart/external-events/router.js +1531 -0
  252. package/dist/heart/failure-reports.js +336 -0
  253. package/dist/heart/file-lock.js +109 -0
  254. package/dist/heart/frontend-approval-runtime.js +506 -0
  255. package/dist/heart/frontend-journal.js +215 -0
  256. package/dist/heart/frontend-session-service.js +271 -0
  257. package/dist/heart/frontend-socket-client.js +173 -0
  258. package/dist/heart/frontend-socket.js +434 -0
  259. package/dist/heart/frontend-turn-errors.js +20 -0
  260. package/dist/heart/habits/habit-cancel.js +810 -0
  261. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  262. package/dist/heart/habits/habit-migration.js +194 -0
  263. package/dist/heart/habits/habit-parser.js +278 -0
  264. package/dist/heart/habits/habit-runtime-state.js +93 -0
  265. package/dist/heart/habits/habit-scheduler.js +653 -0
  266. package/dist/heart/habits/habit-session-summary.js +318 -0
  267. package/dist/heart/habits/habit-session.js +636 -0
  268. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  269. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  270. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  271. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  272. package/dist/heart/identity.js +239 -59
  273. package/dist/heart/kept-notes.js +289 -0
  274. package/dist/heart/kicks.js +1 -1
  275. package/dist/heart/machine-identity.js +175 -0
  276. package/dist/heart/mail-import-discovery.js +356 -0
  277. package/dist/heart/mailbox/mailbox-http-hooks.js +99 -0
  278. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  279. package/dist/heart/mailbox/mailbox-http-routes.js +406 -0
  280. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  281. package/dist/heart/mailbox/mailbox-http-transport.js +272 -0
  282. package/dist/heart/mailbox/mailbox-http.js +99 -0
  283. package/dist/heart/mailbox/mailbox-read.js +41 -0
  284. package/dist/heart/mailbox/mailbox-supervision.js +131 -0
  285. package/dist/heart/mailbox/mailbox-types.js +27 -0
  286. package/dist/heart/mailbox/mailbox-view.js +197 -0
  287. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  288. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  289. package/dist/heart/mailbox/readers/mail.js +375 -0
  290. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  291. package/dist/heart/mailbox/readers/sessions.js +231 -0
  292. package/dist/heart/mailbox/readers/shared.js +111 -0
  293. package/dist/heart/mcp/mcp-server.js +760 -0
  294. package/dist/heart/migrate-config.js +100 -0
  295. package/dist/heart/model-capabilities.js +83 -16
  296. package/dist/heart/orientation-frame.js +376 -0
  297. package/dist/heart/platform.js +81 -0
  298. package/dist/heart/primitives.js +1 -1
  299. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  300. package/dist/heart/private-runtime/index.js +18 -0
  301. package/dist/heart/private-runtime/ledger.js +221 -0
  302. package/dist/heart/private-runtime/policy.js +260 -0
  303. package/dist/heart/private-runtime/types.js +2 -0
  304. package/dist/heart/progress-story.js +1 -1
  305. package/dist/heart/provider-attempt.js +137 -0
  306. package/dist/heart/provider-binding-resolver.js +273 -0
  307. package/dist/heart/provider-credentials.js +449 -0
  308. package/dist/heart/provider-failover.js +311 -0
  309. package/dist/heart/provider-models.js +96 -0
  310. package/dist/heart/provider-ping.js +266 -0
  311. package/dist/heart/provider-readiness-cache.js +119 -0
  312. package/dist/heart/provider-visibility.js +188 -0
  313. package/dist/heart/providers/anthropic-token.js +131 -0
  314. package/dist/heart/providers/anthropic.js +248 -67
  315. package/dist/heart/providers/azure.js +23 -11
  316. package/dist/heart/providers/error-classification.js +129 -0
  317. package/dist/heart/providers/github-copilot.js +38 -39
  318. package/dist/heart/providers/minimax-vlm.js +189 -0
  319. package/dist/heart/providers/minimax.js +26 -8
  320. package/dist/heart/providers/openai-codex-token.js +349 -0
  321. package/dist/heart/providers/openai-codex.js +55 -40
  322. package/dist/heart/providers/openai-compatible.js +177 -0
  323. package/dist/heart/reach-channel.js +85 -0
  324. package/dist/heart/reply-style.js +52 -0
  325. package/dist/heart/run-ledger.js +247 -0
  326. package/dist/heart/runtime-capability-check.js +170 -0
  327. package/dist/heart/runtime-credentials.js +608 -0
  328. package/dist/heart/runtime-cwd.js +87 -0
  329. package/dist/heart/sense-truth.js +24 -4
  330. package/dist/heart/session-activity.js +94 -24
  331. package/dist/heart/session-events.js +1521 -0
  332. package/dist/heart/session-playback-cli-main.js +5 -0
  333. package/dist/heart/session-playback-cli.js +36 -0
  334. package/dist/heart/session-playback.js +231 -0
  335. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  336. package/dist/heart/session-redaction-repair.js +552 -0
  337. package/dist/heart/session-stats-cli-main.js +5 -0
  338. package/dist/heart/session-stats.js +183 -0
  339. package/dist/heart/session-transcript.js +133 -0
  340. package/dist/heart/shelf-claims.js +78 -0
  341. package/dist/heart/shepherd/custody-types.js +2 -0
  342. package/dist/heart/shepherd/mandates.js +352 -0
  343. package/dist/heart/shepherd/operation-commands.js +19 -0
  344. package/dist/heart/shepherd/operations.js +135 -0
  345. package/dist/heart/shepherd/supervision.js +114 -0
  346. package/dist/heart/shepherd/types.js +2 -0
  347. package/dist/heart/shepherd-config.js +123 -0
  348. package/dist/heart/source-grounding.js +313 -0
  349. package/dist/heart/start-of-turn-packet.js +372 -0
  350. package/dist/heart/steward-policy.js +656 -0
  351. package/dist/heart/streaming.js +631 -207
  352. package/dist/heart/structured-output.js +196 -0
  353. package/dist/heart/sync-classification.js +176 -0
  354. package/dist/heart/sync-health.js +152 -0
  355. package/dist/heart/sync.js +726 -0
  356. package/dist/heart/target-resolution.js +11 -7
  357. package/dist/heart/tempo.js +93 -0
  358. package/dist/heart/temporal-view.js +41 -0
  359. package/dist/heart/timeouts.js +101 -0
  360. package/dist/heart/tool-activity-callbacks.js +59 -0
  361. package/dist/heart/tool-approval.js +382 -0
  362. package/dist/heart/tool-description.js +155 -0
  363. package/dist/heart/tool-friction.js +55 -0
  364. package/dist/heart/tool-loop.js +206 -0
  365. package/dist/heart/tool-output-budget.js +41 -0
  366. package/dist/heart/turn-context.js +496 -0
  367. package/dist/heart/turn-execution-lease.js +30 -0
  368. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  369. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +3 -2
  370. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  371. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  372. package/dist/heart/versioning/ouro-version-manager.js +432 -0
  373. package/dist/heart/versioning/release-sources.js +173 -0
  374. package/dist/heart/versioning/self-update-defaults.js +294 -0
  375. package/dist/heart/versioning/self-update.js +196 -0
  376. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  377. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  378. package/dist/heart/versioning/update-hooks.js +154 -0
  379. package/dist/heart/versioning/update-state.js +126 -0
  380. package/dist/heart/versioning/updater-launchd.js +150 -0
  381. package/dist/heart/versioning/version-intent.js +114 -0
  382. package/dist/heart/work-card.js +380 -0
  383. package/dist/mailbox-ui/assets/index-Dbska1tZ.js +1 -0
  384. package/dist/mailbox-ui/assets/index-DsiKaPyH.css +1 -0
  385. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  386. package/dist/mailbox-ui/index.html +16 -0
  387. package/dist/mailroom/attention.js +167 -0
  388. package/dist/mailroom/autonomy.js +209 -0
  389. package/dist/mailroom/blob-store.js +889 -0
  390. package/dist/mailroom/body-cache.js +61 -0
  391. package/dist/mailroom/cache-sync-cli.js +58 -0
  392. package/dist/mailroom/core.js +803 -0
  393. package/dist/mailroom/entry.js +160 -0
  394. package/dist/mailroom/file-store.js +568 -0
  395. package/dist/mailroom/hosted-cache-sync.js +384 -0
  396. package/dist/mailroom/mbox-import.js +393 -0
  397. package/dist/mailroom/migration.js +164 -0
  398. package/dist/mailroom/outbound.js +380 -0
  399. package/dist/mailroom/policy.js +263 -0
  400. package/dist/mailroom/reader.js +292 -0
  401. package/dist/mailroom/search-cache.js +513 -0
  402. package/dist/mailroom/search-relevance.js +319 -0
  403. package/dist/mailroom/smtp-ingress.js +176 -0
  404. package/dist/mailroom/source-state.js +176 -0
  405. package/dist/mailroom/thread.js +109 -0
  406. package/dist/mailroom/travel-extract.js +89 -0
  407. package/dist/mind/bundle-manifest.js +25 -2
  408. package/dist/mind/context.js +328 -139
  409. package/dist/mind/desk-section.js +362 -0
  410. package/dist/mind/diary-integrity.js +60 -0
  411. package/dist/mind/{memory.js → diary.js} +68 -77
  412. package/dist/mind/embedding-provider.js +60 -0
  413. package/dist/mind/file-state.js +179 -0
  414. package/dist/mind/friend-link-codes.js +209 -0
  415. package/dist/mind/friend-merge.js +336 -0
  416. package/dist/mind/house-names.js +43 -0
  417. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  418. package/dist/mind/obligation-steering.js +199 -3
  419. package/dist/mind/outbound-record.js +168 -0
  420. package/dist/mind/pending.js +36 -10
  421. package/dist/mind/prompt-budget.js +479 -0
  422. package/dist/mind/prompt-refresh.js +3 -2
  423. package/dist/mind/prompt.js +1152 -206
  424. package/dist/mind/provenance-trust.js +26 -0
  425. package/dist/mind/record-paths.js +312 -0
  426. package/dist/mind/scrutiny.js +173 -0
  427. package/dist/mind/session-transaction.js +622 -0
  428. package/dist/nerves/cli-logging.js +7 -1
  429. package/dist/nerves/coverage/audit-rules.js +15 -6
  430. package/dist/nerves/coverage/audit.js +28 -2
  431. package/dist/nerves/coverage/cli.js +1 -1
  432. package/dist/nerves/coverage/contract.js +5 -5
  433. package/dist/nerves/coverage/file-completeness.js +143 -5
  434. package/dist/nerves/coverage/run-artifacts.js +55 -35
  435. package/dist/nerves/coverage/source-scanner.js +4 -4
  436. package/dist/nerves/event-buffer.js +111 -0
  437. package/dist/nerves/index.js +293 -9
  438. package/dist/nerves/observation.js +20 -0
  439. package/dist/nerves/redact.js +79 -0
  440. package/dist/nerves/review/cli-main.js +5 -0
  441. package/dist/nerves/review/cli.js +156 -0
  442. package/dist/nerves/review/core.js +159 -0
  443. package/dist/nerves/runtime.js +17 -1
  444. package/dist/repertoire/ado-client.js +15 -56
  445. package/dist/repertoire/ado-semantic.js +16 -10
  446. package/dist/repertoire/api-client.js +97 -0
  447. package/dist/repertoire/bitwarden-store.js +1199 -0
  448. package/dist/repertoire/bundle-templates.js +71 -0
  449. package/dist/repertoire/bw-installer.js +231 -0
  450. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  451. package/dist/repertoire/coding/context-pack.js +331 -0
  452. package/dist/repertoire/coding/feedback.js +146 -34
  453. package/dist/repertoire/coding/index.js +15 -3
  454. package/dist/repertoire/coding/manager.js +159 -10
  455. package/dist/repertoire/coding/spawner.js +40 -11
  456. package/dist/repertoire/coding/tools.js +182 -18
  457. package/dist/repertoire/coding/workbench-client.js +272 -0
  458. package/dist/repertoire/coding/workbench-manager.js +346 -0
  459. package/dist/repertoire/commerce-errors.js +109 -0
  460. package/dist/repertoire/commerce-self-test.js +156 -0
  461. package/dist/repertoire/credential-access.js +183 -0
  462. package/dist/repertoire/desk/classifier.js +362 -0
  463. package/dist/repertoire/duffel-client.js +185 -0
  464. package/dist/repertoire/github-client.js +14 -55
  465. package/dist/repertoire/graph-client.js +11 -52
  466. package/dist/repertoire/guardrails.js +1196 -20
  467. package/dist/repertoire/house-sweep.js +471 -0
  468. package/dist/repertoire/mcp-client.js +58 -5
  469. package/dist/repertoire/mcp-manager.js +427 -139
  470. package/dist/repertoire/mcp-tools.js +132 -0
  471. package/dist/repertoire/mcp-write-guard.js +46 -0
  472. package/dist/repertoire/plugin-mcp.js +175 -0
  473. package/dist/repertoire/plugins.js +253 -0
  474. package/dist/repertoire/relationship-authorization.js +322 -0
  475. package/dist/repertoire/sanctuary-container-policy.js +50 -0
  476. package/dist/repertoire/shell-sessions.js +134 -0
  477. package/dist/repertoire/skills.js +48 -4
  478. package/dist/repertoire/stripe-client.js +131 -0
  479. package/dist/repertoire/tool-arguments.js +182 -0
  480. package/dist/repertoire/tool-results.js +29 -0
  481. package/dist/repertoire/tools-a2a.js +742 -0
  482. package/dist/repertoire/tools-attachments.js +322 -0
  483. package/dist/repertoire/tools-awaiting.js +897 -0
  484. package/dist/repertoire/tools-base.js +83 -1168
  485. package/dist/repertoire/tools-bluebubbles.js +2 -0
  486. package/dist/repertoire/tools-bridge.js +144 -0
  487. package/dist/repertoire/tools-bundle.js +995 -0
  488. package/dist/repertoire/tools-commerce.js +253 -0
  489. package/dist/repertoire/tools-config.js +186 -0
  490. package/dist/repertoire/tools-continuity.js +588 -0
  491. package/dist/repertoire/tools-credential.js +383 -0
  492. package/dist/repertoire/tools-escalation.js +84 -0
  493. package/dist/repertoire/tools-evolution.js +527 -0
  494. package/dist/repertoire/tools-files.js +362 -0
  495. package/dist/repertoire/tools-flight.js +290 -0
  496. package/dist/repertoire/tools-flow.js +119 -0
  497. package/dist/repertoire/tools-friend-link.js +57 -0
  498. package/dist/repertoire/tools-github.js +3 -8
  499. package/dist/repertoire/tools-habits.js +103 -0
  500. package/dist/repertoire/tools-house-care.js +174 -0
  501. package/dist/repertoire/tools-mail.js +1828 -0
  502. package/dist/repertoire/tools-notes.js +501 -0
  503. package/dist/repertoire/tools-obligations.js +182 -0
  504. package/dist/repertoire/tools-orientation.js +31 -0
  505. package/dist/repertoire/tools-record.js +482 -0
  506. package/dist/repertoire/tools-rsvp.js +139 -0
  507. package/dist/repertoire/tools-runtime.js +238 -0
  508. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  509. package/dist/repertoire/tools-session.js +1141 -0
  510. package/dist/repertoire/tools-shell.js +154 -0
  511. package/dist/repertoire/tools-shepherd-guidance.js +171 -0
  512. package/dist/repertoire/tools-shepherd.js +325 -0
  513. package/dist/repertoire/tools-steward-policy.js +147 -0
  514. package/dist/repertoire/tools-stripe.js +224 -0
  515. package/dist/repertoire/tools-surface.js +369 -0
  516. package/dist/repertoire/tools-teams.js +50 -39
  517. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  518. package/dist/repertoire/tools-travel.js +125 -0
  519. package/dist/repertoire/tools-trip.js +982 -0
  520. package/dist/repertoire/tools-unraid.js +556 -0
  521. package/dist/repertoire/tools-user-profile.js +146 -0
  522. package/dist/repertoire/tools-vault.js +40 -0
  523. package/dist/repertoire/tools-voice-local.js +198 -0
  524. package/dist/repertoire/tools-voice.js +145 -0
  525. package/dist/repertoire/tools.js +519 -156
  526. package/dist/repertoire/travel-api-client.js +360 -0
  527. package/dist/repertoire/unraid-client.js +155 -0
  528. package/dist/repertoire/unraid-restart.js +339 -0
  529. package/dist/repertoire/user-profile.js +131 -0
  530. package/dist/repertoire/vault-setup.js +246 -0
  531. package/dist/repertoire/vault-unlock.js +686 -0
  532. package/dist/rsvp/aisleplanner-client.js +354 -0
  533. package/dist/rsvp/cli.js +936 -0
  534. package/dist/rsvp/config.js +327 -0
  535. package/dist/rsvp/cutover.js +453 -0
  536. package/dist/rsvp/diagnostics.js +232 -0
  537. package/dist/rsvp/diff-renderer.js +176 -0
  538. package/dist/rsvp/habit-policy.js +110 -0
  539. package/dist/rsvp/habit-stage.js +123 -0
  540. package/dist/rsvp/incident-bundle.js +97 -0
  541. package/dist/rsvp/migration.js +204 -0
  542. package/dist/rsvp/native-habit-runner.js +630 -0
  543. package/dist/rsvp/outbound-state.js +628 -0
  544. package/dist/rsvp/query.js +118 -0
  545. package/dist/rsvp/replay.js +233 -0
  546. package/dist/rsvp/snapshot.js +232 -0
  547. package/dist/rsvp/spend-ledger.js +175 -0
  548. package/dist/scripts/claude-code-hook.js +41 -0
  549. package/dist/scripts/claude-code-stop-hook.js +47 -0
  550. package/dist/senses/a2a-entry.js +140 -0
  551. package/dist/senses/acp-server.js +386 -0
  552. package/dist/senses/attention-queue.js +186 -0
  553. package/dist/senses/await-turn-message.js +65 -0
  554. package/dist/senses/bluebubbles/active-turns.js +216 -0
  555. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  556. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  557. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +393 -43
  558. package/dist/senses/bluebubbles/context-packet.js +207 -0
  559. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  560. package/dist/senses/bluebubbles/entry.js +90 -0
  561. package/dist/senses/bluebubbles/host-account-verifier.js +88 -0
  562. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  563. package/dist/senses/bluebubbles/index.js +4054 -0
  564. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  565. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  566. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  567. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  568. package/dist/senses/bluebubbles/outbound-state.js +335 -0
  569. package/dist/senses/bluebubbles/processed-log.js +133 -0
  570. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  571. package/dist/senses/bluebubbles/replay.js +284 -0
  572. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  573. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  574. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  575. package/dist/senses/bluebubbles/webhook-registration.js +257 -0
  576. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  577. package/dist/senses/cli/bracketed-paste.js +82 -0
  578. package/dist/senses/cli/image-paste.js +287 -0
  579. package/dist/senses/cli/image-ref-navigation.js +75 -0
  580. package/dist/senses/cli/ink-app.js +156 -0
  581. package/dist/senses/cli/inline-diff.js +64 -0
  582. package/dist/senses/cli/input-keys.js +174 -0
  583. package/dist/senses/cli/kill-ring.js +86 -0
  584. package/dist/senses/cli/message-list.js +51 -0
  585. package/dist/senses/cli/ouro-tui.js +607 -0
  586. package/dist/senses/cli/spinner-imperative.js +135 -0
  587. package/dist/senses/cli/spinner.js +101 -0
  588. package/dist/senses/cli/status-line.js +60 -0
  589. package/dist/senses/cli/streaming-markdown.js +526 -0
  590. package/dist/senses/cli/tool-display.js +85 -0
  591. package/dist/senses/cli/tool-render.js +85 -0
  592. package/dist/senses/cli/tui-store.js +241 -0
  593. package/dist/senses/cli/virtual-list.js +35 -0
  594. package/dist/senses/cli-entry.js +60 -8
  595. package/dist/senses/cli.js +570 -309
  596. package/dist/senses/commands.js +66 -3
  597. package/dist/senses/context-packet-ledger.js +371 -0
  598. package/dist/senses/context-packets.js +154 -0
  599. package/dist/senses/habit-lifecycle-guard.js +24 -0
  600. package/dist/senses/habit-turn-message.js +160 -0
  601. package/dist/senses/ingress-evidence.js +2 -0
  602. package/dist/senses/mail-entry.js +66 -0
  603. package/dist/senses/mail.js +524 -0
  604. package/dist/senses/pipeline.js +1158 -204
  605. package/dist/senses/private-runtime-worker.js +857 -0
  606. package/dist/senses/private-runtime.js +1627 -0
  607. package/dist/senses/proactive-content-guard.js +51 -0
  608. package/dist/senses/root-host-approval-port.js +345 -0
  609. package/dist/senses/root-host-approval-runtime.js +393 -0
  610. package/dist/senses/sanctuary-authority-resident.js +102 -0
  611. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  612. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  613. package/dist/senses/sanctuary-grounding.js +118 -0
  614. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  615. package/dist/senses/sanctuary-health-acceptance-probe.js +786 -0
  616. package/dist/senses/sanctuary-health-runner.js +106 -0
  617. package/dist/senses/sanctuary-health.js +442 -0
  618. package/dist/senses/sanctuary-house.js +97 -0
  619. package/dist/senses/sanctuary-install-state-contract.js +169 -0
  620. package/dist/senses/sanctuary-interactive-control.js +410 -0
  621. package/dist/senses/sanctuary-media-catalog-contract.js +268 -0
  622. package/dist/senses/sanctuary-media-optimization.js +517 -0
  623. package/dist/senses/sanctuary-runtime.js +390 -0
  624. package/dist/senses/sanctuary-sab.js +85 -0
  625. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  626. package/dist/senses/shared-turn.js +832 -0
  627. package/dist/senses/shepherd/agent-presentation.js +88 -0
  628. package/dist/senses/shepherd/attention-page.js +166 -0
  629. package/dist/senses/shepherd/attention-sidebar.js +76 -0
  630. package/dist/senses/shepherd/attention.js +295 -0
  631. package/dist/senses/shepherd/checkin-config.js +76 -0
  632. package/dist/senses/shepherd/checkin-store.js +386 -0
  633. package/dist/senses/shepherd/client.js +196 -0
  634. package/dist/senses/shepherd/cmux.js +483 -0
  635. package/dist/senses/shepherd/composer.js +336 -0
  636. package/dist/senses/shepherd/copilot-app.js +648 -0
  637. package/dist/senses/shepherd/feedback-reply.js +108 -0
  638. package/dist/senses/shepherd/feedback-source.js +20 -0
  639. package/dist/senses/shepherd/feedback-store.js +331 -0
  640. package/dist/senses/shepherd/feedback-submit.js +182 -0
  641. package/dist/senses/shepherd/feedback-worker.js +208 -0
  642. package/dist/senses/shepherd/guidance.js +273 -0
  643. package/dist/senses/shepherd/herdr.js +427 -0
  644. package/dist/senses/shepherd/host.js +17 -0
  645. package/dist/senses/shepherd/human-decision-guard.js +29 -0
  646. package/dist/senses/shepherd/judge-evaluation-command.js +183 -0
  647. package/dist/senses/shepherd/judge-evaluation-entry.js +13 -0
  648. package/dist/senses/shepherd/judge-evaluation.js +155 -0
  649. package/dist/senses/shepherd/judge.js +210 -0
  650. package/dist/senses/shepherd/notice-outbox.js +262 -0
  651. package/dist/senses/shepherd/observation-publisher.js +320 -0
  652. package/dist/senses/shepherd/operations-defaults.js +86 -0
  653. package/dist/senses/shepherd/operations.js +159 -0
  654. package/dist/senses/shepherd/owner-notice.js +489 -0
  655. package/dist/senses/shepherd/prompt-state.js +60 -0
  656. package/dist/senses/shepherd/recovery.js +543 -0
  657. package/dist/senses/shepherd/redact.js +66 -0
  658. package/dist/senses/shepherd/returns.js +79 -0
  659. package/dist/senses/shepherd/sense.js +849 -0
  660. package/dist/senses/shepherd/shepherd-judge-corpus-v1.json +170 -0
  661. package/dist/senses/shepherd/surface.js +123 -0
  662. package/dist/senses/shepherd/target-binding.js +13 -0
  663. package/dist/senses/shepherd/terminal-process.js +147 -0
  664. package/dist/senses/shepherd-entry.js +98 -0
  665. package/dist/senses/surface-tool.js +109 -0
  666. package/dist/senses/teams-entry.js +68 -8
  667. package/dist/senses/teams-image.js +119 -0
  668. package/dist/senses/teams.js +998 -337
  669. package/dist/senses/telegram-admission.js +718 -0
  670. package/dist/senses/telegram-approval-runtime.js +793 -0
  671. package/dist/senses/telegram-attachments.js +186 -0
  672. package/dist/senses/telegram-audit-ledger.js +220 -0
  673. package/dist/senses/telegram-authority-transport.js +231 -0
  674. package/dist/senses/telegram-client.js +1755 -0
  675. package/dist/senses/telegram-effect-adapter.js +904 -0
  676. package/dist/senses/telegram-entry.js +83 -0
  677. package/dist/senses/telegram-handoff.js +154 -0
  678. package/dist/senses/telegram.js +2474 -0
  679. package/dist/senses/trust-gate.js +104 -9
  680. package/dist/senses/voice/audio-playback.js +237 -0
  681. package/dist/senses/voice/audio-routing.js +119 -0
  682. package/dist/senses/voice/call-auth.js +250 -0
  683. package/dist/senses/voice/elevenlabs.js +202 -0
  684. package/dist/senses/voice/floor-control.js +431 -0
  685. package/dist/senses/voice/floor-controller.js +115 -0
  686. package/dist/senses/voice/golden-path.js +116 -0
  687. package/dist/senses/voice/index.js +29 -0
  688. package/dist/senses/voice/local-audio-control.js +344 -0
  689. package/dist/senses/voice/local-audio-devices.js +516 -0
  690. package/dist/senses/voice/local-audio-disclosure.js +174 -0
  691. package/dist/senses/voice/local-audio-identity.js +103 -0
  692. package/dist/senses/voice/local-audio-join.js +325 -0
  693. package/dist/senses/voice/local-audio-mute.js +199 -0
  694. package/dist/senses/voice/local-audio-notify.js +124 -0
  695. package/dist/senses/voice/local-audio-prompts.js +116 -0
  696. package/dist/senses/voice/local-audio-transport.js +427 -0
  697. package/dist/senses/voice/local-audio.js +281 -0
  698. package/dist/senses/voice/local-media-stream.js +145 -0
  699. package/dist/senses/voice/meeting.js +113 -0
  700. package/dist/senses/voice/outbound.js +190 -0
  701. package/dist/senses/voice/phone.js +33 -0
  702. package/dist/senses/voice/playback.js +139 -0
  703. package/dist/senses/voice/process-guards.js +51 -0
  704. package/dist/senses/voice/realtime-eval.js +496 -0
  705. package/dist/senses/voice/realtime-tool-schema.js +195 -0
  706. package/dist/senses/voice/realtime-trace.js +531 -0
  707. package/dist/senses/voice/transcript.js +70 -0
  708. package/dist/senses/voice/turn.js +191 -0
  709. package/dist/senses/voice/twilio-phone-runtime.js +836 -0
  710. package/dist/senses/voice/twilio-phone.js +5454 -0
  711. package/dist/senses/voice/types.js +2 -0
  712. package/dist/senses/voice/whisper.js +161 -0
  713. package/dist/senses/voice-entry.js +83 -0
  714. package/dist/senses/voice-realtime-eval-command.js +99 -0
  715. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  716. package/dist/senses/voice-twilio-entry.js +87 -0
  717. package/dist/trips/core.js +138 -0
  718. package/dist/trips/store.js +265 -0
  719. package/dist/util/frontmatter.js +69 -0
  720. package/npm-shrinkwrap.json +8342 -0
  721. package/package.json +76 -13
  722. package/skills/agent-commerce.md +113 -0
  723. package/skills/browser-navigation.md +117 -0
  724. package/skills/commerce-setup-guide.md +116 -0
  725. package/skills/commerce-setup.md +84 -0
  726. package/skills/configure-dev-tools.md +99 -0
  727. package/skills/travel-planning.md +138 -0
  728. package/dist/heart/daemon/auth-flow.js +0 -430
  729. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  730. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  731. package/dist/heart/daemon/update-hooks.js +0 -138
  732. package/dist/heart/obligations.js +0 -191
  733. package/dist/heart/safe-workspace.js +0 -381
  734. package/dist/heart/session-recall.js +0 -116
  735. package/dist/mind/friends/channel.js +0 -84
  736. package/dist/mind/friends/group-context.js +0 -144
  737. package/dist/mind/friends/resolver.js +0 -84
  738. package/dist/mind/friends/store-file.js +0 -190
  739. package/dist/mind/friends/store.js +0 -4
  740. package/dist/mind/friends/tokens.js +0 -26
  741. package/dist/mind/friends/trust-explanation.js +0 -74
  742. package/dist/mind/friends/types.js +0 -29
  743. package/dist/repertoire/tasks/board.js +0 -134
  744. package/dist/repertoire/tasks/index.js +0 -224
  745. package/dist/repertoire/tasks/lifecycle.js +0 -80
  746. package/dist/repertoire/tasks/middleware.js +0 -65
  747. package/dist/repertoire/tasks/parser.js +0 -173
  748. package/dist/repertoire/tasks/scanner.js +0 -132
  749. package/dist/repertoire/tasks/transitions.js +0 -144
  750. package/dist/senses/bluebubbles-entry.js +0 -13
  751. package/dist/senses/bluebubbles.js +0 -1181
  752. package/dist/senses/debug-activity.js +0 -154
  753. package/dist/senses/inner-dialog-worker.js +0 -90
  754. package/dist/senses/inner-dialog.js +0 -525
  755. package/subagents/README.md +0 -7
  756. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  757. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  758. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  759. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  760. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  761. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  762. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  763. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  764. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  765. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  766. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  767. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  768. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  769. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  770. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  771. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  772. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.receiveInboundShare = receiveInboundShare;
4
+ const a2a_client_1 = require("@ouro.bot/friends/a2a-client");
5
+ const friends_1 = require("@ouro.bot/friends");
6
+ const runtime_1 = require("../nerves/runtime");
7
+ const seen_ledger_1 = require("./seen-ledger");
8
+ /** Whether the inbound message carries a friends data part (kind:"data"). */
9
+ function hasDataPart(message) {
10
+ return Array.isArray(message.parts) && message.parts.some((p) => p && p.kind === "data");
11
+ }
12
+ /**
13
+ * Bridge an inbound A2A message through friends' `receiveShare`, keying the result
14
+ * on the VERIFIED sender DID.
15
+ *
16
+ * Ordering (the security-critical trap — `trustOfSource` is read from the store BY
17
+ * the just-verified DID, never defaulted, never from the envelope):
18
+ * 1. `unwrapDataPart` — no friends part ⇒ `not-a-share` (caller does text path).
19
+ * 2. `openSealedEnvelope` (pre-unseal) — extract the SIGNED sender DID. Unseal /
20
+ * recipient-mismatch failures ⇒ `rejected` (no turn). (This open does NOT
21
+ * verify the signature; the real auth gate is the `DidVerifier` inside
22
+ * `receiveShare`, so a forged-high-trust claim here is harmless — the forge is
23
+ * rejected by the verifier regardless of the trust we read.)
24
+ * 3. `settleSender(verifiedDid)` — apply a signed rotation to that DID, or finish
25
+ * one whose record did not follow, BEFORE trust is read, so the first message
26
+ * after a rotation is judged against the moved record. A rejected rotation, or
27
+ * a record that still cannot follow ⇒ `resolve_failed`, nothing consumed. (A
28
+ * successor statement carries its own two signatures, so applying it before
29
+ * this message's signature is checked gives a forger nothing.)
30
+ * 4. `findFriendByDid(store, verifiedDid)` — read trust off that record; an
31
+ * unknown DID ⇒ `stranger` (never a default-up).
32
+ * 5. `receiveShare({ ..., trustOfSource })` — re-unseal (deterministic) + resolve
33
+ * & pin + run `DidVerifier` (forge fails HERE) + replay-dedup + import.
34
+ * 6. Map the result. `completed` ⇒ run the turn at `verifiedDid`/`trust`.
35
+ */
36
+ async function receiveInboundShare(message, deps) {
37
+ const friendsMessage = message;
38
+ const payload = (0, a2a_client_1.unwrapDataPart)(friendsMessage);
39
+ if (!payload) {
40
+ // No (valid) friends part. If there was a data part at all, it was a malformed
41
+ // friends attempt → reject; otherwise it's a legacy text message → not-a-share.
42
+ if (hasDataPart(message)) {
43
+ (0, runtime_1.emitNervesEvent)({
44
+ component: "channels",
45
+ event: "channel.a2a_inbound_rejected",
46
+ message: "rejected malformed inbound A2A data part",
47
+ meta: { reason: "malformed_message" },
48
+ });
49
+ return { outcome: "rejected", reason: "malformed_message" };
50
+ }
51
+ return { outcome: "not-a-share" };
52
+ }
53
+ const recipientIdentity = {
54
+ x25519Priv: deps.identity.x25519Priv,
55
+ x25519Pub: deps.identity.x25519Pub,
56
+ };
57
+ // Pre-unseal to learn the SIGNED sender DID before we can read its trust.
58
+ const opened = (0, a2a_client_1.openSealedEnvelope)({
59
+ sodium: deps.sodium,
60
+ sealedEnvelope: { v: payload.v, sealed: payload.sealed },
61
+ recipientDid: deps.identity.did,
62
+ recipientIdentity,
63
+ });
64
+ if (!opened.ok) {
65
+ (0, runtime_1.emitNervesEvent)({
66
+ component: "channels",
67
+ event: "channel.a2a_inbound_rejected",
68
+ message: "rejected inbound A2A envelope (unseal/recipient)",
69
+ meta: { reason: opened.error },
70
+ });
71
+ return { outcome: "rejected", reason: opened.error };
72
+ }
73
+ const verifiedDid = opened.fromAgentId;
74
+ if (!(await deps.didResolution.settleSender({ did: verifiedDid, pinStore: deps.pinStore }))) {
75
+ (0, runtime_1.emitNervesEvent)({
76
+ component: "channels",
77
+ event: "channel.a2a_inbound_rejected",
78
+ message: "rejected inbound A2A share (the sender's key rotation could not be applied)",
79
+ meta: { reason: "resolve_failed", verifiedDid },
80
+ });
81
+ return { outcome: "rejected", reason: "resolve_failed" };
82
+ }
83
+ // Read trust from the friend store BY the verified DID — never defaulted, never
84
+ // from the envelope. Unknown (or empty) DID ⇒ stranger. `findFriendByDid` itself
85
+ // refuses a falsy did (never matches a did-less record), so this is safe to call
86
+ // unconditionally.
87
+ const record = await (0, friends_1.findFriendByDid)(deps.store, verifiedDid);
88
+ const trust = record?.trustLevel ?? "stranger";
89
+ const result = await (0, a2a_client_1.receiveShare)({
90
+ sodium: deps.sodium,
91
+ store: deps.store,
92
+ missionStore: deps.missionStore,
93
+ pinStore: deps.pinStore,
94
+ didResolution: deps.didResolution,
95
+ seen: deps.seen,
96
+ a2aMessage: friendsMessage,
97
+ recipientDid: deps.identity.did,
98
+ recipientIdentity,
99
+ trustOfSource: trust,
100
+ // Every sender on friends alpha.15 or later binds its envelopes to recipient, kind, id and time; an unbound
101
+ // envelope can be replayed or re-sealed to another recipient, so it is refused.
102
+ options: { ...(0, seen_ledger_1.bindingWindowsWithinRetention)(deps.bindingOptions), rejectUnboundEnvelopes: true },
103
+ });
104
+ if (result.state === "completed") {
105
+ (0, runtime_1.emitNervesEvent)({
106
+ component: "channels",
107
+ event: "channel.a2a_inbound_verified",
108
+ message: "verified inbound A2A share; keying turn on sender DID",
109
+ meta: { verifiedDid, trust, friendsKind: result.friendsKind, status: result.status },
110
+ });
111
+ return {
112
+ outcome: "completed",
113
+ verifiedDid,
114
+ trust,
115
+ friendsKind: result.friendsKind,
116
+ status: result.status,
117
+ ...(result.message ? { message: result.message } : {}),
118
+ // Unbound envelopes are refused above, so a completed receipt always carries its signed binding id.
119
+ bindingId: result.bindingId,
120
+ /* v8 ignore next -- a completed receipt implies a trusted friend record: an unknown DID reads as stranger and is refused @preserve */
121
+ ...(record ? { friend: record } : {}),
122
+ };
123
+ }
124
+ (0, runtime_1.emitNervesEvent)({
125
+ component: "channels",
126
+ event: "channel.a2a_inbound_rejected",
127
+ message: "rejected inbound A2A share",
128
+ meta: { reason: result.reason, verifiedDid, trust },
129
+ });
130
+ return { outcome: "rejected", reason: result.reason };
131
+ }
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wrapMissionResultDataPart = wrapMissionResultDataPart;
4
+ exports.isMissionResultDataPart = isMissionResultDataPart;
5
+ exports.sealedBlobKey = sealedBlobKey;
6
+ exports.receiveInboundMissionResult = receiveInboundMissionResult;
7
+ const a2a_client_1 = require("@ouro.bot/friends/a2a-client");
8
+ const friends_1 = require("@ouro.bot/friends");
9
+ const runtime_1 = require("../nerves/runtime");
10
+ const seen_ledger_1 = require("./seen-ledger");
11
+ /**
12
+ * THE HARNESS-OWNED RESULT WIRE.
13
+ *
14
+ * A mission RESULT is NOT a `FriendsKind` (`FriendsKind` = profile_share |
15
+ * mission_share | coordination) — `prepareMissionResult`/`importMissionResult` are
16
+ * transport-agnostic + store-only, and the result does NOT ride `sendShare`/
17
+ * `receiveShare`. So the HARNESS owns the wire: the result envelope is sealed (reusing
18
+ * the sign-then-seal crypto) and wrapped in a DataPart carrying a distinct `ouroKind:
19
+ * "mission_result"` discriminator. The inbound bridge recognizes that tag and routes
20
+ * it to `importMissionResult` — NEVER to `receiveShare`, which would mis-route a
21
+ * non-`FriendsKind` envelope. This is "a DataPart variant + an inbound route branch"
22
+ * (the carrier is the friends `unwrapDataPart` shape + one extra tag field — no
23
+ * structural change beyond that).
24
+ *
25
+ * SECURITY — the wire AUTHENTICATES the sender exactly like the share path
26
+ * (`receiveShare` in friends' `adapter.ts`). `openSealedEnvelope` does AEAD
27
+ * decryption ONLY — it does NOT verify the signature (its docstring names the
28
+ * adapter's `DidVerifier` as "the single authentication gate"). The decrypted
29
+ * `envelope.fromAgentId` is therefore attacker-controlled plaintext: the recipient's
30
+ * X25519 pubkey is public (derived from the published DID), so any party can SEAL a
31
+ * forged result to us. Authentication is the ONLY barrier. Before trusting the
32
+ * claimed sender we therefore replicate `receiveShare`'s gate:
33
+ * 1. binding check — `opened.signerDid === opened.fromAgentId` (and non-empty),
34
+ * 2. resolve + pin the sender DID (TOFU pin + signed-rotation evaluation),
35
+ * 3. hand `importMissionResult` a REAL `DidVerifier` bound to the pinned key, so
36
+ * `verifier.verify(fromAgentId, proof)` runs the Ed25519 signature check against
37
+ * the pinned key — NOT the no-op `tofuVerifier` the importer defaults to.
38
+ * Replay is deduped on a hash of the whole sealed blob (durable `SeenLedger`), matching the share path.
39
+ */
40
+ const OURO_RESULT_KIND = "mission_result";
41
+ /** Wrap a sealed result envelope into the harness-owned `mission_result` DataPart. */
42
+ function wrapMissionResultDataPart(input) {
43
+ return {
44
+ messageId: `result-${Math.random().toString(36).slice(2)}`,
45
+ role: "agent",
46
+ parts: [{
47
+ kind: "data",
48
+ data: {
49
+ v: input.sealedEnvelope.v,
50
+ sealed: input.sealedEnvelope.sealed,
51
+ recipientDid: input.recipientDid,
52
+ ouroKind: OURO_RESULT_KIND,
53
+ },
54
+ }],
55
+ };
56
+ }
57
+ /** Whether an inbound message carries the harness-owned `mission_result` DataPart. */
58
+ function isMissionResultDataPart(message) {
59
+ if (!Array.isArray(message.parts))
60
+ return false;
61
+ return message.parts.some((p) => p && p.kind === "data" && typeof p.data === "object" && p.data !== null
62
+ && p.data.ouroKind === OURO_RESULT_KIND);
63
+ }
64
+ /** Extract the sealed envelope from a `mission_result` DataPart, or null. */
65
+ function unwrapMissionResultDataPart(message) {
66
+ if (!Array.isArray(message.parts) || message.parts.length !== 1)
67
+ return null;
68
+ const part = message.parts[0];
69
+ if (!part || part.kind !== "data" || !part.data)
70
+ return null;
71
+ const data = part.data;
72
+ if (data.ouroKind !== OURO_RESULT_KIND)
73
+ return null;
74
+ if (typeof data.v !== "number" || typeof data.recipientDid !== "string" || !data.sealed)
75
+ return null;
76
+ return { sealed: { v: data.v, sealed: data.sealed }, recipientDid: data.recipientDid };
77
+ }
78
+ /** The ledger key for one sealed blob: a hash over its ephemeral key, nonce and ciphertext. Same form as friends'
79
+ * `receiveShare` key, so a blob accepted on either path is a replay on the other. */
80
+ function sealedBlobKey(sodium, blob) {
81
+ const digest = sodium.crypto_generichash(24, `${blob.ePk}|${blob.n}|${blob.ct}`, null);
82
+ return `blob:${sodium.to_base64(digest, sodium.base64_variants.URLSAFE_NO_PADDING)}`;
83
+ }
84
+ /** Results being processed, per seen ledger: a parallel duplicate is refused as `in_flight` (retryable) without
85
+ * touching the durable ledger, matching friends' `receiveShare`. */
86
+ const IN_FLIGHT = new WeakMap();
87
+ function inFlightFor(seen) {
88
+ let set = IN_FLIGHT.get(seen);
89
+ if (!set) {
90
+ set = new Set();
91
+ IN_FLIGHT.set(seen, set);
92
+ }
93
+ return set;
94
+ }
95
+ function rejectResult(reason, message, meta = {}) {
96
+ (0, runtime_1.emitNervesEvent)({ component: "channels", event: "channel.a2a_result_rejected", message, meta: { reason, ...meta } });
97
+ return { outcome: "rejected", reason };
98
+ }
99
+ /**
100
+ * Route an inbound `mission_result` DataPart to `importMissionResult`, AUTHENTICATING
101
+ * the sender exactly like `receiveShare` does for every other inbound kind.
102
+ *
103
+ * Ordering (mirrors the share bridge's trust trap + authentication gate):
104
+ * 1. recognize + unwrap the harness `mission_result` carrier (else `not-a-result`).
105
+ * 2. replay dedup on a hash of the whole sealed blob, then the in-flight claim on
106
+ * that hash. The bare seal nonce is never consulted.
107
+ * 3. `openSealedEnvelope` → AEAD-decrypt only (unseal/recipient failures → reject).
108
+ * 4. sender binding — reject unless `opened.signerDid === opened.fromAgentId` (and
109
+ * non-empty): the advisory `signerDid` (outer, unsigned) must match the claimed
110
+ * sender. A divergence is a forged/spoofed bundle (`sender_binding_mismatch`).
111
+ * 5. a retired sender pin → `retired_pin`.
112
+ * 6. the signed envelope binding (`checkEnvelopeBinding`: this recipient, this kind,
113
+ * a fresh issue time, an unseen `mid:` message id), then claim the blob hash and
114
+ * the `mid:` key in flight (released on every exit).
115
+ * 7. `settleSender` — apply a signed rotation to the sender DID, or finish one whose
116
+ * record did not follow, BEFORE trust is read (refused → `resolve_failed`).
117
+ * 8. read trust by the sender DID, then `resolveAndPin` it (TOFU pin) → the pinned
118
+ * key (unresolvable → `resolve_failed`).
119
+ * 9. build a `DidVerifier` bound to THIS envelope + the pinned key and call
120
+ * `importMissionResult({ envelope, fromAgentId: <signed DID>, trustOfSource },
121
+ * { verifier })`. The verifier runs the REAL signature check against the pinned
122
+ * key and marks the claimed keys seen only when it passes; a result signed with
123
+ * any other key is rejected (`untrusted_source`). Every authorization gate
124
+ * (no_mission / no_delegation / assignee_mismatch, fail-closed on a legacy
125
+ * assignee-less delegation) is still enforced by the importer.
126
+ */
127
+ async function receiveInboundMissionResult(message, deps) {
128
+ const payload = unwrapMissionResultDataPart(message);
129
+ if (!payload)
130
+ return { outcome: "not-a-result" };
131
+ // Replay dedup BEFORE any state change, keyed only on a hash of the whole sealed blob. The sender picks the seal
132
+ // nonce, and friends' share path marks a bare nonce for any share whose signature verifies, so reading the bare nonce
133
+ // here would let a stranger's share or result burn a real result. A re-sealed copy of the same signed result is still
134
+ // refused by its `mid:` key, and re-importing a result changes nothing (the first result per request wins).
135
+ const blobKey = sealedBlobKey(deps.sodium, payload.sealed.sealed);
136
+ if (deps.seen.isSeen(blobKey)) {
137
+ return rejectResult("replayed", "rejected inbound mission_result (already received)");
138
+ }
139
+ const inFlight = inFlightFor(deps.seen);
140
+ if (inFlight.has(blobKey))
141
+ return rejectResult("in_flight", "rejected inbound mission_result (the same result is being processed)");
142
+ const recipientIdentity = { x25519Priv: deps.identity.x25519Priv, x25519Pub: deps.identity.x25519Pub };
143
+ const opened = (0, a2a_client_1.openSealedEnvelope)({
144
+ sodium: deps.sodium,
145
+ sealedEnvelope: payload.sealed,
146
+ recipientDid: deps.identity.did,
147
+ recipientIdentity,
148
+ });
149
+ if (!opened.ok) {
150
+ (0, runtime_1.emitNervesEvent)({
151
+ component: "channels",
152
+ event: "channel.a2a_result_rejected",
153
+ message: "rejected inbound mission_result (unseal/recipient)",
154
+ meta: { reason: opened.error },
155
+ });
156
+ return { outcome: "rejected", reason: opened.error };
157
+ }
158
+ // SECURITY (binding): the trustworthy sender identity is the SIGNED `fromAgentId`.
159
+ // `openSealedEnvelope` does NOT verify the signature, so `fromAgentId` is untrusted
160
+ // until the DidVerifier confirms the pinned key signed THIS envelope. The advisory
161
+ // `signerDid` (from the outer, unsigned sealed plaintext) must match the claimed
162
+ // sender; a divergence is a forged/spoofed bundle (e.g. an attacker signing with its
163
+ // OWN key while claiming a victim's DID). Reject before resolving or importing.
164
+ const senderDid = opened.fromAgentId;
165
+ if (senderDid.length === 0 || opened.signerDid !== senderDid) {
166
+ (0, runtime_1.emitNervesEvent)({
167
+ component: "channels",
168
+ event: "channel.a2a_result_rejected",
169
+ message: "rejected inbound mission_result (sender binding mismatch — forged sender)",
170
+ meta: { reason: "sender_binding_mismatch", claimedDid: senderDid, signerDid: opened.signerDid },
171
+ });
172
+ return { outcome: "rejected", reason: "sender_binding_mismatch" };
173
+ }
174
+ // A retired pin is a tombstone: the old DID's key verifies nothing (matches receiveShare).
175
+ if (deps.pinStore.get(senderDid)?.retiredBy !== undefined) {
176
+ return rejectResult("retired_pin", "rejected inbound mission_result (the sender's DID was rotated away)", { verifiedDid: senderDid });
177
+ }
178
+ // The signed binding: this recipient, this kind, a fresh issue time and an unseen message id.
179
+ const binding = (0, a2a_client_1.checkEnvelopeBinding)(opened, { ...(0, seen_ledger_1.bindingWindowsWithinRetention)(deps.bindingOptions), rejectUnboundEnvelopes: true, recipientDid: deps.identity.did, seen: deps.seen });
180
+ if (!binding.ok)
181
+ return rejectResult(binding.reason, "rejected inbound mission_result (signed binding)", { verifiedDid: senderDid });
182
+ /* v8 ignore next -- an unbound envelope is refused above, so a passing binding always carries its seen key @preserve */
183
+ const claimed = binding.seenKey ? [blobKey, binding.seenKey] : [blobKey];
184
+ /* v8 ignore next -- the same binding id under a different seal nonce needs a hand-built seal (sealEnvelope mints a fresh id) @preserve */
185
+ if (claimed.some((key) => inFlight.has(key)))
186
+ return rejectResult("in_flight", "rejected inbound mission_result (the same result is being processed)");
187
+ for (const key of claimed)
188
+ inFlight.add(key);
189
+ try {
190
+ return await processClaimedResult(opened, senderDid, claimed, deps);
191
+ }
192
+ finally {
193
+ for (const key of claimed)
194
+ inFlight.delete(key);
195
+ }
196
+ }
197
+ async function processClaimedResult(opened, senderDid, claimed, deps) {
198
+ // Settle a rotation to this DID first, so the first result after it is judged against the moved record.
199
+ if (!(await deps.didResolution.settleSender({ did: senderDid, pinStore: deps.pinStore }))) {
200
+ return rejectResult("resolve_failed", "rejected inbound mission_result (the sender's key rotation could not be applied)", { verifiedDid: senderDid });
201
+ }
202
+ // Read trust from the friend store BY the verified DID — never defaulted, never from
203
+ // the envelope. Unknown (or empty) DID ⇒ stranger.
204
+ const record = await (0, friends_1.findFriendByDid)(deps.store, senderDid);
205
+ const trust = record?.trustLevel ?? "stranger";
206
+ // Resolve + pin the SENDER's DID (async — BEFORE the sync verifier/importer).
207
+ const resolved = await deps.didResolution.resolveAndPin({
208
+ fromAgentId: senderDid,
209
+ did: senderDid,
210
+ pinStore: deps.pinStore,
211
+ trustOfSource: trust,
212
+ });
213
+ if (!resolved) {
214
+ (0, runtime_1.emitNervesEvent)({
215
+ component: "channels",
216
+ event: "channel.a2a_result_rejected",
217
+ message: "rejected inbound mission_result (sender DID resolve/pin failed)",
218
+ meta: { reason: "resolve_failed", verifiedDid: senderDid, trust },
219
+ });
220
+ return { outcome: "rejected", reason: "resolve_failed" };
221
+ }
222
+ // Build the sync verifier bound to THIS envelope + the pinned sender key. This is the
223
+ // single authentication gate (the importer would otherwise default to the no-op TOFU
224
+ // verifier). `verify` confirms the agentId===did binding AND the Ed25519 signature
225
+ // over the envelope against the pinned key.
226
+ const didVerifier = new a2a_client_1.DidVerifier({
227
+ sodium: deps.sodium,
228
+ pinnedEd25519Pub: resolved.ed25519Pub,
229
+ pinnedDid: senderDid,
230
+ envelope: opened.envelope,
231
+ });
232
+ // The result is consumed the moment its signature verifies (and not before), so a failure before that leaves it
233
+ // redeliverable. The keys are the whole-blob hash and the sender-scoped `mid:` id, so no other sender's message,
234
+ // share or result, can burn this one by reusing its seal nonce.
235
+ const verifier = {
236
+ verify(fromAgentId, proof) {
237
+ const ok = didVerifier.verify(fromAgentId, proof);
238
+ if (ok)
239
+ for (const key of claimed)
240
+ deps.seen.markSeen(key);
241
+ return ok;
242
+ },
243
+ };
244
+ const result = await (0, friends_1.importMissionResult)(deps.missionStore, {
245
+ envelope: opened.envelope,
246
+ fromAgentId: senderDid,
247
+ trustOfSource: trust,
248
+ }, { verifier });
249
+ if (result.ok) {
250
+ (0, runtime_1.emitNervesEvent)({
251
+ component: "channels",
252
+ event: "channel.a2a_result_imported",
253
+ message: "imported inbound mission_result (authenticated, quarantined, attributed)",
254
+ meta: { verifiedDid: senderDid, trust, status: result.status },
255
+ });
256
+ return { outcome: "imported", verifiedDid: senderDid };
257
+ }
258
+ (0, runtime_1.emitNervesEvent)({
259
+ component: "channels",
260
+ event: "channel.a2a_result_rejected",
261
+ message: "rejected inbound mission_result (import gate)",
262
+ meta: { reason: result.status, verifiedDid: senderDid, trust },
263
+ });
264
+ return { outcome: "rejected", reason: result.status };
265
+ }
@@ -0,0 +1,133 @@
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.onboardA2APeer = onboardA2APeer;
37
+ exports.onboardA2AClientByDid = onboardA2AClientByDid;
38
+ const path = __importStar(require("node:path"));
39
+ const identity_1 = require("../heart/identity");
40
+ const runtime_1 = require("../nerves/runtime");
41
+ const friends_1 = require("@ouro.bot/friends");
42
+ const a2a_client_1 = require("@ouro.bot/friends/a2a-client");
43
+ const client_1 = require("./client");
44
+ function storeFor(options) {
45
+ if (options.store)
46
+ return options.store;
47
+ /* v8 ignore next -- default bundle root fallback is owned by identity path tests; CLI and onboarding tests inject explicit roots @preserve */
48
+ return new friends_1.FileFriendStore(path.join(options.bundlesRoot ?? (0, identity_1.getAgentBundlesRoot)(), `${options.agentName}.ouro`, "friends"));
49
+ }
50
+ /** The normalized card URL (legacy URL-keyed identity for did-less cards). */
51
+ function urlAgentId(cardUrl) {
52
+ const parsed = new URL(cardUrl);
53
+ parsed.hash = "";
54
+ return parsed.toString();
55
+ }
56
+ async function onboardA2APeer(options) {
57
+ // HTTP/URL glue stays harness-side: fetch the agent card, resolve its JSON-RPC
58
+ // endpoint, and derive the stable agentId. The record-shaping (mint/update the
59
+ // agent-peer friend) is delegated to @ouro.bot/friends' upsertAgentPeer.
60
+ const card = await (0, client_1.fetchA2AAgentCard)(options.cardUrl, options.fetchImpl);
61
+ const store = storeFor(options);
62
+ /* v8 ignore next -- fetchA2AAgentCard validates a usable endpoint or legacy url before returning a card @preserve */
63
+ const endpointUrl = (0, client_1.endpointForCard)(card) ?? options.cardUrl;
64
+ const protocolVersion = card.supportedInterfaces?.find((entry) => entry.url === endpointUrl)?.protocolVersion
65
+ ?? card.protocolVersion;
66
+ const name = options.name ?? card.name;
67
+ // THE FOOTGUN FIX: a DID-bearing card keys the record on its VERIFIED did:key
68
+ // (so an inbound sealed envelope — keyed on the signed DID — resolves to THIS
69
+ // record, not a stranger). A did-less (legacy) card keeps the URL-keyed identity
70
+ // unchanged (backward compatible). For did:key the binding is self-contained
71
+ // (`card.did === did`, `didDoc: null`); we ALSO require the served did:key to be a
72
+ // well-formed, parseable Ed25519 key (a malformed did:key could never key/verify
73
+ // an inbound envelope, so onboarding it would silently break the resolve later). A
74
+ // card whose DID is unparseable or fails the binding is REFUSED (no record
75
+ // written) — never TOFU-trust a mis-bound or malformed card.
76
+ const did = (0, client_1.cardDid)(card);
77
+ if (did) {
78
+ const parsed = (0, a2a_client_1.parseDidKey)(did);
79
+ const bound = parsed !== null && (0, a2a_client_1.verifyCardDidBinding)({ card: { did, url: options.cardUrl }, did, didDoc: null });
80
+ if (!bound) {
81
+ (0, runtime_1.emitNervesEvent)({
82
+ component: "friends",
83
+ event: "friends.a2a_card_binding_rejected",
84
+ message: "refused A2A onboarding: card↔DID binding failed",
85
+ meta: { agentName: options.agentName, cardUrl: options.cardUrl, did, parseable: parsed !== null },
86
+ });
87
+ throw new Error(`A2A card↔DID binding failed for ${did}`);
88
+ }
89
+ }
90
+ // DID-keyed when present (externalId === did, a2a.did === did), else URL-keyed.
91
+ const externalId = did ?? urlAgentId(options.cardUrl);
92
+ const record = await (0, friends_1.upsertAgentPeer)(store, {
93
+ name,
94
+ agentId: externalId,
95
+ ...(options.trustLevel ? { trustLevel: options.trustLevel } : {}),
96
+ a2a: {
97
+ cardUrl: options.cardUrl,
98
+ endpointUrl,
99
+ agentId: externalId,
100
+ protocolVersion,
101
+ ...(did ? { did } : {}),
102
+ },
103
+ });
104
+ (0, runtime_1.emitNervesEvent)({
105
+ component: "friends",
106
+ event: "friends.a2a_peer_onboarded",
107
+ message: "onboarded A2A peer into friend model",
108
+ meta: { agentName: options.agentName, friendId: record.id, peerName: record.name, trustLevel: record.trustLevel, ...(did ? { did } : {}) },
109
+ });
110
+ return record;
111
+ }
112
+ /**
113
+ * Onboard a client that serves no agent card (for example a coding harness with a
114
+ * file-backed identity) by its did:key alone. The record is keyed on the DID, so its
115
+ * signed, sealed messages resolve to this friend; the key must parse, or nothing is written.
116
+ */
117
+ async function onboardA2AClientByDid(options) {
118
+ if ((0, a2a_client_1.parseDidKey)(options.did) === null)
119
+ throw new Error(`not a valid did:key: ${options.did}`);
120
+ const record = await (0, friends_1.upsertAgentPeer)(storeFor(options), {
121
+ name: options.name,
122
+ agentId: options.did,
123
+ ...(options.trustLevel ? { trustLevel: options.trustLevel } : {}),
124
+ a2a: { did: options.did, agentId: options.did },
125
+ });
126
+ (0, runtime_1.emitNervesEvent)({
127
+ component: "friends",
128
+ event: "friends.a2a_client_onboarded",
129
+ message: "onboarded card-less A2A client into friend model",
130
+ meta: { agentName: options.agentName, friendId: record.id, peerName: record.name, trustLevel: record.trustLevel, did: options.did },
131
+ });
132
+ return record;
133
+ }