chainlesschain 0.166.17 → 0.166.18

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 (210) hide show
  1. package/README.md +14 -7
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-CVW2n2rh.js → AIOps-CQSBl3hY.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-DtuM163O.js → ActionButton-IQt-vRLt.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-BXvl_qHu.js → Analytics-DkHC8O7k.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-VDBTFKOp.js → AppLayout-CSti2P2T.js} +3 -3
  7. package/src/assets/web-panel/assets/{Artifacts-BNz2xCiG.js → Artifacts-C57hxn3v.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-DTu9Hn9P.js → Audit-DByLntcf.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-D2OCPzLe.js → BackgroundAgents-D1Bd2EOa.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-C9M-vG7G.js → Backup-VstHzHng.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-BUkCNiUQ.js → BaseInput-CLhdexIf.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-OJ2ajF7l.js → Chat-BefC_JZS.js} +6 -6
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BdZt76Ab.js → ChatBubbleRenderer-DbXMvgmn.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-C1gXKDsc.js → Checkbox-CEY982vx.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-BXbznLg7.js → Codegen-Dcm_DTvJ.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-CbCq5N0i.js → Col-C8SSu4KA.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-V8Ks6Yun.js → Community-BVV9vwRR.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-DkeHQTpQ.js → Compact-B7c5Vo18.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-JeLKwn4Q.js → Compliance-Tq9jSZ5a.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-azfetcBz.js → Cowork-BJUjT09Q.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-Q691i_Gp.js → Cron-CjV9PEaS.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-BLjDRbr_.js → Crosschain-Dl7ReL8F.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-D8ptXplK.js → DID-CG8PjWmM.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-Ctj2VVZL.js → Dashboard-CDBM6wmF.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-D8VgkMJ8.js → Dropdown-8_55bXTD.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-CQPe5S6q.js → EmailListRenderer-D3qOU1Cm.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-ySA-7SiN.js → FamilyGuardDashboard-Bv5oWMZF.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-1PMD-fBf.js → Federation-hpZ1xkKd.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-C_jr6U4Q.js → FormItemContext-BN7GT191.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-Bu3bKf2B.js → GenericCardRenderer-PCRhfA7M.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-Dv4Fa_T5.js → Git-CIlP2vy7.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-DOEy1n1k.js → Governance-81lgm7YL.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-DkvqzWcJ.js → Inference-Cs24xMOV.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-DdUJK949.js → KnowledgeGraph-CrJLVCZo.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-CRelcdUZ.js → Logs-DLyO8RKT.js} +2 -2
  36. package/src/assets/web-panel/assets/{MarkdownRenderer-0AHbbTA4.js → MarkdownRenderer-DBOqijrP.js} +1 -1
  37. package/src/assets/web-panel/assets/{Marketplace-BuuBKsev.js → Marketplace-Dz7AbQZc.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-DlgpEmA1.js → McpTools-BM0aFiWv.js} +3 -3
  39. package/src/assets/web-panel/assets/{Memory-DTfdqUGy.js → Memory-C9SJzENX.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-CXLE5ZFO.js → MobileBridge-BO2HnNRk.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-Dz25OB0n.js → MobileProjects-CK_jMz0l.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-kEL0fhgD.js → Mtc-CfhrJsdO.js} +2 -2
  43. package/src/assets/web-panel/assets/{MtcAudit-BE4UvFJU.js → MtcAudit-BE2ELxgI.js} +4 -4
  44. package/src/assets/web-panel/assets/{Multisig-CSApSn8c.js → Multisig-CgR_E3Jd.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-D11FpKWx.js → NLProgramming-Cw9445_K.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-CDL-D2CS.js → Notes-DZimkTrb.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-C0Q6lO-c.js → NotificationSettings-DxHVh4uT.js} +1 -1
  48. package/src/assets/web-panel/assets/OrderTableRenderer-Iy-pnX56.js +1 -0
  49. package/src/assets/web-panel/assets/{Organization-Dc-maVAq.js → Organization-pPXJtWo4.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-B5mUpSvi.js → Overflow-YamdTJwA.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-TjXV53wq.js → P2P-BvqP53x7.js} +2 -2
  52. package/src/assets/web-panel/assets/PdhVaultBrowser-Blz1Xn2n.js +7 -0
  53. package/src/assets/web-panel/assets/{Permissions-DKRzQ2O6.js → Permissions-CgFRQqFJ.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-Dx2eqft8.js → PersonalDataHub-CFeo3-6O.js} +4 -4
  55. package/src/assets/web-panel/assets/{Pipeline-CnYZMB5p.js → Pipeline-BkaRojEK.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-BonKpPnp.js → Privacy-BNZEx2Qp.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-DWO0Du3J.js → ProjectInit-HUBOgEEK.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-C9jqyYRv.js → ProjectSettings-CFMmhROS.js} +2 -2
  59. package/src/assets/web-panel/assets/{Projects-CYpKwXbz.js → Projects-Dc517BXp.js} +1 -1
  60. package/src/assets/web-panel/assets/{Providers-CW-fkwJq.js → Providers-DTLf8bgj.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-Cw0J3Zud.js → QrScannerModal-BBNjPszk.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-BH4A4IpR.js → QuickAsk-DCsHvk3G.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-CDwMwJus.js → Recommend-Dpr5YSop.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-DKIPwzTf.js → RemoteSession-DmKnvqGg.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-CklDj7qS.js → Reputation-CSRfuurX.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-DJWZKsH0.js → Row-CDj3pQ_w.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-BfSLCewo.js → RssFeed-DI0a_kNq.js} +2 -2
  68. package/src/assets/web-panel/assets/{Search-B0IST--x.js → Search-jAy7B2nU.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-h1sYNWtt.js → Security-CkHTqYhc.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-Gh0-oxI_.js → Services-CP-0Nzga.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-CNDV_jOs.js → Skeleton-BkF5-p3n.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-ByCLTh1n.js → Skills-BDu-utDE.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-BfyrJTJz.js → Sla-CQvq_2Qb.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-BQzo9kNX.js → SpeechSettings-T7Ap512g.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-B6fS6z_1.js → SyncSettings-Bt-PLvot.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-C-uKCP-l.js → Tasks-yLEcCogg.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-D6oDy7wL.js → Templates-ByN3fmbr.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-D3LT2wNQ.js → Tenant-DBI7hITH.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-BteLcv_O.js → Terminal-B77_DlGX.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-DHHuxfqH.js → TimelineRenderer-CsLTB_QO.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-BRQeykXw.js → Tokens-BV2N6cR8.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-p2XaFWEu.js → Trigger-CjXWGH3p.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-BxadBMft.js → Trust-uqXIq3WC.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-DRBP7LDk.js → UkeySign-D-6qu4vY.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-CZ3NZkh7.js → VideoEditing-CxGmx_2e.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-C3NTBN7G.js → Wallet-DSq7WlAg.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-C7LVgMlb.js → WebAuthn-CDBiD57O.js} +2 -2
  88. package/src/assets/web-panel/assets/{WorkflowEditor-0_Iveog7.js → WorkflowEditor-Z8f63TSb.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-DzzluYo3.js → chat-B-UZFBjy.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-DSMYXpaj.js → colors-CFk7K-7Q.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-W76u1VSV.js → compact-item-X0IVMvgi.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-otsESjb5.js → createContext-DWg4j2n6.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-B2IW1J_J.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-3sNLrvug.js → hasIn-CkVCwNNF.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BdtmEKat.js → index-5OcZHdzc.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DS9WYDMf.js → index-B273IY-E.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-NaO9AE-F.js → index-B3-B3FWD.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BcGJtmHM.js → index-BB4KHHcv.js} +1 -1
  99. package/src/assets/web-panel/assets/index-BCp2ir-1.js +1 -0
  100. package/src/assets/web-panel/assets/{index-pVm_iUre.js → index-BG-GaZri.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BpcQYzP7.js → index-BPBia4b-.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BXLx9HfA.js → index-BipwEbTA.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-uSCkbpZH.js → index-BoskgPt9.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DMmdIpLA.js → index-Btqk6zWb.js} +1 -1
  105. package/src/assets/web-panel/assets/index-Bw4iuzRD.js +1 -0
  106. package/src/assets/web-panel/assets/{index-DLDh1OW3.js → index-BzXjYUmd.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-B9X_jqXe.js → index-C1ZAOJRW.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-vBKPcmAP.js → index-CCLwoATF.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-vUmYkqmu.js → index-CDfSD07S.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D7A5U2IH.js → index-CLlP1E4X.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-ClOFeZ-t.js → index-CMCEXBRh.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Cg86EzNp.js → index-CN8HZlLH.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Ddd4mird.js → index-CNKFsBlz.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CE7tSow-.js → index-CUBkvFPH.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-GlIOE4ja.js → index-Ca0mij1n.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DdU7IkKX.js → index-CbIAWbma.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-UUHCwfNq.js → index-CbihMThv.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BRsD1PT2.js → index-CvOa-IFV.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-C2aht9-M.js → index-Cvwu_rA_.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BJsQio5O.js → index-D-EJNxgR.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-q7ftLqNt.js → index-D8uEL8Uw.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B1I1AYJs.js → index-D92g4l3n.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DZKAzEge.js → index-DCqpl_E_.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CKoFyHYQ.js → index-DLSBks8h.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BDlDO2px.js → index-Db_5xhrU.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CENWwjef.js → index-DcDggpWR.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DH4cl52p.js → index-DeWKPQGs.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DTA8Iavv.js → index-DhVHoqGL.js} +3 -3
  129. package/src/assets/web-panel/assets/{index-DmpaC2yk.js → index-DyWlOuak.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BA8mZxd-.js → index-LU54bChK.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CtFOt5x1.js → index-OjnAwUJo.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-B5LOYdYm.js → index-P83LDnCz.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-MhQQ3h8q.js → index-_-9k3Tna.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-DF6llUXV.js → initDefaultProps-CFNgY8lJ.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-vtDV8_5K.js → motion-D-5RrDzn.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-B6c0bdy2.js → move-DN-L0Bd-.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-DlLYWuBK.js → mtc-parser-6mgLSeCK.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-BH0zOxLN.js → omit-ClWW8eTP.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-D9di8_In.js → pickAttrs-Vystq3R8.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-BDSngufM.js → placementArrow-D0H9hK4W.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-C_EawMvP.js → responsiveObserve-B3iNRU-a.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-B_4wShxA.js → slide-CiMXe6am.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-CbQu6qJ-.js → statusUtils-CGDZJ1uT.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-CvXJWYXb.js → styleChecker-D2zA6NkY.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-jjY1XknO.js → useFlexGapSupport-C1sYU6QE.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-CMXBdsK_.js → useFs-BzUHSjg2.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-YbAhhPXx.js → usePersonalDataHub-CxB5yZCq.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-BFCTKc0H.js → vnode-BfUfMwtc.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-CY9aBl5O.js → zoom-CFYmj1TO.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +1 -1
  152. package/src/commands/agent.js +80 -2
  153. package/src/commands/evolution.js +33 -27
  154. package/src/commands/serve.js +11 -2
  155. package/src/data/changelog.json +5 -5
  156. package/src/gateways/ws/session-protocol.js +1 -0
  157. package/src/gateways/ws/ws-agent-handler.js +70 -2
  158. package/src/gateways/ws/ws-server.js +8 -0
  159. package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
  160. package/src/lib/app-server/graph-runtime.js +115 -8
  161. package/src/lib/app-server/server.js +21 -2
  162. package/src/lib/app-server/websocket-transport.js +2 -0
  163. package/src/lib/evolution/agent-evolution-ingress.js +300 -0
  164. package/src/lib/evolution/agent-evolution-runtime-composition-brand.js +22 -0
  165. package/src/lib/evolution/agent-evolution-runtime-composition.js +369 -0
  166. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +752 -0
  167. package/src/lib/evolution/evolution-artifact-ports.js +48 -0
  168. package/src/lib/evolution/evolution-eval-gate.js +11 -4
  169. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +499 -0
  170. package/src/lib/evolution/evolution-evidence-projector.js +61 -1
  171. package/src/lib/evolution/evolution-file-witness.js +601 -0
  172. package/src/lib/evolution/evolution-ledger-file-backend.js +176 -0
  173. package/src/lib/evolution/evolution-ledger-ports.js +353 -16
  174. package/src/lib/evolution/evolution-ledger.js +1355 -54
  175. package/src/lib/evolution/evolution-run-ledger-adapter.js +409 -0
  176. package/src/lib/evolution/evolution-run-wiki-maintenance-source.js +300 -0
  177. package/src/lib/evolution/scheduled-batch-wiki-maintenance-source.js +368 -0
  178. package/src/lib/evolution/skill-candidate-registry.js +649 -0
  179. package/src/lib/evolution/skill-promotion-controller.js +109 -38
  180. package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +451 -0
  181. package/src/lib/evolution/skill-promotion-review.js +793 -0
  182. package/src/lib/evolution/skill-registry-transition-capability.js +55 -0
  183. package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +1280 -0
  184. package/src/lib/evolution/skill-registry-transition-source.js +372 -0
  185. package/src/lib/evolution/skill-release-registry.js +2191 -11
  186. package/src/lib/evolution/skill-target-matrix-eval.js +133 -10
  187. package/src/lib/evolution/structured-memory-agent-control-plane.js +222 -0
  188. package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +351 -0
  189. package/src/lib/evolution/structured-memory-ledger-adapter.js +220 -0
  190. package/src/lib/evolution/structured-memory-policy-receipt-writer.js +164 -0
  191. package/src/lib/evolution/structured-memory-post-compact-hook.js +87 -0
  192. package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +221 -0
  193. package/src/lib/evolution/structured-memory-semantic-review-pipeline.js +313 -0
  194. package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +200 -0
  195. package/src/lib/evolution/wiki-maintenance-trigger-ledger-adapter.js +687 -0
  196. package/src/lib/evolution-system.js +65 -30
  197. package/src/lib/mcp-lifecycle-authority.js +21 -2
  198. package/src/lib/remote-approval-bridge.js +24 -0
  199. package/src/lib/scheduler-kernel/store.js +62 -14
  200. package/src/repl/agent-repl.js +45 -0
  201. package/src/runtime/agent-runtime.js +114 -1
  202. package/src/runtime/headless-runner.js +19 -0
  203. package/src/runtime/headless-stream.js +43 -0
  204. package/src/runtime/runtime-factory.js +19 -1
  205. package/src/assets/web-panel/assets/OrderTableRenderer-ZRE0OKbj.js +0 -1
  206. package/src/assets/web-panel/assets/PdhVaultBrowser-DvV2btIr.js +0 -7
  207. package/src/assets/web-panel/assets/devWarning-BztaXF84.js +0 -1
  208. package/src/assets/web-panel/assets/index-4jP_hG_4.js +0 -1
  209. package/src/assets/web-panel/assets/index-zxwuAXL5.js +0 -1
  210. package/src/lib/learning/learning-hooks.js +0 -123
@@ -0,0 +1,372 @@
1
+ import { createHash } from "node:crypto";
2
+ import { types as utilTypes } from "node:util";
3
+
4
+ import { SKILL_MUTATION_RECEIPT_KINDS } from "./skill-mutation-authority.js";
5
+
6
+ export const SKILL_REGISTRY_TRANSITION_SOURCE_SCHEMA =
7
+ "chainlesschain.skill-registry-transition-source/v1";
8
+ export const SKILL_REGISTRY_TRANSITION_SOURCE_REQUEST_SCHEMA =
9
+ "chainlesschain.skill-registry-transition-source-request/v1";
10
+ export const SKILL_REGISTRY_CANDIDATE_CREATED_RESOLUTION_SCHEMA =
11
+ "chainlesschain.skill-registry-candidate-created-resolution/v1";
12
+ export const SKILL_REGISTRY_EVAL_COMPLETED_RESOLUTION_SCHEMA =
13
+ "chainlesschain.skill-registry-eval-completed-resolution/v1";
14
+ export const SKILL_REGISTRY_HUMAN_TASK_SETTLED_RESOLUTION_SCHEMA =
15
+ "chainlesschain.skill-registry-human-task-settled-resolution/v1";
16
+ export const SKILL_REGISTRY_TRANSITION_SOURCE_INVALID_CODE =
17
+ "CC_SKILL_REGISTRY_TRANSITION_SOURCE_INVALID";
18
+
19
+ const SOURCES = new WeakSet();
20
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
21
+ const SKILL_NAME = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u;
22
+ const VERIFY_KEYS = new Set([
23
+ "candidateCreatedRef",
24
+ "evalCompletedRef",
25
+ "humanTaskSettledRef",
26
+ ]);
27
+ const RESOLUTION_REQUEST_KEYS = new Set(["schema", "tenantId", "ref"]);
28
+ const CANDIDATE_KEYS = new Set([
29
+ "schema",
30
+ "authenticated",
31
+ "durable",
32
+ "tenantId",
33
+ "ref",
34
+ "candidateId",
35
+ "skillName",
36
+ "candidateReceipt",
37
+ "actorReceipt",
38
+ "parentReceipt",
39
+ "targetReceipt",
40
+ "effectiveAt",
41
+ "receiptDigest",
42
+ ]);
43
+ const EVAL_KEYS = new Set([
44
+ "schema",
45
+ "authenticated",
46
+ "durable",
47
+ "tenantId",
48
+ "ref",
49
+ "candidateId",
50
+ "skillName",
51
+ "matrixContext",
52
+ "evalReceipt",
53
+ "effectiveAt",
54
+ "receiptDigest",
55
+ ]);
56
+ const HUMAN_KEYS = new Set([
57
+ "schema",
58
+ "authenticated",
59
+ "durable",
60
+ "tenantId",
61
+ "ref",
62
+ "candidateId",
63
+ "skillName",
64
+ "policyReceipt",
65
+ "effectiveAt",
66
+ "receiptDigest",
67
+ ]);
68
+ const MATRIX_KEYS = new Set([
69
+ "baselineId",
70
+ "matrixAuthorityRoot",
71
+ "matrixEvalId",
72
+ "planDigest",
73
+ ]);
74
+
75
+ function failure(message, options) {
76
+ const error = new Error(message, options);
77
+ error.code = SKILL_REGISTRY_TRANSITION_SOURCE_INVALID_CODE;
78
+ return error;
79
+ }
80
+
81
+ function canonical(value) {
82
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
83
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
84
+ return `{${Object.keys(value)
85
+ .sort()
86
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
87
+ .join(",")}}`;
88
+ }
89
+
90
+ function hash(value) {
91
+ return `sha256:${createHash("sha256").update(canonical(value)).digest("hex")}`;
92
+ }
93
+
94
+ function deepFreeze(value, seen = new WeakSet()) {
95
+ if (!value || typeof value !== "object" || seen.has(value)) return value;
96
+ seen.add(value);
97
+ Object.freeze(value);
98
+ for (const child of Object.values(value)) deepFreeze(child, seen);
99
+ return value;
100
+ }
101
+
102
+ function assertExactRecord(value, keys, label) {
103
+ if (
104
+ !value ||
105
+ typeof value !== "object" ||
106
+ Array.isArray(value) ||
107
+ utilTypes.isProxy(value) ||
108
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value))
109
+ ) {
110
+ throw failure(`${label} must be a plain object`);
111
+ }
112
+ const ownKeys = Reflect.ownKeys(value);
113
+ if (
114
+ ownKeys.length !== keys.size ||
115
+ ownKeys.some((key) => typeof key !== "string" || !keys.has(key))
116
+ ) {
117
+ throw failure(`${label} must contain exactly the supported fields`);
118
+ }
119
+ for (const key of ownKeys) {
120
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
121
+ if (!descriptor || !("value" in descriptor) || !descriptor.enumerable) {
122
+ throw failure(`${label}.${String(key)} must be a data field`);
123
+ }
124
+ }
125
+ }
126
+
127
+ function requiredString(value, label, maximum = 512) {
128
+ if (
129
+ typeof value !== "string" ||
130
+ value.trim() === "" ||
131
+ value.trim() !== value ||
132
+ Buffer.byteLength(value, "utf8") > maximum
133
+ ) {
134
+ throw failure(`${label} is invalid`);
135
+ }
136
+ return value;
137
+ }
138
+
139
+ function requiredDigest(value, label) {
140
+ if (typeof value !== "string" || !DIGEST.test(value)) {
141
+ throw failure(`${label} must be sha256-bound`);
142
+ }
143
+ return value;
144
+ }
145
+
146
+ function timestamp(value, label) {
147
+ requiredString(value, label, 64);
148
+ const parsed = new Date(value);
149
+ if (!Number.isFinite(parsed.getTime()) || parsed.toISOString() !== value) {
150
+ throw failure(`${label} must be a canonical timestamp`);
151
+ }
152
+ return value;
153
+ }
154
+
155
+ function normalizeInput(input) {
156
+ assertExactRecord(input, VERIFY_KEYS, "transition source input");
157
+ return deepFreeze({
158
+ candidateCreatedRef: requiredString(
159
+ input.candidateCreatedRef,
160
+ "candidateCreatedRef",
161
+ ),
162
+ evalCompletedRef: requiredString(
163
+ input.evalCompletedRef,
164
+ "evalCompletedRef",
165
+ ),
166
+ humanTaskSettledRef: requiredString(
167
+ input.humanTaskSettledRef,
168
+ "humanTaskSettledRef",
169
+ ),
170
+ });
171
+ }
172
+
173
+ function normalizeMatrixContext(value) {
174
+ assertExactRecord(value, MATRIX_KEYS, "matrixContext");
175
+ return deepFreeze({
176
+ baselineId: requiredString(value.baselineId, "matrixContext.baselineId"),
177
+ matrixAuthorityRoot: requiredDigest(
178
+ value.matrixAuthorityRoot,
179
+ "matrixContext.matrixAuthorityRoot",
180
+ ),
181
+ matrixEvalId: requiredString(
182
+ value.matrixEvalId,
183
+ "matrixContext.matrixEvalId",
184
+ ),
185
+ planDigest: requiredDigest(value.planDigest, "matrixContext.planDigest"),
186
+ });
187
+ }
188
+
189
+ function captureResolver(owner, label) {
190
+ if (
191
+ !owner ||
192
+ typeof owner !== "object" ||
193
+ utilTypes.isProxy(owner) ||
194
+ typeof owner.resolve !== "function" ||
195
+ utilTypes.isProxy(owner.resolve)
196
+ ) {
197
+ throw new TypeError(`${label}.resolve is required`);
198
+ }
199
+ const resolve = owner.resolve.bind(owner);
200
+ Object.freeze(owner);
201
+ return resolve;
202
+ }
203
+
204
+ async function resolveEvent(resolve, tenantId, ref, schema, keys, label) {
205
+ const request = deepFreeze({
206
+ schema: SKILL_REGISTRY_TRANSITION_SOURCE_REQUEST_SCHEMA,
207
+ tenantId,
208
+ ref,
209
+ });
210
+ assertExactRecord(request, RESOLUTION_REQUEST_KEYS, `${label} request`);
211
+ let result;
212
+ try {
213
+ result = await resolve(request);
214
+ } catch (cause) {
215
+ throw failure(`${label} resolver failed closed`, { cause });
216
+ }
217
+ assertExactRecord(result, keys, `${label} resolution`);
218
+ if (
219
+ result.schema !== schema ||
220
+ result.authenticated !== true ||
221
+ result.durable !== true ||
222
+ result.tenantId !== tenantId ||
223
+ result.ref !== ref ||
224
+ !DIGEST.test(result.candidateId ?? "") ||
225
+ !SKILL_NAME.test(result.skillName ?? "") ||
226
+ !DIGEST.test(result.receiptDigest ?? "")
227
+ ) {
228
+ throw failure(`${label} resolution is not durably bound`);
229
+ }
230
+ timestamp(result.effectiveAt, `${label}.effectiveAt`);
231
+ return result;
232
+ }
233
+
234
+ export function createSkillRegistryTransitionSource({
235
+ tenantId: tenantInput,
236
+ candidateCreatedResolver,
237
+ evalCompletedResolver,
238
+ humanTaskSettledResolver,
239
+ } = {}) {
240
+ const tenantId = requiredString(tenantInput, "tenantId", 256);
241
+ const resolveCandidate = captureResolver(
242
+ candidateCreatedResolver,
243
+ "candidateCreatedResolver",
244
+ );
245
+ const resolveEval = captureResolver(
246
+ evalCompletedResolver,
247
+ "evalCompletedResolver",
248
+ );
249
+ const resolveHuman = captureResolver(
250
+ humanTaskSettledResolver,
251
+ "humanTaskSettledResolver",
252
+ );
253
+ const source = {
254
+ schema: SKILL_REGISTRY_TRANSITION_SOURCE_SCHEMA,
255
+ tenantId,
256
+ async verify(input) {
257
+ const refs = normalizeInput(input);
258
+ const [candidate, evaluation, human] = await Promise.all([
259
+ resolveEvent(
260
+ resolveCandidate,
261
+ tenantId,
262
+ refs.candidateCreatedRef,
263
+ SKILL_REGISTRY_CANDIDATE_CREATED_RESOLUTION_SCHEMA,
264
+ CANDIDATE_KEYS,
265
+ "CandidateCreated",
266
+ ),
267
+ resolveEvent(
268
+ resolveEval,
269
+ tenantId,
270
+ refs.evalCompletedRef,
271
+ SKILL_REGISTRY_EVAL_COMPLETED_RESOLUTION_SCHEMA,
272
+ EVAL_KEYS,
273
+ "EvalCompleted",
274
+ ),
275
+ resolveEvent(
276
+ resolveHuman,
277
+ tenantId,
278
+ refs.humanTaskSettledRef,
279
+ SKILL_REGISTRY_HUMAN_TASK_SETTLED_RESOLUTION_SCHEMA,
280
+ HUMAN_KEYS,
281
+ "HumanTaskSettled",
282
+ ),
283
+ ]);
284
+ if (
285
+ evaluation.candidateId !== candidate.candidateId ||
286
+ human.candidateId !== candidate.candidateId ||
287
+ evaluation.skillName !== candidate.skillName ||
288
+ human.skillName !== candidate.skillName ||
289
+ Date.parse(candidate.effectiveAt) >
290
+ Date.parse(evaluation.effectiveAt) ||
291
+ Date.parse(evaluation.effectiveAt) > Date.parse(human.effectiveAt)
292
+ ) {
293
+ throw failure(
294
+ "CandidateCreated/EvalCompleted/HumanTaskSettled bindings or order differ",
295
+ );
296
+ }
297
+ const matrixContext = normalizeMatrixContext(evaluation.matrixContext);
298
+ const receipts = deepFreeze({
299
+ candidateReceipt: requiredString(
300
+ candidate.candidateReceipt,
301
+ "candidateReceipt",
302
+ 4096,
303
+ ),
304
+ evalReceipt: requiredString(
305
+ evaluation.evalReceipt,
306
+ "evalReceipt",
307
+ 4096,
308
+ ),
309
+ policyReceipt: requiredString(
310
+ human.policyReceipt,
311
+ "policyReceipt",
312
+ 4096,
313
+ ),
314
+ actorReceipt: requiredString(
315
+ candidate.actorReceipt,
316
+ "actorReceipt",
317
+ 4096,
318
+ ),
319
+ parentReceipt: requiredString(
320
+ candidate.parentReceipt,
321
+ "parentReceipt",
322
+ 4096,
323
+ ),
324
+ targetReceipt: requiredString(
325
+ candidate.targetReceipt,
326
+ "targetReceipt",
327
+ 4096,
328
+ ),
329
+ });
330
+ if (
331
+ Reflect.ownKeys(receipts).length !== SKILL_MUTATION_RECEIPT_KINDS.length
332
+ ) {
333
+ throw failure("transition source receipt set is incomplete");
334
+ }
335
+ const sourceReceiptDigest = hash({
336
+ schema: SKILL_REGISTRY_TRANSITION_SOURCE_SCHEMA,
337
+ tenantId,
338
+ candidateId: candidate.candidateId,
339
+ skillName: candidate.skillName,
340
+ refs,
341
+ candidateReceiptDigest: candidate.receiptDigest,
342
+ evalReceiptDigest: evaluation.receiptDigest,
343
+ humanTaskReceiptDigest: human.receiptDigest,
344
+ matrixContext,
345
+ receipts,
346
+ });
347
+ return deepFreeze({
348
+ authenticated: true,
349
+ durable: true,
350
+ tenantId,
351
+ candidateId: candidate.candidateId,
352
+ skillName: candidate.skillName,
353
+ ...refs,
354
+ matrixContext,
355
+ receipts,
356
+ effectiveAt: human.effectiveAt,
357
+ sourceReceiptDigest,
358
+ });
359
+ },
360
+ };
361
+ SOURCES.add(source);
362
+ return Object.freeze(source);
363
+ }
364
+
365
+ export function captureSkillRegistryTransitionSource(value) {
366
+ if (!value || !SOURCES.has(value)) {
367
+ throw new TypeError(
368
+ "a branded Skill Registry transition source is required",
369
+ );
370
+ }
371
+ return value;
372
+ }