@vauban-org/agent-sdk 1.0.0 → 1.3.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 (513) hide show
  1. package/CONTRACT.md +6918 -742
  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 +41 -3
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +31 -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/agent.d.ts.map +1 -1
  98. package/dist/orchestration/ooda/agent.js +36 -0
  99. package/dist/orchestration/ooda/agent.js.map +1 -1
  100. package/dist/orchestration/ooda/skills.d.ts +104 -0
  101. package/dist/orchestration/ooda/skills.d.ts.map +1 -1
  102. package/dist/orchestration/ooda/skills.js +106 -0
  103. package/dist/orchestration/ooda/skills.js.map +1 -1
  104. package/dist/orchestration/ooda/types.d.ts +11 -0
  105. package/dist/orchestration/ooda/types.d.ts.map +1 -1
  106. package/dist/ports/bastion-action.contract.test.d.ts +11 -0
  107. package/dist/ports/bastion-action.contract.test.d.ts.map +1 -0
  108. package/dist/ports/bastion-action.contract.test.js +238 -0
  109. package/dist/ports/bastion-action.contract.test.js.map +1 -0
  110. package/dist/ports/bastion-action.d.ts +133 -0
  111. package/dist/ports/bastion-action.d.ts.map +1 -0
  112. package/dist/ports/bastion-action.js +73 -0
  113. package/dist/ports/bastion-action.js.map +1 -0
  114. package/dist/ports/brain.d.ts +31 -0
  115. package/dist/ports/brain.d.ts.map +1 -1
  116. package/dist/ports/brain.js +115 -1
  117. package/dist/ports/brain.js.map +1 -1
  118. package/dist/ports/citadel-action.contract.test.d.ts +11 -0
  119. package/dist/ports/citadel-action.contract.test.d.ts.map +1 -0
  120. package/dist/ports/citadel-action.contract.test.js +317 -0
  121. package/dist/ports/citadel-action.contract.test.js.map +1 -0
  122. package/dist/ports/citadel-action.d.ts +111 -0
  123. package/dist/ports/citadel-action.d.ts.map +1 -0
  124. package/dist/ports/citadel-action.js +62 -0
  125. package/dist/ports/citadel-action.js.map +1 -0
  126. package/dist/ports/compliance-contract.d.ts +123 -0
  127. package/dist/ports/compliance-contract.d.ts.map +1 -0
  128. package/dist/ports/compliance-contract.js +35 -0
  129. package/dist/ports/compliance-contract.js.map +1 -0
  130. package/dist/ports/db.d.ts +38 -0
  131. package/dist/ports/db.d.ts.map +1 -1
  132. package/dist/ports/db.js +88 -1
  133. package/dist/ports/db.js.map +1 -1
  134. package/dist/ports/delegation.contract.test.d.ts +9 -0
  135. package/dist/ports/delegation.contract.test.d.ts.map +1 -0
  136. package/dist/ports/delegation.contract.test.js +337 -0
  137. package/dist/ports/delegation.contract.test.js.map +1 -0
  138. package/dist/ports/delegation.d.ts +134 -0
  139. package/dist/ports/delegation.d.ts.map +1 -0
  140. package/dist/ports/delegation.js +105 -0
  141. package/dist/ports/delegation.js.map +1 -0
  142. package/dist/ports/event-bus.d.ts +29 -0
  143. package/dist/ports/event-bus.d.ts.map +1 -1
  144. package/dist/ports/event-bus.js +106 -1
  145. package/dist/ports/event-bus.js.map +1 -1
  146. package/dist/ports/federation.contract.test.d.ts +9 -0
  147. package/dist/ports/federation.contract.test.d.ts.map +1 -0
  148. package/dist/ports/federation.contract.test.js +279 -0
  149. package/dist/ports/federation.contract.test.js.map +1 -0
  150. package/dist/ports/federation.d.ts +140 -0
  151. package/dist/ports/federation.d.ts.map +1 -0
  152. package/dist/ports/federation.js +57 -0
  153. package/dist/ports/federation.js.map +1 -0
  154. package/dist/ports/index.d.ts +28 -2
  155. package/dist/ports/index.d.ts.map +1 -1
  156. package/dist/ports/index.js +17 -2
  157. package/dist/ports/index.js.map +1 -1
  158. package/dist/ports/llm-provider.d.ts +37 -0
  159. package/dist/ports/llm-provider.d.ts.map +1 -1
  160. package/dist/ports/llm-provider.js +99 -1
  161. package/dist/ports/llm-provider.js.map +1 -1
  162. package/dist/ports/logger.d.ts +27 -0
  163. package/dist/ports/logger.d.ts.map +1 -1
  164. package/dist/ports/logger.js +87 -0
  165. package/dist/ports/logger.js.map +1 -1
  166. package/dist/ports/manifest-registry.contract.test.d.ts +9 -0
  167. package/dist/ports/manifest-registry.contract.test.d.ts.map +1 -0
  168. package/dist/ports/manifest-registry.contract.test.js +246 -0
  169. package/dist/ports/manifest-registry.contract.test.js.map +1 -0
  170. package/dist/ports/manifest-registry.d.ts +116 -0
  171. package/dist/ports/manifest-registry.d.ts.map +1 -0
  172. package/dist/ports/manifest-registry.js +79 -0
  173. package/dist/ports/manifest-registry.js.map +1 -0
  174. package/dist/ports/observability.contract.test.d.ts +12 -0
  175. package/dist/ports/observability.contract.test.d.ts.map +1 -0
  176. package/dist/ports/observability.contract.test.js +260 -0
  177. package/dist/ports/observability.contract.test.js.map +1 -0
  178. package/dist/ports/observability.d.ts +98 -0
  179. package/dist/ports/observability.d.ts.map +1 -0
  180. package/dist/ports/observability.js +59 -0
  181. package/dist/ports/observability.js.map +1 -0
  182. package/dist/ports/outcome.d.ts +26 -0
  183. package/dist/ports/outcome.d.ts.map +1 -1
  184. package/dist/ports/outcome.js +62 -1
  185. package/dist/ports/outcome.js.map +1 -1
  186. package/dist/ports/privacy.contract.test.d.ts +12 -0
  187. package/dist/ports/privacy.contract.test.d.ts.map +1 -0
  188. package/dist/ports/privacy.contract.test.js +325 -0
  189. package/dist/ports/privacy.contract.test.js.map +1 -0
  190. package/dist/ports/privacy.d.ts +132 -0
  191. package/dist/ports/privacy.d.ts.map +1 -0
  192. package/dist/ports/privacy.js +83 -0
  193. package/dist/ports/privacy.js.map +1 -0
  194. package/dist/ports/tenant-context.contract.test.d.ts +14 -0
  195. package/dist/ports/tenant-context.contract.test.d.ts.map +1 -0
  196. package/dist/ports/tenant-context.contract.test.js +352 -0
  197. package/dist/ports/tenant-context.contract.test.js.map +1 -0
  198. package/dist/ports/tenant-context.d.ts +103 -0
  199. package/dist/ports/tenant-context.d.ts.map +1 -0
  200. package/dist/ports/tenant-context.js +48 -0
  201. package/dist/ports/tenant-context.js.map +1 -0
  202. package/dist/ports/vauban-finance-action.contract.test.d.ts +11 -0
  203. package/dist/ports/vauban-finance-action.contract.test.d.ts.map +1 -0
  204. package/dist/ports/vauban-finance-action.contract.test.js +260 -0
  205. package/dist/ports/vauban-finance-action.contract.test.js.map +1 -0
  206. package/dist/ports/vauban-finance-action.d.ts +106 -0
  207. package/dist/ports/vauban-finance-action.d.ts.map +1 -0
  208. package/dist/ports/vauban-finance-action.js +60 -0
  209. package/dist/ports/vauban-finance-action.js.map +1 -0
  210. package/dist/ports/workflow-runtime.d.ts +204 -0
  211. package/dist/ports/workflow-runtime.d.ts.map +1 -0
  212. package/dist/ports/workflow-runtime.js +72 -0
  213. package/dist/ports/workflow-runtime.js.map +1 -0
  214. package/dist/proof/cert-verify.d.ts +80 -0
  215. package/dist/proof/cert-verify.d.ts.map +1 -0
  216. package/dist/proof/cert-verify.js +178 -0
  217. package/dist/proof/cert-verify.js.map +1 -0
  218. package/dist/replay/replay.d.ts.map +1 -1
  219. package/dist/replay/replay.js +5 -1
  220. package/dist/replay/replay.js.map +1 -1
  221. package/dist/retry/index.d.ts +129 -0
  222. package/dist/retry/index.d.ts.map +1 -0
  223. package/dist/retry/index.js +156 -0
  224. package/dist/retry/index.js.map +1 -0
  225. package/dist/retry/presets.d.ts +39 -0
  226. package/dist/retry/presets.d.ts.map +1 -0
  227. package/dist/retry/presets.js +69 -0
  228. package/dist/retry/presets.js.map +1 -0
  229. package/dist/skill-loop/ab-runner.d.ts +67 -0
  230. package/dist/skill-loop/ab-runner.d.ts.map +1 -0
  231. package/dist/skill-loop/ab-runner.js +160 -0
  232. package/dist/skill-loop/ab-runner.js.map +1 -0
  233. package/dist/skill-loop/adoption.d.ts +67 -0
  234. package/dist/skill-loop/adoption.d.ts.map +1 -0
  235. package/dist/skill-loop/adoption.js +126 -0
  236. package/dist/skill-loop/adoption.js.map +1 -0
  237. package/dist/skill-loop/candidate.d.ts +45 -0
  238. package/dist/skill-loop/candidate.d.ts.map +1 -0
  239. package/dist/skill-loop/candidate.js +43 -0
  240. package/dist/skill-loop/candidate.js.map +1 -0
  241. package/dist/skill-loop/evaluator.d.ts +42 -0
  242. package/dist/skill-loop/evaluator.d.ts.map +1 -0
  243. package/dist/skill-loop/evaluator.js +184 -0
  244. package/dist/skill-loop/evaluator.js.map +1 -0
  245. package/dist/skill-loop/index.d.ts +27 -0
  246. package/dist/skill-loop/index.d.ts.map +1 -0
  247. package/dist/skill-loop/index.js +27 -0
  248. package/dist/skill-loop/index.js.map +1 -0
  249. package/dist/skill-loop/reflexion-replay.d.ts +87 -0
  250. package/dist/skill-loop/reflexion-replay.d.ts.map +1 -0
  251. package/dist/skill-loop/reflexion-replay.js +110 -0
  252. package/dist/skill-loop/reflexion-replay.js.map +1 -0
  253. package/dist/skill-loop/sign-off.d.ts +88 -0
  254. package/dist/skill-loop/sign-off.d.ts.map +1 -0
  255. package/dist/skill-loop/sign-off.js +146 -0
  256. package/dist/skill-loop/sign-off.js.map +1 -0
  257. package/dist/skill-loop/value-metric.d.ts +55 -0
  258. package/dist/skill-loop/value-metric.d.ts.map +1 -0
  259. package/dist/skill-loop/value-metric.js +69 -0
  260. package/dist/skill-loop/value-metric.js.map +1 -0
  261. package/dist/skill-loop/versioning.d.ts +36 -0
  262. package/dist/skill-loop/versioning.d.ts.map +1 -0
  263. package/dist/skill-loop/versioning.js +47 -0
  264. package/dist/skill-loop/versioning.js.map +1 -0
  265. package/dist/skill-manifest/anchor.d.ts +91 -0
  266. package/dist/skill-manifest/anchor.d.ts.map +1 -0
  267. package/dist/skill-manifest/anchor.js +331 -0
  268. package/dist/skill-manifest/anchor.js.map +1 -0
  269. package/dist/skill-manifest/builder.d.ts +47 -0
  270. package/dist/skill-manifest/builder.d.ts.map +1 -0
  271. package/dist/skill-manifest/builder.js +93 -0
  272. package/dist/skill-manifest/builder.js.map +1 -0
  273. package/dist/skill-manifest/index.d.ts +13 -0
  274. package/dist/skill-manifest/index.d.ts.map +1 -0
  275. package/dist/skill-manifest/index.js +9 -0
  276. package/dist/skill-manifest/index.js.map +1 -0
  277. package/dist/skill-manifest/types.d.ts +67 -0
  278. package/dist/skill-manifest/types.d.ts.map +1 -0
  279. package/dist/skill-manifest/types.js +16 -0
  280. package/dist/skill-manifest/types.js.map +1 -0
  281. package/dist/skill-manifest/verifier.d.ts +42 -0
  282. package/dist/skill-manifest/verifier.d.ts.map +1 -0
  283. package/dist/skill-manifest/verifier.js +136 -0
  284. package/dist/skill-manifest/verifier.js.map +1 -0
  285. package/dist/skills/_secrets.d.ts +16 -0
  286. package/dist/skills/_secrets.d.ts.map +1 -0
  287. package/dist/skills/_secrets.js +20 -0
  288. package/dist/skills/_secrets.js.map +1 -0
  289. package/dist/skills/alpaca-quote.d.ts +2 -2
  290. package/dist/skills/alpaca-quote.d.ts.map +1 -1
  291. package/dist/skills/alpaca-quote.js +51 -20
  292. package/dist/skills/alpaca-quote.js.map +1 -1
  293. package/dist/skills/brain-query.d.ts +4 -4
  294. package/dist/skills/brain-store.d.ts +6 -6
  295. package/dist/skills/errors.d.ts +15 -0
  296. package/dist/skills/errors.d.ts.map +1 -1
  297. package/dist/skills/errors.js +21 -0
  298. package/dist/skills/errors.js.map +1 -1
  299. package/dist/skills/hitl-request.d.ts +2 -2
  300. package/dist/skills/index.d.ts +3 -1
  301. package/dist/skills/index.d.ts.map +1 -1
  302. package/dist/skills/index.js +4 -1
  303. package/dist/skills/index.js.map +1 -1
  304. package/dist/skills/markdown/loader.d.ts +52 -0
  305. package/dist/skills/markdown/loader.d.ts.map +1 -0
  306. package/dist/skills/markdown/loader.js +93 -0
  307. package/dist/skills/markdown/loader.js.map +1 -0
  308. package/dist/skills/markdown/schema.d.ts +432 -0
  309. package/dist/skills/markdown/schema.d.ts.map +1 -0
  310. package/dist/skills/markdown/schema.js +121 -0
  311. package/dist/skills/markdown/schema.js.map +1 -0
  312. package/dist/skills/poc-md-loader/markdown-loader.d.ts +77 -0
  313. package/dist/skills/poc-md-loader/markdown-loader.d.ts.map +1 -0
  314. package/dist/skills/poc-md-loader/markdown-loader.js +125 -0
  315. package/dist/skills/poc-md-loader/markdown-loader.js.map +1 -0
  316. package/dist/skills/poc-md-loader/runner.d.ts +24 -0
  317. package/dist/skills/poc-md-loader/runner.d.ts.map +1 -0
  318. package/dist/skills/poc-md-loader/runner.js +57 -0
  319. package/dist/skills/poc-md-loader/runner.js.map +1 -0
  320. package/dist/skills/poc-md-loader/vitest.poc.config.d.ts +3 -0
  321. package/dist/skills/poc-md-loader/vitest.poc.config.d.ts.map +1 -0
  322. package/dist/skills/poc-md-loader/vitest.poc.config.js +13 -0
  323. package/dist/skills/poc-md-loader/vitest.poc.config.js.map +1 -0
  324. package/dist/skills/poc-md-loader/web-search/script.d.ts +33 -0
  325. package/dist/skills/poc-md-loader/web-search/script.d.ts.map +1 -0
  326. package/dist/skills/poc-md-loader/web-search/script.js +75 -0
  327. package/dist/skills/poc-md-loader/web-search/script.js.map +1 -0
  328. package/dist/skills/record-outcome.d.ts +4 -4
  329. package/dist/skills/send-email.d.ts +2 -2
  330. package/dist/skills/send-email.d.ts.map +1 -1
  331. package/dist/skills/send-email.js +4 -3
  332. package/dist/skills/send-email.js.map +1 -1
  333. package/dist/skills/slack-notify.d.ts +4 -4
  334. package/dist/skills/slack-notify.d.ts.map +1 -1
  335. package/dist/skills/slack-notify.js +52 -21
  336. package/dist/skills/slack-notify.js.map +1 -1
  337. package/dist/skills/starknet-balance.d.ts +1 -1
  338. package/dist/skills/telegram-notify.d.ts +4 -4
  339. package/dist/skills/telegram-notify.d.ts.map +1 -1
  340. package/dist/skills/telegram-notify.js +48 -19
  341. package/dist/skills/telegram-notify.js.map +1 -1
  342. package/dist/skills/web-search.d.ts +1 -1
  343. package/dist/skills/web-search.d.ts.map +1 -1
  344. package/dist/skills/web-search.js +85 -40
  345. package/dist/skills/web-search.js.map +1 -1
  346. package/dist/telemetry/bus.d.ts +54 -0
  347. package/dist/telemetry/bus.d.ts.map +1 -0
  348. package/dist/telemetry/bus.js +159 -0
  349. package/dist/telemetry/bus.js.map +1 -0
  350. package/dist/telemetry/index.d.ts +35 -0
  351. package/dist/telemetry/index.d.ts.map +1 -0
  352. package/dist/telemetry/index.js +30 -0
  353. package/dist/telemetry/index.js.map +1 -0
  354. package/dist/telemetry/port.d.ts +121 -0
  355. package/dist/telemetry/port.d.ts.map +1 -0
  356. package/dist/telemetry/port.js +48 -0
  357. package/dist/telemetry/port.js.map +1 -0
  358. package/dist/telemetry/sinks/otlp.d.ts +45 -0
  359. package/dist/telemetry/sinks/otlp.d.ts.map +1 -0
  360. package/dist/telemetry/sinks/otlp.js +195 -0
  361. package/dist/telemetry/sinks/otlp.js.map +1 -0
  362. package/dist/telemetry/sinks/sqlite.d.ts +32 -0
  363. package/dist/telemetry/sinks/sqlite.d.ts.map +1 -0
  364. package/dist/telemetry/sinks/sqlite.js +170 -0
  365. package/dist/telemetry/sinks/sqlite.js.map +1 -0
  366. package/dist/telemetry/sinks/stdout.d.ts +22 -0
  367. package/dist/telemetry/sinks/stdout.d.ts.map +1 -0
  368. package/dist/telemetry/sinks/stdout.js +38 -0
  369. package/dist/telemetry/sinks/stdout.js.map +1 -0
  370. package/dist/testing/index.d.ts +3 -0
  371. package/dist/testing/test-brain-port.d.ts +4 -0
  372. package/dist/testing/test-brain-port.d.ts.map +1 -1
  373. package/dist/testing/test-brain-port.js +75 -20
  374. package/dist/testing/test-brain-port.js.map +1 -1
  375. package/dist/testing/test-event-bus.d.ts.map +1 -1
  376. package/dist/testing/test-event-bus.js +89 -36
  377. package/dist/testing/test-event-bus.js.map +1 -1
  378. package/dist/trace/schema.d.ts +1 -1
  379. package/dist/trace/schema.d.ts.map +1 -1
  380. package/dist/trace/schema.js +1 -1
  381. package/dist/trace/schema.js.map +1 -1
  382. package/dist/verify/formal/index.d.ts +44 -0
  383. package/dist/verify/formal/index.d.ts.map +1 -0
  384. package/dist/verify/formal/index.js +98 -0
  385. package/dist/verify/formal/index.js.map +1 -0
  386. package/dist/verify/formal/policy.d.ts +105 -0
  387. package/dist/verify/formal/policy.d.ts.map +1 -0
  388. package/dist/verify/formal/policy.js +159 -0
  389. package/dist/verify/formal/policy.js.map +1 -0
  390. package/dist/verify/formal/result.d.ts +50 -0
  391. package/dist/verify/formal/result.d.ts.map +1 -0
  392. package/dist/verify/formal/result.js +21 -0
  393. package/dist/verify/formal/result.js.map +1 -0
  394. package/dist/verify/formal/solver.d.ts +67 -0
  395. package/dist/verify/formal/solver.d.ts.map +1 -0
  396. package/dist/verify/formal/solver.js +184 -0
  397. package/dist/verify/formal/solver.js.map +1 -0
  398. package/dist/verify/formal/spec-language.d.ts +80 -0
  399. package/dist/verify/formal/spec-language.d.ts.map +1 -0
  400. package/dist/verify/formal/spec-language.js +219 -0
  401. package/dist/verify/formal/spec-language.js.map +1 -0
  402. package/docs/attestation.md +199 -0
  403. package/docs/identity.md +193 -0
  404. package/docs/telemetry/migration.md +155 -0
  405. package/docs/telemetry/overview.md +154 -0
  406. package/docs/telemetry/privacy.md +127 -0
  407. package/docs/telemetry/sinks/cc.md +155 -0
  408. package/docs/telemetry/sinks/otlp.md +146 -0
  409. package/docs/telemetry/sinks/sqlite.md +126 -0
  410. package/docs/telemetry/sinks/stdout.md +82 -0
  411. package/package.json +18 -2
  412. package/src/adapters/llm/anthropic-direct.ts +51 -0
  413. package/src/adapters/llm/cascade.ts +64 -19
  414. package/src/adapters/llm/litellm.ts +49 -0
  415. package/src/compute/difficulty-estimator.ts +111 -0
  416. package/src/compute/strategies/mixture-of-agents.ts +150 -0
  417. package/src/compute/strategies/tree-of-thoughts.ts +293 -0
  418. package/src/compute/strategies/two-phase-orient.ts +147 -0
  419. package/src/container/protocol.ts +243 -0
  420. package/src/container/runtime.ts +424 -0
  421. package/src/db/migrations/026_formal_verify_results.sql +30 -0
  422. package/src/identity/agent-persona.ts +203 -0
  423. package/src/identity/persona-prompt.ts +84 -0
  424. package/src/identity/persona-schema.ts +127 -0
  425. package/src/index.ts +368 -2
  426. package/src/memory/episodic-rrf.ts +224 -0
  427. package/src/mesh/attenuation.ts +190 -0
  428. package/src/mesh/delegate.ts +254 -0
  429. package/src/mesh/dispatcher.ts +301 -0
  430. package/src/mesh/index.ts +39 -0
  431. package/src/mesh/types.ts +31 -0
  432. package/src/orchestration/ooda/agent.ts +50 -0
  433. package/src/orchestration/ooda/skills.ts +177 -0
  434. package/src/orchestration/ooda/types.ts +12 -0
  435. package/src/ports/bastion-action.contract.test.ts +355 -0
  436. package/src/ports/bastion-action.ts +198 -0
  437. package/src/ports/brain.ts +177 -15
  438. package/src/ports/citadel-action.contract.test.ts +430 -0
  439. package/src/ports/citadel-action.ts +174 -0
  440. package/src/ports/compliance-contract.ts +191 -0
  441. package/src/ports/db.ts +98 -0
  442. package/src/ports/delegation.contract.test.ts +428 -0
  443. package/src/ports/delegation.ts +211 -0
  444. package/src/ports/event-bus.ts +133 -0
  445. package/src/ports/federation.contract.test.ts +355 -0
  446. package/src/ports/federation.ts +190 -0
  447. package/src/ports/index.ts +186 -1
  448. package/src/ports/llm-provider.ts +123 -0
  449. package/src/ports/logger.ts +104 -0
  450. package/src/ports/manifest-registry.contract.test.ts +324 -0
  451. package/src/ports/manifest-registry.ts +188 -0
  452. package/src/ports/observability.contract.test.ts +315 -0
  453. package/src/ports/observability.ts +150 -0
  454. package/src/ports/outcome.ts +69 -0
  455. package/src/ports/privacy.contract.test.ts +413 -0
  456. package/src/ports/privacy.ts +207 -0
  457. package/src/ports/tenant-context.contract.test.ts +454 -0
  458. package/src/ports/tenant-context.ts +150 -0
  459. package/src/ports/vauban-finance-action.contract.test.ts +335 -0
  460. package/src/ports/vauban-finance-action.ts +166 -0
  461. package/src/ports/workflow-runtime.ts +327 -0
  462. package/src/proof/cert-verify.ts +249 -0
  463. package/src/replay/replay.ts +11 -8
  464. package/src/retry/index.ts +227 -0
  465. package/src/retry/presets.ts +75 -0
  466. package/src/skill-loop/ab-runner.ts +196 -0
  467. package/src/skill-loop/adoption.ts +188 -0
  468. package/src/skill-loop/candidate.ts +75 -0
  469. package/src/skill-loop/evaluator.ts +238 -0
  470. package/src/skill-loop/index.ts +51 -0
  471. package/src/skill-loop/reflexion-replay.ts +173 -0
  472. package/src/skill-loop/sign-off.ts +247 -0
  473. package/src/skill-loop/value-metric.ts +120 -0
  474. package/src/skill-loop/versioning.ts +75 -0
  475. package/src/skill-manifest/anchor.ts +401 -0
  476. package/src/skill-manifest/builder.ts +129 -0
  477. package/src/skill-manifest/index.ts +18 -0
  478. package/src/skill-manifest/types.ts +72 -0
  479. package/src/skill-manifest/verifier.ts +198 -0
  480. package/src/skills/_secrets.ts +25 -0
  481. package/src/skills/alpaca-quote.ts +68 -23
  482. package/src/skills/errors.ts +30 -2
  483. package/src/skills/index.ts +19 -0
  484. package/src/skills/markdown/loader.ts +129 -0
  485. package/src/skills/markdown/schema.ts +144 -0
  486. package/src/skills/poc-md-loader/e2e-parity.test.ts +237 -0
  487. package/src/skills/poc-md-loader/markdown-loader.ts +161 -0
  488. package/src/skills/poc-md-loader/runner.ts +82 -0
  489. package/src/skills/poc-md-loader/vitest.poc.config.ts +13 -0
  490. package/src/skills/poc-md-loader/web-search/SKILL.md +42 -0
  491. package/src/skills/poc-md-loader/web-search/script.ts +109 -0
  492. package/src/skills/send-email.ts +4 -3
  493. package/src/skills/slack-notify.ts +73 -30
  494. package/src/skills/telegram-notify.ts +70 -24
  495. package/src/skills/web-search.ts +132 -50
  496. package/src/telemetry/bus.test.ts +231 -0
  497. package/src/telemetry/bus.ts +241 -0
  498. package/src/telemetry/index.ts +49 -0
  499. package/src/telemetry/port.ts +160 -0
  500. package/src/telemetry/sinks/otlp.test.ts +146 -0
  501. package/src/telemetry/sinks/otlp.ts +250 -0
  502. package/src/telemetry/sinks/sqlite.test.ts +121 -0
  503. package/src/telemetry/sinks/sqlite.ts +260 -0
  504. package/src/telemetry/sinks/stdout.test.ts +109 -0
  505. package/src/telemetry/sinks/stdout.ts +59 -0
  506. package/src/testing/test-brain-port.ts +98 -24
  507. package/src/testing/test-event-bus.ts +104 -43
  508. package/src/trace/schema.ts +1 -1
  509. package/src/verify/formal/index.ts +154 -0
  510. package/src/verify/formal/policy.ts +253 -0
  511. package/src/verify/formal/result.ts +52 -0
  512. package/src/verify/formal/solver.ts +235 -0
  513. package/src/verify/formal/spec-language.ts +274 -0
