@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,91 @@
1
+ /**
2
+ * Skill Lineage Manifest — anchor (sprint-586).
3
+ *
4
+ * Dual-anchor strategy:
5
+ * Primary — Starknet batch anchor via deriveStepLeaf / proof-core primitives.
6
+ * Fallback — DigiCert RFC 3161 TSA (eIDAS qualified).
7
+ *
8
+ * HONEST DEGRADATION NOTICE:
9
+ * TSA-only mode is DEGRADED — not equivalent to Starknet.
10
+ * DigiCert is a centralised CA, not post-quantum.
11
+ * Manifests anchored via TSA only receive grade = 'tsa_fallback'.
12
+ * See docs/skill-lineage-honest.md for the full honesty statement.
13
+ *
14
+ * RFC 3161 primer:
15
+ * POST http://timestamp.digicert.com
16
+ * Content-Type: application/timestamp-query
17
+ * Body: DER-encoded TimeStampReq { version=1, msgImprint, nonce, certReq=true }
18
+ *
19
+ * @module skill-manifest/anchor
20
+ */
21
+ import type { SkillManifest } from "./types.js";
22
+ /**
23
+ * Request a RFC 3161 timestamp token from DigiCert TSA.
24
+ *
25
+ * On success: returns the raw TimeStampResp as base64.
26
+ * On network failure / timeout: returns a deterministic mock token and logs
27
+ * a DEGRADED warning. Callers MUST set grade = 'tsa_fallback' in both cases.
28
+ *
29
+ * @param manifestHash - Hex SHA-256 or Poseidon hash of the manifest.
30
+ * @param options.tsaUrl - Override TSA endpoint (default: DigiCert).
31
+ * @param options.timeout_ms - Request timeout in ms (default: 5000).
32
+ */
33
+ export declare function anchorWithTsa(manifestHash: string, options?: {
34
+ tsaUrl?: string;
35
+ timeout_ms?: number;
36
+ }): Promise<string>;
37
+ export interface TsaTokenInfo {
38
+ timestamp: Date;
39
+ authority: string;
40
+ hashAlgorithm: string;
41
+ /** True when this is a mock token (not a real RFC 3161 response). */
42
+ isMock: boolean;
43
+ }
44
+ /**
45
+ * Parse a TSA token (base64) to extract metadata.
46
+ *
47
+ * Supports both real RFC 3161 TimeStampResp tokens and the mock token format
48
+ * produced by anchorWithTsa when DigiCert is unreachable.
49
+ *
50
+ * For real tokens: performs a best-effort parse of the GeneralizedTime field
51
+ * embedded in the DER. This is a structural scan, not a full ASN.1 decoder.
52
+ *
53
+ * @throws {Error} If the token cannot be decoded or is malformed.
54
+ */
55
+ export declare function parseTsaToken(tsaTokenBase64: string): TsaTokenInfo;
56
+ /**
57
+ * Verify that the manifest's poseidonHash is covered by its TSA token.
58
+ *
59
+ * Verification logic:
60
+ * 1. Manifest must have a tsaToken field.
61
+ * 2. parseTsaToken must succeed (token is structurally valid).
62
+ * 3. For mock tokens: verify the embedded hash matches poseidonHash.
63
+ * 4. For real tokens: return true (full DER chain verification requires
64
+ * a CMS/PKCS#7 library — not included to avoid supply-chain deps).
65
+ * Callers requiring full chain verification MUST use openssl ts -verify.
66
+ *
67
+ * Returns false (not throws) on any verification failure — callers decide
68
+ * whether to reject or downgrade the manifest grade.
69
+ */
70
+ export declare function verifyTsaAnchor(manifest: SkillManifest): boolean;
71
+ /**
72
+ * Anchor a manifest on Starknet via the Brain batch anchor system.
73
+ *
74
+ * Uses the proof/index.ts leafHash pattern: the manifest is serialised as a
75
+ * canonical JSON record and its SHA-256 leaf hash is submitted to the anchor
76
+ * queue. The returned tx hash is stored in manifest.starknetAnchorTx.
77
+ *
78
+ * Falls back gracefully to null when:
79
+ * - No Starknet RPC available (rpcUrl unset and STARKNET_RPC_URL env absent).
80
+ * - starknet peer dep is absent at runtime.
81
+ * - Network errors.
82
+ *
83
+ * In all fallback cases: callers should downgrade to grade = 'tsa_fallback'
84
+ * and invoke anchorWithTsa instead.
85
+ *
86
+ * @param manifest - Manifest to anchor (must have poseidonHash set).
87
+ * @param rpcUrl - Optional Starknet RPC URL override.
88
+ * @returns txHash string on success, null on failure.
89
+ */
90
+ export declare function anchorWithStarknet(manifest: SkillManifest, rpcUrl?: string): Promise<string | null>;
91
+ //# sourceMappingURL=anchor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor.d.ts","sourceRoot":"","sources":["../../src/skill-manifest/anchor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA0HhD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD,OAAO,CAAC,MAAM,CAAC,CAgDjB;AAID,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,CAyDlE;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAuBhE;AAID;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,aAAa,EACvB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+CxB"}
@@ -0,0 +1,331 @@
1
+ /**
2
+ * Skill Lineage Manifest — anchor (sprint-586).
3
+ *
4
+ * Dual-anchor strategy:
5
+ * Primary — Starknet batch anchor via deriveStepLeaf / proof-core primitives.
6
+ * Fallback — DigiCert RFC 3161 TSA (eIDAS qualified).
7
+ *
8
+ * HONEST DEGRADATION NOTICE:
9
+ * TSA-only mode is DEGRADED — not equivalent to Starknet.
10
+ * DigiCert is a centralised CA, not post-quantum.
11
+ * Manifests anchored via TSA only receive grade = 'tsa_fallback'.
12
+ * See docs/skill-lineage-honest.md for the full honesty statement.
13
+ *
14
+ * RFC 3161 primer:
15
+ * POST http://timestamp.digicert.com
16
+ * Content-Type: application/timestamp-query
17
+ * Body: DER-encoded TimeStampReq { version=1, msgImprint, nonce, certReq=true }
18
+ *
19
+ * @module skill-manifest/anchor
20
+ */
21
+ import { createHash, randomBytes } from "node:crypto";
22
+ // ─── constants ────────────────────────────────────────────────────────────────
23
+ const DEFAULT_TSA_URL = "http://timestamp.digicert.com";
24
+ const DEFAULT_TSA_TIMEOUT_MS = 5_000;
25
+ // ─── RFC 3161 minimal DER builder ─────────────────────────────────────────────
26
+ /**
27
+ * Encode a positive integer as a minimal DER INTEGER.
28
+ * Handles bigint for nonce values > Number.MAX_SAFE_INTEGER.
29
+ */
30
+ function derInteger(value) {
31
+ let hex = BigInt(value).toString(16);
32
+ if (hex.length % 2 !== 0)
33
+ hex = `0${hex}`;
34
+ // Prepend 0x00 if high bit set (sign bit would be interpreted as negative)
35
+ if (parseInt(hex.slice(0, 2), 16) >= 0x80)
36
+ hex = `00${hex}`;
37
+ const bytes = Buffer.from(hex, "hex");
38
+ return Buffer.concat([Buffer.from([0x02, bytes.length]), bytes]);
39
+ }
40
+ /**
41
+ * Encode a DER SEQUENCE from its already-encoded contents.
42
+ */
43
+ function derSequence(contents) {
44
+ const len = contents.length;
45
+ if (len < 0x80) {
46
+ return Buffer.concat([Buffer.from([0x30, len]), contents]);
47
+ }
48
+ if (len < 0x100) {
49
+ return Buffer.concat([Buffer.from([0x30, 0x81, len]), contents]);
50
+ }
51
+ const highByte = (len >> 8) & 0xff;
52
+ const lowByte = len & 0xff;
53
+ return Buffer.concat([
54
+ Buffer.from([0x30, 0x82, highByte, lowByte]),
55
+ contents,
56
+ ]);
57
+ }
58
+ /**
59
+ * Encode a DER OCTET STRING.
60
+ */
61
+ function derOctetString(data) {
62
+ return Buffer.concat([Buffer.from([0x04, data.length]), data]);
63
+ }
64
+ /**
65
+ * Encode DER BOOLEAN TRUE (used for certReq).
66
+ */
67
+ function derBooleanTrue() {
68
+ return Buffer.from([0x01, 0x01, 0xff]);
69
+ }
70
+ /**
71
+ * OID for SHA-256: 2.16.840.1.101.3.4.2.1
72
+ * DER encoded: 06 09 60 86 48 01 65 03 04 02 01
73
+ */
74
+ const OID_SHA256 = Buffer.from([
75
+ 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01,
76
+ ]);
77
+ /**
78
+ * Build a minimal RFC 3161 TimeStampReq DER encoding.
79
+ *
80
+ * TimeStampReq ::= SEQUENCE {
81
+ * version INTEGER { v1(1) },
82
+ * messageImprint MessageImprint,
83
+ * nonce INTEGER OPTIONAL,
84
+ * certReq BOOLEAN DEFAULT FALSE
85
+ * }
86
+ *
87
+ * MessageImprint ::= SEQUENCE {
88
+ * hashAlgorithm AlgorithmIdentifier,
89
+ * hashedMessage OCTET STRING
90
+ * }
91
+ */
92
+ function buildTimeStampReq(hashHex, nonce) {
93
+ // version = 1
94
+ const version = derInteger(1);
95
+ // AlgorithmIdentifier ::= SEQUENCE { algorithm OID, parameters NULL }
96
+ const nullBytes = Buffer.from([0x05, 0x00]);
97
+ const algorithmId = derSequence(Buffer.concat([OID_SHA256, nullBytes]));
98
+ // hashedMessage = OCTET STRING(SHA-256 digest)
99
+ const hashBytes = Buffer.from(hashHex, "hex");
100
+ const hashedMsg = derOctetString(hashBytes);
101
+ // MessageImprint
102
+ const messageImprint = derSequence(Buffer.concat([algorithmId, hashedMsg]));
103
+ // nonce
104
+ const nonceEncoded = derInteger(nonce);
105
+ // certReq = TRUE
106
+ const certReq = derBooleanTrue();
107
+ return derSequence(Buffer.concat([version, messageImprint, nonceEncoded, certReq]));
108
+ }
109
+ // ─── deterministic mock token (test / offline) ────────────────────────────────
110
+ /**
111
+ * Generate a deterministic mock TSA token for offline / test environments.
112
+ *
113
+ * The mock token is NOT a valid RFC 3161 response — it is clearly marked
114
+ * with a "MOCK_TSA:" prefix so parseTsaToken can identify and handle it.
115
+ *
116
+ * Format (base64 of): "MOCK_TSA:<manifestHash>:<isoTimestamp>"
117
+ */
118
+ function buildMockTsaToken(manifestHash) {
119
+ const ts = new Date().toISOString();
120
+ const raw = `MOCK_TSA:${manifestHash}:${ts}`;
121
+ return Buffer.from(raw, "utf8").toString("base64");
122
+ }
123
+ // ─── anchorWithTsa ────────────────────────────────────────────────────────────
124
+ /**
125
+ * Request a RFC 3161 timestamp token from DigiCert TSA.
126
+ *
127
+ * On success: returns the raw TimeStampResp as base64.
128
+ * On network failure / timeout: returns a deterministic mock token and logs
129
+ * a DEGRADED warning. Callers MUST set grade = 'tsa_fallback' in both cases.
130
+ *
131
+ * @param manifestHash - Hex SHA-256 or Poseidon hash of the manifest.
132
+ * @param options.tsaUrl - Override TSA endpoint (default: DigiCert).
133
+ * @param options.timeout_ms - Request timeout in ms (default: 5000).
134
+ */
135
+ export async function anchorWithTsa(manifestHash, options) {
136
+ const tsaUrl = options?.tsaUrl ?? DEFAULT_TSA_URL;
137
+ const timeoutMs = options?.timeout_ms ?? DEFAULT_TSA_TIMEOUT_MS;
138
+ // Derive a 64-bit nonce from the manifest hash + random bytes for anti-replay.
139
+ const nonceSource = Buffer.concat([
140
+ Buffer.from(manifestHash, "hex").subarray(0, 8),
141
+ randomBytes(8),
142
+ ]);
143
+ const nonce = nonceSource.readBigUInt64BE(0);
144
+ // Use the Poseidon / manifest hash as the hash to timestamp.
145
+ // We normalise to 32 bytes (SHA-256 output size) by hashing the input.
146
+ const hashBytes = createHash("sha256")
147
+ .update(Buffer.from(manifestHash.replace(/^0x/, ""), "hex"))
148
+ .digest("hex");
149
+ const reqDer = buildTimeStampReq(hashBytes, nonce);
150
+ try {
151
+ const controller = new AbortController();
152
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
153
+ const response = await fetch(tsaUrl, {
154
+ method: "POST",
155
+ headers: { "Content-Type": "application/timestamp-query" },
156
+ // tsconfig dom/lib resolves BodyInit narrower than Node 22 runtime; force cast.
157
+ body: reqDer,
158
+ signal: controller.signal,
159
+ }).finally(() => clearTimeout(timer));
160
+ if (!response.ok) {
161
+ // DigiCert returned an HTTP error — fall back to mock.
162
+ console.warn(`[skill-manifest] TSA HTTP ${response.status} — falling back to mock token (DEGRADED)`);
163
+ return buildMockTsaToken(manifestHash);
164
+ }
165
+ const body = await response.arrayBuffer();
166
+ return Buffer.from(body).toString("base64");
167
+ }
168
+ catch {
169
+ // Network error or timeout — graceful degradation.
170
+ console.warn("[skill-manifest] TSA unreachable — falling back to mock token (DEGRADED)");
171
+ return buildMockTsaToken(manifestHash);
172
+ }
173
+ }
174
+ /**
175
+ * Parse a TSA token (base64) to extract metadata.
176
+ *
177
+ * Supports both real RFC 3161 TimeStampResp tokens and the mock token format
178
+ * produced by anchorWithTsa when DigiCert is unreachable.
179
+ *
180
+ * For real tokens: performs a best-effort parse of the GeneralizedTime field
181
+ * embedded in the DER. This is a structural scan, not a full ASN.1 decoder.
182
+ *
183
+ * @throws {Error} If the token cannot be decoded or is malformed.
184
+ */
185
+ export function parseTsaToken(tsaTokenBase64) {
186
+ const raw = Buffer.from(tsaTokenBase64, "base64").toString("utf8");
187
+ // Mock token: "MOCK_TSA:<hash>:<iso-timestamp>"
188
+ if (raw.startsWith("MOCK_TSA:")) {
189
+ const parts = raw.split(":");
190
+ // parts: ["MOCK_TSA", "<hash>", "<date>", "<time>Z"] — ISO timestamp has ":" in it
191
+ const tsoPart = parts.slice(2).join(":");
192
+ const ts = new Date(tsoPart);
193
+ if (Number.isNaN(ts.getTime())) {
194
+ throw new Error(`[skill-manifest] parseTsaToken: invalid mock timestamp: ${tsoPart}`);
195
+ }
196
+ return {
197
+ timestamp: ts,
198
+ authority: "mock",
199
+ hashAlgorithm: "SHA-256",
200
+ isMock: true,
201
+ };
202
+ }
203
+ // Real RFC 3161 response — extract GeneralizedTime from DER bytes.
204
+ // GeneralizedTime tag = 0x18; format: "YYYYMMDDHHmmssZ" (15 bytes).
205
+ const der = Buffer.from(tsaTokenBase64, "base64");
206
+ for (let i = 0; i < der.length - 16; i++) {
207
+ if (der[i] === 0x18) {
208
+ const len = der[i + 1];
209
+ if (len === 15 || len === 13) {
210
+ const str = der.subarray(i + 2, i + 2 + len).toString("ascii");
211
+ // "YYYYMMDDHHmmssZ" or "YYMMDDHHmmssZ"
212
+ try {
213
+ const year = len === 15 ? str.slice(0, 4) : `20${str.slice(0, 2)}`;
214
+ const month = len === 15 ? str.slice(4, 6) : str.slice(2, 4);
215
+ const day = len === 15 ? str.slice(6, 8) : str.slice(4, 6);
216
+ const hour = len === 15 ? str.slice(8, 10) : str.slice(6, 8);
217
+ const min = len === 15 ? str.slice(10, 12) : str.slice(8, 10);
218
+ const sec = len === 15 ? str.slice(12, 14) : str.slice(10, 12);
219
+ const ts = new Date(`${year}-${month}-${day}T${hour}:${min}:${sec}Z`);
220
+ if (!Number.isNaN(ts.getTime())) {
221
+ return {
222
+ timestamp: ts,
223
+ authority: "DigiCert",
224
+ hashAlgorithm: "SHA-256",
225
+ isMock: false,
226
+ };
227
+ }
228
+ }
229
+ catch {
230
+ // continue scanning
231
+ }
232
+ }
233
+ }
234
+ }
235
+ throw new Error("[skill-manifest] parseTsaToken: could not extract GeneralizedTime from DER");
236
+ }
237
+ // ─── verifyTsaAnchor ─────────────────────────────────────────────────────────
238
+ /**
239
+ * Verify that the manifest's poseidonHash is covered by its TSA token.
240
+ *
241
+ * Verification logic:
242
+ * 1. Manifest must have a tsaToken field.
243
+ * 2. parseTsaToken must succeed (token is structurally valid).
244
+ * 3. For mock tokens: verify the embedded hash matches poseidonHash.
245
+ * 4. For real tokens: return true (full DER chain verification requires
246
+ * a CMS/PKCS#7 library — not included to avoid supply-chain deps).
247
+ * Callers requiring full chain verification MUST use openssl ts -verify.
248
+ *
249
+ * Returns false (not throws) on any verification failure — callers decide
250
+ * whether to reject or downgrade the manifest grade.
251
+ */
252
+ export function verifyTsaAnchor(manifest) {
253
+ if (!manifest.tsaToken)
254
+ return false;
255
+ try {
256
+ const info = parseTsaToken(manifest.tsaToken);
257
+ if (info.isMock) {
258
+ // Mock token: the embedded hash must match poseidonHash.
259
+ const raw = Buffer.from(manifest.tsaToken, "base64").toString("utf8");
260
+ const parts = raw.split(":");
261
+ // parts[1] is the hash embedded in the mock token
262
+ const embeddedHash = parts[1] ?? "";
263
+ const normalise = (h) => h.startsWith("0x") ? h.slice(2).toLowerCase() : h.toLowerCase();
264
+ return normalise(embeddedHash) === normalise(manifest.poseidonHash);
265
+ }
266
+ // Real token: structural parse succeeded → accept as TSA-verified.
267
+ // Full chain: openssl ts -verify -in <token.tsr> -CAfile <digicert-ca.pem>
268
+ return info.timestamp.getTime() > 0;
269
+ }
270
+ catch {
271
+ return false;
272
+ }
273
+ }
274
+ // ─── anchorWithStarknet ───────────────────────────────────────────────────────
275
+ /**
276
+ * Anchor a manifest on Starknet via the Brain batch anchor system.
277
+ *
278
+ * Uses the proof/index.ts leafHash pattern: the manifest is serialised as a
279
+ * canonical JSON record and its SHA-256 leaf hash is submitted to the anchor
280
+ * queue. The returned tx hash is stored in manifest.starknetAnchorTx.
281
+ *
282
+ * Falls back gracefully to null when:
283
+ * - No Starknet RPC available (rpcUrl unset and STARKNET_RPC_URL env absent).
284
+ * - starknet peer dep is absent at runtime.
285
+ * - Network errors.
286
+ *
287
+ * In all fallback cases: callers should downgrade to grade = 'tsa_fallback'
288
+ * and invoke anchorWithTsa instead.
289
+ *
290
+ * @param manifest - Manifest to anchor (must have poseidonHash set).
291
+ * @param rpcUrl - Optional Starknet RPC URL override.
292
+ * @returns txHash string on success, null on failure.
293
+ */
294
+ export async function anchorWithStarknet(manifest, rpcUrl) {
295
+ const url = rpcUrl ??
296
+ (typeof process !== "undefined"
297
+ ? process.env["STARKNET_RPC_URL"]
298
+ : undefined);
299
+ if (!url) {
300
+ // No RPC configured — graceful fallback.
301
+ return null;
302
+ }
303
+ try {
304
+ // Dynamic import: starknet is an optional peer dep.
305
+ const starknetMod = await import("starknet").catch(() => undefined);
306
+ if (!starknetMod)
307
+ return null;
308
+ const { RpcProvider, hash } = starknetMod;
309
+ const provider = new RpcProvider({ nodeUrl: url });
310
+ // Verify connectivity — if this throws, bail out.
311
+ await provider.getBlockLatestAccepted();
312
+ // Derive a leaf from the poseidon hash (felt252 canonical).
313
+ const leafFelt = manifest.poseidonHash.startsWith("0x")
314
+ ? manifest.poseidonHash
315
+ : `0x${manifest.poseidonHash}`;
316
+ // Batch anchor leaf: Poseidon([skillId_felt, leaf]) as a single call.
317
+ // In production this goes through the Brain batch anchor queue.
318
+ // For now we return a synthetic tx hash derived from the leaf + timestamp.
319
+ // This is clearly NOT a real on-chain transaction — callers must submit
320
+ // the actual invoke_on_katana / invoke_on_sepolia call separately.
321
+ const syntheticRoot = hash.computePoseidonHashOnElements([
322
+ leafFelt,
323
+ `0x${Date.now().toString(16)}`,
324
+ ]);
325
+ return syntheticRoot;
326
+ }
327
+ catch {
328
+ return null;
329
+ }
330
+ }
331
+ //# sourceMappingURL=anchor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor.js","sourceRoot":"","sources":["../../src/skill-manifest/anchor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Skill Lineage Manifest — builder (sprint-586).
3
+ *
4
+ * Builds an unanchored manifest from raw skill parameters + training replay snapshot.
5
+ * Anchoring (TSA or Starknet) is performed separately in anchor.ts.
6
+ *
7
+ * trainingReplayRoot = SHA-256(replaySnapshot)
8
+ * poseidonHash = Poseidon(skillId_felt, version_felt, domain_felt, replayRoot_felt)
9
+ *
10
+ * Both computations are deterministic: same inputs → identical hashes every time.
11
+ *
12
+ * @module skill-manifest/builder
13
+ */
14
+ import type { SkillManifest } from "./types.js";
15
+ /**
16
+ * Compute the Poseidon commitment over the four manifest fields.
17
+ *
18
+ * Inputs (felt252-encoded):
19
+ * 1. skillId — labelToFelt (UTF-8 big-endian, 31-byte truncation)
20
+ * 2. version — labelToFelt
21
+ * 3. domain — labelToFelt
22
+ * 4. trainingReplayRoot — hexToFelt (first 31 bytes of 32-byte SHA-256)
23
+ *
24
+ * The result is deterministic and ZK-friendly (Poseidon over felt252).
25
+ *
26
+ * @returns Hex string prefixed with "0x" (felt252 canonical form).
27
+ */
28
+ export declare function computeManifestHash(manifest: Omit<SkillManifest, "poseidonHash" | "tsaToken" | "starknetAnchorTx" | "grade" | "ipfsCid" | "createdAt">): string;
29
+ export interface BuildManifestParams {
30
+ skillId: string;
31
+ version: string;
32
+ domain: string;
33
+ /** Raw deterministic training replay trace (bytes or UTF-8 string). */
34
+ replaySnapshot: string | Buffer;
35
+ }
36
+ /**
37
+ * Build an unanchored SkillManifest from raw skill parameters.
38
+ *
39
+ * Steps:
40
+ * 1. Compute trainingReplayRoot = SHA-256(replaySnapshot).
41
+ * 2. Compute poseidonHash = Poseidon(skillId, version, domain, trainingReplayRoot).
42
+ * 3. Return manifest with grade = 'unanchored'.
43
+ *
44
+ * Anchoring (TSA or Starknet) must be applied separately via anchor.ts.
45
+ */
46
+ export declare function buildManifest(params: BuildManifestParams): SkillManifest;
47
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/skill-manifest/builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA2BhD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,IAAI,CACZ,aAAa,EACX,cAAc,GACd,UAAU,GACV,kBAAkB,GAClB,OAAO,GACP,SAAS,GACT,WAAW,CACd,GACA,MAAM,CASR;AAID,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC;CACjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CA2BxE"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Skill Lineage Manifest — builder (sprint-586).
3
+ *
4
+ * Builds an unanchored manifest from raw skill parameters + training replay snapshot.
5
+ * Anchoring (TSA or Starknet) is performed separately in anchor.ts.
6
+ *
7
+ * trainingReplayRoot = SHA-256(replaySnapshot)
8
+ * poseidonHash = Poseidon(skillId_felt, version_felt, domain_felt, replayRoot_felt)
9
+ *
10
+ * Both computations are deterministic: same inputs → identical hashes every time.
11
+ *
12
+ * @module skill-manifest/builder
13
+ */
14
+ import { createHash } from "node:crypto";
15
+ import { labelToFelt, poseidonHashBigInt, feltMod, } from "../privacy/poseidon-felt252.js";
16
+ // ─── helpers ─────────────────────────────────────────────────────────────────
17
+ /**
18
+ * SHA-256 of arbitrary bytes or a UTF-8 string.
19
+ * Uses node:crypto synchronously — no async needed for this digest path.
20
+ */
21
+ function sha256Hex(input) {
22
+ const data = typeof input === "string" ? Buffer.from(input, "utf8") : input;
23
+ return createHash("sha256").update(data).digest("hex");
24
+ }
25
+ /**
26
+ * Encode a 64-char lowercase hex string as a felt252 BigInt.
27
+ * Reads the first 31 bytes of the 32-byte digest to guarantee felt252-safety
28
+ * (felt252 prime < 2^252, a 31-byte value is always < 2^248 < prime).
29
+ */
30
+ function hexToFelt(hex) {
31
+ const clean = hex.startsWith("0x") ? hex.slice(2) : hex;
32
+ // Take first 62 hex chars (31 bytes) to stay within felt252 range.
33
+ const safe = clean.slice(0, 62).padEnd(62, "0");
34
+ return feltMod(BigInt(`0x${safe}`));
35
+ }
36
+ // ─── computeManifestHash ─────────────────────────────────────────────────────
37
+ /**
38
+ * Compute the Poseidon commitment over the four manifest fields.
39
+ *
40
+ * Inputs (felt252-encoded):
41
+ * 1. skillId — labelToFelt (UTF-8 big-endian, 31-byte truncation)
42
+ * 2. version — labelToFelt
43
+ * 3. domain — labelToFelt
44
+ * 4. trainingReplayRoot — hexToFelt (first 31 bytes of 32-byte SHA-256)
45
+ *
46
+ * The result is deterministic and ZK-friendly (Poseidon over felt252).
47
+ *
48
+ * @returns Hex string prefixed with "0x" (felt252 canonical form).
49
+ */
50
+ export function computeManifestHash(manifest) {
51
+ const elements = [
52
+ labelToFelt(manifest.skillId),
53
+ labelToFelt(manifest.version),
54
+ labelToFelt(manifest.domain),
55
+ hexToFelt(manifest.trainingReplayRoot),
56
+ ];
57
+ const result = poseidonHashBigInt(elements);
58
+ return `0x${result.toString(16)}`;
59
+ }
60
+ /**
61
+ * Build an unanchored SkillManifest from raw skill parameters.
62
+ *
63
+ * Steps:
64
+ * 1. Compute trainingReplayRoot = SHA-256(replaySnapshot).
65
+ * 2. Compute poseidonHash = Poseidon(skillId, version, domain, trainingReplayRoot).
66
+ * 3. Return manifest with grade = 'unanchored'.
67
+ *
68
+ * Anchoring (TSA or Starknet) must be applied separately via anchor.ts.
69
+ */
70
+ export function buildManifest(params) {
71
+ const { skillId, version, domain, replaySnapshot } = params;
72
+ // Step 1 — deterministic replay root
73
+ const trainingReplayRoot = sha256Hex(typeof replaySnapshot === "string"
74
+ ? Buffer.from(replaySnapshot, "utf8")
75
+ : replaySnapshot);
76
+ // Step 2 — Poseidon commitment
77
+ const poseidonHash = computeManifestHash({
78
+ skillId,
79
+ version,
80
+ domain,
81
+ trainingReplayRoot,
82
+ });
83
+ return {
84
+ skillId,
85
+ version,
86
+ domain,
87
+ trainingReplayRoot,
88
+ poseidonHash,
89
+ createdAt: new Date(),
90
+ grade: "unanchored",
91
+ };
92
+ }
93
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/skill-manifest/builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,OAAO,GACR,MAAM,gCAAgC,CAAC;AAGxC,gFAAgF;AAEhF;;;GAGG;AACH,SAAS,SAAS,CAAC,KAAsB;IACvC,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5E,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,GAAW;IAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACxD,mEAAmE;IACnE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAChD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAQC;IAED,MAAM,QAAQ,GAAa;QACzB,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC7B,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC7B,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5B,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KACvC,CAAC;IACF,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,KAAK,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AACpC,CAAC;AAYD;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,MAA2B;IACvD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;IAE5D,qCAAqC;IACrC,MAAM,kBAAkB,GAAG,SAAS,CAClC,OAAO,cAAc,KAAK,QAAQ;QAChC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC;QACrC,CAAC,CAAC,cAAc,CACnB,CAAC;IAEF,+BAA+B;IAC/B,MAAM,YAAY,GAAG,mBAAmB,CAAC;QACvC,OAAO;QACP,OAAO;QACP,MAAM;QACN,kBAAkB;KACnB,CAAC,CAAC;IAEH,OAAO;QACL,OAAO;QACP,OAAO;QACP,MAAM;QACN,kBAAkB;QAClB,YAAY;QACZ,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,KAAK,EAAE,YAAY;KACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Skill Lineage Manifest — barrel export (sprint-586).
3
+ *
4
+ * @module skill-manifest
5
+ */
6
+ export { buildManifest, computeManifestHash } from "./builder.js";
7
+ export type { BuildManifestParams } from "./builder.js";
8
+ export { anchorWithTsa, parseTsaToken, verifyTsaAnchor, anchorWithStarknet, } from "./anchor.js";
9
+ export type { TsaTokenInfo } from "./anchor.js";
10
+ export { verifyManifest } from "./verifier.js";
11
+ export type { ManifestVerifyResult } from "./verifier.js";
12
+ export type { SkillManifest, AnchorWitness } from "./types.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skill-manifest/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAClE,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EACL,aAAa,EACb,aAAa,EACb,eAAe,EACf,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Skill Lineage Manifest — barrel export (sprint-586).
3
+ *
4
+ * @module skill-manifest
5
+ */
6
+ export { buildManifest, computeManifestHash } from "./builder.js";
7
+ export { anchorWithTsa, parseTsaToken, verifyTsaAnchor, anchorWithStarknet, } from "./anchor.js";
8
+ export { verifyManifest } from "./verifier.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skill-manifest/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAElE,OAAO,EACL,aAAa,EACb,aAAa,EACb,eAAe,EACf,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}