chainlesschain 0.166.22 → 0.166.25

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 (298) hide show
  1. package/README.md +46 -3
  2. package/package.json +4 -3
  3. package/src/assets/web-panel/assets/{AIOps-oJ7USzMC.js → AIOps-RaxL_QQD.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-BlgnZe_C.js → ActionButton-DD3ieFO-.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-D2rRbTLu.js → Analytics-CATDJukS.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-FwS3f0B2.js → AppLayout-BHGsnRDS.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-iF-_08Hi.js → Artifacts-BL6NunjN.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-D24p0zQw.js → Audit-D0nEWfbA.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-Cg3mRVi9.js → BackgroundAgents-BAP1MUol.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-EOqht3H-.js → Backup-R4y2OeSi.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-9XWYq2hj.js → BaseInput-ByQZ2z6S.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-Dq5yardA.js → Chat-32uV--xF.js} +4 -4
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-t1enanwz.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-CuyCBoBf.js → Checkbox-D1CB-7bq.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-DjWtYHNe.js → Codegen-BPx3dQ2q.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-CrVr_iuG.js → Col-DkPTQ2Gl.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-C6QxpfGc.js → Community-ZriaxRlr.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-B-v5r6Pa.js → Compact-C_qJ0P7F.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-zNiLiFgD.js → Compliance-Bgoy-saS.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-D9K7lMOu.js → Cowork-B5i9y6XK.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-DAjO36z4.js → Cron-D7vBJ5-J.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-Bxqn0aqB.js → Crosschain-D4kvoGI_.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-DfRmLUe-.js → DID-BLOeBd-r.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-Cz8KF3fr.js → Dashboard-mecJaonC.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-C4oVfkP0.js → Dropdown-GPKwaFer.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-ivyZKN8k.js → EmailListRenderer-BML9m7Dd.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DoxY1CPW.js → FamilyGuardDashboard-DN5bAtJC.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-C93gZxnb.js → Federation-DmD6Gecd.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-D_lEjYJE.js → FormItemContext-6wwplN_K.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-BNFN9YjN.js → GenericCardRenderer-DUhpLkDL.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-mUu2HcLI.js → Git-eJfyXkwf.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CNuosrge.js → Governance-swAUW59x.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-DwY5pbCB.js → Inference-CbdwJPDJ.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-aRUxhACD.js → KnowledgeGraph-UuYpg1nm.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-DFfsWYy_.js → Logs-CS0G057y.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-BxIIB4k3.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-COI-ciM-.js → Marketplace-CZRjuvvI.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-BJJwaIpe.js → McpTools-BOJ9A_Rf.js} +3 -3
  39. package/src/assets/web-panel/assets/{Memory-CDO6SGDZ.js → Memory-BnkrR-Ok.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-BlZ5tFf4.js → MobileBridge-Do4mPi13.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-DuoxbgWz.js → MobileProjects-2JxWa6-p.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-6ec9j70b.js → Mtc-CS_mnpGd.js} +2 -2
  43. package/src/assets/web-panel/assets/{MtcAudit-BuL7HkC7.js → MtcAudit-DZ4J_351.js} +5 -5
  44. package/src/assets/web-panel/assets/{Multisig-CJxR85lk.js → Multisig-Jh74zKXu.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-B71O1S4l.js → NLProgramming-_4n2BfnS.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-Bsw5zbpV.js → Notes-CtENcKHv.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-BnAhXuK_.js → NotificationSettings-dgDCvpK9.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-BJ0R5GGz.js → OrderTableRenderer-D5VxCrmG.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-B7wwNxoP.js → Organization-CpIF8Xkd.js} +2 -2
  50. package/src/assets/web-panel/assets/{Overflow-CfAGr0gM.js → Overflow-aHnBZaez.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-KhMg22Fz.js → P2P-8ppzog2V.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-NdAXI9ft.js → PdhVaultBrowser-D3p1BXkp.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-CIYjqyT7.js → Permissions-D7vflD5q.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-D2ht3P_R.js → PersonalDataHub-D2hY-Ek2.js} +4 -4
  55. package/src/assets/web-panel/assets/{Pipeline-i6flZW1m.js → Pipeline-qK2VqhJC.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-DE0lhYVc.js → Privacy-DHJr4uu0.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-BL3YbyxS.js → ProjectInit-DMBS6trm.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-CEtdg7ni.js → ProjectSettings-D3Ng74BT.js} +2 -2
  59. package/src/assets/web-panel/assets/{Projects-CvtU5peJ.js → Projects-BfJFZiIW.js} +1 -1
  60. package/src/assets/web-panel/assets/{Providers-DKt_Cg-j.js → Providers-DlNA95G0.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-DA61jNSx.js → QrScannerModal-CMOIYxIm.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-fS9ryUmq.js → QuickAsk-D6MyGp5I.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-CR9dZU5Y.js → Recommend-W6WcShtf.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-BV0BR2Dz.js → RemoteSession-Dm_MjlV_.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-BIeGUvYD.js → Reputation-Ctvij6eX.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-DHDT1aro.js → Row-DivbeDE-.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-Cq6YKb1h.js → RssFeed-D4famoAw.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-DEF6vsy6.js → Search-6gOAh3zG.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-CHtYiKY9.js → Security-DApb9kK8.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-u16lvBJN.js → Services-B8OomyE2.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-CGbizyDj.js → Skeleton-BTJ2g2E3.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-BZMQcAa7.js → Skills-NIRr4DD1.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-Bm-CycVi.js → Sla-BQHP_6px.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-BudpA5kr.js → SpeechSettings-BVQTDSVS.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-B8q1C1eC.js → SyncSettings-BOD4Mar6.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-SU1pBWc-.js → Tasks-Ciu7H2-y.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-CyOfJzmt.js → Templates-CtlwavRU.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-xqWSm2GP.js → Tenant-QLWYJdL6.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-D1Ttgjsi.js → Terminal-B3q10mjm.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-Da2lYs5D.js → TimelineRenderer-CqltBA_8.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-B34-SduO.js → Tokens-CJOKrj4y.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-C8zyYm4R.js → Trigger-CPMGgfdM.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-D1Pvqems.js → Trust-DiJms7Bl.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-Do3VVnAy.js → UkeySign-rakR8eel.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-Dz7egVIA.js → VideoEditing-DAWZUM5o.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-Dcuw-OxR.js → Wallet-DqUPnl7K.js} +3 -3
  87. package/src/assets/web-panel/assets/{WebAuthn-DPlw-QsB.js → WebAuthn-BnVUwvMm.js} +3 -3
  88. package/src/assets/web-panel/assets/{WorkflowEditor-h4OsnU5q.js → WorkflowEditor-B1CAwxgs.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-eO9wEwrW.js → chat-k2-0Jzfy.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-34lSmOXw.js → colors-BAu8xBmW.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-CK4kEWJ4.js → compact-item-DMlqcdfI.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-E0A57xed.js → createContext-BU9kfiSw.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-DuGrUMAS.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-BD9ZMGAl.js → hasIn-2vacgdcl.js} +1 -1
  95. package/src/assets/web-panel/assets/{index--N0u6kTG.js → index-B-C-Ruft.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DzXjP44T.js → index-B7wDjYUd.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CZBaqe3d.js → index-BMq0frKK.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DrOalGut.js → index-BUX4W-2v.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CT1_eRL-.js → index-BZz2eB33.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DrsDA_md.js → index-BblNQlaA.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DP-UZAQN.js → index-BdfKoqsK.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DiT_REby.js → index-Bf8YofPE.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Cx3Jn1r0.js → index-Bn8tARil.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-B0rkHxKK.js → index-Bpe2CJd-.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-B_G_ElKO.js → index-BxctzdYQ.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-MIg5Z8qe.js → index-C24NoPpy.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BmNbU2Z6.js → index-C5C4kSi8.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BsGmo6v1.js → index-C6ICn9Y6.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CsrKJJcX.js → index-C8ldqZi6.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BbX_Dted.js → index-C9WsM29I.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Ch175NUw.js → index-CONPVaxw.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DONOUtlz.js → index-CPyYXKFB.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DFLE2qO9.js → index-CSvSf9px.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-o8pYehRq.js → index-CXmpR6N3.js} +3 -3
  115. package/src/assets/web-panel/assets/{index-Cz3unNfL.js → index-Chybe7Ge.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-yAGBu2E0.js → index-CyXmP3PW.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CuSau5ya.js → index-DCusBOqR.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DcE1BspQ.js → index-DH01oIaj.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DrSAAuJj.js → index-DHg3LMNP.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CZkFMeWL.js → index-DWLTSIka.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DvKcroix.js → index-DaUGdvtU.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Bjs90Eh9.js → index-DcA-tEQd.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DGRxt5wj.js → index-DfWvcu4p.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DCn-ECvK.js → index-DmZNnZz7.js} +1 -1
  125. package/src/assets/web-panel/assets/index-DvFfMAux.js +1 -0
  126. package/src/assets/web-panel/assets/{index-8qMA1DWQ.js → index-JsyGqKmD.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-D4bB_x_v.js → index-TtrpHmYx.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-Brqc9Emx.js → index-Ygh0wmKz.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Da5fmOHB.js → index-dIYqw3f0.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DpfisY1g.js → index-hDHHJYno.js} +1 -1
  131. package/src/assets/web-panel/assets/index-n6p-1A77.js +1 -0
  132. package/src/assets/web-panel/assets/{index-DeXNCyQJ.js → index-oElehY4F.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DcbgVLOH.js → index-z4_YwZDW.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-DMTkAomF.js → initDefaultProps-B9OXWu2e.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-Cnti1F5g.js → motion-IQ47MCDQ.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-CGxmHUga.js → move-CLCU4kjV.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-CuwwLoq7.js → mtc-parser-CXnVlSPq.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-BpdlTkPM.js → omit-BJjLXB0f.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-D7nWrThp.js → pickAttrs-BHdtvdy6.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-Bhx0TV8F.js → placementArrow-oq8X_Bwc.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-CZ1KesZh.js → responsiveObserve-DTD02LAO.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-CnldF8J6.js → slide-DbEeq8to.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-CZfo_GOA.js → statusUtils-Do2fy1CJ.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-B2QCcAv5.js → styleChecker-CFWD63T-.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-DzzjIS4J.js → useFlexGapSupport-BeozAWOo.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-B_atg9M0.js → useFs-0-rIgnBL.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-DhZs3QYN.js → usePersonalDataHub-CeiNoI31.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-DcePTYAm.js → vnode-Dj0ReRNg.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-BYmlnjRk.js → zoom-DD7MC4Dy.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-knowledge.js +40 -1
  155. package/src/commands/evolution.js +2 -0
  156. package/src/commands/governed-skill-marketplace.js +142 -0
  157. package/src/commands/marketplace.js +4 -1
  158. package/src/commands/serve.js +21 -0
  159. package/src/commands/skill.js +3 -0
  160. package/src/data/changelog.json +39 -0
  161. package/src/gateways/ws/ws-agent-handler.js +59 -2
  162. package/src/gateways/ws/ws-server.js +2 -0
  163. package/src/generated/cc-agent-protocol.schema.json +3 -1
  164. package/src/harness/golden-transcript.js +1 -0
  165. package/src/harness/prompt-compressor.js +51 -5
  166. package/src/harness/provider-backed-compaction.js +28 -1
  167. package/src/harness/remote-session-registry.js +15 -3
  168. package/src/index.js +20 -2
  169. package/src/lazy-dispatch.js +6 -0
  170. package/src/lib/advisor-runtime.js +55 -2
  171. package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
  172. package/src/lib/app-server/graph-runtime.js +32 -0
  173. package/src/lib/app-server/server.js +94 -1
  174. package/src/lib/app-server/websocket-transport.js +15 -0
  175. package/src/lib/autonomous-agent.js +63 -13
  176. package/src/lib/cowork/ab-comparator-cli.js +4 -3
  177. package/src/lib/cowork/debate-review-cli.js +4 -3
  178. package/src/lib/cowork/decision-kb-cli.js +5 -0
  179. package/src/lib/cowork-adapter.js +38 -16
  180. package/src/lib/evolution/agent-evolution-ingress.js +95 -15
  181. package/src/lib/evolution/agent-evolution-runtime-composition.js +82 -0
  182. package/src/lib/evolution/agent-evolution-session-lifecycle.js +46 -0
  183. package/src/lib/evolution/agent-model-projection.js +437 -0
  184. package/src/lib/evolution/bounded-descriptor-read.js +29 -0
  185. package/src/lib/evolution/controlled-skill-pilot-ledger-adapter.js +551 -0
  186. package/src/lib/evolution/controlled-skill-production-pilot.js +308 -18
  187. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +32 -10
  188. package/src/lib/evolution/evidence-json-text.js +236 -0
  189. package/src/lib/evolution/evolution-artifact-ports.js +196 -21
  190. package/src/lib/evolution/evolution-deployment-loader.js +240 -2
  191. package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +373 -0
  192. package/src/lib/evolution/evolution-eval-gate.js +14 -1
  193. package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +14 -0
  194. package/src/lib/evolution/evolution-eval-process-supervisor.js +607 -0
  195. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +14 -1
  196. package/src/lib/evolution/evolution-evidence-projector.js +271 -37
  197. package/src/lib/evolution/evolution-file-witness.js +153 -30
  198. package/src/lib/evolution/evolution-ledger-ports.js +1219 -66
  199. package/src/lib/evolution/evolution-ledger.js +66 -2
  200. package/src/lib/evolution/evolution-raw-crypto-shred.js +29 -15
  201. package/src/lib/evolution/evolution-raw-deletion-ledger-adapter.js +865 -0
  202. package/src/lib/evolution/evolution-release-train-domain-stages.js +769 -0
  203. package/src/lib/evolution/evolution-release-train-stage-output-ledger-adapter.js +333 -0
  204. package/src/lib/evolution/evolution-release-train.js +54 -6
  205. package/src/lib/evolution/evolution-workbench-batch-executor.js +101 -144
  206. package/src/lib/evolution/evolution-workbench-control-ports.js +203 -0
  207. package/src/lib/evolution/evolution-workbench-file-resources.js +403 -0
  208. package/src/lib/evolution/evolution-workbench-projection.js +134 -26
  209. package/src/lib/evolution/evolution-workbench-registry-source.js +482 -0
  210. package/src/lib/evolution/evolution-workbench-review-ledger-adapter.js +823 -0
  211. package/src/lib/evolution/evolution-workbench-review-protocol.js +157 -0
  212. package/src/lib/evolution/evolution-workbench-rollback-authorization.js +57 -0
  213. package/src/lib/evolution/evolution-workbench-rollback-ledger-adapter.js +1016 -0
  214. package/src/lib/evolution/evolution-workbench-runtime.js +133 -0
  215. package/src/lib/evolution/evolution-workbench-version-control.js +70 -36
  216. package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +48 -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-inventory.js +392 -0
  220. package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +217 -82
  221. package/src/lib/evolution/governed-knowledge-quarantine-release.js +1013 -0
  222. package/src/lib/evolution/governed-knowledge-record.js +148 -0
  223. package/src/lib/evolution/governed-knowledge-revocation-host.js +59 -0
  224. package/src/lib/evolution/governed-knowledge-revocation-record.js +135 -0
  225. package/src/lib/evolution/governed-knowledge-skill-rollback.js +510 -0
  226. package/src/lib/evolution/governed-knowledge-sync.js +181 -95
  227. package/src/lib/evolution/governed-knowledge-wiki-tombstone.js +516 -0
  228. package/src/lib/evolution/governed-skill-marketplace-badge.js +208 -0
  229. package/src/lib/evolution/governed-skill-marketplace-candidate.js +330 -0
  230. package/src/lib/evolution/governed-skill-marketplace-cli-host.js +308 -0
  231. package/src/lib/evolution/governed-skill-marketplace-ledger-adapter.js +420 -0
  232. package/src/lib/evolution/governed-skill-marketplace.js +288 -5
  233. package/src/lib/evolution/governed-wiki-pruning-journal.js +302 -0
  234. package/src/lib/evolution/governed-wiki-pruning-ledger-adapter.js +459 -0
  235. package/src/lib/evolution/governed-wiki-pruning-maintenance.js +576 -0
  236. package/src/lib/evolution/governed-wiki-pruning-plan-authority.js +169 -0
  237. package/src/lib/evolution/governed-wiki-pruning-raw-shred.js +207 -0
  238. package/src/lib/evolution/governed-wiki-pruning-retrieval.js +587 -0
  239. package/src/lib/evolution/governed-wiki-pruning-runtime.js +153 -0
  240. package/src/lib/evolution/governed-wiki-pruning-skill-rollback.js +360 -0
  241. package/src/lib/evolution/governed-wiki-pruning.js +322 -143
  242. package/src/lib/evolution/independent-skill-revocation-source.js +231 -0
  243. package/src/lib/evolution/knowledge-wiki-source-admission.js +283 -0
  244. package/src/lib/evolution/knowledge-wiki-source-provenance.js +360 -0
  245. package/src/lib/evolution/progressive-canary-external-watchdog.js +578 -0
  246. package/src/lib/evolution/progressive-canary-traffic-worker.js +628 -0
  247. package/src/lib/evolution/progressive-canary-watchdog-file-store.js +285 -0
  248. package/src/lib/evolution/progressive-canary-watchdog-node-pki.js +265 -0
  249. package/src/lib/evolution/skill-candidate-registry.js +43 -3
  250. package/src/lib/evolution/skill-promotion-controller.js +25 -0
  251. package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +100 -0
  252. package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +131 -2
  253. package/src/lib/evolution/skill-release-registry.js +168 -4
  254. package/src/lib/evolution/skill-retrieval-revocation-authority.js +361 -0
  255. package/src/lib/evolution/skill-retrieval-revocation-ledger-adapter.js +346 -0
  256. package/src/lib/evolution/skill-revocation-propagation.js +467 -0
  257. package/src/lib/evolution/skill-target-matrix-eval.js +162 -11
  258. package/src/lib/evolution/skill-wiki-reconciliation.js +985 -0
  259. package/src/lib/evolution/skill-writer-inventory-manifest.js +8 -6
  260. package/src/lib/evolution/statistical-progressive-canary.js +165 -3
  261. package/src/lib/evolution/structured-memory-agent-control-plane.js +120 -0
  262. package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +5 -1
  263. package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +126 -0
  264. package/src/lib/evolution/wiki-informed-skill-proposer.js +127 -21
  265. package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +822 -101
  266. package/src/lib/evolution/wiki-revision-protocol.js +120 -0
  267. package/src/lib/evolution/wiki-skill-proposal-ledger-adapter.js +307 -0
  268. package/src/lib/evolution/wiki-target-tombstone-revision.js +109 -0
  269. package/src/lib/evolution/wikiskill-benchmark-cli-host.js +178 -0
  270. package/src/lib/evolution/wikiskill-benchmark-execution-host.js +702 -0
  271. package/src/lib/evolution/wikiskill-benchmark-ledger-adapter.js +613 -0
  272. package/src/lib/evolution/wikiskill-benchmark.js +80 -16
  273. package/src/lib/goal-assess.js +17 -10
  274. package/src/lib/interactive-planner.js +9 -1
  275. package/src/lib/iteration-budget.js +16 -2
  276. package/src/lib/micro-compact.js +4 -1
  277. package/src/lib/model-failure-policy.js +21 -0
  278. package/src/lib/process-execution-broker/index.js +1 -0
  279. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  280. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  281. package/src/lib/process-execution-broker/windows-sandbox.cs +33 -15
  282. package/src/lib/read-file-loop-guard.js +113 -0
  283. package/src/lib/read-file-page.js +191 -0
  284. package/src/lib/runnable-provider.js +2 -1
  285. package/src/lib/skill-retrieval-router.js +22 -1
  286. package/src/repl/agent-repl.js +133 -34
  287. package/src/runtime/agent-core.js +196 -74
  288. package/src/runtime/agent-runtime.js +43 -0
  289. package/src/runtime/coding-agent-contract-shared.cjs +7 -1
  290. package/src/runtime/fallback-model.js +143 -62
  291. package/src/runtime/headless-runner.js +54 -10
  292. package/src/runtime/headless-stream.js +50 -6
  293. package/src/runtime/runtime-factory.js +41 -2
  294. package/src/assets/web-panel/assets/ChatBubbleRenderer-Ds3pA-ET.js +0 -1
  295. package/src/assets/web-panel/assets/MarkdownRenderer-DqTx7_u1.js +0 -1
  296. package/src/assets/web-panel/assets/devWarning-CF3xafX2.js +0 -1
  297. package/src/assets/web-panel/assets/index-C907rPwd.js +0 -1
  298. package/src/assets/web-panel/assets/index-wueRSK2d.js +0 -1
@@ -10,6 +10,15 @@
10
10
  */
11
11
 
12
12
  import { createHash, randomBytes } from "node:crypto";
13
+ import {
14
+ projectAgentOpaqueTransportBlock,
15
+ snapshotAgentModelRequest,
16
+ } from "./agent-model-projection.js";
17
+ import {
18
+ createEvidenceJsonTextBoundary,
19
+ EVIDENCE_JSON_POLICY,
20
+ isAgentToolArgumentsPath,
21
+ } from "./evidence-json-text.js";
13
22
 
14
23
  export const EVOLUTION_SOURCE_VERIFICATION_SCHEMA =
15
24
  "chainlesschain.evolution-source-verification/v1";
@@ -448,6 +457,70 @@ const RULESET_DIGEST = `sha256:${createHash("sha256")
448
457
  )
449
458
  .digest("hex")}`;
450
459
 
460
+ // A separate policy keeps existing v2 artifacts readable without changing
461
+ // their meaning/digest. Agent messages are authenticated and scanned as whole
462
+ // fields; the existing total model-content ceiling still applies. Never scan
463
+ // independent 8 KiB slices, which would miss secrets/injections at the seams.
464
+ const PREFIXED_CREDENTIAL_SOURCE =
465
+ "(?:sk|ghp|github_pat|xox[baprs])[-_][A-Za-z0-9_-]{12,}";
466
+ const EMBEDDED_CREDENTIAL_SOURCE =
467
+ "(?:sk-|ghp_|github_pat_|xox[baprs]-)[A-Za-z0-9_-]{12,}";
468
+ const AGENT_MODEL_RULESET_V1 = Object.freeze({
469
+ ...RULESET,
470
+ schema: "chainlesschain.evolution-agent-model-projection-rules/v1",
471
+ version: 1,
472
+ maxStringChars: RULESET.maxModelBytes,
473
+ maxInputBytes: 1024 * 1024,
474
+ textPolicy: "whole-field-before-budget-v1",
475
+ overflowPolicy: "reject",
476
+ embeddedCredentialPattern: EMBEDDED_CREDENTIAL_SOURCE,
477
+ });
478
+ const AGENT_MODEL_RULESET_V1_DIGEST = `sha256:${createHash("sha256")
479
+ .update(
480
+ `${AGENT_MODEL_RULESET_V1.schema}\0${JSON.stringify(AGENT_MODEL_RULESET_V1)}`,
481
+ "utf8",
482
+ )
483
+ .digest("hex")}`;
484
+ const AGENT_MODEL_RULESET_V2 = Object.freeze({
485
+ ...AGENT_MODEL_RULESET_V1,
486
+ schema: "chainlesschain.evolution-agent-model-projection-rules/v2",
487
+ version: 2,
488
+ jsonTextPolicy: EVIDENCE_JSON_POLICY,
489
+ });
490
+ export const EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V2_DIGEST = `sha256:${createHash(
491
+ "sha256",
492
+ )
493
+ .update(
494
+ `${AGENT_MODEL_RULESET_V2.schema}\0${JSON.stringify(AGENT_MODEL_RULESET_V2)}`,
495
+ "utf8",
496
+ )
497
+ .digest("hex")}`;
498
+ const AGENT_MODEL_RULESET = Object.freeze({
499
+ ...AGENT_MODEL_RULESET_V2,
500
+ schema: "chainlesschain.evolution-agent-model-projection-rules/v3",
501
+ version: 3,
502
+ opaqueTransportPolicy:
503
+ "digest-bound-base64-image-and-signed-thinking-no-plaintext-projection-v1",
504
+ });
505
+ export const EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_DIGEST = `sha256:${createHash(
506
+ "sha256",
507
+ )
508
+ .update(
509
+ `${AGENT_MODEL_RULESET.schema}\0${JSON.stringify(AGENT_MODEL_RULESET)}`,
510
+ "utf8",
511
+ )
512
+ .digest("hex")}`;
513
+ const SUPPORTED_RULESETS = new Map([
514
+ [RULESET_DIGEST, RULESET],
515
+ [AGENT_MODEL_RULESET_V1_DIGEST, AGENT_MODEL_RULESET_V1],
516
+ [EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V2_DIGEST, AGENT_MODEL_RULESET_V2],
517
+ [EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_DIGEST, AGENT_MODEL_RULESET],
518
+ ]);
519
+
520
+ const PREFIXED_CREDENTIAL_PATTERN = Object.freeze({
521
+ type: "credential",
522
+ regex: new RegExp(`\\b${PREFIXED_CREDENTIAL_SOURCE}\\b`, "gu"),
523
+ });
451
524
  const VALUE_PATTERNS = Object.freeze([
452
525
  Object.freeze({
453
526
  type: "private-key",
@@ -463,10 +536,7 @@ const VALUE_PATTERNS = Object.freeze([
463
536
  regex:
464
537
  /\b(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|passwd|secret)\s*[:=]\s*["']?[A-Za-z0-9._~+/=-]{8,}["']?/giu,
465
538
  }),
466
- Object.freeze({
467
- type: "credential",
468
- regex: /\b(?:sk|ghp|github_pat|xox[baprs])[-_][A-Za-z0-9_-]{12,}\b/gu,
469
- }),
539
+ PREFIXED_CREDENTIAL_PATTERN,
470
540
  Object.freeze({
471
541
  type: "credential",
472
542
  regex: /\bAKIA[A-Z0-9]{16}\b/gu,
@@ -506,6 +576,24 @@ const VALUE_PATTERNS = Object.freeze([
506
576
  }),
507
577
  ]);
508
578
 
579
+ const AGENT_VALUE_PATTERNS = Object.freeze([
580
+ ...VALUE_PATTERNS,
581
+ Object.freeze({
582
+ type: "credential",
583
+ // Use each provider's real prefix/delimiter for embedded matches. Treating
584
+ // embedded "sk_" as a key would corrupt identifiers like ask_user_question.
585
+ regex: new RegExp(`${EMBEDDED_CREDENTIAL_SOURCE}\\b`, "gu"),
586
+ }),
587
+ ]);
588
+
589
+ function valuePatterns(ruleset) {
590
+ return ruleset === AGENT_MODEL_RULESET ||
591
+ ruleset === AGENT_MODEL_RULESET_V2 ||
592
+ ruleset === AGENT_MODEL_RULESET_V1
593
+ ? AGENT_VALUE_PATTERNS
594
+ : VALUE_PATTERNS;
595
+ }
596
+
509
597
  const REDACTION_TYPES = new Set([
510
598
  ...VALUE_PATTERNS.map(({ type }) => type),
511
599
  "pii",
@@ -689,10 +777,10 @@ function deepFreeze(value, seen = new WeakSet()) {
689
777
  return Object.freeze(value);
690
778
  }
691
779
 
692
- function assertNoKnownSecrets(content) {
780
+ function assertNoKnownSecrets(content, patterns = VALUE_PATTERNS) {
693
781
  const serialized =
694
782
  typeof content === "string" ? content : canonicalJson(content);
695
- for (const pattern of VALUE_PATTERNS) {
783
+ for (const pattern of patterns) {
696
784
  pattern.regex.lastIndex = 0;
697
785
  if (pattern.regex.test(serialized)) {
698
786
  throw projectionError(
@@ -1080,9 +1168,9 @@ function sanitizeKey(key, path, findings, injections) {
1080
1168
  return safeKey;
1081
1169
  }
1082
1170
 
1083
- function sanitizeString(value, path, findings, injections) {
1171
+ function sanitizeString(value, path, findings, injections, ruleset, patterns) {
1084
1172
  let output = value;
1085
- for (const pattern of VALUE_PATTERNS) {
1173
+ for (const pattern of patterns) {
1086
1174
  pattern.regex.lastIndex = 0;
1087
1175
  let count = 0;
1088
1176
  output = output.replace(pattern.regex, () => {
@@ -1094,7 +1182,7 @@ function sanitizeString(value, path, findings, injections) {
1094
1182
  }
1095
1183
  const securityNormalized = unicodeSecurityText(output);
1096
1184
  if (securityNormalized !== output) {
1097
- for (const pattern of VALUE_PATTERNS) {
1185
+ for (const pattern of patterns) {
1098
1186
  pattern.regex.lastIndex = 0;
1099
1187
  if (pattern.regex.test(securityNormalized)) {
1100
1188
  findings.push({
@@ -1115,25 +1203,40 @@ function sanitizeString(value, path, findings, injections) {
1115
1203
  });
1116
1204
  output = "[QUARANTINED:POTENTIAL_PROMPT_INJECTION]";
1117
1205
  }
1118
- if (output.length > RULESET.maxStringChars) {
1206
+ if (output.length > ruleset.maxStringChars) {
1207
+ if (ruleset.overflowPolicy === "reject") {
1208
+ throw projectionError(
1209
+ EVOLUTION_PROJECTION_INVALID_CODE,
1210
+ "Agent model projection exceeds the text budget",
1211
+ );
1212
+ }
1119
1213
  findings.push({
1120
1214
  type: "content-truncation",
1121
1215
  path: findingPath(path),
1122
1216
  count: 1,
1123
1217
  });
1124
- output = `${output.slice(0, RULESET.maxStringChars)}[TRUNCATED]`;
1218
+ output = `${output.slice(0, ruleset.maxStringChars)}[TRUNCATED]`;
1125
1219
  }
1126
1220
  return output;
1127
1221
  }
1128
1222
 
1129
- function sanitizePayload(payload) {
1223
+ function sanitizePayload(
1224
+ payload,
1225
+ ruleset = RULESET,
1226
+ patterns = valuePatterns(ruleset),
1227
+ ) {
1130
1228
  const findings = [];
1131
1229
  const injections = [];
1132
1230
  let nodes = 0;
1133
1231
  let truncated = false;
1134
- const visit = (value, path, depth) => {
1232
+ const jsonText = ruleset.jsonTextPolicy
1233
+ ? createEvidenceJsonTextBoundary((message) =>
1234
+ projectionError(EVOLUTION_PROJECTION_INVALID_CODE, message),
1235
+ )
1236
+ : null;
1237
+ const visit = (value, path, depth, layer = 0) => {
1135
1238
  nodes += 1;
1136
- if (nodes > RULESET.maxNodes || depth > RULESET.maxDepth) {
1239
+ if (nodes > ruleset.maxNodes || depth > ruleset.maxDepth) {
1137
1240
  truncated = true;
1138
1241
  findings.push({
1139
1242
  type: "content-truncation",
@@ -1142,8 +1245,53 @@ function sanitizePayload(payload) {
1142
1245
  });
1143
1246
  return "[TRUNCATED:CONTENT_BUDGET]";
1144
1247
  }
1145
- if (typeof value === "string")
1146
- return sanitizeString(value, path, findings, injections);
1248
+ const toolArguments = jsonText && isAgentToolArgumentsPath(path);
1249
+ const opaqueTransportBlock =
1250
+ ruleset === AGENT_MODEL_RULESET
1251
+ ? projectAgentOpaqueTransportBlock(value, path.join("."))
1252
+ : null;
1253
+ if (opaqueTransportBlock !== null) return opaqueTransportBlock;
1254
+ if (toolArguments && typeof value !== "string" && !isPlainRecord(value)) {
1255
+ throw projectionError(
1256
+ EVOLUTION_PROJECTION_INVALID_CODE,
1257
+ "Agent tool arguments require a JSON object",
1258
+ );
1259
+ }
1260
+ if (typeof value === "string") {
1261
+ const plain = (text) =>
1262
+ sanitizeString(text, path, findings, injections, ruleset, patterns);
1263
+ if (!jsonText) return plain(value);
1264
+ const output = jsonText(value, {
1265
+ layer,
1266
+ objectOnly: toolArguments,
1267
+ visit: (decoded, nextLayer) =>
1268
+ visit(decoded, [...path, "$json"], depth + 1, nextLayer),
1269
+ plain,
1270
+ equal: (left, right) => canonicalJson(left) === canonicalJson(right),
1271
+ });
1272
+ if (output.length > ruleset.maxStringChars) {
1273
+ throw projectionError(
1274
+ EVOLUTION_PROJECTION_INVALID_CODE,
1275
+ "Agent model projection exceeds the text budget",
1276
+ );
1277
+ }
1278
+ // Check instruction spans, but never regex-rewrite JSON syntax/numbers
1279
+ // after decoding: numeric PII must become a quoted, valid JSON marker.
1280
+ const matched = injectionMatches(output);
1281
+ if (matched.length) {
1282
+ injections.push({
1283
+ path: findingPath(path),
1284
+ patternIds: matched.map(({ id }) => id),
1285
+ });
1286
+ if (toolArguments)
1287
+ throw projectionError(
1288
+ EVOLUTION_PROJECTION_INVALID_CODE,
1289
+ "Agent tool arguments contain unsafe cross-field text",
1290
+ );
1291
+ return "[QUARANTINED:POTENTIAL_PROMPT_INJECTION]";
1292
+ }
1293
+ return output;
1294
+ }
1147
1295
  if (value === null || typeof value === "boolean") return value;
1148
1296
  if (typeof value === "number") {
1149
1297
  if (!Number.isFinite(value)) {
@@ -1152,12 +1300,30 @@ function sanitizePayload(payload) {
1152
1300
  "Raw payload contains a non-finite number",
1153
1301
  );
1154
1302
  }
1303
+ if (jsonText) {
1304
+ if (Number.isInteger(value) && !Number.isSafeInteger(value)) {
1305
+ throw projectionError(
1306
+ EVOLUTION_PROJECTION_INVALID_CODE,
1307
+ "Agent model JSON number exceeds the safe integer budget",
1308
+ );
1309
+ }
1310
+ const numberText = String(value);
1311
+ const safe = sanitizeString(
1312
+ numberText,
1313
+ path,
1314
+ findings,
1315
+ injections,
1316
+ ruleset,
1317
+ patterns,
1318
+ );
1319
+ if (safe !== numberText) return safe;
1320
+ }
1155
1321
  return value;
1156
1322
  }
1157
1323
  if (Array.isArray(value)) {
1158
1324
  const output = [];
1159
1325
  for (let index = 0; index < value.length; index += 1) {
1160
- if (nodes >= RULESET.maxNodes) {
1326
+ if (nodes >= ruleset.maxNodes) {
1161
1327
  truncated = true;
1162
1328
  findings.push({
1163
1329
  type: "content-truncation",
@@ -1167,7 +1333,9 @@ function sanitizePayload(payload) {
1167
1333
  output.push("[TRUNCATED:CONTENT_BUDGET]");
1168
1334
  break;
1169
1335
  }
1170
- output.push(visit(value[index], [...path, String(index)], depth + 1));
1336
+ output.push(
1337
+ visit(value[index], [...path, String(index)], depth + 1, layer),
1338
+ );
1171
1339
  }
1172
1340
  return output;
1173
1341
  }
@@ -1183,7 +1351,7 @@ function sanitizePayload(payload) {
1183
1351
  // projected content before the receipt is attested.
1184
1352
  const output = Object.create(null);
1185
1353
  for (const key of Object.keys(value).sort()) {
1186
- if (nodes >= RULESET.maxNodes) {
1354
+ if (nodes >= ruleset.maxNodes) {
1187
1355
  truncated = true;
1188
1356
  findings.push({
1189
1357
  type: "content-truncation",
@@ -1210,7 +1378,12 @@ function sanitizePayload(payload) {
1210
1378
  count: 1,
1211
1379
  });
1212
1380
  } else {
1213
- projectedValue = visit(value[key], [...path, safeKey], depth + 1);
1381
+ projectedValue = visit(
1382
+ value[key],
1383
+ [...path, safeKey],
1384
+ depth + 1,
1385
+ layer,
1386
+ );
1214
1387
  }
1215
1388
  Object.defineProperty(output, safeKey, {
1216
1389
  value: projectedValue,
@@ -1223,7 +1396,7 @@ function sanitizePayload(payload) {
1223
1396
  };
1224
1397
  let content = visit(payload, [], 0);
1225
1398
  if (
1226
- Buffer.byteLength(canonicalJson(content), "utf8") > RULESET.maxModelBytes
1399
+ Buffer.byteLength(canonicalJson(content), "utf8") > ruleset.maxModelBytes
1227
1400
  ) {
1228
1401
  truncated = true;
1229
1402
  content = {
@@ -1241,12 +1414,21 @@ function sanitizePayload(payload) {
1241
1414
  byType[finding.type] = (byType[finding.type] || 0) + finding.count;
1242
1415
  paths.add(finding.path);
1243
1416
  }
1417
+ if (
1418
+ ruleset.overflowPolicy === "reject" &&
1419
+ (truncated || (byType["content-truncation"] ?? 0) > 0)
1420
+ ) {
1421
+ throw projectionError(
1422
+ EVOLUTION_PROJECTION_INVALID_CODE,
1423
+ "Agent model projection exceeds the content budget",
1424
+ );
1425
+ }
1244
1426
  const redactionSummary = {
1245
1427
  total: Object.values(byType).reduce((sum, count) => sum + count, 0),
1246
1428
  byType,
1247
1429
  paths: [...paths].sort(),
1248
1430
  };
1249
- assertNoKnownSecrets(content);
1431
+ assertNoKnownSecrets(content, patterns);
1250
1432
  return deepFreeze({
1251
1433
  content,
1252
1434
  redactionSummary,
@@ -1936,7 +2118,7 @@ function buildRawRecord(source, commitment, evidenceId, storage) {
1936
2118
  });
1937
2119
  }
1938
2120
 
1939
- function buildModelProjection(raw, sanitized) {
2121
+ function buildModelProjection(raw, sanitized, rulesetDigest) {
1940
2122
  const opaque = ["confidential", "restricted"].includes(raw.sensitivity);
1941
2123
  const core = {
1942
2124
  schema: EVOLUTION_MODEL_PROJECTION_SCHEMA,
@@ -1952,7 +2134,7 @@ function buildModelProjection(raw, sanitized) {
1952
2134
  : sanitized.redactionSummary,
1953
2135
  injectionFindings: opaque ? [] : sanitized.injectionFindings,
1954
2136
  truncated: opaque ? false : sanitized.truncated,
1955
- rulesetDigest: RULESET_DIGEST,
2137
+ rulesetDigest,
1956
2138
  };
1957
2139
  return deepFreeze({
1958
2140
  ...core,
@@ -1990,7 +2172,7 @@ function buildTrustedProjection(
1990
2172
  status,
1991
2173
  reasonCodes,
1992
2174
  content: status === "trusted" ? trustedSanitized.content : null,
1993
- rulesetDigest: RULESET_DIGEST,
2175
+ rulesetDigest: model.rulesetDigest,
1994
2176
  };
1995
2177
  return deepFreeze({
1996
2178
  ...core,
@@ -2013,7 +2195,7 @@ function buildReceipt(raw, model, trusted, createdAt) {
2013
2195
  rawRecordDigest: raw.rawRecordDigest,
2014
2196
  modelProjectionDigest: model.projectionDigest,
2015
2197
  trustedProjectionDigest: trusted.projectionDigest,
2016
- rulesetDigest: RULESET_DIGEST,
2198
+ rulesetDigest: model.rulesetDigest,
2017
2199
  redactionSummary: model.redactionSummary,
2018
2200
  injectionCount: model.injectionFindings.length,
2019
2201
  trustedStatus: trusted.status,
@@ -2767,6 +2949,13 @@ function validateBundleIntegrity(bundle) {
2767
2949
  "projection receipt",
2768
2950
  );
2769
2951
  validateRawMetadata(raw, receipt);
2952
+ const ruleset = SUPPORTED_RULESETS.get(model.rulesetDigest);
2953
+ if (!ruleset) {
2954
+ throw projectionError(
2955
+ EVOLUTION_PROJECTION_INVALID_CODE,
2956
+ "unsupported projection ruleset",
2957
+ );
2958
+ }
2770
2959
  validateRedactionSummary(model.redactionSummary);
2771
2960
  if (
2772
2961
  !Array.isArray(model.injectionFindings) ||
@@ -2864,9 +3053,8 @@ function validateBundleIntegrity(bundle) {
2864
3053
  canonicalJson(receipt.redactionSummary) !==
2865
3054
  canonicalJson(model.redactionSummary) ||
2866
3055
  receipt.trustedStatus !== trusted.status ||
2867
- model.rulesetDigest !== RULESET_DIGEST ||
2868
- trusted.rulesetDigest !== RULESET_DIGEST ||
2869
- receipt.rulesetDigest !== RULESET_DIGEST ||
3056
+ trusted.rulesetDigest !== model.rulesetDigest ||
3057
+ receipt.rulesetDigest !== model.rulesetDigest ||
2870
3058
  trusted.status !== expectedStatus ||
2871
3059
  canonicalJson(trusted.reasonCodes) !== canonicalJson(expectedReasons) ||
2872
3060
  (trusted.status === "quarantined" && trusted.content !== null) ||
@@ -2891,7 +3079,7 @@ function validateBundleIntegrity(bundle) {
2891
3079
  !Number.isSafeInteger(receipt.injectionCount) ||
2892
3080
  receipt.injectionCount < 0 ||
2893
3081
  Buffer.byteLength(canonicalJson(model.content), "utf8") >
2894
- RULESET.maxModelBytes
3082
+ ruleset.maxModelBytes
2895
3083
  ) {
2896
3084
  throw projectionError(
2897
3085
  EVOLUTION_PROJECTION_INVALID_CODE,
@@ -2899,11 +3087,40 @@ function validateBundleIntegrity(bundle) {
2899
3087
  );
2900
3088
  }
2901
3089
  if (model.content !== null) {
2902
- assertNoKnownSecrets(model.content);
3090
+ if (
3091
+ ruleset === AGENT_MODEL_RULESET ||
3092
+ ruleset === AGENT_MODEL_RULESET_V2 ||
3093
+ ruleset === AGENT_MODEL_RULESET_V1
3094
+ ) {
3095
+ snapshotAgentModelRequest(model.content, {
3096
+ allowStructuredArgumentText: ruleset !== AGENT_MODEL_RULESET_V1,
3097
+ allowOpaqueTransportBlocks: ruleset === AGENT_MODEL_RULESET,
3098
+ });
3099
+ if (
3100
+ model.truncated ||
3101
+ (model.redactionSummary.byType["content-truncation"] ?? 0) > 0
3102
+ ) {
3103
+ throw projectionError(
3104
+ EVOLUTION_PROJECTION_INVALID_CODE,
3105
+ "Agent model projection cannot be truncated",
3106
+ );
3107
+ }
3108
+ }
3109
+ if (
3110
+ ruleset.jsonTextPolicy &&
3111
+ canonicalJson(sanitizePayload(model.content, ruleset).content) !==
3112
+ canonicalJson(model.content)
3113
+ ) {
3114
+ throw projectionError(
3115
+ EVOLUTION_PROJECTION_INVALID_CODE,
3116
+ "Agent model JSON content is not a safe projection",
3117
+ );
3118
+ }
3119
+ assertNoKnownSecrets(model.content, valuePatterns(ruleset));
2903
3120
  assertNoInjectionText(model.content);
2904
3121
  }
2905
3122
  if (trusted.content !== null) {
2906
- assertNoKnownSecrets(trusted.content);
3123
+ assertNoKnownSecrets(trusted.content, valuePatterns(ruleset));
2907
3124
  assertNoInjectionText(trusted.content);
2908
3125
  }
2909
3126
  const attestation = validateAttestation(bundle.attestation, receipt);
@@ -3129,7 +3346,15 @@ export class EvolutionEvidenceProjector {
3129
3346
  return { iso, milliseconds: new Date(iso).getTime() };
3130
3347
  }
3131
3348
 
3132
- async project(input) {
3349
+ project(input) {
3350
+ return this.#project(input, RULESET);
3351
+ }
3352
+
3353
+ projectAgentModelRequest(input) {
3354
+ return this.#project(input, AGENT_MODEL_RULESET);
3355
+ }
3356
+
3357
+ async #project(input, ruleset) {
3133
3358
  assertExactRecord(input, INPUT_KEYS, "evidence projection input");
3134
3359
  if (
3135
3360
  typeof input.sourceEnvelope !== "string" ||
@@ -3141,7 +3366,10 @@ export class EvolutionEvidenceProjector {
3141
3366
  "sourceEnvelope is invalid",
3142
3367
  );
3143
3368
  }
3144
- const payload = cloneCanonical(input.payload);
3369
+ const payload =
3370
+ ruleset === AGENT_MODEL_RULESET
3371
+ ? snapshotAgentModelRequest(input.payload)
3372
+ : cloneCanonical(input.payload);
3145
3373
  const sourceInputDigest = digest(
3146
3374
  payload,
3147
3375
  "chainlesschain.evolution-raw-plaintext/v2",
@@ -3381,10 +3609,16 @@ export class EvolutionEvidenceProjector {
3381
3609
  injectionFindings: [],
3382
3610
  truncated: false,
3383
3611
  })
3384
- : sanitizePayload(payload);
3385
- const modelProjection = buildModelProjection(rawRecord, sanitized);
3612
+ : sanitizePayload(payload, ruleset);
3613
+ const modelProjection = buildModelProjection(
3614
+ rawRecord,
3615
+ sanitized,
3616
+ ruleset === AGENT_MODEL_RULESET
3617
+ ? EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_DIGEST
3618
+ : RULESET_DIGEST,
3619
+ );
3386
3620
  const trustedSanitized = source.compilable
3387
- ? sanitizePayload(source.trustedPayload)
3621
+ ? sanitizePayload(source.trustedPayload, RULESET, valuePatterns(ruleset))
3388
3622
  : null;
3389
3623
  const trustedInputStructured =
3390
3624
  source.compilable && isStructuredTrustedPayload(source.trustedPayload);