@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,260 @@
1
+ /**
2
+ * localSqliteTelemetrySink — sovereign local mirror of agent runs.
3
+ *
4
+ * Per ADR-ECO-039 §5 : SQLite sink is ON by default. It is the exit plan for
5
+ * any remote sink (CC SaaS, OTLP backend) — if the network sink is revoked,
6
+ * the local SQLite file retains the full history.
7
+ *
8
+ * Schema (created on first use) :
9
+ * - `agent_run` : one row per OODA cycle (start + finish join)
10
+ * - `agent_run_step` : one row per OODA step
11
+ *
12
+ * Dependency : `better-sqlite3` declared as **peerDependency optional**.
13
+ * If absent, this sink degrades gracefully — logs a warning and no-ops.
14
+ *
15
+ * Ref: command-center:sprint-693:sink-sqlite
16
+ */
17
+
18
+ import { homedir } from "node:os";
19
+ import { dirname, resolve as resolvePath } from "node:path";
20
+ import { mkdirSync } from "node:fs";
21
+
22
+ import type {
23
+ TelemetryRunFinish,
24
+ TelemetryRunStart,
25
+ TelemetryRunStep,
26
+ TelemetrySink,
27
+ } from "../port.js";
28
+
29
+ export interface LocalSqliteTelemetrySinkOptions {
30
+ /**
31
+ * Database file path. Default `~/.vauban/runs.db`.
32
+ * Pass `:memory:` for ephemeral test mode.
33
+ */
34
+ path?: string;
35
+ /** Synchronous mode (better-sqlite3 default). Tests may override. */
36
+ readonly?: boolean;
37
+ }
38
+
39
+ // ─── better-sqlite3 dynamic type stub ────────────────────────────────────────
40
+
41
+ interface Statement {
42
+ run(...params: unknown[]): { changes: number; lastInsertRowid: number };
43
+ get(...params: unknown[]): unknown;
44
+ all(...params: unknown[]): unknown[];
45
+ }
46
+
47
+ interface Database {
48
+ prepare(sql: string): Statement;
49
+ exec(sql: string): void;
50
+ close(): void;
51
+ pragma(sql: string, options?: { simple: boolean }): unknown;
52
+ }
53
+
54
+ // ─── Schema ──────────────────────────────────────────────────────────────────
55
+
56
+ const SCHEMA = `
57
+ CREATE TABLE IF NOT EXISTS agent_run (
58
+ run_id TEXT PRIMARY KEY,
59
+ agent_id TEXT NOT NULL,
60
+ agent_version TEXT NOT NULL,
61
+ model TEXT,
62
+ provider TEXT,
63
+ tenant_id TEXT,
64
+ trace_id TEXT,
65
+ started_at TEXT NOT NULL,
66
+ finished_at TEXT,
67
+ status TEXT,
68
+ stop_reason TEXT,
69
+ error_message TEXT,
70
+ total_input_tokens INTEGER DEFAULT 0,
71
+ total_output_tokens INTEGER DEFAULT 0,
72
+ total_cost_usd REAL DEFAULT 0,
73
+ total_tool_calls INTEGER DEFAULT 0
74
+ );
75
+
76
+ CREATE INDEX IF NOT EXISTS idx_agent_run_agent_started
77
+ ON agent_run (agent_id, started_at DESC);
78
+
79
+ CREATE INDEX IF NOT EXISTS idx_agent_run_status
80
+ ON agent_run (status, started_at DESC);
81
+
82
+ CREATE TABLE IF NOT EXISTS agent_run_step (
83
+ run_id TEXT NOT NULL,
84
+ step_index INTEGER NOT NULL,
85
+ kind TEXT NOT NULL,
86
+ status TEXT NOT NULL,
87
+ input_tokens INTEGER DEFAULT 0,
88
+ output_tokens INTEGER DEFAULT 0,
89
+ tool_calls INTEGER DEFAULT 0,
90
+ cost_usd REAL DEFAULT 0,
91
+ duration_ms INTEGER,
92
+ metadata TEXT,
93
+ recorded_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
94
+ PRIMARY KEY (run_id, step_index)
95
+ );
96
+
97
+ CREATE INDEX IF NOT EXISTS idx_agent_run_step_run
98
+ ON agent_run_step (run_id, step_index);
99
+ `;
100
+
101
+ // ─── Factory ─────────────────────────────────────────────────────────────────
102
+
103
+ /**
104
+ * Build a local SQLite sink. Returns a no-op sink if `better-sqlite3` is not
105
+ * installed — the caller is warned via `console.warn` once.
106
+ */
107
+ export function localSqliteTelemetrySink(
108
+ opts: LocalSqliteTelemetrySinkOptions = {}
109
+ ): TelemetrySink {
110
+ const dbPath = resolveDbPath(opts.path);
111
+ const db = openDatabaseSafely(dbPath, opts.readonly ?? false);
112
+
113
+ if (!db) {
114
+ return degradedSink(dbPath);
115
+ }
116
+
117
+ db.exec(SCHEMA);
118
+ db.pragma("journal_mode = WAL");
119
+ db.pragma("synchronous = NORMAL");
120
+
121
+ const insertRun = db.prepare(`
122
+ INSERT INTO agent_run
123
+ (run_id, agent_id, agent_version, model, provider,
124
+ tenant_id, trace_id, started_at)
125
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
126
+ ON CONFLICT (run_id) DO NOTHING
127
+ `);
128
+
129
+ const insertStep = db.prepare(`
130
+ INSERT INTO agent_run_step
131
+ (run_id, step_index, kind, status,
132
+ input_tokens, output_tokens, tool_calls, cost_usd,
133
+ duration_ms, metadata)
134
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
135
+ ON CONFLICT (run_id, step_index) DO NOTHING
136
+ `);
137
+
138
+ const updateFinish = db.prepare(`
139
+ UPDATE agent_run
140
+ SET finished_at = ?,
141
+ status = ?,
142
+ stop_reason = ?,
143
+ error_message = ?,
144
+ total_input_tokens = COALESCE(?, total_input_tokens),
145
+ total_output_tokens = COALESCE(?, total_output_tokens),
146
+ total_cost_usd = COALESCE(?, total_cost_usd),
147
+ total_tool_calls = COALESCE(?, total_tool_calls)
148
+ WHERE run_id = ?
149
+ `);
150
+
151
+ return {
152
+ name: "sqlite",
153
+
154
+ async start(event: TelemetryRunStart) {
155
+ insertRun.run(
156
+ event.runId,
157
+ event.agentId,
158
+ event.agentVersion,
159
+ event.model ?? null,
160
+ event.provider ?? null,
161
+ event.tenantId ?? null,
162
+ event.traceId ?? null,
163
+ event.startedAt
164
+ );
165
+ },
166
+
167
+ async step(runId: string, delta: TelemetryRunStep) {
168
+ insertStep.run(
169
+ runId,
170
+ delta.stepIndex,
171
+ delta.kind,
172
+ delta.status,
173
+ delta.inputTokens,
174
+ delta.outputTokens,
175
+ delta.toolCalls ?? 0,
176
+ delta.costUsd,
177
+ delta.durationMs ?? null,
178
+ delta.metadata ? JSON.stringify(delta.metadata) : null
179
+ );
180
+ },
181
+
182
+ async finish(runId: string, event: TelemetryRunFinish) {
183
+ updateFinish.run(
184
+ event.finishedAt,
185
+ event.status,
186
+ event.stopReason ?? null,
187
+ event.errorMessage ?? null,
188
+ event.totalInputTokens ?? null,
189
+ event.totalOutputTokens ?? null,
190
+ event.totalCostUsd ?? null,
191
+ event.totalToolCalls ?? null,
192
+ runId
193
+ );
194
+ },
195
+
196
+ async flush() {
197
+ // better-sqlite3 is synchronous — no buffer to flush.
198
+ },
199
+ };
200
+ }
201
+
202
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
203
+
204
+ function resolveDbPath(input?: string): string {
205
+ if (!input) return resolvePath(homedir(), ".vauban", "runs.db");
206
+ if (input === ":memory:") return input;
207
+ // Expand leading ~ manually (Node doesn't do it).
208
+ if (input.startsWith("~/")) {
209
+ return resolvePath(homedir(), input.slice(2));
210
+ }
211
+ return resolvePath(input);
212
+ }
213
+
214
+ let warnedMissing = false;
215
+
216
+ function openDatabaseSafely(path: string, readonly: boolean): Database | null {
217
+ try {
218
+ // Dynamic require so better-sqlite3 stays optional.
219
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
220
+ const createRequire = require("node:module").createRequire as (
221
+ specifier: string
222
+ ) => NodeJS.Require;
223
+ const req = createRequire(import.meta.url);
224
+ const BetterSqlite = req("better-sqlite3") as new (
225
+ path: string,
226
+ opts?: { readonly?: boolean }
227
+ ) => Database;
228
+
229
+ if (path !== ":memory:") {
230
+ mkdirSync(dirname(path), { recursive: true });
231
+ }
232
+ return new BetterSqlite(path, { readonly });
233
+ } catch (err) {
234
+ if (!warnedMissing) {
235
+ warnedMissing = true;
236
+ // eslint-disable-next-line no-console
237
+ console.warn(
238
+ "[telemetry:sqlite] better-sqlite3 not installed — sink degraded to no-op.",
239
+ "Install with: `pnpm add better-sqlite3` (peerDependencyOptional).",
240
+ err instanceof Error ? err.message : ""
241
+ );
242
+ }
243
+ return null;
244
+ }
245
+ }
246
+
247
+ function degradedSink(path: string): TelemetrySink {
248
+ return {
249
+ name: `sqlite:degraded(${path})`,
250
+ async start() {
251
+ /* no-op when better-sqlite3 missing */
252
+ },
253
+ async step() {
254
+ /* no-op */
255
+ },
256
+ async finish() {
257
+ /* no-op */
258
+ },
259
+ };
260
+ }
@@ -0,0 +1,109 @@
1
+ /**
2
+ * stdoutTelemetrySink — JSON emission tests.
3
+ *
4
+ * Ref: command-center:sprint-693:sink-stdout
5
+ */
6
+
7
+ import { describe, expect, it } from "vitest";
8
+ import { Writable } from "node:stream";
9
+
10
+ import { stdoutTelemetrySink } from "./stdout.js";
11
+
12
+ function collectingStream(): {
13
+ stream: Writable;
14
+ lines: () => string[];
15
+ } {
16
+ const chunks: string[] = [];
17
+ const stream = new Writable({
18
+ write(chunk, _enc, cb) {
19
+ chunks.push(chunk.toString());
20
+ cb();
21
+ },
22
+ });
23
+ return {
24
+ stream,
25
+ lines: () =>
26
+ chunks
27
+ .join("")
28
+ .split("\n")
29
+ .filter((l) => l.length > 0),
30
+ };
31
+ }
32
+
33
+ const RUN_START = {
34
+ runId: "run-1",
35
+ agentId: "a",
36
+ agentVersion: "1.0.0",
37
+ model: "test",
38
+ provider: "test",
39
+ startedAt: "2026-05-16T17:00:00.000Z",
40
+ };
41
+
42
+ describe("stdoutTelemetrySink", () => {
43
+ it("emits one JSON line per event", async () => {
44
+ const { stream, lines } = collectingStream();
45
+ const sink = stdoutTelemetrySink({ stream });
46
+
47
+ await sink.start(RUN_START);
48
+ await sink.step("run-1", {
49
+ stepIndex: 0,
50
+ kind: "observe",
51
+ status: "completed",
52
+ inputTokens: 5,
53
+ outputTokens: 10,
54
+ costUsd: 0,
55
+ });
56
+ await sink.finish("run-1", {
57
+ status: "success",
58
+ finishedAt: "2026-05-16T17:00:01.000Z",
59
+ });
60
+
61
+ const out = lines();
62
+ expect(out).toHaveLength(3);
63
+ expect(JSON.parse(out[0]!)).toMatchObject({
64
+ telemetry: "run.start",
65
+ runId: "run-1",
66
+ agentId: "a",
67
+ });
68
+ expect(JSON.parse(out[1]!)).toMatchObject({
69
+ telemetry: "run.step",
70
+ runId: "run-1",
71
+ kind: "observe",
72
+ });
73
+ expect(JSON.parse(out[2]!)).toMatchObject({
74
+ telemetry: "run.finish",
75
+ runId: "run-1",
76
+ status: "success",
77
+ });
78
+ });
79
+
80
+ it("emits key=value when json=false", async () => {
81
+ const { stream, lines } = collectingStream();
82
+ const sink = stdoutTelemetrySink({ stream, json: false });
83
+ await sink.start(RUN_START);
84
+ expect(lines()[0]).toContain('runId="run-1"');
85
+ expect(lines()[0]).toContain('agentId="a"');
86
+ });
87
+
88
+ it("emits a JSON shape compatible with `jq`", async () => {
89
+ const { stream, lines } = collectingStream();
90
+ const sink = stdoutTelemetrySink({ stream });
91
+ await sink.start(RUN_START);
92
+ const parsed = JSON.parse(lines()[0]!);
93
+ // jq-friendly: top-level keys are sortable strings, no nested undefined
94
+ expect(parsed).toHaveProperty("telemetry");
95
+ expect(parsed).toHaveProperty("runId");
96
+ expect(parsed).toHaveProperty("startedAt");
97
+ });
98
+
99
+ it("has name 'stdout'", () => {
100
+ const sink = stdoutTelemetrySink();
101
+ expect(sink.name).toBe("stdout");
102
+ });
103
+
104
+ it("defaults to stderr when no stream given", () => {
105
+ // Just verify constructor doesn't throw; can't capture global stderr in jsdom.
106
+ const sink = stdoutTelemetrySink();
107
+ expect(typeof sink.start).toBe("function");
108
+ });
109
+ });
@@ -0,0 +1,59 @@
1
+ /**
2
+ * stdoutTelemetrySink — JSON line emission to stderr (dev-friendly default).
3
+ *
4
+ * One JSON object per event, suitable for `jq`, `pino-pretty`, or any
5
+ * structured-log pipeline. Writes to stderr (not stdout) so that the agent's
6
+ * own stdout remains free for user output.
7
+ *
8
+ * Ref: command-center:sprint-693:sink-stdout
9
+ */
10
+
11
+ import type {
12
+ TelemetryRunFinish,
13
+ TelemetryRunStart,
14
+ TelemetryRunStep,
15
+ TelemetrySink,
16
+ } from "../port.js";
17
+
18
+ export interface StdoutTelemetrySinkOptions {
19
+ /** Stream to write to. Defaults to `process.stderr`. */
20
+ stream?: NodeJS.WritableStream;
21
+ /** When true (default), emits as `key=value` instead of JSON. */
22
+ json?: boolean;
23
+ }
24
+
25
+ /**
26
+ * Default sink for dev visibility. Zero dependency, zero I/O latency
27
+ * (synchronous write to stream).
28
+ */
29
+ export function stdoutTelemetrySink(
30
+ opts: StdoutTelemetrySinkOptions = {}
31
+ ): TelemetrySink {
32
+ const stream = opts.stream ?? process.stderr;
33
+ const useJson = opts.json ?? true;
34
+
35
+ function emit(event: Record<string, unknown>): void {
36
+ const line = useJson
37
+ ? JSON.stringify(event)
38
+ : Object.entries(event)
39
+ .map(([k, v]) => `${k}=${JSON.stringify(v)}`)
40
+ .join(" ");
41
+ stream.write(`${line}\n`);
42
+ }
43
+
44
+ return {
45
+ name: "stdout",
46
+
47
+ async start(event: TelemetryRunStart) {
48
+ emit({ telemetry: "run.start", ...event });
49
+ },
50
+
51
+ async step(runId: string, delta: TelemetryRunStep) {
52
+ emit({ telemetry: "run.step", runId, ...delta });
53
+ },
54
+
55
+ async finish(runId: string, event: TelemetryRunFinish) {
56
+ emit({ telemetry: "run.finish", runId, ...event });
57
+ },
58
+ };
59
+ }
@@ -5,17 +5,35 @@
5
5
  * Maps. Use for agent unit tests that need to archive/query without
