@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
@@ -14,6 +14,66 @@
14
14
  */
15
15
  import type { DbClient } from "../../tracking/agent-run-tracker.js";
16
16
  import type { LoggerPort } from "../../ports/logger.js";
17
+ /**
18
+ * Secrets access surface handed to skills. Implementations MUST track every
19
+ * lookup in `accessedSecrets` so callers can audit which secrets a skill
20
+ * actually consumed (required for ADR-ECO-027 proof-grade tripartite and
21
+ * future VPSF skill attestations).
22
+ *
23
+ * @public @since 1.2.0
24
+ */
25
+ export interface SecretsAccessor {
26
+ /**
27
+ * Get a secret by name. Returns `defaultValue` if missing and provided;
28
+ * otherwise throws when `defaultValue` is undefined and the secret is
29
+ * not configured. Implementations MUST record the lookup in
30
+ * {@link accessedSecrets} regardless of outcome.
31
+ */
32
+ get(name: string, defaultValue?: string): string;
33
+ /** Whether a secret with this name is available. Counts as access. */
34
+ has(name: string): boolean;
35
+ /** Set of secret names the skill actually consulted during this invocation. */
36
+ readonly accessedSecrets: ReadonlySet<string>;
37
+ }
38
+ /**
39
+ * Error thrown by {@link InMemorySecretsAccessor} when a secret is requested
40
+ * without a default value and is not configured.
41
+ *
42
+ * @public @since 1.2.0
43
+ */
44
+ export declare class SecretNotFoundError extends Error {
45
+ readonly secretName: string;
46
+ constructor(secretName: string);
47
+ }
48
+ /**
49
+ * In-memory {@link SecretsAccessor} suitable for tests and ephemeral
50
+ * runtimes. Production hosts can implement their own accessor backed by
51
+ * Vault, SOPS, or k8s SealedSecrets while preserving the audit semantics.
52
+ *
53
+ * @public @since 1.2.0
54
+ */
55
+ export declare class InMemorySecretsAccessor implements SecretsAccessor {
56
+ private readonly store;
57
+ private readonly accessed;
58
+ constructor(secrets?: Readonly<Record<string, string>>);
59
+ get(name: string, defaultValue?: string): string;
60
+ has(name: string): boolean;
61
+ get accessedSecrets(): ReadonlySet<string>;
62
+ }
63
+ /**
64
+ * Noop accessor — used as default for skills that declare no secrets.
65
+ * Always returns `defaultValue` when provided, otherwise throws.
66
+ *
67
+ * @public @since 1.2.0
68
+ */
69
+ export declare const NOOP_SECRETS: SecretsAccessor;
70
+ /**
71
+ * Progress callback invoked by skills via `ctx.progress(value, message?)`.
72
+ * `value` is clamped into `[0, 1]` by implementations.
73
+ *
74
+ * @public @since 1.2.0
75
+ */
76
+ export type ProgressCallback = (value: number, message?: string) => void;
17
77
  /**
18
78
  * Context handed to each skill invocation.
19
79
  *
@@ -21,13 +81,57 @@ import type { LoggerPort } from "../../ports/logger.js";
21
81
  * the skill must short-circuit and emit no observable mutation (no LLM
22
82
  * call, no HTTP, no DB INSERT). This guarantees replay safety for the
23
83
  * OODA cycle log.
84
+ *
85
+ * Fields added in SDK v1.2.0 (executionId, secrets, progress,
86
+ * elapsedSeconds, remainingSeconds) are OPTIONAL by design — existing
87
+ * skills compile unchanged. New skills can opt in via the
88
+ * {@link createSkillContext} factory.
24
89
  */
