@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,413 @@
1
+ /**
2
+ * PrivacyPort contract tests — validate V0 noop stub interface compliance.
3
+ *
4
+ * Tests verify:
5
+ * - applyMask returns input unchanged (identity function V0)
6
+ * - verifyZkProof always returns {valid: false, reason: 'noop_v0'}
7
+ * - commitToSmt returns deterministic mock root with correct structure
8
+ * - NoopPrivacyAdapter satisfies the PrivacyPort interface
9
+ * - All operations handle various context and commitment types
10
+ */
11
+
12
+ import { describe, it, expect } from "vitest";
13
+ import {
14
+ NoopPrivacyAdapter,
15
+ type RevelationMask,
16
+ type ZkProofInput,
17
+ type PrivacyContext,
18
+ type Commitment,
19
+ } from "./privacy";
20
+
21
+ describe("PrivacyPort contract", () => {
22
+ describe("applyMask", () => {
23
+ it("returns input payload unchanged (V0 identity function)", async () => {
24
+ const adapter = new NoopPrivacyAdapter();
25
+ const payload = { secret: "hidden", public: "visible", count: 42 };
26
+ const mask: RevelationMask = {
27
+ public_fields: ["public"],
28
+ private_fields: ["secret"],
29
+ };
30
+ const ctx: PrivacyContext = { user_id: "user-1", tenant_id: "tenant-a" };
31
+
32
+ const result = await adapter.applyMask(payload, mask, ctx);
33
+
34
+ expect(result).toEqual(payload);
35
+ expect(result).toBe(payload); // same reference (identity)
36
+ });
37
+
38
+ it("handles complex nested objects unchanged", async () => {
39
+ const adapter = new NoopPrivacyAdapter();
40
+ const payload = {
41
+ user: {
42
+ id: "u1",
43
+ nested: {
44
+ secret: "data",
45
+ array: [1, 2, 3],
46
+ },
47
+ },
48
+ };
49
+ const mask: RevelationMask = {
50
+ public_fields: ["user.id"],
51
+ private_fields: ["user.nested.secret"],
52
+ };
53
+ const ctx: PrivacyContext = {};
54
+
55
+ const result = await adapter.applyMask(payload, mask, ctx);
56
+
57
+ expect(result).toEqual(payload);
58
+ });
59
+
60
+ it("accepts conditional revelation masks", async () => {
61
+ const adapter = new NoopPrivacyAdapter();
62
+ const payload = { data: "value" };
63
+ const mask: RevelationMask = {
64
+ public_fields: ["id"],
65
+ private_fields: ["secret"],
66
+ conditional: [
67
+ {
68
+ field: "email",
69
+ condition: "user_role == 'admin'",
70
+ },
71
+ ],
72
+ };
73
+ const ctx: PrivacyContext = { role: "admin" };
74
+
75
+ const result = await adapter.applyMask(payload, mask, ctx);
76
+
77
+ expect(result).toEqual(payload);
78
+ });
79
+
80
+ it("handles various payload types (string, number, array, null)", async () => {
81
+ const adapter = new NoopPrivacyAdapter();
82
+ const mask: RevelationMask = {
83
+ public_fields: [],
84
+ private_fields: [],
85
+ };
86
+ const ctx: PrivacyContext = {};
87
+
88
+ const testCases = [
89
+ "string payload",
90
+ 42,
91
+ 3.14,
92
+ true,
93
+ [1, 2, 3],
94
+ null,
95
+ undefined,
96
+ ];
97
+
98
+ for (const payload of testCases) {
99
+ const result = await adapter.applyMask(payload, mask, ctx);
100
+ expect(result).toEqual(payload);
101
+ }
102
+ });
103
+
104
+ it("context parameters are accepted and ignored (V0)", async () => {
105
+ const adapter = new NoopPrivacyAdapter();
106
+ const payload = { data: "test" };
107
+ const mask: RevelationMask = {
108
+ public_fields: [],
109
+ private_fields: [],
110
+ };
111
+
112
+ const contexts = [
113
+ { user_id: "u1" },
114
+ { tenant_id: "t1", jurisdiction: "FR.v1" },
115
+ { role: "admin", user_id: "u2", metadata: { custom: "value" } },
116
+ {},
117
+ ];
118
+
119
+ for (const ctx of contexts) {
120
+ const result = await adapter.applyMask(payload, mask, ctx);
121
+ expect(result).toEqual(payload);
122
+ }
123
+ });
124
+ });
125
+
126
+ describe("verifyZkProof", () => {
127
+ it("always returns invalid with 'noop_v0' reason", async () => {
128
+ const adapter = new NoopPrivacyAdapter();
129
+ const proof: ZkProofInput = {
130
+ proof_data: { some: "proof" },
131
+ public_inputs: { value: 42 },
132
+ };
133
+ const ctx: PrivacyContext = {};
134
+
135
+ const result = await adapter.verifyZkProof(proof, ctx);
136
+
137
+ expect(result.valid).toBe(false);
138
+ expect(result.reason).toBe("noop_v0");
139
+ expect(result.confidence).toBe(0);
140
+ });
141
+
142
+ it("handles various proof schemes (V0 ignores)", async () => {
143
+ const adapter = new NoopPrivacyAdapter();
144
+ const schemes = ["stwo", "starknet_stone", "groth16", "plonk"];
145
+
146
+ for (const scheme of schemes) {
147
+ const proof: ZkProofInput = {
148
+ proof_data: { scheme_data: "test" },
149
+ public_inputs: {},
150
+ scheme,
151
+ };
152
+ const result = await adapter.verifyZkProof(proof, {});
153
+
154
+ expect(result.valid).toBe(false);
155
+ expect(result.reason).toBe("noop_v0");
156
+ }
157
+ });
158
+
159
+ it("accepts empty public inputs", async () => {
160
+ const adapter = new NoopPrivacyAdapter();
161
+ const proof: ZkProofInput = {
162
+ proof_data: "opaque_bytes",
163
+ public_inputs: {},
164
+ };
165
+
166
+ const result = await adapter.verifyZkProof(proof, {});
167
+
168
+ expect(result.valid).toBe(false);
169
+ expect(result.reason).toBe("noop_v0");
170
+ });
171
+
172
+ it("context parameters are accepted and ignored (V0)", async () => {
173
+ const adapter = new NoopPrivacyAdapter();
174
+ const proof: ZkProofInput = {
175
+ proof_data: "test",
176
+ public_inputs: { x: 1 },
177
+ };
178
+
179
+ const contexts = [
180
+ { user_id: "u1" },
181
+ { tenant_id: "t1", jurisdiction: "EU.v1" },
182
+ { role: "operator" },
183
+ ];
184
+
185
+ for (const ctx of contexts) {
186
+ const result = await adapter.verifyZkProof(proof, ctx);
187
+ expect(result.valid).toBe(false);
188
+ }
189
+ });
190
+ });
191
+
192
+ describe("commitToSmt", () => {
193
+ it("returns mock SMT root with correct structure", async () => {
194
+ const adapter = new NoopPrivacyAdapter();
195
+ const commitment: Commitment = { value: "test_value" };
196
+ const ctx: PrivacyContext = {};
197
+
198
+ const result = await adapter.commitToSmt(commitment, ctx);
199
+
200
+ expect(result.smt_root).toBeDefined();
201
+ expect(result.smt_root).toMatch(/^0x[0-9a-f]+$/);
202
+ expect(result.leaf_index).toBe(0);
203
+ expect(result.version).toBe(0);
204
+ });
205
+
206
+ it("returns deterministic root for same commitment", async () => {
207
+ const adapter = new NoopPrivacyAdapter();
208
+ const commitment: Commitment = { value: "deterministic" };
209
+ const ctx: PrivacyContext = {};
210
+
211
+ const result1 = await adapter.commitToSmt(commitment, ctx);
212
+ const result2 = await adapter.commitToSmt(commitment, ctx);
213
+
214
+ expect(result1.smt_root).toBe(result2.smt_root);
215
+ });
216
+
217
+ it("returns different root for different commitments", async () => {
218
+ const adapter = new NoopPrivacyAdapter();
219
+ const ctx: PrivacyContext = {};
220
+
221
+ const result1 = await adapter.commitToSmt({ value: "value1" }, ctx);
222
+ const result2 = await adapter.commitToSmt({ value: "value2" }, ctx);
223
+
224
+ expect(result1.smt_root).not.toBe(result2.smt_root);
225
+ });
226
+
227
+ it("respects explicit leaf_index from commitment", async () => {
228
+ const adapter = new NoopPrivacyAdapter();
229
+ const commitment: Commitment = { value: "test", index: 42 };
230
+ const ctx: PrivacyContext = {};
231
+
232
+ const result = await adapter.commitToSmt(commitment, ctx);
233
+
234
+ expect(result.leaf_index).toBe(42);
235
+ });
236
+
237
+ it("defaults leaf_index to 0 when not specified", async () => {
238
+ const adapter = new NoopPrivacyAdapter();
239
+ const commitment: Commitment = { value: "test" };
240
+ const ctx: PrivacyContext = {};
241
+
242
+ const result = await adapter.commitToSmt(commitment, ctx);
243
+
244
+ expect(result.leaf_index).toBe(0);
245
+ });
246
+
247
+ it("accepts optional salt in commitment", async () => {
248
+ const adapter = new NoopPrivacyAdapter();
249
+ const commitment: Commitment = {
250
+ value: "secret",
251
+ salt: "random_salt_123",
252
+ index: 5,
253
+ };
254
+ const ctx: PrivacyContext = {};
255
+
256
+ const result = await adapter.commitToSmt(commitment, ctx);
257
+
258
+ expect(result.smt_root).toBeDefined();
259
+ expect(result.leaf_index).toBe(5);
260
+ expect(result.version).toBe(0);
261
+ });
262
+
263
+ it("handles various commitment value types", async () => {
264
+ const adapter = new NoopPrivacyAdapter();
265
+ const ctx: PrivacyContext = {};
266
+
267
+ const values = [
268
+ "string value",
269
+ 42,
270
+ 3.14,
271
+ true,
272
+ { nested: "object" },
273
+ [1, 2, 3],
274
+ ];
275
+
276
+ for (const value of values) {
277
+ const result = await adapter.commitToSmt({ value }, ctx);
278
+ expect(result.smt_root).toBeDefined();
279
+ expect(result.version).toBe(0);
280
+ }
281
+ });
282
+
283
+ it("context parameters are accepted and ignored (V0)", async () => {
284
+ const adapter = new NoopPrivacyAdapter();
285
+ const commitment: Commitment = { value: "test" };
286
+
287
+ const contexts = [
288
+ { user_id: "u1", tenant_id: "t1" },
289
+ { jurisdiction: "CH.v1" },
290
+ { metadata: { custom: true } },
291
+ ];
292
+
293
+ for (const ctx of contexts) {
294
+ const result = await adapter.commitToSmt(commitment, ctx);
295
+ expect(result.smt_root).toBeDefined();
296
+ }
297
+ });
298
+ });
299
+
300
+ describe("NoopPrivacyAdapter interface compliance", () => {
301
+ it("satisfies PrivacyPort contract", () => {
302
+ const adapter = new NoopPrivacyAdapter();
303
+
304
+ expect(typeof adapter.applyMask).toBe("function");
305
+ expect(typeof adapter.verifyZkProof).toBe("function");
306
+ expect(typeof adapter.commitToSmt).toBe("function");
307
+ });
308
+
309
+ it("all async methods return Promise", async () => {
310
+ const adapter = new NoopPrivacyAdapter();
311
+
312
+ const maskResult = adapter.applyMask(
313
+ {},
314
+ { public_fields: [], private_fields: [] },
315
+ {}
316
+ );
317
+ const proofResult = adapter.verifyZkProof(
318
+ { proof_data: "x", public_inputs: {} },
319
+ {}
320
+ );
321
+ const smtResult = adapter.commitToSmt({ value: "x" }, {});
322
+
323
+ expect(maskResult).toBeInstanceOf(Promise);
324
+ expect(proofResult).toBeInstanceOf(Promise);
325
+ expect(smtResult).toBeInstanceOf(Promise);
326
+
327
+ await maskResult;
328
+ await proofResult;
329
+ await smtResult;
330
+ });
331
+
332
+ it("methods work together in realistic flow", async () => {
333
+ const adapter = new NoopPrivacyAdapter();
334
+ const ctx: PrivacyContext = { user_id: "user-1", role: "admin" };
335
+
336
+ // Simulate a privacy-respecting workflow (V0: all no-ops)
337
+ const payload = { secret: "data", public: "info" };
338
+ const mask: RevelationMask = {
339
+ public_fields: ["public"],
340
+ private_fields: ["secret"],
341
+ };
342
+
343
+ const masked = await adapter.applyMask(payload, mask, ctx);
344
+ expect(masked).toEqual(payload);
345
+
346
+ const commitment: Commitment = { value: masked };
347
+ const smtResult = await adapter.commitToSmt(commitment, ctx);
348
+ expect(smtResult.smt_root).toBeDefined();
349
+ expect(smtResult.version).toBe(0);
350
+
351
+ const proof: ZkProofInput = {
352
+ proof_data: { root: smtResult.smt_root },
353
+ public_inputs: { commitment_hash: "hash" },
354
+ };
355
+ const verified = await adapter.verifyZkProof(proof, ctx);
356
+ expect(verified.valid).toBe(false);
357
+ expect(verified.reason).toBe("noop_v0");
358
+ });
359
+ });
360
+
361
+ describe("V0 noop semantics validation", () => {
362
+ it("demonstrates V0 identity semantics: applyMask is identity", async () => {
363
+ const adapter = new NoopPrivacyAdapter();
364
+
365
+ // V0 guarantee: f(x) = x for any x
366
+ const testValues = [
367
+ { a: 1, b: "secret" },
368
+ "plain text",
369
+ [1, 2, 3, "secret"],
370
+ { deeply: { nested: { secret: "data" } } },
371
+ ];
372
+
373
+ for (const value of testValues) {
374
+ const result = await adapter.applyMask(
375
+ value,
376
+ { public_fields: ["a"], private_fields: ["secret"] },
377
+ {}
378
+ );
379
+ expect(result).toBe(value); // exact same object
380
+ }
381
+ });
382
+
383
+ it("demonstrates V0 proof rejection: verifyZkProof always fails", async () => {
384
+ const adapter = new NoopPrivacyAdapter();
385
+
386
+ // V0 guarantee: verifyZkProof always returns invalid
387
+ const proofs = [
388
+ { proof_data: "valid_proof", public_inputs: {} },
389
+ { proof_data: null, public_inputs: { x: 1 } },
390
+ { proof_data: { complex: "structure" }, public_inputs: [] },
391
+ ];
392
+
393
+ for (const proof of proofs) {
394
+ const result = await adapter.verifyZkProof(proof as ZkProofInput, {});
395
+ expect(result.valid).toBe(false);
396
+ expect(result.reason).toBe("noop_v0");
397
+ expect(result.confidence).toBe(0);
398
+ }
399
+ });
400
+
401
+ it("demonstrates V0 mock SMT: deterministic but no crypto", async () => {
402
+ const adapter = new NoopPrivacyAdapter();
403
+
404
+ // V0 guarantee: deterministic + version 0
405
+ const c1 = await adapter.commitToSmt({ value: "test" }, {});
406
+ const c2 = await adapter.commitToSmt({ value: "test" }, {});
407
+
408
+ expect(c1.smt_root).toBe(c2.smt_root);
409
+ expect(c1.version).toBe(0);
410
+ expect(c2.version).toBe(0);
411
+ });
412
+ });
413
+ });
@@ -0,0 +1,207 @@
1
+ /**
2
+ * PrivacyPort — V0 noop stub for Vauban Privacy Protocol (VPP) integration.
3
+ *
4
+ * Implements S0 port #10 (PrivacyPort): placeholder interface for privacy-preserving
5
+ * operations. Phase 2+ will implement full Stwo+ML-KEM+viewing-key+SMT+cross-domain
6
+ * functionality per draft-vauban-privacy-protocol-00 (target IETF submission 2026-06-29,
7
+ * sprint-490 active 78%).
8
+ *
9
+ * V0 design: all operations return identity or noop stubs. Enables code to pass type
10
+ * checks while VPP integration is deferred. No Side effects, no cryptographic guarantees.
11
+ *
12
+ * Reference: S0 § cross-spec invariants X-1 (isolation), X-3 (crypto-shredding);
13
+ * VPP Phase roadmap: draft-vauban-privacy-protocol-00 + integration plan TBD.
14
+ */
15
+
16
+ // ─── Privacy revelation mask types ────────────────────────────────────────────
17
+
18
+ /**
19
+ * RevelationMask — declarative specification of which fields should be exposed
20
+ * during a privacy-respecting operation.
21
+ */
22
+ export interface RevelationMask {
23
+ readonly public_fields: string[]; // fields always visible
24
+ readonly private_fields: string[]; // fields always hidden
25
+ readonly conditional?: Array<{
26
+ readonly field: string;
27
+ readonly condition: string; // e.g., "user_role == 'admin'"
28
+ }>;
29
+ }
30
+
31
+ // ─── Zero-knowledge proof types ────────────────────────────────────────────────
32
+
33
+ export interface ZkProofInput {
34
+ readonly proof_data: unknown; // opaque proof bytes / object
35
+ readonly public_inputs: unknown; // public circuit inputs
36
+ readonly scheme?: string; // e.g., "stwo", "starknet_stone"
37
+ }
38
+
39
+ export interface VerifyResult {
40
+ readonly valid: boolean;
41
+ readonly reason?: string; // why invalid (e.g., 'noop_v0', 'invalid_proof')
42
+ readonly confidence?: number; // 0-1 confidence score (V0 always 0)
43
+ }
44
+
45
+ // ─── Sparse merkle tree commitment types ───────────────────────────────────────
46
+
47
+ export interface Commitment {
48
+ readonly value: unknown; // commitment hash or object
49
+ readonly salt?: string; // optional salt for hiding value
50
+ readonly index?: number; // position in tree
51
+ }
52
+
53
+ export interface SmtResult {
54
+ readonly smt_root: string; // hex-encoded root hash (V0: deterministic mock)
55
+ readonly leaf_index: number; // position of committed value
56
+ readonly version: number; // SMT version/epoch (V0: 0)
57
+ readonly proof?: unknown; // merkle path (V0: omitted)
58
+ }
59
+
60
+ // ─── Privacy context ──────────────────────────────────────────────────────────
61
+
62
+ export interface PrivacyContext {
63
+ readonly user_id?: string;
64
+ readonly tenant_id?: string;
65
+ readonly role?: string; // 'user', 'admin', 'operator'
66
+ readonly jurisdiction?: string; // e.g., 'FR.v1', 'EU.v1'
67
+ readonly metadata?: Record<string, unknown>;
68
+ }
69
+
70
+ // ─── PrivacyPort interface ────────────────────────────────────────────────────
71
+
72
+ /**
73
+ * PrivacyPort — V0 noop stub.
74
+ *
75
+ * All methods return identity values or noop results. Replaced by full VPP
76
+ * implementation in Phase 2 (Stwo+ML-KEM+viewing-key+SMT+cross-domain).
77
+ *
78
+ * Usage:
79
+ * const priv = new NoopPrivacyAdapter();
80
+ * const revealed = await priv.applyMask(data, mask, ctx); // data unchanged V0
81
+ * const vk = await priv.verifyZkProof(proof, ctx); // {valid: false, reason: 'noop_v0'}
82
+ */
83
+ export interface PrivacyPort {
84
+ /**
85
+ * Apply a revelation mask to payload (V0: returns payload unchanged).
86
+ *
87
+ * Phase 2+: will implement field-level hiding via ZK commitments or viewing keys.
88
+ *
89
+ * @param payload input object or data structure
90
+ * @param mask specification of which fields are public/private/conditional
91
+ * @param ctx privacy context (user, tenant, role, jurisdiction)
92
+ * @returns masked payload (V0: unchanged)
93
+ */
94
+ applyMask(
95
+ payload: unknown,
96
+ mask: RevelationMask,
97
+ ctx: PrivacyContext
98
+ ): Promise<unknown>;
99
+
100
+ /**
101
+ * Verify a zero-knowledge proof (V0: always returns invalid with 'noop_v0' reason).
102
+ *
103
+ * Phase 2+: will implement Stwo proof verification against public inputs.
104
+ *
105
+ * @param proof ZK proof object (scheme TBD, likely Stwo)
106
+ * @param ctx privacy context
107
+ * @returns { valid: false, reason: 'noop_v0' } in V0
108
+ */
109
+ verifyZkProof(
110
+ proof: ZkProofInput,
111
+ ctx: PrivacyContext
112
+ ): Promise<VerifyResult>;
113
+
114
+ /**
115
+ * Commit value to sparse merkle tree (V0: returns deterministic mock root).
116
+ *
117
+ * Phase 2+: will implement full SMT with Poseidon hashing and viewing keys.
118
+ *
119
+ * @param commitment value or hash to commit
120
+ * @param ctx privacy context
121
+ * @returns mock SMT root (V0: deterministic, no cryptographic guarantee)
122
+ */
123
+ commitToSmt(commitment: Commitment, ctx: PrivacyContext): Promise<SmtResult>;
124
+ }
125
+
126
+ // ─── Noop implementation (V0 stub) ────────────────────────────────────────────
127
+
128
+ /**
129
+ * NoopPrivacyAdapter — V0 stub implementation of PrivacyPort.
130
+ *
131
+ * All methods return identity values or noop results. Enables type-safe code
132
+ * while VPP integration is deferred to Phase 2.
133
+ *
134
+ * Documentation: "V0 stub — replaced by VPP integration in Phase 2
135
+ * (Stwo+ML-KEM+viewing key+SMT+cross-domain)."
136
+ *
137
+ * Usage:
138
+ * const adapter = new NoopPrivacyAdapter();
139
+ * const data = { secret: 'hidden', public: 'visible' };
140
+ * const masked = await adapter.applyMask(data, mask, ctx);
141
+ * // masked === data (unchanged in V0)
142
+ */
143
+ export class NoopPrivacyAdapter implements PrivacyPort {
144
+ async applyMask(
145
+ payload: unknown,
146
+ _mask: RevelationMask,
147
+ _ctx: PrivacyContext
148
+ ): Promise<unknown> {
149
+ // V0: identity function — return input unchanged
150
+ return payload;
151
+ }
152
+
153
+ async verifyZkProof(
154
+ _proof: ZkProofInput,
155
+ _ctx: PrivacyContext
156
+ ): Promise<VerifyResult> {
157
+ // V0: always invalid with noop marker
158
+ return {
159
+ valid: false,
160
+ reason: "noop_v0",
161
+ confidence: 0,
162
+ };
163
+ }
164
+
165
+ async commitToSmt(
166
+ commitment: Commitment,
167
+ _ctx: PrivacyContext
168
+ ): Promise<SmtResult> {
169
+ // V0: return deterministic mock root based on commitment value
170
+ // In real Phase 2+, would compute Poseidon hash and maintain SMT state
171
+ const mockRoot = this.computeMockRoot(commitment);
172
+ return {
173
+ smt_root: mockRoot,
174
+ leaf_index: commitment.index ?? 0,
175
+ version: 0, // V0 version
176
+ };
177
+ }
178
+
179
+ /**
180
+ * Compute a deterministic mock SMT root (V0 only).
181
+ * Purely for testing — no cryptographic guarantee.
182
+ */
183
+ private computeMockRoot(commitment: Commitment): string {
184
+ // Simple deterministic hash for V0: stringify commitment and hash
185
+ const str = JSON.stringify(commitment);
186
+ let hash = 0;
187
+ for (let i = 0; i < str.length; i++) {
188
+ hash = (hash << 5) - hash + str.charCodeAt(i);
189
+ hash = hash & hash; // keep it as 32-bit int
190
+ }
191
+ return "0x" + Math.abs(hash).toString(16).padStart(64, "0");
192
+ }
193
+ }
194
+
195
+ // ─── Informational warning (not thrown) ─────────────────────────────────────
196
+
197
+ /**
198
+ * PrivacyNoopWarning — logged when V0 noop operations are used.
199
+ * Not thrown as an exception (non-blocking), but logged for observability.
200
+ */
201
+ export class PrivacyNoopWarning extends Error {
202
+ constructor(message: string, public readonly operation: string) {
203
+ super(message);
204
+ this.name = "PrivacyNoopWarning";
205
+ Object.setPrototypeOf(this, new.target.prototype);
206
+ }
207
+ }