@vauban-org/agent-sdk 0.17.4 → 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 (506) 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 +327 -30
  39. package/dist/events/catalogue.d.ts.map +1 -1
  40. package/dist/events/catalogue.js +18 -0
  41. package/dist/events/catalogue.js.map +1 -1
  42. package/dist/events/index.d.ts +9 -0
  43. package/dist/events/index.d.ts.map +1 -1
  44. package/dist/events/index.js +9 -0
  45. package/dist/events/index.js.map +1 -1
  46. package/dist/events/schemas/agent.completed.v1.d.ts +4 -4
  47. package/dist/events/schemas/agent.failed.v1.d.ts +2 -2
  48. package/dist/events/schemas/agent.hitl_resolved.v1.d.ts +2 -2
  49. package/dist/events/schemas/agent.started.v1.d.ts +2 -2
  50. package/dist/events/schemas/brain.skill.extracted.v1.d.ts +4 -4
  51. package/dist/events/schemas/cc.cost.anomaly_detected.v1.d.ts +2 -2
  52. package/dist/events/schemas/cc.cost.recorded.v1.d.ts +4 -4
  53. package/dist/events/schemas/citadel.sprint.analyzed.v1.d.ts +55 -0
  54. package/dist/events/schemas/citadel.sprint.analyzed.v1.d.ts.map +1 -0
  55. package/dist/events/schemas/citadel.sprint.analyzed.v1.js +22 -0
  56. package/dist/events/schemas/citadel.sprint.analyzed.v1.js.map +1 -0
  57. package/dist/events/schemas/citadel.sprint.closed.v1.d.ts +2 -2
  58. package/dist/events/schemas/forge.inbox.reply_classified.v1.d.ts +33 -0
  59. package/dist/events/schemas/forge.inbox.reply_classified.v1.d.ts.map +1 -0
  60. package/dist/events/schemas/forge.inbox.reply_classified.v1.js +15 -0
  61. package/dist/events/schemas/forge.inbox.reply_classified.v1.js.map +1 -0
  62. package/dist/events/schemas/forge.lead.qualified.v1.d.ts +2 -2
  63. package/dist/events/schemas/forge.outreach.sent.v1.d.ts +4 -4
  64. package/dist/events/schemas/incident.detected.v1.d.ts +2 -2
  65. package/dist/events/schemas/vauban-finance.forecast.generated.v1.d.ts +21 -0
  66. package/dist/events/schemas/vauban-finance.forecast.generated.v1.d.ts.map +1 -0
  67. package/dist/events/schemas/vauban-finance.forecast.generated.v1.js +11 -0
  68. package/dist/events/schemas/vauban-finance.forecast.generated.v1.js.map +1 -0
  69. package/dist/events/schemas/vauban-finance.trade.executed.v1.d.ts +24 -0
  70. package/dist/events/schemas/vauban-finance.trade.executed.v1.d.ts.map +1 -0
  71. package/dist/events/schemas/vauban-finance.trade.executed.v1.js +12 -0
  72. package/dist/events/schemas/vauban-finance.trade.executed.v1.js.map +1 -0
  73. package/dist/events/schemas/vauban.goal.checked.v1.d.ts +21 -0
  74. package/dist/events/schemas/vauban.goal.checked.v1.d.ts.map +1 -0
  75. package/dist/events/schemas/vauban.goal.checked.v1.js +11 -0
  76. package/dist/events/schemas/vauban.goal.checked.v1.js.map +1 -0
  77. package/dist/events/schemas/vauban.rebalancing.checked.v1.d.ts +21 -0
  78. package/dist/events/schemas/vauban.rebalancing.checked.v1.d.ts.map +1 -0
  79. package/dist/events/schemas/vauban.rebalancing.checked.v1.js +11 -0
  80. package/dist/events/schemas/vauban.rebalancing.checked.v1.js.map +1 -0
  81. package/dist/events/schemas/vauban.tax.checked.v1.d.ts +21 -0
  82. package/dist/events/schemas/vauban.tax.checked.v1.d.ts.map +1 -0
  83. package/dist/events/schemas/vauban.tax.checked.v1.js +11 -0
  84. package/dist/events/schemas/vauban.tax.checked.v1.js.map +1 -0
  85. package/dist/events/schemas/vauban.vault.analyzed.v1.d.ts +59 -0
  86. package/dist/events/schemas/vauban.vault.analyzed.v1.d.ts.map +1 -0
  87. package/dist/events/schemas/vauban.vault.analyzed.v1.js +19 -0
  88. package/dist/events/schemas/vauban.vault.analyzed.v1.js.map +1 -0
  89. package/dist/events/schemas/vauban.vault.compounded.v1.d.ts +24 -0
  90. package/dist/events/schemas/vauban.vault.compounded.v1.d.ts.map +1 -0
  91. package/dist/events/schemas/vauban.vault.compounded.v1.js +12 -0
  92. package/dist/events/schemas/vauban.vault.compounded.v1.js.map +1 -0
  93. package/dist/identity/agent-persona.d.ts +73 -0
  94. package/dist/identity/agent-persona.d.ts.map +1 -0
  95. package/dist/identity/agent-persona.js +165 -0
  96. package/dist/identity/agent-persona.js.map +1 -0
  97. package/dist/identity/persona-prompt.d.ts +25 -0
  98. package/dist/identity/persona-prompt.d.ts.map +1 -0
  99. package/dist/identity/persona-prompt.js +71 -0
  100. package/dist/identity/persona-prompt.js.map +1 -0
  101. package/dist/identity/persona-schema.d.ts +120 -0
  102. package/dist/identity/persona-schema.d.ts.map +1 -0
  103. package/dist/identity/persona-schema.js +103 -0
  104. package/dist/identity/persona-schema.js.map +1 -0
  105. package/dist/index.d.ts +37 -2
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +29 -1
  108. package/dist/index.js.map +1 -1
  109. package/dist/loop/index.d.ts +1 -1
  110. package/dist/loop/index.d.ts.map +1 -1
  111. package/dist/loop/index.js.map +1 -1
  112. package/dist/loop/minimal-loop.js +293 -287
  113. package/dist/loop/sdk-loop.d.ts +1 -3
  114. package/dist/loop/sdk-loop.d.ts.map +1 -1
  115. package/dist/loop/sdk-loop.js +1 -1
  116. package/dist/loop/sdk-loop.js.map +1 -1
  117. package/dist/memory/episodic-rrf.d.ts +114 -0
  118. package/dist/memory/episodic-rrf.d.ts.map +1 -0
  119. package/dist/memory/episodic-rrf.js +148 -0
  120. package/dist/memory/episodic-rrf.js.map +1 -0
  121. package/dist/mesh/attenuation.d.ts +78 -0
  122. package/dist/mesh/attenuation.d.ts.map +1 -0
  123. package/dist/mesh/attenuation.js +141 -0
  124. package/dist/mesh/attenuation.js.map +1 -0
  125. package/dist/mesh/delegate.d.ts +96 -0
  126. package/dist/mesh/delegate.d.ts.map +1 -0
  127. package/dist/mesh/delegate.js +172 -0
  128. package/dist/mesh/delegate.js.map +1 -0
  129. package/dist/mesh/dispatcher.d.ts +119 -0
  130. package/dist/mesh/dispatcher.d.ts.map +1 -0
  131. package/dist/mesh/dispatcher.js +207 -0
  132. package/dist/mesh/dispatcher.js.map +1 -0
  133. package/dist/mesh/index.d.ts +12 -0
  134. package/dist/mesh/index.d.ts.map +1 -0
  135. package/dist/mesh/index.js +11 -0
  136. package/dist/mesh/index.js.map +1 -0
  137. package/dist/mesh/types.d.ts +30 -0
  138. package/dist/mesh/types.d.ts.map +1 -0
  139. package/dist/mesh/types.js +11 -0
  140. package/dist/mesh/types.js.map +1 -0
  141. package/dist/orchestration/ooda/skills.d.ts +104 -0
  142. package/dist/orchestration/ooda/skills.d.ts.map +1 -1
  143. package/dist/orchestration/ooda/skills.js +106 -0
  144. package/dist/orchestration/ooda/skills.js.map +1 -1
  145. package/dist/orchestration/ooda/types.d.ts +3 -8
  146. package/dist/orchestration/ooda/types.d.ts.map +1 -1
  147. package/dist/ports/bastion-action.contract.test.d.ts +11 -0
  148. package/dist/ports/bastion-action.contract.test.d.ts.map +1 -0
  149. package/dist/ports/bastion-action.contract.test.js +238 -0
  150. package/dist/ports/bastion-action.contract.test.js.map +1 -0
  151. package/dist/ports/bastion-action.d.ts +133 -0
  152. package/dist/ports/bastion-action.d.ts.map +1 -0
  153. package/dist/ports/bastion-action.js +73 -0
  154. package/dist/ports/bastion-action.js.map +1 -0
  155. package/dist/ports/brain.d.ts +31 -0
  156. package/dist/ports/brain.d.ts.map +1 -1
  157. package/dist/ports/brain.js +115 -1
  158. package/dist/ports/brain.js.map +1 -1
  159. package/dist/ports/citadel-action.contract.test.d.ts +11 -0
  160. package/dist/ports/citadel-action.contract.test.d.ts.map +1 -0
  161. package/dist/ports/citadel-action.contract.test.js +317 -0
  162. package/dist/ports/citadel-action.contract.test.js.map +1 -0
  163. package/dist/ports/citadel-action.d.ts +111 -0
  164. package/dist/ports/citadel-action.d.ts.map +1 -0
  165. package/dist/ports/citadel-action.js +62 -0
  166. package/dist/ports/citadel-action.js.map +1 -0
  167. package/dist/ports/compliance-contract.d.ts +123 -0
  168. package/dist/ports/compliance-contract.d.ts.map +1 -0
  169. package/dist/ports/compliance-contract.js +35 -0
  170. package/dist/ports/compliance-contract.js.map +1 -0
  171. package/dist/ports/db.d.ts +38 -0
  172. package/dist/ports/db.d.ts.map +1 -1
  173. package/dist/ports/db.js +88 -1
  174. package/dist/ports/db.js.map +1 -1
  175. package/dist/ports/delegation.contract.test.d.ts +9 -0
  176. package/dist/ports/delegation.contract.test.d.ts.map +1 -0
  177. package/dist/ports/delegation.contract.test.js +337 -0
  178. package/dist/ports/delegation.contract.test.js.map +1 -0
  179. package/dist/ports/delegation.d.ts +134 -0
  180. package/dist/ports/delegation.d.ts.map +1 -0
  181. package/dist/ports/delegation.js +105 -0
  182. package/dist/ports/delegation.js.map +1 -0
  183. package/dist/ports/event-bus.d.ts +29 -13
  184. package/dist/ports/event-bus.d.ts.map +1 -1
  185. package/dist/ports/event-bus.js +106 -1
  186. package/dist/ports/event-bus.js.map +1 -1
  187. package/dist/ports/federation.contract.test.d.ts +9 -0
  188. package/dist/ports/federation.contract.test.d.ts.map +1 -0
  189. package/dist/ports/federation.contract.test.js +279 -0
  190. package/dist/ports/federation.contract.test.js.map +1 -0
  191. package/dist/ports/federation.d.ts +140 -0
  192. package/dist/ports/federation.d.ts.map +1 -0
  193. package/dist/ports/federation.js +57 -0
  194. package/dist/ports/federation.js.map +1 -0
  195. package/dist/ports/index.d.ts +28 -2
  196. package/dist/ports/index.d.ts.map +1 -1
  197. package/dist/ports/index.js +17 -2
  198. package/dist/ports/index.js.map +1 -1
  199. package/dist/ports/llm-provider.d.ts +37 -0
  200. package/dist/ports/llm-provider.d.ts.map +1 -1
  201. package/dist/ports/llm-provider.js +99 -1
  202. package/dist/ports/llm-provider.js.map +1 -1
  203. package/dist/ports/logger.d.ts +27 -0
  204. package/dist/ports/logger.d.ts.map +1 -1
  205. package/dist/ports/logger.js +87 -0
  206. package/dist/ports/logger.js.map +1 -1
  207. package/dist/ports/manifest-registry.contract.test.d.ts +9 -0
  208. package/dist/ports/manifest-registry.contract.test.d.ts.map +1 -0
  209. package/dist/ports/manifest-registry.contract.test.js +246 -0
  210. package/dist/ports/manifest-registry.contract.test.js.map +1 -0
  211. package/dist/ports/manifest-registry.d.ts +116 -0
  212. package/dist/ports/manifest-registry.d.ts.map +1 -0
  213. package/dist/ports/manifest-registry.js +79 -0
  214. package/dist/ports/manifest-registry.js.map +1 -0
  215. package/dist/ports/observability.contract.test.d.ts +12 -0
  216. package/dist/ports/observability.contract.test.d.ts.map +1 -0
  217. package/dist/ports/observability.contract.test.js +260 -0
  218. package/dist/ports/observability.contract.test.js.map +1 -0
  219. package/dist/ports/observability.d.ts +98 -0
  220. package/dist/ports/observability.d.ts.map +1 -0
  221. package/dist/ports/observability.js +59 -0
  222. package/dist/ports/observability.js.map +1 -0
  223. package/dist/ports/outcome.d.ts +26 -0
  224. package/dist/ports/outcome.d.ts.map +1 -1
  225. package/dist/ports/outcome.js +62 -1
  226. package/dist/ports/outcome.js.map +1 -1
  227. package/dist/ports/privacy.contract.test.d.ts +12 -0
  228. package/dist/ports/privacy.contract.test.d.ts.map +1 -0
  229. package/dist/ports/privacy.contract.test.js +325 -0
  230. package/dist/ports/privacy.contract.test.js.map +1 -0
  231. package/dist/ports/privacy.d.ts +132 -0
  232. package/dist/ports/privacy.d.ts.map +1 -0
  233. package/dist/ports/privacy.js +83 -0
  234. package/dist/ports/privacy.js.map +1 -0
  235. package/dist/ports/tenant-context.contract.test.d.ts +14 -0
  236. package/dist/ports/tenant-context.contract.test.d.ts.map +1 -0
  237. package/dist/ports/tenant-context.contract.test.js +352 -0
  238. package/dist/ports/tenant-context.contract.test.js.map +1 -0
  239. package/dist/ports/tenant-context.d.ts +103 -0
  240. package/dist/ports/tenant-context.d.ts.map +1 -0
  241. package/dist/ports/tenant-context.js +48 -0
  242. package/dist/ports/tenant-context.js.map +1 -0
  243. package/dist/ports/vauban-finance-action.contract.test.d.ts +11 -0
  244. package/dist/ports/vauban-finance-action.contract.test.d.ts.map +1 -0
  245. package/dist/ports/vauban-finance-action.contract.test.js +260 -0
  246. package/dist/ports/vauban-finance-action.contract.test.js.map +1 -0
  247. package/dist/ports/vauban-finance-action.d.ts +106 -0
  248. package/dist/ports/vauban-finance-action.d.ts.map +1 -0
  249. package/dist/ports/vauban-finance-action.js +60 -0
  250. package/dist/ports/vauban-finance-action.js.map +1 -0
  251. package/dist/ports/workflow-runtime.d.ts +204 -0
  252. package/dist/ports/workflow-runtime.d.ts.map +1 -0
  253. package/dist/ports/workflow-runtime.js +72 -0
  254. package/dist/ports/workflow-runtime.js.map +1 -0
  255. package/dist/proof/cert-verify.d.ts +80 -0
  256. package/dist/proof/cert-verify.d.ts.map +1 -0
  257. package/dist/proof/cert-verify.js +178 -0
  258. package/dist/proof/cert-verify.js.map +1 -0
  259. package/dist/replay/replay.d.ts.map +1 -1
  260. package/dist/replay/replay.js +5 -1
  261. package/dist/replay/replay.js.map +1 -1
  262. package/dist/retry/index.d.ts +129 -0
  263. package/dist/retry/index.d.ts.map +1 -0
  264. package/dist/retry/index.js +156 -0
  265. package/dist/retry/index.js.map +1 -0
  266. package/dist/retry/presets.d.ts +39 -0
  267. package/dist/retry/presets.d.ts.map +1 -0
  268. package/dist/retry/presets.js +69 -0
  269. package/dist/retry/presets.js.map +1 -0
  270. package/dist/skill-loop/ab-runner.d.ts +67 -0
  271. package/dist/skill-loop/ab-runner.d.ts.map +1 -0
  272. package/dist/skill-loop/ab-runner.js +160 -0
  273. package/dist/skill-loop/ab-runner.js.map +1 -0
  274. package/dist/skill-loop/adoption.d.ts +67 -0
  275. package/dist/skill-loop/adoption.d.ts.map +1 -0
  276. package/dist/skill-loop/adoption.js +126 -0
  277. package/dist/skill-loop/adoption.js.map +1 -0
  278. package/dist/skill-loop/candidate.d.ts +45 -0
  279. package/dist/skill-loop/candidate.d.ts.map +1 -0
  280. package/dist/skill-loop/candidate.js +43 -0
  281. package/dist/skill-loop/candidate.js.map +1 -0
  282. package/dist/skill-loop/evaluator.d.ts +42 -0
  283. package/dist/skill-loop/evaluator.d.ts.map +1 -0
  284. package/dist/skill-loop/evaluator.js +184 -0
  285. package/dist/skill-loop/evaluator.js.map +1 -0
  286. package/dist/skill-loop/index.d.ts +27 -0
  287. package/dist/skill-loop/index.d.ts.map +1 -0
  288. package/dist/skill-loop/index.js +27 -0
  289. package/dist/skill-loop/index.js.map +1 -0
  290. package/dist/skill-loop/reflexion-replay.d.ts +87 -0
  291. package/dist/skill-loop/reflexion-replay.d.ts.map +1 -0
  292. package/dist/skill-loop/reflexion-replay.js +110 -0
  293. package/dist/skill-loop/reflexion-replay.js.map +1 -0
  294. package/dist/skill-loop/sign-off.d.ts +88 -0
  295. package/dist/skill-loop/sign-off.d.ts.map +1 -0
  296. package/dist/skill-loop/sign-off.js +146 -0
  297. package/dist/skill-loop/sign-off.js.map +1 -0
  298. package/dist/skill-loop/value-metric.d.ts +55 -0
  299. package/dist/skill-loop/value-metric.d.ts.map +1 -0
  300. package/dist/skill-loop/value-metric.js +69 -0
  301. package/dist/skill-loop/value-metric.js.map +1 -0
  302. package/dist/skill-loop/versioning.d.ts +36 -0
  303. package/dist/skill-loop/versioning.d.ts.map +1 -0
  304. package/dist/skill-loop/versioning.js +47 -0
  305. package/dist/skill-loop/versioning.js.map +1 -0
  306. package/dist/skill-manifest/anchor.d.ts +91 -0
  307. package/dist/skill-manifest/anchor.d.ts.map +1 -0
  308. package/dist/skill-manifest/anchor.js +331 -0
  309. package/dist/skill-manifest/anchor.js.map +1 -0
  310. package/dist/skill-manifest/builder.d.ts +47 -0
  311. package/dist/skill-manifest/builder.d.ts.map +1 -0
  312. package/dist/skill-manifest/builder.js +93 -0
  313. package/dist/skill-manifest/builder.js.map +1 -0
  314. package/dist/skill-manifest/index.d.ts +13 -0
  315. package/dist/skill-manifest/index.d.ts.map +1 -0
  316. package/dist/skill-manifest/index.js +9 -0
  317. package/dist/skill-manifest/index.js.map +1 -0
  318. package/dist/skill-manifest/types.d.ts +67 -0
  319. package/dist/skill-manifest/types.d.ts.map +1 -0
  320. package/dist/skill-manifest/types.js +16 -0
  321. package/dist/skill-manifest/types.js.map +1 -0
  322. package/dist/skill-manifest/verifier.d.ts +42 -0
  323. package/dist/skill-manifest/verifier.d.ts.map +1 -0
  324. package/dist/skill-manifest/verifier.js +136 -0
  325. package/dist/skill-manifest/verifier.js.map +1 -0
  326. package/dist/skills/brain-query.d.ts +4 -4
  327. package/dist/skills/brain-store.d.ts +6 -6
  328. package/dist/skills/errors.d.ts +15 -0
  329. package/dist/skills/errors.d.ts.map +1 -1
  330. package/dist/skills/errors.js +21 -0
  331. package/dist/skills/errors.js.map +1 -1
  332. package/dist/skills/hitl-request.d.ts +2 -2
  333. package/dist/skills/index.d.ts +3 -1
  334. package/dist/skills/index.d.ts.map +1 -1
  335. package/dist/skills/index.js +4 -1
  336. package/dist/skills/index.js.map +1 -1
  337. package/dist/skills/markdown/loader.d.ts +52 -0
  338. package/dist/skills/markdown/loader.d.ts.map +1 -0
  339. package/dist/skills/markdown/loader.js +93 -0
  340. package/dist/skills/markdown/loader.js.map +1 -0
  341. package/dist/skills/markdown/schema.d.ts +432 -0
  342. package/dist/skills/markdown/schema.d.ts.map +1 -0
  343. package/dist/skills/markdown/schema.js +121 -0
  344. package/dist/skills/markdown/schema.js.map +1 -0
  345. package/dist/skills/poc-md-loader/markdown-loader.d.ts +77 -0
  346. package/dist/skills/poc-md-loader/markdown-loader.d.ts.map +1 -0
  347. package/dist/skills/poc-md-loader/markdown-loader.js +125 -0
  348. package/dist/skills/poc-md-loader/markdown-loader.js.map +1 -0
  349. package/dist/skills/poc-md-loader/runner.d.ts +24 -0
  350. package/dist/skills/poc-md-loader/runner.d.ts.map +1 -0
  351. package/dist/skills/poc-md-loader/runner.js +57 -0
  352. package/dist/skills/poc-md-loader/runner.js.map +1 -0
  353. package/dist/skills/poc-md-loader/vitest.poc.config.d.ts +3 -0
  354. package/dist/skills/poc-md-loader/vitest.poc.config.d.ts.map +1 -0
  355. package/dist/skills/poc-md-loader/vitest.poc.config.js +13 -0
  356. package/dist/skills/poc-md-loader/vitest.poc.config.js.map +1 -0
  357. package/dist/skills/poc-md-loader/web-search/script.d.ts +33 -0
  358. package/dist/skills/poc-md-loader/web-search/script.d.ts.map +1 -0
  359. package/dist/skills/poc-md-loader/web-search/script.js +75 -0
  360. package/dist/skills/poc-md-loader/web-search/script.js.map +1 -0
  361. package/dist/skills/record-outcome.d.ts +4 -4
  362. package/dist/skills/send-email.d.ts.map +1 -1
  363. package/dist/skills/send-email.js +15 -3
  364. package/dist/skills/send-email.js.map +1 -1
  365. package/dist/skills/slack-notify.d.ts +4 -4
  366. package/dist/skills/starknet-balance.d.ts +1 -1
  367. package/dist/skills/telegram-notify.d.ts +4 -4
  368. package/dist/skills/web-search.d.ts +1 -1
  369. package/dist/testing/contracts/event-bus.contract.d.ts.map +1 -1
  370. package/dist/testing/contracts/event-bus.contract.js +14 -12
  371. package/dist/testing/contracts/event-bus.contract.js.map +1 -1
  372. package/dist/testing/index.d.ts +3 -0
  373. package/dist/testing/test-brain-port.d.ts +4 -0
  374. package/dist/testing/test-brain-port.d.ts.map +1 -1
  375. package/dist/testing/test-brain-port.js +75 -20
  376. package/dist/testing/test-brain-port.js.map +1 -1
  377. package/dist/testing/test-event-bus.d.ts.map +1 -1
  378. package/dist/testing/test-event-bus.js +89 -36
  379. package/dist/testing/test-event-bus.js.map +1 -1
  380. package/dist/trace/schema.d.ts +1 -1
  381. package/dist/trace/schema.d.ts.map +1 -1
  382. package/dist/trace/schema.js +1 -1
  383. package/dist/trace/schema.js.map +1 -1
  384. package/dist/verify/formal/index.d.ts +44 -0
  385. package/dist/verify/formal/index.d.ts.map +1 -0
  386. package/dist/verify/formal/index.js +98 -0
  387. package/dist/verify/formal/index.js.map +1 -0
  388. package/dist/verify/formal/policy.d.ts +105 -0
  389. package/dist/verify/formal/policy.d.ts.map +1 -0
  390. package/dist/verify/formal/policy.js +159 -0
  391. package/dist/verify/formal/policy.js.map +1 -0
  392. package/dist/verify/formal/result.d.ts +50 -0
  393. package/dist/verify/formal/result.d.ts.map +1 -0
  394. package/dist/verify/formal/result.js +21 -0
  395. package/dist/verify/formal/result.js.map +1 -0
  396. package/dist/verify/formal/solver.d.ts +67 -0
  397. package/dist/verify/formal/solver.d.ts.map +1 -0
  398. package/dist/verify/formal/solver.js +184 -0
  399. package/dist/verify/formal/solver.js.map +1 -0
  400. package/dist/verify/formal/spec-language.d.ts +80 -0
  401. package/dist/verify/formal/spec-language.d.ts.map +1 -0
  402. package/dist/verify/formal/spec-language.js +219 -0
  403. package/dist/verify/formal/spec-language.js.map +1 -0
  404. package/docs/attestation.md +199 -0
  405. package/docs/identity.md +193 -0
  406. package/package.json +22 -1
  407. package/src/adapters/llm/anthropic-direct.ts +51 -0
  408. package/src/adapters/llm/cascade.ts +64 -19
  409. package/src/adapters/llm/litellm.ts +49 -0
  410. package/src/compute/difficulty-estimator.ts +111 -0
  411. package/src/compute/strategies/mixture-of-agents.ts +150 -0
  412. package/src/compute/strategies/tree-of-thoughts.ts +293 -0
  413. package/src/compute/strategies/two-phase-orient.ts +147 -0
  414. package/src/container/protocol.ts +243 -0
  415. package/src/container/runtime.ts +424 -0
  416. package/src/db/migrations/026_formal_verify_results.sql +30 -0
  417. package/src/events/catalogue.ts +54 -0
  418. package/src/events/index.ts +9 -0
  419. package/src/events/schemas/citadel.sprint.analyzed.v1.ts +23 -0
  420. package/src/events/schemas/forge.inbox.reply_classified.v1.ts +15 -0
  421. package/src/events/schemas/vauban-finance.forecast.generated.v1.ts +11 -0
  422. package/src/events/schemas/vauban-finance.trade.executed.v1.ts +12 -0
  423. package/src/events/schemas/vauban.goal.checked.v1.ts +11 -0
  424. package/src/events/schemas/vauban.rebalancing.checked.v1.ts +11 -0
  425. package/src/events/schemas/vauban.tax.checked.v1.ts +11 -0
  426. package/src/events/schemas/vauban.vault.analyzed.v1.ts +21 -0
  427. package/src/events/schemas/vauban.vault.compounded.v1.ts +12 -0
  428. package/src/identity/agent-persona.ts +203 -0
  429. package/src/identity/persona-prompt.ts +84 -0
  430. package/src/identity/persona-schema.ts +127 -0
  431. package/src/index.ts +338 -1
  432. package/src/loop/index.ts +0 -1
  433. package/src/loop/sdk-loop.ts +5 -8
  434. package/src/memory/episodic-rrf.ts +224 -0
  435. package/src/mesh/attenuation.ts +190 -0
  436. package/src/mesh/delegate.ts +254 -0
  437. package/src/mesh/dispatcher.ts +301 -0
  438. package/src/mesh/index.ts +39 -0
  439. package/src/mesh/types.ts +31 -0
  440. package/src/orchestration/ooda/skills.ts +177 -0
  441. package/src/orchestration/ooda/types.ts +3 -9
  442. package/src/ports/bastion-action.contract.test.ts +355 -0
  443. package/src/ports/bastion-action.ts +198 -0
  444. package/src/ports/brain.ts +177 -15
  445. package/src/ports/citadel-action.contract.test.ts +430 -0
  446. package/src/ports/citadel-action.ts +174 -0
  447. package/src/ports/compliance-contract.ts +191 -0
  448. package/src/ports/db.ts +98 -0
  449. package/src/ports/delegation.contract.test.ts +428 -0
  450. package/src/ports/delegation.ts +211 -0
  451. package/src/ports/event-bus.ts +133 -18
  452. package/src/ports/federation.contract.test.ts +355 -0
  453. package/src/ports/federation.ts +190 -0
  454. package/src/ports/index.ts +186 -1
  455. package/src/ports/llm-provider.ts +123 -0
  456. package/src/ports/logger.ts +104 -0
  457. package/src/ports/manifest-registry.contract.test.ts +324 -0
  458. package/src/ports/manifest-registry.ts +188 -0
  459. package/src/ports/observability.contract.test.ts +315 -0
  460. package/src/ports/observability.ts +150 -0
  461. package/src/ports/outcome.ts +69 -0
  462. package/src/ports/privacy.contract.test.ts +413 -0
  463. package/src/ports/privacy.ts +207 -0
  464. package/src/ports/tenant-context.contract.test.ts +454 -0
  465. package/src/ports/tenant-context.ts +150 -0
  466. package/src/ports/vauban-finance-action.contract.test.ts +335 -0
  467. package/src/ports/vauban-finance-action.ts +166 -0
  468. package/src/ports/workflow-runtime.ts +327 -0
  469. package/src/proof/cert-verify.ts +249 -0
  470. package/src/replay/replay.ts +11 -8
  471. package/src/retry/index.ts +227 -0
  472. package/src/retry/presets.ts +75 -0
  473. package/src/skill-loop/ab-runner.ts +196 -0
  474. package/src/skill-loop/adoption.ts +188 -0
  475. package/src/skill-loop/candidate.ts +75 -0
  476. package/src/skill-loop/evaluator.ts +238 -0
  477. package/src/skill-loop/index.ts +51 -0
  478. package/src/skill-loop/reflexion-replay.ts +173 -0
  479. package/src/skill-loop/sign-off.ts +247 -0
  480. package/src/skill-loop/value-metric.ts +120 -0
  481. package/src/skill-loop/versioning.ts +75 -0
  482. package/src/skill-manifest/anchor.ts +401 -0
  483. package/src/skill-manifest/builder.ts +129 -0
  484. package/src/skill-manifest/index.ts +18 -0
  485. package/src/skill-manifest/types.ts +72 -0
  486. package/src/skill-manifest/verifier.ts +198 -0
  487. package/src/skills/errors.ts +30 -2
  488. package/src/skills/index.ts +19 -0
  489. package/src/skills/markdown/loader.ts +129 -0
  490. package/src/skills/markdown/schema.ts +144 -0
  491. package/src/skills/poc-md-loader/e2e-parity.test.ts +237 -0
  492. package/src/skills/poc-md-loader/markdown-loader.ts +161 -0
  493. package/src/skills/poc-md-loader/runner.ts +82 -0
  494. package/src/skills/poc-md-loader/vitest.poc.config.ts +13 -0
  495. package/src/skills/poc-md-loader/web-search/SKILL.md +42 -0
  496. package/src/skills/poc-md-loader/web-search/script.ts +109 -0
  497. package/src/skills/send-email.ts +15 -3
  498. package/src/testing/contracts/event-bus.contract.ts +16 -14
  499. package/src/testing/test-brain-port.ts +98 -24
  500. package/src/testing/test-event-bus.ts +104 -43
  501. package/src/trace/schema.ts +1 -1
  502. package/src/verify/formal/index.ts +154 -0
  503. package/src/verify/formal/policy.ts +253 -0
  504. package/src/verify/formal/result.ts +52 -0
  505. package/src/verify/formal/solver.ts +235 -0
  506. package/src/verify/formal/spec-language.ts +274 -0
