@vauban-org/agent-sdk 1.0.0 → 1.2.0

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 (442) hide show
  1. package/CONTRACT.md +6401 -813
  2. package/dist/adapters/llm/anthropic-direct.d.ts +1 -0
  3. package/dist/adapters/llm/anthropic-direct.d.ts.map +1 -1
  4. package/dist/adapters/llm/anthropic-direct.js +43 -0
  5. package/dist/adapters/llm/anthropic-direct.js.map +1 -1
  6. package/dist/adapters/llm/cascade.d.ts.map +1 -1
  7. package/dist/adapters/llm/cascade.js +57 -14
  8. package/dist/adapters/llm/cascade.js.map +1 -1
  9. package/dist/adapters/llm/litellm.d.ts +2 -0
  10. package/dist/adapters/llm/litellm.d.ts.map +1 -1
  11. package/dist/adapters/llm/litellm.js +44 -0
  12. package/dist/adapters/llm/litellm.js.map +1 -1
  13. package/dist/compute/difficulty-estimator.d.ts +53 -0
  14. package/dist/compute/difficulty-estimator.d.ts.map +1 -0
  15. package/dist/compute/difficulty-estimator.js +82 -0
  16. package/dist/compute/difficulty-estimator.js.map +1 -0
  17. package/dist/compute/strategies/mixture-of-agents.d.ts +40 -0
  18. package/dist/compute/strategies/mixture-of-agents.d.ts.map +1 -0
  19. package/dist/compute/strategies/mixture-of-agents.js +110 -0
  20. package/dist/compute/strategies/mixture-of-agents.js.map +1 -0
  21. package/dist/compute/strategies/tree-of-thoughts.d.ts +48 -0
  22. package/dist/compute/strategies/tree-of-thoughts.d.ts.map +1 -0
  23. package/dist/compute/strategies/tree-of-thoughts.js +242 -0
  24. package/dist/compute/strategies/tree-of-thoughts.js.map +1 -0
  25. package/dist/compute/strategies/two-phase-orient.d.ts +72 -0
  26. package/dist/compute/strategies/two-phase-orient.d.ts.map +1 -0
  27. package/dist/compute/strategies/two-phase-orient.js +85 -0
  28. package/dist/compute/strategies/two-phase-orient.js.map +1 -0
  29. package/dist/constitution/types.d.ts +10 -10
  30. package/dist/container/protocol.d.ts +134 -0
  31. package/dist/container/protocol.d.ts.map +1 -0
  32. package/dist/container/protocol.js +157 -0
  33. package/dist/container/protocol.js.map +1 -0
  34. package/dist/container/runtime.d.ts +140 -0
  35. package/dist/container/runtime.d.ts.map +1 -0
  36. package/dist/container/runtime.js +256 -0
  37. package/dist/container/runtime.js.map +1 -0
  38. package/dist/events/catalogue.d.ts +46 -46
  39. package/dist/events/schemas/agent.completed.v1.d.ts +4 -4
  40. package/dist/events/schemas/agent.failed.v1.d.ts +2 -2
  41. package/dist/events/schemas/agent.hitl_resolved.v1.d.ts +2 -2
  42. package/dist/events/schemas/agent.started.v1.d.ts +2 -2
  43. package/dist/events/schemas/brain.skill.extracted.v1.d.ts +4 -4
  44. package/dist/events/schemas/cc.cost.anomaly_detected.v1.d.ts +2 -2
  45. package/dist/events/schemas/cc.cost.recorded.v1.d.ts +4 -4
  46. package/dist/events/schemas/citadel.sprint.analyzed.v1.d.ts +6 -6
  47. package/dist/events/schemas/citadel.sprint.closed.v1.d.ts +2 -2
  48. package/dist/events/schemas/forge.inbox.reply_classified.v1.d.ts +6 -6
  49. package/dist/events/schemas/forge.lead.qualified.v1.d.ts +2 -2
  50. package/dist/events/schemas/forge.outreach.sent.v1.d.ts +4 -4
  51. package/dist/events/schemas/incident.detected.v1.d.ts +2 -2
  52. package/dist/events/schemas/vauban.goal.checked.v1.d.ts +2 -2
  53. package/dist/events/schemas/vauban.rebalancing.checked.v1.d.ts +2 -2
  54. package/dist/events/schemas/vauban.tax.checked.v1.d.ts +2 -2
  55. package/dist/events/schemas/vauban.vault.analyzed.v1.d.ts +6 -6
  56. package/dist/identity/agent-persona.d.ts +73 -0
  57. package/dist/identity/agent-persona.d.ts.map +1 -0
  58. package/dist/identity/agent-persona.js +165 -0
  59. package/dist/identity/agent-persona.js.map +1 -0
  60. package/dist/identity/persona-prompt.d.ts +25 -0
  61. package/dist/identity/persona-prompt.d.ts.map +1 -0
  62. package/dist/identity/persona-prompt.js +71 -0
  63. package/dist/identity/persona-prompt.js.map +1 -0
  64. package/dist/identity/persona-schema.d.ts +120 -0
  65. package/dist/identity/persona-schema.d.ts.map +1 -0
  66. package/dist/identity/persona-schema.js +103 -0
  67. package/dist/identity/persona-schema.js.map +1 -0
  68. package/dist/index.d.ts +37 -2
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +29 -1
  71. package/dist/index.js.map +1 -1
  72. package/dist/loop/minimal-loop.js +293 -287
  73. package/dist/memory/episodic-rrf.d.ts +114 -0
  74. package/dist/memory/episodic-rrf.d.ts.map +1 -0
  75. package/dist/memory/episodic-rrf.js +148 -0
  76. package/dist/memory/episodic-rrf.js.map +1 -0
  77. package/dist/mesh/attenuation.d.ts +78 -0
  78. package/dist/mesh/attenuation.d.ts.map +1 -0
  79. package/dist/mesh/attenuation.js +141 -0
  80. package/dist/mesh/attenuation.js.map +1 -0
  81. package/dist/mesh/delegate.d.ts +96 -0
  82. package/dist/mesh/delegate.d.ts.map +1 -0
  83. package/dist/mesh/delegate.js +172 -0
  84. package/dist/mesh/delegate.js.map +1 -0
  85. package/dist/mesh/dispatcher.d.ts +119 -0
  86. package/dist/mesh/dispatcher.d.ts.map +1 -0
  87. package/dist/mesh/dispatcher.js +207 -0
  88. package/dist/mesh/dispatcher.js.map +1 -0
  89. package/dist/mesh/index.d.ts +12 -0
  90. package/dist/mesh/index.d.ts.map +1 -0
  91. package/dist/mesh/index.js +11 -0
  92. package/dist/mesh/index.js.map +1 -0
  93. package/dist/mesh/types.d.ts +30 -0
  94. package/dist/mesh/types.d.ts.map +1 -0
  95. package/dist/mesh/types.js +11 -0
  96. package/dist/mesh/types.js.map +1 -0
  97. package/dist/orchestration/ooda/skills.d.ts +104 -0
  98. package/dist/orchestration/ooda/skills.d.ts.map +1 -1
  99. package/dist/orchestration/ooda/skills.js +106 -0
  100. package/dist/orchestration/ooda/skills.js.map +1 -1
  101. package/dist/ports/bastion-action.contract.test.d.ts +11 -0
  102. package/dist/ports/bastion-action.contract.test.d.ts.map +1 -0
  103. package/dist/ports/bastion-action.contract.test.js +238 -0
  104. package/dist/ports/bastion-action.contract.test.js.map +1 -0
  105. package/dist/ports/bastion-action.d.ts +133 -0
  106. package/dist/ports/bastion-action.d.ts.map +1 -0
  107. package/dist/ports/bastion-action.js +73 -0
  108. package/dist/ports/bastion-action.js.map +1 -0
  109. package/dist/ports/brain.d.ts +31 -0
  110. package/dist/ports/brain.d.ts.map +1 -1
  111. package/dist/ports/brain.js +115 -1
  112. package/dist/ports/brain.js.map +1 -1
  113. package/dist/ports/citadel-action.contract.test.d.ts +11 -0
  114. package/dist/ports/citadel-action.contract.test.d.ts.map +1 -0
  115. package/dist/ports/citadel-action.contract.test.js +317 -0
  116. package/dist/ports/citadel-action.contract.test.js.map +1 -0
  117. package/dist/ports/citadel-action.d.ts +111 -0
  118. package/dist/ports/citadel-action.d.ts.map +1 -0
  119. package/dist/ports/citadel-action.js +62 -0
  120. package/dist/ports/citadel-action.js.map +1 -0
  121. package/dist/ports/compliance-contract.d.ts +123 -0
  122. package/dist/ports/compliance-contract.d.ts.map +1 -0
  123. package/dist/ports/compliance-contract.js +35 -0
  124. package/dist/ports/compliance-contract.js.map +1 -0
  125. package/dist/ports/db.d.ts +38 -0
  126. package/dist/ports/db.d.ts.map +1 -1
  127. package/dist/ports/db.js +88 -1
  128. package/dist/ports/db.js.map +1 -1
  129. package/dist/ports/delegation.contract.test.d.ts +9 -0
  130. package/dist/ports/delegation.contract.test.d.ts.map +1 -0
  131. package/dist/ports/delegation.contract.test.js +337 -0
  132. package/dist/ports/delegation.contract.test.js.map +1 -0
  133. package/dist/ports/delegation.d.ts +134 -0
  134. package/dist/ports/delegation.d.ts.map +1 -0
  135. package/dist/ports/delegation.js +105 -0
  136. package/dist/ports/delegation.js.map +1 -0
  137. package/dist/ports/event-bus.d.ts +29 -0
  138. package/dist/ports/event-bus.d.ts.map +1 -1
  139. package/dist/ports/event-bus.js +106 -1
  140. package/dist/ports/event-bus.js.map +1 -1
  141. package/dist/ports/federation.contract.test.d.ts +9 -0
  142. package/dist/ports/federation.contract.test.d.ts.map +1 -0
  143. package/dist/ports/federation.contract.test.js +279 -0
  144. package/dist/ports/federation.contract.test.js.map +1 -0
  145. package/dist/ports/federation.d.ts +140 -0
  146. package/dist/ports/federation.d.ts.map +1 -0
  147. package/dist/ports/federation.js +57 -0
  148. package/dist/ports/federation.js.map +1 -0
  149. package/dist/ports/index.d.ts +28 -2
  150. package/dist/ports/index.d.ts.map +1 -1
  151. package/dist/ports/index.js +17 -2
  152. package/dist/ports/index.js.map +1 -1
  153. package/dist/ports/llm-provider.d.ts +37 -0
  154. package/dist/ports/llm-provider.d.ts.map +1 -1
  155. package/dist/ports/llm-provider.js +99 -1
  156. package/dist/ports/llm-provider.js.map +1 -1
  157. package/dist/ports/logger.d.ts +27 -0
  158. package/dist/ports/logger.d.ts.map +1 -1
  159. package/dist/ports/logger.js +87 -0
  160. package/dist/ports/logger.js.map +1 -1
  161. package/dist/ports/manifest-registry.contract.test.d.ts +9 -0
  162. package/dist/ports/manifest-registry.contract.test.d.ts.map +1 -0
  163. package/dist/ports/manifest-registry.contract.test.js +246 -0
  164. package/dist/ports/manifest-registry.contract.test.js.map +1 -0
  165. package/dist/ports/manifest-registry.d.ts +116 -0
  166. package/dist/ports/manifest-registry.d.ts.map +1 -0
  167. package/dist/ports/manifest-registry.js +79 -0
  168. package/dist/ports/manifest-registry.js.map +1 -0
  169. package/dist/ports/observability.contract.test.d.ts +12 -0
  170. package/dist/ports/observability.contract.test.d.ts.map +1 -0
  171. package/dist/ports/observability.contract.test.js +260 -0
  172. package/dist/ports/observability.contract.test.js.map +1 -0
  173. package/dist/ports/observability.d.ts +98 -0
  174. package/dist/ports/observability.d.ts.map +1 -0
  175. package/dist/ports/observability.js +59 -0
  176. package/dist/ports/observability.js.map +1 -0
  177. package/dist/ports/outcome.d.ts +26 -0
  178. package/dist/ports/outcome.d.ts.map +1 -1
  179. package/dist/ports/outcome.js +62 -1
  180. package/dist/ports/outcome.js.map +1 -1
  181. package/dist/ports/privacy.contract.test.d.ts +12 -0
  182. package/dist/ports/privacy.contract.test.d.ts.map +1 -0
  183. package/dist/ports/privacy.contract.test.js +325 -0
  184. package/dist/ports/privacy.contract.test.js.map +1 -0
  185. package/dist/ports/privacy.d.ts +132 -0
  186. package/dist/ports/privacy.d.ts.map +1 -0
  187. package/dist/ports/privacy.js +83 -0
  188. package/dist/ports/privacy.js.map +1 -0
  189. package/dist/ports/tenant-context.contract.test.d.ts +14 -0
  190. package/dist/ports/tenant-context.contract.test.d.ts.map +1 -0
  191. package/dist/ports/tenant-context.contract.test.js +352 -0
  192. package/dist/ports/tenant-context.contract.test.js.map +1 -0
  193. package/dist/ports/tenant-context.d.ts +103 -0
  194. package/dist/ports/tenant-context.d.ts.map +1 -0
  195. package/dist/ports/tenant-context.js +48 -0
  196. package/dist/ports/tenant-context.js.map +1 -0
  197. package/dist/ports/vauban-finance-action.contract.test.d.ts +11 -0
  198. package/dist/ports/vauban-finance-action.contract.test.d.ts.map +1 -0
  199. package/dist/ports/vauban-finance-action.contract.test.js +260 -0
  200. package/dist/ports/vauban-finance-action.contract.test.js.map +1 -0
  201. package/dist/ports/vauban-finance-action.d.ts +106 -0
  202. package/dist/ports/vauban-finance-action.d.ts.map +1 -0
  203. package/dist/ports/vauban-finance-action.js +60 -0
  204. package/dist/ports/vauban-finance-action.js.map +1 -0
  205. package/dist/ports/workflow-runtime.d.ts +204 -0
  206. package/dist/ports/workflow-runtime.d.ts.map +1 -0
  207. package/dist/ports/workflow-runtime.js +72 -0
  208. package/dist/ports/workflow-runtime.js.map +1 -0
  209. package/dist/proof/cert-verify.d.ts +80 -0
  210. package/dist/proof/cert-verify.d.ts.map +1 -0
  211. package/dist/proof/cert-verify.js +178 -0
  212. package/dist/proof/cert-verify.js.map +1 -0
  213. package/dist/replay/replay.d.ts.map +1 -1
  214. package/dist/replay/replay.js +5 -1
  215. package/dist/replay/replay.js.map +1 -1
  216. package/dist/retry/index.d.ts +129 -0
  217. package/dist/retry/index.d.ts.map +1 -0
  218. package/dist/retry/index.js +156 -0
  219. package/dist/retry/index.js.map +1 -0
  220. package/dist/retry/presets.d.ts +39 -0
  221. package/dist/retry/presets.d.ts.map +1 -0
  222. package/dist/retry/presets.js +69 -0
  223. package/dist/retry/presets.js.map +1 -0
  224. package/dist/skill-loop/ab-runner.d.ts +67 -0
  225. package/dist/skill-loop/ab-runner.d.ts.map +1 -0
  226. package/dist/skill-loop/ab-runner.js +160 -0
  227. package/dist/skill-loop/ab-runner.js.map +1 -0
  228. package/dist/skill-loop/adoption.d.ts +67 -0
  229. package/dist/skill-loop/adoption.d.ts.map +1 -0
  230. package/dist/skill-loop/adoption.js +126 -0
  231. package/dist/skill-loop/adoption.js.map +1 -0
  232. package/dist/skill-loop/candidate.d.ts +45 -0
  233. package/dist/skill-loop/candidate.d.ts.map +1 -0
  234. package/dist/skill-loop/candidate.js +43 -0
  235. package/dist/skill-loop/candidate.js.map +1 -0
  236. package/dist/skill-loop/evaluator.d.ts +42 -0
  237. package/dist/skill-loop/evaluator.d.ts.map +1 -0
  238. package/dist/skill-loop/evaluator.js +184 -0
  239. package/dist/skill-loop/evaluator.js.map +1 -0
  240. package/dist/skill-loop/index.d.ts +27 -0
  241. package/dist/skill-loop/index.d.ts.map +1 -0
  242. package/dist/skill-loop/index.js +27 -0
  243. package/dist/skill-loop/index.js.map +1 -0
  244. package/dist/skill-loop/reflexion-replay.d.ts +87 -0
  245. package/dist/skill-loop/reflexion-replay.d.ts.map +1 -0
  246. package/dist/skill-loop/reflexion-replay.js +110 -0
  247. package/dist/skill-loop/reflexion-replay.js.map +1 -0
  248. package/dist/skill-loop/sign-off.d.ts +88 -0
  249. package/dist/skill-loop/sign-off.d.ts.map +1 -0
  250. package/dist/skill-loop/sign-off.js +146 -0
  251. package/dist/skill-loop/sign-off.js.map +1 -0
  252. package/dist/skill-loop/value-metric.d.ts +55 -0
  253. package/dist/skill-loop/value-metric.d.ts.map +1 -0
  254. package/dist/skill-loop/value-metric.js +69 -0
  255. package/dist/skill-loop/value-metric.js.map +1 -0
  256. package/dist/skill-loop/versioning.d.ts +36 -0
  257. package/dist/skill-loop/versioning.d.ts.map +1 -0
  258. package/dist/skill-loop/versioning.js +47 -0
  259. package/dist/skill-loop/versioning.js.map +1 -0
  260. package/dist/skill-manifest/anchor.d.ts +91 -0
  261. package/dist/skill-manifest/anchor.d.ts.map +1 -0
  262. package/dist/skill-manifest/anchor.js +331 -0
  263. package/dist/skill-manifest/anchor.js.map +1 -0
  264. package/dist/skill-manifest/builder.d.ts +47 -0
  265. package/dist/skill-manifest/builder.d.ts.map +1 -0
  266. package/dist/skill-manifest/builder.js +93 -0
  267. package/dist/skill-manifest/builder.js.map +1 -0
  268. package/dist/skill-manifest/index.d.ts +13 -0
  269. package/dist/skill-manifest/index.d.ts.map +1 -0
  270. package/dist/skill-manifest/index.js +9 -0
  271. package/dist/skill-manifest/index.js.map +1 -0
  272. package/dist/skill-manifest/types.d.ts +67 -0
  273. package/dist/skill-manifest/types.d.ts.map +1 -0
  274. package/dist/skill-manifest/types.js +16 -0
  275. package/dist/skill-manifest/types.js.map +1 -0
  276. package/dist/skill-manifest/verifier.d.ts +42 -0
  277. package/dist/skill-manifest/verifier.d.ts.map +1 -0
  278. package/dist/skill-manifest/verifier.js +136 -0
  279. package/dist/skill-manifest/verifier.js.map +1 -0
  280. package/dist/skills/brain-query.d.ts +4 -4
  281. package/dist/skills/brain-store.d.ts +6 -6
  282. package/dist/skills/errors.d.ts +15 -0
  283. package/dist/skills/errors.d.ts.map +1 -1
  284. package/dist/skills/errors.js +21 -0
  285. package/dist/skills/errors.js.map +1 -1
  286. package/dist/skills/hitl-request.d.ts +2 -2
  287. package/dist/skills/index.d.ts +3 -1
  288. package/dist/skills/index.d.ts.map +1 -1
  289. package/dist/skills/index.js +4 -1
  290. package/dist/skills/index.js.map +1 -1
  291. package/dist/skills/markdown/loader.d.ts +52 -0
  292. package/dist/skills/markdown/loader.d.ts.map +1 -0
  293. package/dist/skills/markdown/loader.js +93 -0
  294. package/dist/skills/markdown/loader.js.map +1 -0
  295. package/dist/skills/markdown/schema.d.ts +432 -0
  296. package/dist/skills/markdown/schema.d.ts.map +1 -0
  297. package/dist/skills/markdown/schema.js +121 -0
  298. package/dist/skills/markdown/schema.js.map +1 -0
  299. package/dist/skills/poc-md-loader/markdown-loader.d.ts +77 -0
  300. package/dist/skills/poc-md-loader/markdown-loader.d.ts.map +1 -0
  301. package/dist/skills/poc-md-loader/markdown-loader.js +125 -0
  302. package/dist/skills/poc-md-loader/markdown-loader.js.map +1 -0
  303. package/dist/skills/poc-md-loader/runner.d.ts +24 -0
  304. package/dist/skills/poc-md-loader/runner.d.ts.map +1 -0
  305. package/dist/skills/poc-md-loader/runner.js +57 -0
  306. package/dist/skills/poc-md-loader/runner.js.map +1 -0
  307. package/dist/skills/poc-md-loader/vitest.poc.config.d.ts +3 -0
  308. package/dist/skills/poc-md-loader/vitest.poc.config.d.ts.map +1 -0
  309. package/dist/skills/poc-md-loader/vitest.poc.config.js +13 -0
  310. package/dist/skills/poc-md-loader/vitest.poc.config.js.map +1 -0
  311. package/dist/skills/poc-md-loader/web-search/script.d.ts +33 -0
  312. package/dist/skills/poc-md-loader/web-search/script.d.ts.map +1 -0
  313. package/dist/skills/poc-md-loader/web-search/script.js +75 -0
  314. package/dist/skills/poc-md-loader/web-search/script.js.map +1 -0
  315. package/dist/skills/record-outcome.d.ts +4 -4
  316. package/dist/skills/send-email.d.ts.map +1 -1
  317. package/dist/skills/send-email.js +15 -3
  318. package/dist/skills/send-email.js.map +1 -1
  319. package/dist/skills/slack-notify.d.ts +4 -4
  320. package/dist/skills/starknet-balance.d.ts +1 -1
  321. package/dist/skills/telegram-notify.d.ts +4 -4
  322. package/dist/skills/web-search.d.ts +1 -1
  323. package/dist/testing/index.d.ts +3 -0
  324. package/dist/testing/test-brain-port.d.ts +4 -0
  325. package/dist/testing/test-brain-port.d.ts.map +1 -1
  326. package/dist/testing/test-brain-port.js +75 -20
  327. package/dist/testing/test-brain-port.js.map +1 -1
  328. package/dist/testing/test-event-bus.d.ts.map +1 -1
  329. package/dist/testing/test-event-bus.js +89 -36
  330. package/dist/testing/test-event-bus.js.map +1 -1
  331. package/dist/trace/schema.d.ts +1 -1
  332. package/dist/trace/schema.d.ts.map +1 -1
  333. package/dist/trace/schema.js +1 -1
  334. package/dist/trace/schema.js.map +1 -1
  335. package/dist/verify/formal/index.d.ts +44 -0
  336. package/dist/verify/formal/index.d.ts.map +1 -0
  337. package/dist/verify/formal/index.js +98 -0
  338. package/dist/verify/formal/index.js.map +1 -0
  339. package/dist/verify/formal/policy.d.ts +105 -0
  340. package/dist/verify/formal/policy.d.ts.map +1 -0
  341. package/dist/verify/formal/policy.js +159 -0
  342. package/dist/verify/formal/policy.js.map +1 -0
  343. package/dist/verify/formal/result.d.ts +50 -0
  344. package/dist/verify/formal/result.d.ts.map +1 -0
  345. package/dist/verify/formal/result.js +21 -0
  346. package/dist/verify/formal/result.js.map +1 -0
  347. package/dist/verify/formal/solver.d.ts +67 -0
  348. package/dist/verify/formal/solver.d.ts.map +1 -0
  349. package/dist/verify/formal/solver.js +184 -0
  350. package/dist/verify/formal/solver.js.map +1 -0
  351. package/dist/verify/formal/spec-language.d.ts +80 -0
  352. package/dist/verify/formal/spec-language.d.ts.map +1 -0
  353. package/dist/verify/formal/spec-language.js +219 -0
  354. package/dist/verify/formal/spec-language.js.map +1 -0
  355. package/docs/attestation.md +199 -0
  356. package/docs/identity.md +193 -0
  357. package/package.json +34 -17
  358. package/src/adapters/llm/anthropic-direct.ts +51 -0
  359. package/src/adapters/llm/cascade.ts +64 -19
  360. package/src/adapters/llm/litellm.ts +49 -0
  361. package/src/compute/difficulty-estimator.ts +111 -0
  362. package/src/compute/strategies/mixture-of-agents.ts +150 -0
  363. package/src/compute/strategies/tree-of-thoughts.ts +293 -0
  364. package/src/compute/strategies/two-phase-orient.ts +147 -0
  365. package/src/container/protocol.ts +243 -0
  366. package/src/container/runtime.ts +424 -0
  367. package/src/db/migrations/026_formal_verify_results.sql +30 -0
  368. package/src/identity/agent-persona.ts +203 -0
  369. package/src/identity/persona-prompt.ts +84 -0
  370. package/src/identity/persona-schema.ts +127 -0
  371. package/src/index.ts +338 -1
  372. package/src/memory/episodic-rrf.ts +224 -0
  373. package/src/mesh/attenuation.ts +190 -0
  374. package/src/mesh/delegate.ts +254 -0
  375. package/src/mesh/dispatcher.ts +301 -0
  376. package/src/mesh/index.ts +39 -0
  377. package/src/mesh/types.ts +31 -0
  378. package/src/orchestration/ooda/skills.ts +177 -0
  379. package/src/ports/bastion-action.contract.test.ts +355 -0
  380. package/src/ports/bastion-action.ts +198 -0
  381. package/src/ports/brain.ts +177 -15
  382. package/src/ports/citadel-action.contract.test.ts +430 -0
  383. package/src/ports/citadel-action.ts +174 -0
  384. package/src/ports/compliance-contract.ts +191 -0
  385. package/src/ports/db.ts +98 -0
  386. package/src/ports/delegation.contract.test.ts +428 -0
  387. package/src/ports/delegation.ts +211 -0
  388. package/src/ports/event-bus.ts +133 -0
  389. package/src/ports/federation.contract.test.ts +355 -0
  390. package/src/ports/federation.ts +190 -0
  391. package/src/ports/index.ts +186 -1
  392. package/src/ports/llm-provider.ts +123 -0
  393. package/src/ports/logger.ts +104 -0
  394. package/src/ports/manifest-registry.contract.test.ts +324 -0
  395. package/src/ports/manifest-registry.ts +188 -0
  396. package/src/ports/observability.contract.test.ts +315 -0
  397. package/src/ports/observability.ts +150 -0
  398. package/src/ports/outcome.ts +69 -0
  399. package/src/ports/privacy.contract.test.ts +413 -0
  400. package/src/ports/privacy.ts +207 -0
  401. package/src/ports/tenant-context.contract.test.ts +454 -0
  402. package/src/ports/tenant-context.ts +150 -0
  403. package/src/ports/vauban-finance-action.contract.test.ts +335 -0
  404. package/src/ports/vauban-finance-action.ts +166 -0
  405. package/src/ports/workflow-runtime.ts +327 -0
  406. package/src/proof/cert-verify.ts +249 -0
  407. package/src/replay/replay.ts +11 -8
  408. package/src/retry/index.ts +227 -0
  409. package/src/retry/presets.ts +75 -0
  410. package/src/skill-loop/ab-runner.ts +196 -0
  411. package/src/skill-loop/adoption.ts +188 -0
  412. package/src/skill-loop/candidate.ts +75 -0
  413. package/src/skill-loop/evaluator.ts +238 -0
  414. package/src/skill-loop/index.ts +51 -0
  415. package/src/skill-loop/reflexion-replay.ts +173 -0
  416. package/src/skill-loop/sign-off.ts +247 -0
  417. package/src/skill-loop/value-metric.ts +120 -0
  418. package/src/skill-loop/versioning.ts +75 -0
  419. package/src/skill-manifest/anchor.ts +401 -0
  420. package/src/skill-manifest/builder.ts +129 -0
  421. package/src/skill-manifest/index.ts +18 -0
  422. package/src/skill-manifest/types.ts +72 -0
  423. package/src/skill-manifest/verifier.ts +198 -0
  424. package/src/skills/errors.ts +30 -2
  425. package/src/skills/index.ts +19 -0
  426. package/src/skills/markdown/loader.ts +129 -0
  427. package/src/skills/markdown/schema.ts +144 -0
  428. package/src/skills/poc-md-loader/e2e-parity.test.ts +237 -0
  429. package/src/skills/poc-md-loader/markdown-loader.ts +161 -0
  430. package/src/skills/poc-md-loader/runner.ts +82 -0
  431. package/src/skills/poc-md-loader/vitest.poc.config.ts +13 -0
  432. package/src/skills/poc-md-loader/web-search/SKILL.md +42 -0
  433. package/src/skills/poc-md-loader/web-search/script.ts +109 -0
  434. package/src/skills/send-email.ts +15 -3
  435. package/src/testing/test-brain-port.ts +98 -24
  436. package/src/testing/test-event-bus.ts +104 -43
  437. package/src/trace/schema.ts +1 -1
  438. package/src/verify/formal/index.ts +154 -0
  439. package/src/verify/formal/policy.ts +253 -0
  440. package/src/verify/formal/result.ts +52 -0
  441. package/src/verify/formal/solver.ts +235 -0
  442. package/src/verify/formal/spec-language.ts +274 -0
