@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,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,205 @@
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 node_crypto_1 = require("node:crypto");
6
+ const runtime_1 = require("../nerves/runtime");
7
+ /** Why a record could not move, in words an owner can read. A reason a later friends adds fails the type check. */
8
+ const MOVE_FAILURE_WORDS = {
9
+ rotation_not_accepted: "this agent's saved keys do not show the change cleanly",
10
+ rotation_chain_invalid: "its chain of key changes loops or is too long",
11
+ record_not_found: "its friend record was not found under any of its earlier keys",
12
+ successor_already_linked: "another friend record already holds the new key",
13
+ };
14
+ /** At most this many earlier DIDs are followed back from a rotated pin (friends' `MAX_ROTATION_HOPS`). */
15
+ const MAX_PREDECESSOR_HOPS = 16;
16
+ function refused(fromAgentId, reason, message) {
17
+ (0, runtime_1.emitNervesEvent)({ component: "channels", event: "channel.a2a_did_resolve_refused", message, meta: { fromAgentId, reason } });
18
+ return null;
19
+ }
20
+ /**
21
+ * Build the friends `DidResolution` for did:key peers. `resolveAndPin` is the verify-and-pin core the inbound bridge
22
+ * consumes. friends calls it with the SIGNED sender DID as both `fromAgentId` and `did`, so pins are keyed by DID:
23
+ * unparseable or empty DID, or a retired pin → refused (null)
24
+ * pinned → the pinned key (a did:key's key cannot change under the same DID)
25
+ * not pinned, with a successor statement → `evaluateRotation` from the old DID (at the OLD record's trust);
26
+ * accepted: `applyAcceptedRotation` moves the record, then the new key
27
+ * rejected: refused, never a silent first contact
28
+ * not pinned, no statement → first contact (TOFU `pinOnFirstContact`)
29
+ * The receive paths call `settleSender` first, so by the time `resolveAndPin` runs a rotation is already applied.
30
+ */
31
+ function makeDidResolution(input) {
32
+ const { sodium, store, successorFor } = input;
33
+ const toldOwner = new Set();
34
+ /** Tell the owner, once per rotation, that the record could not follow and how to fix it. */
35
+ function tellOwner(oldDid, newDid, record, holder, reason) {
36
+ const notify = input.notifyOwner;
37
+ const key = `${oldDid}>${newDid}`;
38
+ if (!notify || toldOwner.has(key))
39
+ return;
40
+ toldOwner.add(key);
41
+ const agent = input.agentName ?? "<agent>";
42
+ const [cause, command] = holder
43
+ ? [
44
+ `Its new key is already linked to another friend record, ${holder.name} (${holder.id}). If that is the same peer, merge the two records`,
45
+ `ouro friend merge --agent ${agent} --into ${record.id} ${holder.id} --apply`,
46
+ ]
47
+ : [
48
+ `The record could not move because ${MOVE_FAILURE_WORDS[reason]}. Link the record to the new key`,
49
+ `ouro friend link ${agent} --friend ${record.id} --provider a2a-agent --external-id ${newDid}`,
50
+ ];
51
+ // The command sits on its own line with nothing after it, so it can be copied as is.
52
+ const notice = {
53
+ noticeId: `a2a-rotation-unmoved:${(0, node_crypto_1.createHash)("sha256").update(key).digest("hex").slice(0, 32)}`,
54
+ text: [
55
+ `${record.name} changed its A2A key to ${newDid}, but its friend record could not move to the new key, so this agent refuses its messages until this is fixed.`,
56
+ `${cause}. Run:`,
57
+ command,
58
+ `${record.name}'s next message then moves the record.`,
59
+ ].join("\n\n"),
60
+ };
61
+ notify(notice).catch((error) => {
62
+ (0, runtime_1.emitNervesEvent)({
63
+ level: "warn",
64
+ component: "channels",
65
+ event: "channel.a2a_rotation_notice_failed",
66
+ message: "could not tell the owner that a rotated peer's record did not move",
67
+ meta: { oldDid, newDid, error: error instanceof Error ? error.message : String(error) },
68
+ });
69
+ });
70
+ }
71
+ /** Move the peer's record along the rotation chain to `newDid`. On failure, warn and tell the owner. */
72
+ async function moveRecord(friends, pinStore, oldDid, newDid, record) {
73
+ const moved = await (0, a2a_client_1.applyAcceptedRotation)({ store: friends, pinStore, oldDid, newDid });
74
+ if (moved.ok)
75
+ return true;
76
+ // The pins moved but the friend record did not follow (another record already holds the new DID, or the chain is
77
+ // broken). Refuse rather than run the message under a record that does not carry the old trust.
78
+ (0, runtime_1.emitNervesEvent)({
79
+ level: "warn",
80
+ component: "channels",
81
+ event: "channel.a2a_rotation_record_not_moved",
82
+ message: "A2A key rotation verified but the friend record could not follow; refusing the message",
83
+ meta: { oldDid, newDid, reason: moved.reason },
84
+ });
85
+ tellOwner(oldDid, newDid, record, await friends.findByExternalId("a2a-agent", newDid), moved.reason);
86
+ return false;
87
+ }
88
+ /** Judge a successor statement for an unpinned DID and, when accepted, move the record. */
89
+ async function rotateIn(pinStore, did, ed25519Pub, statement) {
90
+ // A rotation is judged at the trust of the peer the OLD DID belongs to: the new DID itself is still unknown.
91
+ const oldRecord = store ? await store.findByExternalId("a2a-agent", statement.oldDid) : null;
92
+ const oldTrust = oldRecord?.trustLevel ?? "stranger";
93
+ const decision = (0, a2a_client_1.evaluateRotation)({
94
+ sodium,
95
+ pinStore,
96
+ fromAgentId: statement.oldDid,
97
+ trustOfSource: oldTrust,
98
+ newDid: did,
99
+ newEd25519Pub: ed25519Pub,
100
+ rotationProof: statement.rotationProof,
101
+ successorProof: statement.successorProof,
102
+ issuedAt: statement.issuedAt,
103
+ });
104
+ if (decision.decision !== "accepted") {
105
+ (0, runtime_1.emitNervesEvent)({
106
+ level: "warn",
107
+ component: "channels",
108
+ event: "channel.a2a_rotation_rejected",
109
+ message: "A2A key rotation rejected",
110
+ /* v8 ignore next -- the new DID has no pin, so evaluateRotation cannot call it unchanged @preserve */
111
+ meta: { oldDid: statement.oldDid, newDid: did, trustOfSource: oldTrust, reason: decision.decision === "rejected" ? decision.reason : decision.decision },
112
+ });
113
+ return false;
114
+ }
115
+ // Accepted means the old record is family or friend, which was read from `store`, so both are present.
116
+ if (!(await moveRecord(store, pinStore, statement.oldDid, did, oldRecord)))
117
+ return false;
118
+ (0, runtime_1.emitNervesEvent)({
119
+ component: "channels",
120
+ event: "channel.a2a_rotation_accepted",
121
+ message: "A2A signed key rotation accepted",
122
+ meta: { oldDid: statement.oldDid, newDid: did, trustOfSource: oldTrust },
123
+ });
124
+ return true;
125
+ }
126
+ /**
127
+ * A pin that a rotation moved to `did`: if the peer's record still sits at an earlier DID on the chain, the move
128
+ * failed earlier, so retry it. Returns false while the record still cannot follow.
129
+ */
130
+ async function finishMove(pinStore, did) {
131
+ if (!store || typeof pinStore.predecessorOf !== "function")
132
+ return true;
133
+ const chain = [];
134
+ for (let prev = pinStore.predecessorOf(did); prev !== undefined && chain.length < MAX_PREDECESSOR_HOPS; prev = pinStore.predecessorOf(prev)) {
135
+ chain.unshift(prev);
136
+ }
137
+ for (const earlier of chain) {
138
+ const record = await store.findByExternalId("a2a-agent", earlier);
139
+ if (!record)
140
+ continue;
141
+ (0, runtime_1.emitNervesEvent)({
142
+ component: "channels",
143
+ event: "channel.a2a_rotation_record_retry",
144
+ message: "a rotated peer's friend record is still at its old DID; retrying the move",
145
+ meta: { oldDid: earlier, newDid: did },
146
+ });
147
+ if (!(await moveRecord(store, pinStore, chain[0], did, record)))
148
+ return false;
149
+ (0, runtime_1.emitNervesEvent)({
150
+ component: "channels",
151
+ event: "channel.a2a_rotation_record_moved",
152
+ message: "moved a rotated peer's friend record to its new DID",
153
+ meta: { oldDid: earlier, newDid: did },
154
+ });
155
+ return true;
156
+ }
157
+ return true;
158
+ }
159
+ return {
160
+ async settleSender({ did, pinStore }) {
161
+ const parsed = (0, a2a_client_1.parseDidKey)(did);
162
+ // An unusable DID is refused by `resolveAndPin` itself.
163
+ if (!parsed)
164
+ return true;
165
+ const pinned = pinStore.get(did);
166
+ if (pinned)
167
+ return pinned.rotatedAt !== undefined && pinned.retiredBy === undefined ? finishMove(pinStore, did) : true;
168
+ const statement = successorFor?.(did, parsed.ed25519Pub);
169
+ return statement ? rotateIn(pinStore, did, parsed.ed25519Pub, statement) : true;
170
+ },
171
+ async resolveAndPin(args) {
172
+ const { fromAgentId, did, pinStore } = args;
173
+ if (!did)
174
+ return refused(fromAgentId, "empty_did", "A2A DID resolve refused (empty DID)");
175
+ const parsed = (0, a2a_client_1.parseDidKey)(did);
176
+ if (!parsed)
177
+ return refused(fromAgentId, "parse_failed", "A2A DID resolve refused (unparseable did:key)");
178
+ const pinned = pinStore.get(fromAgentId);
179
+ // A retired pin is a tombstone: the old key must never verify again (friends requires hosts to enforce this).
180
+ if (pinned?.retiredBy !== undefined)
181
+ return refused(fromAgentId, "retired_pin", "A2A DID resolve refused (the DID was rotated away)");
182
+ if (pinned) {
183
+ const decision = (0, a2a_client_1.evaluateRotation)({ sodium, pinStore, fromAgentId, trustOfSource: args.trustOfSource, newDid: did, newEd25519Pub: parsed.ed25519Pub });
184
+ if (decision.decision === "unchanged")
185
+ return { ed25519Pub: parsed.ed25519Pub };
186
+ // A did:key encodes its key, so a differing pin means the pin was filed under another DID (or edited by hand).
187
+ /* v8 ignore next -- evaluateRotation only returns "accepted" with a proof, and none is passed here @preserve */
188
+ return refused(fromAgentId, decision.decision === "rejected" ? decision.reason : "key_changed", "A2A DID resolve refused (pinned key differs)");
189
+ }
190
+ const statement = successorFor?.(did, parsed.ed25519Pub);
191
+ if (!statement) {
192
+ // First contact (TOFU): accept + pin the (did, key) under fromAgentId.
193
+ (0, a2a_client_1.pinOnFirstContact)({ pinStore, fromAgentId, did, ed25519Pub: parsed.ed25519Pub });
194
+ (0, runtime_1.emitNervesEvent)({
195
+ component: "channels",
196
+ event: "channel.a2a_pin_first_contact",
197
+ message: "A2A DID pinned on first contact",
198
+ meta: { fromAgentId, did },
199
+ });
200
+ return { ed25519Pub: parsed.ed25519Pub };
201
+ }
202
+ return (await rotateIn(pinStore, did, parsed.ed25519Pub, statement)) ? { ed25519Pub: parsed.ed25519Pub } : null;
203
+ },
204
+ };
205
+ }
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ESCALATION_GRANTS_FILE = void 0;
4
+ exports.escalationGrantsPath = escalationGrantsPath;
5
+ exports.viewEscalationGrants = viewEscalationGrants;
6
+ exports.readEscalationGrants = readEscalationGrants;
7
+ exports.setEscalationGrant = setEscalationGrant;
8
+ exports.pinnedHolderDid = pinnedHolderDid;
9
+ exports.holdsEscalation = holdsEscalation;
10
+ exports.escalationHolders = escalationHolders;
11
+ const runtime_1 = require("../nerves/runtime");
12
+ const replay_grant_holders_1 = require("./replay-grant-holders");
13
+ const operator_trust_1 = require("./operator-trust");
14
+ exports.ESCALATION_GRANTS_FILE = "escalation-grants.json";
15
+ function escalationGrantsPath(agentRoot) {
16
+ return (0, operator_trust_1.operatorTrustFile)(agentRoot, exports.ESCALATION_GRANTS_FILE);
17
+ }
18
+ function validGrant(value) {
19
+ if (!value || typeof value !== "object" || Array.isArray(value))
20
+ return false;
21
+ const grant = value;
22
+ const keys = Object.keys(grant).sort().join(",");
23
+ return (keys === "did,grantedAt,scope,source" || keys === "did,expiresAt,grantedAt,scope,source")
24
+ && (grant.expiresAt === undefined || typeof grant.expiresAt === "string")
25
+ && typeof grant.did === "string" && grant.did.startsWith("did:") && grant.did.length <= 512
26
+ && grant.scope === "escalation"
27
+ && typeof grant.grantedAt === "string" && !Number.isNaN(Date.parse(grant.grantedAt))
28
+ && typeof grant.source === "string" && grant.source.trim().length > 0;
29
+ }
30
+ /** The file's trust state and every well-formed grant in it, keyed by friend id. */
31
+ function viewEscalationGrants(agentRoot) {
32
+ return (0, operator_trust_1.readGrantFile)(agentRoot, exports.ESCALATION_GRANTS_FILE, validGrant);
33
+ }
34
+ /** Every well-formed grant in the file, keyed by friend id. Anything else in the file is ignored. */
35
+ function readEscalationGrants(agentRoot) {
36
+ return viewEscalationGrants(agentRoot).grants;
37
+ }
38
+ /** Writes or removes one grant. The previous file is kept beside it as a timestamped backup before the change. */
39
+ function setEscalationGrant(agentRoot, friendId, change, now = new Date()) {
40
+ return (0, operator_trust_1.withTrustedWriteLock)(agentRoot, () => setEscalationGrantLocked(agentRoot, friendId, change, now));
41
+ }
42
+ function setEscalationGrantLocked(agentRoot, friendId, change, now) {
43
+ const current = readEscalationGrants(agentRoot);
44
+ const had = current[friendId];
45
+ if (change.grant ? had?.did === change.did && had.expiresAt === change.expiresAt : had === undefined)
46
+ return { changed: false, backup: null };
47
+ const next = { ...current };
48
+ if (change.grant)
49
+ next[friendId] = { scope: "escalation", grantedAt: now.toISOString(), source: change.source, did: change.did, ...(change.expiresAt ? { expiresAt: change.expiresAt } : {}) };
50
+ else
51
+ delete next[friendId];
52
+ const { backup } = (0, operator_trust_1.writeTrustedFile)(agentRoot, exports.ESCALATION_GRANTS_FILE, `${JSON.stringify({ schemaVersion: 1, grants: next }, null, 2)}\n`, now);
53
+ (0, runtime_1.emitNervesEvent)({
54
+ component: "senses",
55
+ event: "senses.a2a_escalation_grant_changed",
56
+ message: change.grant ? "granted escalation to an A2A peer" : "revoked an A2A peer's escalation grant",
57
+ meta: { friendId, granted: change.grant },
58
+ });
59
+ return { changed: true, backup };
60
+ }
61
+ /** A grant is in force when its trusted expiry has not passed; a grant with no expiry for a friend on the root-owned replay list is never in force. */
62
+ function inForce(agentRoot, friendId, grant, now) {
63
+ if (!grant)
64
+ return false;
65
+ if (grant.expiresAt === undefined)
66
+ return !(0, replay_grant_holders_1.isReplayGrantHolder)(agentRoot, friendId);
67
+ const expiresAt = Date.parse(grant.expiresAt);
68
+ return Number.isFinite(expiresAt) && expiresAt > now;
69
+ }
70
+ /** The DID the operator pinned for this holder, or null when it holds no (complete, unexpired) grant. */
71
+ function pinnedHolderDid(agentRoot, friendId, now = Date.now()) {
72
+ const grant = readEscalationGrants(agentRoot)[friendId];
73
+ return inForce(agentRoot, friendId, grant, now) ? grant.did : null;
74
+ }
75
+ /** True only for an active family friend that the operator listed in the grants file, with a pinned DID. */
76
+ function holdsEscalation(agentRoot, friend, now = Date.now()) {
77
+ return inForce(agentRoot, friend.id, readEscalationGrants(agentRoot)[friend.id], now)
78
+ && friend.trustLevel === "family"
79
+ && friend.admissionState === "active";
80
+ }
81
+ async function escalationHolders(agentRoot, store, now = Date.now()) {
82
+ const friends = await store.listAll?.() ?? [];
83
+ return friends.filter((friend) => holdsEscalation(agentRoot, friend, now));
84
+ }
@@ -0,0 +1,60 @@
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.RUNNING_HARNESS_VERSION = void 0;
37
+ exports.escalationOptionsFor = escalationOptionsFor;
38
+ exports.sendOwnerNoticeViaTelegram = sendOwnerNoticeViaTelegram;
39
+ const fs = __importStar(require("node:fs"));
40
+ const path = __importStar(require("node:path"));
41
+ const runtime_1 = require("../nerves/runtime");
42
+ /**
43
+ * The version of the harness that is running, read from its own package.json once when this module loads. A fix is
44
+ * "live" only when this process carries it, so the value must not follow whatever an upgrade later writes to disk.
45
+ */
46
+ exports.RUNNING_HARNESS_VERSION = JSON.parse(fs.readFileSync(path.resolve(__dirname, "../../package.json"), "utf8")).version;
47
+ /**
48
+ * What every A2A server entry point passes as `escalation`: confirm-when-live notices go to the owner through the same
49
+ * owner-notice path as delegated commands. Only the Butler files and confirms failure reports.
50
+ */
51
+ function escalationOptionsFor(agentName, sendOwnerNotice) {
52
+ if (agentName !== "sanctuary")
53
+ return {};
54
+ (0, runtime_1.emitNervesEvent)({ component: "senses", event: "senses.a2a_escalation_wired", message: "A2A server will confirm resolved failure reports to the owner", meta: { agentName, runningVersion: exports.RUNNING_HARNESS_VERSION } });
55
+ return { escalation: { runningVersion: exports.RUNNING_HARNESS_VERSION, notifyOwner: sendOwnerNotice } };
56
+ }
57
+ async function sendOwnerNoticeViaTelegram(agentName, notice) {
58
+ const { sendTelegramOwnerNotice } = await Promise.resolve().then(() => __importStar(require("../senses/telegram")));
59
+ await sendTelegramOwnerNotice(agentName, { ...notice, signal: AbortSignal.timeout(30_000) });
60
+ }
@@ -0,0 +1,258 @@
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.PUBLIC_A2A_IDENTITY_FILE = void 0;
37
+ exports.readStoredA2ASeed = readStoredA2ASeed;
38
+ exports.loadOrMintA2AIdentity = loadOrMintA2AIdentity;
39
+ exports.loadSelfA2AIdentity = loadSelfA2AIdentity;
40
+ exports.publishOwnA2ADid = publishOwnA2ADid;
41
+ exports.readPublishedA2ADid = readPublishedA2ADid;
42
+ exports.readOwnA2ADid = readOwnA2ADid;
43
+ exports.loadOrMintA2AIdentityFile = loadOrMintA2AIdentityFile;
44
+ const crypto = __importStar(require("node:crypto"));
45
+ const fs = __importStar(require("node:fs"));
46
+ const path = __importStar(require("node:path"));
47
+ const os = __importStar(require("node:os"));
48
+ const a2a_client_1 = require("@ouro.bot/friends/a2a-client");
49
+ const runtime_1 = require("../nerves/runtime");
50
+ const runtime_credentials_1 = require("../heart/runtime-credentials");
51
+ const machine_identity_1 = require("../heart/machine-identity");
52
+ /** The number of raw bytes in an Ed25519 seed. */
53
+ const ED25519_SEED_BYTES = 32;
54
+ /** The machine-config key path for the persisted seed: `a2a.identity.ed25519Seed`. */
55
+ function a2aIdentityConfig(config) {
56
+ const a2a = config.a2a;
57
+ if (!a2a || typeof a2a !== "object" || Array.isArray(a2a))
58
+ return undefined;
59
+ const identity = a2a.identity;
60
+ if (!identity || typeof identity !== "object" || Array.isArray(identity))
61
+ return undefined;
62
+ return identity;
63
+ }
64
+ /** Read the stored Ed25519 seed string from a machine-config object, or undefined. */
65
+ function readStoredA2ASeed(config) {
66
+ const identity = a2aIdentityConfig(config);
67
+ const seed = identity?.ed25519Seed;
68
+ return typeof seed === "string" && seed.length > 0 ? seed : undefined;
69
+ }
70
+ /** Decode + validate a stored seed string into 32 raw bytes. Throws on malformed. */
71
+ function decodeSeed(seedString) {
72
+ let decoded;
73
+ try {
74
+ decoded = Buffer.from(seedString, "base64url");
75
+ }
76
+ catch {
77
+ /* v8 ignore next -- Buffer.from(base64url) does not throw on bad chars; this guards future decoders @preserve */
78
+ throw new Error("malformed A2A identity seed: not decodable");
79
+ }
80
+ // base64url is lenient (it silently drops invalid chars), so the length check is
81
+ // the real gate: a real Ed25519 seed is exactly 32 bytes.
82
+ if (decoded.length !== ED25519_SEED_BYTES) {
83
+ throw new Error(`malformed A2A identity seed: expected ${ED25519_SEED_BYTES}-byte seed, got ${decoded.length}`);
84
+ }
85
+ return new Uint8Array(decoded);
86
+ }
87
+ /** Mint a fresh 32-byte Ed25519 seed (Node keygen → JWK `d`, the raw seed). */
88
+ function mintSeed() {
89
+ const { privateKey } = crypto.generateKeyPairSync("ed25519");
90
+ const jwk = privateKey.export({ format: "jwk" });
91
+ /* v8 ignore next -- Node always emits the `d` field for an Ed25519 private JWK; guard protects future runtimes @preserve */
92
+ if (typeof jwk.d !== "string")
93
+ throw new Error("failed to mint A2A identity seed: missing JWK d");
94
+ return decodeSeed(jwk.d);
95
+ }
96
+ /** Derive the full did:key identity from a 32-byte seed (deterministic). */
97
+ function deriveIdentity(sodium, seed) {
98
+ const keypair = sodium.crypto_sign_seed_keypair(seed);
99
+ const didIdentity = (0, a2a_client_1.didKeyIdentityFromEd25519)({
100
+ sodium,
101
+ ed25519Pub: keypair.publicKey,
102
+ ed25519Priv: keypair.privateKey,
103
+ });
104
+ return { ...didIdentity, seed: Buffer.from(seed).toString("base64url") };
105
+ }
106
+ /**
107
+ * Load the agent's A2A identity from the machine-local config, or mint + persist
108
+ * one on first use. A malformed stored seed FAILS FAST (it never silently
109
+ * re-mints, which would change the agent's DID). The mint path persists the new
110
+ * seed via `upsert` before deriving; the load path performs no writes.
111
+ */
112
+ async function loadOrMintA2AIdentity(input) {
113
+ const stored = readStoredA2ASeed(input.config);
114
+ if (stored) {
115
+ // Load path: a malformed seed throws (no re-mint).
116
+ const seed = decodeSeed(stored);
117
+ const identity = deriveIdentity(input.sodium, seed);
118
+ (0, runtime_1.emitNervesEvent)({
119
+ component: "channels",
120
+ event: "channel.a2a_identity_loaded",
121
+ message: "loaded A2A identity from machine config",
122
+ meta: { agentName: input.agentName, did: identity.did },
123
+ });
124
+ return identity;
125
+ }
126
+ // Mint path: generate a seed, persist it under a2a.identity.*, then derive.
127
+ const seed = mintSeed();
128
+ const seedString = Buffer.from(seed).toString("base64url");
129
+ const a2a = (input.config.a2a && typeof input.config.a2a === "object" && !Array.isArray(input.config.a2a)
130
+ ? input.config.a2a
131
+ : {});
132
+ const identityBlock = (a2a.identity && typeof a2a.identity === "object" && !Array.isArray(a2a.identity)
133
+ ? a2a.identity
134
+ : {});
135
+ const nextConfig = {
136
+ ...input.config,
137
+ a2a: { ...a2a, identity: { ...identityBlock, ed25519Seed: seedString } },
138
+ };
139
+ await input.upsert(nextConfig);
140
+ const identity = deriveIdentity(input.sodium, seed);
141
+ (0, runtime_1.emitNervesEvent)({
142
+ component: "channels",
143
+ event: "channel.a2a_identity_minted",
144
+ message: "minted new A2A identity and persisted seed to machine config",
145
+ meta: { agentName: input.agentName, did: identity.did },
146
+ });
147
+ return identity;
148
+ }
149
+ /**
150
+ * Load (or mint-on-first-use) THIS agent's own A2A identity from the machine-local
151
+ * runtime config — the convenience entry the main-process tools use to obtain the
152
+ * self identity that signs outbound sealed envelopes. Mirrors the a2a sense
153
+ * entrypoint's load (use a cached seed when present, otherwise refresh machine
154
+ * config → `loadOrMintA2AIdentity` → merge a fresh seed under the right machine
155
+ * id). `sodium` is optional (defaults to `ready()`).
156
+ */
157
+ async function loadSelfA2AIdentity(input) {
158
+ const sodium = input.sodium ?? await (0, a2a_client_1.ready)();
159
+ const machineId = (0, machine_identity_1.loadOrCreateMachineIdentity)({ homeDir: os.homedir() }).machineId;
160
+ const cached = (0, runtime_credentials_1.readMachineRuntimeCredentialConfig)(input.agentName);
161
+ const read = cached.ok && readStoredA2ASeed(cached.config)
162
+ ? cached
163
+ : await (0, runtime_credentials_1.refreshMachineRuntimeCredentialConfig)(input.agentName, machineId);
164
+ if (!read.ok && read.reason !== "missing") {
165
+ throw new Error(`A2A identity requires readable machine runtime config at ${read.itemPath}: ${read.error}`);
166
+ }
167
+ const config = read.ok ? read.config : {};
168
+ return loadOrMintA2AIdentity({
169
+ agentName: input.agentName,
170
+ sodium,
171
+ config,
172
+ upsert: async (next) => {
173
+ const seed = readStoredA2ASeed(next);
174
+ await (0, runtime_credentials_1.mergeMachineRuntimeCredentialConfig)(input.agentName, machineId, { a2a: { identity: { ed25519Seed: seed } } });
175
+ },
176
+ });
177
+ }
178
+ /** Where the agent publishes its own DID inside its bundle: a public value (a DID is a public key), never the seed. */
179
+ exports.PUBLIC_A2A_IDENTITY_FILE = path.join("a2a", "public-identity.json");
180
+ /**
181
+ * Publish this agent's own DID into its bundle so a one-off operator command (which has no vault access) can compare against it
182
+ * through the read-only bundle mount. Best effort: a read-only bundle just means the fallback stays unavailable.
183
+ */
184
+ function publishOwnA2ADid(agentRoot, did) {
185
+ try {
186
+ const file = path.join(agentRoot, exports.PUBLIC_A2A_IDENTITY_FILE);
187
+ if (readPublishedA2ADid(agentRoot) === did)
188
+ return;
189
+ fs.mkdirSync(path.dirname(file), { recursive: true });
190
+ fs.writeFileSync(file, `${JSON.stringify({ did }, null, 2)}\n`);
191
+ }
192
+ catch {
193
+ // The bundle may be mounted read-only; the DID then simply is not published.
194
+ }
195
+ }
196
+ /**
197
+ * The DID published in the bundle's public identity file, or null when it is absent or malformed. Read-only and ADVISORY: the agent can
198
+ * write its own bundle, so this value is never proof of which key is the agent's. Operator checks may report it, never rely on it alone.
199
+ */
200
+ function readPublishedA2ADid(agentRoot) {
201
+ try {
202
+ const parsed = JSON.parse(fs.readFileSync(path.join(agentRoot, exports.PUBLIC_A2A_IDENTITY_FILE), "utf8"));
203
+ return typeof parsed.did === "string" && parsed.did.startsWith("did:key:") ? parsed.did : null;
204
+ }
205
+ catch {
206
+ return null;
207
+ }
208
+ }
209
+ /**
210
+ * This agent's own A2A DID if its seed is already in this process's cached machine config, else null. Strictly read-only: it
211
+ * never mints a seed, never creates the machine identity file and never refreshes the vault, because an operator command only
212
+ * wants to compare, not to create or fetch anything. A one-off root command has no cached config, so it gets null and the caller
213
+ * falls back to the published DID (advisory only, see `readPublishedA2ADid`) and to comparing the DID against the friend records.
214
+ */
215
+ async function readOwnA2ADid(agentName) {
216
+ try {
217
+ const cached = (0, runtime_credentials_1.readMachineRuntimeCredentialConfig)(agentName);
218
+ if (!cached.ok || !readStoredA2ASeed(cached.config))
219
+ return null;
220
+ /* v8 ignore next -- the seed is already stored here, so the load never reaches upsert; it exists only to make minting impossible @preserve */
221
+ const identity = await loadOrMintA2AIdentity({ agentName, sodium: await (0, a2a_client_1.ready)(), config: cached.config, upsert: async () => { throw new Error("readOwnA2ADid never mints"); } });
222
+ return identity.did;
223
+ }
224
+ catch {
225
+ return null;
226
+ }
227
+ }
228
+ /**
229
+ * A file-backed A2A identity for a client that is not an ouro agent (for example a
230
+ * coding harness talking to an agent over A2A). The file holds the Ed25519 seed, so
231
+ * it is treated like an SSH private key: created 0600 inside a 0700 directory, and
232
+ * REFUSED if group or other can read it.
233
+ */
234
+ async function loadOrMintA2AIdentityFile(input) {
235
+ const sodium = input.sodium ?? await (0, a2a_client_1.ready)();
236
+ return fs.existsSync(input.filePath) ? readA2AIdentityFile(sodium, input.filePath) : mintA2AIdentityFile(sodium, input.filePath);
237
+ }
238
+ function readA2AIdentityFile(sodium, filePath) {
239
+ const mode = fs.statSync(filePath).mode & 0o077;
240
+ if (mode !== 0)
241
+ throw new Error(`A2A identity file ${filePath} is readable by group or other; chmod 600 it`);
242
+ const parsed = JSON.parse(fs.readFileSync(filePath, "utf8"));
243
+ if (typeof parsed.seed !== "string")
244
+ throw new Error(`A2A identity file ${filePath} has no seed`);
245
+ return deriveIdentity(sodium, decodeSeed(parsed.seed));
246
+ }
247
+ function mintA2AIdentityFile(sodium, filePath) {
248
+ const identity = deriveIdentity(sodium, mintSeed());
249
+ fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: 0o700 });
250
+ fs.writeFileSync(filePath, `${JSON.stringify({ version: 1, did: identity.did, seed: identity.seed }, null, 2)}\n`, { mode: 0o600 });
251
+ (0, runtime_1.emitNervesEvent)({
252
+ component: "channels",
253
+ event: "channel.a2a_client_identity_minted",
254
+ message: "minted file-backed A2A client identity",
255
+ meta: { did: identity.did },
256
+ });
257
+ return identity;
258
+ }