@@ -0,0 +1,355 @@
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
+
10
+ import { describe, expect, test } from "vitest";
11
+ import {
12
+ BastionPolicyViolationError,
13
+ BastionSlippageExceededError,
14
+ BastionTransferUnauthorizedError,
15
+ type BastionActionPort,
16
+ type ActionContext,
17
+ type SwapParams,
18
+ type TransferParams,
19
+ type ClientPolicy,
20
+ type PolicyValidation,
21
+ type TenantId,
22
+ type DepositParams,
23
+ type SwapResult,
24
+ type DepositResult,
25
+ type WithdrawParams,
26
+ type WithdrawResult,
27
+ type TransferResult,
28
+ type TokenAddress,
29
+ } from "./bastion-action.js";
30
+
31
+ function makeActionContext(
32
+ overrides: Partial<ActionContext> = {}
33
+ ): ActionContext {
34
+ return {
35
+ tenantId: "tenant-001",
36
+ manifestHash: "abc123def456",
37
+ runId: crypto.randomUUID(),
38
+ ...overrides,
39
+ };
40
+ }
41
+
42
+ function makeSwapParams(overrides: Partial<SwapParams> = {}): SwapParams {
43
+ return {
44
+ token_in: "0xdeadbeef" as any,
45
+ token_out: "0xcafebabe" as any,
46
+ amount: "1000000000000000000", // 1e18
47
+ max_slippage_bps: 50, // 0.5%
48
+ deadline: Math.floor(Date.now() / 1000) + 3600,
49
+ ...overrides,
50
+ };
51
+ }
52
+
53
+ function makeTransferParams(
54
+ overrides: Partial<TransferParams> = {}
55
+ ): TransferParams {
56
+ return {
57
+ recipient: "0x1234567890abcdef",
58
+ amount: "1000000",
59
+ token: "0xdeadbeef" as any,
60
+ ...overrides,
61
+ };
62
+ }
63
+
64
+ export const bastionActionPortContract = (factory: () => BastionActionPort) => {
65
+ describe("BastionActionPort contract", () => {
66
+ test("swap succeeds within slippage tolerance", async () => {
67
+ const port = factory();
68
+ const params = makeSwapParams({ max_slippage_bps: 100 });
69
+ const ctx = makeActionContext();
70
+
71
+ // Validate passes first
72
+ const validation = await port.validateAgainstClientPolicies(
73
+ "swap",
74
+ ctx.tenantId
75
+ );
76
+ expect(validation.valid).toBe(true);
77
+
78
+ // Mock successful swap — implementation should not throw
79
+ const result = await port.swap(params, ctx);
80
+ expect(result.tx_hash).toBeDefined();
81
+ expect(result.actual_slippage_bps).toBeLessThanOrEqual(
82
+ params.max_slippage_bps
83
+ );
84
+ });
85
+
86
+ test("swap throws BastionSlippageExceededError when actual > max", async () => {
87
+ const port = factory();
88
+ const params = makeSwapParams({ max_slippage_bps: 10 }); // 0.1% max, will exceed
89
+ const ctx = makeActionContext();
90
+
91
+ await expect(port.swap(params, ctx)).rejects.toThrow(
92
+ BastionSlippageExceededError
93
+ );
94
+ });
95
+
96
+ test("transfer requires legalBasis in ctx", async () => {
97
+ const port = factory();
98
+ const params = makeTransferParams();
99
+ const ctx = makeActionContext({ legalBasis: undefined });
100
+
101
+ // Validate passes, but execution should fail without legalBasis
102
+ await expect(port.transfer(params, ctx)).rejects.toThrow(
103
+ BastionTransferUnauthorizedError
104
+ );
105
+ });
106
+
107
+ test("transfer succeeds with legalBasis (TFR Art 4)", async () => {
108
+ const port = factory();
109
+ const params = makeTransferParams();
110
+ const ctx = makeActionContext({ legalBasis: "tfr.art4" });
111
+
112
+ const result = await port.transfer(params, ctx);
113
+ expect(result.tx_hash).toBeDefined();
114
+ expect(result.recipient).toBe(params.recipient);
115
+ expect(result.amount).toBe(params.amount);
116
+ });
117
+
118
+ test("validateAgainstClientPolicies returns valid=false for out-of-scope actions", async () => {
119
+ const port = factory();
120
+ const tenantId = "restricted-tenant";
121
+
122
+ // Validate should block an action that's not in tenant's allowed_actions
123
+ const validation = await port.validateAgainstClientPolicies(
124
+ "swap",
125
+ tenantId
126
+ );
127
+
128
+ if (!validation.valid) {
129
+ expect(validation.violations.length).toBeGreaterThan(0);
130
+ }
131
+ });
132
+
133
+ test("validateAgainstClientPolicies enforces max_slippage_bps constraint", async () => {
134
+ const port = factory();
135
+ const tenantId = "tenant-001";
136
+
137
+ // Validate with slippage params that exceed policy
138
+ const params = makeSwapParams({ max_slippage_bps: 5000 }); // 50% (extreme)
139
+ const validation = await port.validateAgainstClientPolicies(
140
+ "swap",
141
+ tenantId,
142
+ params
143
+ );
144
+
145
+ // Expected: violation if policy max < 5000 bps
146
+ if (!validation.valid) {
147
+ expect(validation.violations.some((v) => v.includes("slippage"))).toBe(
148
+ true
149
+ );
150
+ }
151
+ });
152
+
153
+ test("validateAgainstClientPolicies caches client_policies (TTL 60s)", async () => {
154
+ const port = factory();
155
+ const tenantId = "tenant-001";
156
+
157
+ // First call — cache miss, fetches policy
158
+ const validation1 = await port.validateAgainstClientPolicies(
159
+ "deposit",
160
+ tenantId
161
+ );
162
+ expect(validation1).toBeDefined();
163
+
164
+ // Second call immediately — should use cache, same policy_hash
165
+ const validation2 = await port.validateAgainstClientPolicies(
166
+ "deposit",
167
+ tenantId
168
+ );
169
+ if (validation1.policy_hash && validation2.policy_hash) {
170
+ expect(validation2.policy_hash).toBe(validation1.policy_hash);
171
+ }
172
+ });
173
+
174
+ test("deposit succeeds with valid params", async () => {
175
+ const port = factory();
176
+ const params = {
177
+ vault_address: "0xvault001" as any,
178
+ amount: "1000000000000000000",
179
+ token: "0xdeadbeef" as any,
180
+ };
181
+ const ctx = makeActionContext();
182
+
183
+ const validation = await port.validateAgainstClientPolicies(
184
+ "deposit",
185
+ ctx.tenantId
186
+ );
187
+ if (validation.valid) {
188
+ const result = await port.deposit(params, ctx);
189
+ expect(result.tx_hash).toBeDefined();
190
+ expect(result.shares_minted).toBeDefined();
191
+ }
192
+ });
193
+
194
+ test("withdraw succeeds with valid params", async () => {
195
+ const port = factory();
196
+ const params = {
197
+ vault_address: "0xvault001" as any,
198
+ shares: "500000000000000000",
199
+ };
200
+ const ctx = makeActionContext();
201
+
202
+ const result = await port.withdraw(params, ctx);
203
+ expect(result.tx_hash).toBeDefined();
204
+ expect(result.amount_withdrawn).toBeDefined();
205
+ });
206
+
207
+ test("policy violation includes action and tenantId in error", async () => {
208
+ const port = factory();
209
+ const tenantId = "restricted-tenant";
210
+
211
+ try {
212
+ await port.validateAgainstClientPolicies("swap", tenantId);
213
+ } catch (err) {
214
+ if (err instanceof BastionPolicyViolationError) {
215
+ expect(err.action).toBe("swap");
216
+ expect(err.tenantId).toBe(tenantId);
217
+ }
218
+ }
219
+ });
220
+ });
221
+ };
222
+
223
+ // ─── Mock implementation ──────────────────────────────────────────────────
224
+
225
+ class MockBastionActionPort implements BastionActionPort {
226
+ private policyCache = new Map<string, { policy: ClientPolicy; ts: number }>();
227
+
228
+ async validateAgainstClientPolicies(
229
+ action: "swap" | "deposit" | "withdraw" | "transfer",
230
+ tenantId: TenantId,
231
+ params?: Partial<SwapParams & DepositParams>
232
+ ): Promise<PolicyValidation> {
233
+ // Simulate policy fetch with cache
234
+ const cached = this.policyCache.get(tenantId);
235
+ const now = Date.now();
236
+ const policy =
237
+ cached && now - cached.ts < 60000
238
+ ? cached.policy
239
+ : this.getDefaultPolicy(tenantId);
240
+
241
+ if (policy) {
242
+ this.policyCache.set(tenantId, { policy, ts: now });
243
+ }
244
+
245
+ const violations: string[] = [];
246
+
247
+ // Check if action is allowed
248
+ if (!policy.allowed_actions.includes(action)) {
249
+ violations.push(`action '${action}' not in allowed_actions`);
250
+ }
251
+
252
+ // Check slippage constraint if params provided
253
+ if (
254
+ params &&
255
+ "max_slippage_bps" in params &&
256
+ ((params as SwapParams).max_slippage_bps ?? 0) > policy.max_slippage_bps
257
+ ) {
258
+ violations.push(
259
+ `slippage ${params.max_slippage_bps} bps exceeds policy max ${policy.max_slippage_bps} bps`
260
+ );
261
+ }
262
+
263
+ const valid = violations.length === 0;
264
+ return {
265
+ valid,
266
+ violations,
267
+ policy_hash: `hash-${tenantId}-${action}`,
268
+ };
269
+ }
270
+
271
+ private getDefaultPolicy(tenantId: TenantId): ClientPolicy {
272
+ if (tenantId === "restricted-tenant") {
273
+ return {
274
+ max_slippage_bps: 100,
275
+ allowed_pairs: [],
276
+ daily_volume_cap: "0",
277
+ deposit_cap: "0",
278
+ allowed_actions: [],
279
+ cache_ttl_seconds: 60,
280
+ };
281
+ }
282
+ return {
283
+ max_slippage_bps: 500,
284
+ allowed_pairs: [
285
+ ["0xdeadbeef" as TokenAddress, "0xcafebabe" as TokenAddress],
286
+ ],
287
+ daily_volume_cap: "1000000000000000000000",
288
+ deposit_cap: "500000000000000000000",
289
+ allowed_actions: ["swap", "deposit", "withdraw", "transfer"],
290
+ cache_ttl_seconds: 60,
291
+ };
292
+ }
293
+
294
+ async swap(params: SwapParams, _ctx: ActionContext): Promise<SwapResult> {
295
+ // Simulate slippage calculation: if max_slippage_bps is very low, exceed it
296
+ const actualSlippageBps = params.max_slippage_bps < 20 ? 50 : 10;
297
+
298
+ if (actualSlippageBps > params.max_slippage_bps) {
299
+ throw new BastionSlippageExceededError(
300
+ params.max_slippage_bps,
301
+ actualSlippageBps
302
+ );
303
+ }
304
+
305
+ return {
306
+ tx_hash: `0x${crypto.randomUUID().replace(/-/g, "")}`,
307
+ amount_out: (BigInt(params.amount) * BigInt(99)) / BigInt(100),
308
+ actual_slippage_bps: actualSlippageBps,
309
+ executed_at: new Date(),
310
+ };
311
+ }
312
+
313
+ async deposit(
314
+ params: DepositParams,
315
+ _ctx: ActionContext
316
+ ): Promise<DepositResult> {
317
+ return {
318
+ tx_hash: `0x${crypto.randomUUID().replace(/-/g, "")}`,
319
+ shares_minted: (BigInt(params.amount) * BigInt(95)) / BigInt(100),
320
+ deposit_amount: params.amount,
321
+ };
322
+ }
323
+
324
+ async withdraw(
325
+ params: WithdrawParams,
326
+ _ctx: ActionContext
327
+ ): Promise<WithdrawResult> {
328
+ return {
329
+ tx_hash: `0x${crypto.randomUUID().replace(/-/g, "")}`,
330
+ amount_withdrawn: (BigInt(params.shares) * BigInt(98)) / BigInt(100),
331
+ };
332
+ }
333
+
334
+ async transfer(
335
+ params: TransferParams,
336
+ ctx: ActionContext
337
+ ): Promise<TransferResult> {
338
+ if (!ctx.legalBasis) {
339
+ throw new BastionTransferUnauthorizedError(
340
+ "Transfer requires legalBasis (TFR Art 4)",
341
+ "missing_legal_basis"
342
+ );
343
+ }
344
+
345
+ return {
346
+ tx_hash: `0x${crypto.randomUUID().replace(/-/g, "")}`,
347
+ recipient: params.recipient,
348
+ amount: params.amount,
349
+ };
350
+ }
351
+ }
352
+
353
+ // ─── Default contract application ──────────────────────────────────────────
354
+
355
+ bastionActionPortContract(() => new MockBastionActionPort());
@@ -0,0 +1,198 @@
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
+
10
+ // ─── Types ─────────────────────────────────────────────────────────────────
11
+
12
+ export type TokenAddress = string & { readonly __brand: "TokenAddress" };
13
+ export type VaultAddress = string & { readonly __brand: "VaultAddress" };
14
+ export type TenantId = string;
15
+
16
+ export interface SwapParams {
17
+ readonly token_in: TokenAddress;
18
+ readonly token_out: TokenAddress;
19
+ readonly amount: string; // wei/felt252 numeric string
20
+ readonly max_slippage_bps: number; // basis points [0, 10000]
21
+ readonly deadline: number; // Unix timestamp
22
+ }
23
+
24
+ export interface DepositParams {
25
+ readonly vault_address: VaultAddress;
26
+ readonly amount: string;
27
+ readonly token: TokenAddress;
28
+ }
29
+
30
+ export interface WithdrawParams {
31
+ readonly vault_address: VaultAddress;
32
+ readonly shares: string;
33
+ }
34
+
35
+ export interface TransferParams {
36
+ readonly recipient: string;
37
+ readonly amount: string;
38
+ readonly token: TokenAddress;
39
+ }
40
+
41
+ export interface ActionContext {
42
+ readonly tenantId: TenantId;
43
+ readonly manifestHash: string; // sha256 hex
44
+ readonly runId: string; // workflow run id
45
+ readonly legalBasis?: string; // TFR Art 4 or equivalent
46
+ readonly jurisdictionsContext?: string[];
47
+ }
48
+
49
+ // ─── Results ─────────────────────────────────────────────────────────────────
50
+
51
+ export interface SwapResult {
52
+ readonly tx_hash: string;
53
+ readonly amount_out: string;
54
+ readonly actual_slippage_bps: number;
55
+ readonly executed_at: Date;
56
+ }
57
+
58
+ export interface DepositResult {
59
+ readonly tx_hash: string;
60
+ readonly shares_minted: string;
61
+ readonly deposit_amount: string;
62
+ }
63
+
64
+ export interface WithdrawResult {
65
+ readonly tx_hash: string;
66
+ readonly amount_withdrawn: string;
67
+ }
68
+
69
+ export interface TransferResult {
70
+ readonly tx_hash: string;
71
+ readonly recipient: string;
72
+ readonly amount: string;
73
+ }
74
+
75
+ // ─── Client policies (runtime constraints) ────────────────────────────────
76
+
77
+ export interface ClientPolicy {
78
+ readonly max_slippage_bps: number;
79
+ readonly allowed_pairs: readonly [TokenAddress, TokenAddress][];
80
+ readonly daily_volume_cap: string; // wei
81
+ readonly deposit_cap: string; // wei
82
+ readonly allowed_actions: readonly (
83
+ | "swap"
84
+ | "deposit"
85
+ | "withdraw"
86
+ | "transfer"
87
+ )[];
88
+ readonly cache_ttl_seconds: number;
89
+ }
90
+
91
+ export interface PolicyValidation {
92
+ readonly valid: boolean;
93
+ readonly violations: readonly string[];
94
+ readonly policy_hash?: string;
95
+ }
96
+
97
+ // ─── Port interface ────────────────────────────────────────────────────────
98
+
99
+ export interface BastionActionPort {
100
+ /**
101
+ * Swap tokens on Bastion CoW intents.
102
+ * Throws BastionSlippageExceededError if actual slippage > max_slippage_bps.
103
+ */
104
+ swap(params: SwapParams, ctx: ActionContext): Promise<SwapResult>;
105
+
106
+ /**
107
+ * Deposit into a Bastion vault.
108
+ * Throws BastionInsufficientFundsError if user balance < amount.
109
+ */
110
+ deposit(params: DepositParams, ctx: ActionContext): Promise<DepositResult>;
111
+
112
+ /**
113
+ * Withdraw shares from a Bastion vault.
114
+ */
115
+ withdraw(params: WithdrawParams, ctx: ActionContext): Promise<WithdrawResult>;
116
+
117
+ /**
118
+ * Transfer tokens. Requires legalBasis in ctx per TFR Art 4.
119
+ * Throws BastionTransferUnauthorizedError if legalBasis absent.
120
+ */
121
+ transfer(params: TransferParams, ctx: ActionContext): Promise<TransferResult>;
122
+
123
+ /**
124
+ * Validate action against manifest ∩ client_policies intersection (T-E invariant).
125
+ * Caches client_policies for tenant TTL 60s; invalidation event-driven.
126
+ * Throws BastionPolicyViolationError if action ∉ intersection.
127
+ */
128
+ validateAgainstClientPolicies(
129
+ action: "swap" | "deposit" | "withdraw" | "transfer",
130
+ tenantId: TenantId,
131
+ params?: Partial<SwapParams & DepositParams>
132
+ ): Promise<PolicyValidation>;
133
+ }
134
+
135
+ // ─── Typed errors ─────────────────────────────────────────────────────────
136
+
137
+ export class BastionPolicyViolationError extends Error {
138
+ constructor(
139
+ message: string,
140
+ public readonly action: string,
141
+ public readonly tenantId: TenantId,
142
+ public readonly cause?: unknown
143
+ ) {
144
+ super(message);
145
+ this.name = "BastionPolicyViolationError";
146
+ Object.setPrototypeOf(this, new.target.prototype);
147
+ }
148
+ }
149
+
150
+ export class BastionInsufficientFundsError extends Error {
151
+ constructor(
152
+ public readonly required: string,
153
+ public readonly available: string,
154
+ public readonly cause?: unknown
155
+ ) {
156
+ super(`Insufficient funds: required ${required}, available ${available}`);
157
+ this.name = "BastionInsufficientFundsError";
158
+ Object.setPrototypeOf(this, new.target.prototype);
159
+ }
160
+ }
161
+
162
+ export class BastionSlippageExceededError extends Error {
163
+ constructor(
164
+ public readonly max_slippage_bps: number,
165
+ public readonly actual_slippage_bps: number,
166
+ public readonly cause?: unknown
167
+ ) {
168
+ super(
169
+ `Slippage exceeded: max ${max_slippage_bps} bps, actual ${actual_slippage_bps} bps`
170
+ );
171
+ this.name = "BastionSlippageExceededError";
172
+ Object.setPrototypeOf(this, new.target.prototype);
173
+ }
174
+ }
175
+
176
+ export class BastionContractError extends Error {
177
+ constructor(
178
+ public readonly contract_call: string,
179
+ public readonly contract_error: string,
180
+ public readonly cause?: unknown
181
+ ) {
182
+ super(`Contract error on ${contract_call}: ${contract_error}`);
183
+ this.name = "BastionContractError";
184
+ Object.setPrototypeOf(this, new.target.prototype);
185
+ }
186
+ }
187
+
188
+ export class BastionTransferUnauthorizedError extends Error {
189
+ constructor(
190
+ message: string,
191
+ public readonly reason: "missing_legal_basis" | "jurisdiction_blocked",
192
+ public readonly cause?: unknown
193
+ ) {
194
+ super(message);
195
+ this.name = "BastionTransferUnauthorizedError";
196
+ Object.setPrototypeOf(this, new.target.prototype);
197
+ }
198
+ }