6
6
  * external infrastructure.
7
7
  *
8
+ * OTel spans are emitted on archiveKnowledge and queryKnowledge via
9
+ * @opentelemetry/api. Gracefully degrades to noop spans when no OTel SDK
10
+ * is installed.
11
+ *
8
12
  * @public
9
13
  */
10
14
 
11
- import type { BrainPort, BrainEntry, BrainEntryInput, BrainQueryFilters } from "../ports/brain.js";
15
+ import type { Span } from "@opentelemetry/api";
16
+ import { SpanStatusCode, trace } from "@opentelemetry/api";
17
+ import type {
18
+ BrainPort,
19
+ BrainEntry,
20
+ BrainEntryInput,
21
+ BrainQueryFilters,
22
+ } from "../ports/brain.js";
12
23
  import {
13
24
  InMemoryWorkingMemory,
14
25
  InMemoryEpisodicMemory,
15
26
  InMemorySemanticMemory,
16
27
  InMemoryProceduralMemory,
17
28
  } from "../ports/brain.js";
18
- import type { WorkingMemoryPort, EpisodicMemoryPort, SemanticMemoryPort, ProceduralMemoryPort } from "../ports/brain.js";
29
+ import type {
30
+ WorkingMemoryPort,
31
+ EpisodicMemoryPort,
32
+ SemanticMemoryPort,
33
+ ProceduralMemoryPort,
34
+ } from "../ports/brain.js";
35
+
36
+ const TEST_TRACER = trace.getTracer("vauban-agent-sdk.ports.test", "0.1.0");
19
37
 
