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
@@ -10,6 +10,12 @@
10
10
  */
11
11
 
12
12
  import { createHash, randomBytes } from "node:crypto";
13
+ import { snapshotAgentModelRequest } from "./agent-model-projection.js";
14
+ import {
15
+ createEvidenceJsonTextBoundary,
16
+ EVIDENCE_JSON_POLICY,
17
+ isAgentToolArgumentsPath,
18
+ } from "./evidence-json-text.js";
13
19
 
14
20
  export const EVOLUTION_SOURCE_VERIFICATION_SCHEMA =
15
21
  "chainlesschain.evolution-source-verification/v1";
@@ -448,6 +454,54 @@ const RULESET_DIGEST = `sha256:${createHash("sha256")
448
454
  )
449
455
  .digest("hex")}`;
450
456
 
457
+ // A separate policy keeps existing v2 artifacts readable without changing
458
+ // their meaning/digest. Agent messages are authenticated and scanned as whole
459
+ // fields; the existing total model-content ceiling still applies. Never scan
460
+ // independent 8 KiB slices, which would miss secrets/injections at the seams.
461
+ const PREFIXED_CREDENTIAL_SOURCE =
462
+ "(?:sk|ghp|github_pat|xox[baprs])[-_][A-Za-z0-9_-]{12,}";
463
+ const EMBEDDED_CREDENTIAL_SOURCE =
464
+ "(?:sk-|ghp_|github_pat_|xox[baprs]-)[A-Za-z0-9_-]{12,}";
465
+ const AGENT_MODEL_RULESET_V1 = Object.freeze({
466
+ ...RULESET,
467
+ schema: "chainlesschain.evolution-agent-model-projection-rules/v1",
468
+ version: 1,
469
+ maxStringChars: RULESET.maxModelBytes,
470
+ maxInputBytes: 1024 * 1024,
471
+ textPolicy: "whole-field-before-budget-v1",
472
+ overflowPolicy: "reject",
473
+ embeddedCredentialPattern: EMBEDDED_CREDENTIAL_SOURCE,
474
+ });
475
+ const AGENT_MODEL_RULESET_V1_DIGEST = `sha256:${createHash("sha256")
476
+ .update(
477
+ `${AGENT_MODEL_RULESET_V1.schema}\0${JSON.stringify(AGENT_MODEL_RULESET_V1)}`,
478
+ "utf8",
479
+ )
480
+ .digest("hex")}`;
481
+ const AGENT_MODEL_RULESET = Object.freeze({
482
+ ...AGENT_MODEL_RULESET_V1,
483
+ schema: "chainlesschain.evolution-agent-model-projection-rules/v2",
484
+ version: 2,
485
+ jsonTextPolicy: EVIDENCE_JSON_POLICY,
486
+ });
487
+ export const EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_DIGEST = `sha256:${createHash(
488
+ "sha256",
489
+ )
490
+ .update(
491
+ `${AGENT_MODEL_RULESET.schema}\0${JSON.stringify(AGENT_MODEL_RULESET)}`,
492
+ "utf8",
493
+ )
494
+ .digest("hex")}`;
495
+ const SUPPORTED_RULESETS = new Map([
496
+ [RULESET_DIGEST, RULESET],
497
+ [AGENT_MODEL_RULESET_V1_DIGEST, AGENT_MODEL_RULESET_V1],
498
+ [EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_DIGEST, AGENT_MODEL_RULESET],
499
+ ]);
500
+
501
+ const PREFIXED_CREDENTIAL_PATTERN = Object.freeze({
502
+ type: "credential",
503
+ regex: new RegExp(`\\b${PREFIXED_CREDENTIAL_SOURCE}\\b`, "gu"),
504
+ });
451
505
  const VALUE_PATTERNS = Object.freeze([
452
506
  Object.freeze({
453
507
  type: "private-key",
@@ -463,10 +517,7 @@ const VALUE_PATTERNS = Object.freeze([
463
517
  regex:
464
518
  /\b(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|passwd|secret)\s*[:=]\s*["']?[A-Za-z0-9._~+/=-]{8,}["']?/giu,
465
519
  }),
466
- Object.freeze({
467
- type: "credential",
468
- regex: /\b(?:sk|ghp|github_pat|xox[baprs])[-_][A-Za-z0-9_-]{12,}\b/gu,
469
- }),
520
+ PREFIXED_CREDENTIAL_PATTERN,
470
521
  Object.freeze({
471
522
  type: "credential",
472
523
  regex: /\bAKIA[A-Z0-9]{16}\b/gu,
@@ -506,6 +557,22 @@ const VALUE_PATTERNS = Object.freeze([
506
557
  }),
507
558
  ]);
508
559
 
560
+ const AGENT_VALUE_PATTERNS = Object.freeze([
561
+ ...VALUE_PATTERNS,
562
+ Object.freeze({
563
+ type: "credential",
564
+ // Use each provider's real prefix/delimiter for embedded matches. Treating
565
+ // embedded "sk_" as a key would corrupt identifiers like ask_user_question.
566
+ regex: new RegExp(`${EMBEDDED_CREDENTIAL_SOURCE}\\b`, "gu"),
567
+ }),
568
+ ]);
569
+
570
+ function valuePatterns(ruleset) {
571
+ return ruleset === AGENT_MODEL_RULESET || ruleset === AGENT_MODEL_RULESET_V1
572
+ ? AGENT_VALUE_PATTERNS
573
+ : VALUE_PATTERNS;
574
+ }
575
+
509
576
  const REDACTION_TYPES = new Set([
510
577
  ...VALUE_PATTERNS.map(({ type }) => type),
511
578
  "pii",
@@ -689,10 +756,10 @@ function deepFreeze(value, seen = new WeakSet()) {
689
756
  return Object.freeze(value);
690
757
  }
691
758
 
692
- function assertNoKnownSecrets(content) {
759
+ function assertNoKnownSecrets(content, patterns = VALUE_PATTERNS) {
693
760
  const serialized =
694
761
  typeof content === "string" ? content : canonicalJson(content);
695
- for (const pattern of VALUE_PATTERNS) {
762
+ for (const pattern of patterns) {
696
763
  pattern.regex.lastIndex = 0;
697
764
  if (pattern.regex.test(serialized)) {
698
765
  throw projectionError(
@@ -1080,9 +1147,9 @@ function sanitizeKey(key, path, findings, injections) {
1080
1147
  return safeKey;
1081
1148
  }
1082
1149
 
1083
- function sanitizeString(value, path, findings, injections) {
1150
+ function sanitizeString(value, path, findings, injections, ruleset, patterns) {
1084
1151
  let output = value;
1085
- for (const pattern of VALUE_PATTERNS) {
1152
+ for (const pattern of patterns) {
1086
1153
  pattern.regex.lastIndex = 0;
1087
1154
  let count = 0;
1088
1155
  output = output.replace(pattern.regex, () => {
@@ -1094,7 +1161,7 @@ function sanitizeString(value, path, findings, injections) {
1094
1161
  }
1095
1162
  const securityNormalized = unicodeSecurityText(output);
1096
1163
  if (securityNormalized !== output) {
1097
- for (const pattern of VALUE_PATTERNS) {
1164
+ for (const pattern of patterns) {
1098
1165
  pattern.regex.lastIndex = 0;
1099
1166
  if (pattern.regex.test(securityNormalized)) {
1100
1167
  findings.push({
@@ -1115,25 +1182,40 @@ function sanitizeString(value, path, findings, injections) {
1115
1182
  });
1116
1183
  output = "[QUARANTINED:POTENTIAL_PROMPT_INJECTION]";
1117
1184
  }
1118
- if (output.length > RULESET.maxStringChars) {
1185
+ if (output.length > ruleset.maxStringChars) {
1186
+ if (ruleset.overflowPolicy === "reject") {
1187
+ throw projectionError(
1188
+ EVOLUTION_PROJECTION_INVALID_CODE,
1189
+ "Agent model projection exceeds the text budget",
1190
+ );
1191
+ }
1119
1192
  findings.push({
1120
1193
  type: "content-truncation",
1121
1194
  path: findingPath(path),
1122
1195
  count: 1,
1123
1196
  });
1124
- output = `${output.slice(0, RULESET.maxStringChars)}[TRUNCATED]`;
1197
+ output = `${output.slice(0, ruleset.maxStringChars)}[TRUNCATED]`;
1125
1198
  }
1126
1199
  return output;
1127
1200
  }
1128
1201
 
1129
- function sanitizePayload(payload) {
1202
+ function sanitizePayload(
1203
+ payload,
1204
+ ruleset = RULESET,
1205
+ patterns = valuePatterns(ruleset),
1206
+ ) {
1130
1207
  const findings = [];
1131
1208
  const injections = [];
1132
1209
  let nodes = 0;
1133
1210
  let truncated = false;
1134
- const visit = (value, path, depth) => {
1211
+ const jsonText = ruleset.jsonTextPolicy
1212
+ ? createEvidenceJsonTextBoundary((message) =>
1213
+ projectionError(EVOLUTION_PROJECTION_INVALID_CODE, message),
1214
+ )
1215
+ : null;
1216
+ const visit = (value, path, depth, layer = 0) => {
1135
1217
  nodes += 1;
1136
- if (nodes > RULESET.maxNodes || depth > RULESET.maxDepth) {
1218
+ if (nodes > ruleset.maxNodes || depth > ruleset.maxDepth) {
1137
1219
  truncated = true;
1138
1220
  findings.push({
1139
1221
  type: "content-truncation",
@@ -1142,8 +1224,48 @@ function sanitizePayload(payload) {
1142
1224
  });
1143
1225
  return "[TRUNCATED:CONTENT_BUDGET]";
1144
1226
  }
1145
- if (typeof value === "string")
1146
- return sanitizeString(value, path, findings, injections);
1227
+ const toolArguments = jsonText && isAgentToolArgumentsPath(path);
1228
+ if (toolArguments && typeof value !== "string" && !isPlainRecord(value)) {
1229
+ throw projectionError(
1230
+ EVOLUTION_PROJECTION_INVALID_CODE,
1231
+ "Agent tool arguments require a JSON object",
1232
+ );
1233
+ }
1234
+ if (typeof value === "string") {
1235
+ const plain = (text) =>
1236
+ sanitizeString(text, path, findings, injections, ruleset, patterns);
1237
+ if (!jsonText) return plain(value);
1238
+ const output = jsonText(value, {
1239
+ layer,
1240
+ objectOnly: toolArguments,
1241
+ visit: (decoded, nextLayer) =>
1242
+ visit(decoded, [...path, "$json"], depth + 1, nextLayer),
1243
+ plain,
1244
+ equal: (left, right) => canonicalJson(left) === canonicalJson(right),
1245
+ });
1246
+ if (output.length > ruleset.maxStringChars) {
1247
+ throw projectionError(
1248
+ EVOLUTION_PROJECTION_INVALID_CODE,
1249
+ "Agent model projection exceeds the text budget",
1250
+ );
1251
+ }
1252
+ // Check instruction spans, but never regex-rewrite JSON syntax/numbers
1253
+ // after decoding: numeric PII must become a quoted, valid JSON marker.
1254
+ const matched = injectionMatches(output);
1255
+ if (matched.length) {
1256
+ injections.push({
1257
+ path: findingPath(path),
1258
+ patternIds: matched.map(({ id }) => id),
1259
+ });
1260
+ if (toolArguments)
1261
+ throw projectionError(
1262
+ EVOLUTION_PROJECTION_INVALID_CODE,
1263
+ "Agent tool arguments contain unsafe cross-field text",
1264
+ );
1265
+ return "[QUARANTINED:POTENTIAL_PROMPT_INJECTION]";
1266
+ }
1267
+ return output;
1268
+ }
1147
1269
  if (value === null || typeof value === "boolean") return value;
1148
1270
  if (typeof value === "number") {
1149
1271
  if (!Number.isFinite(value)) {
@@ -1152,12 +1274,30 @@ function sanitizePayload(payload) {
1152
1274
  "Raw payload contains a non-finite number",
1153
1275
  );
1154
1276
  }
1277
+ if (jsonText) {
1278
+ if (Number.isInteger(value) && !Number.isSafeInteger(value)) {
1279
+ throw projectionError(
1280
+ EVOLUTION_PROJECTION_INVALID_CODE,
1281
+ "Agent model JSON number exceeds the safe integer budget",
1282
+ );
1283
+ }
1284
+ const numberText = String(value);
1285
+ const safe = sanitizeString(
1286
+ numberText,
1287
+ path,
1288
+ findings,
1289
+ injections,
1290
+ ruleset,
1291
+ patterns,
1292
+ );
1293
+ if (safe !== numberText) return safe;
1294
+ }
1155
1295
  return value;
1156
1296
  }
1157
1297
  if (Array.isArray(value)) {
1158
1298
  const output = [];
1159
1299
  for (let index = 0; index < value.length; index += 1) {
1160
- if (nodes >= RULESET.maxNodes) {
1300
+ if (nodes >= ruleset.maxNodes) {
1161
1301
  truncated = true;
1162
1302
  findings.push({
1163
1303
  type: "content-truncation",
@@ -1167,7 +1307,9 @@ function sanitizePayload(payload) {
1167
1307
  output.push("[TRUNCATED:CONTENT_BUDGET]");
1168
1308
  break;
1169
1309
  }
1170
- output.push(visit(value[index], [...path, String(index)], depth + 1));
1310
+ output.push(
1311
+ visit(value[index], [...path, String(index)], depth + 1, layer),
1312
+ );
1171
1313
  }
1172
1314
  return output;
1173
1315
  }
@@ -1183,7 +1325,7 @@ function sanitizePayload(payload) {
1183
1325
  // projected content before the receipt is attested.
1184
1326
  const output = Object.create(null);
1185
1327
  for (const key of Object.keys(value).sort()) {
1186
- if (nodes >= RULESET.maxNodes) {
1328
+ if (nodes >= ruleset.maxNodes) {
1187
1329
  truncated = true;
1188
1330
  findings.push({
1189
1331
  type: "content-truncation",
@@ -1210,7 +1352,12 @@ function sanitizePayload(payload) {
1210
1352
  count: 1,
1211
1353
  });
1212
1354
  } else {
1213
- projectedValue = visit(value[key], [...path, safeKey], depth + 1);
1355
+ projectedValue = visit(
1356
+ value[key],
1357
+ [...path, safeKey],
1358
+ depth + 1,
1359
+ layer,
1360
+ );
1214
1361
  }
1215
1362
  Object.defineProperty(output, safeKey, {
1216
1363
  value: projectedValue,
@@ -1223,7 +1370,7 @@ function sanitizePayload(payload) {
1223
1370
  };
1224
1371
  let content = visit(payload, [], 0);
1225
1372
  if (
1226
- Buffer.byteLength(canonicalJson(content), "utf8") > RULESET.maxModelBytes
1373
+ Buffer.byteLength(canonicalJson(content), "utf8") > ruleset.maxModelBytes
1227
1374
  ) {
1228
1375
  truncated = true;
1229
1376
  content = {
@@ -1241,12 +1388,21 @@ function sanitizePayload(payload) {
1241
1388
  byType[finding.type] = (byType[finding.type] || 0) + finding.count;
1242
1389
  paths.add(finding.path);
1243
1390
  }
1391
+ if (
1392
+ ruleset.overflowPolicy === "reject" &&
1393
+ (truncated || (byType["content-truncation"] ?? 0) > 0)
1394
+ ) {
1395
+ throw projectionError(
1396
+ EVOLUTION_PROJECTION_INVALID_CODE,
1397
+ "Agent model projection exceeds the content budget",
1398
+ );
1399
+ }
1244
1400
  const redactionSummary = {
1245
1401
  total: Object.values(byType).reduce((sum, count) => sum + count, 0),
1246
1402
  byType,
1247
1403
  paths: [...paths].sort(),
1248
1404
  };
1249
- assertNoKnownSecrets(content);
1405
+ assertNoKnownSecrets(content, patterns);
1250
1406
  return deepFreeze({
1251
1407
  content,
1252
1408
  redactionSummary,
@@ -1936,7 +2092,7 @@ function buildRawRecord(source, commitment, evidenceId, storage) {
1936
2092
  });
1937
2093
  }
1938
2094
 
1939
- function buildModelProjection(raw, sanitized) {
2095
+ function buildModelProjection(raw, sanitized, rulesetDigest) {
1940
2096
  const opaque = ["confidential", "restricted"].includes(raw.sensitivity);
1941
2097
  const core = {
1942
2098
  schema: EVOLUTION_MODEL_PROJECTION_SCHEMA,
@@ -1952,7 +2108,7 @@ function buildModelProjection(raw, sanitized) {
1952
2108
  : sanitized.redactionSummary,
1953
2109
  injectionFindings: opaque ? [] : sanitized.injectionFindings,
1954
2110
  truncated: opaque ? false : sanitized.truncated,
1955
- rulesetDigest: RULESET_DIGEST,
2111
+ rulesetDigest,
1956
2112
  };
1957
2113
  return deepFreeze({
1958
2114
  ...core,
@@ -1990,7 +2146,7 @@ function buildTrustedProjection(
1990
2146
  status,
1991
2147
  reasonCodes,
1992
2148
  content: status === "trusted" ? trustedSanitized.content : null,
1993
- rulesetDigest: RULESET_DIGEST,
2149
+ rulesetDigest: model.rulesetDigest,
1994
2150
  };
1995
2151
  return deepFreeze({
1996
2152
  ...core,
@@ -2013,7 +2169,7 @@ function buildReceipt(raw, model, trusted, createdAt) {
2013
2169
  rawRecordDigest: raw.rawRecordDigest,
2014
2170
  modelProjectionDigest: model.projectionDigest,
2015
2171
  trustedProjectionDigest: trusted.projectionDigest,
2016
- rulesetDigest: RULESET_DIGEST,
2172
+ rulesetDigest: model.rulesetDigest,
2017
2173
  redactionSummary: model.redactionSummary,
2018
2174
  injectionCount: model.injectionFindings.length,
2019
2175
  trustedStatus: trusted.status,
@@ -2767,6 +2923,13 @@ function validateBundleIntegrity(bundle) {
2767
2923
  "projection receipt",
2768
2924
  );
2769
2925
  validateRawMetadata(raw, receipt);
2926
+ const ruleset = SUPPORTED_RULESETS.get(model.rulesetDigest);
2927
+ if (!ruleset) {
2928
+ throw projectionError(
2929
+ EVOLUTION_PROJECTION_INVALID_CODE,
2930
+ "unsupported projection ruleset",
2931
+ );
2932
+ }
2770
2933
  validateRedactionSummary(model.redactionSummary);
2771
2934
  if (
2772
2935
  !Array.isArray(model.injectionFindings) ||
@@ -2864,9 +3027,8 @@ function validateBundleIntegrity(bundle) {
2864
3027
  canonicalJson(receipt.redactionSummary) !==
2865
3028
  canonicalJson(model.redactionSummary) ||
2866
3029
  receipt.trustedStatus !== trusted.status ||
2867
- model.rulesetDigest !== RULESET_DIGEST ||
2868
- trusted.rulesetDigest !== RULESET_DIGEST ||
2869
- receipt.rulesetDigest !== RULESET_DIGEST ||
3030
+ trusted.rulesetDigest !== model.rulesetDigest ||
3031
+ receipt.rulesetDigest !== model.rulesetDigest ||
2870
3032
  trusted.status !== expectedStatus ||
2871
3033
  canonicalJson(trusted.reasonCodes) !== canonicalJson(expectedReasons) ||
2872
3034
  (trusted.status === "quarantined" && trusted.content !== null) ||
@@ -2891,7 +3053,7 @@ function validateBundleIntegrity(bundle) {
2891
3053
  !Number.isSafeInteger(receipt.injectionCount) ||
2892
3054
  receipt.injectionCount < 0 ||
2893
3055
  Buffer.byteLength(canonicalJson(model.content), "utf8") >
2894
- RULESET.maxModelBytes
3056
+ ruleset.maxModelBytes
2895
3057
  ) {
2896
3058
  throw projectionError(
2897
3059
  EVOLUTION_PROJECTION_INVALID_CODE,
@@ -2899,11 +3061,35 @@ function validateBundleIntegrity(bundle) {
2899
3061
  );
2900
3062
  }
2901
3063
  if (model.content !== null) {
2902
- assertNoKnownSecrets(model.content);
3064
+ if (ruleset === AGENT_MODEL_RULESET || ruleset === AGENT_MODEL_RULESET_V1) {
3065
+ snapshotAgentModelRequest(model.content, {
3066
+ allowStructuredArgumentText: ruleset === AGENT_MODEL_RULESET,
3067
+ });
3068
+ if (
3069
+ model.truncated ||
3070
+ (model.redactionSummary.byType["content-truncation"] ?? 0) > 0
3071
+ ) {
3072
+ throw projectionError(
3073
+ EVOLUTION_PROJECTION_INVALID_CODE,
3074
+ "Agent model projection cannot be truncated",
3075
+ );
3076
+ }
3077
+ }
3078
+ if (
3079
+ ruleset.jsonTextPolicy &&
3080
+ canonicalJson(sanitizePayload(model.content, ruleset).content) !==
3081
+ canonicalJson(model.content)
3082
+ ) {
3083
+ throw projectionError(
3084
+ EVOLUTION_PROJECTION_INVALID_CODE,
3085
+ "Agent model JSON content is not a safe projection",
3086
+ );
3087
+ }
3088
+ assertNoKnownSecrets(model.content, valuePatterns(ruleset));
2903
3089
  assertNoInjectionText(model.content);
2904
3090
  }
2905
3091
  if (trusted.content !== null) {
2906
- assertNoKnownSecrets(trusted.content);
3092
+ assertNoKnownSecrets(trusted.content, valuePatterns(ruleset));
2907
3093
  assertNoInjectionText(trusted.content);
2908
3094
  }
2909
3095
  const attestation = validateAttestation(bundle.attestation, receipt);
@@ -3129,7 +3315,15 @@ export class EvolutionEvidenceProjector {
3129
3315
  return { iso, milliseconds: new Date(iso).getTime() };
3130
3316
  }
3131
3317
 
3132
- async project(input) {
3318
+ project(input) {
3319
+ return this.#project(input, RULESET);
3320
+ }
3321
+
3322
+ projectAgentModelRequest(input) {
3323
+ return this.#project(input, AGENT_MODEL_RULESET);
3324
+ }
3325
+
3326
+ async #project(input, ruleset) {
3133
3327
  assertExactRecord(input, INPUT_KEYS, "evidence projection input");
3134
3328
  if (
3135
3329
  typeof input.sourceEnvelope !== "string" ||
@@ -3141,7 +3335,10 @@ export class EvolutionEvidenceProjector {
3141
3335
  "sourceEnvelope is invalid",
3142
3336
  );
3143
3337
  }
3144
- const payload = cloneCanonical(input.payload);
3338
+ const payload =
3339
+ ruleset === AGENT_MODEL_RULESET
3340
+ ? snapshotAgentModelRequest(input.payload)
3341
+ : cloneCanonical(input.payload);
3145
3342
  const sourceInputDigest = digest(
3146
3343
  payload,
3147
3344
  "chainlesschain.evolution-raw-plaintext/v2",
@@ -3381,10 +3578,16 @@ export class EvolutionEvidenceProjector {
3381
3578
  injectionFindings: [],
3382
3579
  truncated: false,
3383
3580
  })
3384
- : sanitizePayload(payload);
3385
- const modelProjection = buildModelProjection(rawRecord, sanitized);
3581
+ : sanitizePayload(payload, ruleset);
3582
+ const modelProjection = buildModelProjection(
3583
+ rawRecord,
3584
+ sanitized,
3585
+ ruleset === AGENT_MODEL_RULESET
3586
+ ? EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_DIGEST
3587
+ : RULESET_DIGEST,
3588
+ );
3386
3589
  const trustedSanitized = source.compilable
3387
- ? sanitizePayload(source.trustedPayload)
3590
+ ? sanitizePayload(source.trustedPayload, RULESET, valuePatterns(ruleset))
3388
3591
  : null;
3389
3592
  const trustedInputStructured =
3390
3593
  source.compilable && isStructuredTrustedPayload(source.trustedPayload);