25
90
  export interface SkillContext {
26
91
  readonly isReplay: boolean;
27
92
  readonly dryRunMocks: Record<string, (input: unknown) => unknown>;
28
93
  readonly db: DbClient;
29
94
  readonly logger: LoggerPort;
95
+ /** Unique invocation identifier. Optional for backwards compatibility. */
96
+ readonly executionId?: string;
97
+ /** Audit-trail-bearing secret access. Defaults to {@link NOOP_SECRETS}. */
98
+ readonly secrets?: SecretsAccessor;
99
+ /** Report execution progress in [0, 1]. Noop when absent. */
100
+ readonly progress?: ProgressCallback;
101
+ /** Seconds since invocation began. Returns 0 when not tracked. */
102
+ readonly elapsedSeconds?: number;
103
+ /** Seconds remaining until timeout. Returns +Infinity when not tracked. */
104
+ readonly remainingSeconds?: number;
105
+ }
106
+ /**
107
+ * Options for {@link createSkillContext}.
108
+ *
109
+ * @public @since 1.2.0
110
+ */
111
+ export interface CreateSkillContextOptions {
112
+ isReplay?: boolean;
113
+ dryRunMocks?: Record<string, (input: unknown) => unknown>;
114
+ db: DbClient;
115
+ logger: LoggerPort;
116
+ executionId?: string;
117
+ secrets?: SecretsAccessor;
118
+ progress?: ProgressCallback;
119
+ /** Absolute timeout in seconds; used to compute remainingSeconds. Default: +Infinity. */
120
+ timeoutSeconds?: number;
121
+ /** Reference Date for elapsed/remaining computation. Default: new Date(). */
122
+ startedAt?: Date;
30
123
  }
124
+ /**
125
+ * Build a {@link SkillContext} with sane defaults for the optional fields.
126
+ * Useful for hosts that want a uniform context without writing the boilerplate.
127
+ *
128
+ * Time accessors are LIVE — `elapsedSeconds` and `remainingSeconds` are
129
+ * recomputed on each property read, so a skill that loops can observe them
130
+ * decreasing without rebuilding the context.
131
+ *
132
+ * @public @since 1.2.0
133
+ */
134
+ export declare function createSkillContext(opts: CreateSkillContextOptions): SkillContext;
31
135
  /**
32
136
  * Skill — single named callable unit invoked from an OODA phase.
33
137
  *
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/orchestration/ooda/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;IAClE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,CAAA;KAAE,CAAC;IACrD,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAClD;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAiC,CAAC"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/orchestration/ooda/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjD,sEAAsE;IACtE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,+EAA+E;IAC/E,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC/C;AAED;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAChB,UAAU,EAAE,MAAM;CAK/B;AAED;;;;;;GAMG;AACH,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;gBAEvC,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IAI1D,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM;IAQhD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAK1B,IAAI,eAAe,IAAI,WAAW,CAAC,MAAM,CAAC,CAEzC;CACF;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,eAA+C,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAEzE;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;IAClE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,0EAA0E;IAC1E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;IACnC,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IACrC,kEAAkE;IAClE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,2EAA2E;IAC3E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;IAC1D,EAAE,EAAE,QAAQ,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,yFAAyF;IACzF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,yBAAyB,GAC9B,YAAY,CAkCd;AAWD;;;;;;GAMG;AACH,MAAM,WAAW,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,CAAA;KAAE,CAAC;IACrD,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAClD;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAiC,CAAC"}
@@ -12,6 +12,112 @@
12
12
  *
13
13
  * @public
14
14
  */
