@vauban-org/agent-sdk 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (442) hide show
  1. package/CONTRACT.md +6401 -813
  2. package/dist/adapters/llm/anthropic-direct.d.ts +1 -0
  3. package/dist/adapters/llm/anthropic-direct.d.ts.map +1 -1
  4. package/dist/adapters/llm/anthropic-direct.js +43 -0
  5. package/dist/adapters/llm/anthropic-direct.js.map +1 -1
  6. package/dist/adapters/llm/cascade.d.ts.map +1 -1
  7. package/dist/adapters/llm/cascade.js +57 -14
  8. package/dist/adapters/llm/cascade.js.map +1 -1
  9. package/dist/adapters/llm/litellm.d.ts +2 -0
  10. package/dist/adapters/llm/litellm.d.ts.map +1 -1
  11. package/dist/adapters/llm/litellm.js +44 -0
  12. package/dist/adapters/llm/litellm.js.map +1 -1
  13. package/dist/compute/difficulty-estimator.d.ts +53 -0
  14. package/dist/compute/difficulty-estimator.d.ts.map +1 -0
  15. package/dist/compute/difficulty-estimator.js +82 -0
  16. package/dist/compute/difficulty-estimator.js.map +1 -0
  17. package/dist/compute/strategies/mixture-of-agents.d.ts +40 -0
  18. package/dist/compute/strategies/mixture-of-agents.d.ts.map +1 -0
  19. package/dist/compute/strategies/mixture-of-agents.js +110 -0
  20. package/dist/compute/strategies/mixture-of-agents.js.map +1 -0
  21. package/dist/compute/strategies/tree-of-thoughts.d.ts +48 -0
  22. package/dist/compute/strategies/tree-of-thoughts.d.ts.map +1 -0
  23. package/dist/compute/strategies/tree-of-thoughts.js +242 -0
  24. package/dist/compute/strategies/tree-of-thoughts.js.map +1 -0
  25. package/dist/compute/strategies/two-phase-orient.d.ts +72 -0
  26. package/dist/compute/strategies/two-phase-orient.d.ts.map +1 -0
  27. package/dist/compute/strategies/two-phase-orient.js +85 -0
  28. package/dist/compute/strategies/two-phase-orient.js.map +1 -0
  29. package/dist/constitution/types.d.ts +10 -10
  30. package/dist/container/protocol.d.ts +134 -0
  31. package/dist/container/protocol.d.ts.map +1 -0
  32. package/dist/container/protocol.js +157 -0
  33. package/dist/container/protocol.js.map +1 -0
  34. package/dist/container/runtime.d.ts +140 -0
  35. package/dist/container/runtime.d.ts.map +1 -0
  36. package/dist/container/runtime.js +256 -0
  37. package/dist/container/runtime.js.map +1 -0
  38. package/dist/events/catalogue.d.ts +46 -46
  39. package/dist/events/schemas/agent.completed.v1.d.ts +4 -4
  40. package/dist/events/schemas/agent.failed.v1.d.ts +2 -2
  41. package/dist/events/schemas/agent.hitl_resolved.v1.d.ts +2 -2
  42. package/dist/events/schemas/agent.started.v1.d.ts +2 -2
  43. package/dist/events/schemas/brain.skill.extracted.v1.d.ts +4 -4
  44. package/dist/events/schemas/cc.cost.anomaly_detected.v1.d.ts +2 -2
  45. package/dist/events/schemas/cc.cost.recorded.v1.d.ts +4 -4
  46. package/dist/events/schemas/citadel.sprint.analyzed.v1.d.ts +6 -6
  47. package/dist/events/schemas/citadel.sprint.closed.v1.d.ts +2 -2
  48. package/dist/events/schemas/forge.inbox.reply_classified.v1.d.ts +6 -6
  49. package/dist/events/schemas/forge.lead.qualified.v1.d.ts +2 -2
  50. package/dist/events/schemas/forge.outreach.sent.v1.d.ts +4 -4
  51. package/dist/events/schemas/incident.detected.v1.d.ts +2 -2
  52. package/dist/events/schemas/vauban.goal.checked.v1.d.ts +2 -2
  53. package/dist/events/schemas/vauban.rebalancing.checked.v1.d.ts +2 -2
  54. package/dist/events/schemas/vauban.tax.checked.v1.d.ts +2 -2
  55. package/dist/events/schemas/vauban.vault.analyzed.v1.d.ts +6 -6
  56. package/dist/identity/agent-persona.d.ts +73 -0
  57. package/dist/identity/agent-persona.d.ts.map +1 -0
  58. package/dist/identity/agent-persona.js +165 -0
  59. package/dist/identity/agent-persona.js.map +1 -0
  60. package/dist/identity/persona-prompt.d.ts +25 -0
  61. package/dist/identity/persona-prompt.d.ts.map +1 -0
  62. package/dist/identity/persona-prompt.js +71 -0
  63. package/dist/identity/persona-prompt.js.map +1 -0
  64. package/dist/identity/persona-schema.d.ts +120 -0
  65. package/dist/identity/persona-schema.d.ts.map +1 -0
  66. package/dist/identity/persona-schema.js +103 -0
  67. package/dist/identity/persona-schema.js.map +1 -0
  68. package/dist/index.d.ts +37 -2
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +29 -1
  71. package/dist/index.js.map +1 -1
  72. package/dist/loop/minimal-loop.js +293 -287
  73. package/dist/memory/episodic-rrf.d.ts +114 -0
  74. package/dist/memory/episodic-rrf.d.ts.map +1 -0
  75. package/dist/memory/episodic-rrf.js +148 -0
  76. package/dist/memory/episodic-rrf.js.map +1 -0
  77. package/dist/mesh/attenuation.d.ts +78 -0
  78. package/dist/mesh/attenuation.d.ts.map +1 -0
  79. package/dist/mesh/attenuation.js +141 -0
  80. package/dist/mesh/attenuation.js.map +1 -0
  81. package/dist/mesh/delegate.d.ts +96 -0
  82. package/dist/mesh/delegate.d.ts.map +1 -0
  83. package/dist/mesh/delegate.js +172 -0
  84. package/dist/mesh/delegate.js.map +1 -0
  85. package/dist/mesh/dispatcher.d.ts +119 -0
  86. package/dist/mesh/dispatcher.d.ts.map +1 -0
  87. package/dist/mesh/dispatcher.js +207 -0
  88. package/dist/mesh/dispatcher.js.map +1 -0
  89. package/dist/mesh/index.d.ts +12 -0
  90. package/dist/mesh/index.d.ts.map +1 -0
  91. package/dist/mesh/index.js +11 -0
  92. package/dist/mesh/index.js.map +1 -0
  93. package/dist/mesh/types.d.ts +30 -0
  94. package/dist/mesh/types.d.ts.map +1 -0
  95. package/dist/mesh/types.js +11 -0
  96. package/dist/mesh/types.js.map +1 -0
  97. package/dist/orchestration/ooda/skills.d.ts +104 -0
  98. package/dist/orchestration/ooda/skills.d.ts.map +1 -1
  99. package/dist/orchestration/ooda/skills.js +106 -0
  100. package/dist/orchestration/ooda/skills.js.map +1 -1
  101. package/dist/ports/bastion-action.contract.test.d.ts +11 -0
  102. package/dist/ports/bastion-action.contract.test.d.ts.map +1 -0
  103. package/dist/ports/bastion-action.contract.test.js +238 -0
  104. package/dist/ports/bastion-action.contract.test.js.map +1 -0
  105. package/dist/ports/bastion-action.d.ts +133 -0
  106. package/dist/ports/bastion-action.d.ts.map +1 -0
  107. package/dist/ports/bastion-action.js +73 -0
  108. package/dist/ports/bastion-action.js.map +1 -0
  109. package/dist/ports/brain.d.ts +31 -0
  110. package/dist/ports/brain.d.ts.map +1 -1
  111. package/dist/ports/brain.js +115 -1
  112. package/dist/ports/brain.js.map +1 -1
  113. package/dist/ports/citadel-action.contract.test.d.ts +11 -0
  114. package/dist/ports/citadel-action.contract.test.d.ts.map +1 -0
  115. package/dist/ports/citadel-action.contract.test.js +317 -0
  116. package/dist/ports/citadel-action.contract.test.js.map +1 -0
  117. package/dist/ports/citadel-action.d.ts +111 -0
  118. package/dist/ports/citadel-action.d.ts.map +1 -0
  119. package/dist/ports/citadel-action.js +62 -0
  120. package/dist/ports/citadel-action.js.map +1 -0
  121. package/dist/ports/compliance-contract.d.ts +123 -0
  122. package/dist/ports/compliance-contract.d.ts.map +1 -0
  123. package/dist/ports/compliance-contract.js +35 -0
  124. package/dist/ports/compliance-contract.js.map +1 -0
  125. package/dist/ports/db.d.ts +38 -0
  126. package/dist/ports/db.d.ts.map +1 -1
  127. package/dist/ports/db.js +88 -1
  128. package/dist/ports/db.js.map +1 -1
  129. package/dist/ports/delegation.contract.test.d.ts +9 -0
  130. package/dist/ports/delegation.contract.test.d.ts.map +1 -0
  131. package/dist/ports/delegation.contract.test.js +337 -0
  132. package/dist/ports/delegation.contract.test.js.map +1 -0
  133. package/dist/ports/delegation.d.ts +134 -0
  134. package/dist/ports/delegation.d.ts.map +1 -0
  135. package/dist/ports/delegation.js +105 -0
  136. package/dist/ports/delegation.js.map +1 -0
  137. package/dist/ports/event-bus.d.ts +29 -0
  138. package/dist/ports/event-bus.d.ts.map +1 -1
  139. package/dist/ports/event-bus.js +106 -1
  140. package/dist/ports/event-bus.js.map +1 -1
  141. package/dist/ports/federation.contract.test.d.ts +9 -0
  142. package/dist/ports/federation.contract.test.d.ts.map +1 -0
  143. package/dist/ports/federation.contract.test.js +279 -0
  144. package/dist/ports/federation.contract.test.js.map +1 -0
  145. package/dist/ports/federation.d.ts +140 -0
  146. package/dist/ports/federation.d.ts.map +1 -0
  147. package/dist/ports/federation.js +57 -0
  148. package/dist/ports/federation.js.map +1 -0
  149. package/dist/ports/index.d.ts +28 -2
  150. package/dist/ports/index.d.ts.map +1 -1
  151. package/dist/ports/index.js +17 -2
  152. package/dist/ports/index.js.map +1 -1
  153. package/dist/ports/llm-provider.d.ts +37 -0
  154. package/dist/ports/llm-provider.d.ts.map +1 -1
  155. package/dist/ports/llm-provider.js +99 -1
  156. package/dist/ports/llm-provider.js.map +1 -1
  157. package/dist/ports/logger.d.ts +27 -0
  158. package/dist/ports/logger.d.ts.map +1 -1
  159. package/dist/ports/logger.js +87 -0
  160. package/dist/ports/logger.js.map +1 -1
  161. package/dist/ports/manifest-registry.contract.test.d.ts +9 -0
  162. package/dist/ports/manifest-registry.contract.test.d.ts.map +1 -0
  163. package/dist/ports/manifest-registry.contract.test.js +246 -0
  164. package/dist/ports/manifest-registry.contract.test.js.map +1 -0
  165. package/dist/ports/manifest-registry.d.ts +116 -0
  166. package/dist/ports/manifest-registry.d.ts.map +1 -0
  167. package/dist/ports/manifest-registry.js +79 -0
  168. package/dist/ports/manifest-registry.js.map +1 -0
  169. package/dist/ports/observability.contract.test.d.ts +12 -0
  170. package/dist/ports/observability.contract.test.d.ts.map +1 -0
  171. package/dist/ports/observability.contract.test.js +260 -0
  172. package/dist/ports/observability.contract.test.js.map +1 -0
  173. package/dist/ports/observability.d.ts +98 -0
  174. package/dist/ports/observability.d.ts.map +1 -0
  175. package/dist/ports/observability.js +59 -0
  176. package/dist/ports/observability.js.map +1 -0
  177. package/dist/ports/outcome.d.ts +26 -0
  178. package/dist/ports/outcome.d.ts.map +1 -1
  179. package/dist/ports/outcome.js +62 -1
  180. package/dist/ports/outcome.js.map +1 -1
  181. package/dist/ports/privacy.contract.test.d.ts +12 -0
  182. package/dist/ports/privacy.contract.test.d.ts.map +1 -0
  183. package/dist/ports/privacy.contract.test.js +325 -0
  184. package/dist/ports/privacy.contract.test.js.map +1 -0
  185. package/dist/ports/privacy.d.ts +132 -0
  186. package/dist/ports/privacy.d.ts.map +1 -0
  187. package/dist/ports/privacy.js +83 -0
  188. package/dist/ports/privacy.js.map +1 -0
  189. package/dist/ports/tenant-context.contract.test.d.ts +14 -0
  190. package/dist/ports/tenant-context.contract.test.d.ts.map +1 -0
  191. package/dist/ports/tenant-context.contract.test.js +352 -0
  192. package/dist/ports/tenant-context.contract.test.js.map +1 -0
  193. package/dist/ports/tenant-context.d.ts +103 -0
  194. package/dist/ports/tenant-context.d.ts.map +1 -0
  195. package/dist/ports/tenant-context.js +48 -0
  196. package/dist/ports/tenant-context.js.map +1 -0
  197. package/dist/ports/vauban-finance-action.contract.test.d.ts +11 -0
  198. package/dist/ports/vauban-finance-action.contract.test.d.ts.map +1 -0
  199. package/dist/ports/vauban-finance-action.contract.test.js +260 -0
  200. package/dist/ports/vauban-finance-action.contract.test.js.map +1 -0
  201. package/dist/ports/vauban-finance-action.d.ts +106 -0
  202. package/dist/ports/vauban-finance-action.d.ts.map +1 -0
  203. package/dist/ports/vauban-finance-action.js +60 -0
  204. package/dist/ports/vauban-finance-action.js.map +1 -0
  205. package/dist/ports/workflow-runtime.d.ts +204 -0
  206. package/dist/ports/workflow-runtime.d.ts.map +1 -0
  207. package/dist/ports/workflow-runtime.js +72 -0
  208. package/dist/ports/workflow-runtime.js.map +1 -0
  209. package/dist/proof/cert-verify.d.ts +80 -0
  210. package/dist/proof/cert-verify.d.ts.map +1 -0
  211. package/dist/proof/cert-verify.js +178 -0
  212. package/dist/proof/cert-verify.js.map +1 -0
  213. package/dist/replay/replay.d.ts.map +1 -1
  214. package/dist/replay/replay.js +5 -1
  215. package/dist/replay/replay.js.map +1 -1
  216. package/dist/retry/index.d.ts +129 -0
  217. package/dist/retry/index.d.ts.map +1 -0
  218. package/dist/retry/index.js +156 -0
  219. package/dist/retry/index.js.map +1 -0
  220. package/dist/retry/presets.d.ts +39 -0
  221. package/dist/retry/presets.d.ts.map +1 -0
  222. package/dist/retry/presets.js +69 -0
  223. package/dist/retry/presets.js.map +1 -0
  224. package/dist/skill-loop/ab-runner.d.ts +67 -0
  225. package/dist/skill-loop/ab-runner.d.ts.map +1 -0
  226. package/dist/skill-loop/ab-runner.js +160 -0
  227. package/dist/skill-loop/ab-runner.js.map +1 -0
  228. package/dist/skill-loop/adoption.d.ts +67 -0
  229. package/dist/skill-loop/adoption.d.ts.map +1 -0
  230. package/dist/skill-loop/adoption.js +126 -0
  231. package/dist/skill-loop/adoption.js.map +1 -0
  232. package/dist/skill-loop/candidate.d.ts +45 -0
  233. package/dist/skill-loop/candidate.d.ts.map +1 -0
  234. package/dist/skill-loop/candidate.js +43 -0
  235. package/dist/skill-loop/candidate.js.map +1 -0
  236. package/dist/skill-loop/evaluator.d.ts +42 -0
  237. package/dist/skill-loop/evaluator.d.ts.map +1 -0
  238. package/dist/skill-loop/evaluator.js +184 -0
  239. package/dist/skill-loop/evaluator.js.map +1 -0
  240. package/dist/skill-loop/index.d.ts +27 -0
  241. package/dist/skill-loop/index.d.ts.map +1 -0
  242. package/dist/skill-loop/index.js +27 -0
  243. package/dist/skill-loop/index.js.map +1 -0
  244. package/dist/skill-loop/reflexion-replay.d.ts +87 -0
  245. package/dist/skill-loop/reflexion-replay.d.ts.map +1 -0
  246. package/dist/skill-loop/reflexion-replay.js +110 -0
  247. package/dist/skill-loop/reflexion-replay.js.map +1 -0
  248. package/dist/skill-loop/sign-off.d.ts +88 -0
  249. package/dist/skill-loop/sign-off.d.ts.map +1 -0
  250. package/dist/skill-loop/sign-off.js +146 -0
  251. package/dist/skill-loop/sign-off.js.map +1 -0
  252. package/dist/skill-loop/value-metric.d.ts +55 -0
  253. package/dist/skill-loop/value-metric.d.ts.map +1 -0
  254. package/dist/skill-loop/value-metric.js +69 -0
  255. package/dist/skill-loop/value-metric.js.map +1 -0
  256. package/dist/skill-loop/versioning.d.ts +36 -0
  257. package/dist/skill-loop/versioning.d.ts.map +1 -0
  258. package/dist/skill-loop/versioning.js +47 -0
  259. package/dist/skill-loop/versioning.js.map +1 -0
  260. package/dist/skill-manifest/anchor.d.ts +91 -0
  261. package/dist/skill-manifest/anchor.d.ts.map +1 -0
  262. package/dist/skill-manifest/anchor.js +331 -0
  263. package/dist/skill-manifest/anchor.js.map +1 -0
  264. package/dist/skill-manifest/builder.d.ts +47 -0
  265. package/dist/skill-manifest/builder.d.ts.map +1 -0
  266. package/dist/skill-manifest/builder.js +93 -0
  267. package/dist/skill-manifest/builder.js.map +1 -0
  268. package/dist/skill-manifest/index.d.ts +13 -0
  269. package/dist/skill-manifest/index.d.ts.map +1 -0
  270. package/dist/skill-manifest/index.js +9 -0
  271. package/dist/skill-manifest/index.js.map +1 -0
  272. package/dist/skill-manifest/types.d.ts +67 -0
  273. package/dist/skill-manifest/types.d.ts.map +1 -0
  274. package/dist/skill-manifest/types.js +16 -0
  275. package/dist/skill-manifest/types.js.map +1 -0
  276. package/dist/skill-manifest/verifier.d.ts +42 -0
  277. package/dist/skill-manifest/verifier.d.ts.map +1 -0
  278. package/dist/skill-manifest/verifier.js +136 -0
  279. package/dist/skill-manifest/verifier.js.map +1 -0
  280. package/dist/skills/brain-query.d.ts +4 -4
  281. package/dist/skills/brain-store.d.ts +6 -6
  282. package/dist/skills/errors.d.ts +15 -0
  283. package/dist/skills/errors.d.ts.map +1 -1
  284. package/dist/skills/errors.js +21 -0
  285. package/dist/skills/errors.js.map +1 -1
  286. package/dist/skills/hitl-request.d.ts +2 -2
  287. package/dist/skills/index.d.ts +3 -1
  288. package/dist/skills/index.d.ts.map +1 -1
  289. package/dist/skills/index.js +4 -1
  290. package/dist/skills/index.js.map +1 -1
  291. package/dist/skills/markdown/loader.d.ts +52 -0
  292. package/dist/skills/markdown/loader.d.ts.map +1 -0
  293. package/dist/skills/markdown/loader.js +93 -0
  294. package/dist/skills/markdown/loader.js.map +1 -0
  295. package/dist/skills/markdown/schema.d.ts +432 -0
  296. package/dist/skills/markdown/schema.d.ts.map +1 -0
  297. package/dist/skills/markdown/schema.js +121 -0
  298. package/dist/skills/markdown/schema.js.map +1 -0
  299. package/dist/skills/poc-md-loader/markdown-loader.d.ts +77 -0
  300. package/dist/skills/poc-md-loader/markdown-loader.d.ts.map +1 -0
  301. package/dist/skills/poc-md-loader/markdown-loader.js +125 -0
  302. package/dist/skills/poc-md-loader/markdown-loader.js.map +1 -0
  303. package/dist/skills/poc-md-loader/runner.d.ts +24 -0
  304. package/dist/skills/poc-md-loader/runner.d.ts.map +1 -0
  305. package/dist/skills/poc-md-loader/runner.js +57 -0
  306. package/dist/skills/poc-md-loader/runner.js.map +1 -0
  307. package/dist/skills/poc-md-loader/vitest.poc.config.d.ts +3 -0
  308. package/dist/skills/poc-md-loader/vitest.poc.config.d.ts.map +1 -0
  309. package/dist/skills/poc-md-loader/vitest.poc.config.js +13 -0
  310. package/dist/skills/poc-md-loader/vitest.poc.config.js.map +1 -0
  311. package/dist/skills/poc-md-loader/web-search/script.d.ts +33 -0
  312. package/dist/skills/poc-md-loader/web-search/script.d.ts.map +1 -0
  313. package/dist/skills/poc-md-loader/web-search/script.js +75 -0
  314. package/dist/skills/poc-md-loader/web-search/script.js.map +1 -0
  315. package/dist/skills/record-outcome.d.ts +4 -4
  316. package/dist/skills/send-email.d.ts.map +1 -1
  317. package/dist/skills/send-email.js +15 -3
  318. package/dist/skills/send-email.js.map +1 -1
  319. package/dist/skills/slack-notify.d.ts +4 -4
  320. package/dist/skills/starknet-balance.d.ts +1 -1
  321. package/dist/skills/telegram-notify.d.ts +4 -4
  322. package/dist/skills/web-search.d.ts +1 -1
  323. package/dist/testing/index.d.ts +3 -0
  324. package/dist/testing/test-brain-port.d.ts +4 -0
  325. package/dist/testing/test-brain-port.d.ts.map +1 -1
  326. package/dist/testing/test-brain-port.js +75 -20
  327. package/dist/testing/test-brain-port.js.map +1 -1
  328. package/dist/testing/test-event-bus.d.ts.map +1 -1
  329. package/dist/testing/test-event-bus.js +89 -36
  330. package/dist/testing/test-event-bus.js.map +1 -1
  331. package/dist/trace/schema.d.ts +1 -1
  332. package/dist/trace/schema.d.ts.map +1 -1
  333. package/dist/trace/schema.js +1 -1
  334. package/dist/trace/schema.js.map +1 -1
  335. package/dist/verify/formal/index.d.ts +44 -0
  336. package/dist/verify/formal/index.d.ts.map +1 -0
  337. package/dist/verify/formal/index.js +98 -0
  338. package/dist/verify/formal/index.js.map +1 -0
  339. package/dist/verify/formal/policy.d.ts +105 -0
  340. package/dist/verify/formal/policy.d.ts.map +1 -0
  341. package/dist/verify/formal/policy.js +159 -0
  342. package/dist/verify/formal/policy.js.map +1 -0
  343. package/dist/verify/formal/result.d.ts +50 -0
  344. package/dist/verify/formal/result.d.ts.map +1 -0
  345. package/dist/verify/formal/result.js +21 -0
  346. package/dist/verify/formal/result.js.map +1 -0
  347. package/dist/verify/formal/solver.d.ts +67 -0
  348. package/dist/verify/formal/solver.d.ts.map +1 -0
  349. package/dist/verify/formal/solver.js +184 -0
  350. package/dist/verify/formal/solver.js.map +1 -0
  351. package/dist/verify/formal/spec-language.d.ts +80 -0
  352. package/dist/verify/formal/spec-language.d.ts.map +1 -0
  353. package/dist/verify/formal/spec-language.js +219 -0
  354. package/dist/verify/formal/spec-language.js.map +1 -0
  355. package/docs/attestation.md +199 -0
  356. package/docs/identity.md +193 -0
  357. package/package.json +34 -17
  358. package/src/adapters/llm/anthropic-direct.ts +51 -0
  359. package/src/adapters/llm/cascade.ts +64 -19
  360. package/src/adapters/llm/litellm.ts +49 -0
  361. package/src/compute/difficulty-estimator.ts +111 -0
  362. package/src/compute/strategies/mixture-of-agents.ts +150 -0
  363. package/src/compute/strategies/tree-of-thoughts.ts +293 -0
  364. package/src/compute/strategies/two-phase-orient.ts +147 -0
  365. package/src/container/protocol.ts +243 -0
  366. package/src/container/runtime.ts +424 -0
  367. package/src/db/migrations/026_formal_verify_results.sql +30 -0
  368. package/src/identity/agent-persona.ts +203 -0
  369. package/src/identity/persona-prompt.ts +84 -0
  370. package/src/identity/persona-schema.ts +127 -0
  371. package/src/index.ts +338 -1
  372. package/src/memory/episodic-rrf.ts +224 -0
  373. package/src/mesh/attenuation.ts +190 -0
  374. package/src/mesh/delegate.ts +254 -0
  375. package/src/mesh/dispatcher.ts +301 -0
  376. package/src/mesh/index.ts +39 -0
  377. package/src/mesh/types.ts +31 -0
  378. package/src/orchestration/ooda/skills.ts +177 -0
  379. package/src/ports/bastion-action.contract.test.ts +355 -0
  380. package/src/ports/bastion-action.ts +198 -0
  381. package/src/ports/brain.ts +177 -15
  382. package/src/ports/citadel-action.contract.test.ts +430 -0
  383. package/src/ports/citadel-action.ts +174 -0
  384. package/src/ports/compliance-contract.ts +191 -0
  385. package/src/ports/db.ts +98 -0
  386. package/src/ports/delegation.contract.test.ts +428 -0
  387. package/src/ports/delegation.ts +211 -0
  388. package/src/ports/event-bus.ts +133 -0
  389. package/src/ports/federation.contract.test.ts +355 -0
  390. package/src/ports/federation.ts +190 -0
  391. package/src/ports/index.ts +186 -1
  392. package/src/ports/llm-provider.ts +123 -0
  393. package/src/ports/logger.ts +104 -0
  394. package/src/ports/manifest-registry.contract.test.ts +324 -0
  395. package/src/ports/manifest-registry.ts +188 -0
  396. package/src/ports/observability.contract.test.ts +315 -0
  397. package/src/ports/observability.ts +150 -0
  398. package/src/ports/outcome.ts +69 -0
  399. package/src/ports/privacy.contract.test.ts +413 -0
  400. package/src/ports/privacy.ts +207 -0
  401. package/src/ports/tenant-context.contract.test.ts +454 -0
  402. package/src/ports/tenant-context.ts +150 -0
  403. package/src/ports/vauban-finance-action.contract.test.ts +335 -0
  404. package/src/ports/vauban-finance-action.ts +166 -0
  405. package/src/ports/workflow-runtime.ts +327 -0
  406. package/src/proof/cert-verify.ts +249 -0
  407. package/src/replay/replay.ts +11 -8
  408. package/src/retry/index.ts +227 -0
  409. package/src/retry/presets.ts +75 -0
  410. package/src/skill-loop/ab-runner.ts +196 -0
  411. package/src/skill-loop/adoption.ts +188 -0
  412. package/src/skill-loop/candidate.ts +75 -0
  413. package/src/skill-loop/evaluator.ts +238 -0
  414. package/src/skill-loop/index.ts +51 -0
  415. package/src/skill-loop/reflexion-replay.ts +173 -0
  416. package/src/skill-loop/sign-off.ts +247 -0
  417. package/src/skill-loop/value-metric.ts +120 -0
  418. package/src/skill-loop/versioning.ts +75 -0
  419. package/src/skill-manifest/anchor.ts +401 -0
  420. package/src/skill-manifest/builder.ts +129 -0
  421. package/src/skill-manifest/index.ts +18 -0
  422. package/src/skill-manifest/types.ts +72 -0
  423. package/src/skill-manifest/verifier.ts +198 -0
  424. package/src/skills/errors.ts +30 -2
  425. package/src/skills/index.ts +19 -0
  426. package/src/skills/markdown/loader.ts +129 -0
  427. package/src/skills/markdown/schema.ts +144 -0
  428. package/src/skills/poc-md-loader/e2e-parity.test.ts +237 -0
  429. package/src/skills/poc-md-loader/markdown-loader.ts +161 -0
  430. package/src/skills/poc-md-loader/runner.ts +82 -0
  431. package/src/skills/poc-md-loader/vitest.poc.config.ts +13 -0
  432. package/src/skills/poc-md-loader/web-search/SKILL.md +42 -0
  433. package/src/skills/poc-md-loader/web-search/script.ts +109 -0
  434. package/src/skills/send-email.ts +15 -3
  435. package/src/testing/test-brain-port.ts +98 -24
  436. package/src/testing/test-event-bus.ts +104 -43
  437. package/src/trace/schema.ts +1 -1
  438. package/src/verify/formal/index.ts +154 -0
  439. package/src/verify/formal/policy.ts +253 -0
  440. package/src/verify/formal/result.ts +52 -0
  441. package/src/verify/formal/solver.ts +235 -0
  442. package/src/verify/formal/spec-language.ts +274 -0
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Episodic memory recall — weighted score combination (cosine + recency + importance).
3
+ *
4
+ * Despite the file name (RRF — Reciprocal Rank Fusion), the algorithm used
5
+ * for CC v3.1 is a **linear combination of normalized components**:
6
+ *
7
+ * score(e) = α · cosine_sim(q, e.embedding)
8
+ * + β · exp(-Δt / τ) // recency decay
9
+ * + γ · importance(e) // [0,1]
10
+ *
11
+ * defaults: α=0.5, β=0.3, γ=0.2, τ=14 days
12
+ *
13
+ * This shape was chosen over pure RRF because the three signals are
14
+ * heterogeneous (similarity, time, salience) and combining them via rank
15
+ * fusion would erase the magnitude information that callers care about
16
+ * (e.g. "near-perfect cosine match" vs "loosely related").
17
+ *
18
+ * Pluggable scorers — callers provide functions mapping an entry to each
19
+ * component so the algorithm is decoupled from storage details (embedding
20
+ * column, importance field name, etc.).
21
+ *
22
+ * @see ../ports/brain.ts — EpisodicMemoryEntry
23
+ * @see ADR-ECO-034 §"AgentPersona via Brain Tier 3 semantic" (companion)
24
+ * @public
25
+ */
26
+ import type { EpisodicMemoryEntry } from "../ports/brain.js";
27
+ /** Default weights — sum to 1.0. */
28
+ export declare const DEFAULT_RRF_WEIGHTS: {
29
+ readonly cosine: 0.5;
30
+ readonly recency: 0.3;
31
+ readonly importance: 0.2;
32
+ };
33
+ /** Default recency half-life (14 days in ms). */
34
+ export declare const DEFAULT_RECENCY_HALFLIFE_MS: number;
35
+ export interface RrfWeights {
36
+ cosine: number;
37
+ recency: number;
38
+ importance: number;
39
+ }
40
+ export interface RrfOptions {
41
+ weights?: Partial<RrfWeights>;
42
+ /** Half-life for recency decay (default: 14 days). */
43
+ recencyHalflifeMs?: number;
44
+ /** Cap on returned entries (default: unbounded). */
45
+ topK?: number;
46
+ /** Override "now" for deterministic tests. */
47
+ now?: () => number;
48
+ }
49
+ export interface ScoreComponents {
50
+ cosine: number;
51
+ recency: number;
52
+ importance: number;
53
+ }
54
+ export interface ScoredEntry<T> {
55
+ entry: T;
56
+ score: number;
57
+ components: ScoreComponents;
58
+ }
59
+ export interface RrfScorers<T> {
60
+ /** Cosine similarity ∈ [-1, 1] — non-finite values clamped to 0. */
61
+ cosine: (entry: T) => number;
62
+ /** Timestamp (ms epoch) used for recency decay. Negative → drop the entry. */
63
+ timestamp: (entry: T) => number;
64
+ /** Salience ∈ [0, 1]. Out-of-range values clamped. */
65
+ importance: (entry: T) => number;
66
+ }
67
+ /**
68
+ * Cosine similarity between two equal-length numeric vectors.
69
+ *
70
+ * Returns 0 if either vector is empty / zero-norm / mismatched length —
71
+ * never throws. This makes the function safe to compose into scorers that
72
+ * may receive partial entries.
73
+ */
74
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
75
+ /**
76
+ * Recency score in [0, 1]: exp(-ln(2) · Δt / halflife).
77
+ * - 1.0 at Δt = 0
78
+ * - 0.5 at Δt = halflife
79
+ * - approaches 0 as Δt → ∞
80
+ *
81
+ * `nowMs` and `timestampMs` are epoch ms. Future timestamps (Δt < 0) clamp
82
+ * to 1.0 (treated as "right now").
83
+ */
84
+ export declare function recencyScore(nowMs: number, timestampMs: number, halflifeMs: number): number;
85
+ /**
86
+ * Score a batch of entries via the weighted combination. The result is sorted
87
+ * by descending score and trimmed to `topK` when set.
88
+ *
89
+ * Negative timestamps (per `scorers.timestamp`) cause the entry to be dropped
90
+ * entirely — this is the cheap way for a scorer to signal "skip" (e.g. row
91
+ * lacks the field).
92
+ */
93
+ export declare function scoreEntries<T>(entries: T[], scorers: RrfScorers<T>, opts?: RrfOptions): ScoredEntry<T>[];
94
+ /**
95
+ * The agent-sdk EpisodicMemoryEntry does NOT carry an embedding column —
96
+ * embeddings live in the storage layer (Postgres pgvector). To enable
97
+ * pluggable cosine scoring, the caller may attach an embedding via the
98
+ * `embedding` field on `metadata`, or supply a custom resolver.
99
+ */
100
+ export type EpisodicCosineFn = (entry: EpisodicMemoryEntry) => number;
101
+ export interface RecallRrfOptions extends RrfOptions {
102
+ /**
103
+ * Cosine scorer — defaults to 0 (no embedding). Provide when you have a
104
+ * pre-computed (entry × query) similarity for each entry.
105
+ */
106
+ cosine?: EpisodicCosineFn;
107
+ }
108
+ /**
109
+ * Rank EpisodicMemoryEntry[] by weighted score. Convenience over scoreEntries
110
+ * with the standard projection (timestamp = entry.timestamp,
111
+ * importance = metadata.importance ?? 0.5).
112
+ */
113
+ export declare function recallEpisodicRrf(entries: EpisodicMemoryEntry[], opts?: RecallRrfOptions): ScoredEntry<EpisodicMemoryEntry>[];
114
+ //# sourceMappingURL=episodic-rrf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episodic-rrf.d.ts","sourceRoot":"","sources":["../../src/memory/episodic-rrf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,oCAAoC;AACpC,eAAO,MAAM,mBAAmB;;;;CAItB,CAAC;AAEX,iDAAiD;AACjD,eAAO,MAAM,2BAA2B,QAA2B,CAAC;AAEpE,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9B,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,eAAe,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,oEAAoE;IACpE,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC;IAC7B,8EAA8E;IAC9E,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC;IAChC,sDAAsD;IACtD,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC;CAClC;AAID;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAcjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,MAAM,CAIR;AAkBD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,OAAO,EAAE,CAAC,EAAE,EACZ,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EACtB,IAAI,GAAE,UAAe,GACpB,WAAW,CAAC,CAAC,CAAC,EAAE,CA+BlB;AAID;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,mBAAmB,KAAK,MAAM,CAAC;AAKtE,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD;;;OAGG;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,mBAAmB,EAAE,EAC9B,IAAI,GAAE,gBAAqB,GAC1B,WAAW,CAAC,mBAAmB,CAAC,EAAE,CAcpC"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Episodic memory recall — weighted score combination (cosine + recency + importance).
3
+ *
4
+ * Despite the file name (RRF — Reciprocal Rank Fusion), the algorithm used
5
+ * for CC v3.1 is a **linear combination of normalized components**:
6
+ *
7
+ * score(e) = α · cosine_sim(q, e.embedding)
8
+ * + β · exp(-Δt / τ) // recency decay
9
+ * + γ · importance(e) // [0,1]
10
+ *
11
+ * defaults: α=0.5, β=0.3, γ=0.2, τ=14 days
12
+ *
13
+ * This shape was chosen over pure RRF because the three signals are
14
+ * heterogeneous (similarity, time, salience) and combining them via rank
15
+ * fusion would erase the magnitude information that callers care about
16
+ * (e.g. "near-perfect cosine match" vs "loosely related").
17
+ *
18
+ * Pluggable scorers — callers provide functions mapping an entry to each
19
+ * component so the algorithm is decoupled from storage details (embedding
20
+ * column, importance field name, etc.).
21
+ *
22
+ * @see ../ports/brain.ts — EpisodicMemoryEntry
23
+ * @see ADR-ECO-034 §"AgentPersona via Brain Tier 3 semantic" (companion)
24
+ * @public
25
+ */
26
+ /** Default weights — sum to 1.0. */
27
+ export const DEFAULT_RRF_WEIGHTS = {
28
+ cosine: 0.5,
29
+ recency: 0.3,
30
+ importance: 0.2,
31
+ };
32
+ /** Default recency half-life (14 days in ms). */
33
+ export const DEFAULT_RECENCY_HALFLIFE_MS = 14 * 24 * 60 * 60 * 1000;
34
+ // ─── Pure helpers ─────────────────────────────────────────────────────────────
35
+ /**
36
+ * Cosine similarity between two equal-length numeric vectors.
37
+ *
38
+ * Returns 0 if either vector is empty / zero-norm / mismatched length —
39
+ * never throws. This makes the function safe to compose into scorers that
40
+ * may receive partial entries.
41
+ */
42
+ export function cosineSimilarity(a, b) {
43
+ if (a.length === 0 || a.length !== b.length)
44
+ return 0;
45
+ let dot = 0;
46
+ let na = 0;
47
+ let nb = 0;
48
+ for (let i = 0; i < a.length; i++) {
49
+ const ai = a[i];
50
+ const bi = b[i];
51
+ dot += ai * bi;
52
+ na += ai * ai;
53
+ nb += bi * bi;
54
+ }
55
+ if (na === 0 || nb === 0)
56
+ return 0;
57
+ return dot / (Math.sqrt(na) * Math.sqrt(nb));
58
+ }
59
+ /**
60
+ * Recency score in [0, 1]: exp(-ln(2) · Δt / halflife).
61
+ * - 1.0 at Δt = 0
62
+ * - 0.5 at Δt = halflife
63
+ * - approaches 0 as Δt → ∞
64
+ *
65
+ * `nowMs` and `timestampMs` are epoch ms. Future timestamps (Δt < 0) clamp
66
+ * to 1.0 (treated as "right now").
67
+ */
68
+ export function recencyScore(nowMs, timestampMs, halflifeMs) {
69
+ if (halflifeMs <= 0)
70
+ return 0;
71
+ const dt = Math.max(0, nowMs - timestampMs);
72
+ return Math.exp((-Math.LN2 * dt) / halflifeMs);
73
+ }
74
+ /** Clamp to [0, 1]; NaN / non-finite → 0. */
75
+ function clamp01(value) {
76
+ if (!Number.isFinite(value))
77
+ return 0;
78
+ if (value < 0)
79
+ return 0;
80
+ if (value > 1)
81
+ return 1;
82
+ return value;
83
+ }
84
+ /** Clamp cosine output (−1..1) to ≥0 to avoid negative contributions. */
85
+ function clampCosineToPos(value) {
86
+ if (!Number.isFinite(value))
87
+ return 0;
88
+ return value < 0 ? 0 : value;
89
+ }
90
+ // ─── Generic scorer ───────────────────────────────────────────────────────────
91
+ /**
92
+ * Score a batch of entries via the weighted combination. The result is sorted
93
+ * by descending score and trimmed to `topK` when set.
94
+ *
95
+ * Negative timestamps (per `scorers.timestamp`) cause the entry to be dropped
96
+ * entirely — this is the cheap way for a scorer to signal "skip" (e.g. row
97
+ * lacks the field).
98
+ */
99
+ export function scoreEntries(entries, scorers, opts = {}) {
100
+ const weights = {
101
+ cosine: opts.weights?.cosine ?? DEFAULT_RRF_WEIGHTS.cosine,
102
+ recency: opts.weights?.recency ?? DEFAULT_RRF_WEIGHTS.recency,
103
+ importance: opts.weights?.importance ?? DEFAULT_RRF_WEIGHTS.importance,
104
+ };
105
+ const halflifeMs = opts.recencyHalflifeMs ?? DEFAULT_RECENCY_HALFLIFE_MS;
106
+ const nowMs = (opts.now ?? Date.now)();
107
+ const scored = [];
108
+ for (const entry of entries) {
109
+ const ts = scorers.timestamp(entry);
110
+ if (ts < 0)
111
+ continue;
112
+ const cosine = clampCosineToPos(scorers.cosine(entry));
113
+ const recency = recencyScore(nowMs, ts, halflifeMs);
114
+ const importance = clamp01(scorers.importance(entry));
115
+ const score = weights.cosine * cosine +
116
+ weights.recency * recency +
117
+ weights.importance * importance;
118
+ scored.push({
119
+ entry,
120
+ score,
121
+ components: { cosine, recency, importance },
122
+ });
123
+ }
124
+ scored.sort((a, b) => b.score - a.score);
125
+ if (opts.topK !== undefined && opts.topK >= 0) {
126
+ return scored.slice(0, opts.topK);
127
+ }
128
+ return scored;
129
+ }
130
+ /** Default cosine: 0 (no embedding available — relies on recency + importance only). */
131
+ const ZERO_COSINE = () => 0;
132
+ /**
133
+ * Rank EpisodicMemoryEntry[] by weighted score. Convenience over scoreEntries
134
+ * with the standard projection (timestamp = entry.timestamp,
135
+ * importance = metadata.importance ?? 0.5).
136
+ */
137
+ export function recallEpisodicRrf(entries, opts = {}) {
138
+ const cosineFn = opts.cosine ?? ZERO_COSINE;
139
+ return scoreEntries(entries, {
140
+ cosine: cosineFn,
141
+ timestamp: (e) => e.timestamp,
142
+ importance: (e) => {
143
+ const raw = e.metadata?.importance ?? 0.5;
144
+ return typeof raw === "number" ? raw : 0.5;
145
+ },
146
+ }, opts);
147
+ }
148
+ //# sourceMappingURL=episodic-rrf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episodic-rrf.js","sourceRoot":"","sources":["../../src/memory/episodic-rrf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * src/mesh/attenuation.ts
3
+ *
4
+ * Biscuit-style capability attenuation for mesh.delegate().
5
+ *
6
+ * @experimental — sprint-585. Public API may change before v1.x freeze.
7
+ *
8
+ * Implements capability INTERSECTION (child ⊆ parent) without the actual
9
+ * Biscuit token format — keeps the SDK dependency-free. Production deployments
10
+ * should swap `buildToken` / `parseToken` for a real Biscuit issuer in CC.
11
+ *
12
+ * Invariants:
13
+ * - Child actions = INTERSECTION(parent.actions, requested.actions)
14
+ * - Child budget = MIN(parent.budgetEur, requested.budgetEur)
15
+ * - Child expiry = MIN(parent.expiresAt, requested.expiresAt) when both present
16
+ * - Wildcard support: "*" or "ns:*" in parent grants any matching action.
17
+ *
18
+ * No `any` — strict types per craft-standards.
19
+ */
20
+ /**
21
+ * MeshCapabilityScope — bounded capability declaration for mesh dispatch.
22
+ *
23
+ * Renamed from `CapabilityScope` to avoid clash with `ports/delegation.ts`
24
+ * which models a different (DelegationClaim) shape.
25
+ */
26
+ export interface MeshCapabilityScope {
27
+ /** Actions permitted, e.g. ["brain:read", "vault:read", "hitl:trigger"]. */
28
+ readonly actions: ReadonlyArray<string>;
29
+ /** Max EUR the holder may spend under this scope. */
30
+ readonly budgetEur: number;
31
+ /** Hard expiry — past this date, scope MUST be rejected by callers. */
32
+ readonly expiresAt?: Date;
33
+ }
34
+ /** Backwards-compatible alias for the spec name `CapabilityScope`. */
35
+ export type CapabilityScope = MeshCapabilityScope;
36
+ /**
37
+ * AttenuatedToken — opaque transport for a scope across an agent boundary.
38
+ *
39
+ * Phase MVP : plain object (no signature). Phase 2+ : swap with Biscuit token
40
+ * (the encoded `token` field becomes the Biscuit hex / base64 form).
41
+ */
42
+ export interface AttenuatedToken {
43
+ /** Allowed actions (post-attenuation). */
44
+ readonly scope: ReadonlyArray<string>;
45
+ /** Remaining EUR allowance. */
46
+ readonly budgetEur: number;
47
+ /** Parent agent identifier — caller of the delegation step. */
48
+ readonly parentId: string;
49
+ /** Optional expiry, ISO 8601 — propagated from MeshCapabilityScope.expiresAt. */
50
+ readonly expiresAt?: string;
51
+ }
52
+ /**
53
+ * Attenuate a parent scope by a requested scope.
54
+ *
55
+ * Returns a NEW scope (immutable input semantics).
56
+ * Guarantees `child ⊆ parent` (capability intersection invariant).
57
+ */
58
+ export declare function attenuateScope(parent: MeshCapabilityScope, requested: MeshCapabilityScope): MeshCapabilityScope;
59
+ /**
60
+ * Check whether a scope permits a specific action.
61
+ * Supports wildcards (`"*"`, `"ns:*"`). Returns false if scope is expired.
62
+ */
63
+ export declare function scopeAllows(scope: MeshCapabilityScope, action: string): boolean;
64
+ /**
65
+ * Encode a scope as an opaque token bound to a parent identifier.
66
+ *
67
+ * Phase MVP : plain structural copy. Phase 2+ : replace with Biscuit-signed token
68
+ * (the `parentId` becomes the issuer public key, `scope`/`budgetEur` become
69
+ * Biscuit facts, `expiresAt` becomes a Biscuit check).
70
+ */
71
+ export declare function buildToken(scope: MeshCapabilityScope, parentId: string): AttenuatedToken;
72
+ /**
73
+ * Decode a token back to a MeshCapabilityScope.
74
+ *
75
+ * Inverse of `buildToken` modulo identity loss (parentId not part of scope).
76
+ */
77
+ export declare function parseToken(token: AttenuatedToken): MeshCapabilityScope;
78
+ //# sourceMappingURL=attenuation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attenuation.d.ts","sourceRoot":"","sources":["../../src/mesh/attenuation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC,qDAAqD;IACrD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,uEAAuE;IACvE,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;CAC3B;AAED,sEAAsE;AACtE,MAAM,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iFAAiF;IACjF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AA6CD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,mBAAmB,EAC3B,SAAS,EAAE,mBAAmB,GAC7B,mBAAmB,CA8BrB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAM/E;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAaxF;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,mBAAmB,CAStE"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * src/mesh/attenuation.ts
3
+ *
4
+ * Biscuit-style capability attenuation for mesh.delegate().
5
+ *
6
+ * @experimental — sprint-585. Public API may change before v1.x freeze.
7
+ *
8
+ * Implements capability INTERSECTION (child ⊆ parent) without the actual
9
+ * Biscuit token format — keeps the SDK dependency-free. Production deployments
10
+ * should swap `buildToken` / `parseToken` for a real Biscuit issuer in CC.
11
+ *
12
+ * Invariants:
13
+ * - Child actions = INTERSECTION(parent.actions, requested.actions)
14
+ * - Child budget = MIN(parent.budgetEur, requested.budgetEur)
15
+ * - Child expiry = MIN(parent.expiresAt, requested.expiresAt) when both present
16
+ * - Wildcard support: "*" or "ns:*" in parent grants any matching action.
17
+ *
18
+ * No `any` — strict types per craft-standards.
19
+ */
20
+ // ─── Wildcard match ──────────────────────────────────────────────────────────
21
+ /**
22
+ * Match an action against a parent permission entry.
23
+ *
24
+ * - Exact match (case-sensitive).
25
+ * - `"*"` grants everything.
26
+ * - `"ns:*"` grants any action whose namespace prefix matches `ns:`.
27
+ */
28
+ function permissionMatches(parentPerm, requested) {
29
+ if (parentPerm === "*" || parentPerm === requested)
30
+ return true;
31
+ if (parentPerm.endsWith(":*")) {
32
+ const prefix = parentPerm.slice(0, -1); // keep trailing colon
33
+ return requested.startsWith(prefix);
34
+ }
35
+ return false;
36
+ }
37
+ /**
38
+ * Intersect a parent action set with a requested set.
39
+ * Output: only requested actions that the parent allows (preserving order).
40
+ */
41
+ function intersectActions(parent, requested) {
42
+ const out = [];
43
+ const seen = new Set();
44
+ for (const req of requested) {
45
+ if (seen.has(req))
46
+ continue;
47
+ for (const p of parent) {
48
+ if (permissionMatches(p, req)) {
49
+ out.push(req);
50
+ seen.add(req);
51
+ break;
52
+ }
53
+ }
54
+ }
55
+ return out;
56
+ }
57
+ // ─── Public API ──────────────────────────────────────────────────────────────
58
+ /**
59
+ * Attenuate a parent scope by a requested scope.
60
+ *
61
+ * Returns a NEW scope (immutable input semantics).
62
+ * Guarantees `child ⊆ parent` (capability intersection invariant).
63
+ */
64
+ export function attenuateScope(parent, requested) {
65
+ if (!Number.isFinite(parent.budgetEur) || parent.budgetEur < 0) {
66
+ throw new RangeError(`attenuateScope: parent.budgetEur must be ≥ 0, got ${parent.budgetEur}`);
67
+ }
68
+ if (!Number.isFinite(requested.budgetEur) || requested.budgetEur < 0) {
69
+ throw new RangeError(`attenuateScope: requested.budgetEur must be ≥ 0, got ${requested.budgetEur}`);
70
+ }
71
+ const childActions = intersectActions(parent.actions, requested.actions);
72
+ const childBudget = Math.min(parent.budgetEur, requested.budgetEur);
73
+ let childExpiresAt;
74
+ if (parent.expiresAt && requested.expiresAt) {
75
+ childExpiresAt = new Date(Math.min(parent.expiresAt.getTime(), requested.expiresAt.getTime()));
76
+ }
77
+ else if (parent.expiresAt) {
78
+ childExpiresAt = new Date(parent.expiresAt.getTime());
79
+ }
80
+ else if (requested.expiresAt) {
81
+ childExpiresAt = new Date(requested.expiresAt.getTime());
82
+ }
83
+ const out = childExpiresAt
84
+ ? {
85
+ actions: childActions,
86
+ budgetEur: childBudget,
87
+ expiresAt: childExpiresAt,
88
+ }
89
+ : { actions: childActions, budgetEur: childBudget };
90
+ return out;
91
+ }
92
+ /**
93
+ * Check whether a scope permits a specific action.
94
+ * Supports wildcards (`"*"`, `"ns:*"`). Returns false if scope is expired.
95
+ */
96
+ export function scopeAllows(scope, action) {
97
+ if (scope.expiresAt && scope.expiresAt.getTime() <= Date.now())
98
+ return false;
99
+ for (const perm of scope.actions) {
100
+ if (permissionMatches(perm, action))
101
+ return true;
102
+ }
103
+ return false;
104
+ }
105
+ /**
106
+ * Encode a scope as an opaque token bound to a parent identifier.
107
+ *
108
+ * Phase MVP : plain structural copy. Phase 2+ : replace with Biscuit-signed token
109
+ * (the `parentId` becomes the issuer public key, `scope`/`budgetEur` become
110
+ * Biscuit facts, `expiresAt` becomes a Biscuit check).
111
+ */
112
+ export function buildToken(scope, parentId) {
113
+ if (!parentId || typeof parentId !== "string") {
114
+ throw new TypeError("buildToken: parentId must be a non-empty string");
115
+ }
116
+ const out = scope.expiresAt
117
+ ? {
118
+ scope: [...scope.actions],
119
+ budgetEur: scope.budgetEur,
120
+ parentId,
121
+ expiresAt: scope.expiresAt.toISOString(),
122
+ }
123
+ : { scope: [...scope.actions], budgetEur: scope.budgetEur, parentId };
124
+ return out;
125
+ }
126
+ /**
127
+ * Decode a token back to a MeshCapabilityScope.
128
+ *
129
+ * Inverse of `buildToken` modulo identity loss (parentId not part of scope).
130
+ */
131
+ export function parseToken(token) {
132
+ const out = token.expiresAt
133
+ ? {
134
+ actions: [...token.scope],
135
+ budgetEur: token.budgetEur,
136
+ expiresAt: new Date(token.expiresAt),
137
+ }
138
+ : { actions: [...token.scope], budgetEur: token.budgetEur };
139
+ return out;
140
+ }
141
+ //# sourceMappingURL=attenuation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attenuation.js","sourceRoot":"","sources":["../../src/mesh/attenuation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * src/mesh/delegate.ts
3
+ *
4
+ * `mesh.delegate()` — intent-based dispatch to the best available agent.
5
+ *
6
+ * @experimental — sprint-585. Public API may change before v1.x freeze.
7
+ *
8
+ * Replaces manual `withCompute()` boilerplate with a one-liner:
9
+ *
10
+ * const r = await meshDelegate({ need: "summarize the spec" }, dispatcher);
11
+ *
12
+ * Responsibilities:
13
+ * 1. Classify need → AgentKind (via dispatcher.classify or injected hint).
14
+ * 2. Apply capability attenuation if a parent token is present.
15
+ * 3. Forward to dispatcher with budget/deadline guards.
16
+ * 4. Build a delegation chain link for audit.
17
+ *
18
+ * Streaming (`onChunk`) is a best-effort surface — the dispatcher must opt-in
19
+ * by exposing a `dispatchStream` (not part of base contract). When unavailable,
20
+ * the final result is delivered as a single chunk after completion.
21
+ */
22
+ import { type AttenuatedToken } from "./attenuation.js";
23
+ import { DefaultMeshDispatcher, type MeshDispatcher } from "./dispatcher.js";
24
+ import type { DelegationLink, MeshAgentKind } from "./types.js";
25
+ export interface DelegateChunk {
26
+ readonly text: string;
27
+ readonly done: boolean;
28
+ readonly agentKind?: MeshAgentKind;
29
+ }
30
+ export interface DelegateOptions {
31
+ /** Natural language description of the need. */
32
+ readonly need: string;
33
+ /** Optional structured or free-form context. Serialized to JSON if object. */
34
+ readonly context?: string | Record<string, unknown>;
35
+ /** Caller-requested capabilities (subject to attenuation if parentToken present). */
36
+ readonly capabilities?: ReadonlyArray<string>;
37
+ /** Wall-clock budget in ms. Default 30 000. */
38
+ readonly deadline_ms?: number;
39
+ /** Cost cap in EUR. Default 0.01. */
40
+ readonly max_cost_eur?: number;
41
+ /** Parent token — when present, child scope = parent ∩ requested capabilities. */
42
+ readonly parentToken?: AttenuatedToken;
43
+ /** Optional streaming callback. */
44
+ readonly onChunk?: (chunk: DelegateChunk) => void;
45
+ /** Optional pre-resolved kind — skips classifier. */
46
+ readonly kind?: MeshAgentKind;
47
+ /** Stable child agent identifier (for delegation chain audit). Default: random. */
48
+ readonly childId?: string;
49
+ /** MCP tool name (only when kind === "mcp-tool"). */
50
+ readonly toolName?: string;
51
+ /** MCP tool args (only when kind === "mcp-tool"). */
52
+ readonly toolArgs?: unknown;
53
+ }
54
+ export interface DelegateResult<T = string> {
55
+ readonly output: T;
56
+ readonly agentKind: MeshAgentKind;
57
+ readonly delegationChain: ReadonlyArray<DelegationLink>;
58
+ readonly costEur: number;
59
+ readonly durationMs: number;
60
+ readonly truncated: boolean;
61
+ /** Token issued to the child — empty when no parentToken given. */
62
+ readonly childToken?: AttenuatedToken;
63
+ }
64
+ export declare class DelegateAttenuationError extends Error {
65
+ readonly name = "DelegateAttenuationError";
66
+ }
67
+ /**
68
+ * Delegate a need to the best available agent.
69
+ *
70
+ * Routing priority (when `kind` not pre-set):
71
+ * 1. Dispatcher's `classify(need)` hook if present.
72
+ * 2. Heuristic — see `defaultClassifier`.
73
+ *
74
+ * Capability attenuation:
75
+ * - If `parentToken` is provided, child scope = parent ∩ requested.
76
+ * - Empty intersection raises {@link DelegateAttenuationError}.
77
+ *
78
+ * Budget guards:
79
+ * - When `parentToken.budgetEur < max_cost_eur`, the effective max is parent's.
80
+ * - Negative budget or deadline → RangeError.
81
+ */
82
+ export declare function meshDelegate<T = string>(options: DelegateOptions, dispatcher: MeshDispatcher): Promise<DelegateResult<T>>;
83
+ /**
84
+ * Factory variant — binds a dispatcher so callers can call `delegate(opts)`
85
+ * without re-passing the dispatcher every time.
86
+ *
87
+ * Useful for DI in long-lived services.
88
+ */
89
+ export declare function createMeshDelegate(dispatcher: MeshDispatcher): <T = string>(options: DelegateOptions) => Promise<DelegateResult<T>>;
90
+ /**
91
+ * Re-export DefaultMeshDispatcher as a convenience so callers can do:
92
+ *
93
+ * import { meshDelegate, DefaultMeshDispatcher } from "@vauban-org/agent-sdk";
94
+ */
95
+ export { DefaultMeshDispatcher };
96
+ //# sourceMappingURL=delegate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegate.d.ts","sourceRoot":"","sources":["../../src/mesh/delegate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EACL,KAAK,eAAe,EAIrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAuB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAClG,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,qFAAqF;IACrF,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,+CAA+C;IAC/C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,kFAAkF;IAClF,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC;IACvC,mCAAmC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAClD,qDAAqD;IACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC;IAC9B,mFAAmF;IACnF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,MAAM;IACxC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IACxD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC;CACvC;AA2DD,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,SAAkB,IAAI,8BAA8B;CACrD;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,YAAY,CAAC,CAAC,GAAG,MAAM,EAC3C,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CA8E5B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,cAAc,GACzB,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAEtE;AAED;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,CAAC"}