@ouro.bot/cli 0.1.0-alpha.85 → 0.1.0-alpha.851

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 (650) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -23
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/bluebubbles-host +264 -0
  14. package/assets/sanctuary-host-launcher.sh +16 -0
  15. package/changelog.json +5434 -16
  16. package/deploy/unraid/Dockerfile +58 -0
  17. package/deploy/unraid/README.txt +2983 -0
  18. package/deploy/unraid/audit-container-spec.sh +4 -0
  19. package/deploy/unraid/container-runtime.json +1 -0
  20. package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
  21. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  22. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  23. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  24. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  25. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  26. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  27. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  28. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  29. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  30. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  31. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  32. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  33. package/deploy/unraid/sanctuary-butler-upgrade.mjs +933 -0
  34. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  35. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  36. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2084 -0
  37. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  38. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  39. package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
  40. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  41. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  42. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  43. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +1364 -0
  44. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  45. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  46. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  47. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +15 -0
  48. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
  49. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +18 -0
  50. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  51. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +220 -0
  52. package/deploy/unraid/sanctuary.xml +28 -0
  53. package/dist/a2a/card.js +57 -0
  54. package/dist/a2a/client.js +237 -0
  55. package/dist/a2a/config.js +50 -0
  56. package/dist/a2a/delegated-command.js +85 -0
  57. package/dist/a2a/delegation-stores.js +56 -0
  58. package/dist/a2a/did-resolution.js +93 -0
  59. package/dist/a2a/identity.js +204 -0
  60. package/dist/a2a/inbound-share.js +110 -0
  61. package/dist/a2a/mission-result-wire.js +196 -0
  62. package/dist/a2a/onboarding.js +133 -0
  63. package/dist/a2a/pin-store.js +132 -0
  64. package/dist/a2a/sealed-chat.js +113 -0
  65. package/dist/a2a/seen-ledger.js +120 -0
  66. package/dist/a2a/server.js +700 -0
  67. package/dist/a2a/task-store.js +69 -0
  68. package/dist/a2a/transport.js +45 -0
  69. package/dist/a2a/types.js +3 -0
  70. package/dist/arc/attention-types.js +8 -0
  71. package/dist/arc/cares.js +360 -0
  72. package/dist/arc/episodes.js +118 -0
  73. package/dist/arc/evolution.js +490 -0
  74. package/dist/arc/flight-recorder.js +1034 -0
  75. package/dist/arc/intentions.js +134 -0
  76. package/dist/arc/json-store.js +117 -0
  77. package/dist/arc/obligations.js +386 -0
  78. package/dist/arc/packets.js +336 -0
  79. package/dist/arc/presence.js +185 -0
  80. package/dist/arc/task-lifecycle.js +57 -0
  81. package/dist/commerce/store.js +755 -0
  82. package/dist/commerce/types.js +3 -0
  83. package/dist/heart/active-work.js +798 -40
  84. package/dist/heart/agent-entry.js +252 -3
  85. package/dist/heart/approval-files.js +113 -0
  86. package/dist/heart/approval-store.js +960 -0
  87. package/dist/heart/attachments/image-normalize.js +194 -0
  88. package/dist/heart/attachments/materialize.js +97 -0
  89. package/dist/heart/attachments/originals.js +88 -0
  90. package/dist/heart/attachments/render.js +29 -0
  91. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  92. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  93. package/dist/heart/attachments/sources/index.js +18 -0
  94. package/dist/heart/attachments/sources/telegram.js +71 -0
  95. package/dist/heart/attachments/store.js +132 -0
  96. package/dist/heart/attachments/types.js +93 -0
  97. package/dist/heart/auth/auth-flow.js +495 -0
  98. package/dist/heart/autonomy-budget.js +478 -0
  99. package/dist/heart/awaiting/await-alert.js +148 -0
  100. package/dist/heart/awaiting/await-expiry.js +143 -0
  101. package/dist/heart/awaiting/await-loader.js +91 -0
  102. package/dist/heart/awaiting/await-parser.js +149 -0
  103. package/dist/heart/awaiting/await-runtime-state.js +111 -0
  104. package/dist/heart/awaiting/await-scheduler.js +382 -0
  105. package/dist/heart/background-operations.js +281 -0
  106. package/dist/heart/bridges/manager.js +137 -17
  107. package/dist/heart/bridges/store.js +14 -2
  108. package/dist/heart/bundle-state.js +168 -0
  109. package/dist/heart/commitments.js +44 -18
  110. package/dist/heart/config-registry.js +331 -0
  111. package/dist/heart/config.js +174 -131
  112. package/dist/heart/context-loss-gauntlet.js +387 -0
  113. package/dist/heart/context-loss-sentinel.js +1157 -0
  114. package/dist/heart/core.js +2199 -581
  115. package/dist/heart/cross-chat-delivery.js +9 -22
  116. package/dist/heart/daemon/agent-config-check.js +451 -0
  117. package/dist/heart/daemon/agent-discovery.js +185 -3
  118. package/dist/heart/daemon/agent-service.js +542 -0
  119. package/dist/heart/daemon/agentic-repair.js +547 -0
  120. package/dist/heart/daemon/await-private-wake.js +59 -0
  121. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  122. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  123. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  124. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  125. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  126. package/dist/heart/daemon/cadence.js +180 -0
  127. package/dist/heart/daemon/cli-defaults.js +854 -0
  128. package/dist/heart/daemon/cli-desk.js +322 -0
  129. package/dist/heart/daemon/cli-exec.js +8897 -0
  130. package/dist/heart/daemon/cli-help.js +716 -0
  131. package/dist/heart/daemon/cli-parse.js +2877 -0
  132. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  133. package/dist/heart/daemon/cli-render.js +777 -0
  134. package/dist/heart/daemon/cli-types.js +8 -0
  135. package/dist/heart/daemon/connect-bay.js +323 -0
  136. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  137. package/dist/heart/daemon/container-healthcheck.js +112 -0
  138. package/dist/heart/daemon/container-runtime.js +97 -0
  139. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  140. package/dist/heart/daemon/container-spec-auditor.js +229 -0
  141. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  142. package/dist/heart/daemon/daemon-cli.js +29 -2349
  143. package/dist/heart/daemon/daemon-entry.js +930 -11
  144. package/dist/heart/daemon/daemon-health.js +186 -0
  145. package/dist/heart/daemon/daemon-rollup.js +57 -0
  146. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  147. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  148. package/dist/heart/daemon/daemon.js +2084 -105
  149. package/dist/heart/daemon/dns-workflow.js +394 -0
  150. package/dist/heart/daemon/doctor-types.js +8 -0
  151. package/dist/heart/daemon/doctor.js +1755 -0
  152. package/dist/heart/daemon/freshness.js +345 -0
  153. package/dist/heart/daemon/habit-private-wake.js +61 -0
  154. package/dist/heart/daemon/health-monitor.js +142 -11
  155. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  156. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  157. package/dist/heart/daemon/http-health-probe.js +80 -0
  158. package/dist/heart/daemon/human-command-screens.js +234 -0
  159. package/dist/heart/daemon/human-readiness.js +114 -0
  160. package/dist/heart/daemon/inner-status.js +78 -0
  161. package/dist/heart/daemon/interactive-repair.js +394 -0
  162. package/dist/heart/daemon/launchd.js +37 -8
  163. package/dist/heart/daemon/log-tailer.js +79 -10
  164. package/dist/heart/daemon/logs-prune.js +132 -0
  165. package/dist/heart/daemon/mcp-canary.js +524 -0
  166. package/dist/heart/daemon/message-router.js +65 -5
  167. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  168. package/dist/heart/daemon/os-cron-deps.js +135 -0
  169. package/dist/heart/daemon/os-cron.js +22 -14
  170. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  171. package/dist/heart/daemon/ouro-entry.js +3 -1
  172. package/dist/heart/daemon/plugin-cli.js +432 -0
  173. package/dist/heart/daemon/process-manager.js +733 -61
  174. package/dist/heart/daemon/provider-discovery.js +137 -0
  175. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  176. package/dist/heart/daemon/prunable-bundle.js +144 -0
  177. package/dist/heart/daemon/pulse.js +511 -0
  178. package/dist/heart/daemon/readiness-repair.js +365 -0
  179. package/dist/heart/daemon/run-hooks.js +2 -0
  180. package/dist/heart/daemon/runtime-logging.js +47 -14
  181. package/dist/heart/daemon/runtime-metadata.js +2 -30
  182. package/dist/heart/daemon/runtime-mode.js +13 -2
  183. package/dist/heart/daemon/safe-mode.js +161 -0
  184. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
  185. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
  186. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  187. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
  188. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  189. package/dist/heart/daemon/sanctuary-authority-epoch.js +281 -0
  190. package/dist/heart/daemon/sanctuary-authority-installation.js +161 -0
  191. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  192. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +1165 -0
  193. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  194. package/dist/heart/daemon/sanctuary-bundle-migration.js +729 -0
  195. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  196. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +493 -0
  197. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  198. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  199. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  200. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  201. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  202. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  203. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  204. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +445 -0
  205. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  206. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +663 -0
  207. package/dist/heart/daemon/sense-manager.js +699 -48
  208. package/dist/heart/daemon/session-id-resolver.js +131 -0
  209. package/dist/heart/daemon/skill-management-installer.js +1 -1
  210. package/dist/heart/daemon/socket-client.js +180 -12
  211. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  212. package/dist/heart/daemon/startup-tui.js +339 -0
  213. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  214. package/dist/heart/daemon/task-scheduler.js +117 -39
  215. package/dist/heart/daemon/terminal-ui.js +499 -0
  216. package/dist/heart/daemon/thoughts.js +138 -54
  217. package/dist/heart/daemon/up-progress.js +366 -0
  218. package/dist/heart/daemon/vault-items.js +56 -0
  219. package/dist/heart/delegation.js +1 -4
  220. package/dist/heart/external-events/router.js +1430 -0
  221. package/dist/heart/frontend-approval-runtime.js +506 -0
  222. package/dist/heart/frontend-journal.js +215 -0
  223. package/dist/heart/frontend-session-service.js +237 -0
  224. package/dist/heart/frontend-socket-client.js +164 -0
  225. package/dist/heart/frontend-socket.js +400 -0
  226. package/dist/heart/habits/habit-cancel.js +810 -0
  227. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  228. package/dist/heart/habits/habit-migration.js +194 -0
  229. package/dist/heart/habits/habit-parser.js +278 -0
  230. package/dist/heart/habits/habit-runtime-state.js +93 -0
  231. package/dist/heart/habits/habit-scheduler.js +653 -0
  232. package/dist/heart/habits/habit-session-summary.js +318 -0
  233. package/dist/heart/habits/habit-session.js +636 -0
  234. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  235. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  236. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  237. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  238. package/dist/heart/identity.js +196 -59
  239. package/dist/heart/kept-notes.js +289 -0
  240. package/dist/heart/kicks.js +1 -1
  241. package/dist/heart/machine-identity.js +161 -0
  242. package/dist/heart/mail-import-discovery.js +356 -0
  243. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  244. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  245. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  246. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  247. package/dist/heart/mailbox/mailbox-http-transport.js +129 -0
  248. package/dist/heart/mailbox/mailbox-http.js +99 -0
  249. package/dist/heart/mailbox/mailbox-read.js +39 -0
  250. package/dist/heart/mailbox/mailbox-types.js +27 -0
  251. package/dist/heart/mailbox/mailbox-view.js +197 -0
  252. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  253. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  254. package/dist/heart/mailbox/readers/mail.js +375 -0
  255. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  256. package/dist/heart/mailbox/readers/sessions.js +231 -0
  257. package/dist/heart/mailbox/readers/shared.js +111 -0
  258. package/dist/heart/mcp/mcp-server.js +696 -0
  259. package/dist/heart/migrate-config.js +100 -0
  260. package/dist/heart/model-capabilities.js +11 -0
  261. package/dist/heart/orientation-frame.js +345 -0
  262. package/dist/heart/platform.js +81 -0
  263. package/dist/heart/primitives.js +1 -1
  264. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  265. package/dist/heart/private-runtime/index.js +18 -0
  266. package/dist/heart/private-runtime/ledger.js +221 -0
  267. package/dist/heart/private-runtime/policy.js +252 -0
  268. package/dist/heart/private-runtime/types.js +2 -0
  269. package/dist/heart/progress-story.js +1 -1
  270. package/dist/heart/provider-attempt.js +137 -0
  271. package/dist/heart/provider-binding-resolver.js +273 -0
  272. package/dist/heart/provider-credentials.js +449 -0
  273. package/dist/heart/provider-failover.js +311 -0
  274. package/dist/heart/provider-models.js +96 -0
  275. package/dist/heart/provider-ping.js +265 -0
  276. package/dist/heart/provider-readiness-cache.js +119 -0
  277. package/dist/heart/provider-visibility.js +188 -0
  278. package/dist/heart/providers/anthropic-token.js +131 -0
  279. package/dist/heart/providers/anthropic.js +173 -60
  280. package/dist/heart/providers/azure.js +23 -11
  281. package/dist/heart/providers/error-classification.js +127 -0
  282. package/dist/heart/providers/github-copilot.js +34 -38
  283. package/dist/heart/providers/minimax-vlm.js +189 -0
  284. package/dist/heart/providers/minimax.js +26 -8
  285. package/dist/heart/providers/openai-codex-token.js +349 -0
  286. package/dist/heart/providers/openai-codex.js +55 -40
  287. package/dist/heart/providers/openai-compatible.js +177 -0
  288. package/dist/heart/run-ledger.js +247 -0
  289. package/dist/heart/runtime-capability-check.js +170 -0
  290. package/dist/heart/runtime-credentials.js +607 -0
  291. package/dist/heart/runtime-cwd.js +87 -0
  292. package/dist/heart/sense-truth.js +22 -4
  293. package/dist/heart/session-activity.js +92 -24
  294. package/dist/heart/session-events.js +1504 -0
  295. package/dist/heart/session-playback-cli-main.js +5 -0
  296. package/dist/heart/session-playback-cli.js +36 -0
  297. package/dist/heart/session-playback.js +231 -0
  298. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  299. package/dist/heart/session-redaction-repair.js +552 -0
  300. package/dist/heart/session-stats-cli-main.js +5 -0
  301. package/dist/heart/session-stats.js +183 -0
  302. package/dist/heart/session-transcript.js +133 -0
  303. package/dist/heart/start-of-turn-packet.js +372 -0
  304. package/dist/heart/steward-policy.js +626 -0
  305. package/dist/heart/streaming.js +604 -207
  306. package/dist/heart/structured-output.js +196 -0
  307. package/dist/heart/sync-classification.js +176 -0
  308. package/dist/heart/sync.js +505 -0
  309. package/dist/heart/target-resolution.js +11 -7
  310. package/dist/heart/tempo.js +93 -0
  311. package/dist/heart/temporal-view.js +41 -0
  312. package/dist/heart/timeouts.js +101 -0
  313. package/dist/heart/tool-activity-callbacks.js +59 -0
  314. package/dist/heart/tool-approval.js +382 -0
  315. package/dist/heart/tool-description.js +155 -0
  316. package/dist/heart/tool-friction.js +55 -0
  317. package/dist/heart/tool-loop.js +200 -0
  318. package/dist/heart/turn-context.js +487 -0
  319. package/dist/heart/turn-execution-lease.js +30 -0
  320. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  321. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  322. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  323. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  324. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  325. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  326. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  327. package/dist/heart/versioning/update-hooks.js +154 -0
  328. package/dist/heart/versioning/version-intent.js +114 -0
  329. package/dist/heart/work-card.js +380 -0
  330. package/dist/mailbox-ui/assets/index-Cyv4mw3Y.js +1 -0
  331. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  332. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  333. package/dist/mailbox-ui/index.html +16 -0
  334. package/dist/mailroom/attention.js +167 -0
  335. package/dist/mailroom/autonomy.js +209 -0
  336. package/dist/mailroom/blob-store.js +889 -0
  337. package/dist/mailroom/body-cache.js +61 -0
  338. package/dist/mailroom/cache-sync-cli.js +58 -0
  339. package/dist/mailroom/core.js +803 -0
  340. package/dist/mailroom/entry.js +160 -0
  341. package/dist/mailroom/file-store.js +568 -0
  342. package/dist/mailroom/hosted-cache-sync.js +384 -0
  343. package/dist/mailroom/mbox-import.js +393 -0
  344. package/dist/mailroom/migration.js +164 -0
  345. package/dist/mailroom/outbound.js +380 -0
  346. package/dist/mailroom/policy.js +263 -0
  347. package/dist/mailroom/reader.js +292 -0
  348. package/dist/mailroom/search-cache.js +513 -0
  349. package/dist/mailroom/search-relevance.js +319 -0
  350. package/dist/mailroom/smtp-ingress.js +176 -0
  351. package/dist/mailroom/source-state.js +176 -0
  352. package/dist/mailroom/thread.js +109 -0
  353. package/dist/mailroom/travel-extract.js +89 -0
  354. package/dist/mind/bundle-manifest.js +24 -2
  355. package/dist/mind/context.js +309 -111
  356. package/dist/mind/desk-section.js +362 -0
  357. package/dist/mind/diary-integrity.js +60 -0
  358. package/dist/mind/{memory.js → diary.js} +68 -77
  359. package/dist/mind/embedding-provider.js +60 -0
  360. package/dist/mind/file-state.js +179 -0
  361. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  362. package/dist/mind/obligation-steering.js +199 -3
  363. package/dist/mind/pending.js +36 -10
  364. package/dist/mind/prompt-budget.js +479 -0
  365. package/dist/mind/prompt-refresh.js +3 -2
  366. package/dist/mind/prompt.js +1048 -198
  367. package/dist/mind/provenance-trust.js +26 -0
  368. package/dist/mind/record-paths.js +312 -0
  369. package/dist/mind/scrutiny.js +173 -0
  370. package/dist/mind/session-transaction.js +564 -0
  371. package/dist/nerves/cli-logging.js +7 -1
  372. package/dist/nerves/coverage/audit-rules.js +15 -6
  373. package/dist/nerves/coverage/audit.js +28 -2
  374. package/dist/nerves/coverage/cli.js +1 -1
  375. package/dist/nerves/coverage/contract.js +5 -5
  376. package/dist/nerves/coverage/file-completeness.js +139 -5
  377. package/dist/nerves/coverage/run-artifacts.js +55 -35
  378. package/dist/nerves/coverage/source-scanner.js +4 -4
  379. package/dist/nerves/event-buffer.js +111 -0
  380. package/dist/nerves/index.js +293 -9
  381. package/dist/nerves/observation.js +20 -0
  382. package/dist/nerves/redact.js +79 -0
  383. package/dist/nerves/review/cli-main.js +5 -0
  384. package/dist/nerves/review/cli.js +156 -0
  385. package/dist/nerves/review/core.js +159 -0
  386. package/dist/nerves/runtime.js +17 -1
  387. package/dist/repertoire/ado-client.js +15 -56
  388. package/dist/repertoire/ado-semantic.js +16 -10
  389. package/dist/repertoire/api-client.js +97 -0
  390. package/dist/repertoire/bitwarden-store.js +1045 -0
  391. package/dist/repertoire/bundle-templates.js +71 -0
  392. package/dist/repertoire/bw-installer.js +180 -0
  393. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  394. package/dist/repertoire/coding/context-pack.js +331 -0
  395. package/dist/repertoire/coding/feedback.js +174 -32
  396. package/dist/repertoire/coding/index.js +15 -3
  397. package/dist/repertoire/coding/manager.js +159 -10
  398. package/dist/repertoire/coding/spawner.js +58 -11
  399. package/dist/repertoire/coding/tools.js +221 -15
  400. package/dist/repertoire/coding/workbench-client.js +272 -0
  401. package/dist/repertoire/coding/workbench-manager.js +346 -0
  402. package/dist/repertoire/commerce-errors.js +109 -0
  403. package/dist/repertoire/commerce-self-test.js +156 -0
  404. package/dist/repertoire/credential-access.js +178 -0
  405. package/dist/repertoire/desk/classifier.js +362 -0
  406. package/dist/repertoire/duffel-client.js +185 -0
  407. package/dist/repertoire/github-client.js +14 -55
  408. package/dist/repertoire/graph-client.js +11 -52
  409. package/dist/repertoire/guardrails.js +811 -18
  410. package/dist/repertoire/mcp-client.js +44 -3
  411. package/dist/repertoire/mcp-manager.js +427 -139
  412. package/dist/repertoire/mcp-tools.js +124 -0
  413. package/dist/repertoire/plugin-mcp.js +175 -0
  414. package/dist/repertoire/plugins.js +253 -0
  415. package/dist/repertoire/relationship-authorization.js +322 -0
  416. package/dist/repertoire/shell-sessions.js +134 -0
  417. package/dist/repertoire/skills.js +48 -4
  418. package/dist/repertoire/stripe-client.js +131 -0
  419. package/dist/repertoire/tool-arguments.js +170 -0
  420. package/dist/repertoire/tool-results.js +29 -0
  421. package/dist/repertoire/tools-a2a.js +699 -0
  422. package/dist/repertoire/tools-attachments.js +322 -0
  423. package/dist/repertoire/tools-awaiting.js +575 -0
  424. package/dist/repertoire/tools-base.js +77 -1168
  425. package/dist/repertoire/tools-bluebubbles.js +2 -0
  426. package/dist/repertoire/tools-bridge.js +144 -0
  427. package/dist/repertoire/tools-bundle.js +993 -0
  428. package/dist/repertoire/tools-commerce.js +253 -0
  429. package/dist/repertoire/tools-config.js +186 -0
  430. package/dist/repertoire/tools-continuity.js +575 -0
  431. package/dist/repertoire/tools-credential.js +383 -0
  432. package/dist/repertoire/tools-evolution.js +527 -0
  433. package/dist/repertoire/tools-files.js +344 -0
  434. package/dist/repertoire/tools-flight.js +290 -0
  435. package/dist/repertoire/tools-flow.js +119 -0
  436. package/dist/repertoire/tools-github.js +3 -8
  437. package/dist/repertoire/tools-habits.js +103 -0
  438. package/dist/repertoire/tools-mail.js +1828 -0
  439. package/dist/repertoire/tools-notes.js +485 -0
  440. package/dist/repertoire/tools-obligations.js +182 -0
  441. package/dist/repertoire/tools-orientation.js +31 -0
  442. package/dist/repertoire/tools-record.js +482 -0
  443. package/dist/repertoire/tools-rsvp.js +139 -0
  444. package/dist/repertoire/tools-runtime.js +150 -0
  445. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  446. package/dist/repertoire/tools-session.js +1133 -0
  447. package/dist/repertoire/tools-shell.js +149 -0
  448. package/dist/repertoire/tools-steward-policy.js +136 -0
  449. package/dist/repertoire/tools-stripe.js +224 -0
  450. package/dist/repertoire/tools-surface.js +369 -0
  451. package/dist/repertoire/tools-teams.js +12 -39
  452. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  453. package/dist/repertoire/tools-travel.js +125 -0
  454. package/dist/repertoire/tools-trip.js +982 -0
  455. package/dist/repertoire/tools-unraid.js +531 -0
  456. package/dist/repertoire/tools-user-profile.js +146 -0
  457. package/dist/repertoire/tools-vault.js +40 -0
  458. package/dist/repertoire/tools-voice.js +145 -0
  459. package/dist/repertoire/tools.js +504 -156
  460. package/dist/repertoire/travel-api-client.js +360 -0
  461. package/dist/repertoire/unraid-client.js +155 -0
  462. package/dist/repertoire/unraid-restart.js +339 -0
  463. package/dist/repertoire/user-profile.js +131 -0
  464. package/dist/repertoire/vault-setup.js +246 -0
  465. package/dist/repertoire/vault-unlock.js +628 -0
  466. package/dist/rsvp/aisleplanner-client.js +354 -0
  467. package/dist/rsvp/cli.js +926 -0
  468. package/dist/rsvp/config.js +327 -0
  469. package/dist/rsvp/cutover.js +433 -0
  470. package/dist/rsvp/diagnostics.js +232 -0
  471. package/dist/rsvp/diff-renderer.js +176 -0
  472. package/dist/rsvp/habit-policy.js +110 -0
  473. package/dist/rsvp/habit-stage.js +123 -0
  474. package/dist/rsvp/incident-bundle.js +97 -0
  475. package/dist/rsvp/migration.js +204 -0
  476. package/dist/rsvp/native-habit-runner.js +630 -0
  477. package/dist/rsvp/outbound-state.js +628 -0
  478. package/dist/rsvp/query.js +118 -0
  479. package/dist/rsvp/replay.js +233 -0
  480. package/dist/rsvp/snapshot.js +232 -0
  481. package/dist/rsvp/spend-ledger.js +175 -0
  482. package/dist/scripts/claude-code-hook.js +41 -0
  483. package/dist/scripts/claude-code-stop-hook.js +47 -0
  484. package/dist/senses/a2a-entry.js +126 -0
  485. package/dist/senses/acp-server.js +386 -0
  486. package/dist/senses/attention-queue.js +186 -0
  487. package/dist/senses/await-turn-message.js +58 -0
  488. package/dist/senses/bluebubbles/active-turns.js +216 -0
  489. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  490. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  491. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  492. package/dist/senses/bluebubbles/context-packet.js +207 -0
  493. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  494. package/dist/senses/bluebubbles/entry.js +90 -0
  495. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  496. package/dist/senses/bluebubbles/index.js +3841 -0
  497. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  498. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  499. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  500. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  501. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  502. package/dist/senses/bluebubbles/processed-log.js +133 -0
  503. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  504. package/dist/senses/bluebubbles/replay.js +284 -0
  505. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  506. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  507. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  508. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  509. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  510. package/dist/senses/cli/bracketed-paste.js +82 -0
  511. package/dist/senses/cli/image-paste.js +287 -0
  512. package/dist/senses/cli/image-ref-navigation.js +75 -0
  513. package/dist/senses/cli/ink-app.js +156 -0
  514. package/dist/senses/cli/inline-diff.js +64 -0
  515. package/dist/senses/cli/input-keys.js +174 -0
  516. package/dist/senses/cli/kill-ring.js +86 -0
  517. package/dist/senses/cli/message-list.js +51 -0
  518. package/dist/senses/cli/ouro-tui.js +607 -0
  519. package/dist/senses/cli/spinner-imperative.js +135 -0
  520. package/dist/senses/cli/spinner.js +101 -0
  521. package/dist/senses/cli/status-line.js +60 -0
  522. package/dist/senses/cli/streaming-markdown.js +526 -0
  523. package/dist/senses/cli/tool-display.js +85 -0
  524. package/dist/senses/cli/tool-render.js +85 -0
  525. package/dist/senses/cli/tui-store.js +241 -0
  526. package/dist/senses/cli/virtual-list.js +35 -0
  527. package/dist/senses/cli-entry.js +60 -8
  528. package/dist/senses/cli.js +604 -320
  529. package/dist/senses/commands.js +66 -3
  530. package/dist/senses/context-packet-ledger.js +371 -0
  531. package/dist/senses/context-packets.js +154 -0
  532. package/dist/senses/habit-lifecycle-guard.js +24 -0
  533. package/dist/senses/habit-turn-message.js +160 -0
  534. package/dist/senses/ingress-evidence.js +2 -0
  535. package/dist/senses/mail-entry.js +66 -0
  536. package/dist/senses/mail.js +524 -0
  537. package/dist/senses/pipeline.js +1115 -204
  538. package/dist/senses/private-runtime-worker.js +859 -0
  539. package/dist/senses/private-runtime.js +1517 -0
  540. package/dist/senses/proactive-content-guard.js +51 -0
  541. package/dist/senses/root-host-approval-port.js +345 -0
  542. package/dist/senses/root-host-approval-runtime.js +393 -0
  543. package/dist/senses/sanctuary-authority-resident.js +102 -0
  544. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  545. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  546. package/dist/senses/sanctuary-grounding.js +118 -0
  547. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  548. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  549. package/dist/senses/sanctuary-health-runner.js +100 -0
  550. package/dist/senses/sanctuary-health.js +408 -0
  551. package/dist/senses/sanctuary-install-state-contract.js +169 -0
  552. package/dist/senses/sanctuary-interactive-control.js +410 -0
  553. package/dist/senses/sanctuary-media-catalog-contract.js +297 -0
  554. package/dist/senses/sanctuary-media-optimization.js +514 -0
  555. package/dist/senses/sanctuary-runtime.js +340 -0
  556. package/dist/senses/sanctuary-sab.js +85 -0
  557. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  558. package/dist/senses/shared-turn.js +789 -0
  559. package/dist/senses/surface-tool.js +109 -0
  560. package/dist/senses/teams-entry.js +60 -8
  561. package/dist/senses/teams.js +519 -218
  562. package/dist/senses/telegram-admission.js +718 -0
  563. package/dist/senses/telegram-approval-runtime.js +793 -0
  564. package/dist/senses/telegram-attachments.js +186 -0
  565. package/dist/senses/telegram-audit-ledger.js +220 -0
  566. package/dist/senses/telegram-authority-transport.js +231 -0
  567. package/dist/senses/telegram-client.js +1749 -0
  568. package/dist/senses/telegram-effect-adapter.js +896 -0
  569. package/dist/senses/telegram-entry.js +83 -0
  570. package/dist/senses/telegram.js +2347 -0
  571. package/dist/senses/trust-gate.js +104 -9
  572. package/dist/senses/voice/audio-playback.js +237 -0
  573. package/dist/senses/voice/audio-routing.js +119 -0
  574. package/dist/senses/voice/elevenlabs.js +202 -0
  575. package/dist/senses/voice/floor-control.js +431 -0
  576. package/dist/senses/voice/floor-controller.js +115 -0
  577. package/dist/senses/voice/golden-path.js +116 -0
  578. package/dist/senses/voice/index.js +29 -0
  579. package/dist/senses/voice/meeting.js +113 -0
  580. package/dist/senses/voice/outbound.js +190 -0
  581. package/dist/senses/voice/phone.js +33 -0
  582. package/dist/senses/voice/playback.js +139 -0
  583. package/dist/senses/voice/realtime-eval.js +496 -0
  584. package/dist/senses/voice/realtime-trace.js +531 -0
  585. package/dist/senses/voice/transcript.js +70 -0
  586. package/dist/senses/voice/turn.js +191 -0
  587. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  588. package/dist/senses/voice/twilio-phone.js +5031 -0
  589. package/dist/senses/voice/types.js +2 -0
  590. package/dist/senses/voice/whisper.js +161 -0
  591. package/dist/senses/voice-entry.js +81 -0
  592. package/dist/senses/voice-realtime-eval-command.js +99 -0
  593. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  594. package/dist/senses/voice-twilio-entry.js +87 -0
  595. package/dist/trips/core.js +138 -0
  596. package/dist/trips/store.js +265 -0
  597. package/dist/util/frontmatter.js +69 -0
  598. package/npm-shrinkwrap.json +8096 -0
  599. package/package.json +72 -13
  600. package/skills/agent-commerce.md +113 -0
  601. package/skills/browser-navigation.md +117 -0
  602. package/skills/commerce-setup-guide.md +116 -0
  603. package/skills/commerce-setup.md +84 -0
  604. package/skills/configure-dev-tools.md +99 -0
  605. package/skills/travel-planning.md +138 -0
  606. package/dist/heart/daemon/auth-flow.js +0 -430
  607. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  608. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  609. package/dist/heart/daemon/update-hooks.js +0 -138
  610. package/dist/heart/obligations.js +0 -191
  611. package/dist/heart/safe-workspace.js +0 -269
  612. package/dist/heart/session-recall.js +0 -116
  613. package/dist/mind/friends/channel.js +0 -84
  614. package/dist/mind/friends/group-context.js +0 -144
  615. package/dist/mind/friends/resolver.js +0 -84
  616. package/dist/mind/friends/store-file.js +0 -190
  617. package/dist/mind/friends/store.js +0 -4
  618. package/dist/mind/friends/tokens.js +0 -26
  619. package/dist/mind/friends/trust-explanation.js +0 -74
  620. package/dist/mind/friends/types.js +0 -29
  621. package/dist/repertoire/tasks/board.js +0 -134
  622. package/dist/repertoire/tasks/index.js +0 -224
  623. package/dist/repertoire/tasks/lifecycle.js +0 -80
  624. package/dist/repertoire/tasks/middleware.js +0 -65
  625. package/dist/repertoire/tasks/parser.js +0 -173
  626. package/dist/repertoire/tasks/scanner.js +0 -132
  627. package/dist/repertoire/tasks/transitions.js +0 -144
  628. package/dist/senses/bluebubbles-entry.js +0 -13
  629. package/dist/senses/bluebubbles.js +0 -1181
  630. package/dist/senses/debug-activity.js +0 -154
  631. package/dist/senses/inner-dialog-worker.js +0 -90
  632. package/dist/senses/inner-dialog.js +0 -525
  633. package/subagents/README.md +0 -7
  634. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  635. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  636. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  637. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  638. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  639. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  640. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  641. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  642. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  643. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  644. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  645. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  646. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  647. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  648. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  649. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  650. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.A2A_DEFAULT_PATH = exports.A2A_DEFAULT_HOST = exports.A2A_DEFAULT_PROTOCOL_VERSION = void 0;
