@vauban-org/agent-sdk 0.17.4 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/CONTRACT.md +6401 -813
  2. package/dist/adapters/llm/anthropic-direct.d.ts +1 -0
  3. package/dist/adapters/llm/anthropic-direct.d.ts.map +1 -1
  4. package/dist/adapters/llm/anthropic-direct.js +43 -0
  5. package/dist/adapters/llm/anthropic-direct.js.map +1 -1
  6. package/dist/adapters/llm/cascade.d.ts.map +1 -1
  7. package/dist/adapters/llm/cascade.js +57 -14
  8. package/dist/adapters/llm/cascade.js.map +1 -1
  9. package/dist/adapters/llm/litellm.d.ts +2 -0
  10. package/dist/adapters/llm/litellm.d.ts.map +1 -1
  11. package/dist/adapters/llm/litellm.js +44 -0
  12. package/dist/adapters/llm/litellm.js.map +1 -1
  13. package/dist/compute/difficulty-estimator.d.ts +53 -0
  14. package/dist/compute/difficulty-estimator.d.ts.map +1 -0
  15. package/dist/compute/difficulty-estimator.js +82 -0
  16. package/dist/compute/difficulty-estimator.js.map +1 -0
  17. package/dist/compute/strategies/mixture-of-agents.d.ts +40 -0
  18. package/dist/compute/strategies/mixture-of-agents.d.ts.map +1 -0
  19. package/dist/compute/strategies/mixture-of-agents.js +110 -0
  20. package/dist/compute/strategies/mixture-of-agents.js.map +1 -0
  21. package/dist/compute/strategies/tree-of-thoughts.d.ts +48 -0
  22. package/dist/compute/strategies/tree-of-thoughts.d.ts.map +1 -0
  23. package/dist/compute/strategies/tree-of-thoughts.js +242 -0
  24. package/dist/compute/strategies/tree-of-thoughts.js.map +1 -0
  25. package/dist/compute/strategies/two-phase-orient.d.ts +72 -0
  26. package/dist/compute/strategies/two-phase-orient.d.ts.map +1 -0
  27. package/dist/compute/strategies/two-phase-orient.js +85 -0
  28. package/dist/compute/strategies/two-phase-orient.js.map +1 -0
  29. package/dist/constitution/types.d.ts +10 -10
  30. package/dist/container/protocol.d.ts +134 -0
  31. package/dist/container/protocol.d.ts.map +1 -0
  32. package/dist/container/protocol.js +157 -0
  33. package/dist/container/protocol.js.map +1 -0
  34. package/dist/container/runtime.d.ts +140 -0
  35. package/dist/container/runtime.d.ts.map +1 -0
  36. package/dist/container/runtime.js +256 -0
  37. package/dist/container/runtime.js.map +1 -0
  38. package/dist/events/catalogue.d.ts +327 -30
  39. package/dist/events/catalogue.d.ts.map +1 -1
  40. package/dist/events/catalogue.js +18 -0
  41. package/dist/events/catalogue.js.map +1 -1
  42. package/dist/events/index.d.ts +9 -0
  43. package/dist/events/index.d.ts.map +1 -1
  44. package/dist/events/index.js +9 -0
  45. package/dist/events/index.js.map +1 -1
  46. package/dist/events/schemas/agent.completed.v1.d.ts +4 -4
  47. package/dist/events/schemas/agent.failed.v1.d.ts +2 -2
  48. package/dist/events/schemas/agent.hitl_resolved.v1.d.ts +2 -2
  49. package/dist/events/schemas/agent.started.v1.d.ts +2 -2
  50. package/dist/events/schemas/brain.skill.extracted.v1.d.ts +4 -4
  51. package/dist/events/schemas/cc.cost.anomaly_detected.v1.d.ts +2 -2
  52. package/dist/events/schemas/cc.cost.recorded.v1.d.ts +4 -4
  53. package/dist/events/schemas/citadel.sprint.analyzed.v1.d.ts +55 -0
  54. package/dist/events/schemas/citadel.sprint.analyzed.v1.d.ts.map +1 -0
  55. package/dist/events/schemas/citadel.sprint.analyzed.v1.js +22 -0
  56. package/dist/events/schemas/citadel.sprint.analyzed.v1.js.map +1 -0
  57. package/dist/events/schemas/citadel.sprint.closed.v1.d.ts +2 -2
  58. package/dist/events/schemas/forge.inbox.reply_classified.v1.d.ts +33 -0
  59. package/dist/events/schemas/forge.inbox.reply_classified.v1.d.ts.map +1 -0
  60. package/dist/events/schemas/forge.inbox.reply_classified.v1.js +15 -0
  61. package/dist/events/schemas/forge.inbox.reply_classified.v1.js.map +1 -0
  62. package/dist/events/schemas/forge.lead.qualified.v1.d.ts +2 -2
  63. package/dist/events/schemas/forge.outreach.sent.v1.d.ts +4 -4
  64. package/dist/events/schemas/incident.detected.v1.d.ts +2 -2
  65. package/dist/events/schemas/vauban-finance.forecast.generated.v1.d.ts +21 -0
  66. package/dist/events/schemas/vauban-finance.forecast.generated.v1.d.ts.map +1 -0
  67. package/dist/events/schemas/vauban-finance.forecast.generated.v1.js +11 -0
  68. package/dist/events/schemas/vauban-finance.forecast.generated.v1.js.map +1 -0
  69. package/dist/events/schemas/vauban-finance.trade.executed.v1.d.ts +24 -0
  70. package/dist/events/schemas/vauban-finance.trade.executed.v1.d.ts.map +1 -0
  71. package/dist/events/schemas/vauban-finance.trade.executed.v1.js +12 -0
  72. package/dist/events/schemas/vauban-finance.trade.executed.v1.js.map +1 -0
  73. package/dist/events/schemas/vauban.goal.checked.v1.d.ts +21 -0
  74. package/dist/events/schemas/vauban.goal.checked.v1.d.ts.map +1 -0
  75. package/dist/events/schemas/vauban.goal.checked.v1.js +11 -0
  76. package/dist/events/schemas/vauban.goal.checked.v1.js.map +1 -0
  77. package/dist/events/schemas/vauban.rebalancing.checked.v1.d.ts +21 -0
  78. package/dist/events/schemas/vauban.rebalancing.checked.v1.d.ts.map +1 -0
  79. package/dist/events/schemas/vauban.rebalancing.checked.v1.js +11 -0
  80. package/dist/events/schemas/vauban.rebalancing.checked.v1.js.map +1 -0
  81. package/dist/events/schemas/vauban.tax.checked.v1.d.ts +21 -0
  82. package/dist/events/schemas/vauban.tax.checked.v1.d.ts.map +1 -0
  83. package/dist/events/schemas/vauban.tax.checked.v1.js +11 -0
  84. package/dist/events/schemas/vauban.tax.checked.v1.js.map +1 -0
  85. package/dist/events/schemas/vauban.vault.analyzed.v1.d.ts +59 -0
  86. package/dist/events/schemas/vauban.vault.analyzed.v1.d.ts.map +1 -0
  87. package/dist/events/schemas/vauban.vault.analyzed.v1.js +19 -0
  88. package/dist/events/schemas/vauban.vault.analyzed.v1.js.map +1 -0
  89. package/dist/events/schemas/vauban.vault.compounded.v1.d.ts +24 -0
  90. package/dist/events/schemas/vauban.vault.compounded.v1.d.ts.map +1 -0
  91. package/dist/events/schemas/vauban.vault.compounded.v1.js +12 -0
  92. package/dist/events/schemas/vauban.vault.compounded.v1.js.map +1 -0
  93. package/dist/identity/agent-persona.d.ts +73 -0
  94. package/dist/identity/agent-persona.d.ts.map +1 -0
  95. package/dist/identity/agent-persona.js +165 -0
  96. package/dist/identity/agent-persona.js.map +1 -0
  97. package/dist/identity/persona-prompt.d.ts +25 -0
  98. package/dist/identity/persona-prompt.d.ts.map +1 -0
  99. package/dist/identity/persona-prompt.js +71 -0
  100. package/dist/identity/persona-prompt.js.map +1 -0
  101. package/dist/identity/persona-schema.d.ts +120 -0
  102. package/dist/identity/persona-schema.d.ts.map +1 -0
  103. package/dist/identity/persona-schema.js +103 -0
  104. package/dist/identity/persona-schema.js.map +1 -0
  105. package/dist/index.d.ts +37 -2
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +29 -1
  108. package/dist/index.js.map +1 -1
  109. package/dist/loop/index.d.ts +1 -1
  110. package/dist/loop/index.d.ts.map +1 -1
  111. package/dist/loop/index.js.map +1 -1
  112. package/dist/loop/minimal-loop.js +293 -287
  113. package/dist/loop/sdk-loop.d.ts +1 -3
  114. package/dist/loop/sdk-loop.d.ts.map +1 -1
  115. package/dist/loop/sdk-loop.js +1 -1
  116. package/dist/loop/sdk-loop.js.map +1 -1
  117. package/dist/memory/episodic-rrf.d.ts +114 -0
  118. package/dist/memory/episodic-rrf.d.ts.map +1 -0
  119. package/dist/memory/episodic-rrf.js +148 -0
  120. package/dist/memory/episodic-rrf.js.map +1 -0
  121. package/dist/mesh/attenuation.d.ts +78 -0
  122. package/dist/mesh/attenuation.d.ts.map +1 -0
  123. package/dist/mesh/attenuation.js +141 -0
  124. package/dist/mesh/attenuation.js.map +1 -0
  125. package/dist/mesh/delegate.d.ts +96 -0
  126. package/dist/mesh/delegate.d.ts.map +1 -0
  127. package/dist/mesh/delegate.js +172 -0
  128. package/dist/mesh/delegate.js.map +1 -0
  129. package/dist/mesh/dispatcher.d.ts +119 -0
  130. package/dist/mesh/dispatcher.d.ts.map +1 -0
  131. package/dist/mesh/dispatcher.js +207 -0
  132. package/dist/mesh/dispatcher.js.map +1 -0
  133. package/dist/mesh/index.d.ts +12 -0
  134. package/dist/mesh/index.d.ts.map +1 -0
  135. package/dist/mesh/index.js +11 -0
  136. package/dist/mesh/index.js.map +1 -0
  137. package/dist/mesh/types.d.ts +30 -0
  138. package/dist/mesh/types.d.ts.map +1 -0
  139. package/dist/mesh/types.js +11 -0
  140. package/dist/mesh/types.js.map +1 -0
  141. package/dist/orchestration/ooda/skills.d.ts +104 -0
  142. package/dist/orchestration/ooda/skills.d.ts.map +1 -1
  143. package/dist/orchestration/ooda/skills.js +106 -0
  144. package/dist/orchestration/ooda/skills.js.map +1 -1
  145. package/dist/orchestration/ooda/types.d.ts +3 -8
  146. package/dist/orchestration/ooda/types.d.ts.map +1 -1
  147. package/dist/ports/bastion-action.contract.test.d.ts +11 -0
  148. package/dist/ports/bastion-action.contract.test.d.ts.map +1 -0
  149. package/dist/ports/bastion-action.contract.test.js +238 -0
  150. package/dist/ports/bastion-action.contract.test.js.map +1 -0
  151. package/dist/ports/bastion-action.d.ts +133 -0
  152. package/dist/ports/bastion-action.d.ts.map +1 -0
  153. package/dist/ports/bastion-action.js +73 -0
  154. package/dist/ports/bastion-action.js.map +1 -0
  155. package/dist/ports/brain.d.ts +31 -0
  156. package/dist/ports/brain.d.ts.map +1 -1
  157. package/dist/ports/brain.js +115 -1
  158. package/dist/ports/brain.js.map +1 -1
  159. package/dist/ports/citadel-action.contract.test.d.ts +11 -0
  160. package/dist/ports/citadel-action.contract.test.d.ts.map +1 -0
  161. package/dist/ports/citadel-action.contract.test.js +317 -0
  162. package/dist/ports/citadel-action.contract.test.js.map +1 -0
  163. package/dist/ports/citadel-action.d.ts +111 -0
  164. package/dist/ports/citadel-action.d.ts.map +1 -0
  165. package/dist/ports/citadel-action.js +62 -0
  166. package/dist/ports/citadel-action.js.map +1 -0
  167. package/dist/ports/compliance-contract.d.ts +123 -0
  168. package/dist/ports/compliance-contract.d.ts.map +1 -0
  169. package/dist/ports/compliance-contract.js +35 -0
  170. package/dist/ports/compliance-contract.js.map +1 -0
  171. package/dist/ports/db.d.ts +38 -0
  172. package/dist/ports/db.d.ts.map +1 -1
  173. package/dist/ports/db.js +88 -1
  174. package/dist/ports/db.js.map +1 -1
  175. package/dist/ports/delegation.contract.test.d.ts +9 -0
  176. package/dist/ports/delegation.contract.test.d.ts.map +1 -0
  177. package/dist/ports/delegation.contract.test.js +337 -0
  178. package/dist/ports/delegation.contract.test.js.map +1 -0
  179. package/dist/ports/delegation.d.ts +134 -0
  180. package/dist/ports/delegation.d.ts.map +1 -0
  181. package/dist/ports/delegation.js +105 -0
  182. package/dist/ports/delegation.js.map +1 -0
  183. package/dist/ports/event-bus.d.ts +29 -13
  184. package/dist/ports/event-bus.d.ts.map +1 -1
  185. package/dist/ports/event-bus.js +106 -1
  186. package/dist/ports/event-bus.js.map +1 -1
  187. package/dist/ports/federation.contract.test.d.ts +9 -0
  188. package/dist/ports/federation.contract.test.d.ts.map +1 -0
  189. package/dist/ports/federation.contract.test.js +279 -0
  190. package/dist/ports/federation.contract.test.js.map +1 -0
  191. package/dist/ports/federation.d.ts +140 -0
  192. package/dist/ports/federation.d.ts.map +1 -0
  193. package/dist/ports/federation.js +57 -0
  194. package/dist/ports/federation.js.map +1 -0
  195. package/dist/ports/index.d.ts +28 -2
  196. package/dist/ports/index.d.ts.map +1 -1
  197. package/dist/ports/index.js +17 -2
  198. package/dist/ports/index.js.map +1 -1
  199. package/dist/ports/llm-provider.d.ts +37 -0
  200. package/dist/ports/llm-provider.d.ts.map +1 -1
  201. package/dist/ports/llm-provider.js +99 -1
  202. package/dist/ports/llm-provider.js.map +1 -1
  203. package/dist/ports/logger.d.ts +27 -0
  204. package/dist/ports/logger.d.ts.map +1 -1
  205. package/dist/ports/logger.js +87 -0
  206. package/dist/ports/logger.js.map +1 -1
  207. package/dist/ports/manifest-registry.contract.test.d.ts +9 -0
  208. package/dist/ports/manifest-registry.contract.test.d.ts.map +1 -0
  209. package/dist/ports/manifest-registry.contract.test.js +246 -0
  210. package/dist/ports/manifest-registry.contract.test.js.map +1 -0
  211. package/dist/ports/manifest-registry.d.ts +116 -0
  212. package/dist/ports/manifest-registry.d.ts.map +1 -0
  213. package/dist/ports/manifest-registry.js +79 -0
  214. package/dist/ports/manifest-registry.js.map +1 -0
  215. package/dist/ports/observability.contract.test.d.ts +12 -0
  216. package/dist/ports/observability.contract.test.d.ts.map +1 -0
  217. package/dist/ports/observability.contract.test.js +260 -0
  218. package/dist/ports/observability.contract.test.js.map +1 -0
  219. package/dist/ports/observability.d.ts +98 -0
  220. package/dist/ports/observability.d.ts.map +1 -0
  221. package/dist/ports/observability.js +59 -0
  222. package/dist/ports/observability.js.map +1 -0
  223. package/dist/ports/outcome.d.ts +26 -0
  224. package/dist/ports/outcome.d.ts.map +1 -1
  225. package/dist/ports/outcome.js +62 -1
  226. package/dist/ports/outcome.js.map +1 -1
  227. package/dist/ports/privacy.contract.test.d.ts +12 -0
  228. package/dist/ports/privacy.contract.test.d.ts.map +1 -0
  229. package/dist/ports/privacy.contract.test.js +325 -0
  230. package/dist/ports/privacy.contract.test.js.map +1 -0
  231. package/dist/ports/privacy.d.ts +132 -0
  232. package/dist/ports/privacy.d.ts.map +1 -0
  233. package/dist/ports/privacy.js +83 -0
  234. package/dist/ports/privacy.js.map +1 -0
  235. package/dist/ports/tenant-context.contract.test.d.ts +14 -0
  236. package/dist/ports/tenant-context.contract.test.d.ts.map +1 -0
  237. package/dist/ports/tenant-context.contract.test.js +352 -0
  238. package/dist/ports/tenant-context.contract.test.js.map +1 -0
  239. package/dist/ports/tenant-context.d.ts +103 -0
  240. package/dist/ports/tenant-context.d.ts.map +1 -0
  241. package/dist/ports/tenant-context.js +48 -0
  242. package/dist/ports/tenant-context.js.map +1 -0
  243. package/dist/ports/vauban-finance-action.contract.test.d.ts +11 -0
  244. package/dist/ports/vauban-finance-action.contract.test.d.ts.map +1 -0
  245. package/dist/ports/vauban-finance-action.contract.test.js +260 -0
  246. package/dist/ports/vauban-finance-action.contract.test.js.map +1 -0
  247. package/dist/ports/vauban-finance-action.d.ts +106 -0
  248. package/dist/ports/vauban-finance-action.d.ts.map +1 -0
  249. package/dist/ports/vauban-finance-action.js +60 -0
  250. package/dist/ports/vauban-finance-action.js.map +1 -0
  251. package/dist/ports/workflow-runtime.d.ts +204 -0
  252. package/dist/ports/workflow-runtime.d.ts.map +1 -0
  253. package/dist/ports/workflow-runtime.js +72 -0
  254. package/dist/ports/workflow-runtime.js.map +1 -0
  255. package/dist/proof/cert-verify.d.ts +80 -0
  256. package/dist/proof/cert-verify.d.ts.map +1 -0
  257. package/dist/proof/cert-verify.js +178 -0
  258. package/dist/proof/cert-verify.js.map +1 -0
  259. package/dist/replay/replay.d.ts.map +1 -1
  260. package/dist/replay/replay.js +5 -1
  261. package/dist/replay/replay.js.map +1 -1
  262. package/dist/retry/index.d.ts +129 -0
  263. package/dist/retry/index.d.ts.map +1 -0
  264. package/dist/retry/index.js +156 -0
  265. package/dist/retry/index.js.map +1 -0
  266. package/dist/retry/presets.d.ts +39 -0
  267. package/dist/retry/presets.d.ts.map +1 -0
  268. package/dist/retry/presets.js +69 -0
  269. package/dist/retry/presets.js.map +1 -0
  270. package/dist/skill-loop/ab-runner.d.ts +67 -0
  271. package/dist/skill-loop/ab-runner.d.ts.map +1 -0
  272. package/dist/skill-loop/ab-runner.js +160 -0
  273. package/dist/skill-loop/ab-runner.js.map +1 -0
  274. package/dist/skill-loop/adoption.d.ts +67 -0
  275. package/dist/skill-loop/adoption.d.ts.map +1 -0
  276. package/dist/skill-loop/adoption.js +126 -0
  277. package/dist/skill-loop/adoption.js.map +1 -0
  278. package/dist/skill-loop/candidate.d.ts +45 -0
  279. package/dist/skill-loop/candidate.d.ts.map +1 -0
  280. package/dist/skill-loop/candidate.js +43 -0
  281. package/dist/skill-loop/candidate.js.map +1 -0
  282. package/dist/skill-loop/evaluator.d.ts +42 -0
  283. package/dist/skill-loop/evaluator.d.ts.map +1 -0
  284. package/dist/skill-loop/evaluator.js +184 -0
  285. package/dist/skill-loop/evaluator.js.map +1 -0
  286. package/dist/skill-loop/index.d.ts +27 -0
  287. package/dist/skill-loop/index.d.ts.map +1 -0
  288. package/dist/skill-loop/index.js +27 -0
  289. package/dist/skill-loop/index.js.map +1 -0
  290. package/dist/skill-loop/reflexion-replay.d.ts +87 -0
  291. package/dist/skill-loop/reflexion-replay.d.ts.map +1 -0
  292. package/dist/skill-loop/reflexion-replay.js +110 -0
  293. package/dist/skill-loop/reflexion-replay.js.map +1 -0
  294. package/dist/skill-loop/sign-off.d.ts +88 -0
  295. package/dist/skill-loop/sign-off.d.ts.map +1 -0
  296. package/dist/skill-loop/sign-off.js +146 -0
  297. package/dist/skill-loop/sign-off.js.map +1 -0
  298. package/dist/skill-loop/value-metric.d.ts +55 -0
  299. package/dist/skill-loop/value-metric.d.ts.map +1 -0
  300. package/dist/skill-loop/value-metric.js +69 -0
  301. package/dist/skill-loop/value-metric.js.map +1 -0
  302. package/dist/skill-loop/versioning.d.ts +36 -0
  303. package/dist/skill-loop/versioning.d.ts.map +1 -0
  304. package/dist/skill-loop/versioning.js +47 -0
  305. package/dist/skill-loop/versioning.js.map +1 -0
  306. package/dist/skill-manifest/anchor.d.ts +91 -0
  307. package/dist/skill-manifest/anchor.d.ts.map +1 -0
  308. package/dist/skill-manifest/anchor.js +331 -0
  309. package/dist/skill-manifest/anchor.js.map +1 -0
  310. package/dist/skill-manifest/builder.d.ts +47 -0
  311. package/dist/skill-manifest/builder.d.ts.map +1 -0
  312. package/dist/skill-manifest/builder.js +93 -0
  313. package/dist/skill-manifest/builder.js.map +1 -0
  314. package/dist/skill-manifest/index.d.ts +13 -0
  315. package/dist/skill-manifest/index.d.ts.map +1 -0
  316. package/dist/skill-manifest/index.js +9 -0
  317. package/dist/skill-manifest/index.js.map +1 -0
  318. package/dist/skill-manifest/types.d.ts +67 -0
  319. package/dist/skill-manifest/types.d.ts.map +1 -0
  320. package/dist/skill-manifest/types.js +16 -0
  321. package/dist/skill-manifest/types.js.map +1 -0
  322. package/dist/skill-manifest/verifier.d.ts +42 -0
  323. package/dist/skill-manifest/verifier.d.ts.map +1 -0
  324. package/dist/skill-manifest/verifier.js +136 -0
  325. package/dist/skill-manifest/verifier.js.map +1 -0
  326. package/dist/skills/brain-query.d.ts +4 -4
  327. package/dist/skills/brain-store.d.ts +6 -6
  328. package/dist/skills/errors.d.ts +15 -0
  329. package/dist/skills/errors.d.ts.map +1 -1
  330. package/dist/skills/errors.js +21 -0
  331. package/dist/skills/errors.js.map +1 -1
  332. package/dist/skills/hitl-request.d.ts +2 -2
  333. package/dist/skills/index.d.ts +3 -1
  334. package/dist/skills/index.d.ts.map +1 -1
  335. package/dist/skills/index.js +4 -1
  336. package/dist/skills/index.js.map +1 -1
  337. package/dist/skills/markdown/loader.d.ts +52 -0
  338. package/dist/skills/markdown/loader.d.ts.map +1 -0
  339. package/dist/skills/markdown/loader.js +93 -0
  340. package/dist/skills/markdown/loader.js.map +1 -0
  341. package/dist/skills/markdown/schema.d.ts +432 -0
  342. package/dist/skills/markdown/schema.d.ts.map +1 -0
  343. package/dist/skills/markdown/schema.js +121 -0
  344. package/dist/skills/markdown/schema.js.map +1 -0
  345. package/dist/skills/poc-md-loader/markdown-loader.d.ts +77 -0
  346. package/dist/skills/poc-md-loader/markdown-loader.d.ts.map +1 -0
  347. package/dist/skills/poc-md-loader/markdown-loader.js +125 -0
  348. package/dist/skills/poc-md-loader/markdown-loader.js.map +1 -0
  349. package/dist/skills/poc-md-loader/runner.d.ts +24 -0
  350. package/dist/skills/poc-md-loader/runner.d.ts.map +1 -0
  351. package/dist/skills/poc-md-loader/runner.js +57 -0
  352. package/dist/skills/poc-md-loader/runner.js.map +1 -0
  353. package/dist/skills/poc-md-loader/vitest.poc.config.d.ts +3 -0
  354. package/dist/skills/poc-md-loader/vitest.poc.config.d.ts.map +1 -0
  355. package/dist/skills/poc-md-loader/vitest.poc.config.js +13 -0
  356. package/dist/skills/poc-md-loader/vitest.poc.config.js.map +1 -0
  357. package/dist/skills/poc-md-loader/web-search/script.d.ts +33 -0
  358. package/dist/skills/poc-md-loader/web-search/script.d.ts.map +1 -0
  359. package/dist/skills/poc-md-loader/web-search/script.js +75 -0
  360. package/dist/skills/poc-md-loader/web-search/script.js.map +1 -0
  361. package/dist/skills/record-outcome.d.ts +4 -4
  362. package/dist/skills/send-email.d.ts.map +1 -1
  363. package/dist/skills/send-email.js +15 -3
  364. package/dist/skills/send-email.js.map +1 -1
  365. package/dist/skills/slack-notify.d.ts +4 -4
  366. package/dist/skills/starknet-balance.d.ts +1 -1
  367. package/dist/skills/telegram-notify.d.ts +4 -4
  368. package/dist/skills/web-search.d.ts +1 -1
  369. package/dist/testing/contracts/event-bus.contract.d.ts.map +1 -1
  370. package/dist/testing/contracts/event-bus.contract.js +14 -12
  371. package/dist/testing/contracts/event-bus.contract.js.map +1 -1
  372. package/dist/testing/index.d.ts +3 -0
  373. package/dist/testing/test-brain-port.d.ts +4 -0
  374. package/dist/testing/test-brain-port.d.ts.map +1 -1
  375. package/dist/testing/test-brain-port.js +75 -20
  376. package/dist/testing/test-brain-port.js.map +1 -1
  377. package/dist/testing/test-event-bus.d.ts.map +1 -1
  378. package/dist/testing/test-event-bus.js +89 -36
  379. package/dist/testing/test-event-bus.js.map +1 -1
  380. package/dist/trace/schema.d.ts +1 -1
  381. package/dist/trace/schema.d.ts.map +1 -1
  382. package/dist/trace/schema.js +1 -1
  383. package/dist/trace/schema.js.map +1 -1
  384. package/dist/verify/formal/index.d.ts +44 -0
  385. package/dist/verify/formal/index.d.ts.map +1 -0
  386. package/dist/verify/formal/index.js +98 -0
  387. package/dist/verify/formal/index.js.map +1 -0
  388. package/dist/verify/formal/policy.d.ts +105 -0
  389. package/dist/verify/formal/policy.d.ts.map +1 -0
  390. package/dist/verify/formal/policy.js +159 -0
  391. package/dist/verify/formal/policy.js.map +1 -0
  392. package/dist/verify/formal/result.d.ts +50 -0
  393. package/dist/verify/formal/result.d.ts.map +1 -0
  394. package/dist/verify/formal/result.js +21 -0
  395. package/dist/verify/formal/result.js.map +1 -0
  396. package/dist/verify/formal/solver.d.ts +67 -0
  397. package/dist/verify/formal/solver.d.ts.map +1 -0
  398. package/dist/verify/formal/solver.js +184 -0
  399. package/dist/verify/formal/solver.js.map +1 -0
  400. package/dist/verify/formal/spec-language.d.ts +80 -0
  401. package/dist/verify/formal/spec-language.d.ts.map +1 -0
  402. package/dist/verify/formal/spec-language.js +219 -0
  403. package/dist/verify/formal/spec-language.js.map +1 -0
  404. package/docs/attestation.md +199 -0
  405. package/docs/identity.md +193 -0
  406. package/package.json +22 -1
  407. package/src/adapters/llm/anthropic-direct.ts +51 -0
  408. package/src/adapters/llm/cascade.ts +64 -19
  409. package/src/adapters/llm/litellm.ts +49 -0
  410. package/src/compute/difficulty-estimator.ts +111 -0
  411. package/src/compute/strategies/mixture-of-agents.ts +150 -0
  412. package/src/compute/strategies/tree-of-thoughts.ts +293 -0
  413. package/src/compute/strategies/two-phase-orient.ts +147 -0
  414. package/src/container/protocol.ts +243 -0
  415. package/src/container/runtime.ts +424 -0
  416. package/src/db/migrations/026_formal_verify_results.sql +30 -0
  417. package/src/events/catalogue.ts +54 -0
  418. package/src/events/index.ts +9 -0
  419. package/src/events/schemas/citadel.sprint.analyzed.v1.ts +23 -0
  420. package/src/events/schemas/forge.inbox.reply_classified.v1.ts +15 -0
  421. package/src/events/schemas/vauban-finance.forecast.generated.v1.ts +11 -0
  422. package/src/events/schemas/vauban-finance.trade.executed.v1.ts +12 -0
  423. package/src/events/schemas/vauban.goal.checked.v1.ts +11 -0
  424. package/src/events/schemas/vauban.rebalancing.checked.v1.ts +11 -0
  425. package/src/events/schemas/vauban.tax.checked.v1.ts +11 -0
  426. package/src/events/schemas/vauban.vault.analyzed.v1.ts +21 -0
  427. package/src/events/schemas/vauban.vault.compounded.v1.ts +12 -0
  428. package/src/identity/agent-persona.ts +203 -0
  429. package/src/identity/persona-prompt.ts +84 -0
  430. package/src/identity/persona-schema.ts +127 -0
  431. package/src/index.ts +338 -1
  432. package/src/loop/index.ts +0 -1
  433. package/src/loop/sdk-loop.ts +5 -8
  434. package/src/memory/episodic-rrf.ts +224 -0
  435. package/src/mesh/attenuation.ts +190 -0
  436. package/src/mesh/delegate.ts +254 -0
  437. package/src/mesh/dispatcher.ts +301 -0
  438. package/src/mesh/index.ts +39 -0
  439. package/src/mesh/types.ts +31 -0
  440. package/src/orchestration/ooda/skills.ts +177 -0
  441. package/src/orchestration/ooda/types.ts +3 -9
  442. package/src/ports/bastion-action.contract.test.ts +355 -0
  443. package/src/ports/bastion-action.ts +198 -0
  444. package/src/ports/brain.ts +177 -15
  445. package/src/ports/citadel-action.contract.test.ts +430 -0
  446. package/src/ports/citadel-action.ts +174 -0
  447. package/src/ports/compliance-contract.ts +191 -0
  448. package/src/ports/db.ts +98 -0
  449. package/src/ports/delegation.contract.test.ts +428 -0
  450. package/src/ports/delegation.ts +211 -0
  451. package/src/ports/event-bus.ts +133 -18
  452. package/src/ports/federation.contract.test.ts +355 -0
  453. package/src/ports/federation.ts +190 -0
  454. package/src/ports/index.ts +186 -1
  455. package/src/ports/llm-provider.ts +123 -0
  456. package/src/ports/logger.ts +104 -0
  457. package/src/ports/manifest-registry.contract.test.ts +324 -0
  458. package/src/ports/manifest-registry.ts +188 -0
  459. package/src/ports/observability.contract.test.ts +315 -0
  460. package/src/ports/observability.ts +150 -0
  461. package/src/ports/outcome.ts +69 -0
  462. package/src/ports/privacy.contract.test.ts +413 -0
  463. package/src/ports/privacy.ts +207 -0
  464. package/src/ports/tenant-context.contract.test.ts +454 -0
  465. package/src/ports/tenant-context.ts +150 -0
  466. package/src/ports/vauban-finance-action.contract.test.ts +335 -0
  467. package/src/ports/vauban-finance-action.ts +166 -0
  468. package/src/ports/workflow-runtime.ts +327 -0
  469. package/src/proof/cert-verify.ts +249 -0
  470. package/src/replay/replay.ts +11 -8
  471. package/src/retry/index.ts +227 -0
  472. package/src/retry/presets.ts +75 -0
  473. package/src/skill-loop/ab-runner.ts +196 -0
  474. package/src/skill-loop/adoption.ts +188 -0
  475. package/src/skill-loop/candidate.ts +75 -0
  476. package/src/skill-loop/evaluator.ts +238 -0
  477. package/src/skill-loop/index.ts +51 -0
  478. package/src/skill-loop/reflexion-replay.ts +173 -0
  479. package/src/skill-loop/sign-off.ts +247 -0
  480. package/src/skill-loop/value-metric.ts +120 -0
  481. package/src/skill-loop/versioning.ts +75 -0
  482. package/src/skill-manifest/anchor.ts +401 -0
  483. package/src/skill-manifest/builder.ts +129 -0
  484. package/src/skill-manifest/index.ts +18 -0
  485. package/src/skill-manifest/types.ts +72 -0
  486. package/src/skill-manifest/verifier.ts +198 -0
  487. package/src/skills/errors.ts +30 -2
  488. package/src/skills/index.ts +19 -0
  489. package/src/skills/markdown/loader.ts +129 -0
  490. package/src/skills/markdown/schema.ts +144 -0
  491. package/src/skills/poc-md-loader/e2e-parity.test.ts +237 -0
  492. package/src/skills/poc-md-loader/markdown-loader.ts +161 -0
  493. package/src/skills/poc-md-loader/runner.ts +82 -0
  494. package/src/skills/poc-md-loader/vitest.poc.config.ts +13 -0
  495. package/src/skills/poc-md-loader/web-search/SKILL.md +42 -0
  496. package/src/skills/poc-md-loader/web-search/script.ts +109 -0
  497. package/src/skills/send-email.ts +15 -3
  498. package/src/testing/contracts/event-bus.contract.ts +16 -14
  499. package/src/testing/test-brain-port.ts +98 -24
  500. package/src/testing/test-event-bus.ts +104 -43
  501. package/src/trace/schema.ts +1 -1
  502. package/src/verify/formal/index.ts +154 -0
  503. package/src/verify/formal/policy.ts +253 -0
  504. package/src/verify/formal/result.ts +52 -0
  505. package/src/verify/formal/solver.ts +235 -0
  506. package/src/verify/formal/spec-language.ts +274 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * src/skill-loop/reflexion-replay.ts