@@ -1 +1 @@
1
- {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/ports/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,MAAM,WAAW,UAAU;IACzB,8DAA8D;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,WAAW,EAAE,KAAK,CAAC;IACnB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAID;;;GAGG;AACH,MAAM,MAAM,WAAW,GACnB,OAAO,GACP,QAAQ,GACR,gBAAgB,GAChB,OAAO,GACP,SAAS,GACT,QAAQ,GACR,IAAI,GACJ,QAAQ,CAAC;AAEb;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,MAAM,EAAE,WAAW,CAAC;IACpB,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,aAAa,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,OAAO,EAAE,CAAC,CAAC;IACX;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,yFAAyF;AACzF,MAAM,WAAW,YAAY;IAC3B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAID,MAAM,WAAW,YAAY;IAC3B;;;;;;;;OAQG;IACH,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1D;;;;;;;;;;;OAWG;IACH,sBAAsB,CAAC,CAAC,EACtB,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EACxC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,CAAC,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,EACjD,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GACxC,YAAY,CAAC;IAEhB;;;;;;OAMG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAE1E;;OAEG;IACH,GAAG,IAAI;QACL,qCAAqC;QACrC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;QACzB,6DAA6D;QAC7D,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACxC,CAAC;IAEF;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtE"}
1
+ {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/ports/event-bus.ts"],"names":[],"mappings":"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"}
@@ -19,7 +19,112 @@
19
19
  * ADR-ECO-017: Cross-product events MUST carry a DomainEvent signature.
20
20
  * Use DomainEvent for inter-product events and CloudEvent for intra-product.
21
21
  *
22
+ * OTel instrumentation: import { createTracedEventBusPort } to wrap any
23
+ * EventBusPort implementation with OpenTelemetry spans per publish/subscribe call.
24
+ * Gracefully degrades to noop spans when no OTel SDK is installed.
25
+ *
22
26
  * @public
23
27
  */
24
- export {};
28
+ // ─── Typed errors ─────────────────────────────────────────────────────────────
29
+ /**
30
+ * Thrown when an event could not be published to Redis (connection lost,
31
+ * stream key conflict, or OOM on XADD). The original event is available
32
+ * for retry or DLQ routing.
33
+ */
34
+ export class EventPublishError extends Error {
35
+ cause;
36
+ /** The stream key the event was targeting. */
37
+ stream;
38
+ /** The event id (UUIDv7) that failed to publish. */
39
+ eventId;
40
+ constructor(message, stream, eventId, cause) {
41
+ super(message);
42
+ this.cause = cause;
43
+ this.name = "EventPublishError";
44
+ this.stream = stream;
45
+ this.eventId = eventId;
46
+ Object.setPrototypeOf(this, new.target.prototype);
47
+ }
48
+ }
49
+ import { SpanStatusCode, trace } from "@opentelemetry/api";
50
+ const PORT_TRACER = trace.getTracer("vauban-agent-sdk.ports", "0.1.0");
51
+ /**
52
+ * Wrap any EventBusPort implementation with OTel spans.
53
+ * Publishes and subscribeDomain calls each get a span with the event type
54
+ * and stream as attributes. Gracefully degrades to noop spans when no OTel
55
+ * SDK is installed.
56
+ *
57
+ * Usage:
58
+ * const raw: EventBusPort = buildRedisEventBus(...);
59
+ * const traced = createTracedEventBusPort(raw);
60
+ * await traced.publish(event, "vault.events") // emits "event-bus.publish" span
61
+ */
62
+ export function createTracedEventBusPort(impl) {
63
+ function spanName(op) {
64
+ return `event-bus.${op}`;
65
+ }
66
+ return {
67
+ async publish(event, stream) {
68
+ return PORT_TRACER.startActiveSpan(spanName("publish"), {
69
+ attributes: {
70
+ "event.type": event.type,
71
+ "event.stream": stream,
72
+ "event.id": event.id,
73
+ "vauban.port.name": "event-bus",
74
+ },
75
+ }, async (span) => {
76
+ try {
77
+ await impl.publish(event, stream);
78
+ span.setStatus({ code: SpanStatusCode.OK });
79
+ }
80
+ catch (err) {
81
+ const message = err instanceof Error ? err.message : String(err);
82
+ span.setStatus({ code: SpanStatusCode.ERROR, message });
83
+ if (err instanceof Error)
84
+ span.recordException(err);
85
+ throw err;
86
+ }
87
+ finally {
88
+ span.end();
89
+ }
90
+ });
91
+ },
92
+ async publishWithIdempotency(event, key) {
93
+ return PORT_TRACER.startActiveSpan(spanName("publishWithIdempotency"), {
94
+ attributes: {
95
+ "event.type": event.type,
96
+ "event.idempotency_key": key,
97
+ "vauban.port.name": "event-bus",
98
+ },
99
+ }, async (span) => {
100
+ try {
101
+ await impl.publishWithIdempotency(event, key);
102
+ span.setStatus({ code: SpanStatusCode.OK });
103
+ }
104
+ catch (err) {
105
+ const message = err instanceof Error ? err.message : String(err);
106
+ span.setStatus({ code: SpanStatusCode.ERROR, message });
107
+ if (err instanceof Error)
108
+ span.recordException(err);
109
+ throw err;
110
+ }
111
+ finally {
112
+ span.end();
113
+ }
114
+ });
115
+ },
116
+ subscribeDomain(eventType, handler, opts) {
117
+ return impl.subscribeDomain(eventType, handler, opts);
118
+ },
119
+ replayFrom(streamKey, fromId) {
120
+ return impl.replayFrom(streamKey, fromId);
121
+ },
122
+ dlq() {
123
+ return impl.dlq();
124
+ },
125
+ pendingCount(stream, consumerGroup) {
126
+ return impl.pendingCount(stream, consumerGroup);
127
+ },
128
+ };
129
+ }
25
130
  //# sourceMappingURL=event-bus.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/ports/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG"}
1
+ {"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/ports/event-bus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * FederationPort contract tests (S4 spec).
3
+ *
4
+ * Applied to any FederationPort implementation.
5
+ * Verifies: send→receive roundtrip, signature verification, delegation chain preservation,
6
+ * consistent hash routing determinism, replay protection via nonce.
7
+ */
8
+ export declare const federationPortContract: (factory: () => any) => void;
9
+ //# sourceMappingURL=federation.contract.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation.contract.test.d.ts","sourceRoot":"","sources":["../../src/ports/federation.contract.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA2FH,eAAO,MAAM,sBAAsB,GAAI,SAAS,MAAM,GAAG,SA0NxD,CAAC"}
@@ -0,0 +1,279 @@
1
+ /**
2
+ * FederationPort contract tests (S4 spec).
3
+ *
4
+ * Applied to any FederationPort implementation.
5
+ * Verifies: send→receive roundtrip, signature verification, delegation chain preservation,
6
+ * consistent hash routing determinism, replay protection via nonce.
7
+ */
8
+ import { describe, expect, test } from "vitest";
9
+ import { FederationSignatureInvalidError, FederationDelegationChainError, FederationMessageExpiredError, } from "./federation.js";
10
+ /**
11
+ * Factory function to create a minimal valid FederationMessage for testing.
12
+ */
13
+ function makeFederationMessage(overrides = {}) {
14
+ const now = new Date().toISOString();
15
+ const expiresAt = new Date(Date.now() + 86400000).toISOString(); // +24h
16
+ const header = {
17
+ message_id: crypto.randomUUID(),
18
+ from_agent: {
19
+ agent_id: "vauban.cc.test@v1.0",
20
+ tenant_id: "test-tenant-1",
21
+ agent_card_url: "https://example.com/cards/test-agent",
22
+ },
23
+ to_agent: {
24
+ agent_id: "vauban.cc.receiver@v1.0",
25
+ tenant_id: "test-tenant-2",
26
+ },
27
+ correlation_id: crypto.randomUUID(),
28
+ timestamp: now,
29
+ nonce: crypto.getRandomValues(new Uint8Array(32)).toString(),
30
+ };
31
+ const contentClaim = {
32
+ subject: `digest:${header.message_id}`,
33
+ predicate: {
34
+ domain: "vauban.federation.message.v1",
35
+ body: {
36
+ action: "test_message",
37
+ payload: { test_data: "hello world" },
38
+ },
39
+ },
40
+ evidence: {
41
+ proof: "ed25519_" + crypto.randomUUID().replace(/-/g, "").slice(0, 32),
42
+ public_inputs: {
43
+ from_agent: header.from_agent.agent_id,
44
+ to_agent: header.to_agent.agent_id,
45
+ },
46
+ },
47
+ temporal_frame: {
48
+ not_before: now,
49
+ not_after: expiresAt,
50
+ revoked_at: null,
51
+ },
52
+ revelation_mask: {
53
+ disclosed: ["/subject", "/predicate", "/temporal_frame"],
54
+ committed: [],
55
+ },
56
+ anchor: [
57
+ {
58
+ chain: "StarknetMainnet",
59
+ tx_hash: "0x" + crypto.randomUUID().replace(/-/g, "").slice(0, 32),
60
+ },
61
+ ],
62
+ };
63
+ const transport = {
64
+ protocol: "mcp",
65
+ version: "1.0.0",
66
+ jws_signature: "eyJ" +
67
+ crypto.randomUUID().replace(/-/g, "").slice(0, 48) +
68
+ ".payload.signature",
69
+ };
70
+ return {
71
+ id: header.message_id,
72
+ header,
73
+ content_claim: contentClaim,
74
+ transport,
75
+ ...overrides,
76
+ };
77
+ }
78
+ export const federationPortContract = (factory) => {
79
+ describe("FederationPort contract", () => {
80
+ test("send→receive roundtrip delivers message to destination tenant", async () => {
81
+ const port = factory();
82
+ const msg = makeFederationMessage();
83
+ // Send message
84
+ const msgId = await port.send(msg);
85
+ expect(msgId).toBe(msg.id);
86
+ // Receive should deliver it to the destination tenant
87
+ const received = await port.receive({
88
+ destinationTenantId: msg.header.to_agent.tenant_id,
89
+ timeout: 2000,
90
+ });
91
+ expect(received.length).toBeGreaterThan(0);
92
+ const deliveredMsg = received.find((m) => m.id === msg.id);
93
+ expect(deliveredMsg).toBeDefined();
94
+ expect(deliveredMsg?.header.to_agent.tenant_id).toBe(msg.header.to_agent.tenant_id);
95
+ });
96
+ test("verifyMessage rejects tampered signature", async () => {
97
+ const port = factory();
98
+ const msg = makeFederationMessage();
99
+ // Tamper with the signature
100
+ const tamperedMsg = {
101
+ ...msg,
102
+ transport: {
103
+ ...msg.transport,
104
+ jws_signature: "invalid_signature_header.payload.signature",
105
+ },
106
+ };
107
+ const result = await port.verifyMessage(tamperedMsg);
108
+ expect(result.valid).toBe(false);
109
+ expect(result.errors.length).toBeGreaterThan(0);
110
+ });
111
+ test("verifyMessage accepts valid message signature and structure", async () => {
112
+ const port = factory();
113
+ const msg = makeFederationMessage();
114
+ // For this test, we mock a proper signature check
115
+ // In real implementation, this would verify Ed25519
116
+ const result = await port.verifyMessage(msg);
117
+ // Result should indicate validation (or require real crypto)
118
+ // This test is structural — real crypto is adapter responsibility
119
+ expect(result.signer_agent_id).toBeDefined();
120
+ });
121
+ test("delegation chain narrowing is preserved (R-1 invariant)", async () => {
122
+ const port = factory();
123
+ // Message with delegation chain showing authority narrowing
124
+ const msg = makeFederationMessage({
125
+ delegation_chain: [
126
+ {
127
+ id: crypto.randomUUID(),
128
+ parent_id: undefined,
129
+ scope: {
130
+ capabilities: ["read", "write"],
131
+ constraints: [],
132
+ jurisdictions: ["EU.v1"],
133
+ expires_at: new Date(Date.now() + 86400000).toISOString(),
134
+ },
135
+ ed25519_sig: "sig1",
136
+ ttl: 86400,
137
+ issuer: "root-agent",
138
+ holder: "intermediate-agent",
139
+ },
140
+ {
141
+ id: crypto.randomUUID(),
142
+ parent_id: "parent1",
143
+ scope: {
144
+ capabilities: ["read"], // narrowed from ["read", "write"]
145
+ constraints: [],
146
+ jurisdictions: ["EU.v1"],
147
+ expires_at: new Date(Date.now() + 86400000).toISOString(),
148
+ },
149
+ ed25519_sig: "sig2",
150
+ ttl: 86400,
151
+ issuer: "intermediate-agent",
152
+ holder: "delegated-agent",
153
+ },
154
+ ],
155
+ });
156
+ // Send and verify
157
+ const msgId = await port.send(msg);
158
+ expect(msgId).toBe(msg.id);
159
+ const result = await port.verifyMessage(msg);
160
+ // Delegation chain should be preserved
161
+ expect(result.chain_depth).toBe(2);
162
+ });
163
+ test("routing by consistent hash is deterministic", async () => {
164
+ const port = factory();
165
+ // Two messages from same tenant should hash to same node
166
+ const msg1 = makeFederationMessage({
167
+ header: {
168
+ ...makeFederationMessage().header,
169
+ message_id: "msg-1",
170
+ },
171
+ });
172
+ const msg2 = makeFederationMessage({
173
+ header: {
174
+ ...makeFederationMessage().header,
175
+ message_id: "msg-2",
176
+ to_agent: { ...msg1.header.to_agent }, // same dest tenant
177
+ },
178
+ });
179
+ // Both sent to same tenant
180
+ await port.send(msg1);
181
+ await port.send(msg2);
182
+ // Receive from that tenant — both should arrive
183
+ const received = await port.receive({
184
+ destinationTenantId: msg1.header.to_agent.tenant_id,
185
+ maxMessages: 10,
186
+ timeout: 1000,
187
+ });
188
+ const ids = received.map((m) => m.id);
189
+ expect(ids).toContain("msg-1");
190
+ expect(ids).toContain("msg-2");
191
+ });
192
+ test("expired message is rejected by verifyMessage", async () => {
193
+ const port = factory();
194
+ const now = new Date();
195
+ const expired = new Date(now.getTime() - 3600000); // 1h ago
196
+ const msg = makeFederationMessage({
197
+ content_claim: {
198
+ ...makeFederationMessage().content_claim,
199
+ temporal_frame: {
200
+ not_before: new Date(now.getTime() - 7200000).toISOString(),
201
+ not_after: expired.toISOString(),
202
+ revoked_at: null,
203
+ },
204
+ },
205
+ });
206
+ const result = await port.verifyMessage(msg);
207
+ expect(result.valid).toBe(false);
208
+ expect(result.errors.some((e) => e.includes("expired"))).toBe(true);
209
+ });
210
+ test("ack marks message as consumed and prevents redelivery", async () => {
211
+ const port = factory();
212
+ const msg = makeFederationMessage();
213
+ await port.send(msg);
214
+ // First receive
215
+ let received = await port.receive({
216
+ destinationTenantId: msg.header.to_agent.tenant_id,
217
+ timeout: 1000,
218
+ });
219
+ expect(received.length).toBeGreaterThan(0);
220
+ const msgId = received[0].id;
221
+ // Ack it
222
+ await port.ack(msgId);
223
+ // Second receive should NOT return the same message
224
+ received = await port.receive({
225
+ destinationTenantId: msg.header.to_agent.tenant_id,
226
+ timeout: 500,
227
+ });
228
+ const acked = received.find((m) => m.id === msgId);
229
+ expect(acked).toBeUndefined();
230
+ });
231
+ test("nack returns message to queue (max 3 attempts)", async () => {
232
+ const port = factory();
233
+ const msg = makeFederationMessage();
234
+ await port.send(msg);
235
+ const received = await port.receive({
236
+ destinationTenantId: msg.header.to_agent.tenant_id,
237
+ timeout: 1000,
238
+ });
239
+ expect(received.length).toBeGreaterThan(0);
240
+ const msgId = received[0].id;
241
+ // Nack it (1st time)
242
+ await port.nack(msgId, "retry");
243
+ // Should reappear in next receive
244
+ const redelivered = await port.receive({
245
+ destinationTenantId: msg.header.to_agent.tenant_id,
246
+ timeout: 1000,
247
+ });
248
+ const redeliveredMsg = redelivered.find((m) => m.id === msgId);
249
+ expect(redeliveredMsg).toBeDefined();
250
+ });
251
+ });
252
+ };
253
+ // ─── Apply contract to test implementations ────────────────────────────────
254
+ // Placeholder: real implementations will hook this up
255
+ // federationPortContract(() => new MyFederationPortImpl());
256
+ // ─── Error type tests ─────────────────────────────────────────────────────
257
+ describe("FederationPort — error types", () => {
258
+ test("FederationSignatureInvalidError captures messageId and reason", () => {
259
+ const err = new FederationSignatureInvalidError("msg-123", "Ed25519 verification failed");
260
+ expect(err.messageId).toBe("msg-123");
261
+ expect(err.reason).toContain("Ed25519");
262
+ expect(err.name).toBe("FederationSignatureInvalidError");
263
+ });
264
+ test("FederationDelegationChainError captures depth and reason", () => {
265
+ const err = new FederationDelegationChainError("msg-456", 3, "Narrowing invariant violated");
266
+ expect(err.messageId).toBe("msg-456");
267
+ expect(err.chainDepth).toBe(3);
268
+ expect(err.reason).toContain("Narrowing");
269
+ expect(err.name).toBe("FederationDelegationChainError");
270
+ });
271
+ test("FederationMessageExpiredError captures temporal bounds", () => {
272
+ const notAfter = "2025-01-01T00:00:00Z";
273
+ const err = new FederationMessageExpiredError("msg-789", notAfter);
274
+ expect(err.messageId).toBe("msg-789");
275
+ expect(err.notAfter).toBe(notAfter);
276
+ expect(err.name).toBe("FederationMessageExpiredError");
277
+ });
278
+ });
279
+ //# sourceMappingURL=federation.contract.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation.contract.test.js","sourceRoot":"","sources":["../../src/ports/federation.contract.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * FederationPort — agent-to-agent messaging with cryptographic provenance (S4 spec).
3
+ *
4
+ * Implements A2A v1.0 transport (JWS RFC 7515) superset with Vauban Claim sextuplet
5
+ * payload. Messages routed by consistent hashing on tenant_id. Delegation chains preserved.
6
+ * Ed25519 signatures over CBOR canonical encoding.
7
+ *
8
+ * Spec: docs/plans/PreCarre/canonical/specs/S4.md
9
+ */
10
+ export type Protocol = "mcp" | "a2a-jsonrpc" | "a2a-grpc" | "http-gateway";
11
+ export interface AgentRef {
12
+ readonly agent_id: string;
13
+ readonly tenant_id: string;
14
+ readonly agent_card_url?: string;
15
+ }
16
+ export interface FederationMessageHeader {
17
+ readonly message_id: string;
18
+ readonly from_agent: AgentRef;
19
+ readonly to_agent: AgentRef;
20
+ readonly correlation_id: string;
21
+ readonly causation_id?: string;
22
+ readonly timestamp: string;
23
+ readonly nonce: string;
24
+ }
25
+ export interface TransportMeta {
26
+ readonly protocol: Protocol;
27
+ readonly version: string;
28
+ readonly jws_signature: string;
29
+ }
30
+ /**
31
+ * Content claim payload — Vauban Claim sextuplet.
32
+ * Domain normalized to "vauban.federation.message.v1" for all S4 messages.
33
+ */
34
+ export interface ContentClaim {
35
+ readonly subject: string;
36
+ readonly predicate: {
37
+ readonly domain: "vauban.federation.message.v1";
38
+ readonly body: Record<string, unknown>;
39
+ };
40
+ readonly evidence: {
41
+ readonly proof: string;
42
+ readonly public_inputs: Record<string, unknown>;
43
+ };
44
+ readonly temporal_frame: {
45
+ readonly not_before: string;
46
+ readonly not_after: string;
47
+ readonly revoked_at?: string | null;
48
+ };
49
+ readonly revelation_mask: {
50
+ readonly disclosed: string[];
51
+ readonly committed: string[];
52
+ };
53
+ readonly anchor: ReadonlyArray<{
54
+ readonly chain: "StarknetMainnet" | "StarknetL3Glacis";
55
+ readonly tx_hash?: string;
56
+ }>;
57
+ }
58
+ export interface FederationMessage {
59
+ readonly id: string;
60
+ readonly header: FederationMessageHeader;
61
+ readonly content_claim: ContentClaim;
62
+ readonly transport: TransportMeta;
63
+ readonly delegation_chain?: ReadonlyArray<{
64
+ readonly id: string;
65
+ readonly parent_id?: string;
66
+ readonly scope: {
67
+ readonly capabilities: ReadonlyArray<string>;
68
+ readonly constraints: ReadonlyArray<unknown>;
69
+ readonly jurisdictions: ReadonlyArray<string>;
70
+ readonly expires_at: string;
71
+ };
72
+ readonly ed25519_sig: string;
73
+ }>;
74
+ }
75
+ export type MessageId = string;
76
+ export interface VerifyResult {
77
+ readonly valid: boolean;
78
+ readonly errors: string[];
79
+ readonly signer_agent_id?: string;
80
+ readonly chain_depth?: number;
81
+ }
82
+ export interface ReceiveOpts {
83
+ readonly destinationTenantId?: string;
84
+ readonly timeout?: number;
85
+ readonly maxMessages?: number;
86
+ }
87
+ export interface FederationPort {
88
+ /**
89
+ * Send a message to another agent.
90
+ * Message is JWS-signed and routed by consistent hashing on destination tenant_id.
91
+ * Returns message_id on success.
92
+ */
93
+ send(message: FederationMessage, opts?: {
94
+ timeoutMs?: number;
95
+ }): Promise<MessageId>;
96
+ /**
97
+ * Receive pending messages (subscriber pattern).
98
+ * Messages are routed to this agent's tenant by consistent hash.
99
+ * Returns empty array if no messages within timeout window.
100
+ */
101
+ receive(opts?: ReceiveOpts): Promise<FederationMessage[]>;
102
+ /**
103
+ * Verify JWS signature and Claim sextuplet integrity.
104
+ * Checks Ed25519 signature, CBOR canonicalization, temporal bounds, delegation chain narrowing.
105
+ * Does NOT verify on-chain anchor (separate concern).
106
+ */
107
+ verifyMessage(msg: FederationMessage): Promise<VerifyResult>;
108
+ /**
109
+ * Acknowledge a received message to mark it as consumed.
110
+ * Prevents redelivery.
111
+ */
112
+ ack(messageId: MessageId): Promise<void>;
113
+ /**
114
+ * Nack a message to return it to the queue (poison pill protection).
115
+ * Max 3 nacks per message, then dead-letter.
116
+ */
117
+ nack(messageId: MessageId, reason?: string): Promise<void>;
118
+ }
119
+ export declare class FederationSignatureInvalidError extends Error {
120
+ readonly messageId: string;
121
+ readonly reason: string;
122
+ constructor(messageId: string, reason: string);
123
+ }
124
+ export declare class FederationRoutingError extends Error {
125
+ readonly tenantId: string;
126
+ readonly reason: string;
127
+ constructor(tenantId: string, reason: string);
128
+ }
129
+ export declare class FederationDelegationChainError extends Error {
130
+ readonly messageId: string;
131
+ readonly chainDepth: number;
132
+ readonly reason: string;
133
+ constructor(messageId: string, chainDepth: number, reason: string);
134
+ }
135
+ export declare class FederationMessageExpiredError extends Error {
136
+ readonly messageId: string;
137
+ readonly notAfter: string;
138
+ constructor(messageId: string, notAfter: string);
139
+ }
140
+ //# sourceMappingURL=federation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation.d.ts","sourceRoot":"","sources":["../../src/ports/federation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,aAAa,GAAG,UAAU,GAAG,cAAc,CAAC;AAE3E,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE;QAClB,QAAQ,CAAC,MAAM,EAAE,8BAA8B,CAAC;QAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACxC,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACjD,CAAC;IACF,QAAQ,CAAC,cAAc,EAAE;QACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACrC,CAAC;IACF,QAAQ,CAAC,eAAe,EAAE;QACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;KAC9B,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;QAC7B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB,CAAC;QACvD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAC;QACxC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,KAAK,EAAE;YACd,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;YAC7C,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;YAC7C,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;YAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;SAC7B,CAAC;QACF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;KAC9B,CAAC,CAAC;CACJ;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAI/B,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAID,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAID,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,IAAI,CACF,OAAO,EAAE,iBAAiB,EAC1B,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5B,OAAO,CAAC,SAAS,CAAC,CAAC;IAEtB;;;;OAIG;IACH,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAE1D;;;;OAIG;IACH,aAAa,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE7D;;;OAGG;IACH,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC;;;OAGG;IACH,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D;AAID,qBAAa,+BAAgC,SAAQ,KAAK;aAEtC,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,MAAM;gBADd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM;CAMjC;AAED,qBAAa,sBAAuB,SAAQ,KAAK;aAE7B,QAAQ,EAAE,MAAM;aAChB,MAAM,EAAE,MAAM;gBADd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;CAMjC;AAED,qBAAa,8BAA+B,SAAQ,KAAK;aAErC,SAAS,EAAE,MAAM;aACjB,UAAU,EAAE,MAAM;aAClB,MAAM,EAAE,MAAM;gBAFd,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM;CAQjC;AAED,qBAAa,6BAA8B,SAAQ,KAAK;aAEpC,SAAS,EAAE,MAAM;aACjB,QAAQ,EAAE,MAAM;gBADhB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM;CAMnC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * FederationPort — agent-to-agent messaging with cryptographic provenance (S4 spec).
3
+ *
4
+ * Implements A2A v1.0 transport (JWS RFC 7515) superset with Vauban Claim sextuplet
5
+ * payload. Messages routed by consistent hashing on tenant_id. Delegation chains preserved.
6
+ * Ed25519 signatures over CBOR canonical encoding.
7
+ *
8
+ * Spec: docs/plans/PreCarre/canonical/specs/S4.md
9
+ */
10
+ // ─── Typed errors ─────────────────────────────────────────────────────────────
11
+ export class FederationSignatureInvalidError extends Error {
12
+ messageId;
13
+ reason;
14
+ constructor(messageId, reason) {
15
+ super(`Federation signature invalid (${messageId}): ${reason}`);
16
+ this.messageId = messageId;
17
+ this.reason = reason;
18
+ this.name = "FederationSignatureInvalidError";
19
+ Object.setPrototypeOf(this, new.target.prototype);
20
+ }
21
+ }
22
+ export class FederationRoutingError extends Error {
23
+ tenantId;
24
+ reason;
25
+ constructor(tenantId, reason) {
26
+ super(`Federation routing failed for tenant ${tenantId}: ${reason}`);
27
+ this.tenantId = tenantId;
28
+ this.reason = reason;
29
+ this.name = "FederationRoutingError";
30
+ Object.setPrototypeOf(this, new.target.prototype);
31
+ }
32
+ }
33
+ export class FederationDelegationChainError extends Error {
34
+ messageId;
35
+ chainDepth;
36
+ reason;
37
+ constructor(messageId, chainDepth, reason) {
38
+ super(`Federation delegation chain invalid (${messageId}, depth=${chainDepth}): ${reason}`);
39
+ this.messageId = messageId;
40
+ this.chainDepth = chainDepth;
41
+ this.reason = reason;
42
+ this.name = "FederationDelegationChainError";
43
+ Object.setPrototypeOf(this, new.target.prototype);
44
+ }
45
+ }
46
+ export class FederationMessageExpiredError extends Error {
47
+ messageId;
48
+ notAfter;
49
+ constructor(messageId, notAfter) {
50
+ super(`Federation message expired (${messageId}): not_after=${notAfter}`);
51
+ this.messageId = messageId;
52
+ this.notAfter = notAfter;
53
+ this.name = "FederationMessageExpiredError";
54
+ Object.setPrototypeOf(this, new.target.prototype);
55
+ }
56
+ }
57
+ //# sourceMappingURL=federation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation.js","sourceRoot":"","sources":["../../src/ports/federation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAsIH,iFAAiF;AAEjF,MAAM,OAAO,+BAAgC,SAAQ,KAAK;IAEtC;IACA;IAFlB,YACkB,SAAiB,EACjB,MAAc;QAE9B,KAAK,CAAC,iCAAiC,SAAS,MAAM,MAAM,EAAE,CAAC,CAAC;QAHhD,cAAS,GAAT,SAAS,CAAQ;QACjB,WAAM,GAAN,MAAM,CAAQ;QAG9B,IAAI,CAAC,IAAI,GAAG,iCAAiC,CAAC;QAC9C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAE7B;IACA;IAFlB,YACkB,QAAgB,EAChB,MAAc;QAE9B,KAAK,CAAC,wCAAwC,QAAQ,KAAK,MAAM,EAAE,CAAC,CAAC;QAHrD,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAQ;QAG9B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IAErC;IACA;IACA;IAHlB,YACkB,SAAiB,EACjB,UAAkB,EAClB,MAAc;QAE9B,KAAK,CACH,wCAAwC,SAAS,WAAW,UAAU,MAAM,MAAM,EAAE,CACrF,CAAC;QANc,cAAS,GAAT,SAAS,CAAQ;QACjB,eAAU,GAAV,UAAU,CAAQ;QAClB,WAAM,GAAN,MAAM,CAAQ;QAK9B,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;QAC7C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IAEpC;IACA;IAFlB,YACkB,SAAiB,EACjB,QAAgB;QAEhC,KAAK,CAAC,+BAA+B,SAAS,gBAAgB,QAAQ,EAAE,CAAC,CAAC;QAH1D,cAAS,GAAT,SAAS,CAAQ;QACjB,aAAQ,GAAR,QAAQ,CAAQ;QAGhC,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;QAC5C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF"}