15
+ /**
16
+ * Error thrown by {@link InMemorySecretsAccessor} when a secret is requested
17
+ * without a default value and is not configured.
18
+ *
19
+ * @public @since 1.2.0
20
+ */
21
+ export class SecretNotFoundError extends Error {
22
+ secretName;
23
+ constructor(secretName) {
24
+ super(`secret '${secretName}' is not configured`);
25
+ this.name = "SecretNotFoundError";
26
+ this.secretName = secretName;
27
+ }
28
+ }
29
+ /**
30
+ * In-memory {@link SecretsAccessor} suitable for tests and ephemeral
31
+ * runtimes. Production hosts can implement their own accessor backed by
32
+ * Vault, SOPS, or k8s SealedSecrets while preserving the audit semantics.
33
+ *
34
+ * @public @since 1.2.0
35
+ */
36
+ export class InMemorySecretsAccessor {
37
+ store;
38
+ accessed = new Set();
39
+ constructor(secrets = {}) {
40
+ this.store = new Map(Object.entries(secrets));
41
+ }
42
+ get(name, defaultValue) {
43
+ this.accessed.add(name);
44
+ const value = this.store.get(name);
45
+ if (value !== undefined)
46
+ return value;
47
+ if (defaultValue !== undefined)
48
+ return defaultValue;
49
+ throw new SecretNotFoundError(name);
50
+ }
51
+ has(name) {
52
+ this.accessed.add(name);
53
+ return this.store.has(name);
54
+ }
55
+ get accessedSecrets() {
56
+ return this.accessed;
57
+ }
58
+ }
59
+ /**
60
+ * Noop accessor — used as default for skills that declare no secrets.
61
+ * Always returns `defaultValue` when provided, otherwise throws.
62
+ *
63
+ * @public @since 1.2.0
64
+ */
65
+ export const NOOP_SECRETS = new InMemorySecretsAccessor();
66
+ /**
67
+ * Build a {@link SkillContext} with sane defaults for the optional fields.
68
+ * Useful for hosts that want a uniform context without writing the boilerplate.
69
+ *
70
+ * Time accessors are LIVE — `elapsedSeconds` and `remainingSeconds` are
71
+ * recomputed on each property read, so a skill that loops can observe them
72
+ * decreasing without rebuilding the context.
73
+ *
74
+ * @public @since 1.2.0
75
+ */
76
+ export function createSkillContext(opts) {
77
+ const startedAt = opts.startedAt ?? new Date();
78
+ const timeoutSeconds = opts.timeoutSeconds ?? Number.POSITIVE_INFINITY;
79
+ const secrets = opts.secrets ?? NOOP_SECRETS;
80
+ const progressFn = opts.progress ?? noopProgress;
81
+ const ctx = {
82
+ isReplay: opts.isReplay ?? false,
83
+ dryRunMocks: opts.dryRunMocks ?? {},
84
+ db: opts.db,
85
+ logger: opts.logger,
86
+ secrets,
87
+ progress: (value, message) => {
88
+ const clamped = clampProgress(value);
89
+ progressFn(clamped, message);
90
+ },
91
+ get elapsedSeconds() {
92
+ return Math.max(0, (Date.now() - startedAt.getTime()) / 1000);
93
+ },
94
+ get remainingSeconds() {
95
+ if (!Number.isFinite(timeoutSeconds))
96
+ return Number.POSITIVE_INFINITY;
97
+ const elapsed = (Date.now() - startedAt.getTime()) / 1000;
98
+ return Math.max(0, timeoutSeconds - elapsed);
99
+ },
100
+ };
101
+ if (opts.executionId !== undefined) {
102
+ Object.defineProperty(ctx, "executionId", {
103
+ value: opts.executionId,
104
+ writable: false,
105
+ enumerable: true,
106
+ configurable: false,
107
+ });
108
+ }
109
+ return ctx;
110
+ }
111
+ function clampProgress(value) {
112
+ if (!Number.isFinite(value))
113
+ return 0;
114
+ if (value < 0)
115
+ return 0;
116
+ if (value > 1)
117
+ return 1;
118
+ return value;
119
+ }
120
+ const noopProgress = () => { };
15
121
  /**
16
122
  * Empty registry — convenience for tests and minimal agents.
17
123
  */
