@ouro.bot/cli 0.1.0-alpha.74 → 0.1.0-alpha.741

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 (587) 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/changelog.json +4730 -16
  15. package/deploy/unraid/Dockerfile +43 -0
  16. package/deploy/unraid/README.txt +1623 -0
  17. package/deploy/unraid/audit-container-spec.sh +4 -0
  18. package/deploy/unraid/container-runtime.json +1 -0
  19. package/deploy/unraid/sanctuary-acceptance-adapter.sh +37 -0
  20. package/deploy/unraid/sanctuary-acceptance-contract.json +200 -0
  21. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  22. package/deploy/unraid/sanctuary-deployment-target.mjs +709 -0
  23. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  24. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +1796 -0
  25. package/deploy/unraid/sanctuary-unit16-run.sh +520 -0
  26. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  27. package/deploy/unraid/sanctuary.ouro/agent.json +24 -0
  28. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  29. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  30. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  31. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +18 -0
  32. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +3 -0
  33. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +3 -0
  34. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +3 -0
  35. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +5 -0
  36. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +7 -0
  37. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +21 -0
  38. package/deploy/unraid/sanctuary.xml +25 -0
  39. package/dist/a2a/card.js +57 -0
  40. package/dist/a2a/client.js +180 -0
  41. package/dist/a2a/config.js +50 -0
  42. package/dist/a2a/delegation-stores.js +56 -0
  43. package/dist/a2a/did-resolution.js +93 -0
  44. package/dist/a2a/identity.js +170 -0
  45. package/dist/a2a/inbound-share.js +107 -0
  46. package/dist/a2a/mission-result-wire.js +196 -0
  47. package/dist/a2a/onboarding.js +115 -0
  48. package/dist/a2a/pin-store.js +132 -0
  49. package/dist/a2a/seen-ledger.js +120 -0
  50. package/dist/a2a/server.js +604 -0
  51. package/dist/a2a/task-store.js +69 -0
  52. package/dist/a2a/transport.js +45 -0
  53. package/dist/a2a/types.js +3 -0
  54. package/dist/arc/attention-types.js +8 -0
  55. package/dist/arc/cares.js +144 -0
  56. package/dist/arc/episodes.js +118 -0
  57. package/dist/arc/evolution.js +490 -0
  58. package/dist/arc/flight-recorder.js +1034 -0
  59. package/dist/arc/intentions.js +134 -0
  60. package/dist/arc/json-store.js +117 -0
  61. package/dist/arc/obligations.js +348 -0
  62. package/dist/arc/packets.js +336 -0
  63. package/dist/arc/presence.js +185 -0
  64. package/dist/arc/task-lifecycle.js +57 -0
  65. package/dist/commerce/store.js +755 -0
  66. package/dist/commerce/types.js +3 -0
  67. package/dist/heart/active-work.js +874 -43
  68. package/dist/heart/agent-entry.js +190 -3
  69. package/dist/heart/approval-files.js +113 -0
  70. package/dist/heart/approval-store.js +950 -0
  71. package/dist/heart/attachments/image-normalize.js +194 -0
  72. package/dist/heart/attachments/materialize.js +97 -0
  73. package/dist/heart/attachments/originals.js +88 -0
  74. package/dist/heart/attachments/render.js +29 -0
  75. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  76. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  77. package/dist/heart/attachments/sources/index.js +16 -0
  78. package/dist/heart/attachments/store.js +103 -0
  79. package/dist/heart/attachments/types.js +93 -0
  80. package/dist/heart/auth/auth-flow.js +495 -0
  81. package/dist/heart/autonomy-budget.js +477 -0
  82. package/dist/heart/awaiting/await-alert.js +146 -0
  83. package/dist/heart/awaiting/await-expiry.js +108 -0
  84. package/dist/heart/awaiting/await-loader.js +91 -0
  85. package/dist/heart/awaiting/await-parser.js +141 -0
  86. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  87. package/dist/heart/awaiting/await-scheduler.js +382 -0
  88. package/dist/heart/background-operations.js +281 -0
  89. package/dist/heart/bridges/manager.js +137 -17
  90. package/dist/heart/bridges/store.js +14 -2
  91. package/dist/heart/bundle-state.js +168 -0
  92. package/dist/heart/commitments.js +135 -0
  93. package/dist/heart/config-registry.js +331 -0
  94. package/dist/heart/config.js +128 -129
  95. package/dist/heart/context-loss-gauntlet.js +354 -0
  96. package/dist/heart/context-loss-sentinel.js +1155 -0
  97. package/dist/heart/core.js +1759 -331
  98. package/dist/heart/cross-chat-delivery.js +8 -22
  99. package/dist/heart/daemon/agent-config-check.js +451 -0
  100. package/dist/heart/daemon/agent-discovery.js +185 -3
  101. package/dist/heart/daemon/agent-service.js +542 -0
  102. package/dist/heart/daemon/agentic-repair.js +547 -0
  103. package/dist/heart/daemon/await-private-wake.js +59 -0
  104. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  105. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  106. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  107. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  108. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  109. package/dist/heart/daemon/cadence.js +180 -0
  110. package/dist/heart/daemon/cli-defaults.js +832 -0
  111. package/dist/heart/daemon/cli-desk.js +322 -0
  112. package/dist/heart/daemon/cli-exec.js +8692 -0
  113. package/dist/heart/daemon/cli-help.js +710 -0
  114. package/dist/heart/daemon/cli-parse.js +2714 -0
  115. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  116. package/dist/heart/daemon/cli-render.js +777 -0
  117. package/dist/heart/daemon/cli-types.js +8 -0
  118. package/dist/heart/daemon/connect-bay.js +323 -0
  119. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  120. package/dist/heart/daemon/container-healthcheck.js +94 -0
  121. package/dist/heart/daemon/container-runtime.js +84 -0
  122. package/dist/heart/daemon/container-spec-auditor-main.js +156 -0
  123. package/dist/heart/daemon/container-spec-auditor.js +156 -0
  124. package/dist/heart/daemon/daemon-bootstrap-startup.js +41 -0
  125. package/dist/heart/daemon/daemon-cli.js +29 -2144
  126. package/dist/heart/daemon/daemon-entry.js +930 -10
  127. package/dist/heart/daemon/daemon-health.js +186 -0
  128. package/dist/heart/daemon/daemon-rollup.js +57 -0
  129. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  130. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  131. package/dist/heart/daemon/daemon.js +1698 -88
  132. package/dist/heart/daemon/dns-workflow.js +394 -0
  133. package/dist/heart/daemon/doctor-types.js +8 -0
  134. package/dist/heart/daemon/doctor.js +1755 -0
  135. package/dist/heart/daemon/freshness.js +345 -0
  136. package/dist/heart/daemon/habit-private-wake.js +61 -0
  137. package/dist/heart/daemon/health-monitor.js +142 -11
  138. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  139. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  140. package/dist/heart/daemon/http-health-probe.js +80 -0
  141. package/dist/heart/daemon/human-command-screens.js +234 -0
  142. package/dist/heart/daemon/human-readiness.js +114 -0
  143. package/dist/heart/daemon/inner-status.js +78 -0
  144. package/dist/heart/daemon/interactive-repair.js +394 -0
  145. package/dist/heart/daemon/launchd.js +37 -8
  146. package/dist/heart/daemon/log-tailer.js +79 -10
  147. package/dist/heart/daemon/logs-prune.js +132 -0
  148. package/dist/heart/daemon/mcp-canary.js +524 -0
  149. package/dist/heart/daemon/message-router.js +45 -5
  150. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  151. package/dist/heart/daemon/os-cron-deps.js +135 -0
  152. package/dist/heart/daemon/os-cron.js +22 -14
  153. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  154. package/dist/heart/daemon/ouro-entry.js +3 -1
  155. package/dist/heart/daemon/plugin-cli.js +432 -0
  156. package/dist/heart/daemon/process-manager.js +624 -61
  157. package/dist/heart/daemon/provider-discovery.js +137 -0
  158. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  159. package/dist/heart/daemon/prunable-bundle.js +144 -0
  160. package/dist/heart/daemon/pulse.js +511 -0
  161. package/dist/heart/daemon/readiness-repair.js +365 -0
  162. package/dist/heart/daemon/run-hooks.js +2 -0
  163. package/dist/heart/daemon/runtime-logging.js +47 -14
  164. package/dist/heart/daemon/runtime-metadata.js +2 -30
  165. package/dist/heart/daemon/runtime-mode.js +13 -2
  166. package/dist/heart/daemon/safe-mode.js +161 -0
  167. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2365 -0
  168. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1624 -0
  169. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  170. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +985 -0
  171. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  172. package/dist/heart/daemon/sanctuary-scheduler-origin.js +126 -0
  173. package/dist/heart/daemon/sense-manager.js +689 -48
  174. package/dist/heart/daemon/session-id-resolver.js +131 -0
  175. package/dist/heart/daemon/skill-management-installer.js +1 -1
  176. package/dist/heart/daemon/socket-client.js +180 -12
  177. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  178. package/dist/heart/daemon/startup-tui.js +338 -0
  179. package/dist/heart/daemon/supercronic-supervisor.js +267 -0
  180. package/dist/heart/daemon/task-scheduler.js +117 -39
  181. package/dist/heart/daemon/terminal-ui.js +499 -0
  182. package/dist/heart/daemon/thoughts.js +255 -43
  183. package/dist/heart/daemon/up-progress.js +366 -0
  184. package/dist/heart/daemon/vault-items.js +56 -0
  185. package/dist/heart/delegation.js +1 -4
  186. package/dist/heart/external-events/router.js +121 -0
  187. package/dist/heart/habits/habit-cancel.js +810 -0
  188. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  189. package/dist/heart/habits/habit-migration.js +194 -0
  190. package/dist/heart/habits/habit-parser.js +278 -0
  191. package/dist/heart/habits/habit-runtime-state.js +93 -0
  192. package/dist/heart/habits/habit-scheduler.js +653 -0
  193. package/dist/heart/habits/habit-session-summary.js +318 -0
  194. package/dist/heart/habits/habit-session.js +636 -0
  195. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  196. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  197. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  198. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  199. package/dist/heart/identity.js +184 -59
  200. package/dist/heart/kept-notes.js +289 -0
  201. package/dist/heart/kicks.js +1 -1
  202. package/dist/heart/machine-identity.js +161 -0
  203. package/dist/heart/mail-import-discovery.js +353 -0
  204. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  205. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  206. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  207. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  208. package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
  209. package/dist/heart/mailbox/mailbox-http.js +99 -0
  210. package/dist/heart/mailbox/mailbox-read.js +39 -0
  211. package/dist/heart/mailbox/mailbox-types.js +27 -0
  212. package/dist/heart/mailbox/mailbox-view.js +197 -0
  213. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  214. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  215. package/dist/heart/mailbox/readers/mail.js +375 -0
  216. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  217. package/dist/heart/mailbox/readers/sessions.js +232 -0
  218. package/dist/heart/mailbox/readers/shared.js +111 -0
  219. package/dist/heart/mcp/mcp-server.js +696 -0
  220. package/dist/heart/migrate-config.js +100 -0
  221. package/dist/heart/model-capabilities.js +11 -0
  222. package/dist/heart/orientation-frame.js +345 -0
  223. package/dist/heart/platform.js +81 -0
  224. package/dist/heart/primitives.js +1 -1
  225. package/dist/heart/private-runtime/decision-renderer.js +156 -0
  226. package/dist/heart/private-runtime/index.js +18 -0
  227. package/dist/heart/private-runtime/ledger.js +218 -0
  228. package/dist/heart/private-runtime/policy.js +214 -0
  229. package/dist/heart/private-runtime/types.js +2 -0
  230. package/dist/heart/progress-story.js +1 -1
  231. package/dist/heart/provider-attempt.js +137 -0
  232. package/dist/heart/provider-binding-resolver.js +273 -0
  233. package/dist/heart/provider-credentials.js +449 -0
  234. package/dist/heart/provider-failover.js +311 -0
  235. package/dist/heart/provider-models.js +89 -0
  236. package/dist/heart/provider-ping.js +265 -0
  237. package/dist/heart/provider-readiness-cache.js +119 -0
  238. package/dist/heart/provider-visibility.js +188 -0
  239. package/dist/heart/providers/anthropic-token.js +131 -0
  240. package/dist/heart/providers/anthropic.js +173 -60
  241. package/dist/heart/providers/azure.js +23 -11
  242. package/dist/heart/providers/error-classification.js +127 -0
  243. package/dist/heart/providers/github-copilot.js +34 -38
  244. package/dist/heart/providers/minimax-vlm.js +189 -0
  245. package/dist/heart/providers/minimax.js +26 -8
  246. package/dist/heart/providers/openai-codex-token.js +349 -0
  247. package/dist/heart/providers/openai-codex.js +55 -40
  248. package/dist/heart/providers/openai-compatible.js +177 -0
  249. package/dist/heart/run-ledger.js +247 -0
  250. package/dist/heart/runtime-capability-check.js +170 -0
  251. package/dist/heart/runtime-credentials.js +607 -0
  252. package/dist/heart/runtime-cwd.js +87 -0
  253. package/dist/heart/sense-truth.js +22 -4
  254. package/dist/heart/session-activity.js +90 -24
  255. package/dist/heart/session-events.js +1300 -0
  256. package/dist/heart/session-playback-cli-main.js +5 -0
  257. package/dist/heart/session-playback-cli.js +36 -0
  258. package/dist/heart/session-playback.js +231 -0
  259. package/dist/heart/session-stats-cli-main.js +5 -0
  260. package/dist/heart/session-stats.js +182 -0
  261. package/dist/heart/session-transcript.js +133 -0
  262. package/dist/heart/start-of-turn-packet.js +368 -0
  263. package/dist/heart/streaming.js +604 -207
  264. package/dist/heart/structured-output.js +196 -0
  265. package/dist/heart/sync-classification.js +176 -0
  266. package/dist/heart/sync.js +449 -0
  267. package/dist/heart/target-resolution.js +11 -7
  268. package/dist/heart/tempo.js +93 -0
  269. package/dist/heart/temporal-view.js +41 -0
  270. package/dist/heart/timeouts.js +101 -0
  271. package/dist/heart/tool-activity-callbacks.js +59 -0
  272. package/dist/heart/tool-approval.js +340 -0
  273. package/dist/heart/tool-description.js +155 -0
  274. package/dist/heart/tool-friction.js +55 -0
  275. package/dist/heart/tool-loop.js +200 -0
  276. package/dist/heart/turn-context.js +480 -0
  277. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  278. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  279. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  280. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  281. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  282. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  283. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  284. package/dist/heart/versioning/update-hooks.js +154 -0
  285. package/dist/heart/versioning/version-intent.js +114 -0
  286. package/dist/heart/work-card.js +380 -0
  287. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  288. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  289. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  290. package/dist/mailbox-ui/index.html +16 -0
  291. package/dist/mailroom/attention.js +167 -0
  292. package/dist/mailroom/autonomy.js +209 -0
  293. package/dist/mailroom/blob-store.js +889 -0
  294. package/dist/mailroom/body-cache.js +61 -0
  295. package/dist/mailroom/cache-sync-cli.js +58 -0
  296. package/dist/mailroom/core.js +803 -0
  297. package/dist/mailroom/entry.js +160 -0
  298. package/dist/mailroom/file-store.js +568 -0
  299. package/dist/mailroom/hosted-cache-sync.js +384 -0
  300. package/dist/mailroom/mbox-import.js +393 -0
  301. package/dist/mailroom/migration.js +164 -0
  302. package/dist/mailroom/outbound.js +380 -0
  303. package/dist/mailroom/policy.js +263 -0
  304. package/dist/mailroom/reader.js +292 -0
  305. package/dist/mailroom/search-cache.js +513 -0
  306. package/dist/mailroom/search-relevance.js +319 -0
  307. package/dist/mailroom/smtp-ingress.js +176 -0
  308. package/dist/mailroom/source-state.js +176 -0
  309. package/dist/mailroom/thread.js +109 -0
  310. package/dist/mailroom/travel-extract.js +89 -0
  311. package/dist/mind/bundle-manifest.js +24 -2
  312. package/dist/mind/context.js +273 -111
  313. package/dist/mind/desk-section.js +362 -0
  314. package/dist/mind/diary-integrity.js +60 -0
  315. package/dist/mind/{memory.js → diary.js} +68 -77
  316. package/dist/mind/embedding-provider.js +60 -0
  317. package/dist/mind/file-state.js +179 -0
  318. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  319. package/dist/mind/obligation-steering.js +227 -0
  320. package/dist/mind/pending.js +13 -8
  321. package/dist/mind/prompt-budget.js +479 -0
  322. package/dist/mind/prompt-refresh.js +3 -2
  323. package/dist/mind/prompt.js +1067 -172
  324. package/dist/mind/provenance-trust.js +26 -0
  325. package/dist/mind/record-paths.js +312 -0
  326. package/dist/mind/scrutiny.js +173 -0
  327. package/dist/mind/session-transaction.js +379 -0
  328. package/dist/nerves/cli-logging.js +7 -1
  329. package/dist/nerves/coverage/audit-rules.js +15 -6
  330. package/dist/nerves/coverage/audit.js +28 -2
  331. package/dist/nerves/coverage/cli.js +1 -1
  332. package/dist/nerves/coverage/contract.js +5 -5
  333. package/dist/nerves/coverage/file-completeness.js +139 -5
  334. package/dist/nerves/coverage/run-artifacts.js +55 -35
  335. package/dist/nerves/coverage/source-scanner.js +4 -4
  336. package/dist/nerves/event-buffer.js +111 -0
  337. package/dist/nerves/index.js +293 -9
  338. package/dist/nerves/observation.js +20 -0
  339. package/dist/nerves/redact.js +79 -0
  340. package/dist/nerves/review/cli-main.js +5 -0
  341. package/dist/nerves/review/cli.js +156 -0
  342. package/dist/nerves/review/core.js +159 -0
  343. package/dist/nerves/runtime.js +17 -1
  344. package/dist/repertoire/ado-client.js +15 -56
  345. package/dist/repertoire/ado-semantic.js +16 -10
  346. package/dist/repertoire/api-client.js +97 -0
  347. package/dist/repertoire/bitwarden-store.js +1045 -0
  348. package/dist/repertoire/bundle-templates.js +71 -0
  349. package/dist/repertoire/bw-installer.js +180 -0
  350. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  351. package/dist/repertoire/coding/context-pack.js +331 -0
  352. package/dist/repertoire/coding/feedback.js +218 -30
  353. package/dist/repertoire/coding/index.js +15 -3
  354. package/dist/repertoire/coding/manager.js +166 -10
  355. package/dist/repertoire/coding/spawner.js +58 -11
  356. package/dist/repertoire/coding/tools.js +242 -14
  357. package/dist/repertoire/coding/workbench-client.js +272 -0
  358. package/dist/repertoire/coding/workbench-manager.js +346 -0
  359. package/dist/repertoire/commerce-errors.js +109 -0
  360. package/dist/repertoire/commerce-self-test.js +156 -0
  361. package/dist/repertoire/credential-access.js +178 -0
  362. package/dist/repertoire/desk/classifier.js +362 -0
  363. package/dist/repertoire/duffel-client.js +185 -0
  364. package/dist/repertoire/github-client.js +14 -55
  365. package/dist/repertoire/graph-client.js +11 -52
  366. package/dist/repertoire/guardrails.js +812 -18
  367. package/dist/repertoire/mcp-client.js +44 -3
  368. package/dist/repertoire/mcp-manager.js +259 -20
  369. package/dist/repertoire/mcp-tools.js +83 -0
  370. package/dist/repertoire/plugin-mcp.js +175 -0
  371. package/dist/repertoire/plugins.js +253 -0
  372. package/dist/repertoire/shell-sessions.js +133 -0
  373. package/dist/repertoire/skills.js +48 -4
  374. package/dist/repertoire/stripe-client.js +131 -0
  375. package/dist/repertoire/tool-arguments.js +143 -0
  376. package/dist/repertoire/tool-results.js +29 -0
  377. package/dist/repertoire/tools-a2a.js +699 -0
  378. package/dist/repertoire/tools-attachments.js +317 -0
  379. package/dist/repertoire/tools-awaiting.js +372 -0
  380. package/dist/repertoire/tools-base.js +67 -1095
  381. package/dist/repertoire/tools-bluebubbles.js +2 -0
  382. package/dist/repertoire/tools-bridge.js +144 -0
  383. package/dist/repertoire/tools-bundle.js +993 -0
  384. package/dist/repertoire/tools-commerce.js +253 -0
  385. package/dist/repertoire/tools-config.js +186 -0
  386. package/dist/repertoire/tools-continuity.js +252 -0
  387. package/dist/repertoire/tools-credential.js +383 -0
  388. package/dist/repertoire/tools-evolution.js +527 -0
  389. package/dist/repertoire/tools-files.js +344 -0
  390. package/dist/repertoire/tools-flight.js +290 -0
  391. package/dist/repertoire/tools-flow.js +119 -0
  392. package/dist/repertoire/tools-github.js +3 -8
  393. package/dist/repertoire/tools-habits.js +103 -0
  394. package/dist/repertoire/tools-mail.js +1828 -0
  395. package/dist/repertoire/tools-notes.js +459 -0
  396. package/dist/repertoire/tools-obligations.js +182 -0
  397. package/dist/repertoire/tools-orientation.js +31 -0
  398. package/dist/repertoire/tools-record.js +482 -0
  399. package/dist/repertoire/tools-rsvp.js +139 -0
  400. package/dist/repertoire/tools-runtime.js +150 -0
  401. package/dist/repertoire/tools-session.js +881 -0
  402. package/dist/repertoire/tools-shell.js +133 -0
  403. package/dist/repertoire/tools-stripe.js +224 -0
  404. package/dist/repertoire/tools-surface.js +355 -0
  405. package/dist/repertoire/tools-teams.js +12 -39
  406. package/dist/repertoire/tools-travel.js +125 -0
  407. package/dist/repertoire/tools-trip.js +982 -0
  408. package/dist/repertoire/tools-unraid.js +353 -0
  409. package/dist/repertoire/tools-user-profile.js +146 -0
  410. package/dist/repertoire/tools-vault.js +40 -0
  411. package/dist/repertoire/tools-voice.js +145 -0
  412. package/dist/repertoire/tools.js +276 -79
  413. package/dist/repertoire/travel-api-client.js +360 -0
  414. package/dist/repertoire/unraid-client.js +155 -0
  415. package/dist/repertoire/unraid-restart.js +130 -0
  416. package/dist/repertoire/user-profile.js +131 -0
  417. package/dist/repertoire/vault-setup.js +246 -0
  418. package/dist/repertoire/vault-unlock.js +628 -0
  419. package/dist/rsvp/aisleplanner-client.js +354 -0
  420. package/dist/rsvp/cli.js +926 -0
  421. package/dist/rsvp/config.js +327 -0
  422. package/dist/rsvp/cutover.js +433 -0
  423. package/dist/rsvp/diagnostics.js +232 -0
  424. package/dist/rsvp/diff-renderer.js +176 -0
  425. package/dist/rsvp/habit-policy.js +110 -0
  426. package/dist/rsvp/habit-stage.js +123 -0
  427. package/dist/rsvp/incident-bundle.js +97 -0
  428. package/dist/rsvp/migration.js +204 -0
  429. package/dist/rsvp/native-habit-runner.js +630 -0
  430. package/dist/rsvp/outbound-state.js +628 -0
  431. package/dist/rsvp/query.js +118 -0
  432. package/dist/rsvp/replay.js +233 -0
  433. package/dist/rsvp/snapshot.js +232 -0
  434. package/dist/rsvp/spend-ledger.js +175 -0
  435. package/dist/scripts/claude-code-hook.js +41 -0
  436. package/dist/scripts/claude-code-stop-hook.js +47 -0
  437. package/dist/senses/a2a-entry.js +115 -0
  438. package/dist/senses/attention-queue.js +186 -0
  439. package/dist/senses/await-turn-message.js +58 -0
  440. package/dist/senses/bluebubbles/active-turns.js +216 -0
  441. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  442. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  443. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  444. package/dist/senses/bluebubbles/context-packet.js +207 -0
  445. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  446. package/dist/senses/bluebubbles/entry.js +90 -0
  447. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  448. package/dist/senses/bluebubbles/index.js +3839 -0
  449. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  450. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  451. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  452. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  453. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  454. package/dist/senses/bluebubbles/processed-log.js +133 -0
  455. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  456. package/dist/senses/bluebubbles/replay.js +284 -0
  457. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  458. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  459. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  460. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  461. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  462. package/dist/senses/cli/bracketed-paste.js +82 -0
  463. package/dist/senses/cli/image-paste.js +287 -0
  464. package/dist/senses/cli/image-ref-navigation.js +75 -0
  465. package/dist/senses/cli/ink-app.js +156 -0
  466. package/dist/senses/cli/inline-diff.js +64 -0
  467. package/dist/senses/cli/input-keys.js +174 -0
  468. package/dist/senses/cli/kill-ring.js +86 -0
  469. package/dist/senses/cli/message-list.js +51 -0
  470. package/dist/senses/cli/ouro-tui.js +607 -0
  471. package/dist/senses/cli/spinner-imperative.js +135 -0
  472. package/dist/senses/cli/spinner.js +101 -0
  473. package/dist/senses/cli/status-line.js +60 -0
  474. package/dist/senses/cli/streaming-markdown.js +526 -0
  475. package/dist/senses/cli/tool-display.js +85 -0
  476. package/dist/senses/cli/tool-render.js +85 -0
  477. package/dist/senses/cli/tui-store.js +241 -0
  478. package/dist/senses/cli/virtual-list.js +35 -0
  479. package/dist/senses/cli-entry.js +60 -8
  480. package/dist/senses/cli-layout.js +100 -0
  481. package/dist/senses/cli.js +621 -321
  482. package/dist/senses/commands.js +66 -3
  483. package/dist/senses/context-packet-ledger.js +371 -0
  484. package/dist/senses/context-packets.js +154 -0
  485. package/dist/senses/habit-lifecycle-guard.js +24 -0
  486. package/dist/senses/habit-turn-message.js +160 -0
  487. package/dist/senses/ingress-evidence.js +2 -0
  488. package/dist/senses/mail-entry.js +66 -0
  489. package/dist/senses/mail.js +524 -0
  490. package/dist/senses/pipeline.js +1075 -176
  491. package/dist/senses/private-runtime-worker.js +741 -0
  492. package/dist/senses/private-runtime.js +1212 -0
  493. package/dist/senses/proactive-content-guard.js +51 -0
  494. package/dist/senses/sanctuary-grounding.js +118 -0
  495. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  496. package/dist/senses/sanctuary-health-acceptance-probe.js +772 -0
  497. package/dist/senses/sanctuary-health-runner.js +146 -0
  498. package/dist/senses/sanctuary-health.js +447 -0
  499. package/dist/senses/sanctuary-interactive-control.js +306 -0
  500. package/dist/senses/sanctuary-runtime.js +206 -0
  501. package/dist/senses/shared-turn.js +432 -0
  502. package/dist/senses/surface-tool.js +109 -0
  503. package/dist/senses/teams-entry.js +60 -8
  504. package/dist/senses/teams.js +515 -217
  505. package/dist/senses/telegram-approval-runtime.js +526 -0
  506. package/dist/senses/telegram-audit-ledger.js +220 -0
  507. package/dist/senses/telegram-client.js +1471 -0
  508. package/dist/senses/telegram-entry.js +80 -0
  509. package/dist/senses/telegram.js +1232 -0
  510. package/dist/senses/trust-gate.js +104 -9
  511. package/dist/senses/voice/audio-playback.js +237 -0
  512. package/dist/senses/voice/audio-routing.js +119 -0
  513. package/dist/senses/voice/elevenlabs.js +202 -0
  514. package/dist/senses/voice/floor-control.js +431 -0
  515. package/dist/senses/voice/floor-controller.js +115 -0
  516. package/dist/senses/voice/golden-path.js +116 -0
  517. package/dist/senses/voice/index.js +29 -0
  518. package/dist/senses/voice/meeting.js +113 -0
  519. package/dist/senses/voice/outbound.js +190 -0
  520. package/dist/senses/voice/phone.js +33 -0
  521. package/dist/senses/voice/playback.js +139 -0
  522. package/dist/senses/voice/realtime-eval.js +496 -0
  523. package/dist/senses/voice/realtime-trace.js +531 -0
  524. package/dist/senses/voice/transcript.js +70 -0
  525. package/dist/senses/voice/turn.js +191 -0
  526. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  527. package/dist/senses/voice/twilio-phone.js +5081 -0
  528. package/dist/senses/voice/types.js +2 -0
  529. package/dist/senses/voice/whisper.js +161 -0
  530. package/dist/senses/voice-entry.js +81 -0
  531. package/dist/senses/voice-realtime-eval-command.js +99 -0
  532. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  533. package/dist/senses/voice-twilio-entry.js +87 -0
  534. package/dist/trips/core.js +138 -0
  535. package/dist/trips/store.js +265 -0
  536. package/dist/util/frontmatter.js +69 -0
  537. package/npm-shrinkwrap.json +8129 -0
  538. package/package.json +71 -12
  539. package/skills/agent-commerce.md +113 -0
  540. package/skills/browser-navigation.md +117 -0
  541. package/skills/commerce-setup-guide.md +116 -0
  542. package/skills/commerce-setup.md +84 -0
  543. package/skills/configure-dev-tools.md +99 -0
  544. package/skills/travel-planning.md +138 -0
  545. package/dist/heart/daemon/auth-flow.js +0 -430
  546. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  547. package/dist/heart/daemon/update-hooks.js +0 -138
  548. package/dist/heart/safe-workspace.js +0 -228
  549. package/dist/heart/session-recall.js +0 -116
  550. package/dist/mind/friends/channel.js +0 -84
  551. package/dist/mind/friends/group-context.js +0 -144
  552. package/dist/mind/friends/resolver.js +0 -84
  553. package/dist/mind/friends/store-file.js +0 -190
  554. package/dist/mind/friends/store.js +0 -4
  555. package/dist/mind/friends/tokens.js +0 -26
  556. package/dist/mind/friends/trust-explanation.js +0 -74
  557. package/dist/mind/friends/types.js +0 -29
  558. package/dist/repertoire/tasks/board.js +0 -134
  559. package/dist/repertoire/tasks/index.js +0 -224
  560. package/dist/repertoire/tasks/lifecycle.js +0 -80
  561. package/dist/repertoire/tasks/middleware.js +0 -65
  562. package/dist/repertoire/tasks/parser.js +0 -173
  563. package/dist/repertoire/tasks/scanner.js +0 -132
  564. package/dist/repertoire/tasks/transitions.js +0 -144
  565. package/dist/senses/bluebubbles-entry.js +0 -13
  566. package/dist/senses/bluebubbles.js +0 -1180
  567. package/dist/senses/debug-activity.js +0 -148
  568. package/dist/senses/inner-dialog-worker.js +0 -90
  569. package/dist/senses/inner-dialog.js +0 -480
  570. package/subagents/README.md +0 -7
  571. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  572. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  573. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  574. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  575. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  576. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  577. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  578. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  579. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  580. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  581. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  582. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  583. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  584. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  585. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  586. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  587. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,7 @@