20
38
  export class TestBrainPort implements BrainPort {
21
39
  readonly working: WorkingMemoryPort;
@@ -34,31 +52,87 @@ export class TestBrainPort implements BrainPort {
34
52
  }
35
53
 
36
54
  async archiveKnowledge(entry: BrainEntryInput): Promise<BrainEntry | null> {
37
- const id = `test-${this.nextId++}`;
38
- const created: BrainEntry = {
39
- id,
40
- content: entry.content,
41
- category: entry.category,
42
- tags: entry.tags,
43
- metadata: entry.metadata as Record<string, unknown> | undefined,
44
- created_at: new Date().toISOString(),
45
- };
46
- this.entries.set(id, created);
47
- return created;
55
+ return TEST_TRACER.startActiveSpan(
56
+ "brain.archiveKnowledge",
57
+ {
58
+ attributes: {
59
+ "brain.entry.category": entry.category ?? "unknown",
60
+ "brain.entry.content_preview": entry.content.slice(0, 200),
61
+ "brain.entry.tags": entry.tags?.join(",") ?? "",
62
+ "vauban.port.name": "brain",
63
+ "vauban.port.impl": "TestBrainPort",
64
+ },
65
+ },
66
+ async (span: Span) => {
67
+ try {
68
+ const id = `test-${this.nextId++}`;
69
+ const created: BrainEntry = {
70
+ id,
71
+ content: entry.content,
72
+ category: entry.category,
73
+ tags: entry.tags,
74
+ metadata: entry.metadata as Record<string, unknown> | undefined,
75
+ created_at: new Date().toISOString(),
76
+ };
77
+ this.entries.set(id, created);
78
+ span.setAttribute("brain.entry.id", id);
79
+ span.setStatus({ code: SpanStatusCode.OK });
80
+ return created;
81
+ } catch (err) {
82
+ const message = err instanceof Error ? err.message : String(err);
83
+ span.setStatus({ code: SpanStatusCode.ERROR, message });
84
+ if (err instanceof Error) span.recordException(err);
85
+ throw err;
86
+ } finally {
87
+ span.end();
88
+ }
89
+ }
90
+ );
48
91
  }
49
92
 
50
- async queryKnowledge(query: string, filters?: BrainQueryFilters): Promise<BrainEntry[]> {
51
- let results = Array.from(this.entries.values()).filter(
52
- (e) => e.content.toLowerCase().includes(query.toLowerCase())
93
+ async queryKnowledge(
94
+ query: string,
95
+ filters?: BrainQueryFilters
96
+ ): Promise<BrainEntry[]> {
97
+ return TEST_TRACER.startActiveSpan(
98
+ "brain.queryKnowledge",
99
+ {
100
+ attributes: {
101
+ "brain.query.preview": query.slice(0, 200),
102
+ "brain.query.category": filters?.category ?? "none",
103
+ "brain.query.limit": filters?.limit ?? -1,
104
+ "vauban.port.name": "brain",
105
+ "vauban.port.impl": "TestBrainPort",
106
+ },
107
+ },
108
+ async (span: Span) => {
109
+ try {
110
+ let results = Array.from(this.entries.values()).filter((e) =>
111
+ e.content.toLowerCase().includes(query.toLowerCase())
112
+ );
113
+ if (filters?.category) {
114
+ results = results.filter((e) => e.category === filters.category);
115
+ }
116
+ if (filters?.tags && filters.tags.length > 0) {
117
+ results = results.filter((e) =>
118
+ e.tags?.some((t) => (filters.tags as string[]).includes(t))
119
+ );
120
+ }
121
+ const limit = (filters?.limit as number) ?? 10;
122
+ const sliced = results.slice(0, limit);
123
+ span.setAttribute("brain.query.result_count", sliced.length);
124
+ span.setStatus({ code: SpanStatusCode.OK });
125
+ return sliced;
126
+ } catch (err) {
127
+ const message = err instanceof Error ? err.message : String(err);
128
+ span.setStatus({ code: SpanStatusCode.ERROR, message });
129
+ if (err instanceof Error) span.recordException(err);
130
+ throw err;
131
+ } finally {
132
+ span.end();
133
+ }
134
+ }
53
135
  );
54
- if (filters?.category) {
55
- results = results.filter((e) => e.category === filters.category);
56
- }
57
- if (filters?.tags && filters.tags.length > 0) {
58
- results = results.filter((e) => e.tags?.some((t) => (filters.tags as string[]).includes(t)));
59
- }
60
- const limit = (filters?.limit as number) ?? 10;
61
- return results.slice(0, limit);
62
136
  }
63
137
 
64
138
  /** Clear all entries. */