@@ -0,0 +1,174 @@
1
+ /**
2
+ * CitadelActionPort — host adapter for Citadel governance operations.
3
+ *
4
+ * Implements tiered access control (T1-T4) per BYOA (Bring Your Own Agent) framework.
5
+ * Only T3+ agents can seal sprints, T1 is read-only, T4 requires on-chain signing.
6
+ *
7
+ * Source: MASTER-PLAN-v5.md §1.3 (CC service layer) + vauban-gouvernance/rules/ai/tiered-gates.md
8
+ */
9
+
10
+ // ─── Types ─────────────────────────────────────────────────────────────────
11
+
12
+ export type AgentTier = "T1" | "T2" | "T3" | "T4";
13
+ export type TaskStatus =
14
+ | "todo"
15
+ | "in_progress"
16
+ | "done"
17
+ | "blocked"
18
+ | "rejected";
19
+
20
+ export interface SprintInput {
21
+ readonly name: string;
22
+ readonly goal?: string;
23
+ readonly start_date?: string; // ISO 8601
24
+ readonly end_date?: string;
25
+ readonly project_slug: string;
26
+ }
27
+
28
+ export interface TaskRef {
29
+ readonly ref: string; // format: "project:sprint-N:task-id"
30
+ readonly project: string;
31
+ readonly sprint: string;
32
+ readonly task_id: string;
33
+ }
34
+
35
+ export interface VerificationEvidence {
36
+ readonly passed: boolean;
37
+ readonly evidence_text: string;
38
+ readonly evidence_hash: string; // sha256 hex
39
+ }
40
+
41
+ export interface DecisionInput {
42
+ readonly decision: string;
43
+ readonly context: string;
44
+ readonly options: readonly string[];
45
+ readonly chosen: string;
46
+ readonly rationale: string;
47
+ readonly tags?: readonly string[];
48
+ }
49
+
50
+ export interface ActionContext {
51
+ readonly agentId: string;
52
+ readonly agentTier: AgentTier;
53
+ readonly runId: string;
54
+ readonly tenantId?: string;
55
+ }
56
+
57
+ // ─── Results ─────────────────────────────────────────────────────────────────
58
+
59
+ export interface SprintRef {
60
+ readonly sprint_id: string;
61
+ readonly project_slug: string;
62
+ readonly name: string;
63
+ readonly created_at: Date;
64
+ }
65
+
66
+ export interface SealedSprintClaim {
67
+ readonly sprint_id: string;
68
+ readonly sealed_at: Date;
69
+ readonly verification_evidence_hash: string;
70
+ readonly sealed_by_agent: string;
71
+ readonly anchor_id?: string; // L3 blockchain anchor
72
+ }
73
+
74
+ export interface DecisionClaim {
75
+ readonly decision_id: string;
76
+ readonly created_at: Date;
77
+ readonly archived_to_brain: boolean;
78
+ readonly cascade_triggered?: boolean; // ADR cascade hook
79
+ }
80
+
81
+ // ─── Port interface ────────────────────────────────────────────────────────
82
+
83
+ export interface CitadelActionPort {
84
+ /**
85
+ * Create a new sprint in a project.
86
+ * T2+ only. T1 throws CitadelTierViolationError.
87
+ */
88
+ createSprint(input: SprintInput, ctx: ActionContext): Promise<SprintRef>;
89
+
90
+ /**
91
+ * Update task status within a sprint.
92
+ * T2+ can transition: todo→in_progress, in_progress→done, *→blocked.
93
+ * T3+ can seal (→done with verification).
94
+ */
95
+ updateTaskStatus(
96
+ ref: TaskRef,
97
+ status: TaskStatus,
98
+ ctx: ActionContext
99
+ ): Promise<void>;
100
+
101
+ /**
102
+ * Seal a completed sprint with verification evidence.
103
+ * T3+ only. Emits SealedSprintClaim (anchor to L3 deferred Phase 1+).
104
+ * Verification evidence hash proves execution of verification_scenario.
105
+ */
106
+ sealSprint(
107
+ sprintId: string,
108
+ evidence: VerificationEvidence,
109
+ ctx: ActionContext
110
+ ): Promise<SealedSprintClaim>;
111
+
112
+ /**
113
+ * Record a decision to governance layer.
114
+ * T2+ can record. T3+ triggers optional ADR cascade hook.
115
+ * Returns DecisionClaim with Brain archive status.
116
+ */
117
+ recordDecision(
118
+ decision: DecisionInput,
119
+ ctx: ActionContext
120
+ ): Promise<DecisionClaim>;
121
+ }
122
+
123
+ // ─── Typed errors ─────────────────────────────────────────────────────────
124
+
125
+ export class CitadelTierViolationError extends Error {
126
+ constructor(
127
+ message: string,
128
+ public readonly required_tier: AgentTier,
129
+ public readonly actual_tier: AgentTier,
130
+ public readonly operation: string,
131
+ public readonly cause?: unknown
132
+ ) {
133
+ super(message);
134
+ this.name = "CitadelTierViolationError";
135
+ Object.setPrototypeOf(this, new.target.prototype);
136
+ }
137
+ }
138
+
139
+ export class CitadelTaskRefNotFoundError extends Error {
140
+ constructor(
141
+ public readonly task_ref: string,
142
+ public readonly cause?: unknown
143
+ ) {
144
+ super(`Task not found: ${task_ref}`);
145
+ this.name = "CitadelTaskRefNotFoundError";
146
+ Object.setPrototypeOf(this, new.target.prototype);
147
+ }
148
+ }
149
+
150
+ export class CitadelSprintNotActiveError extends Error {
151
+ constructor(
152
+ public readonly sprint_id: string,
153
+ public readonly current_status: string,
154
+ public readonly cause?: unknown
155
+ ) {
156
+ super(
157
+ `Sprint ${sprint_id} is not active (status: ${current_status}). Cannot seal.`
158
+ );
159
+ this.name = "CitadelSprintNotActiveError";
160
+ Object.setPrototypeOf(this, new.target.prototype);
161
+ }
162
+ }
163
+
164
+ export class CitadelInvalidStateTransitionError extends Error {
165
+ constructor(
166
+ public readonly current_status: TaskStatus,
167
+ public readonly requested_status: TaskStatus,
168
+ public readonly cause?: unknown
169
+ ) {
170
+ super(`Invalid state transition: ${current_status} → ${requested_status}`);
171
+ this.name = "CitadelInvalidStateTransitionError";
172
+ Object.setPrototypeOf(this, new.target.prototype);
173
+ }
174
+ }
@@ -0,0 +1,191 @@
1
+ /**
2
+ * ComplianceContractPort — runtime compliance gate for the Vauban Integration Spine.
3
+ *
4
+ * Implements the G-2 Cedar pivot from S5 spec:
5
+ * - pre-step: block or warn before capability invocation
6
+ * - post-step: audit trail after invocation
7
+ * - validateManifest: conflict detection at registration
8
+ *
9
+ * Cedar policy bundles: eu.gdpr / eu.mica / eu.tfr (V0 scope per S5 Q5.1).
10
+ */
11
+
12
+ // ─── Jurisdictions ────────────────────────────────────────────────────────────
13
+
14
+ export type Jurisdiction = "FR.v1" | "EU.v1" | "CH.v1" | "UK.v1" | "SG.v1";
15
+
16
+ export const SUPPORTED_JURISDICTIONS_V0: Jurisdiction[] = ["FR.v1", "EU.v1"];
17
+
18
+ // ─── Legal basis refs (S5 §4 encoding) ───────────────────────────────────────
19
+
20
+ export type LegalBasisRef =
21
+ | "gdpr.art6_1_a" // consent
22
+ | "gdpr.art6_1_b" // contract performance
23
+ | "gdpr.art6_1_c" // legal obligation
24
+ | "gdpr.art6_1_f" // legitimate interests
25
+ | "mica.art14" // MiCA disclosure obligation
26
+ | "tfr.art4" // TFR data retention obligation
27
+ | "cjeu.c520_21"; // CJEU C-520/21 mandate path
28
+
29
+ export type LegalBasisDomain =
30
+ | "processing"
31
+ | "retention"
32
+ | "transfer"
33
+ | "consent";
34
+
35
+ export interface LegalBasisDecl {
36
+ domain: LegalBasisDomain;
37
+ basis: LegalBasisRef;
38
+ scope?: Jurisdiction[];
39
+ }
40
+
41
+ // ─── Data classification ──────────────────────────────────────────────────────
42
+
43
+ export type DataClass = "public" | "internal" | "confidential" | "secret";
44
+
45
+ // ─── Rule model (S5 §3.2) ────────────────────────────────────────────────────
46
+
47
+ export type EnforcementLevel = "block" | "warn" | "log";
48
+ export type RuleSource = "declared" | "normative";
49
+
50
+ export interface ComplianceRule {
51
+ readonly id: string;
52
+ readonly source: RuleSource;
53
+ readonly jurisdiction: Jurisdiction;
54
+ readonly legal_ref: LegalBasisRef;
55
+ readonly enforcement: EnforcementLevel;
56
+ readonly rationale: string;
57
+ readonly authority?: string; // e.g. "EDPB Guidelines 8/2020"
58
+ }
59
+
60
+ // ─── ComplianceContract (S5 §3.1) ────────────────────────────────────────────
61
+
62
+ export type ComplianceMode = "strict" | "audit_only";
63
+
64
+ export interface ComplianceContract {
65
+ readonly jurisdictions: Jurisdiction[];
66
+ readonly legal_bases: LegalBasisDecl[];
67
+ readonly data_class: DataClass;
68
+ readonly mode: ComplianceMode;
69
+ readonly tier: string;
70
+ readonly rules: ComplianceRule[];
71
+ readonly retention: string; // ISO duration e.g. "P7Y"
72
+ readonly audit_format?: "json" | "pdf";
73
+ }
74
+
75
+ // ─── Invocation context ───────────────────────────────────────────────────────
76
+
77
+ export interface CapabilityInvocation {
78
+ readonly action: string; // e.g. "bastion.swap", "brain.archive", "glacis.attest"
79
+ readonly tenantId: string;
80
+ readonly dataClass: DataClass;
81
+ readonly legalBasis?: LegalBasisRef;
82
+ readonly jurisdiction?: Jurisdiction;
83
+ readonly requiresConsent?: boolean;
84
+ readonly requiresVerifiedHuman?: boolean;
85
+ readonly stepIndex?: number;
86
+ readonly workflowRunId?: string;
87
+ }
88
+
89
+ export interface TenantContext {
90
+ readonly tenantId: string;
91
+ readonly glacisMode: "verified" | "degraded_verified" | "unverified";
92
+ readonly verifiedHuman: boolean;
93
+ readonly jurisdictions: Jurisdiction[];
94
+ }
95
+
96
+ // ─── Decision types ───────────────────────────────────────────────────────────
97
+
98
+ export interface ComplianceViolation {
99
+ readonly ruleId: string;
100
+ readonly articleRef: string; // e.g. "GDPR Art 6(1)(a)"
101
+ readonly description: string;
102
+ readonly severity: "block" | "warn";
103
+ readonly remediationHint?: string;
104
+ }
105
+
106
+ export type ComplianceGate =
107
+ | { readonly decision: "proceed"; readonly warnings: ComplianceViolation[] }
108
+ | { readonly decision: "block"; readonly violation: ComplianceViolation };
109
+
110
+ export interface ComplianceAuditResult {
111
+ readonly decision: "proceed" | "block" | "warn";
112
+ readonly violations: ComplianceViolation[];
113
+ readonly auditClaimEmitted: boolean;
114
+ readonly evaluatedRules: number;
115
+ }
116
+
117
+ // ─── Manifest validation ──────────────────────────────────────────────────────
118
+
119
+ export interface PolicyConflict {
120
+ readonly rule1Id: string;
121
+ readonly rule2Id: string;
122
+ readonly description: string;
123
+ readonly status: "CONFLICT" | "CONFLICT_UNDETERMINED";
124
+ }
125
+
126
+ export interface ManifestValidationResult {
127
+ readonly valid: boolean;
128
+ readonly conflicts: PolicyConflict[];
129
+ readonly missingLegalBases: string[];
130
+ readonly jurisdictionWarnings: string[];
131
+ readonly evaluationTimeMs: number;
132
+ }
133
+
134
+ // ─── Port interface ───────────────────────────────────────────────────────────
135
+
136
+ export interface ComplianceContractPort {
137
+ /**
138
+ * Pre-step gate — called before any capability invocation.
139
+ * In 'strict' mode: block on first violation.
140
+ * In 'audit_only' mode: never block, accumulate warnings.
141
+ */
142
+ preStep(
143
+ invocation: CapabilityInvocation,
144
+ contract: ComplianceContract,
145
+ ctx: TenantContext
146
+ ): Promise<ComplianceGate>;
147
+
148
+ /**
149
+ * Post-step audit — called after capability invocation to emit audit claims.
150
+ * Always runs regardless of pre-step outcome.
151
+ */
152
+ postStep(
153
+ invocation: CapabilityInvocation,
154
+ contract: ComplianceContract,
155
+ ctx: TenantContext
156
+ ): Promise<ComplianceAuditResult>;
157
+
158
+ /**
159
+ * Manifest validation — called at registration, before any workflow runs.
160
+ * Cedar conflict detection per G-3. Timeout → CONFLICT_UNDETERMINED (not fail).
161
+ */
162
+ validateManifest(
163
+ contract: ComplianceContract,
164
+ opts?: { timeoutMs?: number }
165
+ ): Promise<ManifestValidationResult>;
166
+ }
167
+
168
+ // ─── Typed errors ─────────────────────────────────────────────────────────────
169
+
170
+ export class CompliancePolicyError extends Error {
171
+ constructor(
172
+ message: string,
173
+ public readonly ruleId: string,
174
+ public readonly cause?: unknown
175
+ ) {
176
+ super(message);
177
+ this.name = "CompliancePolicyError";
178
+ Object.setPrototypeOf(this, new.target.prototype);
179
+ }
180
+ }
181
+
182
+ export class ComplianceEvaluationTimeoutError extends Error {
183
+ constructor(
184
+ public readonly timeoutMs: number,
185
+ public readonly cause?: unknown
186
+ ) {
187
+ super(`Compliance evaluation timed out after ${timeoutMs}ms`);
188
+ this.name = "ComplianceEvaluationTimeoutError";
189
+ Object.setPrototypeOf(this, new.target.prototype);
190
+ }
191
+ }
package/src/ports/db.ts CHANGED
@@ -2,6 +2,104 @@
2
2
  * DbPort — re-export of the existing minimal DbClient shape from