1
+ # Tacit
2
+
3
+ - Read status, capacity, disk health, notifications, and bounded logs freely.
4
+ - Restart only one exact existing container after a durable Telegram approval.
5
+ - Never touch array/parity/disk configuration, permissions, network/security settings, or `/mnt/user` paths.
6
+ - Never send server data off-box or enter credentials into another system.
7
+ - When state is ambiguous, report what is known and stop.
@@ -0,0 +1,21 @@
1
+ {
2
+ "version": 1,
3
+ "profiles": {
4
+ "sanctuary-telegram": [
5
+ "unraid_list_containers",
6
+ "unraid_get_container_logs",
7
+ "unraid_get_storage",
8
+ "unraid_get_disks",
9
+ "unraid_get_notifications",
10
+ "unraid_get_system",
11
+ "unraid_restart_container",
12
+ "ponder",
13
+ "settle",
14
+ "speak"
15
+ ],
16
+ "sanctuary-health-private": [
17
+ "send_message",
18
+ "rest"
19
+ ]
20
+ }
21
+ }
@@ -0,0 +1,25 @@
1
+ <?xml version="1.0"?>
2
+ <Container version="2">
3
+ <Name>ouro-butler</Name>
4
+ <Repository>sha256:REPLACE_WITH_EXACT_LOCAL_IMAGE_ID</Repository>
5
+ <Registry/>
6
+ <Network>host</Network>
7
+ <Shell>sh</Shell>
8
+ <Privileged>false</Privileged>
9
+ <Support/>
10
+ <Project/>
11
+ <Overview>Mendelow Cloud Butler</Overview>
12
+ <Category>Tools:</Category>
13
+ <WebUI/>
14
+ <TemplateURL/>
15
+ <Icon/>
16
+ <ExtraParams>--restart=unless-stopped --user=10001:10001</ExtraParams>
17
+ <PostArgs/>
18
+ <CPUset/>
19
+ <DateInstalled>0</DateInstalled>
20
+ <DonateText/>
21
+ <DonateLink/>
22
+ <Requires/>
23
+ <Config Name="Runtime state" Target="/home/ouro/.ouro-cli" Default="/mnt/user/appdata/ouro-butler/runtime/.ouro-cli" Mode="rw" Description="Machine-scoped runtime" Type="Path" Display="always" Required="true" Mask="false">/mnt/user/appdata/ouro-butler/runtime/.ouro-cli</Config>
24
+ <Config Name="Agent bundle" Target="/home/ouro/AgentBundles/sanctuary.ouro" Default="/mnt/user/appdata/ouro-butler/agent/sanctuary.ouro" Mode="rw" Description="Sanctuary bundle" Type="Path" Display="always" Required="true" Mask="false">/mnt/user/appdata/ouro-butler/agent/sanctuary.ouro</Config>
25
+ </Container>
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildA2AAgentCard = buildA2AAgentCard;
4
+ const runtime_1 = require("../nerves/runtime");
5
+ const config_1 = require("./config");
6
+ function buildA2AAgentCard(options) {
7
+ const endpoint = (0, config_1.a2aEndpointFromBaseUrl)(options.baseUrl, options.path ?? config_1.A2A_DEFAULT_PATH);
8
+ const card = {
9
+ name: options.agentName,
10
+ description: options.description ?? `Ouroboros agent ${options.agentName}`,
11
+ protocolVersion: config_1.A2A_DEFAULT_PROTOCOL_VERSION,
12
+ ...(options.did ? { did: options.did } : {}),
13
+ url: endpoint,
14
+ preferredTransport: "JSONRPC",
15
+ supportedInterfaces: [{
16
+ url: endpoint,
17
+ protocolBinding: "JSONRPC",
18
+ protocolVersion: config_1.A2A_DEFAULT_PROTOCOL_VERSION,
19
+ }],
20
+ additionalInterfaces: [{
21
+ url: endpoint,
22
+ transport: "JSONRPC",
23
+ }],
24
+ version: "1.0.0",
25
+ capabilities: {
26
+ streaming: false,
27
+ pushNotifications: false,
28
+ extendedAgentCard: false,
29
+ },
30
+ defaultInputModes: ["text/plain"],
31
+ defaultOutputModes: ["text/plain", "application/json"],
32
+ skills: [
33
+ {
34
+ id: "ouro-message",
35
+ name: "Message Ouro Agent",
36
+ description: "Send a message or task request through the Ouro A2A sense.",
37
+ tags: ["ouro", "agent", "work"],
38
+ examples: ["Ask this Ouro agent to continue or complete a delegated task."],
39
+ inputModes: ["text/plain"],
40
+ outputModes: ["text/plain", "application/json"],
41
+ },
42
+ ],
43
+ metadata: {
44
+ ouro: {
45
+ sense: "a2a",
46
+ agentName: options.agentName,
47
+ },
48
+ },
49
+ };
50
+ (0, runtime_1.emitNervesEvent)({
51
+ component: "channels",
52
+ event: "channel.a2a_card_built",
53
+ message: "built A2A agent card",
54
+ meta: { agentName: options.agentName, endpoint, ...(options.did ? { did: options.did } : {}) },
55
+ });
56
+ return card;
57
+ }
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.endpointForCard = endpointForCard;
4
+ exports.fetchA2AAgentCard = fetchA2AAgentCard;
5
+ exports.sendA2AMessage = sendA2AMessage;
6
+ exports.postA2AMessageEnvelope = postA2AMessageEnvelope;
7
+ exports.getA2ATask = getA2ATask;
8
+ const node_crypto_1 = require("node:crypto");
9
+ const runtime_1 = require("../nerves/runtime");
10
+ function endpointForCard(card) {
11
+ const jsonRpc = card.supportedInterfaces?.find((entry) => (entry.protocolBinding ?? entry.transport)?.toUpperCase() === "JSONRPC");
12
+ if (jsonRpc?.url)
13
+ return jsonRpc.url;
14
+ if (card.preferredTransport?.toUpperCase() === "JSONRPC" && card.url)
15
+ return card.url;
16
+ const legacyJsonRpc = card.additionalInterfaces?.find((entry) => entry.transport.toUpperCase() === "JSONRPC");
17
+ return legacyJsonRpc?.url ?? card.url;
18
+ }
19
+ async function fetchA2AAgentCard(cardUrl, fetchImpl = fetch) {
20
+ (0, runtime_1.emitNervesEvent)({
21
+ component: "channels",
22
+ event: "channel.a2a_card_fetch_start",
23
+ message: "fetching A2A agent card",
24
+ meta: { cardUrl },
25
+ });
26
+ const response = await fetchImpl(cardUrl);
27
+ if (!response.ok) {
28
+ throw new Error(`A2A card fetch failed (${response.status} ${response.statusText})`);
29
+ }
30
+ const parsed = await response.json();
31
+ const endpoint = endpointForCard(parsed);
32
+ if (!parsed || typeof parsed !== "object" || typeof endpoint !== "string" || typeof parsed.name !== "string") {
33
+ throw new Error("A2A card is missing required name or JSONRPC endpoint fields");
34
+ }
35
+ (0, runtime_1.emitNervesEvent)({
36
+ component: "channels",
37
+ event: "channel.a2a_card_fetch_end",
38
+ message: "fetched A2A agent card",
39
+ meta: { cardUrl, endpoint, name: parsed.name },
40
+ });
41
+ return parsed;
42
+ }
43
+ async function postJsonRpc(endpointUrl, request, fetchImpl, protocolVersion = "1.0") {
44
+ const response = await fetchImpl(endpointUrl, {
45
+ method: "POST",
46
+ headers: { "content-type": "application/json", "A2A-Version": protocolVersion },
47
+ body: JSON.stringify(request),
48
+ });
49
+ if (!response.ok) {
50
+ throw new Error(`A2A JSON-RPC request failed (${response.status} ${response.statusText})`);
51
+ }
52
+ return await response.json();
53
+ }
54
+ function methodNotFound(response) {
55
+ return "error" in response && response.error.code === -32601;
56
+ }
57
+ function senderMetadata(input) {
58
+ return {
59
+ ...(input.senderAgentId ? { senderAgentId: input.senderAgentId } : {}),
60
+ ...(input.senderName ? { senderName: input.senderName } : {}),
61
+ ...(input.senderCardUrl ? { senderCardUrl: input.senderCardUrl } : {}),
62
+ };
63
+ }
64
+ async function sendA2AMessage(input) {
65
+ const fetchImpl = input.fetchImpl ?? fetch;
66
+ const messageId = (0, node_crypto_1.randomUUID)();
67
+ const request = {
68
+ jsonrpc: "2.0",
69
+ id: (0, node_crypto_1.randomUUID)(),
70
+ method: "message/send",
71
+ params: {
72
+ message: {
73
+ kind: "message",
74
+ role: "user",
75
+ messageId,
76
+ ...(input.taskId ? { taskId: input.taskId } : {}),
77
+ contextId: input.sessionKey ?? "default",
78
+ parts: [{ kind: "text", text: input.message }],
79
+ metadata: senderMetadata(input),
80
+ },
81
+ ...(input.accessToken ? { accessToken: input.accessToken } : {}),
82
+ },
83
+ };
84
+ (0, runtime_1.emitNervesEvent)({
85
+ component: "channels",
86
+ event: "channel.a2a_message_send_start",
87
+ message: "sending A2A message",
88
+ meta: { endpointUrl: input.endpointUrl, messageId },
89
+ });
90
+ let rpc = await postJsonRpc(input.endpointUrl, request, fetchImpl, "0.3");
91
+ if (methodNotFound(rpc)) {
92
+ rpc = await postJsonRpc(input.endpointUrl, {
93
+ ...request,
94
+ method: "SendMessage",
95
+ params: {
96
+ ...request.params,
97
+ message: {
98
+ ...(request.params.message),
99
+ role: "ROLE_USER",
100
+ },
101
+ },
102
+ }, fetchImpl);
103
+ }
104
+ if ("error" in rpc) {
105
+ throw new Error(`A2A error ${rpc.error.code}: ${rpc.error.message}`);
106
+ }
107
+ const result = rpc.result;
108
+ const task = "task" in result && result.task ? result.task : result;
109
+ (0, runtime_1.emitNervesEvent)({
110
+ component: "channels",
111
+ event: "channel.a2a_message_send_end",
112
+ message: "sent A2A message",
113
+ meta: { endpointUrl: input.endpointUrl, messageId, taskId: task.id },
114
+ });
115
+ return task;
116
+ }
117
+ /**
118
+ * POST a pre-built friends A2A message (a `wrapInDataPart` sealed-envelope message)
119
+ * to a peer endpoint as a JSON-RPC `message/send`. This is the `direct`-rung wire
120
+ * the harness `A2ATransport` uses: friends' `sendShare` builds the sealed message and
121
+ * hands it to the transport, which delivers it here. Unlike `sendA2AMessage` (which
122
+ * builds a text part), this carries the caller's exact `message` (the sealed DataPart)
123
+ * untouched. Throws on a non-2xx response (transport failure).
124
+ */
125
+ async function postA2AMessageEnvelope(input) {
126
+ const fetchImpl = input.fetchImpl ?? fetch;
127
+ const request = {
128
+ jsonrpc: "2.0",
129
+ id: (0, node_crypto_1.randomUUID)(),
130
+ method: "message/send",
131
+ params: { message: input.message },
132
+ };
133
+ (0, runtime_1.emitNervesEvent)({
134
+ component: "channels",
135
+ event: "channel.a2a_envelope_post_start",
136
+ message: "posting sealed A2A message envelope (direct rung)",
137
+ meta: { endpointUrl: input.endpointUrl },
138
+ });
139
+ let rpc = await postJsonRpc(input.endpointUrl, request, fetchImpl, "0.3");
140
+ if (methodNotFound(rpc)) {
141
+ rpc = await postJsonRpc(input.endpointUrl, { ...request, method: "SendMessage" }, fetchImpl);
142
+ }
143
+ if ("error" in rpc) {
144
+ throw new Error(`A2A error ${rpc.error.code}: ${rpc.error.message}`);
145
+ }
146
+ (0, runtime_1.emitNervesEvent)({
147
+ component: "channels",
148
+ event: "channel.a2a_envelope_post_end",
149
+ message: "posted sealed A2A message envelope",
150
+ meta: { endpointUrl: input.endpointUrl },
151
+ });
152
+ }
153
+ async function getA2ATask(input) {
154
+ const fetchImpl = input.fetchImpl ?? fetch;
155
+ const metadata = senderMetadata(input);
156
+ const request = {
157
+ jsonrpc: "2.0",
158
+ id: (0, node_crypto_1.randomUUID)(),
159
+ method: "tasks/get",
160
+ params: {
161
+ id: input.taskId,
162
+ ...(input.accessToken ? { accessToken: input.accessToken } : {}),
163
+ ...(Object.keys(metadata).length > 0 ? { metadata } : {}),
164
+ },
165
+ };
166
+ (0, runtime_1.emitNervesEvent)({
167
+ component: "channels",
168
+ event: "channel.a2a_task_get",
169
+ message: "fetching A2A task",
170
+ meta: { endpointUrl: input.endpointUrl, taskId: input.taskId },
171
+ });
172
+ let rpc = await postJsonRpc(input.endpointUrl, request, fetchImpl, "0.3");
173
+ if (methodNotFound(rpc)) {
174
+ rpc = await postJsonRpc(input.endpointUrl, { ...request, method: "GetTask" }, fetchImpl);
175
+ }
176
+ if ("error" in rpc) {
177
+ throw new Error(`A2A error ${rpc.error.code}: ${rpc.error.message}`);
178
+ }
179
+ return rpc.result;
180
+ }
@@ -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,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,170 @@
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
+ const crypto = __importStar(require("node:crypto"));
40
+ const os = __importStar(require("node:os"));
41
+ const a2a_client_1 = require("@ouro.bot/friends/a2a-client");
42
+ const runtime_1 = require("../nerves/runtime");
43
+ const runtime_credentials_1 = require("../heart/runtime-credentials");
44
+ const machine_identity_1 = require("../heart/machine-identity");
45
+ /** The number of raw bytes in an Ed25519 seed. */
46
+ const ED25519_SEED_BYTES = 32;
47
+ /** The machine-config key path for the persisted seed: `a2a.identity.ed25519Seed`. */
48
+ function a2aIdentityConfig(config) {
49
+ const a2a = config.a2a;
50
+ if (!a2a || typeof a2a !== "object" || Array.isArray(a2a))
51
+ return undefined;
52
+ const identity = a2a.identity;
53
+ if (!identity || typeof identity !== "object" || Array.isArray(identity))
54
+ return undefined;
55
+ return identity;
56
+ }
57
+ /** Read the stored Ed25519 seed string from a machine-config object, or undefined. */
58
+ function readStoredA2ASeed(config) {
59
+ const identity = a2aIdentityConfig(config);
60
+ const seed = identity?.ed25519Seed;
61
+ return typeof seed === "string" && seed.length > 0 ? seed : undefined;
62
+ }
63
+ /** Decode + validate a stored seed string into 32 raw bytes. Throws on malformed. */
64
+ function decodeSeed(seedString) {
65
+ let decoded;
66
+ try {
67
+ decoded = Buffer.from(seedString, "base64url");
68
+ }
69
+ catch {
70
+ /* v8 ignore next -- Buffer.from(base64url) does not throw on bad chars; this guards future decoders @preserve */
71
+ throw new Error("malformed A2A identity seed: not decodable");
72
+ }
73
+ // base64url is lenient (it silently drops invalid chars), so the length check is
74
+ // the real gate: a real Ed25519 seed is exactly 32 bytes.
75
+ if (decoded.length !== ED25519_SEED_BYTES) {
76
+ throw new Error(`malformed A2A identity seed: expected ${ED25519_SEED_BYTES}-byte seed, got ${decoded.length}`);
77
+ }
78
+ return new Uint8Array(decoded);
79
+ }
80
+ /** Mint a fresh 32-byte Ed25519 seed (Node keygen → JWK `d`, the raw seed). */
81
+ function mintSeed() {
82
+ const { privateKey } = crypto.generateKeyPairSync("ed25519");
83
+ const jwk = privateKey.export({ format: "jwk" });
84
+ /* v8 ignore next -- Node always emits the `d` field for an Ed25519 private JWK; guard protects future runtimes @preserve */
85
+ if (typeof jwk.d !== "string")
86
+ throw new Error("failed to mint A2A identity seed: missing JWK d");
87
+ return decodeSeed(jwk.d);
88
+ }
89
+ /** Derive the full did:key identity from a 32-byte seed (deterministic). */
90
+ function deriveIdentity(sodium, seed) {
91
+ const keypair = sodium.crypto_sign_seed_keypair(seed);
92
+ const didIdentity = (0, a2a_client_1.didKeyIdentityFromEd25519)({
93
+ sodium,
94
+ ed25519Pub: keypair.publicKey,
95
+ ed25519Priv: keypair.privateKey,
96
+ });
97
+ return { ...didIdentity, seed: Buffer.from(seed).toString("base64url") };
98
+ }
99
+ /**
100
+ * Load the agent's A2A identity from the machine-local config, or mint + persist
101
+ * one on first use. A malformed stored seed FAILS FAST (it never silently
102
+ * re-mints, which would change the agent's DID). The mint path persists the new
103
+ * seed via `upsert` before deriving; the load path performs no writes.
104
+ */
105
+ async function loadOrMintA2AIdentity(input) {
106
+ const stored = readStoredA2ASeed(input.config);
107
+ if (stored) {
108
+ // Load path: a malformed seed throws (no re-mint).
109
+ const seed = decodeSeed(stored);
110
+ const identity = deriveIdentity(input.sodium, seed);
111
+ (0, runtime_1.emitNervesEvent)({
112
+ component: "channels",
113
+ event: "channel.a2a_identity_loaded",
114
+ message: "loaded A2A identity from machine config",
115
+ meta: { agentName: input.agentName, did: identity.did },
116
+ });
117
+ return identity;
118
+ }
119
+ // Mint path: generate a seed, persist it under a2a.identity.*, then derive.
120
+ const seed = mintSeed();
121
+ const seedString = Buffer.from(seed).toString("base64url");
122
+ const a2a = (input.config.a2a && typeof input.config.a2a === "object" && !Array.isArray(input.config.a2a)
123
+ ? input.config.a2a
124
+ : {});
125
+ const identityBlock = (a2a.identity && typeof a2a.identity === "object" && !Array.isArray(a2a.identity)
126
+ ? a2a.identity
127
+ : {});
128
+ const nextConfig = {
129
+ ...input.config,
130
+ a2a: { ...a2a, identity: { ...identityBlock, ed25519Seed: seedString } },
131
+ };
132
+ await input.upsert(nextConfig);
133
+ const identity = deriveIdentity(input.sodium, seed);
134
+ (0, runtime_1.emitNervesEvent)({
135
+ component: "channels",
136
+ event: "channel.a2a_identity_minted",
137
+ message: "minted new A2A identity and persisted seed to machine config",
138
+ meta: { agentName: input.agentName, did: identity.did },
139
+ });
140
+ return identity;
141
+ }
142
+ /**
143
+ * Load (or mint-on-first-use) THIS agent's own A2A identity from the machine-local
144
+ * runtime config — the convenience entry the main-process tools use to obtain the
145
+ * self identity that signs outbound sealed envelopes. Mirrors the a2a sense
146
+ * entrypoint's load (use a cached seed when present, otherwise refresh machine
147
+ * config → `loadOrMintA2AIdentity` → merge a fresh seed under the right machine
148
+ * id). `sodium` is optional (defaults to `ready()`).
149
+ */
150
+ async function loadSelfA2AIdentity(input) {
151
+ const sodium = input.sodium ?? await (0, a2a_client_1.ready)();
152
+ const machineId = (0, machine_identity_1.loadOrCreateMachineIdentity)({ homeDir: os.homedir() }).machineId;
153
+ const cached = (0, runtime_credentials_1.readMachineRuntimeCredentialConfig)(input.agentName);
154
+ const read = cached.ok && readStoredA2ASeed(cached.config)
155
+ ? cached
156
+ : await (0, runtime_credentials_1.refreshMachineRuntimeCredentialConfig)(input.agentName, machineId);
157
+ if (!read.ok && read.reason !== "missing") {
158
+ throw new Error(`A2A identity requires readable machine runtime config at ${read.itemPath}: ${read.error}`);
159
+ }
160
+ const config = read.ok ? read.config : {};
161
+ return loadOrMintA2AIdentity({
162
+ agentName: input.agentName,
163
+ sodium,
164
+ config,
165
+ upsert: async (next) => {
166
+ const seed = readStoredA2ASeed(next);
167
+ await (0, runtime_credentials_1.mergeMachineRuntimeCredentialConfig)(input.agentName, machineId, { a2a: { identity: { ed25519Seed: seed } } });
168
+ },
169
+ });
170
+ }