chainlesschain 0.166.21 → 0.166.24

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 (301) hide show
  1. package/README.md +67 -9
  2. package/package.json +4 -3
  3. package/src/assets/web-panel/assets/{AIOps-BjMnsUci.js → AIOps-DR-MWcZc.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-DdYFP03A.js → ActionButton-DT8B7sEb.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-Bb8TuuK_.js → Analytics-asjh3dQJ.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-Kn3TIOtk.js → AppLayout-DivQ491i.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-4IxpqI_b.js → Artifacts-DPH2uUmy.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-BOV2caqU.js → Audit-Bp2nLyc-.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-B86k-ay4.js → BackgroundAgents-CHS28khl.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-C5_ie1e3.js → Backup-CKeaFSfz.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-xpwg6QCW.js → BaseInput-CxwM9BAH.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-CVZOcZau.js → Chat-DYLDwaCv.js} +4 -4
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-D8fPYhUu.js → ChatBubbleRenderer-DdBJDBP0.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-MKTq3zdP.js → Checkbox-uYTWOB8j.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-JUk3wzep.js → Codegen-CvYa_dwT.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-JPvTA0kC.js → Col-CanMAX4m.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-Tqgl87NQ.js → Community-B4WaDtHw.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-BuAFYBmN.js → Compact-K93Uof_3.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-CXS9WIPZ.js → Compliance-CKeDLgUW.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-Ds2bFHrr.js → Cowork-P93grAeB.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-C_dV_OeW.js → Cron-BSHnMtDn.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-BsO6tIRo.js → Crosschain-epAOpUVJ.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-rNOFqBac.js → DID-ByjXfP7t.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-C2fcKKVY.js → Dashboard-QztTU8tb.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-Y7Ndr0X_.js → Dropdown-DhUc9yhN.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-DcP_uPmL.js → EmailListRenderer-C2sLhJJN.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Cwn3gDzk.js → FamilyGuardDashboard-CdfbWNDn.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-ClQuOsqb.js → Federation-CcF_R7NW.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-DfwtmlcK.js → FormItemContext-Cm_X2IBk.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-zNZhtbC5.js → GenericCardRenderer-DUi4NWlb.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-BZmdW-G5.js → Git-4Sq5FjBt.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CqBk4lEn.js → Governance-Dx2_v4V6.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-Dbmt3ZXk.js → Inference-7Vr1xekR.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-hMTH6qf3.js → KnowledgeGraph-Cnd2XOzf.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-CkiYgiW2.js → Logs-B66QPVf-.js} +2 -2
  36. package/src/assets/web-panel/assets/{MarkdownRenderer-BL1FElXg.js → MarkdownRenderer-PLsEvhly.js} +1 -1
  37. package/src/assets/web-panel/assets/{Marketplace-CbB6wfin.js → Marketplace-BMIK9BmC.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-BSwiFtte.js → McpTools-BDbyp3J_.js} +3 -3
  39. package/src/assets/web-panel/assets/{Memory-B03PeHrz.js → Memory-CJdzfZGi.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-CRGrnd-X.js → MobileBridge-C2TH5Y3-.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-CE_5v2kO.js → MobileProjects-D1dYXkvV.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-Dp11QVx1.js → Mtc-B-4A1I1j.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-CYu-3JBu.js → MtcAudit-Bgcc9UOl.js} +5 -5
  44. package/src/assets/web-panel/assets/{Multisig-CGyJ0Xl3.js → Multisig-DqOe-etP.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-CoWi_ov1.js → NLProgramming-7VnhzE_6.js} +1 -1
  46. package/src/assets/web-panel/assets/Notes-BxawpeUQ.js +7 -0
  47. package/src/assets/web-panel/assets/{NotificationSettings-DX4I2b4W.js → NotificationSettings-Cr08G2aE.js} +1 -1
  48. package/src/assets/web-panel/assets/OrderTableRenderer-Ce8bEGlK.js +1 -0
  49. package/src/assets/web-panel/assets/{Organization-oopLO_tk.js → Organization-BC7lveGv.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-BFVvjMyf.js → Overflow-CakOW-G0.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-CBy5t-Tk.js → P2P-Cf8CaOBZ.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser--YWJNsu6.js → PdhVaultBrowser-Dc7b98W9.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-C2dZ8scb.js → Permissions-DGJyMEfS.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-Bs3l7Hlx.js → PersonalDataHub-DNIwSdwu.js} +6 -6
  55. package/src/assets/web-panel/assets/{Pipeline-DEBWbZuD.js → Pipeline-5B1S12wa.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-CjHBb6NU.js → Privacy-CMB6Ke5t.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-D2WipUz5.js → ProjectInit-D5PqTFiT.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-B6WfnrGB.js → ProjectSettings-CbKNdSjV.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-ccXaHzYL.js +1 -0
  60. package/src/assets/web-panel/assets/{Providers-CCv5M_Dv.js → Providers-CJF5_-Gs.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-CGthxU54.js → QrScannerModal-CT6iEAdi.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-CnPmXPFb.js → QuickAsk-Ci0h9mJ_.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-Df_tGEa9.js → Recommend-Da5mobZu.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-Z58N0Loe.js → RemoteSession-BaCY8eey.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-CZTBQ2Vt.js → Reputation-CaITfTsI.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-CdK3YpCQ.js → Row-DtUDamyP.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-CFMVT5sb.js → RssFeed-DX27gFpg.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-DrF8RIvD.js → Search-DFL69osN.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-Ddk2f2DM.js → Security-BqGeoWv-.js} +3 -3
  70. package/src/assets/web-panel/assets/{Services-CCuK-VOo.js → Services-3z1WnEAc.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-DxCpHzeM.js → Skeleton-C_OJQQ9Z.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-t2oTDgcv.js → Skills-BY7aT6Mo.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-Df63M9_R.js → Sla-BZv7DSaD.js} +1 -1
  74. package/src/assets/web-panel/assets/SpeechSettings-6lJKLhCn.js +1 -0
  75. package/src/assets/web-panel/assets/{SyncSettings-COd_tgPp.js → SyncSettings-B6D7STlI.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-CzDCcrik.js → Tasks-Co_FCZAO.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-D-vfxTGA.js → Templates-CnY-9fgz.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-BlpT_Gxc.js → Tenant-B71yXfZ8.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-D5rq52Hg.js → Terminal-Dd_P7awo.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-DdoMndkK.js → TimelineRenderer-CvIEMyli.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-BhgBsI6g.js → Tokens-DknFBGOi.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-DwwzoikZ.js → Trigger-D_4nJONB.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-HkTpzXFb.js → Trust-BNl21fa7.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-D9nk6Ehe.js → UkeySign-CFrCI7uK.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-BKk0rfoy.js → VideoEditing-BVfY6JLg.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-IVWIU_Lq.js → Wallet-Cj9CAK0J.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-CFTCpfsG.js → WebAuthn-DcqZlzA3.js} +4 -4
  88. package/src/assets/web-panel/assets/{WorkflowEditor-Dnf4Obif.js → WorkflowEditor-Dfr_dMld.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-D2snERdj.js → chat-Yv6UF0AD.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-DKEjK1N1.js → colors-CDW_-1fs.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BEDLwQdt.js → compact-item-BYOQvd-6.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-DA9iW1a0.js → createContext-BCGO0BiP.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-H-kXSuf-.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-5l2xEcY9.js → hasIn-DY-70cfQ.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-B7_W_rYd.js → index-366wfQBU.js} +1 -1
  96. package/src/assets/web-panel/assets/index-B0o4MeNK.js +1 -0
  97. package/src/assets/web-panel/assets/{index-CxEtQYdi.js → index-B9ZogJJM.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-B00GeekA.js → index-B9m5QAMg.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-C7sKbM5s.js → index-BBs2mv5M.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CX1x4AFn.js → index-BFv1hzF6.js} +1 -1
  101. package/src/assets/web-panel/assets/index-BVafOL_I.js +1 -0
  102. package/src/assets/web-panel/assets/{index-DU2TXJu-.js → index-BXlEx4UH.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-e-e40id6.js → index-BayRTE5w.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DXet1xol.js → index-Bb9nyts1.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-D7z4zB_a.js → index-Bf_Va0S-.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-fccZmC_h.js → index-Br3wQLVY.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Bqc8tdIF.js → index-BvK4fjkk.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BO9dQjpt.js → index-C40UdtlS.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Csfb-7hw.js → index-C4UJA2ju.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Td8ZwyoC.js → index-CB_Iw73G.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BZ5lY2zx.js → index-CCwWp3mT.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DpqtbXdE.js → index-CFa2fPCk.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-NJieh3T1.js → index-CIyHxV4u.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Dbkghqn_.js → index-CUP-A2_h.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DqwPFbOb.js → index-CUo27q9J.js} +3 -3
  116. package/src/assets/web-panel/assets/{index-B4QYBliR.js → index-CaT8trvf.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BgfImyZI.js → index-CnZNbcux.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Dbd7eEex.js → index-Cy2NE6AO.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CbTPvp2_.js → index-CzeEEazr.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-5pW4t1iD.js → index-D--TEyDj.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Dg2a9owQ.js → index-DCtsjhhT.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B_eCoZgW.js → index-DLOf7BSz.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-7P1b8HZo.js → index-DM5c4pc-.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CRPrHE7h.js → index-DRFC2Qt0.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Bq5P3piS.js → index-DT_qVaaV.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CjWltbi_.js → index-DUDoRk9r.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CkMKuqUs.js → index-Dg-AQYDf.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DLoalqRX.js → index-DuIPq5MX.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CGlotREA.js → index-NYVBUAVN.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-yYEQXYaU.js → index-NaCESahy.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CmruhzFi.js → index-RjIMPG0u.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-fgYk0QXO.js → index-Y9akzgFO.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DvV03Ayk.js → index-hZ0Eyrrw.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-CPrcB1TC.js → initDefaultProps-CG99CcR4.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BQ7mWRh_.js → motion-Z7MH0_0G.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-CzOEq99p.js → move-BX67lOdq.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-BlQI5jrw.js → mtc-parser-CmAbG1fE.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-DlW4gxmv.js → omit-DiU5tI1_.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-BBYms5nP.js → pickAttrs-BGfvLrYL.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-az2MPJ_7.js → placementArrow-CggLEgaJ.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-D1-ibEol.js → responsiveObserve-t3nlghPZ.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-DHGqa4GA.js → slide-BkV4dL9s.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-CYGDo6lD.js → statusUtils-qec1PUoC.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-Cl2EM9K6.js → styleChecker-ChjX6T8D.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-DdYhzuv1.js → useFlexGapSupport-B1jLoZcM.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-DWumPuBW.js → useFs-C3X53s4E.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-DxAO-Aqi.js → usePersonalDataHub-DOvbbnkZ.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-CplsQf_N.js → vnode-Ie0TEVFT.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-Cw5HXNSG.js → zoom-CRUMVS8l.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +3 -3
  152. package/src/commands/agent.js +18 -1
  153. package/src/commands/evolution-benchmark.js +72 -0
  154. package/src/commands/evolution.js +2 -0
  155. package/src/commands/governed-skill-marketplace.js +142 -0
  156. package/src/commands/marketplace.js +4 -1
  157. package/src/commands/serve.js +41 -0
  158. package/src/commands/skill.js +3 -0
  159. package/src/data/changelog.json +39 -0
  160. package/src/gateways/ws/ws-agent-handler.js +59 -2
  161. package/src/gateways/ws/ws-server.js +2 -0
  162. package/src/harness/golden-transcript.js +1 -0
  163. package/src/harness/prompt-compressor.js +51 -5
  164. package/src/harness/provider-backed-compaction.js +28 -1
  165. package/src/harness/remote-session-registry.js +15 -3
  166. package/src/index.js +30 -4
  167. package/src/lazy-dispatch.js +15 -1
  168. package/src/lib/advisor-runtime.js +55 -2
  169. package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
  170. package/src/lib/app-server/graph-runtime.js +32 -0
  171. package/src/lib/app-server/server.js +45 -1
  172. package/src/lib/app-server/websocket-transport.js +23 -0
  173. package/src/lib/autonomous-agent.js +63 -13
  174. package/src/lib/cowork/ab-comparator-cli.js +4 -3
  175. package/src/lib/cowork/debate-review-cli.js +4 -3
  176. package/src/lib/cowork/decision-kb-cli.js +5 -0
  177. package/src/lib/cowork-adapter.js +38 -16
  178. package/src/lib/evolution/agent-evolution-ingress.js +95 -15
  179. package/src/lib/evolution/agent-evolution-runtime-composition.js +82 -0
  180. package/src/lib/evolution/agent-evolution-session-lifecycle.js +46 -0
  181. package/src/lib/evolution/agent-model-projection.js +217 -0
  182. package/src/lib/evolution/bounded-descriptor-read.js +29 -0
  183. package/src/lib/evolution/controlled-skill-pilot-ledger-adapter.js +551 -0
  184. package/src/lib/evolution/controlled-skill-production-pilot.js +308 -18
  185. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +10 -1
  186. package/src/lib/evolution/evidence-json-text.js +236 -0
  187. package/src/lib/evolution/evolution-artifact-ports.js +202 -21
  188. package/src/lib/evolution/evolution-deployment-loader.js +369 -0
  189. package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +373 -0
  190. package/src/lib/evolution/evolution-eval-gate.js +14 -1
  191. package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +14 -0
  192. package/src/lib/evolution/evolution-eval-process-supervisor.js +607 -0
  193. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +14 -1
  194. package/src/lib/evolution/evolution-evidence-projector.js +240 -37
  195. package/src/lib/evolution/evolution-file-witness.js +153 -30
  196. package/src/lib/evolution/evolution-ledger-ports.js +1027 -66
  197. package/src/lib/evolution/evolution-ledger.js +66 -2
  198. package/src/lib/evolution/evolution-raw-crypto-shred.js +29 -15
  199. package/src/lib/evolution/evolution-raw-deletion-ledger-adapter.js +865 -0
  200. package/src/lib/evolution/evolution-release-train-domain-stages.js +769 -0
  201. package/src/lib/evolution/evolution-release-train-ledger-adapter.js +335 -0
  202. package/src/lib/evolution/evolution-release-train-stage-output-ledger-adapter.js +333 -0
  203. package/src/lib/evolution/evolution-release-train.js +586 -0
  204. package/src/lib/evolution/evolution-workbench-batch-executor.js +101 -144
  205. package/src/lib/evolution/evolution-workbench-control-ports.js +203 -0
  206. package/src/lib/evolution/evolution-workbench-file-resources.js +403 -0
  207. package/src/lib/evolution/evolution-workbench-projection.js +152 -25
  208. package/src/lib/evolution/evolution-workbench-registry-source.js +482 -0
  209. package/src/lib/evolution/evolution-workbench-review-ledger-adapter.js +823 -0
  210. package/src/lib/evolution/evolution-workbench-review-protocol.js +157 -0
  211. package/src/lib/evolution/evolution-workbench-rollback-authorization.js +57 -0
  212. package/src/lib/evolution/evolution-workbench-rollback-ledger-adapter.js +1016 -0
  213. package/src/lib/evolution/evolution-workbench-runtime.js +133 -0
  214. package/src/lib/evolution/evolution-workbench-version-control.js +70 -36
  215. package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +736 -0
  216. package/src/lib/evolution/governed-knowledge-artifact-lifecycle.js +364 -0
  217. package/src/lib/evolution/governed-knowledge-candidate-rejection.js +343 -0
  218. package/src/lib/evolution/governed-knowledge-dependency-authority.js +227 -44
  219. package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +95 -83
  220. package/src/lib/evolution/governed-knowledge-merge-ledger-executor.js +29 -2
  221. package/src/lib/evolution/governed-knowledge-merge-publisher-authority.js +31 -3
  222. package/src/lib/evolution/governed-knowledge-record.js +148 -0
  223. package/src/lib/evolution/governed-knowledge-revocation-record.js +135 -0
  224. package/src/lib/evolution/governed-knowledge-skill-rollback.js +475 -0
  225. package/src/lib/evolution/governed-knowledge-sync-ledger-adapter.js +92 -6
  226. package/src/lib/evolution/governed-knowledge-sync-merge-publisher.js +57 -4
  227. package/src/lib/evolution/governed-knowledge-sync.js +332 -99
  228. package/src/lib/evolution/governed-knowledge-wiki-tombstone.js +462 -0
  229. package/src/lib/evolution/governed-skill-marketplace-badge.js +208 -0
  230. package/src/lib/evolution/governed-skill-marketplace-candidate.js +330 -0
  231. package/src/lib/evolution/governed-skill-marketplace-cli-host.js +308 -0
  232. package/src/lib/evolution/governed-skill-marketplace-ledger-adapter.js +420 -0
  233. package/src/lib/evolution/governed-skill-marketplace.js +288 -5
  234. package/src/lib/evolution/governed-wiki-pruning-journal.js +302 -0
  235. package/src/lib/evolution/governed-wiki-pruning-ledger-adapter.js +459 -0
  236. package/src/lib/evolution/governed-wiki-pruning-maintenance.js +576 -0
  237. package/src/lib/evolution/governed-wiki-pruning-plan-authority.js +169 -0
  238. package/src/lib/evolution/governed-wiki-pruning-raw-shred.js +207 -0
  239. package/src/lib/evolution/governed-wiki-pruning-retrieval.js +587 -0
  240. package/src/lib/evolution/governed-wiki-pruning-runtime.js +153 -0
  241. package/src/lib/evolution/governed-wiki-pruning-skill-rollback.js +360 -0
  242. package/src/lib/evolution/governed-wiki-pruning.js +322 -143
  243. package/src/lib/evolution/independent-skill-revocation-source.js +231 -0
  244. package/src/lib/evolution/knowledge-wiki-source-admission.js +124 -0
  245. package/src/lib/evolution/knowledge-wiki-source-provenance.js +359 -0
  246. package/src/lib/evolution/progressive-canary-external-watchdog.js +578 -0
  247. package/src/lib/evolution/progressive-canary-traffic-worker.js +628 -0
  248. package/src/lib/evolution/progressive-canary-watchdog-file-store.js +285 -0
  249. package/src/lib/evolution/progressive-canary-watchdog-node-pki.js +265 -0
  250. package/src/lib/evolution/skill-candidate-registry.js +22 -0
  251. package/src/lib/evolution/skill-promotion-controller.js +25 -0
  252. package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +100 -0
  253. package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +131 -2
  254. package/src/lib/evolution/skill-release-registry.js +25 -4
  255. package/src/lib/evolution/skill-retrieval-revocation-authority.js +361 -0
  256. package/src/lib/evolution/skill-retrieval-revocation-ledger-adapter.js +346 -0
  257. package/src/lib/evolution/skill-revocation-propagation.js +467 -0
  258. package/src/lib/evolution/skill-target-matrix-eval.js +162 -11
  259. package/src/lib/evolution/skill-wiki-reconciliation.js +985 -0
  260. package/src/lib/evolution/skill-writer-inventory-manifest.js +15 -12
  261. package/src/lib/evolution/statistical-progressive-canary.js +845 -0
  262. package/src/lib/evolution/structured-memory-agent-control-plane.js +120 -0
  263. package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +5 -1
  264. package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +126 -0
  265. package/src/lib/evolution/wiki-informed-skill-proposer.js +127 -21
  266. package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +760 -100
  267. package/src/lib/evolution/wiki-revision-protocol.js +120 -0
  268. package/src/lib/evolution/wiki-skill-proposal-ledger-adapter.js +307 -0
  269. package/src/lib/evolution/wiki-target-tombstone-revision.js +101 -0
  270. package/src/lib/evolution/wikiskill-benchmark-cli-host.js +178 -0
  271. package/src/lib/evolution/wikiskill-benchmark-execution-host.js +702 -0
  272. package/src/lib/evolution/wikiskill-benchmark-ledger-adapter.js +613 -0
  273. package/src/lib/evolution/wikiskill-benchmark.js +574 -0
  274. package/src/lib/goal-assess.js +17 -10
  275. package/src/lib/interactive-planner.js +9 -1
  276. package/src/lib/iteration-budget.js +16 -2
  277. package/src/lib/micro-compact.js +4 -1
  278. package/src/lib/model-failure-policy.js +21 -0
  279. package/src/lib/process-execution-broker/index.js +1 -0
  280. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  281. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  282. package/src/lib/process-execution-broker/windows-sandbox.cs +33 -15
  283. package/src/lib/read-file-page.js +191 -0
  284. package/src/lib/runnable-provider.js +2 -1
  285. package/src/lib/session-host-lease.js +11 -16
  286. package/src/lib/skill-retrieval-router.js +22 -1
  287. package/src/repl/agent-repl.js +127 -33
  288. package/src/runtime/agent-core.js +224 -80
  289. package/src/runtime/agent-runtime.js +43 -0
  290. package/src/runtime/coding-agent-contract-shared.cjs +7 -1
  291. package/src/runtime/fallback-model.js +143 -62
  292. package/src/runtime/headless-runner.js +54 -10
  293. package/src/runtime/headless-stream.js +53 -6
  294. package/src/runtime/runtime-factory.js +41 -2
  295. package/src/assets/web-panel/assets/Notes-CgU9DDo9.js +0 -7
  296. package/src/assets/web-panel/assets/OrderTableRenderer-CwHc15Zs.js +0 -1
  297. package/src/assets/web-panel/assets/Projects-FF_thRi6.js +0 -1
  298. package/src/assets/web-panel/assets/SpeechSettings-l7ox6KuX.js +0 -1
  299. package/src/assets/web-panel/assets/devWarning-DyhgpXPf.js +0 -1
  300. package/src/assets/web-panel/assets/index-Ck1jhFE0.js +0 -1
  301. package/src/assets/web-panel/assets/index-c8jJEHVs.js +0 -1
@@ -0,0 +1,364 @@
1
+ import { types as utilTypes } from "node:util";
2
+
3
+ import evolvableArtifactProtocol from "@chainlesschain/session-core/evolvable-artifact";
4
+
5
+ import {
6
+ isEvolvableArtifactReleaseResolver,
7
+ isEvolvableArtifactTransitionReader,
8
+ } from "./evolvable-artifact-ledger-adapter.js";
9
+ import { verifyGovernedKnowledgeRecord } from "./governed-knowledge-sync.js";
10
+
11
+ const {
12
+ ARTIFACT_TYPE,
13
+ createEvolvableArtifactReceipt,
14
+ digestEvolvableArtifactValue,
15
+ isEvolvableArtifactCandidateGate,
16
+ isEvolvableArtifactReleaseGate,
17
+ } = evolvableArtifactProtocol;
18
+
19
+ export const GOVERNED_KNOWLEDGE_ARTIFACT_LIFECYCLE_SCHEMA =
20
+ "chainlesschain.governed-knowledge-artifact-lifecycle/v1";
21
+
22
+ const LIFECYCLES = new WeakSet();
23
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
24
+ const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
25
+ const OPERATIONS = new Set(["publish", "receive", "merge"]);
26
+
27
+ function freeze(value) {
28
+ const result = structuredClone(value);
29
+ function visit(entry) {
30
+ if (entry && typeof entry === "object" && !Object.isFrozen(entry)) {
31
+ Object.freeze(entry);
32
+ for (const child of Object.values(entry)) visit(child);
33
+ }
34
+ }
35
+ visit(result);
36
+ return result;
37
+ }
38
+
39
+ function capture(owner, method, label) {
40
+ if (
41
+ !owner ||
42
+ typeof owner !== "object" ||
43
+ utilTypes.isProxy(owner) ||
44
+ typeof owner[method] !== "function"
45
+ )
46
+ throw new TypeError(`${label}.${method}() is required`);
47
+ return (...args) => Reflect.apply(owner[method], owner, args);
48
+ }
49
+
50
+ function manifest(body) {
51
+ return freeze({ ...body, digest: digestEvolvableArtifactValue(body) });
52
+ }
53
+
54
+ function receipt(artifact, kind, issuedAt, operationDigest, claims) {
55
+ return createEvolvableArtifactReceipt({
56
+ kind,
57
+ tenantId: artifact.tenantId,
58
+ artifactId: artifact.artifactId,
59
+ candidateId: artifact.candidate.candidateId,
60
+ contentDigest: artifact.contentDigest,
61
+ dependencyLockDigest: artifact.dependencyLock.digest,
62
+ issuerId: `governed-knowledge-lifecycle:${kind}`,
63
+ issuerRevision: "v1",
64
+ issuedAt,
65
+ decision: "allow",
66
+ claims: { operationDigest, ...claims },
67
+ });
68
+ }
69
+
70
+ export function createGovernedKnowledgeArtifactLifecycle({
71
+ tenantId,
72
+ artifactCandidateGate,
73
+ artifactReleaseGate,
74
+ artifactReleaseResolver,
75
+ verifierArtifactTransitionReader,
76
+ } = {}) {
77
+ if (typeof tenantId !== "string" || tenantId.trim() === "")
78
+ throw new TypeError("tenantId is required");
79
+ if (
80
+ !isEvolvableArtifactCandidateGate(
81
+ artifactCandidateGate,
82
+ ARTIFACT_TYPE.KNOWLEDGE,
83
+ ) ||
84
+ artifactCandidateGate.tenantId !== tenantId
85
+ )
86
+ throw new TypeError("a tenant-bound Knowledge candidate gate is required");
87
+ if (
88
+ !isEvolvableArtifactReleaseGate(
89
+ artifactReleaseGate,
90
+ ARTIFACT_TYPE.KNOWLEDGE,
91
+ ) ||
92
+ artifactReleaseGate.tenantId !== tenantId ||
93
+ artifactReleaseGate.authorityScope !== artifactCandidateGate.authorityScope
94
+ )
95
+ throw new TypeError("a same-authority Knowledge release gate is required");
96
+ if (
97
+ !isEvolvableArtifactReleaseResolver(artifactReleaseResolver) ||
98
+ artifactReleaseResolver.tenantId !== tenantId
99
+ )
100
+ throw new TypeError("a tenant-bound artifact release resolver is required");
101
+ if (
102
+ !isEvolvableArtifactTransitionReader(verifierArtifactTransitionReader) ||
103
+ verifierArtifactTransitionReader.tenantId !== tenantId ||
104
+ verifierArtifactTransitionReader.readerScope ===
105
+ artifactReleaseGate.transitionReaderScope
106
+ )
107
+ throw new TypeError(
108
+ "an independent artifact transition reader is required",
109
+ );
110
+
111
+ const stageCandidate = capture(
112
+ artifactCandidateGate,
113
+ "stageCandidate",
114
+ "artifactCandidateGate",
115
+ );
116
+ const preparePromotion = capture(
117
+ artifactReleaseGate,
118
+ "preparePromotion",
119
+ "artifactReleaseGate",
120
+ );
121
+ const commitPromotion = capture(
122
+ artifactReleaseGate,
123
+ "commitPreparedPromotion",
124
+ "artifactReleaseGate",
125
+ );
126
+ const resolveDependency = capture(
127
+ artifactReleaseResolver,
128
+ "resolveDependency",
129
+ "artifactReleaseResolver",
130
+ );
131
+ const readTransition = capture(
132
+ verifierArtifactTransitionReader,
133
+ "readTransition",
134
+ "verifierArtifactTransitionReader",
135
+ );
136
+ const preparedHandles = new WeakSet();
137
+
138
+ async function resolveOne(dependency) {
139
+ const resolved = await resolveDependency({ tenantId, ...dependency });
140
+ if (
141
+ resolved?.authenticated !== true ||
142
+ resolved.durable !== true ||
143
+ resolved.tenantId !== tenantId ||
144
+ resolved.sourceKind !== dependency.kind ||
145
+ resolved.sourceDigest !== dependency.digest ||
146
+ resolved.sourceDisposition !== dependency.disposition ||
147
+ !DIGEST.test(resolved.artifactDigest ?? "")
148
+ )
149
+ throw new Error("Knowledge artifact dependency resolution is invalid");
150
+ return {
151
+ artifactId: resolved.artifactId,
152
+ type: resolved.type,
153
+ releaseId: resolved.releaseId,
154
+ contentDigest: resolved.contentDigest,
155
+ };
156
+ }
157
+
158
+ async function resolveBaseline(currentKnowledge) {
159
+ if (currentKnowledge === null) return null;
160
+ const resolved = await resolveOne({
161
+ kind: "active-knowledge",
162
+ digest: currentKnowledge.contentDigest,
163
+ disposition: "baseline",
164
+ });
165
+ if (resolved.artifactId !== currentKnowledge.knowledgeId)
166
+ throw new Error("Knowledge typed baseline resolved another artifact");
167
+ return resolved;
168
+ }
169
+
170
+ const lifecycle = Object.freeze({
171
+ schema: GOVERNED_KNOWLEDGE_ARTIFACT_LIFECYCLE_SCHEMA,
172
+ tenantId,
173
+ async prepare({
174
+ knowledge: knowledgeInput,
175
+ currentKnowledge: currentInput = null,
176
+ operation,
177
+ operationId,
178
+ authorizationReceiptDigest,
179
+ evidenceDigest = null,
180
+ issuedAt,
181
+ activate = true,
182
+ humanReviewed = false,
183
+ } = {}) {
184
+ if (!OPERATIONS.has(operation))
185
+ throw new TypeError("Knowledge lifecycle operation is invalid");
186
+ if (!ID.test(operationId ?? ""))
187
+ throw new TypeError("Knowledge lifecycle operationId is required");
188
+ if (!DIGEST.test(authorizationReceiptDigest ?? ""))
189
+ throw new TypeError("authorizationReceiptDigest is invalid");
190
+ if (!Number.isFinite(Date.parse(issuedAt)))
191
+ throw new TypeError("Knowledge lifecycle issuedAt is invalid");
192
+ const boundEvidenceDigest = evidenceDigest ?? authorizationReceiptDigest;
193
+ if (
194
+ !DIGEST.test(boundEvidenceDigest) ||
195
+ typeof humanReviewed !== "boolean"
196
+ )
197
+ throw new TypeError("Knowledge lifecycle evidence is invalid");
198
+ const knowledge = verifyGovernedKnowledgeRecord(knowledgeInput, {
199
+ tenantId,
200
+ });
201
+ const currentKnowledge =
202
+ currentInput === null
203
+ ? null
204
+ : verifyGovernedKnowledgeRecord(currentInput, { tenantId });
205
+ if (
206
+ currentKnowledge !== null &&
207
+ (currentKnowledge.knowledgeId !== knowledge.knowledgeId ||
208
+ currentKnowledge.scope !== knowledge.scope ||
209
+ currentKnowledge.scopeId !== knowledge.scopeId)
210
+ )
211
+ throw new Error("Knowledge lifecycle baseline boundary changed");
212
+ const baseline = await resolveBaseline(currentKnowledge);
213
+ const dependencies = [];
214
+ if (knowledge.action === "upsert") {
215
+ for (const dependency of knowledge.dependencies)
216
+ dependencies.push(await resolveOne(dependency));
217
+ }
218
+ dependencies.sort((left, right) =>
219
+ left.artifactId.localeCompare(right.artifactId),
220
+ );
221
+ const dependencyLock = {
222
+ dependencies,
223
+ digest: digestEvolvableArtifactValue({ dependencies }),
224
+ };
225
+ const operationCore = {
226
+ tenantId,
227
+ operation,
228
+ operationId,
229
+ knowledgeId: knowledge.knowledgeId,
230
+ contentDigest: knowledge.contentDigest,
231
+ currentContentDigest: currentKnowledge?.contentDigest ?? null,
232
+ authorizationReceiptDigest,
233
+ evidenceDigest: boundEvidenceDigest,
234
+ humanReviewed,
235
+ };
236
+ const operationDigest = digestEvolvableArtifactValue(operationCore);
237
+ const staged = await stageCandidate({
238
+ tenantId,
239
+ artifactId: knowledge.knowledgeId,
240
+ type: ARTIFACT_TYPE.KNOWLEDGE,
241
+ contentDigest: knowledge.contentDigest,
242
+ parent:
243
+ baseline === null
244
+ ? null
245
+ : {
246
+ artifactId: baseline.artifactId,
247
+ releaseId: baseline.releaseId,
248
+ contentDigest: baseline.contentDigest,
249
+ },
250
+ lineage: [
251
+ ...(currentKnowledge ? [currentKnowledge.contentDigest] : []),
252
+ knowledge.contentDigest,
253
+ ],
254
+ dependencyLock,
255
+ runtimeManifest: manifest({
256
+ executable: false,
257
+ operation,
258
+ operationId,
259
+ operationDigest,
260
+ action: knowledge.action,
261
+ scope: knowledge.scope,
262
+ scopeId: knowledge.scopeId,
263
+ vectorClock: knowledge.vectorClock,
264
+ dependencyDispositionDigest: digestEvolvableArtifactValue(
265
+ knowledge.dependencies,
266
+ ),
267
+ }),
268
+ permissionManifest: manifest({
269
+ authorizationReceiptDigest,
270
+ approvalReceiptDigest: knowledge.approvalReceiptDigest,
271
+ revocationReceiptDigest: knowledge.revocationReceiptDigest,
272
+ capabilities: [`knowledge:${knowledge.scope}:${operation}`],
273
+ }),
274
+ candidateId: `knowledge-candidate:${operationDigest.slice(7)}`,
275
+ activeReleaseId: baseline?.releaseId ?? null,
276
+ lastKnownGoodReleaseId: null,
277
+ });
278
+ const promotion = activate
279
+ ? preparePromotion({
280
+ artifact: staged.artifact,
281
+ candidatePersistenceReceipt: staged.receipt,
282
+ evaluationReceipt: receipt(
283
+ staged.artifact,
284
+ "eval",
285
+ issuedAt,
286
+ operationDigest,
287
+ { authorizationReceiptDigest },
288
+ ),
289
+ reviewReceipt: receipt(
290
+ staged.artifact,
291
+ "review",
292
+ issuedAt,
293
+ operationDigest,
294
+ {
295
+ approvalReceiptDigest: knowledge.approvalReceiptDigest,
296
+ automated: !humanReviewed,
297
+ evidenceDigest: boundEvidenceDigest,
298
+ },
299
+ ),
300
+ promotionReceipt: receipt(
301
+ staged.artifact,
302
+ "promotion",
303
+ issuedAt,
304
+ operationDigest,
305
+ { operationId },
306
+ ),
307
+ releaseId: `knowledge-release:${operationDigest.slice(7)}`,
308
+ })
309
+ : null;
310
+ const prepared = Object.freeze({
311
+ operationDigest,
312
+ operation,
313
+ operationId,
314
+ candidate: staged,
315
+ promotion,
316
+ activate,
317
+ });
318
+ preparedHandles.add(prepared);
319
+ return prepared;
320
+ },
321
+ async commit(prepared) {
322
+ if (!preparedHandles.has(prepared))
323
+ throw new TypeError(
324
+ "a prepared Knowledge lifecycle handle is required",
325
+ );
326
+ if (!prepared.activate)
327
+ return freeze({
328
+ candidateOnly: true,
329
+ artifactCandidateDigest: prepared.candidate.artifact.artifactDigest,
330
+ operationDigest: prepared.operationDigest,
331
+ });
332
+ const committed = await commitPromotion(prepared.promotion);
333
+ const readback = await readTransition({
334
+ operationId: committed.receipt.operationId,
335
+ });
336
+ if (
337
+ readback?.request?.previousArtifactDigest !==
338
+ prepared.candidate.artifact.artifactDigest ||
339
+ readback.request.nextArtifactDigest !==
340
+ committed.artifact.artifactDigest ||
341
+ readback.artifact.artifactDigest !==
342
+ committed.artifact.artifactDigest ||
343
+ readback.receipt.receiptDigest !== committed.receipt.receiptDigest ||
344
+ readback.receipt.durable !== true
345
+ )
346
+ throw new Error("Knowledge artifact transition readback is invalid");
347
+ return freeze({
348
+ candidateOnly: false,
349
+ operationDigest: prepared.operationDigest,
350
+ artifactCandidateDigest: prepared.candidate.artifact.artifactDigest,
351
+ artifactDigest: committed.artifact.artifactDigest,
352
+ artifactReleaseId: committed.artifact.activeReleaseId,
353
+ artifactTransitionOperationId: committed.receipt.operationId,
354
+ artifactTransitionReceiptDigest: committed.receipt.receiptDigest,
355
+ });
356
+ },
357
+ });
358
+ LIFECYCLES.add(lifecycle);
359
+ return lifecycle;
360
+ }
361
+
362
+ export function isGovernedKnowledgeArtifactLifecycle(value) {
363
+ return LIFECYCLES.has(value);
364
+ }
@@ -0,0 +1,343 @@
1
+ import { captureSkillCandidateRegistryReader } from "./skill-candidate-registry.js";
2
+ import { captureSkillReleaseRegistryReader } from "./skill-release-registry.js";
3
+ import { captureSkillReleaseOperationReader } from "./evolution-ledger-ports.js";
4
+ import { captureWikiRevisionReader } from "./wiki-maintainer-ledger-adapter.js";
5
+ import { governedKnowledgeSourceRef } from "./governed-knowledge-skill-rollback.js";
6
+ import {
7
+ createGovernedKnowledgeDependencyAuthority,
8
+ GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA,
9
+ digestGovernedKnowledgeDependencyResult,
10
+ } from "./governed-knowledge-dependency-authority.js";
11
+ import {
12
+ capturePruningData as captureData,
13
+ pruningDigest as digest,
14
+ pruningCanonical as canonical,
15
+ } from "./governed-wiki-pruning-journal.js";
16
+
17
+ const VERIFICATION_SCHEMA =
18
+ "chainlesschain.knowledge-candidate-rejection-verification/v1";
19
+ const QUARANTINE_VERIFICATION_SCHEMA =
20
+ "chainlesschain.knowledge-candidate-quarantine-verification/v1";
21
+ function fail(message) {
22
+ throw new Error(`knowledge candidate disposition: ${message}`);
23
+ }
24
+
25
+ function bindReader(
26
+ candidateRegistry,
27
+ releaseRegistry,
28
+ transactionLedger,
29
+ tenantId,
30
+ wikiAdapter,
31
+ ) {
32
+ const candidates = captureSkillCandidateRegistryReader(candidateRegistry);
33
+ const releases = captureSkillReleaseRegistryReader(releaseRegistry);
34
+ if (
35
+ candidates.tenantId !== tenantId ||
36
+ releases.tenantId !== tenantId ||
37
+ !releases.matchesTransactionLedger(transactionLedger)
38
+ ) {
39
+ throw new TypeError(
40
+ "candidate rejection registry/ledger tenant binding differs",
41
+ );
42
+ }
43
+ const operations = captureSkillReleaseOperationReader(transactionLedger);
44
+ const wiki =
45
+ wikiAdapter == null ? null : captureWikiRevisionReader(wikiAdapter);
46
+ if (
47
+ wiki &&
48
+ (wiki.descriptor.tenantId !== tenantId ||
49
+ !operations.matchesWikiAdapter(wikiAdapter))
50
+ )
51
+ throw new TypeError("candidate Wiki tenant differs");
52
+ return Object.freeze({ candidates, releases, operations, wiki });
53
+ }
54
+
55
+ function sourceProof(reader, candidate, request, admission) {
56
+ const ref = governedKnowledgeSourceRef(request);
57
+ const direct = candidate.sourceEvidenceRefs.some(
58
+ (entry) => entry.ref === ref && entry.digest === request.contentDigest,
59
+ );
60
+ let wiki = null;
61
+ if (candidate.derivationMode === "wiki") {
62
+ if (!reader.wiki)
63
+ fail("Wiki-derived candidate requires an authenticated Wiki reader");
64
+ const revision = reader.wiki.readKnowledgeProvenance({
65
+ tenantId: request.tenantId,
66
+ revisionId: candidate.wikiRevision,
67
+ knowledgeId: request.knowledgeId,
68
+ contentDigest: request.contentDigest,
69
+ });
70
+ if (
71
+ ["epoch", "ledgerId", "identityDigest"].some(
72
+ (key) => revision.checkpoint[key] !== admission.checkpoint[key],
73
+ ) ||
74
+ revision.checkpoint.sequence >= admission.fence.sequence ||
75
+ admission.history.some(
76
+ (entry) => revision.checkpoint.sequence >= entry.preparationSequence,
77
+ )
78
+ ) {
79
+ fail(
80
+ "Wiki provenance must precede revocation and every original promotion",
81
+ );
82
+ }
83
+ wiki = {
84
+ revisionId: revision.revisionId,
85
+ stateDigest: revision.stateDigest,
86
+ checkpoint: revision.checkpoint,
87
+ affectedPatternIds: revision.affectedPatternIds,
88
+ };
89
+ }
90
+ if (!direct && !wiki?.affectedPatternIds.length)
91
+ fail("candidate source lineage does not identify the revoked Knowledge");
92
+ return captureData({ direct, wiki });
93
+ }
94
+
95
+ function prove(reader, request, context, disposition) {
96
+ if (
97
+ request.dependency.kind !== "candidate" ||
98
+ request.dependency.disposition !== disposition
99
+ ) {
100
+ fail(`this provider requires a candidate / ${disposition} dependency`);
101
+ }
102
+ const candidate = reader.candidates.read(request.dependency.digest);
103
+ if (
104
+ candidate.tenantId !== request.tenantId ||
105
+ candidate.candidateId !== request.dependency.digest
106
+ )
107
+ fail("candidate identity differs");
108
+ const resolve =
109
+ disposition === "quarantine"
110
+ ? reader.operations.resolveCandidateQuarantine
111
+ : reader.operations.resolveCandidateRevocation;
112
+ const admission = resolve({
113
+ tenantId: request.tenantId,
114
+ skillName: candidate.skillName,
115
+ candidateId: candidate.candidateId,
116
+ operationDigest: request.operationDigest,
117
+ context,
118
+ });
119
+ if (!admission.fence || admission.fence.record.deviceId !== request.deviceId)
120
+ fail("no exact durable candidate admission fence");
121
+ const knowledge = admission.fence.record.knowledge;
122
+ for (const key of [
123
+ "tenantId",
124
+ "knowledgeId",
125
+ "action",
126
+ "contentDigest",
127
+ "revocationReceiptDigest",
128
+ ]) {
129
+ if (knowledge[key] !== request[key])
130
+ fail("prepared revocation differs from request");
131
+ }
132
+ if (admission.pendingTransactions.length)
133
+ fail(
134
+ "in-flight release transition requires recovery before candidate disposition can settle",
135
+ );
136
+ const active = reader.releases.readActive(candidate.skillName);
137
+ if (
138
+ Boolean(active) !== Boolean(admission.current) ||
139
+ (active &&
140
+ (active.release.releaseDigest !== admission.current.releaseDigest ||
141
+ active.state.stateDigest !== admission.current.stateDigest ||
142
+ active.state.revision !== admission.current.revision ||
143
+ admission.current.projection.current !== true))
144
+ )
145
+ fail("actual active state differs from authenticated release history");
146
+ let lastKnownGood = null;
147
+ if (active) {
148
+ lastKnownGood = reader.releases.readRelease(
149
+ active.state.lastKnownGoodReleaseDigest,
150
+ );
151
+ if (
152
+ active.release.candidate.candidateId === candidate.candidateId ||
153
+ lastKnownGood.candidate.candidateId === candidate.candidateId
154
+ ) {
155
+ fail(
156
+ "active or rollback-eligible candidate requires real release rollback first",
157
+ );
158
+ }
159
+ }
160
+ const source = sourceProof(reader, candidate, request, admission);
161
+ if (canonical(reader.operations.currentContext()) !== canonical(context))
162
+ fail("ledger changed during candidate verification");
163
+ return captureData({
164
+ candidateId: candidate.candidateId,
165
+ skillName: candidate.skillName,
166
+ source,
167
+ admission,
168
+ active: active
169
+ ? {
170
+ releaseDigest: active.release.releaseDigest,
171
+ stateDigest: active.state.stateDigest,
172
+ lastKnownGoodReleaseDigest: lastKnownGood.releaseDigest,
173
+ }
174
+ : null,
175
+ });
176
+ }
177
+
178
+ export function createGovernedKnowledgeCandidateRejectionAuthority(
179
+ options = {},
180
+ ) {
181
+ return createCandidateDispositionAuthority(options, "reject-candidate");
182
+ }
183
+
184
+ // Quarantine is a distinct, persistent admission disposition, not rejection or
185
+ // a draft-label rewrite. Neither factory may certify an active/LKG candidate.
186
+ export function createGovernedKnowledgeCandidateQuarantineAuthority(
187
+ options = {},
188
+ ) {
189
+ return createCandidateDispositionAuthority(options, "quarantine");
190
+ }
191
+
192
+ function createCandidateDispositionAuthority(
193
+ {
194
+ tenantId,
195
+ deviceId,
196
+ candidateRegistry,
197
+ releaseRegistry,
198
+ transactionLedger,
199
+ verifierCandidateRegistry,
200
+ verifierReleaseRegistry,
201
+ verifierTransactionLedger,
202
+ wikiLedgerAdapter = null,
203
+ verifierWikiLedgerAdapter = null,
204
+ providerDescriptor,
205
+ verifierDescriptor,
206
+ },
207
+ disposition,
208
+ ) {
209
+ if (
210
+ candidateRegistry === verifierCandidateRegistry ||
211
+ releaseRegistry === verifierReleaseRegistry ||
212
+ transactionLedger === verifierTransactionLedger ||
213
+ (wikiLedgerAdapter !== null &&
214
+ wikiLedgerAdapter === verifierWikiLedgerAdapter) ||
215
+ Boolean(wikiLedgerAdapter) !== Boolean(verifierWikiLedgerAdapter)
216
+ ) {
217
+ throw new TypeError(
218
+ "candidate rejection requires independent fixed readers",
219
+ );
220
+ }
221
+ const provider = bindReader(
222
+ candidateRegistry,
223
+ releaseRegistry,
224
+ transactionLedger,
225
+ tenantId,
226
+ wikiLedgerAdapter,
227
+ );
228
+ const verifier = bindReader(
229
+ verifierCandidateRegistry,
230
+ verifierReleaseRegistry,
231
+ verifierTransactionLedger,
232
+ tenantId,
233
+ verifierWikiLedgerAdapter,
234
+ );
235
+ const providerHead = provider.operations.currentContext().checkpoint;
236
+ const verifierHead = verifier.operations.currentContext().checkpoint;
237
+ if (
238
+ ["epoch", "ledgerId", "identityDigest"].some(
239
+ (key) => providerHead[key] !== verifierHead[key],
240
+ )
241
+ ) {
242
+ throw new TypeError(
243
+ "candidate rejection readers belong to different ledgers",
244
+ );
245
+ }
246
+ if (
247
+ provider.wiki &&
248
+ canonical(provider.wiki.descriptor) !== canonical(verifier.wiki.descriptor)
249
+ )
250
+ throw new TypeError("candidate Wiki reader scopes differ");
251
+ const providerIdentity = captureData(providerDescriptor);
252
+ const verifierIdentity = captureData(verifierDescriptor);
253
+ function proofPair(request) {
254
+ const context = provider.operations.currentContext();
255
+ const other = verifier.operations.currentContext();
256
+ if (canonical(context) !== canonical(other))
257
+ fail("independent readers do not authenticate the same current ledger");
258
+ const left = prove(provider, request, context, disposition);
259
+ const right = prove(verifier, request, context, disposition);
260
+ if (canonical(left) !== canonical(right))
261
+ fail("independent candidate rejection proof differs");
262
+ return left;
263
+ }
264
+ return createGovernedKnowledgeDependencyAuthority({
265
+ tenantId,
266
+ deviceId,
267
+ providerDescriptor: providerIdentity,
268
+ verifierDescriptor: verifierIdentity,
269
+ provider: Object.freeze({
270
+ async apply(request) {
271
+ // Preparation already activated the mandatory admission fence. This
272
+ // authority certifies its real effect; it never changes a draft label
273
+ // or reports success while an active/in-flight version can survive.
274
+ const proof = proofPair(request);
275
+ const evidence = proof.admission.fence.evidence;
276
+ const core = {
277
+ schema: GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA,
278
+ tenantId,
279
+ deviceId,
280
+ operationId: request.operationId,
281
+ requestDigest: request.requestDigest,
282
+ knowledgeId: request.knowledgeId,
283
+ revocationReceiptDigest: request.revocationReceiptDigest,
284
+ dependencyKind: request.dependency.kind,
285
+ dependencyDigest: request.dependency.digest,
286
+ dependencyDisposition: request.dependency.disposition,
287
+ authorityId: providerIdentity.authorityId,
288
+ authorityRevision: providerIdentity.revision,
289
+ handlerArtifactDigest: providerIdentity.handlerArtifactDigest,
290
+ applied: true,
291
+ durable: true,
292
+ idempotent: true,
293
+ appliedAt: evidence.timestamp,
294
+ };
295
+ const { algorithm, keyId, value } = evidence.signature;
296
+ return captureData({
297
+ ...core,
298
+ resultDigest: digestGovernedKnowledgeDependencyResult(core),
299
+ attestation: { algorithm, keyId, value },
300
+ });
301
+ },
302
+ }),
303
+ verifier: Object.freeze({
304
+ async verify({ request, result }) {
305
+ const proof = proofPair(request);
306
+ const evidence = proof.admission.fence.evidence;
307
+ const { algorithm, keyId, value } = evidence.signature;
308
+ if (
309
+ result.appliedAt !== evidence.timestamp ||
310
+ canonical(result.attestation) !==
311
+ canonical({ algorithm, keyId, value })
312
+ )
313
+ fail("result differs from authenticated admission fence");
314
+ return captureData({
315
+ authenticated: true,
316
+ durable: true,
317
+ tenantId,
318
+ deviceId,
319
+ operationId: request.operationId,
320
+ requestDigest: request.requestDigest,
321
+ resultDigest: result.resultDigest,
322
+ providerAuthorityId: providerIdentity.authorityId,
323
+ providerRevision: providerIdentity.revision,
324
+ verifierAuthorityId: verifierIdentity.authorityId,
325
+ verifierRevision: verifierIdentity.revision,
326
+ verificationReceiptDigest: digest(
327
+ disposition === "quarantine"
328
+ ? QUARANTINE_VERIFICATION_SCHEMA
329
+ : VERIFICATION_SCHEMA,
330
+ {
331
+ tenantId,
332
+ deviceId,
333
+ requestDigest: request.requestDigest,
334
+ resultDigest: result.resultDigest,
335
+ proof,
336
+ verifierIdentity,
337
+ },
338
+ ),
339
+ });
340
+ },
341
+ }),
342
+ });
343
+ }