@ouro.bot/cli 0.1.0-alpha.8 → 0.1.0-alpha.800

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 (624) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +249 -176
  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/SerpentGuide.ouro/agent.json +83 -0
  11. package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
  13. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  14. package/assets/bluebubbles-host +264 -0
  15. package/assets/ouroboros.png +0 -0
  16. package/changelog.json +5563 -0
  17. package/deploy/unraid/Dockerfile +48 -0
  18. package/deploy/unraid/README.txt +3012 -0
  19. package/deploy/unraid/audit-container-spec.sh +4 -0
  20. package/deploy/unraid/container-runtime.json +1 -0
  21. package/deploy/unraid/docker-man-template-transaction.mjs +526 -0
  22. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  23. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  24. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  25. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  26. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  27. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  28. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  29. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  30. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  31. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  32. package/deploy/unraid/sanctuary-deployment-target.mjs +709 -0
  33. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  34. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2030 -0
  35. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  36. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  37. package/deploy/unraid/sanctuary.ouro/agent.json +24 -0
  38. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  39. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  40. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  41. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  42. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  43. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  44. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +11 -0
  45. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
  46. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +11 -0
  47. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  48. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +23 -0
  49. package/deploy/unraid/sanctuary.xml +27 -0
  50. package/dist/a2a/card.js +57 -0
  51. package/dist/a2a/client.js +180 -0
  52. package/dist/a2a/config.js +50 -0
  53. package/dist/a2a/delegation-stores.js +56 -0
  54. package/dist/a2a/did-resolution.js +93 -0
  55. package/dist/a2a/identity.js +170 -0
  56. package/dist/a2a/inbound-share.js +107 -0
  57. package/dist/a2a/mission-result-wire.js +196 -0
  58. package/dist/a2a/onboarding.js +115 -0
  59. package/dist/a2a/pin-store.js +132 -0
  60. package/dist/a2a/seen-ledger.js +120 -0
  61. package/dist/a2a/server.js +604 -0
  62. package/dist/a2a/task-store.js +69 -0
  63. package/dist/a2a/transport.js +45 -0
  64. package/dist/a2a/types.js +3 -0
  65. package/dist/arc/attention-types.js +8 -0
  66. package/dist/arc/cares.js +360 -0
  67. package/dist/arc/episodes.js +118 -0
  68. package/dist/arc/evolution.js +490 -0
  69. package/dist/arc/flight-recorder.js +1034 -0
  70. package/dist/arc/intentions.js +134 -0
  71. package/dist/arc/json-store.js +117 -0
  72. package/dist/arc/obligations.js +386 -0
  73. package/dist/arc/packets.js +336 -0
  74. package/dist/arc/presence.js +185 -0
  75. package/dist/arc/task-lifecycle.js +57 -0
  76. package/dist/commerce/store.js +755 -0
  77. package/dist/commerce/types.js +3 -0
  78. package/dist/heart/active-work.js +1009 -0
  79. package/dist/heart/agent-entry.js +252 -3
  80. package/dist/heart/approval-files.js +113 -0
  81. package/dist/heart/approval-store.js +950 -0
  82. package/dist/heart/attachments/image-normalize.js +194 -0
  83. package/dist/heart/attachments/materialize.js +97 -0
  84. package/dist/heart/attachments/originals.js +88 -0
  85. package/dist/heart/attachments/render.js +29 -0
  86. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  87. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  88. package/dist/heart/attachments/sources/index.js +18 -0
  89. package/dist/heart/attachments/sources/telegram.js +71 -0
  90. package/dist/heart/attachments/store.js +132 -0
  91. package/dist/heart/attachments/types.js +93 -0
  92. package/dist/heart/auth/auth-flow.js +495 -0
  93. package/dist/heart/autonomy-budget.js +478 -0
  94. package/dist/heart/awaiting/await-alert.js +148 -0
  95. package/dist/heart/awaiting/await-expiry.js +143 -0
  96. package/dist/heart/awaiting/await-loader.js +91 -0
  97. package/dist/heart/awaiting/await-parser.js +149 -0
  98. package/dist/heart/awaiting/await-runtime-state.js +100 -0
  99. package/dist/heart/awaiting/await-scheduler.js +382 -0
  100. package/dist/heart/background-operations.js +281 -0
  101. package/dist/heart/bridges/manager.js +478 -0
  102. package/dist/heart/bridges/state-machine.js +135 -0
  103. package/dist/heart/bridges/store.js +135 -0
  104. package/dist/heart/bundle-state.js +168 -0
  105. package/dist/heart/commitments.js +135 -0
  106. package/dist/heart/config-registry.js +331 -0
  107. package/dist/heart/config.js +195 -137
  108. package/dist/heart/context-loss-gauntlet.js +387 -0
  109. package/dist/heart/context-loss-sentinel.js +1157 -0
  110. package/dist/heart/core.js +2257 -338
  111. package/dist/heart/cross-chat-delivery.js +133 -0
  112. package/dist/heart/daemon/agent-config-check.js +451 -0
  113. package/dist/heart/daemon/agent-discovery.js +263 -0
  114. package/dist/heart/daemon/agent-service.js +542 -0
  115. package/dist/heart/daemon/agentic-repair.js +547 -0
  116. package/dist/heart/daemon/await-private-wake.js +59 -0
  117. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  118. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  119. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  120. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  121. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  122. package/dist/heart/daemon/cadence.js +180 -0
  123. package/dist/heart/daemon/cli-defaults.js +836 -0
  124. package/dist/heart/daemon/cli-desk.js +322 -0
  125. package/dist/heart/daemon/cli-exec.js +8730 -0
  126. package/dist/heart/daemon/cli-help.js +710 -0
  127. package/dist/heart/daemon/cli-parse.js +2719 -0
  128. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  129. package/dist/heart/daemon/cli-render.js +777 -0
  130. package/dist/heart/daemon/cli-types.js +8 -0
  131. package/dist/heart/daemon/connect-bay.js +323 -0
  132. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  133. package/dist/heart/daemon/container-healthcheck.js +112 -0
  134. package/dist/heart/daemon/container-runtime.js +97 -0
  135. package/dist/heart/daemon/container-spec-auditor-main.js +170 -0
  136. package/dist/heart/daemon/container-spec-auditor.js +236 -0
  137. package/dist/heart/daemon/daemon-bootstrap-startup.js +107 -0
  138. package/dist/heart/daemon/daemon-cli.js +30 -786
  139. package/dist/heart/daemon/daemon-entry.js +971 -13
  140. package/dist/heart/daemon/daemon-health.js +186 -0
  141. package/dist/heart/daemon/daemon-rollup.js +57 -0
  142. package/dist/heart/daemon/daemon-runtime-sync.js +287 -0
  143. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  144. package/dist/heart/daemon/daemon.js +2156 -28
  145. package/dist/heart/daemon/dns-workflow.js +394 -0
  146. package/dist/heart/daemon/doctor-types.js +8 -0
  147. package/dist/heart/daemon/doctor.js +1755 -0
  148. package/dist/heart/daemon/freshness.js +345 -0
  149. package/dist/heart/daemon/habit-private-wake.js +61 -0
  150. package/dist/heart/daemon/health-monitor.js +142 -11
  151. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  152. package/dist/heart/daemon/hooks/bundle-meta.js +226 -0
  153. package/dist/heart/daemon/http-health-probe.js +80 -0
  154. package/dist/heart/daemon/human-command-screens.js +234 -0
  155. package/dist/heart/daemon/human-readiness.js +114 -0
  156. package/dist/heart/daemon/inner-status.js +78 -0
  157. package/dist/heart/daemon/interactive-repair.js +394 -0
  158. package/dist/heart/daemon/launchd.js +188 -0
  159. package/dist/heart/daemon/log-tailer.js +82 -12
  160. package/dist/heart/daemon/logs-prune.js +132 -0
  161. package/dist/heart/daemon/mcp-canary.js +524 -0
  162. package/dist/heart/daemon/message-router.js +80 -11
  163. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  164. package/dist/heart/daemon/os-cron-deps.js +135 -0
  165. package/dist/heart/daemon/os-cron.js +22 -14
  166. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  167. package/dist/heart/daemon/ouro-entry.js +3 -1
  168. package/dist/heart/daemon/plugin-cli.js +432 -0
  169. package/dist/heart/daemon/process-manager.js +739 -54
  170. package/dist/heart/daemon/provider-discovery.js +137 -0
  171. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  172. package/dist/heart/daemon/prunable-bundle.js +144 -0
  173. package/dist/heart/daemon/pulse.js +511 -0
  174. package/dist/heart/daemon/readiness-repair.js +365 -0
  175. package/dist/heart/daemon/run-hooks.js +39 -0
  176. package/dist/heart/daemon/runtime-logging.js +92 -16
  177. package/dist/heart/daemon/runtime-metadata.js +191 -0
  178. package/dist/{repertoire/tasks/lifecycle.js → heart/daemon/runtime-mode.js} +37 -39
  179. package/dist/heart/daemon/safe-mode.js +161 -0
  180. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2609 -0
  181. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1866 -0
  182. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  183. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +976 -0
  184. package/dist/heart/daemon/sanctuary-bundle-migration.js +728 -0
  185. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  186. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  187. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  188. package/dist/heart/daemon/sense-manager.js +948 -0
  189. package/dist/heart/daemon/session-id-resolver.js +131 -0
  190. package/dist/heart/daemon/skill-management-installer.js +94 -0
  191. package/dist/heart/daemon/socket-client.js +370 -0
  192. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  193. package/dist/heart/daemon/startup-tui.js +339 -0
  194. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  195. package/dist/heart/daemon/task-scheduler.js +117 -39
  196. package/dist/heart/daemon/terminal-ui.js +499 -0
  197. package/dist/heart/daemon/thoughts.js +591 -0
  198. package/dist/heart/daemon/up-progress.js +366 -0
  199. package/dist/heart/daemon/vault-items.js +56 -0
  200. package/dist/heart/delegation.js +59 -0
  201. package/dist/heart/external-events/router.js +1414 -0
  202. package/dist/heart/habits/habit-cancel.js +810 -0
  203. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  204. package/dist/heart/habits/habit-migration.js +194 -0
  205. package/dist/heart/habits/habit-parser.js +278 -0
  206. package/dist/heart/habits/habit-runtime-state.js +93 -0
  207. package/dist/heart/habits/habit-scheduler.js +653 -0
  208. package/dist/heart/habits/habit-session-summary.js +318 -0
  209. package/dist/heart/habits/habit-session.js +636 -0
  210. package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
  211. package/dist/heart/{daemon → hatch}/hatch-flow.js +57 -139
  212. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  213. package/dist/heart/hatch/specialist-orchestrator.js +129 -0
  214. package/dist/heart/hatch/specialist-prompt.js +102 -0
  215. package/dist/heart/hatch/specialist-tools.js +318 -0
  216. package/dist/heart/identity.js +297 -67
  217. package/dist/heart/kept-notes.js +289 -0
  218. package/dist/heart/kicks.js +2 -20
  219. package/dist/heart/machine-identity.js +161 -0
  220. package/dist/heart/mail-import-discovery.js +353 -0
  221. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  222. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  223. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  224. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  225. package/dist/heart/mailbox/mailbox-http-transport.js +129 -0
  226. package/dist/heart/mailbox/mailbox-http.js +99 -0
  227. package/dist/heart/mailbox/mailbox-read.js +39 -0
  228. package/dist/heart/mailbox/mailbox-types.js +27 -0
  229. package/dist/heart/mailbox/mailbox-view.js +197 -0
  230. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  231. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  232. package/dist/heart/mailbox/readers/mail.js +375 -0
  233. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  234. package/dist/heart/mailbox/readers/sessions.js +232 -0
  235. package/dist/heart/mailbox/readers/shared.js +111 -0
  236. package/dist/heart/mcp/mcp-server.js +696 -0
  237. package/dist/heart/migrate-config.js +100 -0
  238. package/dist/heart/model-capabilities.js +59 -0
  239. package/dist/heart/orientation-frame.js +345 -0
  240. package/dist/heart/platform.js +81 -0
  241. package/dist/heart/primitives.js +1 -1
  242. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  243. package/dist/heart/private-runtime/index.js +18 -0
  244. package/dist/heart/private-runtime/ledger.js +221 -0
  245. package/dist/heart/private-runtime/policy.js +252 -0
  246. package/dist/heart/private-runtime/types.js +2 -0
  247. package/dist/heart/progress-story.js +42 -0
  248. package/dist/heart/provider-attempt.js +137 -0
  249. package/dist/heart/provider-binding-resolver.js +273 -0
  250. package/dist/heart/provider-credentials.js +449 -0
  251. package/dist/heart/provider-failover.js +311 -0
  252. package/dist/heart/provider-models.js +96 -0
  253. package/dist/heart/provider-ping.js +265 -0
  254. package/dist/heart/provider-readiness-cache.js +119 -0
  255. package/dist/heart/provider-visibility.js +188 -0
  256. package/dist/heart/providers/anthropic-token.js +131 -0
  257. package/dist/heart/providers/anthropic.js +236 -58
  258. package/dist/heart/providers/azure.js +104 -13
  259. package/dist/heart/providers/error-classification.js +127 -0
  260. package/dist/heart/providers/github-copilot.js +145 -0
  261. package/dist/heart/providers/minimax-vlm.js +189 -0
  262. package/dist/heart/providers/minimax.js +29 -7
  263. package/dist/heart/providers/openai-codex-token.js +349 -0
  264. package/dist/heart/providers/openai-codex.js +63 -39
  265. package/dist/heart/providers/openai-compatible.js +177 -0
  266. package/dist/heart/run-ledger.js +247 -0
  267. package/dist/heart/runtime-capability-check.js +170 -0
  268. package/dist/heart/runtime-credentials.js +607 -0
  269. package/dist/heart/runtime-cwd.js +87 -0
  270. package/dist/heart/sense-truth.js +79 -0
  271. package/dist/heart/session-activity.js +235 -0
  272. package/dist/heart/session-events.js +1318 -0
  273. package/dist/heart/session-playback-cli-main.js +5 -0
  274. package/dist/heart/session-playback-cli.js +36 -0
  275. package/dist/heart/session-playback.js +231 -0
  276. package/dist/heart/session-stats-cli-main.js +5 -0
  277. package/dist/heart/session-stats.js +182 -0
  278. package/dist/heart/session-transcript.js +133 -0
  279. package/dist/heart/start-of-turn-packet.js +372 -0
  280. package/dist/heart/steward-policy.js +302 -0
  281. package/dist/heart/streaming.js +682 -207
  282. package/dist/heart/structured-output.js +196 -0
  283. package/dist/heart/sync-classification.js +176 -0
  284. package/dist/heart/sync.js +449 -0
  285. package/dist/heart/target-resolution.js +127 -0
  286. package/dist/heart/tempo.js +93 -0
  287. package/dist/heart/temporal-view.js +41 -0
  288. package/dist/heart/timeouts.js +101 -0
  289. package/dist/heart/tool-activity-callbacks.js +59 -0
  290. package/dist/heart/tool-approval.js +342 -0
  291. package/dist/heart/tool-description.js +155 -0
  292. package/dist/heart/tool-friction.js +55 -0
  293. package/dist/heart/tool-loop.js +200 -0
  294. package/dist/heart/turn-context.js +481 -0
  295. package/dist/heart/turn-coordinator.js +28 -0
  296. package/dist/heart/versioning/ouro-bot-global-installer.js +129 -0
  297. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  298. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  299. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  300. package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
  301. package/dist/heart/versioning/ouro-version-manager.js +409 -0
  302. package/dist/heart/versioning/staged-restart.js +146 -0
  303. package/dist/heart/versioning/update-checker.js +116 -0
  304. package/dist/heart/versioning/update-hooks.js +154 -0
  305. package/dist/heart/versioning/version-intent.js +114 -0
  306. package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
  307. package/dist/heart/work-card.js +380 -0
  308. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  309. package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
  310. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  311. package/dist/mailbox-ui/index.html +16 -0
  312. package/dist/mailroom/attention.js +167 -0
  313. package/dist/mailroom/autonomy.js +209 -0
  314. package/dist/mailroom/blob-store.js +889 -0
  315. package/dist/mailroom/body-cache.js +61 -0
  316. package/dist/mailroom/cache-sync-cli.js +58 -0
  317. package/dist/mailroom/core.js +803 -0
  318. package/dist/mailroom/entry.js +160 -0
  319. package/dist/mailroom/file-store.js +568 -0
  320. package/dist/mailroom/hosted-cache-sync.js +384 -0
  321. package/dist/mailroom/mbox-import.js +393 -0
  322. package/dist/mailroom/migration.js +164 -0
  323. package/dist/mailroom/outbound.js +380 -0
  324. package/dist/mailroom/policy.js +263 -0
  325. package/dist/mailroom/reader.js +292 -0
  326. package/dist/mailroom/search-cache.js +513 -0
  327. package/dist/mailroom/search-relevance.js +319 -0
  328. package/dist/mailroom/smtp-ingress.js +176 -0
  329. package/dist/mailroom/source-state.js +176 -0
  330. package/dist/mailroom/thread.js +109 -0
  331. package/dist/mailroom/travel-extract.js +89 -0
  332. package/dist/mind/bundle-manifest.js +93 -1
  333. package/dist/mind/context.js +287 -104
  334. package/dist/mind/desk-section.js +362 -0
  335. package/dist/mind/diary-integrity.js +60 -0
  336. package/dist/mind/{memory.js → diary.js} +90 -98
  337. package/dist/mind/embedding-provider.js +60 -0
  338. package/dist/mind/file-state.js +179 -0
  339. package/dist/mind/first-impressions.js +16 -2
  340. package/dist/mind/{associative-recall.js → note-search.js} +61 -60
  341. package/dist/mind/obligation-steering.js +227 -0
  342. package/dist/mind/pending.js +102 -9
  343. package/dist/mind/phrases.js +1 -0
  344. package/dist/mind/prompt-budget.js +479 -0
  345. package/dist/mind/prompt-refresh.js +3 -2
  346. package/dist/mind/prompt.js +1377 -140
  347. package/dist/mind/provenance-trust.js +26 -0
  348. package/dist/mind/record-paths.js +312 -0
  349. package/dist/mind/scrutiny.js +173 -0
  350. package/dist/mind/session-transaction.js +415 -0
  351. package/dist/mind/token-estimate.js +8 -12
  352. package/dist/nerves/cli-logging.js +22 -3
  353. package/dist/nerves/coverage/audit-rules.js +15 -6
  354. package/dist/nerves/coverage/audit.js +28 -2
  355. package/dist/nerves/coverage/cli.js +1 -1
  356. package/dist/nerves/coverage/contract.js +5 -5
  357. package/dist/nerves/coverage/file-completeness.js +139 -5
  358. package/dist/nerves/coverage/run-artifacts.js +56 -36
  359. package/dist/nerves/coverage/source-scanner.js +4 -4
  360. package/dist/nerves/event-buffer.js +111 -0
  361. package/dist/nerves/index.js +305 -9
  362. package/dist/nerves/observation.js +20 -0
  363. package/dist/nerves/redact.js +79 -0
  364. package/dist/nerves/review/cli-main.js +5 -0
  365. package/dist/nerves/review/cli.js +156 -0
  366. package/dist/nerves/review/core.js +159 -0
  367. package/dist/nerves/runtime.js +17 -1
  368. package/dist/repertoire/ado-client.js +17 -56
  369. package/dist/repertoire/ado-semantic.js +16 -10
  370. package/dist/repertoire/api-client.js +97 -0
  371. package/dist/repertoire/bitwarden-store.js +1045 -0
  372. package/dist/repertoire/bundle-templates.js +71 -0
  373. package/dist/repertoire/bw-installer.js +180 -0
  374. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  375. package/dist/repertoire/coding/context-pack.js +331 -0
  376. package/dist/repertoire/coding/feedback.js +322 -0
  377. package/dist/repertoire/coding/index.js +18 -3
  378. package/dist/repertoire/coding/manager.js +228 -14
  379. package/dist/repertoire/coding/spawner.js +61 -14
  380. package/dist/repertoire/coding/tools.js +279 -12
  381. package/dist/repertoire/coding/workbench-client.js +272 -0
  382. package/dist/repertoire/coding/workbench-manager.js +346 -0
  383. package/dist/repertoire/commerce-errors.js +109 -0
  384. package/dist/repertoire/commerce-self-test.js +156 -0
  385. package/dist/repertoire/credential-access.js +178 -0
  386. package/dist/repertoire/data/ado-endpoints.json +188 -0
  387. package/dist/repertoire/desk/classifier.js +362 -0
  388. package/dist/repertoire/duffel-client.js +185 -0
  389. package/dist/repertoire/github-client.js +14 -55
  390. package/dist/repertoire/graph-client.js +11 -52
  391. package/dist/repertoire/guardrails.js +1083 -0
  392. package/dist/repertoire/mcp-client.js +295 -0
  393. package/dist/repertoire/mcp-manager.js +434 -0
  394. package/dist/repertoire/mcp-tools.js +83 -0
  395. package/dist/repertoire/plugin-mcp.js +175 -0
  396. package/dist/repertoire/plugins.js +253 -0
  397. package/dist/repertoire/relationship-authorization.js +194 -0
  398. package/dist/repertoire/shell-sessions.js +133 -0
  399. package/dist/repertoire/skills.js +45 -24
  400. package/dist/repertoire/stripe-client.js +131 -0
  401. package/dist/repertoire/tool-arguments.js +148 -0
  402. package/dist/repertoire/tool-results.js +29 -0
  403. package/dist/repertoire/tools-a2a.js +699 -0
  404. package/dist/repertoire/tools-attachments.js +322 -0
  405. package/dist/repertoire/tools-awaiting.js +575 -0
  406. package/dist/repertoire/tools-base.js +85 -707
  407. package/dist/repertoire/tools-bluebubbles.js +95 -0
  408. package/dist/repertoire/tools-bridge.js +144 -0
  409. package/dist/repertoire/tools-bundle.js +993 -0
  410. package/dist/repertoire/tools-commerce.js +253 -0
  411. package/dist/repertoire/tools-config.js +186 -0
  412. package/dist/repertoire/tools-continuity.js +575 -0
  413. package/dist/repertoire/tools-credential.js +383 -0
  414. package/dist/repertoire/tools-evolution.js +527 -0
  415. package/dist/repertoire/tools-files.js +344 -0
  416. package/dist/repertoire/tools-flight.js +290 -0
  417. package/dist/repertoire/tools-flow.js +119 -0
  418. package/dist/repertoire/tools-github.js +3 -8
  419. package/dist/repertoire/tools-habits.js +103 -0
  420. package/dist/repertoire/tools-mail.js +1828 -0
  421. package/dist/repertoire/tools-notes.js +485 -0
  422. package/dist/repertoire/tools-obligations.js +182 -0
  423. package/dist/repertoire/tools-orientation.js +31 -0
  424. package/dist/repertoire/tools-record.js +482 -0
  425. package/dist/repertoire/tools-rsvp.js +139 -0
  426. package/dist/repertoire/tools-runtime.js +150 -0
  427. package/dist/repertoire/tools-session.js +1108 -0
  428. package/dist/repertoire/tools-shell.js +133 -0
  429. package/dist/repertoire/tools-steward-policy.js +95 -0
  430. package/dist/repertoire/tools-stripe.js +224 -0
  431. package/dist/repertoire/tools-surface.js +369 -0
  432. package/dist/repertoire/tools-teams.js +67 -61
  433. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  434. package/dist/repertoire/tools-travel.js +125 -0
  435. package/dist/repertoire/tools-trip.js +982 -0
  436. package/dist/repertoire/tools-unraid.js +484 -0
  437. package/dist/repertoire/tools-user-profile.js +146 -0
  438. package/dist/repertoire/tools-vault.js +40 -0
  439. package/dist/repertoire/tools-voice.js +145 -0
  440. package/dist/repertoire/tools.js +441 -102
  441. package/dist/repertoire/travel-api-client.js +360 -0
  442. package/dist/repertoire/unraid-client.js +155 -0
  443. package/dist/repertoire/unraid-restart.js +212 -0
  444. package/dist/repertoire/user-profile.js +131 -0
  445. package/dist/repertoire/vault-setup.js +246 -0
  446. package/dist/repertoire/vault-unlock.js +628 -0
  447. package/dist/rsvp/aisleplanner-client.js +354 -0
  448. package/dist/rsvp/cli.js +926 -0
  449. package/dist/rsvp/config.js +327 -0
  450. package/dist/rsvp/cutover.js +433 -0
  451. package/dist/rsvp/diagnostics.js +232 -0
  452. package/dist/rsvp/diff-renderer.js +176 -0
  453. package/dist/rsvp/habit-policy.js +110 -0
  454. package/dist/rsvp/habit-stage.js +123 -0
  455. package/dist/rsvp/incident-bundle.js +97 -0
  456. package/dist/rsvp/migration.js +204 -0
  457. package/dist/rsvp/native-habit-runner.js +630 -0
  458. package/dist/rsvp/outbound-state.js +628 -0
  459. package/dist/rsvp/query.js +118 -0
  460. package/dist/rsvp/replay.js +233 -0
  461. package/dist/rsvp/snapshot.js +232 -0
  462. package/dist/rsvp/spend-ledger.js +175 -0
  463. package/dist/scripts/claude-code-hook.js +41 -0
  464. package/dist/scripts/claude-code-stop-hook.js +47 -0
  465. package/dist/senses/a2a-entry.js +115 -0
  466. package/dist/senses/attention-queue.js +186 -0
  467. package/dist/senses/await-turn-message.js +58 -0
  468. package/dist/senses/bluebubbles/active-turns.js +216 -0
  469. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  470. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  471. package/dist/senses/bluebubbles/client.js +799 -0
  472. package/dist/senses/bluebubbles/context-packet.js +207 -0
  473. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  474. package/dist/senses/bluebubbles/entry.js +90 -0
  475. package/dist/senses/bluebubbles/inbound-log.js +127 -0
  476. package/dist/senses/bluebubbles/index.js +3839 -0
  477. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  478. package/dist/senses/bluebubbles/media.js +389 -0
  479. package/dist/senses/bluebubbles/model.js +392 -0
  480. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +57 -6
  481. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  482. package/dist/senses/bluebubbles/processed-log.js +133 -0
  483. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  484. package/dist/senses/bluebubbles/replay.js +284 -0
  485. package/dist/senses/bluebubbles/runtime-state.js +137 -0
  486. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  487. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  488. package/dist/senses/bluebubbles/webhook-registration.js +228 -0
  489. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  490. package/dist/senses/cli/bracketed-paste.js +82 -0
  491. package/dist/senses/cli/image-paste.js +287 -0
  492. package/dist/senses/cli/image-ref-navigation.js +75 -0
  493. package/dist/senses/cli/ink-app.js +156 -0
  494. package/dist/senses/cli/inline-diff.js +64 -0
  495. package/dist/senses/cli/input-keys.js +174 -0
  496. package/dist/senses/cli/kill-ring.js +86 -0
  497. package/dist/senses/cli/message-list.js +51 -0
  498. package/dist/senses/cli/ouro-tui.js +607 -0
  499. package/dist/senses/cli/spinner-imperative.js +135 -0
  500. package/dist/senses/cli/spinner.js +101 -0
  501. package/dist/senses/cli/status-line.js +60 -0
  502. package/dist/senses/cli/streaming-markdown.js +526 -0
  503. package/dist/senses/cli/tool-display.js +85 -0
  504. package/dist/senses/cli/tool-render.js +85 -0
  505. package/dist/senses/cli/tui-store.js +241 -0
  506. package/dist/senses/cli/virtual-list.js +35 -0
  507. package/dist/senses/cli-entry.js +60 -8
  508. package/dist/senses/cli-layout.js +187 -0
  509. package/dist/senses/cli.js +813 -281
  510. package/dist/senses/commands.js +66 -3
  511. package/dist/senses/context-packet-ledger.js +371 -0
  512. package/dist/senses/context-packets.js +154 -0
  513. package/dist/senses/continuity.js +94 -0
  514. package/dist/senses/habit-lifecycle-guard.js +24 -0
  515. package/dist/senses/habit-turn-message.js +160 -0
  516. package/dist/senses/ingress-evidence.js +2 -0
  517. package/dist/senses/mail-entry.js +66 -0
  518. package/dist/senses/mail.js +524 -0
  519. package/dist/senses/pipeline.js +1213 -0
  520. package/dist/senses/private-runtime-worker.js +859 -0
  521. package/dist/senses/private-runtime.js +1496 -0
  522. package/dist/senses/proactive-content-guard.js +51 -0
  523. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  524. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  525. package/dist/senses/sanctuary-grounding.js +118 -0
  526. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  527. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  528. package/dist/senses/sanctuary-health-runner.js +101 -0
  529. package/dist/senses/sanctuary-health.js +408 -0
  530. package/dist/senses/sanctuary-interactive-control.js +306 -0
  531. package/dist/senses/sanctuary-media-catalog-contract.js +235 -0
  532. package/dist/senses/sanctuary-media-optimization.js +514 -0
  533. package/dist/senses/sanctuary-runtime.js +338 -0
  534. package/dist/senses/sanctuary-sab.js +85 -0
  535. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  536. package/dist/senses/shared-turn.js +571 -0
  537. package/dist/senses/surface-tool.js +109 -0
  538. package/dist/senses/teams-entry.js +60 -8
  539. package/dist/senses/teams.js +953 -211
  540. package/dist/senses/telegram-admission.js +711 -0
  541. package/dist/senses/telegram-approval-runtime.js +566 -0
  542. package/dist/senses/telegram-attachments.js +182 -0
  543. package/dist/senses/telegram-audit-ledger.js +220 -0
  544. package/dist/senses/telegram-client.js +1677 -0
  545. package/dist/senses/telegram-effect-adapter.js +859 -0
  546. package/dist/senses/telegram-entry.js +83 -0
  547. package/dist/senses/telegram.js +2026 -0
  548. package/dist/senses/trust-gate.js +207 -2
  549. package/dist/senses/voice/audio-playback.js +237 -0
  550. package/dist/senses/voice/audio-routing.js +119 -0
  551. package/dist/senses/voice/elevenlabs.js +202 -0
  552. package/dist/senses/voice/floor-control.js +431 -0
  553. package/dist/senses/voice/floor-controller.js +115 -0
  554. package/dist/senses/voice/golden-path.js +116 -0
  555. package/dist/senses/voice/index.js +29 -0
  556. package/dist/senses/voice/meeting.js +113 -0
  557. package/dist/senses/voice/outbound.js +190 -0
  558. package/dist/senses/voice/phone.js +33 -0
  559. package/dist/senses/voice/playback.js +139 -0
  560. package/dist/senses/voice/realtime-eval.js +496 -0
  561. package/dist/senses/voice/realtime-trace.js +531 -0
  562. package/dist/senses/voice/transcript.js +70 -0
  563. package/dist/senses/voice/turn.js +191 -0
  564. package/dist/senses/voice/twilio-phone-runtime.js +807 -0
  565. package/dist/senses/voice/twilio-phone.js +5081 -0
  566. package/dist/senses/voice/types.js +2 -0
  567. package/dist/senses/voice/whisper.js +161 -0
  568. package/dist/senses/voice-entry.js +81 -0
  569. package/dist/senses/voice-realtime-eval-command.js +99 -0
  570. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  571. package/dist/senses/voice-twilio-entry.js +87 -0
  572. package/dist/trips/core.js +138 -0
  573. package/dist/trips/store.js +265 -0
  574. package/dist/util/frontmatter.js +69 -0
  575. package/npm-shrinkwrap.json +8144 -0
  576. package/package.json +82 -12
  577. package/skills/agent-commerce.md +113 -0
  578. package/skills/browser-navigation.md +117 -0
  579. package/skills/commerce-setup-guide.md +116 -0
  580. package/skills/commerce-setup.md +84 -0
  581. package/skills/configure-dev-tools.md +99 -0
  582. package/skills/travel-planning.md +138 -0
  583. package/AdoptionSpecialist.ouro/agent.json +0 -20
  584. package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
  585. package/dist/heart/daemon/specialist-orchestrator.js +0 -160
  586. package/dist/heart/daemon/specialist-prompt.js +0 -47
  587. package/dist/heart/daemon/specialist-session.js +0 -142
  588. package/dist/heart/daemon/specialist-tools.js +0 -132
  589. package/dist/heart/daemon/subagent-installer.js +0 -125
  590. package/dist/inner-worker-entry.js +0 -4
  591. package/dist/mind/friends/channel.js +0 -49
  592. package/dist/mind/friends/resolver.js +0 -84
  593. package/dist/mind/friends/store-file.js +0 -171
  594. package/dist/mind/friends/store.js +0 -4
  595. package/dist/mind/friends/tokens.js +0 -26
  596. package/dist/mind/friends/types.js +0 -21
  597. package/dist/repertoire/tasks/board.js +0 -122
  598. package/dist/repertoire/tasks/index.js +0 -210
  599. package/dist/repertoire/tasks/middleware.js +0 -65
  600. package/dist/repertoire/tasks/parser.js +0 -173
  601. package/dist/repertoire/tasks/scanner.js +0 -132
  602. package/dist/repertoire/tasks/transitions.js +0 -145
  603. package/dist/senses/bluebubbles-client.js +0 -279
  604. package/dist/senses/bluebubbles-entry.js +0 -11
  605. package/dist/senses/bluebubbles-model.js +0 -253
  606. package/dist/senses/bluebubbles.js +0 -332
  607. package/dist/senses/inner-dialog-worker.js +0 -61
  608. package/dist/senses/inner-dialog.js +0 -231
  609. package/subagents/README.md +0 -73
  610. package/subagents/work-doer.md +0 -233
  611. package/subagents/work-merger.md +0 -624
  612. package/subagents/work-planner.md +0 -373
  613. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  614. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  615. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  616. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  617. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  618. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  619. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  620. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  621. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  622. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  623. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  624. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.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;