3
+ *
4
+ * Deterministic reflexion storage and replay.
5
+ *
6
+ * Invariants:
7
+ * - Reflexion is stored as a deterministic hash, NOT an LLM paraphrase.
8
+ * - replay() with the same args produces bit-identical output every time.
9
+ * - The replay hash is SHA-256(skillId + ":" + domain + ":" + instructionsHash).
10
+ * - No LLM calls. Pure deterministic computation.
11
+ *
12
+ * @module skill-loop/reflexion-replay
13
+ */
14
+ import { createHash } from "node:crypto";
15
+ // ---------------------------------------------------------------------------
16
+ // Helpers
17
+ // ---------------------------------------------------------------------------
18
+ function sha256Hex(input) {
19
+ return createHash("sha256").update(input, "utf8").digest("hex");
20
+ }
21
+ function computeReplayHash(skillId, domain, instructionsHash) {
22
+ return sha256Hex(`${skillId}:${domain}:${instructionsHash}`);
23
+ }
24
+ // ---------------------------------------------------------------------------
25
+ // ReflexionStore
26
+ // ---------------------------------------------------------------------------
27
+ /**
28
+ * In-memory deterministic reflexion store.
29
+ *
30
+ * In production, persist entries to the DB (table: skill_reflexions).
31
+ * This implementation is process-local and suitable for tests.
32
+ */
33
+ export class ReflexionStore {
34
+ entries = new Map();
35
+ // ── Store ──────────────────────────────────────────────────────────────────
36
+ /**
37
+ * Store a reflexion entry deterministically.
38
+ *
39
+ * The replayHash is computed solely from (skillId, domain, instructions) —
40
+ * no randomness, no timestamps in the hash computation.
41
+ * Idempotent: storing with the same inputs overwrites with bit-identical data.
42
+ *
43
+ * @param skillId - Skill identifier.
44
+ * @param domain - Domain key.
45
+ * @param instructions - Raw skill instructions (deterministic source).
46
+ * @param lesson - Extracted lesson (must be deterministic — NOT LLM output).
47
+ * @param scores - Constitutional and outcome scores.
48
+ * @param nowDate - Optional timestamp override for testing.
49
+ */
50
+ store(skillId, domain, instructions, lesson, scores, nowDate) {
51
+ const instructionsHash = sha256Hex(instructions);
52
+ const replayHash = computeReplayHash(skillId, domain, instructionsHash);
53
+ const entry = {
54
+ replayHash,
55
+ skillId,
56
+ domain,
57
+ instructionsHash,
58
+ lesson,
59
+ scores,
60
+ storedAt: (nowDate ?? new Date()).toISOString(),
61
+ };
62
+ this.entries.set(replayHash, entry);
63
+ return entry;
64
+ }
65
+ // ── Replay ─────────────────────────────────────────────────────────────────
66
+ /**
67
+ * Replay a stored reflexion with the same arguments.
68
+ *
69
+ * Determinism guarantee: replay(skillId, domain, instructions) with the
70
+ * same inputs as the original store() call ALWAYS produces the same
71
+ * replayHash and lesson — bit-identical output.
72
+ *
73
+ * @returns ReplayResult with `identical: true` if the entry is found and
74
+ * the recomputed hash matches the stored replayHash.
75
+ */
76
+ replay(skillId, domain, instructions) {
77
+ const instructionsHash = sha256Hex(instructions);
78
+ const replayHash = computeReplayHash(skillId, domain, instructionsHash);
79
+ const entry = this.entries.get(replayHash);
80
+ if (!entry)
81
+ return null;
82
+ // Verify bit-identical determinism
83
+ const identical = replayHash === entry.replayHash &&
84
+ instructionsHash === entry.instructionsHash;
85
+ return {
86
+ replayHash,
87
+ lesson: entry.lesson,
88
+ scores: entry.scores,
89
+ identical,
90
+ };
91
+ }
92
+ // ── Queries ────────────────────────────────────────────────────────────────
93
+ /** Retrieve an entry by its replay hash. */
94
+ get(replayHash) {
95
+ return this.entries.get(replayHash) ?? null;
96
+ }
97
+ /** List all stored entries for a given skill. */
98
+ listBySkill(skillId) {
99
+ return Array.from(this.entries.values()).filter((e) => e.skillId === skillId);
100
+ }
101
+ /** Total number of stored entries. */
102
+ get size() {
103
+ return this.entries.size;
104
+ }
105
+ /** Clear all entries (useful for test isolation). */
106
+ clear() {
107
+ this.entries.clear();
108
+ }
109
+ }
110
+ //# sourceMappingURL=reflexion-replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflexion-replay.js","sourceRoot":"","sources":["../../src/skill-loop/reflexion-replay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA6BzC,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,iBAAiB,CACxB,OAAe,EACf,MAAc,EACd,gBAAwB;IAExB,OAAO,SAAS,CAAC,GAAG,OAAO,IAAI,MAAM,IAAI,gBAAgB,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IACR,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE7D,8EAA8E;IAE9E;;;;;;;;;;;;;OAaG;IACH,KAAK,CACH,OAAe,EACf,MAAc,EACd,YAAoB,EACpB,MAAc,EACd,MAAmD,EACnD,OAAc;QAEd,MAAM,gBAAgB,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAExE,MAAM,KAAK,GAAmB;YAC5B,UAAU;YACV,OAAO;YACP,MAAM;YACN,gBAAgB;YAChB,MAAM;YACN,MAAM;YACN,QAAQ,EAAE,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;SAChD,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8EAA8E;IAE9E;;;;;;;;;OASG;IACH,MAAM,CACJ,OAAe,EACf,MAAc,EACd,YAAoB;QAEpB,MAAM,gBAAgB,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAExE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,mCAAmC;QACnC,MAAM,SAAS,GACb,UAAU,KAAK,KAAK,CAAC,UAAU;YAC/B,gBAAgB,KAAK,KAAK,CAAC,gBAAgB,CAAC;QAE9C,OAAO;YACL,UAAU;YACV,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS;SACV,CAAC;IACJ,CAAC;IAED,8EAA8E;IAE9E,4CAA4C;IAC5C,GAAG,CAAC,UAAkB;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;IAC9C,CAAC;IAED,iDAAiD;IACjD,WAAW,CAAC,OAAe;QACzB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAC7C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAC7B,CAAC;IACJ,CAAC;IAED,sCAAsC;IACtC,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,qDAAqD;IACrD,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * src/skill-loop/sign-off.ts
3
+ *
4
+ * Article 14 human oversight mechanism for skill promotion.
5
+ *
6
+ * Invariants:
7
+ * - Audit trail: { approver_id, timestamp, decision, rationale, signed_hash }
8
+ * - signed_hash = SHA-256(candidateId + decision + rationale + isoTimestamp)
9
+ * - Escalation: approver unavailable >72h → auto-REJECTED (never auto-approved)
10
+ * - Multiple approvers possible; one sign-off is sufficient for promotion.
11
+ *
12
+ * @module skill-loop/sign-off
13
+ */
14
+ export type SignOffDecision = "approved" | "rejected";
15
+ export interface SignOffRecord {
16
+ /** Candidate ID this sign-off covers. */
17
+ candidateId: string;
18
+ /** Identifier of the human approver (e.g. user UUID or username). */
19
+ approverId: string;
20
+ /** ISO-8601 timestamp at which the decision was recorded. */
21
+ timestamp: string;
22
+ /** Human decision. */
23
+ decision: SignOffDecision;
24
+ /** Human-provided rationale (non-empty required). */
25
+ rationale: string;
26
+ /**
27
+ * Integrity hash: SHA-256(candidateId + decision + rationale + timestamp).
28
+ * Detects tampering in the audit trail.
29
+ */
30
+ signedHash: string;
31
+ }
32
+ export interface PendingRequest {
33
+ candidateId: string;
34
+ requestedAt: string;
35
+ /** Approver ID if a specific approver is designated. Null = any approver. */
36
+ approverId: string | null;
37
+ /** Deadline beyond which the request is auto-rejected (72h from requestedAt). */
38
+ deadlineAt: string;
39
+ }
40
+ /**
41
+ * Manages pending approval requests and sign-off records.
42
+ *
43
+ * In production, records should be persisted to the DB. This implementation
44
+ * is in-memory and suitable for tests and single-process environments.
45
+ */
46
+ export declare class SignOffManager {
47
+ private readonly records;
48
+ private readonly pending;
49
+ /** 72-hour escalation deadline in milliseconds. */
50
+ static readonly ESCALATION_DEADLINE_MS: number;
51
+ /**
52
+ * Create a pending approval request for a candidate.
53
+ *
54
+ * If a request already exists and is not expired, returns the existing one.
55
+ */
56
+ requestSignOff(candidateId: string, approverId?: string | null, nowDate?: Date): PendingRequest;
57
+ /**
58
+ * Record a sign-off decision (approved or rejected).
59
+ *
60
+ * @throws If rationale is empty or candidateId is missing.
61
+ */
62
+ recordDecision(candidateId: string, approverId: string, decision: SignOffDecision, rationale: string, nowDate?: Date): SignOffRecord;
63
+ /**
64
+ * Check all pending requests and auto-reject any that have exceeded the 72h deadline.
65
+ *
66
+ * @returns Array of auto-rejection records created.
67
+ */
68
+ escalateExpired(nowDate?: Date): SignOffRecord[];
69
+ /**
70
+ * Returns the first approved sign-off for a candidate, or null if none exists.
71
+ * One sign-off is sufficient for promotion.
72
+ */
73
+ getApproval(candidateId: string): SignOffRecord | null;
74
+ /**
75
+ * Returns all sign-off records for a candidate (audit trail).
76
+ */
77
+ getAuditTrail(candidateId: string): SignOffRecord[];
78
+ /**
79
+ * Returns true if a pending request exists and has not expired.
80
+ */
81
+ hasPending(candidateId: string, nowDate?: Date): boolean;
82
+ /**
83
+ * Verify the integrity of a sign-off record by recomputing its hash.
84
+ */
85
+ verifyRecord(record: SignOffRecord): boolean;
86
+ private isExpired;
87
+ }
88
+ //# sourceMappingURL=sign-off.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-off.d.ts","sourceRoot":"","sources":["../../src/skill-loop/sign-off.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,UAAU,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,QAAQ,EAAE,eAAe,CAAC;IAC1B,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iFAAiF;IACjF,UAAU,EAAE,MAAM,CAAC;CACpB;AA4BD;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAE7D,mDAAmD;IACnD,MAAM,CAAC,QAAQ,CAAC,sBAAsB,SAAwB;IAI9D;;;;OAIG;IACH,cAAc,CACZ,WAAW,EAAE,MAAM,EACnB,UAAU,GAAE,MAAM,GAAG,IAAW,EAChC,OAAO,CAAC,EAAE,IAAI,GACb,cAAc;IAuBjB;;;;OAIG;IACH,cAAc,CACZ,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,IAAI,GACb,aAAa;IAoChB;;;;OAIG;IACH,eAAe,CAAC,OAAO,CAAC,EAAE,IAAI,GAAG,aAAa,EAAE;IAqBhD;;;OAGG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAStD;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,EAAE;IAInD;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,GAAG,OAAO;IAQxD;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO;IAY5C,OAAO,CAAC,SAAS;CAKlB"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * src/skill-loop/sign-off.ts
3
+ *
4
+ * Article 14 human oversight mechanism for skill promotion.
5
+ *
6
+ * Invariants:
7
+ * - Audit trail: { approver_id, timestamp, decision, rationale, signed_hash }
8
+ * - signed_hash = SHA-256(candidateId + decision + rationale + isoTimestamp)
9
+ * - Escalation: approver unavailable >72h → auto-REJECTED (never auto-approved)
10
+ * - Multiple approvers possible; one sign-off is sufficient for promotion.
11
+ *
12
+ * @module skill-loop/sign-off
13
+ */
14
+ import { createHash } from "node:crypto";
15
+ // ---------------------------------------------------------------------------
16
+ // Internal helpers
17
+ // ---------------------------------------------------------------------------
18
+ function sha256Hex(input) {
19
+ return createHash("sha256").update(input, "utf8").digest("hex");
20
+ }
21
+ function isoNow(overrideDate) {
22
+ return (overrideDate ?? new Date()).toISOString();
23
+ }
24
+ /** Compute the signed hash per the canonical formula. */
25
+ function computeSignedHash(candidateId, decision, rationale, timestamp) {
26
+ return sha256Hex(`${candidateId}${decision}${rationale}${timestamp}`);
27
+ }
28
+ // ---------------------------------------------------------------------------
29
+ // SignOffManager
30
+ // ---------------------------------------------------------------------------
31
+ /**
32
+ * Manages pending approval requests and sign-off records.
33
+ *
34
+ * In production, records should be persisted to the DB. This implementation
35
+ * is in-memory and suitable for tests and single-process environments.
36
+ */
37
+ export class SignOffManager {
38
+ records = new Map();
39
+ pending = new Map();
40
+ /** 72-hour escalation deadline in milliseconds. */
41
+ static ESCALATION_DEADLINE_MS = 72 * 60 * 60 * 1_000;
42
+ // ── Request ─────────────────────────────────────────────────────────────────
43
+ /**
44
+ * Create a pending approval request for a candidate.
45
+ *
46
+ * If a request already exists and is not expired, returns the existing one.
47
+ */
48
+ requestSignOff(candidateId, approverId = null, nowDate) {
49
+ const existing = this.pending.get(candidateId);
50
+ if (existing && !this.isExpired(existing, nowDate)) {
51
+ return existing;
52
+ }
53
+ const requestedAt = isoNow(nowDate);
54
+ const deadline = new Date((nowDate ?? new Date()).getTime() + SignOffManager.ESCALATION_DEADLINE_MS);
55
+ const request = {
56
+ candidateId,
57
+ requestedAt,
58
+ approverId,
59
+ deadlineAt: deadline.toISOString(),
60
+ };
61
+ this.pending.set(candidateId, request);
62
+ return request;
63
+ }
64
+ // ── Approve / Reject ────────────────────────────────────────────────────────
65
+ /**
66
+ * Record a sign-off decision (approved or rejected).
67
+ *
68
+ * @throws If rationale is empty or candidateId is missing.
69
+ */
70
+ recordDecision(candidateId, approverId, decision, rationale, nowDate) {
71
+ if (!rationale || rationale.trim().length === 0) {
72
+ throw new Error(`sign-off: rationale is required for decision "${decision}" on candidate "${candidateId}"`);
73
+ }
74
+ const timestamp = isoNow(nowDate);
75
+ const signedHash = computeSignedHash(candidateId, decision, rationale, timestamp);
76
+ const record = {
77
+ candidateId,
78
+ approverId,
79
+ timestamp,
80
+ decision,
81
+ rationale,
82
+ signedHash,
83
+ };
84
+ const existing = this.records.get(candidateId) ?? [];
85
+ existing.push(record);
86
+ this.records.set(candidateId, existing);
87
+ // Remove the pending request once a decision is recorded.
88
+ this.pending.delete(candidateId);
89
+ return record;
90
+ }
91
+ // ── Escalation ──────────────────────────────────────────────────────────────
92
+ /**
93
+ * Check all pending requests and auto-reject any that have exceeded the 72h deadline.
94
+ *
95
+ * @returns Array of auto-rejection records created.
96
+ */
97
+ escalateExpired(nowDate) {
98
+ const rejections = [];
99
+ for (const [candidateId, request] of this.pending.entries()) {
100
+ if (this.isExpired(request, nowDate)) {
101
+ const record = this.recordDecision(candidateId, "system:escalation", "rejected", "Auto-rejected: approver unavailable >72h (Art. 14 escalation — never auto-approved)", nowDate);
102
+ rejections.push(record);
103
+ }
104
+ }
105
+ return rejections;
106
+ }
107
+ // ── Queries ─────────────────────────────────────────────────────────────────
108
+ /**
109
+ * Returns the first approved sign-off for a candidate, or null if none exists.
110
+ * One sign-off is sufficient for promotion.
111
+ */
112
+ getApproval(candidateId) {
113
+ const records = this.records.get(candidateId) ?? [];
114
+ return (records.find((r) => r.decision === "approved" && r.approverId !== "system:escalation") ?? null);
115
+ }
116
+ /**
117
+ * Returns all sign-off records for a candidate (audit trail).
118
+ */
119
+ getAuditTrail(candidateId) {
120
+ return this.records.get(candidateId) ?? [];
121
+ }
122
+ /**
123
+ * Returns true if a pending request exists and has not expired.
124
+ */
125
+ hasPending(candidateId, nowDate) {
126
+ const request = this.pending.get(candidateId);
127
+ if (!request)
128
+ return false;
129
+ return !this.isExpired(request, nowDate);
130
+ }
131
+ // ── Verification ────────────────────────────────────────────────────────────
132
+ /**
133
+ * Verify the integrity of a sign-off record by recomputing its hash.
134
+ */
135
+ verifyRecord(record) {
136
+ const expected = computeSignedHash(record.candidateId, record.decision, record.rationale, record.timestamp);
137
+ return expected === record.signedHash;
138
+ }
139
+ // ── Private ─────────────────────────────────────────────────────────────────
140
+ isExpired(request, nowDate) {
141
+ const deadline = new Date(request.deadlineAt).getTime();
142
+ const now = (nowDate ?? new Date()).getTime();
143
+ return now > deadline;
144
+ }
145
+ }
146
+ //# sourceMappingURL=sign-off.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-off.js","sourceRoot":"","sources":["../../src/skill-loop/sign-off.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * src/skill-loop/value-metric.ts
3
+ *
4
+ * skill_value formula: cumulative weekly metric.
5
+ *
6
+ * skill_value = Σ(usage_count × outcome_delta_vs_baseline)
7
+ *
8
+ * Consumer provides an outcomeDeltaCalculator function that returns the
9
+ * outcome delta for a given usage event. The metric is cumulative over a
10
+ * sliding 7-day window.
11
+ *
12
+ * @module skill-loop/value-metric
13
+ */
14
+ export interface UsageEvent {
15
+ /** Skill ID this event belongs to. */
16
+ skillId: string;
17
+ /** ISO-8601 timestamp of the usage event. */
18
+ timestamp: string;
19
+ /** Arbitrary context passed to the outcomeDeltaCalculator. */
20
+ context: Record<string, unknown>;
21
+ }
22
+ export interface SkillValueResult {
23
+ skillId: string;
24
+ /** Sum of (usage × outcome_delta) over the window. */
25
+ skillValue: number;
26
+ /** Number of usage events included. */
27
+ usageCount: number;
28
+ /** Sum of all individual outcome deltas (raw). */
29
+ totalOutcomeDelta: number;
30
+ /** Start of the 7-day window (ISO-8601). */
31
+ windowStart: string;
32
+ /** End of the 7-day window (ISO-8601). */
33
+ windowEnd: string;
34
+ }
35
+ /**
36
+ * Compute skill_value = Σ(usage × outcome_delta_vs_baseline).
37
+ *
38
+ * Each usage event is weighted by the outcome delta it produced vs the
39
+ * baseline skill. Events outside the 7-day window are excluded.
40
+ *
41
+ * @param skillId - The skill being measured.
42
+ * @param usageEvents - All usage events for this skill.
43
+ * @param outcomeDeltaCalculator - Consumer-provided function: event → delta.
44
+ * @param nowDate - Optional override for "now" (deterministic tests).
45
+ */
46
+ export declare function computeSkillValue(skillId: string, usageEvents: UsageEvent[], outcomeDeltaCalculator: (event: UsageEvent) => number, nowDate?: Date): SkillValueResult;
47
+ /**
48
+ * Compute skill_value for multiple skills and rank them descending.
49
+ */
50
+ export declare function rankSkillsByValue(skills: Array<{
51
+ skillId: string;
52
+ usageEvents: UsageEvent[];
53
+ outcomeDeltaCalculator: (event: UsageEvent) => number;
54
+ }>, nowDate?: Date): SkillValueResult[];
55
+ //# sourceMappingURL=value-metric.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-metric.d.ts","sourceRoot":"","sources":["../../src/skill-loop/value-metric.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,MAAM,WAAW,UAAU;IACzB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAYD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,UAAU,EAAE,EACzB,sBAAsB,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,EACrD,OAAO,CAAC,EAAE,IAAI,GACb,gBAAgB,CA8BlB;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,KAAK,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,sBAAsB,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC;CACvD,CAAC,EACF,OAAO,CAAC,EAAE,IAAI,GACb,gBAAgB,EAAE,CAMpB"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * src/skill-loop/value-metric.ts
3
+ *
4
+ * skill_value formula: cumulative weekly metric.
5
+ *
6
+ * skill_value = Σ(usage_count × outcome_delta_vs_baseline)
7
+ *
8
+ * Consumer provides an outcomeDeltaCalculator function that returns the
9
+ * outcome delta for a given usage event. The metric is cumulative over a
10
+ * sliding 7-day window.
11
+ *
12
+ * @module skill-loop/value-metric
13
+ */
14
+ // ---------------------------------------------------------------------------
15
+ // 7-day sliding window constant
16
+ // ---------------------------------------------------------------------------
17
+ const WEEK_MS = 7 * 24 * 60 * 60 * 1_000;
18
+ // ---------------------------------------------------------------------------
19
+ // computeSkillValue
20
+ // ---------------------------------------------------------------------------
21
+ /**
22
+ * Compute skill_value = Σ(usage × outcome_delta_vs_baseline).
23
+ *
24
+ * Each usage event is weighted by the outcome delta it produced vs the
25
+ * baseline skill. Events outside the 7-day window are excluded.
26
+ *
27
+ * @param skillId - The skill being measured.
28
+ * @param usageEvents - All usage events for this skill.
29
+ * @param outcomeDeltaCalculator - Consumer-provided function: event → delta.
30
+ * @param nowDate - Optional override for "now" (deterministic tests).
31
+ */
32
+ export function computeSkillValue(skillId, usageEvents, outcomeDeltaCalculator, nowDate) {
33
+ const now = nowDate ?? new Date();
34
+ const windowEnd = now.toISOString();
35
+ const windowStart = new Date(now.getTime() - WEEK_MS).toISOString();
36
+ // Filter to events within the 7-day window
37
+ const windowEvents = usageEvents.filter((e) => {
38
+ const ts = e.timestamp;
39
+ return ts >= windowStart && ts <= windowEnd;
40
+ });
41
+ // skill_value = Σ(usage × outcome_delta)
42
+ // Each event counts as 1 usage unit.
43
+ let skillValue = 0;
44
+ let totalOutcomeDelta = 0;
45
+ for (const event of windowEvents) {
46
+ const delta = outcomeDeltaCalculator(event);
47
+ skillValue += 1 * delta; // usage_count per event = 1
48
+ totalOutcomeDelta += delta;
49
+ }
50
+ return {
51
+ skillId,
52
+ skillValue,
53
+ usageCount: windowEvents.length,
54
+ totalOutcomeDelta,
55
+ windowStart,
56
+ windowEnd,
57
+ };
58
+ }
59
+ // ---------------------------------------------------------------------------
60
+ // computeAggregateSkillValue (multi-skill comparison helper)
61
+ // ---------------------------------------------------------------------------
62
+ /**
63
+ * Compute skill_value for multiple skills and rank them descending.
64
+ */
65
+ export function rankSkillsByValue(skills, nowDate) {
66
+ const results = skills.map(({ skillId, usageEvents, outcomeDeltaCalculator }) => computeSkillValue(skillId, usageEvents, outcomeDeltaCalculator, nowDate));
67
+ return results.sort((a, b) => b.skillValue - a.skillValue);
68
+ }
69
+ //# sourceMappingURL=value-metric.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-metric.js","sourceRoot":"","sources":["../../src/skill-loop/value-metric.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA6BH,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;AAEzC,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,WAAyB,EACzB,sBAAqD,EACrD,OAAc;IAEd,MAAM,GAAG,GAAG,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAEpE,2CAA2C;IAC3C,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5C,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC;QACvB,OAAO,EAAE,IAAI,WAAW,IAAI,EAAE,IAAI,SAAS,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,yCAAyC;IACzC,qCAAqC;IACrC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC5C,UAAU,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,4BAA4B;QACrD,iBAAiB,IAAI,KAAK,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,OAAO;QACP,UAAU;QACV,UAAU,EAAE,YAAY,CAAC,MAAM;QAC/B,iBAAiB;QACjB,WAAW;QACX,SAAS;KACV,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,6DAA6D;AAC7D,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAIE,EACF,OAAc;IAEd,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CACxB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,EAAE,EAAE,CACnD,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,OAAO,CAAC,CAC3E,CAAC;IACF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * src/skill-loop/versioning.ts
3
+ *
4
+ * Skill version management — semver bumping and version record type.
5
+ *
6
+ * Bump rules:
7
+ * - reflexion / ab_winner → minor bump (1.0.0 → 1.1.0)
8
+ * - manual → major bump (1.0.0 → 2.0.0)
9
+ * - initial → no-op (returns "1.0.0" baseline)
10
+ *
11
+ * @module skill-loop/versioning
12
+ */
13
+ export interface SkillVersion {
14
+ skillId: string;
15
+ /** Semver string: "1.0.0", "1.1.0", etc. */
16
+ version: string;
17
+ parentSkillId: string | null;
18
+ mutationType: "initial" | "reflexion" | "ab_winner" | "manual";
19
+ /** SHA-256 of the source cycle trace. */
20
+ replayRoot: string;
21
+ createdAt: Date;
22
+ }
23
+ /**
24
+ * Bump a semver string according to mutation type.
25
+ *
26
+ * - initial → returns "1.0.0" (baseline, not a bump)
27
+ * - reflexion → minor bump
28
+ * - ab_winner → minor bump
29
+ * - manual → major bump
30
+ *
31
+ * @param current - Current semver string e.g. "1.2.3".
32
+ * @param mutationType - The kind of mutation that produced the new version.
33
+ * @returns New semver string.
34
+ */
35
+ export declare function bumpVersion(current: string, mutationType: SkillVersion["mutationType"]): string;
36
+ //# sourceMappingURL=versioning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versioning.d.ts","sourceRoot":"","sources":["../../src/skill-loop/versioning.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC/D,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;CACjB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,YAAY,CAAC,cAAc,CAAC,GACzC,MAAM,CA2BR"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * src/skill-loop/versioning.ts
3
+ *
4
+ * Skill version management — semver bumping and version record type.
5
+ *
6
+ * Bump rules:
7
+ * - reflexion / ab_winner → minor bump (1.0.0 → 1.1.0)
8
+ * - manual → major bump (1.0.0 → 2.0.0)
9
+ * - initial → no-op (returns "1.0.0" baseline)
10
+ *
11
+ * @module skill-loop/versioning
12
+ */
13
+ // ---------------------------------------------------------------------------
14
+ // Version bumping
15
+ // ---------------------------------------------------------------------------
16
+ /**
17
+ * Bump a semver string according to mutation type.
18
+ *
19
+ * - initial → returns "1.0.0" (baseline, not a bump)
20
+ * - reflexion → minor bump
21
+ * - ab_winner → minor bump
22
+ * - manual → major bump
23
+ *
24
+ * @param current - Current semver string e.g. "1.2.3".
25
+ * @param mutationType - The kind of mutation that produced the new version.
26
+ * @returns New semver string.
27
+ */
28
+ export function bumpVersion(current, mutationType) {
29
+ if (mutationType === "initial") {
30
+ return "1.0.0";
31
+ }
32
+ const parts = current.split(".");
33
+ if (parts.length !== 3) {
34
+ throw new Error(`bumpVersion: invalid semver "${current}" — expected "MAJOR.MINOR.PATCH"`);
35
+ }
36
+ const major = parseInt(parts[0], 10);
37
+ const minor = parseInt(parts[1], 10);
38
+ if (isNaN(major) || isNaN(minor)) {
39
+ throw new Error(`bumpVersion: non-numeric semver components in "${current}"`);
40
+ }
41
+ if (mutationType === "manual") {
42
+ return `${major + 1}.0.0`;
43
+ }
44
+ // reflexion | ab_winner → minor bump
45
+ return `${major}.${minor + 1}.0`;
46
+ }
47
+ //# sourceMappingURL=versioning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versioning.js","sourceRoot":"","sources":["../../src/skill-loop/versioning.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAiBH,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CACzB,OAAe,EACf,YAA0C;IAE1C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,gCAAgC,OAAO,kCAAkC,CAC1E,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAErC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,kDAAkD,OAAO,GAAG,CAC7D,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,qCAAqC;IACrC,OAAO,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC;AACnC,CAAC"}