@ouro.bot/cli 0.1.0-alpha.83 → 0.1.0-alpha.831

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 (647) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -23
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/bluebubbles-host +264 -0
  14. package/assets/sanctuary-host-launcher.sh +16 -0
  15. package/changelog.json +5308 -16
  16. package/deploy/unraid/Dockerfile +54 -0
  17. package/deploy/unraid/README.txt +2983 -0
  18. package/deploy/unraid/audit-container-spec.sh +4 -0
  19. package/deploy/unraid/container-runtime.json +1 -0
  20. package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
  21. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  22. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  23. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  24. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  25. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  26. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  27. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  28. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  29. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  30. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  31. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  32. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  33. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  34. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  35. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2084 -0
  36. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  37. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  38. package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
  39. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  40. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  41. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  42. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +795 -0
  43. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  44. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  45. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  46. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +15 -0
  47. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
  48. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +15 -0
  49. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  50. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +135 -0
  51. package/deploy/unraid/sanctuary.xml +28 -0
  52. package/dist/a2a/card.js +57 -0
  53. package/dist/a2a/client.js +180 -0
  54. package/dist/a2a/config.js +50 -0
  55. package/dist/a2a/delegation-stores.js +56 -0
  56. package/dist/a2a/did-resolution.js +93 -0
  57. package/dist/a2a/identity.js +170 -0
  58. package/dist/a2a/inbound-share.js +107 -0
  59. package/dist/a2a/mission-result-wire.js +196 -0
  60. package/dist/a2a/onboarding.js +115 -0
  61. package/dist/a2a/pin-store.js +132 -0
  62. package/dist/a2a/seen-ledger.js +120 -0
  63. package/dist/a2a/server.js +604 -0
  64. package/dist/a2a/task-store.js +69 -0
  65. package/dist/a2a/transport.js +45 -0
  66. package/dist/a2a/types.js +3 -0
  67. package/dist/arc/attention-types.js +8 -0
  68. package/dist/arc/cares.js +360 -0
  69. package/dist/arc/episodes.js +118 -0
  70. package/dist/arc/evolution.js +490 -0
  71. package/dist/arc/flight-recorder.js +1034 -0
  72. package/dist/arc/intentions.js +134 -0
  73. package/dist/arc/json-store.js +117 -0
  74. package/dist/arc/obligations.js +386 -0
  75. package/dist/arc/packets.js +336 -0
  76. package/dist/arc/presence.js +185 -0
  77. package/dist/arc/task-lifecycle.js +57 -0
  78. package/dist/commerce/store.js +755 -0
  79. package/dist/commerce/types.js +3 -0
  80. package/dist/heart/active-work.js +798 -40
  81. package/dist/heart/agent-entry.js +252 -3
  82. package/dist/heart/approval-files.js +113 -0
  83. package/dist/heart/approval-store.js +960 -0
  84. package/dist/heart/attachments/image-normalize.js +194 -0
  85. package/dist/heart/attachments/materialize.js +97 -0
  86. package/dist/heart/attachments/originals.js +88 -0
  87. package/dist/heart/attachments/render.js +29 -0
  88. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  89. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  90. package/dist/heart/attachments/sources/index.js +18 -0
  91. package/dist/heart/attachments/sources/telegram.js +71 -0
  92. package/dist/heart/attachments/store.js +132 -0
  93. package/dist/heart/attachments/types.js +93 -0
  94. package/dist/heart/auth/auth-flow.js +495 -0
  95. package/dist/heart/autonomy-budget.js +478 -0
  96. package/dist/heart/awaiting/await-alert.js +148 -0
  97. package/dist/heart/awaiting/await-expiry.js +143 -0
  98. package/dist/heart/awaiting/await-loader.js +91 -0
  99. package/dist/heart/awaiting/await-parser.js +149 -0
  100. package/dist/heart/awaiting/await-runtime-state.js +111 -0
  101. package/dist/heart/awaiting/await-scheduler.js +382 -0
  102. package/dist/heart/background-operations.js +281 -0
  103. package/dist/heart/bridges/manager.js +137 -17
  104. package/dist/heart/bridges/store.js +14 -2
  105. package/dist/heart/bundle-state.js +168 -0
  106. package/dist/heart/commitments.js +44 -18
  107. package/dist/heart/config-registry.js +331 -0
  108. package/dist/heart/config.js +174 -131
  109. package/dist/heart/context-loss-gauntlet.js +387 -0
  110. package/dist/heart/context-loss-sentinel.js +1157 -0
  111. package/dist/heart/core.js +2169 -581
  112. package/dist/heart/cross-chat-delivery.js +9 -22
  113. package/dist/heart/daemon/agent-config-check.js +451 -0
  114. package/dist/heart/daemon/agent-discovery.js +185 -3
  115. package/dist/heart/daemon/agent-service.js +542 -0
  116. package/dist/heart/daemon/agentic-repair.js +547 -0
  117. package/dist/heart/daemon/await-private-wake.js +59 -0
  118. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  119. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  120. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  121. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  122. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  123. package/dist/heart/daemon/cadence.js +180 -0
  124. package/dist/heart/daemon/cli-defaults.js +854 -0
  125. package/dist/heart/daemon/cli-desk.js +322 -0
  126. package/dist/heart/daemon/cli-exec.js +8822 -0
  127. package/dist/heart/daemon/cli-help.js +716 -0
  128. package/dist/heart/daemon/cli-parse.js +2771 -0
  129. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  130. package/dist/heart/daemon/cli-render.js +777 -0
  131. package/dist/heart/daemon/cli-types.js +8 -0
  132. package/dist/heart/daemon/connect-bay.js +323 -0
  133. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  134. package/dist/heart/daemon/container-healthcheck.js +112 -0
  135. package/dist/heart/daemon/container-runtime.js +97 -0
  136. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  137. package/dist/heart/daemon/container-spec-auditor.js +229 -0
  138. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  139. package/dist/heart/daemon/daemon-cli.js +29 -2349
  140. package/dist/heart/daemon/daemon-entry.js +930 -11
  141. package/dist/heart/daemon/daemon-health.js +186 -0
  142. package/dist/heart/daemon/daemon-rollup.js +57 -0
  143. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  144. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  145. package/dist/heart/daemon/daemon.js +2084 -105
  146. package/dist/heart/daemon/dns-workflow.js +394 -0
  147. package/dist/heart/daemon/doctor-types.js +8 -0
  148. package/dist/heart/daemon/doctor.js +1755 -0
  149. package/dist/heart/daemon/freshness.js +345 -0
  150. package/dist/heart/daemon/habit-private-wake.js +61 -0
  151. package/dist/heart/daemon/health-monitor.js +142 -11
  152. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  153. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  154. package/dist/heart/daemon/http-health-probe.js +80 -0
  155. package/dist/heart/daemon/human-command-screens.js +234 -0
  156. package/dist/heart/daemon/human-readiness.js +114 -0
  157. package/dist/heart/daemon/inner-status.js +78 -0
  158. package/dist/heart/daemon/interactive-repair.js +394 -0
  159. package/dist/heart/daemon/launchd.js +37 -8
  160. package/dist/heart/daemon/log-tailer.js +79 -10
  161. package/dist/heart/daemon/logs-prune.js +132 -0
  162. package/dist/heart/daemon/mcp-canary.js +524 -0
  163. package/dist/heart/daemon/message-router.js +65 -5
  164. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  165. package/dist/heart/daemon/os-cron-deps.js +135 -0
  166. package/dist/heart/daemon/os-cron.js +22 -14
  167. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  168. package/dist/heart/daemon/ouro-entry.js +3 -1
  169. package/dist/heart/daemon/plugin-cli.js +432 -0
  170. package/dist/heart/daemon/process-manager.js +733 -61
  171. package/dist/heart/daemon/provider-discovery.js +137 -0
  172. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  173. package/dist/heart/daemon/prunable-bundle.js +144 -0
  174. package/dist/heart/daemon/pulse.js +511 -0
  175. package/dist/heart/daemon/readiness-repair.js +365 -0
  176. package/dist/heart/daemon/run-hooks.js +2 -0
  177. package/dist/heart/daemon/runtime-logging.js +47 -14
  178. package/dist/heart/daemon/runtime-metadata.js +2 -30
  179. package/dist/heart/daemon/runtime-mode.js +13 -2
  180. package/dist/heart/daemon/safe-mode.js +161 -0
  181. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
  182. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
  183. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  184. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
  185. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  186. package/dist/heart/daemon/sanctuary-authority-epoch.js +256 -0
  187. package/dist/heart/daemon/sanctuary-authority-installation.js +140 -0
  188. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  189. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +819 -0
  190. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  191. package/dist/heart/daemon/sanctuary-bundle-migration.js +729 -0
  192. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  193. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +494 -0
  194. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  195. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  196. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  197. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  198. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  199. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  200. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  201. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +445 -0
  202. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  203. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +630 -0
  204. package/dist/heart/daemon/sense-manager.js +699 -48
  205. package/dist/heart/daemon/session-id-resolver.js +131 -0
  206. package/dist/heart/daemon/skill-management-installer.js +1 -1
  207. package/dist/heart/daemon/socket-client.js +180 -12
  208. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  209. package/dist/heart/daemon/startup-tui.js +339 -0
  210. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  211. package/dist/heart/daemon/task-scheduler.js +117 -39
  212. package/dist/heart/daemon/terminal-ui.js +499 -0
  213. package/dist/heart/daemon/thoughts.js +138 -54
  214. package/dist/heart/daemon/up-progress.js +366 -0
  215. package/dist/heart/daemon/vault-items.js +56 -0
  216. package/dist/heart/delegation.js +1 -4
  217. package/dist/heart/external-events/router.js +1430 -0
  218. package/dist/heart/frontend-approval-runtime.js +506 -0
  219. package/dist/heart/frontend-journal.js +215 -0
  220. package/dist/heart/frontend-session-service.js +237 -0
  221. package/dist/heart/frontend-socket-client.js +164 -0
  222. package/dist/heart/frontend-socket.js +400 -0
  223. package/dist/heart/habits/habit-cancel.js +810 -0
  224. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  225. package/dist/heart/habits/habit-migration.js +194 -0
  226. package/dist/heart/habits/habit-parser.js +278 -0
  227. package/dist/heart/habits/habit-runtime-state.js +93 -0
  228. package/dist/heart/habits/habit-scheduler.js +653 -0
  229. package/dist/heart/habits/habit-session-summary.js +318 -0
  230. package/dist/heart/habits/habit-session.js +636 -0
  231. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  232. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  233. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  234. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  235. package/dist/heart/identity.js +196 -59
  236. package/dist/heart/kept-notes.js +289 -0
  237. package/dist/heart/kicks.js +1 -1
  238. package/dist/heart/machine-identity.js +161 -0
  239. package/dist/heart/mail-import-discovery.js +356 -0
  240. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  241. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  242. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  243. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  244. package/dist/heart/mailbox/mailbox-http-transport.js +129 -0
  245. package/dist/heart/mailbox/mailbox-http.js +99 -0
  246. package/dist/heart/mailbox/mailbox-read.js +39 -0
  247. package/dist/heart/mailbox/mailbox-types.js +27 -0
  248. package/dist/heart/mailbox/mailbox-view.js +197 -0
  249. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  250. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  251. package/dist/heart/mailbox/readers/mail.js +375 -0
  252. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  253. package/dist/heart/mailbox/readers/sessions.js +231 -0
  254. package/dist/heart/mailbox/readers/shared.js +111 -0
  255. package/dist/heart/mcp/mcp-server.js +696 -0
  256. package/dist/heart/migrate-config.js +100 -0
  257. package/dist/heart/model-capabilities.js +11 -0
  258. package/dist/heart/orientation-frame.js +345 -0
  259. package/dist/heart/platform.js +81 -0
  260. package/dist/heart/primitives.js +1 -1
  261. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  262. package/dist/heart/private-runtime/index.js +18 -0
  263. package/dist/heart/private-runtime/ledger.js +221 -0
  264. package/dist/heart/private-runtime/policy.js +252 -0
  265. package/dist/heart/private-runtime/types.js +2 -0
  266. package/dist/heart/progress-story.js +1 -1
  267. package/dist/heart/provider-attempt.js +137 -0
  268. package/dist/heart/provider-binding-resolver.js +273 -0
  269. package/dist/heart/provider-credentials.js +449 -0
  270. package/dist/heart/provider-failover.js +311 -0
  271. package/dist/heart/provider-models.js +96 -0
  272. package/dist/heart/provider-ping.js +265 -0
  273. package/dist/heart/provider-readiness-cache.js +119 -0
  274. package/dist/heart/provider-visibility.js +188 -0
  275. package/dist/heart/providers/anthropic-token.js +131 -0
  276. package/dist/heart/providers/anthropic.js +173 -60
  277. package/dist/heart/providers/azure.js +23 -11
  278. package/dist/heart/providers/error-classification.js +127 -0
  279. package/dist/heart/providers/github-copilot.js +34 -38
  280. package/dist/heart/providers/minimax-vlm.js +189 -0
  281. package/dist/heart/providers/minimax.js +26 -8
  282. package/dist/heart/providers/openai-codex-token.js +349 -0
  283. package/dist/heart/providers/openai-codex.js +55 -40
  284. package/dist/heart/providers/openai-compatible.js +177 -0
  285. package/dist/heart/run-ledger.js +247 -0
  286. package/dist/heart/runtime-capability-check.js +170 -0
  287. package/dist/heart/runtime-credentials.js +607 -0
  288. package/dist/heart/runtime-cwd.js +87 -0
  289. package/dist/heart/sense-truth.js +22 -4
  290. package/dist/heart/session-activity.js +92 -24
  291. package/dist/heart/session-events.js +1504 -0
  292. package/dist/heart/session-playback-cli-main.js +5 -0
  293. package/dist/heart/session-playback-cli.js +36 -0
  294. package/dist/heart/session-playback.js +231 -0
  295. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  296. package/dist/heart/session-redaction-repair.js +552 -0
  297. package/dist/heart/session-stats-cli-main.js +5 -0
  298. package/dist/heart/session-stats.js +183 -0
  299. package/dist/heart/session-transcript.js +133 -0
  300. package/dist/heart/start-of-turn-packet.js +372 -0
  301. package/dist/heart/steward-policy.js +618 -0
  302. package/dist/heart/streaming.js +604 -207
  303. package/dist/heart/structured-output.js +196 -0
  304. package/dist/heart/sync-classification.js +176 -0
  305. package/dist/heart/sync.js +449 -0
  306. package/dist/heart/target-resolution.js +11 -7
  307. package/dist/heart/tempo.js +93 -0
  308. package/dist/heart/temporal-view.js +41 -0
  309. package/dist/heart/timeouts.js +101 -0
  310. package/dist/heart/tool-activity-callbacks.js +59 -0
  311. package/dist/heart/tool-approval.js +382 -0
  312. package/dist/heart/tool-description.js +155 -0
  313. package/dist/heart/tool-friction.js +55 -0
  314. package/dist/heart/tool-loop.js +200 -0
  315. package/dist/heart/turn-context.js +482 -0
  316. package/dist/heart/turn-execution-lease.js +30 -0
  317. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  318. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  319. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  320. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  321. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  322. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  323. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  324. package/dist/heart/versioning/update-hooks.js +154 -0
  325. package/dist/heart/versioning/version-intent.js +114 -0
  326. package/dist/heart/work-card.js +380 -0
  327. package/dist/mailbox-ui/assets/index-Cyv4mw3Y.js +1 -0
  328. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  329. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  330. package/dist/mailbox-ui/index.html +16 -0
  331. package/dist/mailroom/attention.js +167 -0
  332. package/dist/mailroom/autonomy.js +209 -0
  333. package/dist/mailroom/blob-store.js +889 -0
  334. package/dist/mailroom/body-cache.js +61 -0
  335. package/dist/mailroom/cache-sync-cli.js +58 -0
  336. package/dist/mailroom/core.js +803 -0
  337. package/dist/mailroom/entry.js +160 -0
  338. package/dist/mailroom/file-store.js +568 -0
  339. package/dist/mailroom/hosted-cache-sync.js +384 -0
  340. package/dist/mailroom/mbox-import.js +393 -0
  341. package/dist/mailroom/migration.js +164 -0
  342. package/dist/mailroom/outbound.js +380 -0
  343. package/dist/mailroom/policy.js +263 -0
  344. package/dist/mailroom/reader.js +292 -0
  345. package/dist/mailroom/search-cache.js +513 -0
  346. package/dist/mailroom/search-relevance.js +319 -0
  347. package/dist/mailroom/smtp-ingress.js +176 -0
  348. package/dist/mailroom/source-state.js +176 -0
  349. package/dist/mailroom/thread.js +109 -0
  350. package/dist/mailroom/travel-extract.js +89 -0
  351. package/dist/mind/bundle-manifest.js +24 -2
  352. package/dist/mind/context.js +309 -111
  353. package/dist/mind/desk-section.js +362 -0
  354. package/dist/mind/diary-integrity.js +60 -0
  355. package/dist/mind/{memory.js → diary.js} +68 -77
  356. package/dist/mind/embedding-provider.js +60 -0
  357. package/dist/mind/file-state.js +179 -0
  358. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  359. package/dist/mind/obligation-steering.js +199 -3
  360. package/dist/mind/pending.js +36 -10
  361. package/dist/mind/prompt-budget.js +479 -0
  362. package/dist/mind/prompt-refresh.js +3 -2
  363. package/dist/mind/prompt.js +1050 -189
  364. package/dist/mind/provenance-trust.js +26 -0
  365. package/dist/mind/record-paths.js +312 -0
  366. package/dist/mind/scrutiny.js +173 -0
  367. package/dist/mind/session-transaction.js +564 -0
  368. package/dist/nerves/cli-logging.js +7 -1
  369. package/dist/nerves/coverage/audit-rules.js +15 -6
  370. package/dist/nerves/coverage/audit.js +28 -2
  371. package/dist/nerves/coverage/cli.js +1 -1
  372. package/dist/nerves/coverage/contract.js +5 -5
  373. package/dist/nerves/coverage/file-completeness.js +139 -5
  374. package/dist/nerves/coverage/run-artifacts.js +55 -35
  375. package/dist/nerves/coverage/source-scanner.js +4 -4
  376. package/dist/nerves/event-buffer.js +111 -0
  377. package/dist/nerves/index.js +293 -9
  378. package/dist/nerves/observation.js +20 -0
  379. package/dist/nerves/redact.js +79 -0
  380. package/dist/nerves/review/cli-main.js +5 -0
  381. package/dist/nerves/review/cli.js +156 -0
  382. package/dist/nerves/review/core.js +159 -0
  383. package/dist/nerves/runtime.js +17 -1
  384. package/dist/repertoire/ado-client.js +15 -56
  385. package/dist/repertoire/ado-semantic.js +16 -10
  386. package/dist/repertoire/api-client.js +97 -0
  387. package/dist/repertoire/bitwarden-store.js +1045 -0
  388. package/dist/repertoire/bundle-templates.js +71 -0
  389. package/dist/repertoire/bw-installer.js +180 -0
  390. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  391. package/dist/repertoire/coding/context-pack.js +331 -0
  392. package/dist/repertoire/coding/feedback.js +174 -32
  393. package/dist/repertoire/coding/index.js +15 -3
  394. package/dist/repertoire/coding/manager.js +159 -10
  395. package/dist/repertoire/coding/spawner.js +58 -11
  396. package/dist/repertoire/coding/tools.js +221 -15
  397. package/dist/repertoire/coding/workbench-client.js +272 -0
  398. package/dist/repertoire/coding/workbench-manager.js +346 -0
  399. package/dist/repertoire/commerce-errors.js +109 -0
  400. package/dist/repertoire/commerce-self-test.js +156 -0
  401. package/dist/repertoire/credential-access.js +178 -0
  402. package/dist/repertoire/desk/classifier.js +362 -0
  403. package/dist/repertoire/duffel-client.js +185 -0
  404. package/dist/repertoire/github-client.js +14 -55
  405. package/dist/repertoire/graph-client.js +11 -52
  406. package/dist/repertoire/guardrails.js +811 -18
  407. package/dist/repertoire/mcp-client.js +44 -3
  408. package/dist/repertoire/mcp-manager.js +427 -139
  409. package/dist/repertoire/mcp-tools.js +124 -0
  410. package/dist/repertoire/plugin-mcp.js +175 -0
  411. package/dist/repertoire/plugins.js +253 -0
  412. package/dist/repertoire/relationship-authorization.js +322 -0
  413. package/dist/repertoire/shell-sessions.js +134 -0
  414. package/dist/repertoire/skills.js +48 -4
  415. package/dist/repertoire/stripe-client.js +131 -0
  416. package/dist/repertoire/tool-arguments.js +170 -0
  417. package/dist/repertoire/tool-results.js +29 -0
  418. package/dist/repertoire/tools-a2a.js +699 -0
  419. package/dist/repertoire/tools-attachments.js +322 -0
  420. package/dist/repertoire/tools-awaiting.js +575 -0
  421. package/dist/repertoire/tools-base.js +77 -1138
  422. package/dist/repertoire/tools-bluebubbles.js +2 -0
  423. package/dist/repertoire/tools-bridge.js +144 -0
  424. package/dist/repertoire/tools-bundle.js +993 -0
  425. package/dist/repertoire/tools-commerce.js +253 -0
  426. package/dist/repertoire/tools-config.js +186 -0
  427. package/dist/repertoire/tools-continuity.js +575 -0
  428. package/dist/repertoire/tools-credential.js +383 -0
  429. package/dist/repertoire/tools-evolution.js +527 -0
  430. package/dist/repertoire/tools-files.js +344 -0
  431. package/dist/repertoire/tools-flight.js +290 -0
  432. package/dist/repertoire/tools-flow.js +119 -0
  433. package/dist/repertoire/tools-github.js +3 -8
  434. package/dist/repertoire/tools-habits.js +103 -0
  435. package/dist/repertoire/tools-mail.js +1828 -0
  436. package/dist/repertoire/tools-notes.js +485 -0
  437. package/dist/repertoire/tools-obligations.js +182 -0
  438. package/dist/repertoire/tools-orientation.js +31 -0
  439. package/dist/repertoire/tools-record.js +482 -0
  440. package/dist/repertoire/tools-rsvp.js +139 -0
  441. package/dist/repertoire/tools-runtime.js +150 -0
  442. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  443. package/dist/repertoire/tools-session.js +1133 -0
  444. package/dist/repertoire/tools-shell.js +149 -0
  445. package/dist/repertoire/tools-steward-policy.js +119 -0
  446. package/dist/repertoire/tools-stripe.js +224 -0
  447. package/dist/repertoire/tools-surface.js +369 -0
  448. package/dist/repertoire/tools-teams.js +12 -39
  449. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  450. package/dist/repertoire/tools-travel.js +125 -0
  451. package/dist/repertoire/tools-trip.js +982 -0
  452. package/dist/repertoire/tools-unraid.js +531 -0
  453. package/dist/repertoire/tools-user-profile.js +146 -0
  454. package/dist/repertoire/tools-vault.js +40 -0
  455. package/dist/repertoire/tools-voice.js +145 -0
  456. package/dist/repertoire/tools.js +494 -148
  457. package/dist/repertoire/travel-api-client.js +360 -0
  458. package/dist/repertoire/unraid-client.js +155 -0
  459. package/dist/repertoire/unraid-restart.js +339 -0
  460. package/dist/repertoire/user-profile.js +131 -0
  461. package/dist/repertoire/vault-setup.js +246 -0
  462. package/dist/repertoire/vault-unlock.js +628 -0
  463. package/dist/rsvp/aisleplanner-client.js +354 -0
  464. package/dist/rsvp/cli.js +926 -0
  465. package/dist/rsvp/config.js +327 -0
  466. package/dist/rsvp/cutover.js +433 -0
  467. package/dist/rsvp/diagnostics.js +232 -0
  468. package/dist/rsvp/diff-renderer.js +176 -0
  469. package/dist/rsvp/habit-policy.js +110 -0
  470. package/dist/rsvp/habit-stage.js +123 -0
  471. package/dist/rsvp/incident-bundle.js +97 -0
  472. package/dist/rsvp/migration.js +204 -0
  473. package/dist/rsvp/native-habit-runner.js +630 -0
  474. package/dist/rsvp/outbound-state.js +628 -0
  475. package/dist/rsvp/query.js +118 -0
  476. package/dist/rsvp/replay.js +233 -0
  477. package/dist/rsvp/snapshot.js +232 -0
  478. package/dist/rsvp/spend-ledger.js +175 -0
  479. package/dist/scripts/claude-code-hook.js +41 -0
  480. package/dist/scripts/claude-code-stop-hook.js +47 -0
  481. package/dist/senses/a2a-entry.js +115 -0
  482. package/dist/senses/acp-server.js +386 -0
  483. package/dist/senses/attention-queue.js +186 -0
  484. package/dist/senses/await-turn-message.js +58 -0
  485. package/dist/senses/bluebubbles/active-turns.js +216 -0
  486. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  487. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  488. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
  489. package/dist/senses/bluebubbles/context-packet.js +207 -0
  490. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  491. package/dist/senses/bluebubbles/entry.js +90 -0
  492. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  493. package/dist/senses/bluebubbles/index.js +3841 -0
  494. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  495. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  496. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  497. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  498. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  499. package/dist/senses/bluebubbles/processed-log.js +133 -0
  500. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  501. package/dist/senses/bluebubbles/replay.js +284 -0
  502. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  503. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  504. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  505. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  506. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  507. package/dist/senses/cli/bracketed-paste.js +82 -0
  508. package/dist/senses/cli/image-paste.js +287 -0
  509. package/dist/senses/cli/image-ref-navigation.js +75 -0
  510. package/dist/senses/cli/ink-app.js +156 -0
  511. package/dist/senses/cli/inline-diff.js +64 -0
  512. package/dist/senses/cli/input-keys.js +174 -0
  513. package/dist/senses/cli/kill-ring.js +86 -0
  514. package/dist/senses/cli/message-list.js +51 -0
  515. package/dist/senses/cli/ouro-tui.js +607 -0
  516. package/dist/senses/cli/spinner-imperative.js +135 -0
  517. package/dist/senses/cli/spinner.js +101 -0
  518. package/dist/senses/cli/status-line.js +60 -0
  519. package/dist/senses/cli/streaming-markdown.js +526 -0
  520. package/dist/senses/cli/tool-display.js +85 -0
  521. package/dist/senses/cli/tool-render.js +85 -0
  522. package/dist/senses/cli/tui-store.js +241 -0
  523. package/dist/senses/cli/virtual-list.js +35 -0
  524. package/dist/senses/cli-entry.js +60 -8
  525. package/dist/senses/cli.js +604 -320
  526. package/dist/senses/commands.js +66 -3
  527. package/dist/senses/context-packet-ledger.js +371 -0
  528. package/dist/senses/context-packets.js +154 -0
  529. package/dist/senses/habit-lifecycle-guard.js +24 -0
  530. package/dist/senses/habit-turn-message.js +160 -0
  531. package/dist/senses/ingress-evidence.js +2 -0
  532. package/dist/senses/mail-entry.js +66 -0
  533. package/dist/senses/mail.js +524 -0
  534. package/dist/senses/pipeline.js +1115 -204
  535. package/dist/senses/private-runtime-worker.js +859 -0
  536. package/dist/senses/private-runtime.js +1517 -0
  537. package/dist/senses/proactive-content-guard.js +51 -0
  538. package/dist/senses/root-host-approval-port.js +345 -0
  539. package/dist/senses/root-host-approval-runtime.js +393 -0
  540. package/dist/senses/sanctuary-authority-resident.js +102 -0
  541. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  542. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  543. package/dist/senses/sanctuary-grounding.js +118 -0
  544. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  545. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  546. package/dist/senses/sanctuary-health-runner.js +100 -0
  547. package/dist/senses/sanctuary-health.js +408 -0
  548. package/dist/senses/sanctuary-install-state-contract.js +126 -0
  549. package/dist/senses/sanctuary-interactive-control.js +410 -0
  550. package/dist/senses/sanctuary-media-catalog-contract.js +297 -0
  551. package/dist/senses/sanctuary-media-optimization.js +514 -0
  552. package/dist/senses/sanctuary-runtime.js +340 -0
  553. package/dist/senses/sanctuary-sab.js +85 -0
  554. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  555. package/dist/senses/shared-turn.js +772 -0
  556. package/dist/senses/surface-tool.js +109 -0
  557. package/dist/senses/teams-entry.js +60 -8
  558. package/dist/senses/teams.js +519 -218
  559. package/dist/senses/telegram-admission.js +718 -0
  560. package/dist/senses/telegram-approval-runtime.js +793 -0
  561. package/dist/senses/telegram-attachments.js +186 -0
  562. package/dist/senses/telegram-audit-ledger.js +220 -0
  563. package/dist/senses/telegram-authority-transport.js +231 -0
  564. package/dist/senses/telegram-client.js +1749 -0
  565. package/dist/senses/telegram-effect-adapter.js +896 -0
  566. package/dist/senses/telegram-entry.js +83 -0
  567. package/dist/senses/telegram.js +2324 -0
  568. package/dist/senses/trust-gate.js +104 -9
  569. package/dist/senses/voice/audio-playback.js +237 -0
  570. package/dist/senses/voice/audio-routing.js +119 -0
  571. package/dist/senses/voice/elevenlabs.js +202 -0
  572. package/dist/senses/voice/floor-control.js +431 -0
  573. package/dist/senses/voice/floor-controller.js +115 -0
  574. package/dist/senses/voice/golden-path.js +116 -0
  575. package/dist/senses/voice/index.js +29 -0
  576. package/dist/senses/voice/meeting.js +113 -0
  577. package/dist/senses/voice/outbound.js +190 -0
  578. package/dist/senses/voice/phone.js +33 -0
  579. package/dist/senses/voice/playback.js +139 -0
  580. package/dist/senses/voice/realtime-eval.js +496 -0
  581. package/dist/senses/voice/realtime-trace.js +531 -0
  582. package/dist/senses/voice/transcript.js +70 -0
  583. package/dist/senses/voice/turn.js +191 -0
  584. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  585. package/dist/senses/voice/twilio-phone.js +5031 -0
  586. package/dist/senses/voice/types.js +2 -0
  587. package/dist/senses/voice/whisper.js +161 -0
  588. package/dist/senses/voice-entry.js +81 -0
  589. package/dist/senses/voice-realtime-eval-command.js +99 -0
  590. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  591. package/dist/senses/voice-twilio-entry.js +87 -0
  592. package/dist/trips/core.js +138 -0
  593. package/dist/trips/store.js +265 -0
  594. package/dist/util/frontmatter.js +69 -0
  595. package/npm-shrinkwrap.json +8138 -0
  596. package/package.json +72 -13
  597. package/skills/agent-commerce.md +113 -0
  598. package/skills/browser-navigation.md +117 -0
  599. package/skills/commerce-setup-guide.md +116 -0
  600. package/skills/commerce-setup.md +84 -0
  601. package/skills/configure-dev-tools.md +99 -0
  602. package/skills/travel-planning.md +138 -0
  603. package/dist/heart/daemon/auth-flow.js +0 -430
  604. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  605. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  606. package/dist/heart/daemon/update-hooks.js +0 -138
  607. package/dist/heart/obligations.js +0 -191
  608. package/dist/heart/safe-workspace.js +0 -228
  609. package/dist/heart/session-recall.js +0 -116
  610. package/dist/mind/friends/channel.js +0 -84
  611. package/dist/mind/friends/group-context.js +0 -144
  612. package/dist/mind/friends/resolver.js +0 -84
  613. package/dist/mind/friends/store-file.js +0 -190
  614. package/dist/mind/friends/store.js +0 -4
  615. package/dist/mind/friends/tokens.js +0 -26
  616. package/dist/mind/friends/trust-explanation.js +0 -74
  617. package/dist/mind/friends/types.js +0 -29
  618. package/dist/repertoire/tasks/board.js +0 -134
  619. package/dist/repertoire/tasks/index.js +0 -224
  620. package/dist/repertoire/tasks/lifecycle.js +0 -80
  621. package/dist/repertoire/tasks/middleware.js +0 -65
  622. package/dist/repertoire/tasks/parser.js +0 -173
  623. package/dist/repertoire/tasks/scanner.js +0 -132
  624. package/dist/repertoire/tasks/transitions.js +0 -144
  625. package/dist/senses/bluebubbles-entry.js +0 -13
  626. package/dist/senses/bluebubbles.js +0 -1181
  627. package/dist/senses/debug-activity.js +0 -154
  628. package/dist/senses/inner-dialog-worker.js +0 -90
  629. package/dist/senses/inner-dialog.js +0 -525
  630. package/subagents/README.md +0 -7
  631. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  632. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  633. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  634. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  635. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  636. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  637. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  638. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  639. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  640. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  641. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  642. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  643. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  644. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  645. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  646. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  647. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,604 @@
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.startA2AServer = startA2AServer;
37
+ const http = __importStar(require("node:http"));
38
+ const node_crypto_1 = require("node:crypto");
39
+ const a2a_client_1 = require("@ouro.bot/friends/a2a-client");
40
+ const friends_1 = require("@ouro.bot/friends");
41
+ const identity_1 = require("../heart/identity");
42
+ const runtime_1 = require("../nerves/runtime");
43
+ const shared_turn_1 = require("../senses/shared-turn");
44
+ const card_1 = require("./card");
45
+ const config_1 = require("./config");
46
+ const pin_store_1 = require("./pin-store");
47
+ const seen_ledger_1 = require("./seen-ledger");
48
+ const did_resolution_1 = require("./did-resolution");
49
+ const inbound_share_1 = require("./inbound-share");
50
+ const mission_result_wire_1 = require("./mission-result-wire");
51
+ const delegation_stores_1 = require("./delegation-stores");
52
+ const task_store_1 = require("./task-store");
53
+ const MAX_A2A_REQUEST_BYTES = 128 * 1024;
54
+ const MAX_A2A_MESSAGE_TEXT_CHARS = 16_000;
55
+ class A2ARequestError extends Error {
56
+ status;
57
+ code;
58
+ constructor(status, code, message) {
59
+ super(message);
60
+ this.status = status;
61
+ this.code = code;
62
+ }
63
+ }
64
+ function jsonResponse(id, result) {
65
+ return { jsonrpc: "2.0", id: id ?? null, result };
66
+ }
67
+ function errorResponse(id, code, message) {
68
+ return { jsonrpc: "2.0", id: id ?? null, error: { code, message } };
69
+ }
70
+ async function readBody(req) {
71
+ const chunks = [];
72
+ let total = 0;
73
+ for await (const chunk of req) {
74
+ /* v8 ignore next -- Node HTTP request bodies arrive as Buffers in this runtime; string chunks are defensive stream compatibility @preserve */
75
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
76
+ total += buffer.byteLength;
77
+ if (total > MAX_A2A_REQUEST_BYTES) {
78
+ throw new A2ARequestError(413, -32000, `A2A request body exceeds ${MAX_A2A_REQUEST_BYTES} bytes`);
79
+ }
80
+ chunks.push(buffer);
81
+ }
82
+ return Buffer.concat(chunks).toString("utf-8");
83
+ }
84
+ function writeJson(res, status, payload) {
85
+ const body = `${JSON.stringify(payload, null, 2)}\n`;
86
+ res.writeHead(status, {
87
+ "content-type": "application/json; charset=utf-8",
88
+ "content-length": Buffer.byteLength(body),
89
+ });
90
+ res.end(body);
91
+ }
92
+ function textFromMessage(message) {
93
+ if (!message || typeof message !== "object")
94
+ return "";
95
+ const parts = message.parts;
96
+ if (!Array.isArray(parts))
97
+ return "";
98
+ return parts
99
+ .map((part) => {
100
+ if (!part || typeof part !== "object")
101
+ return "";
102
+ const text = part.text;
103
+ return typeof text === "string" ? text : "";
104
+ })
105
+ .filter(Boolean)
106
+ .join("\n")
107
+ .trim();
108
+ }
109
+ function messageFromParams(params) {
110
+ if (!params || typeof params !== "object")
111
+ return null;
112
+ const message = params.message;
113
+ if (!message || typeof message !== "object")
114
+ return null;
115
+ return message;
116
+ }
117
+ function metadataRecord(value) {
118
+ /* v8 ignore next -- protocol callers pass JSON-RPC param/message objects; this guard keeps malformed direct input inert @preserve */
119
+ if (!value || typeof value !== "object")
120
+ return undefined;
121
+ /* v8 ignore next -- JSON-RPC params/messages are objects in supported calls; array guard protects malformed direct input @preserve */
122
+ if (Array.isArray(value))
123
+ return undefined;
124
+ const metadata = value.metadata;
125
+ return metadata && typeof metadata === "object" && !Array.isArray(metadata) ? metadata : undefined;
126
+ }
127
+ function metadataStringFromRecord(metadata, key) {
128
+ const value = metadata?.[key];
129
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
130
+ }
131
+ function metadataString(message, key) {
132
+ return metadataStringFromRecord(metadataRecord(message), key);
133
+ }
134
+ function headerString(req, key) {
135
+ const value = req.headers[key];
136
+ /* v8 ignore next -- Node lower-cases singular request headers here; array values are defensive compatibility @preserve */
137
+ if (Array.isArray(value))
138
+ return value[0];
139
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
140
+ }
141
+ /* v8 ignore start -- default runner crosses into the full live agent pipeline; shared-turn covers that pipeline and server tests inject a deterministic runner @preserve */
142
+ function storageKeyFor(peerExternalId) {
143
+ return `a2a-${(0, node_crypto_1.createHash)("sha256").update(peerExternalId).digest("hex").slice(0, 24)}`;
144
+ }
145
+ async function defaultTurnRunner(input) {
146
+ const result = await (0, shared_turn_1.runSenseTurn)({
147
+ agentName: input.agentName,
148
+ channel: "a2a",
149
+ friendId: storageKeyFor(input.peerAgentId),
150
+ sessionKey: input.sessionKey,
151
+ userMessage: input.message,
152
+ latencyMode: "standard",
153
+ identity: {
154
+ provider: "a2a-agent",
155
+ externalId: input.peerAgentId,
156
+ displayName: input.peerName,
157
+ },
158
+ });
159
+ return { response: result.response };
160
+ }
161
+ /* v8 ignore stop */
162
+ function accessTokenHash(accessToken) {
163
+ return (0, node_crypto_1.createHash)("sha256").update(accessToken).digest("hex");
164
+ }
165
+ function accessTokenScope(accessToken) {
166
+ return `a2a-task-token:${accessTokenHash(accessToken)}`;
167
+ }
168
+ function untrustedTurnPeerExternalId() {
169
+ return "unauthenticated-a2a-peer";
170
+ }
171
+ /** Whether an inbound message carries a friends sealed DataPart (`kind:"data"`). */
172
+ function messageHasDataPart(message) {
173
+ /* v8 ignore next -- defensive: callers pass a parsed inbound whose `parts` is always an array; guards malformed direct input @preserve */
174
+ if (!Array.isArray(message.parts))
175
+ return false;
176
+ return message.parts.some((part) => part && part.kind === "data");
177
+ }
178
+ /** Map a friends `receiveShare` rejection reason → a JSON-RPC error code.
179
+ * Malformed-shape reasons map to invalid-params (-32602); auth/trust/replay
180
+ * rejections map to a dedicated A2A "rejected" code (-32003). */
181
+ function rejectionErrorCode(reason) {
182
+ if (reason === "malformed_message" || reason === "malformed_plaintext")
183
+ return -32602;
184
+ return -32003;
185
+ }
186
+ function senderHintFromMessage(req, inbound) {
187
+ const idHint = metadataString(inbound, "senderAgentId")
188
+ ?? metadataString(inbound, "senderCardUrl")
189
+ ?? metadataString(inbound, "agentId")
190
+ ?? metadataString(inbound, "cardUrl")
191
+ ?? headerString(req, "x-a2a-agent-id");
192
+ const name = metadataString(inbound, "senderName")
193
+ ?? metadataString(inbound, "agentName")
194
+ ?? headerString(req, "x-a2a-agent-name")
195
+ ?? idHint
196
+ ?? "Unauthenticated A2A peer";
197
+ return { idHint, name };
198
+ }
199
+ function isTerminalTaskState(state) {
200
+ return state === "TASK_STATE_COMPLETED"
201
+ || state === "TASK_STATE_FAILED"
202
+ || state === "TASK_STATE_CANCELED"
203
+ || state === "TASK_STATE_REJECTED"
204
+ || state === "completed"
205
+ || state === "failed"
206
+ || state === "canceled"
207
+ || state === "rejected";
208
+ }
209
+ function accessTokenFromParams(params) {
210
+ /* v8 ignore next -- GetTask/CancelTask validate object params before token extraction; this keeps direct helper use defensive @preserve */
211
+ if (!params || typeof params !== "object" || Array.isArray(params))
212
+ return undefined;
213
+ const record = params;
214
+ const direct = record.accessToken ?? record.access_token;
215
+ if (typeof direct === "string" && direct.trim())
216
+ return direct.trim();
217
+ return metadataStringFromRecord(metadataRecord(params), "accessToken");
218
+ }
219
+ function taskA2AMetadata(task) {
220
+ const a2a = task.metadata?.a2a;
221
+ /* v8 ignore next -- server-created tasks always carry object auth metadata; fallback protects legacy/corrupt task files @preserve */
222
+ if (!a2a || typeof a2a !== "object" || Array.isArray(a2a))
223
+ return {};
224
+ return a2a;
225
+ }
226
+ function publicMessage(message, style) {
227
+ const parts = message.parts
228
+ .filter((part) => part && typeof part === "object" && typeof part.text === "string")
229
+ .map((part) => style === "legacy" ? { ...part, kind: part.kind ?? "text" } : part);
230
+ if (style === "latest")
231
+ return { ...message, kind: "message", parts };
232
+ return {
233
+ ...message,
234
+ kind: "message",
235
+ role: message.role === "ROLE_AGENT" ? "agent" : message.role === "ROLE_USER" ? "user" : message.role,
236
+ parts,
237
+ };
238
+ }
239
+ function legacyTaskState(state) {
240
+ if (state === "TASK_STATE_SUBMITTED")
241
+ return "submitted";
242
+ if (state === "TASK_STATE_WORKING")
243
+ return "working";
244
+ if (state === "TASK_STATE_COMPLETED")
245
+ return "completed";
246
+ if (state === "TASK_STATE_FAILED")
247
+ return "failed";
248
+ if (state === "TASK_STATE_CANCELED")
249
+ return "canceled";
250
+ if (state === "TASK_STATE_REJECTED")
251
+ return "rejected";
252
+ if (state === "TASK_STATE_AUTH_REQUIRED")
253
+ return "auth-required";
254
+ if (state === "TASK_STATE_INPUT_REQUIRED")
255
+ return "input-required";
256
+ return state;
257
+ }
258
+ function publicTask(task, accessToken, style, includeAccessToken) {
259
+ const a2a = taskA2AMetadata(task);
260
+ const { accessTokenHash: _accessTokenHash, taskScopeHash: _taskScopeHash, ...safeA2A } = a2a;
261
+ const statusMessage = task.status.message ? publicMessage(task.status.message, style) : undefined;
262
+ return {
263
+ ...task,
264
+ kind: task.kind ?? "task",
265
+ status: {
266
+ ...task.status,
267
+ state: style === "legacy" ? legacyTaskState(task.status.state) : task.status.state,
268
+ ...(statusMessage ? { message: statusMessage } : {}),
269
+ },
270
+ history: task.history.map((message) => publicMessage(message, style)),
271
+ ...(task.artifacts ? {
272
+ artifacts: task.artifacts.map((artifact) => ({
273
+ ...artifact,
274
+ parts: style === "legacy"
275
+ ? artifact.parts.map((part) => ({ ...part, kind: part.kind ?? "text" }))
276
+ : artifact.parts,
277
+ })),
278
+ } : {}),
279
+ metadata: {
280
+ ...task.metadata,
281
+ a2a: {
282
+ ...safeA2A,
283
+ ...(includeAccessToken ? { accessToken } : {}),
284
+ },
285
+ },
286
+ };
287
+ }
288
+ function taskAuthorized(task, accessToken) {
289
+ const a2a = taskA2AMetadata(task);
290
+ return a2a.accessTokenHash === accessTokenHash(accessToken);
291
+ }
292
+ function taskFor(input) {
293
+ const now = new Date().toISOString();
294
+ const history = [...(input.previousTask?.history ?? []), input.inbound];
295
+ const previousA2A = input.previousTask ? taskA2AMetadata(input.previousTask) : {};
296
+ const responseMessage = input.response
297
+ ? {
298
+ kind: "message",
299
+ role: "ROLE_AGENT",
300
+ taskId: input.taskId,
301
+ contextId: input.contextId,
302
+ messageId: (0, node_crypto_1.randomUUID)(),
303
+ parts: [{ text: input.response }],
304
+ }
305
+ : undefined;
306
+ if (responseMessage)
307
+ history.push(responseMessage);
308
+ return {
309
+ kind: "task",
310
+ id: input.taskId,
311
+ contextId: input.contextId,
312
+ status: {
313
+ state: input.state,
314
+ timestamp: now,
315
+ ...(responseMessage ? { message: responseMessage } : {}),
316
+ },
317
+ history,
318
+ metadata: {
319
+ ...input.previousTask?.metadata,
320
+ a2a: {
321
+ ...previousA2A,
322
+ accessTokenHash: accessTokenHash(input.accessToken),
323
+ ...(input.clientTaskId ? { clientTaskId: input.clientTaskId } : {}),
324
+ },
325
+ },
326
+ ...(responseMessage ? {
327
+ artifacts: [{
328
+ artifactId: `artifact-${input.taskId}`,
329
+ name: "response",
330
+ parts: responseMessage.parts,
331
+ }],
332
+ } : {}),
333
+ };
334
+ }
335
+ async function startA2AServer(options) {
336
+ const host = options.host ?? config_1.A2A_DEFAULT_HOST;
337
+ /* v8 ignore next -- daemon-managed A2A owns the default-port path; protocol tests bind port 0 to avoid collisions @preserve */
338
+ const port = options.port ?? (0, config_1.defaultA2APort)(options.agentName);
339
+ const a2aPath = (0, config_1.normalizeA2APath)(options.path);
340
+ /* v8 ignore next -- foreground CLI/default daemon paths own the ambient agent-root fallback; protocol tests inject an isolated root @preserve */
341
+ const agentRoot = options.agentRoot ?? (0, identity_1.getAgentRoot)(options.agentName);
342
+ const taskStore = new task_store_1.FileA2ATaskStore(agentRoot);
343
+ /* v8 ignore next -- default runner crosses into the full live agent pipeline; shared-turn covers that pipeline and server tests inject a deterministic runner @preserve */
344
+ const turnRunner = options.turnRunner ?? defaultTurnRunner;
345
+ // The inbound friends-DataPart bridge is available only when the agent has a
346
+ // cryptographic identity (its did:key + X25519 unseal keys). Build its durable
347
+ // stores once at start; without an identity, inbound stays on the text path.
348
+ let inboundShareDeps;
349
+ if (options.identity) {
350
+ const friendsDir = `${agentRoot}/friends`;
351
+ inboundShareDeps = {
352
+ sodium: await (0, a2a_client_1.ready)(),
353
+ store: new friends_1.FileFriendStore(friendsDir),
354
+ // The SAME canonical mission store the Slice-4 delegation tools use, so an
355
+ // inbound `importCoordination` write lands where the read/prepare surface reads.
356
+ missionStore: (0, delegation_stores_1.delegationStoresFor)(agentRoot).missionStore,
357
+ pinStore: new pin_store_1.FileA2APinStore(agentRoot),
358
+ seen: new seen_ledger_1.FileA2ASeenLedger(agentRoot),
359
+ didResolution: (0, did_resolution_1.makeDidResolution)({ sodium: await (0, a2a_client_1.ready)() }),
360
+ identity: options.identity,
361
+ };
362
+ }
363
+ let publicBaseUrl = options.baseUrl;
364
+ const server = http.createServer(async (req, res) => {
365
+ /* v8 ignore next -- Node always supplies url/host for accepted HTTP requests; fallback keeps malformed local calls safe @preserve */
366
+ const requestUrl = new URL(req.url ?? "/", `http://${req.headers.host ?? `${host}:${port}`}`);
367
+ /* v8 ignore next -- host fallback is defensive for malformed local requests; publicBaseUrl/default host branches are covered @preserve */
368
+ const currentBaseUrl = publicBaseUrl ?? `http://${req.headers.host ?? `${host}:${port}`}`;
369
+ if (req.method === "GET" && (requestUrl.pathname === "/.well-known/agent-card.json" || requestUrl.pathname === "/agent-card.json")) {
370
+ writeJson(res, 200, (0, card_1.buildA2AAgentCard)({
371
+ agentName: options.agentName,
372
+ baseUrl: currentBaseUrl,
373
+ path: a2aPath,
374
+ ...(options.identity ? { did: options.identity.did } : {}),
375
+ }));
376
+ return;
377
+ }
378
+ if (req.method !== "POST" || requestUrl.pathname !== a2aPath) {
379
+ writeJson(res, 404, { error: "not found" });
380
+ return;
381
+ }
382
+ let rpc;
383
+ try {
384
+ const rawBody = await readBody(req);
385
+ rpc = JSON.parse(rawBody);
386
+ }
387
+ catch (error) {
388
+ if (error instanceof A2ARequestError) {
389
+ writeJson(res, error.status, errorResponse(null, error.code, error.message));
390
+ return;
391
+ }
392
+ writeJson(res, 400, errorResponse(null, -32700, "invalid JSON"));
393
+ return;
394
+ }
395
+ try {
396
+ if (rpc.method === "SendMessage" || rpc.method === "message/send") {
397
+ const responseStyle = rpc.method === "message/send" ? "legacy" : "latest";
398
+ const parsedInbound = messageFromParams(rpc.params);
399
+ const inbound = parsedInbound ? { ...parsedInbound, kind: parsedInbound.kind ?? "message" } : null;
400
+ // HARNESS-OWNED RESULT WIRE (runs BEFORE the friends-share branch). A
401
+ // `mission_result`-tagged DataPart is NOT a FriendsKind — it routes to
402
+ // `importMissionResult` (assignee/correlation-gated, store-only, NO turn), never
403
+ // to `receiveShare`. Recognized by the `ouroKind` discriminator.
404
+ if (inbound && inboundShareDeps && (0, mission_result_wire_1.isMissionResultDataPart)(inbound)) {
405
+ const imported = await (0, mission_result_wire_1.receiveInboundMissionResult)(inbound, {
406
+ sodium: inboundShareDeps.sodium,
407
+ store: inboundShareDeps.store,
408
+ missionStore: inboundShareDeps.missionStore,
409
+ // The SAME authentication seam the share bridge uses — so a forged-sender
410
+ // result is rejected by the DidVerifier exactly like a forged share.
411
+ pinStore: inboundShareDeps.pinStore,
412
+ seen: inboundShareDeps.seen,
413
+ didResolution: inboundShareDeps.didResolution,
414
+ identity: inboundShareDeps.identity,
415
+ });
416
+ if (imported.outcome === "rejected") {
417
+ writeJson(res, 200, errorResponse(rpc.id, rejectionErrorCode(imported.reason), `A2A result rejected: ${imported.reason}`));
418
+ return;
419
+ }
420
+ // imported (store-only, no turn): acknowledge with a minimal completed task.
421
+ /* v8 ignore next -- "not-a-result" is unreachable here (gated by isMissionResultDataPart) @preserve */
422
+ const ackText = imported.outcome === "imported"
423
+ ? `[a2a] imported mission result from ${imported.verifiedDid}`
424
+ /* v8 ignore next -- defensive: the gate above guarantees imported|rejected @preserve */
425
+ : "[a2a] mission result";
426
+ const contextId = inbound.contextId ?? "default";
427
+ const taskId = (0, node_crypto_1.randomUUID)();
428
+ const accessToken = (0, node_crypto_1.randomUUID)();
429
+ const ackTask = taskFor({ taskId, accessToken, contextId, inbound, state: "TASK_STATE_COMPLETED", response: ackText });
430
+ taskStore.put(ackTask, accessTokenScope(accessToken));
431
+ writeJson(res, 200, jsonResponse(rpc.id, publicTask(ackTask, accessToken, responseStyle, true)));
432
+ return;
433
+ }
434
+ // Inbound friends-DataPart branch (runs BEFORE the legacy text path). A
435
+ // sealed DataPart is unwrapped + verified through the bridge; the turn is
436
+ // then keyed on the VERIFIED sender DID (replacing the unauthenticated
437
+ // sentinel). A non-friends (text) message falls through unchanged.
438
+ let verifiedPeerAgentId;
439
+ let verifiedPeerName;
440
+ let verifiedShareText;
441
+ if (inbound && inboundShareDeps && messageHasDataPart(inbound)) {
442
+ const bridged = await (0, inbound_share_1.receiveInboundShare)(inbound, inboundShareDeps);
443
+ if (bridged.outcome === "rejected") {
444
+ writeJson(res, 200, errorResponse(rpc.id, rejectionErrorCode(bridged.reason), `A2A share rejected: ${bridged.reason}`));
445
+ return;
446
+ }
447
+ // A message with a data part always resolves to completed|rejected — the
448
+ // bridge only returns "not-a-share" when there is NO data part, which the
449
+ // `messageHasDataPart` gate above excludes. So this is the completed path.
450
+ /* v8 ignore next -- "not-a-share" is unreachable here (gated by messageHasDataPart) @preserve */
451
+ if (bridged.outcome === "completed") {
452
+ verifiedPeerAgentId = bridged.verifiedDid;
453
+ verifiedPeerName = bridged.verifiedDid;
454
+ verifiedShareText = `[a2a] received ${bridged.friendsKind} (${bridged.status}) from ${bridged.verifiedDid}`;
455
+ }
456
+ }
457
+ const text = verifiedShareText ?? textFromMessage(inbound);
458
+ if (!inbound || !text) {
459
+ writeJson(res, 200, errorResponse(rpc.id, -32602, "SendMessage requires a text message"));
460
+ return;
461
+ }
462
+ if (text.length > MAX_A2A_MESSAGE_TEXT_CHARS) {
463
+ writeJson(res, 200, errorResponse(rpc.id, -32602, `SendMessage text exceeds ${MAX_A2A_MESSAGE_TEXT_CHARS} characters`));
464
+ return;
465
+ }
466
+ const senderHint = senderHintFromMessage(req, inbound);
467
+ // The verified DID wins as the turn's peer identity; otherwise the legacy
468
+ // unauthenticated sentinel (text path, behavior-preserved).
469
+ const peerAgentId = verifiedPeerAgentId ?? untrustedTurnPeerExternalId();
470
+ const peerName = verifiedPeerName ?? senderHint.name;
471
+ const continuationToken = accessTokenFromParams(rpc.params);
472
+ const continuationTask = inbound.taskId && continuationToken
473
+ ? taskStore.get(inbound.taskId, accessTokenScope(continuationToken))
474
+ : null;
475
+ if (inbound.taskId && continuationToken && (!continuationTask || !taskAuthorized(continuationTask, continuationToken))) {
476
+ writeJson(res, 200, errorResponse(rpc.id, -32001, "task not found"));
477
+ return;
478
+ }
479
+ if (continuationTask && isTerminalTaskState(continuationTask.status.state)) {
480
+ writeJson(res, 200, errorResponse(rpc.id, -32002, "task is terminal; start a new task"));
481
+ return;
482
+ }
483
+ const contextId = inbound.contextId ?? continuationTask?.contextId ?? "default";
484
+ const taskId = continuationTask?.id ?? (0, node_crypto_1.randomUUID)();
485
+ const accessToken = continuationToken && continuationTask ? continuationToken : (0, node_crypto_1.randomUUID)();
486
+ const tokenScope = accessTokenScope(accessToken);
487
+ const clientTaskId = continuationTask ? taskA2AMetadata(continuationTask).clientTaskId : inbound.taskId;
488
+ taskStore.put(taskFor({ taskId, accessToken, contextId, inbound, state: "TASK_STATE_WORKING", clientTaskId, previousTask: continuationTask ?? undefined }), tokenScope);
489
+ const turn = await turnRunner({
490
+ agentName: options.agentName,
491
+ peerAgentId,
492
+ peerName,
493
+ sessionKey: contextId,
494
+ message: text,
495
+ });
496
+ const task = taskFor({ taskId, accessToken, contextId, inbound, state: "TASK_STATE_COMPLETED", response: turn.response, clientTaskId, previousTask: continuationTask ?? undefined });
497
+ taskStore.put(task, tokenScope);
498
+ writeJson(res, 200, jsonResponse(rpc.id, publicTask(task, accessToken, responseStyle, true)));
499
+ return;
500
+ }
501
+ if (rpc.method === "GetTask" || rpc.method === "tasks/get") {
502
+ const responseStyle = rpc.method === "tasks/get" ? "legacy" : "latest";
503
+ const taskId = rpc.params && typeof rpc.params === "object"
504
+ ? rpc.params.id
505
+ : undefined;
506
+ if (typeof taskId !== "string" || !taskId.trim()) {
507
+ writeJson(res, 200, errorResponse(rpc.id, -32602, "GetTask requires id"));
508
+ return;
509
+ }
510
+ const accessToken = accessTokenFromParams(rpc.params);
511
+ if (!accessToken) {
512
+ writeJson(res, 200, errorResponse(rpc.id, -32602, "GetTask requires accessToken"));
513
+ return;
514
+ }
515
+ const task = taskStore.get(taskId, accessTokenScope(accessToken));
516
+ writeJson(res, 200, task && taskAuthorized(task, accessToken)
517
+ ? jsonResponse(rpc.id, publicTask(task, accessToken, responseStyle, false))
518
+ : errorResponse(rpc.id, -32001, "task not found"));
519
+ return;
520
+ }
521
+ if (rpc.method === "CancelTask" || rpc.method === "tasks/cancel") {
522
+ const responseStyle = rpc.method === "tasks/cancel" ? "legacy" : "latest";
523
+ const taskId = rpc.params && typeof rpc.params === "object"
524
+ ? rpc.params.id
525
+ : undefined;
526
+ if (typeof taskId !== "string" || !taskId.trim()) {
527
+ writeJson(res, 200, errorResponse(rpc.id, -32602, "CancelTask requires id"));
528
+ return;
529
+ }
530
+ const accessToken = accessTokenFromParams(rpc.params);
531
+ if (!accessToken) {
532
+ writeJson(res, 200, errorResponse(rpc.id, -32602, "CancelTask requires accessToken"));
533
+ return;
534
+ }
535
+ const tokenScope = accessTokenScope(accessToken);
536
+ const task = taskStore.get(taskId, tokenScope);
537
+ if (!task || !taskAuthorized(task, accessToken)) {
538
+ writeJson(res, 200, errorResponse(rpc.id, -32001, "task not found"));
539
+ return;
540
+ }
541
+ const canceled = {
542
+ ...task,
543
+ status: { state: "TASK_STATE_CANCELED", timestamp: new Date().toISOString() },
544
+ };
545
+ taskStore.put(canceled, tokenScope);
546
+ writeJson(res, 200, jsonResponse(rpc.id, publicTask(canceled, accessToken, responseStyle, false)));
547
+ return;
548
+ }
549
+ writeJson(res, 200, errorResponse(rpc.id, -32601, `unknown method: ${rpc.method}`));
550
+ }
551
+ catch (error) {
552
+ const message = error instanceof Error ? error.message : /* v8 ignore next -- defensive non-Error throw branch @preserve */ String(error);
553
+ writeJson(res, 200, errorResponse(rpc.id, -32000, message));
554
+ }
555
+ });
556
+ await new Promise((resolve, reject) => {
557
+ const onError = (error) => {
558
+ server.off("listening", onListening);
559
+ reject(error);
560
+ };
561
+ const onListening = () => {
562
+ server.off("error", onError);
563
+ resolve();
564
+ };
565
+ server.once("error", onError);
566
+ server.once("listening", onListening);
567
+ server.listen(port, host);
568
+ });
569
+ const address = server.address();
570
+ /* v8 ignore next -- server.address() is an address object after successful listen on TCP @preserve */
571
+ const actualPort = typeof address === "object" && address ? address.port : port;
572
+ const localBaseUrl = `http://${host}:${actualPort}`;
573
+ publicBaseUrl = publicBaseUrl ?? localBaseUrl;
574
+ const endpointUrl = new URL(publicBaseUrl);
575
+ endpointUrl.pathname = a2aPath;
576
+ endpointUrl.search = "";
577
+ endpointUrl.hash = "";
578
+ (0, runtime_1.emitNervesEvent)({
579
+ component: "channels",
580
+ event: "channel.a2a_server_started",
581
+ message: "A2A sense server started",
582
+ meta: { agentName: options.agentName, url: publicBaseUrl, endpoint: endpointUrl.toString() },
583
+ });
584
+ return {
585
+ server,
586
+ url: publicBaseUrl,
587
+ endpointUrl: endpointUrl.toString(),
588
+ close: () => new Promise((resolve, reject) => {
589
+ server.close((error) => {
590
+ if (error) {
591
+ reject(error);
592
+ return;
593
+ }
594
+ (0, runtime_1.emitNervesEvent)({
595
+ component: "channels",
596
+ event: "channel.a2a_server_stopped",
597
+ message: "A2A sense server stopped",
598
+ meta: { agentName: options.agentName },
599
+ });
600
+ resolve();
601
+ });
602
+ }),
603
+ };
604
+ }
@@ -0,0 +1,69 @@
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.FileA2ATaskStore = void 0;
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ const node_crypto_1 = require("node:crypto");
40
+ const runtime_1 = require("../nerves/runtime");
41
+ function taskFileName(taskId, ownerScope) {
42
+ return `${(0, node_crypto_1.createHash)("sha256").update(`${ownerScope}\n${taskId}`).digest("hex")}.json`;
43
+ }
44
+ class FileA2ATaskStore {
45
+ dir;
46
+ constructor(agentRoot) {
47
+ this.dir = path.join(agentRoot, "state", "a2a", "tasks");
48
+ fs.mkdirSync(this.dir, { recursive: true });
49
+ (0, runtime_1.emitNervesEvent)({
50
+ component: "channels",
51
+ event: "channel.a2a_task_store_init",
52
+ message: "initialized A2A task store",
53
+ meta: { dir: this.dir },
54
+ });
55
+ }
56
+ put(task, ownerScope = "legacy") {
57
+ fs.writeFileSync(path.join(this.dir, taskFileName(task.id, ownerScope)), `${JSON.stringify(task, null, 2)}\n`, "utf-8");
58
+ }
59
+ get(taskId, ownerScope = "legacy") {
60
+ try {
61
+ const raw = fs.readFileSync(path.join(this.dir, taskFileName(taskId, ownerScope)), "utf-8");
62
+ return JSON.parse(raw);
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ }
68
+ }
69
+ exports.FileA2ATaskStore = FileA2ATaskStore;