@@ -1 +1 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/orchestration/ooda/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA2CH;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAkB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/orchestration/ooda/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * BastionActionPort contract tests.
3
+ *
4
+ * Applied to any BastionActionPort implementation. Tests T-E invariant validation,
5
+ * error handling, and policy constraint enforcement.
6
+ *
7
+ * Source: MASTER-PLAN-v5.md §1.3.1 (T-E manifest ∩ client_policies)
8
+ */
9
+ import { type BastionActionPort } from "./bastion-action.js";
10
+ export declare const bastionActionPortContract: (factory: () => BastionActionPort) => void;
11
+ //# sourceMappingURL=bastion-action.contract.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bastion-action.contract.test.d.ts","sourceRoot":"","sources":["../../src/ports/bastion-action.contract.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAIL,KAAK,iBAAiB,EAcvB,MAAM,qBAAqB,CAAC;AAmC7B,eAAO,MAAM,yBAAyB,GAAI,SAAS,MAAM,iBAAiB,SA6JzE,CAAC"}
@@ -0,0 +1,238 @@
1
+ /**
2
+ * BastionActionPort contract tests.
3
+ *
4
+ * Applied to any BastionActionPort implementation. Tests T-E invariant validation,
5
+ * error handling, and policy constraint enforcement.
6
+ *
7
+ * Source: MASTER-PLAN-v5.md §1.3.1 (T-E manifest ∩ client_policies)
8
+ */
9
+ import { describe, expect, test } from "vitest";
10
+ import { BastionPolicyViolationError, BastionSlippageExceededError, BastionTransferUnauthorizedError, } from "./bastion-action.js";
11
+ function makeActionContext(overrides = {}) {
12
+ return {
13
+ tenantId: "tenant-001",
14
+ manifestHash: "abc123def456",
15
+ runId: crypto.randomUUID(),
16
+ ...overrides,
17
+ };
18
+ }
19
+ function makeSwapParams(overrides = {}) {
20
+ return {
21
+ token_in: "0xdeadbeef",
22
+ token_out: "0xcafebabe",
23
+ amount: "1000000000000000000", // 1e18
24
+ max_slippage_bps: 50, // 0.5%
25
+ deadline: Math.floor(Date.now() / 1000) + 3600,
26
+ ...overrides,
27
+ };
28
+ }
29
+ function makeTransferParams(overrides = {}) {
30
+ return {
31
+ recipient: "0x1234567890abcdef",
32
+ amount: "1000000",
33
+ token: "0xdeadbeef",
34
+ ...overrides,
35
+ };
36
+ }
37
+ export const bastionActionPortContract = (factory) => {
38
+ describe("BastionActionPort contract", () => {
39
+ test("swap succeeds within slippage tolerance", async () => {
40
+ const port = factory();
41
+ const params = makeSwapParams({ max_slippage_bps: 100 });
42
+ const ctx = makeActionContext();
43
+ // Validate passes first
44
+ const validation = await port.validateAgainstClientPolicies("swap", ctx.tenantId);
45
+ expect(validation.valid).toBe(true);
46
+ // Mock successful swap — implementation should not throw
47
+ const result = await port.swap(params, ctx);
48
+ expect(result.tx_hash).toBeDefined();
49
+ expect(result.actual_slippage_bps).toBeLessThanOrEqual(params.max_slippage_bps);
50
+ });
51
+ test("swap throws BastionSlippageExceededError when actual > max", async () => {
52
+ const port = factory();
53
+ const params = makeSwapParams({ max_slippage_bps: 10 }); // 0.1% max, will exceed
54
+ const ctx = makeActionContext();
55
+ await expect(port.swap(params, ctx)).rejects.toThrow(BastionSlippageExceededError);
56
+ });
57
+ test("transfer requires legalBasis in ctx", async () => {
58
+ const port = factory();
59
+ const params = makeTransferParams();
60
+ const ctx = makeActionContext({ legalBasis: undefined });
61
+ // Validate passes, but execution should fail without legalBasis
62
+ await expect(port.transfer(params, ctx)).rejects.toThrow(BastionTransferUnauthorizedError);
63
+ });
64
+ test("transfer succeeds with legalBasis (TFR Art 4)", async () => {
65
+ const port = factory();
66
+ const params = makeTransferParams();
67
+ const ctx = makeActionContext({ legalBasis: "tfr.art4" });
68
+ const result = await port.transfer(params, ctx);
69
+ expect(result.tx_hash).toBeDefined();
70
+ expect(result.recipient).toBe(params.recipient);
71
+ expect(result.amount).toBe(params.amount);
72
+ });
73
+ test("validateAgainstClientPolicies returns valid=false for out-of-scope actions", async () => {
74
+ const port = factory();
75
+ const tenantId = "restricted-tenant";
76
+ // Validate should block an action that's not in tenant's allowed_actions
77
+ const validation = await port.validateAgainstClientPolicies("swap", tenantId);
78
+ if (!validation.valid) {
79
+ expect(validation.violations.length).toBeGreaterThan(0);
80
+ }
81
+ });
82
+ test("validateAgainstClientPolicies enforces max_slippage_bps constraint", async () => {
83
+ const port = factory();
84
+ const tenantId = "tenant-001";
85
+ // Validate with slippage params that exceed policy
86
+ const params = makeSwapParams({ max_slippage_bps: 5000 }); // 50% (extreme)
87
+ const validation = await port.validateAgainstClientPolicies("swap", tenantId, params);
88
+ // Expected: violation if policy max < 5000 bps
89
+ if (!validation.valid) {
90
+ expect(validation.violations.some((v) => v.includes("slippage"))).toBe(true);
91
+ }
92
+ });
93
+ test("validateAgainstClientPolicies caches client_policies (TTL 60s)", async () => {
94
+ const port = factory();
95
+ const tenantId = "tenant-001";
96
+ // First call — cache miss, fetches policy
97
+ const validation1 = await port.validateAgainstClientPolicies("deposit", tenantId);
98
+ expect(validation1).toBeDefined();
99
+ // Second call immediately — should use cache, same policy_hash
100
+ const validation2 = await port.validateAgainstClientPolicies("deposit", tenantId);
101
+ if (validation1.policy_hash && validation2.policy_hash) {
102
+ expect(validation2.policy_hash).toBe(validation1.policy_hash);
103
+ }
104
+ });
105
+ test("deposit succeeds with valid params", async () => {
106
+ const port = factory();
107
+ const params = {
108
+ vault_address: "0xvault001",
109
+ amount: "1000000000000000000",
110
+ token: "0xdeadbeef",
111
+ };
112
+ const ctx = makeActionContext();
113
+ const validation = await port.validateAgainstClientPolicies("deposit", ctx.tenantId);
114
+ if (validation.valid) {
115
+ const result = await port.deposit(params, ctx);
116
+ expect(result.tx_hash).toBeDefined();
117
+ expect(result.shares_minted).toBeDefined();
118
+ }
119
+ });
120
+ test("withdraw succeeds with valid params", async () => {
121
+ const port = factory();
122
+ const params = {
123
+ vault_address: "0xvault001",
124
+ shares: "500000000000000000",
125
+ };
126
+ const ctx = makeActionContext();
127
+ const result = await port.withdraw(params, ctx);
128
+ expect(result.tx_hash).toBeDefined();
129
+ expect(result.amount_withdrawn).toBeDefined();
130
+ });
131
+ test("policy violation includes action and tenantId in error", async () => {
132
+ const port = factory();
133
+ const tenantId = "restricted-tenant";
134
+ try {
135
+ await port.validateAgainstClientPolicies("swap", tenantId);
136
+ }
137
+ catch (err) {
138
+ if (err instanceof BastionPolicyViolationError) {
139
+ expect(err.action).toBe("swap");
140
+ expect(err.tenantId).toBe(tenantId);
141
+ }
142
+ }
143
+ });
144
+ });
145
+ };
146
+ // ─── Mock implementation ──────────────────────────────────────────────────
147
+ class MockBastionActionPort {
148
+ policyCache = new Map();
149
+ async validateAgainstClientPolicies(action, tenantId, params) {
150
+ // Simulate policy fetch with cache
151
+ const cached = this.policyCache.get(tenantId);
152
+ const now = Date.now();
153
+ const policy = cached && now - cached.ts < 60000
154
+ ? cached.policy
155
+ : this.getDefaultPolicy(tenantId);
156
+ if (policy) {
157
+ this.policyCache.set(tenantId, { policy, ts: now });
158
+ }
159
+ const violations = [];
160
+ // Check if action is allowed
161
+ if (!policy.allowed_actions.includes(action)) {
162
+ violations.push(`action '${action}' not in allowed_actions`);
163
+ }
164
+ // Check slippage constraint if params provided
165
+ if (params &&
166
+ "max_slippage_bps" in params &&
167
+ (params.max_slippage_bps ?? 0) > policy.max_slippage_bps) {
168
+ violations.push(`slippage ${params.max_slippage_bps} bps exceeds policy max ${policy.max_slippage_bps} bps`);
169
+ }
170
+ const valid = violations.length === 0;
171
+ return {
172
+ valid,
173
+ violations,
174
+ policy_hash: `hash-${tenantId}-${action}`,
175
+ };
176
+ }
177
+ getDefaultPolicy(tenantId) {
178
+ if (tenantId === "restricted-tenant") {
179
+ return {
180
+ max_slippage_bps: 100,
181
+ allowed_pairs: [],
182
+ daily_volume_cap: "0",
183
+ deposit_cap: "0",
184
+ allowed_actions: [],
185
+ cache_ttl_seconds: 60,
186
+ };
187
+ }
188
+ return {
189
+ max_slippage_bps: 500,
190
+ allowed_pairs: [
191
+ ["0xdeadbeef", "0xcafebabe"],
192
+ ],
193
+ daily_volume_cap: "1000000000000000000000",
194
+ deposit_cap: "500000000000000000000",
195
+ allowed_actions: ["swap", "deposit", "withdraw", "transfer"],
196
+ cache_ttl_seconds: 60,
197
+ };
198
+ }
199
+ async swap(params, _ctx) {
200
+ // Simulate slippage calculation: if max_slippage_bps is very low, exceed it
201
+ const actualSlippageBps = params.max_slippage_bps < 20 ? 50 : 10;
202
+ if (actualSlippageBps > params.max_slippage_bps) {
203
+ throw new BastionSlippageExceededError(params.max_slippage_bps, actualSlippageBps);
204
+ }
205
+ return {
206
+ tx_hash: `0x${crypto.randomUUID().replace(/-/g, "")}`,
207
+ amount_out: (BigInt(params.amount) * BigInt(99)) / BigInt(100),
208
+ actual_slippage_bps: actualSlippageBps,
209
+ executed_at: new Date(),
210
+ };
211
+ }
212
+ async deposit(params, _ctx) {
213
+ return {
214
+ tx_hash: `0x${crypto.randomUUID().replace(/-/g, "")}`,
215
+ shares_minted: (BigInt(params.amount) * BigInt(95)) / BigInt(100),
216
+ deposit_amount: params.amount,
217
+ };
218
+ }
219
+ async withdraw(params, _ctx) {
220
+ return {
221
+ tx_hash: `0x${crypto.randomUUID().replace(/-/g, "")}`,
222
+ amount_withdrawn: (BigInt(params.shares) * BigInt(98)) / BigInt(100),
223
+ };
224
+ }
225
+ async transfer(params, ctx) {
226
+ if (!ctx.legalBasis) {
227
+ throw new BastionTransferUnauthorizedError("Transfer requires legalBasis (TFR Art 4)", "missing_legal_basis");
228
+ }
229
+ return {
230
+ tx_hash: `0x${crypto.randomUUID().replace(/-/g, "")}`,
231
+ recipient: params.recipient,
232
+ amount: params.amount,
233
+ };
234
+ }
235
+ }
236
+ // ─── Default contract application ──────────────────────────────────────────
237
+ bastionActionPortContract(() => new MockBastionActionPort());
238
+ //# sourceMappingURL=bastion-action.contract.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bastion-action.contract.test.js","sourceRoot":"","sources":["../../src/ports/bastion-action.contract.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * BastionActionPort — host adapter for Bastion DeFi capabilities.
3
+ *
4
+ * Implements the manifest ∩ client_policies validation gate (T-E invariant).
5
+ * All actions must pass through validateAgainstClientPolicies before HTTP execution.
6
+ *
7
+ * Source: MASTER-PLAN-v5.md §1.3.1, §2.3 (Q-Bastion-1..4)
8
+ */
9
+ export type TokenAddress = string & {
10
+ readonly __brand: "TokenAddress";
11
+ };
12
+ export type VaultAddress = string & {
13
+ readonly __brand: "VaultAddress";
14
+ };
15
+ export type TenantId = string;
16
+ export interface SwapParams {
17
+ readonly token_in: TokenAddress;
18
+ readonly token_out: TokenAddress;
19
+ readonly amount: string;
20
+ readonly max_slippage_bps: number;
21
+ readonly deadline: number;
22
+ }
23
+ export interface DepositParams {
24
+ readonly vault_address: VaultAddress;
25
+ readonly amount: string;
26
+ readonly token: TokenAddress;
27
+ }
28
+ export interface WithdrawParams {
29
+ readonly vault_address: VaultAddress;
30
+ readonly shares: string;
31
+ }
32
+ export interface TransferParams {
33
+ readonly recipient: string;
34
+ readonly amount: string;
35
+ readonly token: TokenAddress;
36
+ }
37
+ export interface ActionContext {
38
+ readonly tenantId: TenantId;
39
+ readonly manifestHash: string;
40
+ readonly runId: string;
41
+ readonly legalBasis?: string;
42
+ readonly jurisdictionsContext?: string[];
43
+ }
44
+ export interface SwapResult {
45
+ readonly tx_hash: string;
46
+ readonly amount_out: string;
47
+ readonly actual_slippage_bps: number;
48
+ readonly executed_at: Date;
49
+ }
50
+ export interface DepositResult {
51
+ readonly tx_hash: string;
52
+ readonly shares_minted: string;
53
+ readonly deposit_amount: string;
54
+ }
55
+ export interface WithdrawResult {
56
+ readonly tx_hash: string;
57
+ readonly amount_withdrawn: string;
58
+ }
59
+ export interface TransferResult {
60
+ readonly tx_hash: string;
61
+ readonly recipient: string;
62
+ readonly amount: string;
63
+ }
64
+ export interface ClientPolicy {
65
+ readonly max_slippage_bps: number;
66
+ readonly allowed_pairs: readonly [TokenAddress, TokenAddress][];
67
+ readonly daily_volume_cap: string;
68
+ readonly deposit_cap: string;
69
+ readonly allowed_actions: readonly ("swap" | "deposit" | "withdraw" | "transfer")[];
70
+ readonly cache_ttl_seconds: number;
71
+ }
72
+ export interface PolicyValidation {
73
+ readonly valid: boolean;
74
+ readonly violations: readonly string[];
75
+ readonly policy_hash?: string;
76
+ }
77
+ export interface BastionActionPort {
78
+ /**
79
+ * Swap tokens on Bastion CoW intents.
80
+ * Throws BastionSlippageExceededError if actual slippage > max_slippage_bps.
81
+ */
82
+ swap(params: SwapParams, ctx: ActionContext): Promise<SwapResult>;
83
+ /**
84
+ * Deposit into a Bastion vault.
85
+ * Throws BastionInsufficientFundsError if user balance < amount.
86
+ */
87
+ deposit(params: DepositParams, ctx: ActionContext): Promise<DepositResult>;
88
+ /**
89
+ * Withdraw shares from a Bastion vault.
90
+ */
91
+ withdraw(params: WithdrawParams, ctx: ActionContext): Promise<WithdrawResult>;
92
+ /**
93
+ * Transfer tokens. Requires legalBasis in ctx per TFR Art 4.
94
+ * Throws BastionTransferUnauthorizedError if legalBasis absent.
95
+ */
96
+ transfer(params: TransferParams, ctx: ActionContext): Promise<TransferResult>;
97
+ /**
98
+ * Validate action against manifest ∩ client_policies intersection (T-E invariant).
99
+ * Caches client_policies for tenant TTL 60s; invalidation event-driven.
100
+ * Throws BastionPolicyViolationError if action ∉ intersection.
101
+ */
102
+ validateAgainstClientPolicies(action: "swap" | "deposit" | "withdraw" | "transfer", tenantId: TenantId, params?: Partial<SwapParams & DepositParams>): Promise<PolicyValidation>;
103
+ }
104
+ export declare class BastionPolicyViolationError extends Error {
105
+ readonly action: string;
106
+ readonly tenantId: TenantId;
107
+ readonly cause?: unknown | undefined;
108
+ constructor(message: string, action: string, tenantId: TenantId, cause?: unknown | undefined);
109
+ }
110
+ export declare class BastionInsufficientFundsError extends Error {
111
+ readonly required: string;
112
+ readonly available: string;
113
+ readonly cause?: unknown | undefined;
114
+ constructor(required: string, available: string, cause?: unknown | undefined);
115
+ }
116
+ export declare class BastionSlippageExceededError extends Error {
117
+ readonly max_slippage_bps: number;
118
+ readonly actual_slippage_bps: number;
119
+ readonly cause?: unknown | undefined;
120
+ constructor(max_slippage_bps: number, actual_slippage_bps: number, cause?: unknown | undefined);
121
+ }
122
+ export declare class BastionContractError extends Error {
123
+ readonly contract_call: string;
124
+ readonly contract_error: string;
125
+ readonly cause?: unknown | undefined;
126
+ constructor(contract_call: string, contract_error: string, cause?: unknown | undefined);
127
+ }
128
+ export declare class BastionTransferUnauthorizedError extends Error {
129
+ readonly reason: "missing_legal_basis" | "jurisdiction_blocked";
130
+ readonly cause?: unknown | undefined;
131
+ constructor(message: string, reason: "missing_legal_basis" | "jurisdiction_blocked", cause?: unknown | undefined);
132
+ }
133
+ //# sourceMappingURL=bastion-action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bastion-action.d.ts","sourceRoot":"","sources":["../../src/ports/bastion-action.ts"],"names":[],"mappings":"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"}