4
+ exports.defaultA2APort = defaultA2APort;
5
+ exports.normalizeA2APath = normalizeA2APath;
6
+ exports.a2aEndpointFromBaseUrl = a2aEndpointFromBaseUrl;
7
+ const node_crypto_1 = require("node:crypto");
8
+ const runtime_1 = require("../nerves/runtime");
9
+ exports.A2A_DEFAULT_PROTOCOL_VERSION = "1.0";
10
+ exports.A2A_DEFAULT_HOST = "127.0.0.1";
11
+ exports.A2A_DEFAULT_PATH = "/a2a";
12
+ function defaultA2APort(agentName) {
13
+ const digest = (0, node_crypto_1.createHash)("sha256").update(agentName).digest();
14
+ const port = 18920 + (digest[0] % 60);
15
+ (0, runtime_1.emitNervesEvent)({
16
+ component: "channels",
17
+ event: "channel.a2a_default_port",
18
+ message: "computed default A2A port",
19
+ meta: { agentName, port },
20
+ });
21
+ return port;
22
+ }
23
+ function normalizeA2APath(value) {
24
+ const trimmed = value?.trim();
25
+ const normalized = !trimmed
26
+ ? exports.A2A_DEFAULT_PATH
27
+ : trimmed.startsWith("/")
28
+ ? trimmed
29
+ : `/${trimmed}`;
30
+ (0, runtime_1.emitNervesEvent)({
31
+ component: "channels",
32
+ event: "channel.a2a_path_normalized",
33
+ message: "normalized A2A path",
34
+ meta: { normalized },
35
+ });
36
+ return normalized;
37
+ }
38
+ function a2aEndpointFromBaseUrl(baseUrl, a2aPath = exports.A2A_DEFAULT_PATH) {
39
+ const url = new URL(baseUrl);
40
+ url.pathname = normalizeA2APath(a2aPath);
41
+ url.search = "";
42
+ url.hash = "";
43
+ (0, runtime_1.emitNervesEvent)({
44
+ component: "channels",
45
+ event: "channel.a2a_endpoint_built",
46
+ message: "built A2A endpoint URL",
47
+ meta: { endpoint: url.toString() },
48
+ });
49
+ return url.toString();
50
+ }
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DELEGATED_BANNER = void 0;
4
+ exports.delegatedCommandNotice = delegatedCommandNotice;
5
+ exports.admitDelegatedCommand = admitDelegatedCommand;
6
+ const runtime_1 = require("../nerves/runtime");
7
+ const relationship_authorization_1 = require("../repertoire/relationship-authorization");
8
+ const NOTICE_EXCERPT_CHARS = 200;
9
+ /** Matches the banner only the server may put in front of an admitted command. */
10
+ exports.DELEGATED_BANNER = /^\s*\[\s*delegated command/iu;
11
+ function delegatedCommandNotice(input) {
12
+ const flat = input.text.replace(/\s+/gu, " ").trim();
13
+ const excerpt = flat.length > NOTICE_EXCERPT_CHARS ? `${flat.slice(0, NOTICE_EXCERPT_CHARS)}…` : flat;
14
+ return `Delegated command from you via ${input.delegateName}: "${excerpt}". If this wasn't you, say so here: it is on record, and the grant can be revoked.`;
15
+ }
16
+ function hasPrincipalGrant(friend) {
17
+ return friend.delegationGrant?.scope === "principal_commands";
18
+ }
19
+ async function resolvePrincipal(store, profileId) {
20
+ const friends = await store.listAll?.() ?? [];
21
+ const matches = friends.filter((friend) => friend.capabilityProfileId === profileId
22
+ && friend.trustLevel === "family" && friend.admissionState === "active");
23
+ return matches.length === 1 ? matches[0] : null;
24
+ }
25
+ async function admitDelegatedCommand(input) {
26
+ const refuse = (reason) => {
27
+ (0, runtime_1.emitNervesEvent)({
28
+ level: "warn",
29
+ component: "senses",
30
+ event: "senses.a2a_delegated_command_refused",
31
+ message: "refused a delegated A2A command",
32
+ meta: { reason, delegateFriendId: input.friend.id, commandId: input.commandId },
33
+ });
34
+ return { ok: false, reason };
35
+ };
36
+ if (!input.options)
37
+ return refuse("not_enabled");
38
+ if (!hasPrincipalGrant(input.friend))
39
+ return refuse("no_grant");
40
+ if (input.friend.trustLevel !== "family" || input.friend.admissionState === "revoked")
41
+ return refuse("not_family");
42
+ const registry = input.registry;
43
+ if (!registry)
44
+ return refuse("principal_unresolved");
45
+ const principal = await resolvePrincipal(input.store, input.options.principalProfileId);
46
+ if (!principal || principal.id === input.friend.id)
47
+ return refuse("principal_unresolved");
48
+ const noticeId = `delegated:${input.commandId}`;
49
+ try {
50
+ await input.options.notifyPrincipal({ noticeId, text: delegatedCommandNotice({ delegateName: input.friend.name, text: input.text }) });
51
+ }
52
+ catch {
53
+ return refuse("notice_failed");
54
+ }
55
+ // Owner-gated tools (steward policy) bind the mutation to `requestId` on the tool
56
+ // context's relationship, as the Telegram owner turn does; the evaluator alone
57
+ // only scopes its receipts by it, so carry it on the relationship itself.
58
+ const relationship = {
59
+ ...(0, relationship_authorization_1.createRelationshipAuthorizationEvaluator)({
60
+ friend: principal,
61
+ registry,
62
+ requestId: input.commandId,
63
+ requestPhase: "inbound",
64
+ sessionEventId: `a2a-delegated:${input.commandId}`,
65
+ }),
66
+ requestId: input.commandId,
67
+ };
68
+ const context = {
69
+ principalFriendId: principal.id,
70
+ principalName: principal.name,
71
+ delegateFriendId: input.friend.id,
72
+ delegateName: input.friend.name,
73
+ delegateDid: input.did,
74
+ commandId: input.commandId,
75
+ noticeId,
76
+ };
77
+ (0, runtime_1.emitNervesEvent)({
78
+ component: "senses",
79
+ event: "senses.a2a_delegated_command_admitted",
80
+ message: "admitted a delegated A2A command after notifying the principal",
81
+ meta: { delegateFriendId: context.delegateFriendId, principalFriendId: context.principalFriendId, commandId: context.commandId },
82
+ });
83
+ const turnText = `[delegated command from ${principal.name} via ${input.friend.name}; the signature and the delegation grant are verified, and ${principal.name} has been notified; act on it as ${principal.name}'s own request]\n\n${input.text}`;
84
+ return { ok: true, relationship, context, turnText };
85
+ }
@@ -0,0 +1,56 @@
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.delegationStoresFor = delegationStoresFor;
37
+ const path = __importStar(require("node:path"));
38
+ const friends_1 = require("@ouro.bot/friends");
39
+ const runtime_1 = require("../nerves/runtime");
40
+ function delegationStoresFor(agentRoot) {
41
+ const friendsDir = path.join(agentRoot, "friends");
42
+ const missionsDir = (0, friends_1.missionsDirFor)(friendsDir);
43
+ const grantsDir = (0, friends_1.grantsDirFor)(friendsDir);
44
+ (0, runtime_1.emitNervesEvent)({
45
+ component: "channels",
46
+ event: "channel.a2a_delegation_stores_init",
47
+ message: "initialized A2A delegation stores (mission + grant)",
48
+ meta: { missionsDir, grantsDir },
49
+ });
50
+ return {
51
+ missionStore: new friends_1.FileMissionStore(missionsDir),
52
+ grantStore: new friends_1.FileGrantStore(grantsDir),
53
+ missionsDir,
54
+ grantsDir,
55
+ };
56
+ }
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeDidResolution = makeDidResolution;
4
+ const a2a_client_1 = require("@ouro.bot/friends/a2a-client");
5
+ const runtime_1 = require("../nerves/runtime");
6
+ /**
7
+ * Build the friends `DidResolution` for did:key peers. `resolveAndPin` is the
8
+ * verify-and-pin core the inbound bridge consumes:
9
+ * parse the did:key → derive the presented Ed25519 key →
10
+ * first contact (no pin under `fromAgentId`) → TOFU `pinOnFirstContact`
11
+ * already pinned → `evaluateRotation` against the pin:
12
+ * unchanged → pin-hit, return the pinned key
13
+ * accepted → (re-pinned by evaluateRotation) return the NEW key
14
+ * rejected → loud security event, return null
15
+ *
16
+ * The pin is keyed by the STABLE `fromAgentId` (NOT the did:key string), so a
17
+ * rotation is "same `fromAgentId`, new (did, key)". An unparseable or empty DID is
18
+ * refused (null) and never matchable. The crypto is the friends primitives' — this
19
+ * only sequences them.
20
+ */
21
+ function makeDidResolution(input) {
22
+ const { sodium, rotationProofFor } = input;
23
+ return {
24
+ async resolveAndPin(args) {
25
+ const { fromAgentId, did, pinStore, trustOfSource } = args;
26
+ // Empty DID is never a matchable key.
27
+ if (!did) {
28
+ (0, runtime_1.emitNervesEvent)({
29
+ component: "channels",
30
+ event: "channel.a2a_did_resolve_refused",
31
+ message: "A2A DID resolve refused (empty DID)",
32
+ meta: { fromAgentId, reason: "empty_did" },
33
+ });
34
+ return null;
35
+ }
36
+ const parsed = (0, a2a_client_1.parseDidKey)(did);
37
+ if (!parsed) {
38
+ (0, runtime_1.emitNervesEvent)({
39
+ component: "channels",
40
+ event: "channel.a2a_did_resolve_refused",
41
+ message: "A2A DID resolve refused (unparseable did:key)",
42
+ meta: { fromAgentId, reason: "parse_failed" },
43
+ });
44
+ return null;
45
+ }
46
+ const pinned = pinStore.get(fromAgentId);
47
+ if (!pinned) {
48
+ // First contact (TOFU): accept + pin the (did, key) under fromAgentId.
49
+ (0, a2a_client_1.pinOnFirstContact)({ pinStore, fromAgentId, did, ed25519Pub: parsed.ed25519Pub });
50
+ (0, runtime_1.emitNervesEvent)({
51
+ component: "channels",
52
+ event: "channel.a2a_pin_first_contact",
53
+ message: "A2A DID pinned on first contact",
54
+ meta: { fromAgentId, did },
55
+ });
56
+ return { ed25519Pub: parsed.ed25519Pub };
57
+ }
58
+ // Already pinned: evaluate the presented key against the pin.
59
+ const rotationProof = rotationProofFor?.(fromAgentId, did, parsed.ed25519Pub);
60
+ const decision = (0, a2a_client_1.evaluateRotation)({
61
+ sodium,
62
+ pinStore,
63
+ fromAgentId,
64
+ trustOfSource,
65
+ newDid: did,
66
+ newEd25519Pub: parsed.ed25519Pub,
67
+ rotationProof,
68
+ });
69
+ if (decision.decision === "unchanged") {
70
+ // Same key — pin-hit. (FileA2APinStore.get already emitted a2a_pin_hit.)
71
+ return { ed25519Pub: parsed.ed25519Pub };
72
+ }
73
+ if (decision.decision === "accepted") {
74
+ // evaluateRotation already re-pinned to the new key under fromAgentId.
75
+ (0, runtime_1.emitNervesEvent)({
76
+ component: "channels",
77
+ event: "channel.a2a_rotation_accepted",
78
+ message: "A2A signed key rotation accepted",
79
+ meta: { fromAgentId, newDid: did, trustOfSource },
80
+ });
81
+ return { ed25519Pub: parsed.ed25519Pub };
82
+ }
83
+ // Rejected — loud security signal (carries the reason).
84
+ (0, runtime_1.emitNervesEvent)({
85
+ component: "channels",
86
+ event: "channel.a2a_rotation_rejected",
87
+ message: "A2A key rotation rejected",
88
+ meta: { fromAgentId, newDid: did, trustOfSource, reason: decision.reason },
89
+ });
90
+ return null;
91
+ },
92
+ };
93
+ }
@@ -0,0 +1,204 @@
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.readStoredA2ASeed = readStoredA2ASeed;
37
+ exports.loadOrMintA2AIdentity = loadOrMintA2AIdentity;
38
+ exports.loadSelfA2AIdentity = loadSelfA2AIdentity;
39
+ exports.loadOrMintA2AIdentityFile = loadOrMintA2AIdentityFile;
40
+ const crypto = __importStar(require("node:crypto"));
41
+ const fs = __importStar(require("node:fs"));
42
+ const path = __importStar(require("node:path"));
43
+ const os = __importStar(require("node:os"));
44
+ const a2a_client_1 = require("@ouro.bot/friends/a2a-client");
45
+ const runtime_1 = require("../nerves/runtime");
46
+ const runtime_credentials_1 = require("../heart/runtime-credentials");
47
+ const machine_identity_1 = require("../heart/machine-identity");
48
+ /** The number of raw bytes in an Ed25519 seed. */
49
+ const ED25519_SEED_BYTES = 32;
50
+ /** The machine-config key path for the persisted seed: `a2a.identity.ed25519Seed`. */
51
+ function a2aIdentityConfig(config) {
52
+ const a2a = config.a2a;
53
+ if (!a2a || typeof a2a !== "object" || Array.isArray(a2a))
54
+ return undefined;
55
+ const identity = a2a.identity;
56
+ if (!identity || typeof identity !== "object" || Array.isArray(identity))
57
+ return undefined;
58
+ return identity;
59
+ }
60
+ /** Read the stored Ed25519 seed string from a machine-config object, or undefined. */
61
+ function readStoredA2ASeed(config) {
62
+ const identity = a2aIdentityConfig(config);
63
+ const seed = identity?.ed25519Seed;
64
+ return typeof seed === "string" && seed.length > 0 ? seed : undefined;
65
+ }
66
+ /** Decode + validate a stored seed string into 32 raw bytes. Throws on malformed. */
67
+ function decodeSeed(seedString) {
68
+ let decoded;
69
+ try {
70
+ decoded = Buffer.from(seedString, "base64url");
71
+ }
72
+ catch {
73
+ /* v8 ignore next -- Buffer.from(base64url) does not throw on bad chars; this guards future decoders @preserve */
74
+ throw new Error("malformed A2A identity seed: not decodable");
75
+ }
76
+ // base64url is lenient (it silently drops invalid chars), so the length check is
77
+ // the real gate: a real Ed25519 seed is exactly 32 bytes.
78
+ if (decoded.length !== ED25519_SEED_BYTES) {
79
+ throw new Error(`malformed A2A identity seed: expected ${ED25519_SEED_BYTES}-byte seed, got ${decoded.length}`);
80
+ }
81
+ return new Uint8Array(decoded);
82
+ }
83
+ /** Mint a fresh 32-byte Ed25519 seed (Node keygen → JWK `d`, the raw seed). */
84
+ function mintSeed() {
85
+ const { privateKey } = crypto.generateKeyPairSync("ed25519");
86
+ const jwk = privateKey.export({ format: "jwk" });
87
+ /* v8 ignore next -- Node always emits the `d` field for an Ed25519 private JWK; guard protects future runtimes @preserve */
88
+ if (typeof jwk.d !== "string")
89
+ throw new Error("failed to mint A2A identity seed: missing JWK d");
90
+ return decodeSeed(jwk.d);
91
+ }
92
+ /** Derive the full did:key identity from a 32-byte seed (deterministic). */
93
+ function deriveIdentity(sodium, seed) {
94
+ const keypair = sodium.crypto_sign_seed_keypair(seed);
95
+ const didIdentity = (0, a2a_client_1.didKeyIdentityFromEd25519)({
96
+ sodium,
97
+ ed25519Pub: keypair.publicKey,
98
+ ed25519Priv: keypair.privateKey,
99
+ });
100
+ return { ...didIdentity, seed: Buffer.from(seed).toString("base64url") };
101
+ }
102
+ /**
103
+ * Load the agent's A2A identity from the machine-local config, or mint + persist
104
+ * one on first use. A malformed stored seed FAILS FAST (it never silently
105
+ * re-mints, which would change the agent's DID). The mint path persists the new
106
+ * seed via `upsert` before deriving; the load path performs no writes.
107
+ */
108
+ async function loadOrMintA2AIdentity(input) {
109
+ const stored = readStoredA2ASeed(input.config);
110
+ if (stored) {
111
+ // Load path: a malformed seed throws (no re-mint).
112
+ const seed = decodeSeed(stored);
113
+ const identity = deriveIdentity(input.sodium, seed);
114
+ (0, runtime_1.emitNervesEvent)({
115
+ component: "channels",
116
+ event: "channel.a2a_identity_loaded",
117
+ message: "loaded A2A identity from machine config",
118
+ meta: { agentName: input.agentName, did: identity.did },
119
+ });
120
+ return identity;
121
+ }
122
+ // Mint path: generate a seed, persist it under a2a.identity.*, then derive.
123
+ const seed = mintSeed();
124
+ const seedString = Buffer.from(seed).toString("base64url");
125
+ const a2a = (input.config.a2a && typeof input.config.a2a === "object" && !Array.isArray(input.config.a2a)
126
+ ? input.config.a2a
127
+ : {});
128
+ const identityBlock = (a2a.identity && typeof a2a.identity === "object" && !Array.isArray(a2a.identity)
129
+ ? a2a.identity
130
+ : {});
131
+ const nextConfig = {
132
+ ...input.config,
133
+ a2a: { ...a2a, identity: { ...identityBlock, ed25519Seed: seedString } },
134
+ };
135
+ await input.upsert(nextConfig);
136
+ const identity = deriveIdentity(input.sodium, seed);
137
+ (0, runtime_1.emitNervesEvent)({
138
+ component: "channels",
139
+ event: "channel.a2a_identity_minted",
140
+ message: "minted new A2A identity and persisted seed to machine config",
141
+ meta: { agentName: input.agentName, did: identity.did },
142
+ });
143
+ return identity;
144
+ }
145
+ /**
146
+ * Load (or mint-on-first-use) THIS agent's own A2A identity from the machine-local
147
+ * runtime config — the convenience entry the main-process tools use to obtain the
148
+ * self identity that signs outbound sealed envelopes. Mirrors the a2a sense
149
+ * entrypoint's load (use a cached seed when present, otherwise refresh machine
150
+ * config → `loadOrMintA2AIdentity` → merge a fresh seed under the right machine
151
+ * id). `sodium` is optional (defaults to `ready()`).
152
+ */
153
+ async function loadSelfA2AIdentity(input) {
154
+ const sodium = input.sodium ?? await (0, a2a_client_1.ready)();
155
+ const machineId = (0, machine_identity_1.loadOrCreateMachineIdentity)({ homeDir: os.homedir() }).machineId;
156
+ const cached = (0, runtime_credentials_1.readMachineRuntimeCredentialConfig)(input.agentName);
157
+ const read = cached.ok && readStoredA2ASeed(cached.config)
158
+ ? cached
159
+ : await (0, runtime_credentials_1.refreshMachineRuntimeCredentialConfig)(input.agentName, machineId);
160
+ if (!read.ok && read.reason !== "missing") {
161
+ throw new Error(`A2A identity requires readable machine runtime config at ${read.itemPath}: ${read.error}`);
162
+ }
163
+ const config = read.ok ? read.config : {};
164
+ return loadOrMintA2AIdentity({
165
+ agentName: input.agentName,
166
+ sodium,
167
+ config,
168
+ upsert: async (next) => {
169
+ const seed = readStoredA2ASeed(next);
170
+ await (0, runtime_credentials_1.mergeMachineRuntimeCredentialConfig)(input.agentName, machineId, { a2a: { identity: { ed25519Seed: seed } } });
171
+ },
172
+ });
173
+ }
174
+ /**
175
+ * A file-backed A2A identity for a client that is not an ouro agent (for example a
176
+ * coding harness talking to an agent over A2A). The file holds the Ed25519 seed, so
177
+ * it is treated like an SSH private key: created 0600 inside a 0700 directory, and
178
+ * REFUSED if group or other can read it.
179
+ */
180
+ async function loadOrMintA2AIdentityFile(input) {
181
+ const sodium = input.sodium ?? await (0, a2a_client_1.ready)();
182
+ return fs.existsSync(input.filePath) ? readA2AIdentityFile(sodium, input.filePath) : mintA2AIdentityFile(sodium, input.filePath);
183
+ }
184
+ function readA2AIdentityFile(sodium, filePath) {
185
+ const mode = fs.statSync(filePath).mode & 0o077;
186
+ if (mode !== 0)
187
+ throw new Error(`A2A identity file ${filePath} is readable by group or other; chmod 600 it`);
188
+ const parsed = JSON.parse(fs.readFileSync(filePath, "utf8"));
189
+ if (typeof parsed.seed !== "string")
190
+ throw new Error(`A2A identity file ${filePath} has no seed`);
191
+ return deriveIdentity(sodium, decodeSeed(parsed.seed));
192
+ }
193
+ function mintA2AIdentityFile(sodium, filePath) {
194
+ const identity = deriveIdentity(sodium, mintSeed());
195
+ fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: 0o700 });
196
+ fs.writeFileSync(filePath, `${JSON.stringify({ version: 1, did: identity.did, seed: identity.seed }, null, 2)}\n`, { mode: 0o600 });
197
+ (0, runtime_1.emitNervesEvent)({
198
+ component: "channels",
199
+ event: "channel.a2a_client_identity_minted",
200
+ message: "minted file-backed A2A client identity",
201
+ meta: { did: identity.did },
202
+ });
203
+ return identity;
204
+ }
@@ -0,0 +1,110 @@
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
+ /** Whether the inbound message carries a friends data part (kind:"data"). */
8
+ function hasDataPart(message) {
9
+ return Array.isArray(message.parts) && message.parts.some((p) => p && p.kind === "data");
10
+ }
11
+ /**
12
+ * Bridge an inbound A2A message through friends' `receiveShare`, keying the result
13
+ * on the VERIFIED sender DID.
14
+ *
15
+ * Ordering (the security-critical trap — `trustOfSource` is read from the store BY
16
+ * the just-verified DID, never defaulted, never from the envelope):
17
+ * 1. `unwrapDataPart` — no friends part ⇒ `not-a-share` (caller does text path).
18
+ * 2. `openSealedEnvelope` (pre-unseal) — extract the SIGNED sender DID. Unseal /
19
+ * recipient-mismatch failures ⇒ `rejected` (no turn). (This open does NOT
20
+ * verify the signature; the real auth gate is the `DidVerifier` inside
21
+ * `receiveShare`, so a forged-high-trust claim here is harmless — the forge is
22
+ * rejected by the verifier regardless of the trust we read.)
23
+ * 3. `findFriendByDid(store, verifiedDid)` — read trust off that record; an
24
+ * unknown DID ⇒ `stranger` (never a default-up).
25
+ * 4. `receiveShare({ ..., trustOfSource })` — re-unseal (deterministic) + resolve
26
+ * & pin + run `DidVerifier` (forge fails HERE) + replay-dedup + import.
27
+ * 5. Map the result. `completed` ⇒ run the turn at `verifiedDid`/`trust`.
28
+ */
29
+ async function receiveInboundShare(message, deps) {
30
+ const friendsMessage = message;
31
+ const payload = (0, a2a_client_1.unwrapDataPart)(friendsMessage);
32
+ if (!payload) {
33
+ // No (valid) friends part. If there was a data part at all, it was a malformed
34
+ // friends attempt → reject; otherwise it's a legacy text message → not-a-share.
35
+ if (hasDataPart(message)) {
36
+ (0, runtime_1.emitNervesEvent)({
37
+ component: "channels",
38
+ event: "channel.a2a_inbound_rejected",
39
+ message: "rejected malformed inbound A2A data part",
40
+ meta: { reason: "malformed_message" },
41
+ });
42
+ return { outcome: "rejected", reason: "malformed_message" };
43
+ }
44
+ return { outcome: "not-a-share" };
45
+ }
46
+ const recipientIdentity = {
47
+ x25519Priv: deps.identity.x25519Priv,
48
+ x25519Pub: deps.identity.x25519Pub,
49
+ };
50
+ // Pre-unseal to learn the SIGNED sender DID before we can read its trust.
51
+ const opened = (0, a2a_client_1.openSealedEnvelope)({
52
+ sodium: deps.sodium,
53
+ sealedEnvelope: { v: payload.v, sealed: payload.sealed },
54
+ recipientDid: deps.identity.did,
55
+ recipientIdentity,
56
+ });
57
+ if (!opened.ok) {
58
+ (0, runtime_1.emitNervesEvent)({
59
+ component: "channels",
60
+ event: "channel.a2a_inbound_rejected",
61
+ message: "rejected inbound A2A envelope (unseal/recipient)",
62
+ meta: { reason: opened.error },
63
+ });
64
+ return { outcome: "rejected", reason: opened.error };
65
+ }
66
+ const verifiedDid = opened.fromAgentId;
67
+ // Read trust from the friend store BY the verified DID — never defaulted, never
68
+ // from the envelope. Unknown (or empty) DID ⇒ stranger. `findFriendByDid` itself
69
+ // refuses a falsy did (never matches a did-less record), so this is safe to call
70
+ // unconditionally.
71
+ const record = await (0, friends_1.findFriendByDid)(deps.store, verifiedDid);
72
+ const trust = record?.trustLevel ?? "stranger";
73
+ const result = await (0, a2a_client_1.receiveShare)({
74
+ sodium: deps.sodium,
75
+ store: deps.store,
76
+ missionStore: deps.missionStore,
77
+ pinStore: deps.pinStore,
78
+ didResolution: deps.didResolution,
79
+ seen: deps.seen,
80
+ a2aMessage: friendsMessage,
81
+ recipientDid: deps.identity.did,
82
+ recipientIdentity,
83
+ trustOfSource: trust,
84
+ });
85
+ if (result.state === "completed") {
86
+ (0, runtime_1.emitNervesEvent)({
87
+ component: "channels",
88
+ event: "channel.a2a_inbound_verified",
89
+ message: "verified inbound A2A share; keying turn on sender DID",
90
+ meta: { verifiedDid, trust, friendsKind: result.friendsKind, status: result.status },
91
+ });
92
+ return {
93
+ outcome: "completed",
94
+ verifiedDid,
95
+ trust,
96
+ friendsKind: result.friendsKind,
97
+ status: result.status,
98
+ ...(result.message ? { message: result.message } : {}),
99
+ /* v8 ignore next -- a completed receipt implies a trusted friend record: an unknown DID reads as stranger and is refused @preserve */
100
+ ...(record ? { friend: record } : {}),
101
+ };
102
+ }
103
+ (0, runtime_1.emitNervesEvent)({
104
+ component: "channels",
105
+ event: "channel.a2a_inbound_rejected",
106
+ message: "rejected inbound A2A share",
107
+ meta: { reason: result.reason, verifiedDid, trust },
108
+ });
109
+ return { outcome: "rejected", reason: result.reason };
110
+ }