@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
@@ -49,31 +49,33 @@ export function eventBusContract(
49
49
  const testStream = "vauban.test.contract";
50
50
  const testGroup = "test-consumer-group";
51
51
 
52
- it("publishes and consumes an event", async () => {
52
+ it("publishes and consumes a domain event", async () => {
53
53
  const received: unknown[] = [];
54
- const unsub = await port.subscribe(
55
- testStream,
56
- testGroup,
54
+ const sub = port.subscribeDomain<{ message: string }>(
55
+ "tech.vauban.test.event",
57
56
  async (event) => {
58
- received.push(event.data);
59
- }
57
+ received.push(event.payload);
58
+ },
59
+ { groupId: testGroup }
60
60
  );
61
61
 
62
- await port.publish(
62
+ const testKey = "test-hmac-key-32-bytes-minimum!!";
63
+ await port.publishWithIdempotency<{ message: string }>(
63
64
  {
64
- id: "test-event-1",
65
- specversion: "1.0",
66
- source: "test",
67
65
  type: "tech.vauban.test.event",
68
- time: new Date().toISOString(),
69
- data: { message: "hello" },
66
+ source: "cc" as const,
67
+ correlationId: "contract-test-corr-1",
68
+ idempotencyKey: "contract-test-1",
69
+ timestamp: new Date().toISOString(),
70
+ schemaVersion: "1.0.0",
71
+ payload: { message: "hello" },
70
72
  },
71
- testStream
73
+ testKey
72
74
  );
73
75
 
74
76
  // Allow async delivery
75
77
  await new Promise((r) => setTimeout(r, 100));
76
- await unsub();
78
+ await sub.unsubscribe();
77
79
 
78
80
  expect(received.length).toBeGreaterThanOrEqual(1);
79
81
  });
@@ -5,17 +5,35 @@
5
5
  * Maps. Use for agent unit tests that need to archive/query without
6
6
  * external infrastructure.
7
7
  *
8
+ * OTel spans are emitted on archiveKnowledge and queryKnowledge via
9
+ * @opentelemetry/api. Gracefully degrades to noop spans when no OTel SDK
10
+ * is installed.
11
+ *
8
12
  * @public
9
13
  */
10
14
 
11
- import type { BrainPort, BrainEntry, BrainEntryInput, BrainQueryFilters } from "../ports/brain.js";
15
+ import type { Span } from "@opentelemetry/api";
16
+ import { SpanStatusCode, trace } from "@opentelemetry/api";
17
+ import type {
18
+ BrainPort,
19
+ BrainEntry,
20
+ BrainEntryInput,
21
+ BrainQueryFilters,
22
+ } from "../ports/brain.js";
12
23
  import {
13
24
  InMemoryWorkingMemory,
14
25
  InMemoryEpisodicMemory,
15
26
  InMemorySemanticMemory,
16
27
  InMemoryProceduralMemory,
17
28
  } from "../ports/brain.js";
18
- import type { WorkingMemoryPort, EpisodicMemoryPort, SemanticMemoryPort, ProceduralMemoryPort } from "../ports/brain.js";
29
+ import type {
30
+ WorkingMemoryPort,
31
+ EpisodicMemoryPort,
32
+ SemanticMemoryPort,
33
+ ProceduralMemoryPort,
34
+ } from "../ports/brain.js";
35
+
36
+ const TEST_TRACER = trace.getTracer("vauban-agent-sdk.ports.test", "0.1.0");
19
37
 
20
38
  export class TestBrainPort implements BrainPort {
21
39
  readonly working: WorkingMemoryPort;
@@ -34,31 +52,87 @@ export class TestBrainPort implements BrainPort {
34
52
  }
35
53
 
36
54
  async archiveKnowledge(entry: BrainEntryInput): Promise<BrainEntry | null> {
37
- const id = `test-${this.nextId++}`;
38
- const created: BrainEntry = {
39
- id,
40
- content: entry.content,
41
- category: entry.category,
42
- tags: entry.tags,
43
- metadata: entry.metadata as Record<string, unknown> | undefined,
44
- created_at: new Date().toISOString(),
45
- };
46
- this.entries.set(id, created);
47
- return created;
55
+ return TEST_TRACER.startActiveSpan(
56
+ "brain.archiveKnowledge",
57
+ {
58
+ attributes: {
59
+ "brain.entry.category": entry.category ?? "unknown",
60
+ "brain.entry.content_preview": entry.content.slice(0, 200),
61
+ "brain.entry.tags": entry.tags?.join(",") ?? "",
62
+ "vauban.port.name": "brain",
63
+ "vauban.port.impl": "TestBrainPort",
64
+ },
65
+ },
66
+ async (span: Span) => {
67
+ try {
68
+ const id = `test-${this.nextId++}`;
69
+ const created: BrainEntry = {
70
+ id,
71
+ content: entry.content,
72
+ category: entry.category,
73
+ tags: entry.tags,
74
+ metadata: entry.metadata as Record<string, unknown> | undefined,
75
+ created_at: new Date().toISOString(),
76
+ };
77
+ this.entries.set(id, created);
78
+ span.setAttribute("brain.entry.id", id);
79
+ span.setStatus({ code: SpanStatusCode.OK });
80
+ return created;
81
+ } catch (err) {
82
+ const message = err instanceof Error ? err.message : String(err);
83
+ span.setStatus({ code: SpanStatusCode.ERROR, message });
84
+ if (err instanceof Error) span.recordException(err);
85
+ throw err;
86
+ } finally {
87
+ span.end();
88
+ }
89
+ }
90
+ );
48
91
  }
49
92
 
50
- async queryKnowledge(query: string, filters?: BrainQueryFilters): Promise<BrainEntry[]> {
51
- let results = Array.from(this.entries.values()).filter(
52
- (e) => e.content.toLowerCase().includes(query.toLowerCase())
93
+ async queryKnowledge(
94
+ query: string,
95
+ filters?: BrainQueryFilters
96
+ ): Promise<BrainEntry[]> {
97
+ return TEST_TRACER.startActiveSpan(
98
+ "brain.queryKnowledge",
99
+ {
100
+ attributes: {
101
+ "brain.query.preview": query.slice(0, 200),
102
+ "brain.query.category": filters?.category ?? "none",
103
+ "brain.query.limit": filters?.limit ?? -1,
104
+ "vauban.port.name": "brain",
105
+ "vauban.port.impl": "TestBrainPort",
106
+ },
107
+ },
108
+ async (span: Span) => {
109
+ try {
110
+ let results = Array.from(this.entries.values()).filter((e) =>
111
+ e.content.toLowerCase().includes(query.toLowerCase())
112
+ );
113
+ if (filters?.category) {
114
+ results = results.filter((e) => e.category === filters.category);
115
+ }
116
+ if (filters?.tags && filters.tags.length > 0) {
117
+ results = results.filter((e) =>
118
+ e.tags?.some((t) => (filters.tags as string[]).includes(t))
119
+ );
120
+ }
121
+ const limit = (filters?.limit as number) ?? 10;
122
+ const sliced = results.slice(0, limit);
123
+ span.setAttribute("brain.query.result_count", sliced.length);
124
+ span.setStatus({ code: SpanStatusCode.OK });
125
+ return sliced;
126
+ } catch (err) {
127
+ const message = err instanceof Error ? err.message : String(err);
128
+ span.setStatus({ code: SpanStatusCode.ERROR, message });
129
+ if (err instanceof Error) span.recordException(err);
130
+ throw err;
131
+ } finally {
132
+ span.end();
133
+ }
134
+ }
53
135
  );
54
- if (filters?.category) {
55
- results = results.filter((e) => e.category === filters.category);
56
- }
57
- if (filters?.tags && filters.tags.length > 0) {
58
- results = results.filter((e) => e.tags?.some((t) => (filters.tags as string[]).includes(t)));
59
- }
60
- const limit = (filters?.limit as number) ?? 10;
61
- return results.slice(0, limit);
62
136
  }
63
137
 
64
138
  /** Clear all entries. */
@@ -13,6 +13,8 @@
13
13
  * @public
14
14
  */
15
15
 
16
+ import type { Span } from "@opentelemetry/api";
17
+ import { SpanStatusCode, trace } from "@opentelemetry/api";
16
18
  import type {
17
19
  CloudEvent,
18
20
  DomainEvent,
@@ -23,6 +25,8 @@ import { signEvent } from "../auth/sign-event.js";
23
25
  import { verifyEvent } from "../auth/verify-event.js";
24
26
  import { InMemoryNonceStore } from "../auth/nonce-store.js";
25
27
 
28
+ const TEST_TRACER = trace.getTracer("vauban-agent-sdk.ports.test", "0.1.0");
29
+
26
30
  type CloudHandler = (event: CloudEvent) => Promise<void>;
27
31
  type DomainHandler<T = unknown> = (event: DomainEvent<T>) => Promise<void>;
28
32
 
@@ -59,57 +63,114 @@ export class TestEventBus implements EventBusPort {
59
63
  // ─── EventBusPort ──────────────────────────────────────────────────────────
60
64
 
61
65
  async publish(event: CloudEvent, stream: string): Promise<void> {
62
- if (!event.id) throw new Error("CloudEvent.id is required");
63
- if (event.specversion !== "1.0")
64
- throw new Error("CloudEvent.specversion must be 1.0");
65
-
66
- const events = this.streams.get(stream) ?? [];
67
- events.push(event);
68
- this.streams.set(stream, events);
69
-
70
- // Track consumed events per stream
71
- const consumed = this._consumed.get(stream) ?? [];
72
- consumed.push(event);
73
- this._consumed.set(stream, consumed);
74
-
75
- // Dispatch to subscribers
76
- const streamSubs = this.subscribers.get(stream);
77
- if (streamSubs) {
78
- for (const handler of streamSubs.values()) {
79
- await handler(event);
66
+ return TEST_TRACER.startActiveSpan(
67
+ "event-bus.publish",
68
+ {
69
+ attributes: {
70
+ "event.type": event.type,
71
+ "event.stream": stream,
72
+ "event.id": event.id,
73
+ "vauban.port.name": "event-bus",
74
+ "vauban.port.impl": "TestEventBus",
75
+ },
76
+ },
77
+ async (span: Span) => {
78
+ try {
79
+ if (!event.id) throw new Error("CloudEvent.id is required");
80
+ if (event.specversion !== "1.0")
81
+ throw new Error("CloudEvent.specversion must be 1.0");
82
+
83
+ const events = this.streams.get(stream) ?? [];
84
+ events.push(event);
85
+ this.streams.set(stream, events);
86
+
87
+ // Track consumed events per stream
88
+ const consumed = this._consumed.get(stream) ?? [];
89
+ consumed.push(event);
90
+ this._consumed.set(stream, consumed);
91
+
92
+ // Dispatch to subscribers
93
+ const streamSubs = this.subscribers.get(stream);
94
+ if (streamSubs) {
95
+ for (const handler of streamSubs.values()) {
96
+ await handler(event);
97
+ }
98
+ }
99
+ span.setStatus({ code: SpanStatusCode.OK });
100
+ } catch (err) {
101
+ const message = err instanceof Error ? err.message : String(err);
102
+ span.setStatus({ code: SpanStatusCode.ERROR, message });
103
+ if (err instanceof Error) span.recordException(err);
104
+ throw err;
105
+ } finally {
106
+ span.end();
107
+ }
80
108
  }
81
- }
109
+ );
82
110
  }
83
111
 
84
112
  async publishWithIdempotency<T>(
85
113
  event: Omit<DomainEvent<T>, "signature">,
86
114
  key: string
87
115
  ): Promise<void> {
88
- // Dedup: silently skip if key already processed (producer-side)
89
- const isNew = await this.publishIdempotencyStore.setNX(key, 10 * 60 * 1000);
90
- if (!isNew) return;
91
-
92
- // Auto-sign the event
93
- const signature = signEvent(
94
- event as Omit<DomainEvent, "signature">,
95
- this.signingSecret
96
- );
97
- const signed: DomainEvent<T> = { ...(event as DomainEvent<T>), signature };
98
-
99
- // Store in domain stream
100
- const streamKey = `domain:${event.type}`;
101
- const stored = this.domainStreams.get(streamKey) ?? [];
102
- const streamId = `${Date.now()}-${stored.length}`;
103
- stored.push({ streamId, event: signed as DomainEvent });
104
- this.domainStreams.set(streamKey, stored);
105
-
106
- // Dispatch to domain subscribers
107
- const typeSubs = this.domainSubscribers.get(event.type);
108
- if (typeSubs) {
109
- for (const handler of typeSubs.values()) {
110
- await (handler as DomainHandler<T>)(signed);
116
+ return TEST_TRACER.startActiveSpan(
117
+ "event-bus.publishWithIdempotency",
118
+ {
119
+ attributes: {
120
+ "event.type": event.type,
121
+ "event.idempotency_key": key,
122
+ "vauban.port.name": "event-bus",
123
+ "vauban.port.impl": "TestEventBus",
124
+ },
125
+ },
126
+ async (span: Span) => {
127
+ try {
128
+ // Dedup: silently skip if key already processed (producer-side)
129
+ const isNew = await this.publishIdempotencyStore.setNX(
130
+ key,
131
+ 10 * 60 * 1000
132
+ );
133
+ if (!isNew) {
134
+ span.setAttribute("event.dedup.skipped", true);
135
+ span.setStatus({ code: SpanStatusCode.OK });
136
+ return;
137
+ }
138
+
139
+ // Auto-sign the event
140
+ const signature = signEvent(
141
+ event as Omit<DomainEvent, "signature">,
142
+ this.signingSecret
143
+ );
144
+ const signed: DomainEvent<T> = {
145
+ ...(event as DomainEvent<T>),
146
+ signature,
147
+ };
148
+
149
+ // Store in domain stream
150
+ const streamKey = `domain:${event.type}`;
151
+ const stored = this.domainStreams.get(streamKey) ?? [];
152
+ const streamId = `${Date.now()}-${stored.length}`;
153
+ stored.push({ streamId, event: signed as DomainEvent });
154
+ this.domainStreams.set(streamKey, stored);
155
+
156
+ // Dispatch to domain subscribers
157
+ const typeSubs = this.domainSubscribers.get(event.type);
158
+ if (typeSubs) {
159
+ for (const handler of typeSubs.values()) {
160
+ await (handler as DomainHandler<T>)(signed);
161
+ }
162
+ }
163
+ span.setStatus({ code: SpanStatusCode.OK });
164
+ } catch (err) {
165
+ const message = err instanceof Error ? err.message : String(err);
166
+ span.setStatus({ code: SpanStatusCode.ERROR, message });
167
+ if (err instanceof Error) span.recordException(err);
168
+ throw err;
169
+ } finally {
170
+ span.end();
171
+ }
111
172
  }
112
- }
173
+ );
113
174
  }
114
175
 
115
176
  subscribe(
@@ -15,7 +15,7 @@
15
15
 
16
16
  /** Semver version of this trace schema. Increment MINOR on additive changes,
17
17
  * MAJOR on breaking changes (new required fields or removed fields). */
18
- export const TRACE_SCHEMA_VERSION = "0.1.0-draft" as const;
18
+ export const TRACE_SCHEMA_VERSION = "1.0.0" as const;
19
19
 
20
20
  /** Status of an optional TSA receipt for a Trace. */
21
21
  export type ReceiptStatus = "present" | "pending" | "failed";
@@ -0,0 +1,154 @@
1
+ /**
2
+ * src/verify/formal/index.ts
3
+ *
4
+ * Sprint-587 — Formal verification entry point.
5
+ *
6
+ * Orchestrates : AxiomSpec → SMT-LIB → Z3 subprocess → 4-state result →
7
+ * (optionally) per-axiom policy decision.
8
+ *
9
+ * When `z3` is not in PATH, every spec resolves to UNKNOWN with a uniform
10
+ * rationale. Callers can then apply their policies — typically resulting in
11
+ * escalation or log (depending on the axiom and consumer mode).
12
+ *
13
+ * @module verify/formal
14
+ */
15
+
16
+ import type { FormalVerifyResult } from "./result.js";
17
+ import {
18
+ type AxiomPolicy,
19
+ type ConsumerMode,
20
+ type PolicyDecision,
21
+ type VerifyContext,
22
+ DEFAULT_POLICIES,
23
+ applyPolicy,
24
+ } from "./policy.js";
25
+ import { type AxiomSpec, compileToSmt } from "./spec-language.js";
26
+ import { checkSmt, isZ3Available } from "./solver.js";
27
+
28
+ export {
29
+ type FormalVerifyResult,
30
+ type FormalVerifyState,
31
+ type FormalSolver,
32
+ } from "./result.js";
33
+ export {
34
+ type AxiomPolicy,
35
+ type ConsumerMode,
36
+ type VerifyContext,
37
+ type PolicyAction,
38
+ type PolicyDecision,
39
+ type OnUnknown,
40
+ type OnUnsafe,
41
+ DEFAULT_POLICIES,
42
+ applyPolicy,
43
+ } from "./policy.js";
44
+ export {
45
+ type AxiomSpec,
46
+ type Condition,
47
+ AXIOM_SPECS,
48
+ compileToSmt,
49
+ } from "./spec-language.js";
50
+ export {
51
+ type SmtCheckResult,
52
+ type SolverOptions,
53
+ checkSmt,
54
+ isZ3Available,
55
+ } from "./solver.js";
56
+
57
+ /**
58
+ * Bundle returned by {@link formalVerify} : the raw verification result plus
59
+ * the policy-resolved decision.
60
+ */
61
+ export interface FormalVerifyDecision {
62
+ result: FormalVerifyResult;
63
+ decision: PolicyDecision;
64
+ }
65
+
66
+ /**
67
+ * Verify every supplied AxiomSpec, apply the per-axiom policy, and return
68
+ * one {@link FormalVerifyDecision} per spec.
69
+ *
70
+ * If `z3` is not available on PATH, every result is UNKNOWN with
71
+ * `solver: "none"`, and the policy layer handles routing.
72
+ *
73
+ * @param axiomSpecs List of specs to verify (typically derived from
74
+ * {@link AXIOM_SPECS}, possibly customised).
75
+ * @param mode Consumer mode (strict / permissive / audit_only).
76
+ * @param context Calling context (runtime / skill_ingestion).
77
+ * @param customPolicies Optional override map keyed by axiom label.
78
+ */
79
+ export async function formalVerify(
80
+ axiomSpecs: AxiomSpec[],
81
+ mode: ConsumerMode,
82
+ context: VerifyContext,
83
+ customPolicies?: Partial<Record<string, AxiomPolicy>>
84
+ ): Promise<FormalVerifyDecision[]> {
85
+ const z3Available = await isZ3Available();
86
+
87
+ const out: FormalVerifyDecision[] = [];
88
+
89
+ for (const spec of axiomSpecs) {
90
+ const policy = customPolicies?.[spec.axiom] ??
91
+ DEFAULT_POLICIES[
92
+ spec.axiom
93
+ ] ?? // Fallback policy for unknown axioms : permissive defaults.
94
+ {
95
+ onSafe: "proceed" as const,
96
+ onUnsafe: "escalate_human" as const,
97
+ onUnknown: "proceed_with_log" as const,
98
+ timeout_ms: spec.timeout_ms ?? 5000,
99
+ skillLoopStrict: true,
100
+ };
101
+
102
+ const timeout_ms = spec.timeout_ms ?? policy.timeout_ms ?? 5000;
103
+
104
+ let result: FormalVerifyResult;
105
+
106
+ if (!z3Available) {
107
+ result = {
108
+ state: "UNKNOWN",
109
+ axiom: spec.axiom,
110
+ rationale: "z3 binary not available on PATH",
111
+ time_ms: 0,
112
+ solver: "none",
113
+ };
114
+ } else {
115
+ const smt = compileToSmt(spec);
116
+ const smtRes = await checkSmt(smt, { timeout_ms });
117
+
118
+ if (smtRes.sat === false) {
119
+ // unsat → no counterexample → property holds → SAFE
120
+ result = {
121
+ state: "SAFE",
122
+ axiom: spec.axiom,
123
+ rationale: `Z3 proved post-conditions hold for axiom ${spec.axiom}`,
124
+ time_ms: smtRes.time_ms,
125
+ solver: "z3",
126
+ };
127
+ } else if (smtRes.sat === true) {
128
+ // sat → counterexample → property violated → UNSAFE
129
+ result = {
130
+ state: "UNSAFE",
131
+ axiom: spec.axiom,
132
+ rationale: `Z3 found a counterexample for axiom ${spec.axiom}`,
133
+ counterexample: smtRes.model,
134
+ time_ms: smtRes.time_ms,
135
+ solver: "z3",
136
+ };
137
+ } else {
138
+ // null → unknown / timeout / error → UNKNOWN
139
+ result = {
140
+ state: "UNKNOWN",
141
+ axiom: spec.axiom,
142
+ rationale: smtRes.reason ?? "z3 returned unknown",
143
+ time_ms: smtRes.time_ms,
144
+ solver: "z3",
145
+ };
146
+ }
147
+ }
148
+
149
+ const decision = applyPolicy(result, policy as AxiomPolicy, mode, context);
150
+ out.push({ result, decision });
151
+ }
152
+
153
+ return out;
154
+ }