3
3
  * tracking/agent-run-tracker. Alias DbPort is the port-suffixed name
4
4
  * used across other ports; DbClient remains exported for back-compat.
5
+ *
6
+ * OTel instrumentation: import { createTracedDbPort } to wrap any
7
+ * DbPort implementation with OpenTelemetry spans per query.
8
+ * Gracefully degrades to noop spans when no OTel SDK is installed.
5
9
  */
10
+
11
+ import type { Span } from "@opentelemetry/api";
12
+ import { SpanStatusCode, trace } from "@opentelemetry/api";
13
+ import type { DbClient } from "../tracking/agent-run-tracker.js";
14
+
15
+ const PORT_TRACER = trace.getTracer("vauban-agent-sdk.ports", "0.1.0");
16
+
6
17
  export type { DbClient as DbPort } from "../tracking/agent-run-tracker.js";
7
18
  export type { DbClient } from "../tracking/agent-run-tracker.js";
19
+
20
+ // ─── Typed errors ─────────────────────────────────────────────────────────────
21
+
22
+ /**
23
+ * Thrown when the database connection is lost (ECONNREFUSED, pool exhausted,
24
+ * or TLS handshake failed). Callers should retry with exponential backoff
25
+ * once the connection pool is re-established.
26
+ */
27
+ export class DbConnectionLostError extends Error {
28
+ constructor(message: string, public readonly cause?: unknown) {
29
+ super(message);
30
+ this.name = "DbConnectionLostError";
31
+ Object.setPrototypeOf(this, new.target.prototype);
32
+ }
33
+ }
34
+
35
+ /**
36
+ * Thrown when a database query exceeds the configured statement_timeout or
37
+ * the caller-supplied timeoutMs. The query may have been cancelled by the
38
+ * server — retrying the same query without changes is unlikely to succeed.
39
+ */
40
+ export class DbQueryTimeoutError extends Error {
41
+ /** The SQL statement that timed out (truncated for logging). */
42
+ readonly queryPreview: string;
43
+ /** Timeout that was exceeded, in milliseconds. */
44
+ readonly timeoutMs: number;
45
+
46
+ constructor(
47
+ message: string,
48
+ queryPreview: string,
49
+ timeoutMs: number,
50
+ public readonly cause?: unknown
51
+ ) {
52
+ super(message);
53
+ this.name = "DbQueryTimeoutError";
54
+ this.queryPreview = queryPreview;
55
+ this.timeoutMs = timeoutMs;
56
+ Object.setPrototypeOf(this, new.target.prototype);
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Wrap any DbPort implementation with OTel spans per query() call.
62
+ * The span captures the SQL preview (first 200 chars) and params count.
63
+ * Gracefully degrades to noop spans when no OTel SDK is installed.
64
+ *
65
+ * Usage:
66
+ * const raw: DbPort = pgPool;
67
+ * const traced = createTracedDbPort(raw);
68
+ * const { rows } = await traced.query("SELECT ...") // emits "db.query" span
69
+ */
70
+ export function createTracedDbPort(impl: DbClient): DbClient {
71
+ return {
72
+ async query<T extends object>(
73
+ sql: string,
74
+ params?: unknown[]
75
+ ): Promise<{ rows: T[]; rowCount?: number | undefined }> {
76
+ return PORT_TRACER.startActiveSpan(
77
+ "db.query",
78
+ {
79
+ attributes: {
80
+ "db.sql_preview": sql.slice(0, 200),
81
+ "db.params_count": params?.length ?? 0,
82
+ "vauban.port.name": "db",
83
+ },
84
+ },
85
+ async (span: Span) => {
86
+ try {
87
+ const result = await impl.query<T>(sql, params);
88
+ span.setAttributes({
89
+ "db.row_count": result.rowCount ?? result.rows.length,
90
+ });
91
+ span.setStatus({ code: SpanStatusCode.OK });
92
+ return result;
93
+ } catch (err) {
94
+ const message = err instanceof Error ? err.message : String(err);
95
+ span.setStatus({ code: SpanStatusCode.ERROR, message });
96
+ if (err instanceof Error) span.recordException(err);
97
+ throw err;
98
+ } finally {
99
+ span.end();
100
+ }
101
+ }
102
+ );
103
+ },
104
+ };
105
+ }