chainlesschain 0.166.38 → 0.166.39

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 (196) hide show
  1. package/package.json +6 -1
  2. package/scripts/governed-learning-local-attestor-service.mjs +222 -0
  3. package/scripts/governed-learning-local-attestor-trust-approval-service.mjs +338 -0
  4. package/scripts/governed-learning-local-attestor-trust-operations-service.mjs +575 -0
  5. package/scripts/governed-learning-windows-secure-pipe-broker.ps1 +375 -0
  6. package/src/assets/web-panel/assets/{AIOps-DBbcVPqB.js → AIOps-qWUdiFr5.js} +1 -1
  7. package/src/assets/web-panel/assets/{ActionButton-D5vETPOk.js → ActionButton-B_f7go3E.js} +1 -1
  8. package/src/assets/web-panel/assets/{Analytics-WVhas3Fw.js → Analytics-hSGFlSkB.js} +3 -3
  9. package/src/assets/web-panel/assets/{AppLayout-CSTRI93Q.js → AppLayout-CCYGgj71.js} +5 -5
  10. package/src/assets/web-panel/assets/{Artifacts-BZT8FOoE.js → Artifacts-BdS1H9gq.js} +1 -1
  11. package/src/assets/web-panel/assets/{Audit-CT2-Tsby.js → Audit-Cck9IebC.js} +1 -1
  12. package/src/assets/web-panel/assets/{BackgroundAgents-BWA5LNBe.js → BackgroundAgents-DZzoM_QS.js} +1 -1
  13. package/src/assets/web-panel/assets/{Backup-B-zEbldA.js → Backup-D8H_QtGu.js} +1 -1
  14. package/src/assets/web-panel/assets/{BaseInput-BAEwtdNT.js → BaseInput-CTsNF_pu.js} +1 -1
  15. package/src/assets/web-panel/assets/{Chat-BT1-y6t1.js → Chat-CcEiTYY8.js} +6 -6
  16. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BVijMHeO.js → ChatBubbleRenderer-9BY1DPuc.js} +1 -1
  17. package/src/assets/web-panel/assets/{Checkbox-B8IJYZsD.js → Checkbox-BPB9NNJx.js} +1 -1
  18. package/src/assets/web-panel/assets/{Codegen-DEt453nL.js → Codegen-CKKMf7jD.js} +1 -1
  19. package/src/assets/web-panel/assets/{Col-DWuVSmZv.js → Col-DpSSB4Uu.js} +1 -1
  20. package/src/assets/web-panel/assets/{Community-CcoNuU33.js → Community-CfR6ikoH.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compact-BKtuIYWA.js → Compact-CqnkGGjK.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compliance-bHzxGq3P.js → Compliance-9IzhdVQb.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cowork-BY2Kb15t.js → Cowork-eXsgH33N.js} +2 -2
  24. package/src/assets/web-panel/assets/{Cron-DC-j0jvp.js → Cron-DvkzHFRi.js} +2 -2
  25. package/src/assets/web-panel/assets/{Crosschain-CzEuAHQz.js → Crosschain--az9d9f7.js} +1 -1
  26. package/src/assets/web-panel/assets/{DID-7QUNq6Fz.js → DID-_Eb4kpnJ.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dashboard-CT6RiEFl.js → Dashboard-aDVisdXj.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dropdown-CW8IPY7r.js → Dropdown-oQ54XzS9.js} +1 -1
  29. package/src/assets/web-panel/assets/{EmailListRenderer-Zt8WOLuN.js → EmailListRenderer-BUPdMau1.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-B6aymxi7.js → FamilyGuardDashboard-DtQTOCQI.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-BiuFrRq0.js → Federation-Cpnb3Moe.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-DaiOAkHa.js → FormItemContext-DmsrJkeU.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-D1KbDpXs.js → GenericCardRenderer-CpFDYnh3.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-BILl0huA.js → Git-HFG17p7Q.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-CLyhrPrh.js → Governance-D5Z5c7N8.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-DyNhiIpK.js → Inference-DH159h74.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-Bor_ye4m.js → KnowledgeGraph-DuL1pcJD.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-ZDqbu8kg.js → Logs-Gqn8hFsM.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-NHJaejHI.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-DbDi29dH.js → Marketplace-BArcWifg.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-DfU8dWbV.js → McpTools-Q1BfBSnd.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-DeAz-2-6.js → Memory-Cz8nRL7N.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-ws3TJXal.js → MobileBridge-CRuxLRJw.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-CGwVfeTv.js → MobileProjects-B1CQIAGp.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-BtJjJJpl.js → Mtc-CFhXZbPk.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-BNZwipXs.js → MtcAudit-C69LqcZ5.js} +5 -5
  47. package/src/assets/web-panel/assets/{Multisig-9mSOrKWA.js → Multisig-y7yZeTTG.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-gz1lEDED.js → NLProgramming-DgjhoWea.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-BeufuOVX.js → Notes-DRc2WTDh.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-CbFyi9jZ.js → NotificationSettings-CLPx24yn.js} +1 -1
  51. package/src/assets/web-panel/assets/OrderTableRenderer-CMSNA4CO.js +1 -0
  52. package/src/assets/web-panel/assets/{Organization-DKBKNViH.js → Organization-Dm6LIyhZ.js} +2 -2
  53. package/src/assets/web-panel/assets/{Overflow-CvPfKE1x.js → Overflow-DP4DOYd-.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-DjL2q8og.js → P2P-HFwvtFI1.js} +2 -2
  55. package/src/assets/web-panel/assets/PdhVaultBrowser-D9gPfKRM.js +7 -0
  56. package/src/assets/web-panel/assets/{Permissions-BUoNho3w.js → Permissions-Bdtxniwh.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-C4Iu2Pic.js → PersonalDataHub-Dgl2AbES.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-BiDrIlwr.js → Pipeline-DpZrzYwK.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-BnvU6vGp.js → Privacy-EQ551c0t.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-DDzoyhnH.js → ProjectInit-xUSeczsM.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-CV6b43H0.js → ProjectSettings-B66Sr_t8.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-B0k1907g.js → Projects-B4zikj95.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-DaeuFo-x.js → Providers-DjLbqQPh.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-C03Bll1h.js → QrScannerModal-KVsAQCd_.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-Cn9nLaen.js → QuickAsk-C4noJXu8.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-BXfkC8Ts.js → Recommend-Cn15clqY.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-DNj6D_LI.js → RemoteSession-DdonMFwH.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-DDDIwiUI.js → Reputation-Bqe3NwWN.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-JukNm-id.js → Row-CnxBgjkD.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-B1AhzL2z.js → RssFeed-CSRrgZyK.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-B5y6_DVm.js → Search-DTUYUfFx.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-C2pvv32x.js → Security-BHExHVIm.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-DBka7ppY.js → Services-B_IWqPes.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-DfPwNTSh.js → Skeleton-C_oAtzmX.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-Cs4ntp-l.js → Skills-maJNokSL.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-CrUJ0guM.js → Sla-CMM_ZsLH.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-BFbokLV1.js → SpeechSettings-D7w_oNwK.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-CSnh1o3D.js → SyncSettings-D0Zl3NIr.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-CQZppIPo.js → Tasks-Bs0H0ctR.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-BqLeHq7Z.js → Templates-C6T6oCpR.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-CkzPA-ri.js → Tenant-ByL-kAYO.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-D5IRhnu6.js → Terminal-6JXNhc3b.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-ICdiYzgz.js → TimelineRenderer-KiuUtCsl.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-89CaZBwe.js → Tokens-C0TWTIER.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-Di251qR1.js → Trigger-DpC5aaJu.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-M4sC3Mv6.js → Trust-lqqflCwv.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-BL7EUWxj.js → UkeySign-BYSlVfBc.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-BV5Se5il.js → VideoEditing-DX08oo_R.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-IoY13rov.js → Wallet-CcIFPvzL.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-DKFPq0uV.js → WebAuthn-D8DfxfVT.js} +5 -5
  91. package/src/assets/web-panel/assets/{WorkflowEditor-oizkYeQD.js → WorkflowEditor-Csadpaln.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-Du6ZthE5.js → chat-CewHWc_T.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-I2ie73HS.js → colors-B8at89r3.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-C-02XOOx.js → compact-item-v_gxtF5-.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-DgP09zg2.js → createContext-BOwFpJqA.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-DenB_kSS.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-kWDasRib.js → hasIn-DjHUzt7E.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-HH3Zccc0.js → index-1Tfwr_GA.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-M9mzJo6V.js → index-5qmLo1us.js} +1 -1
  100. package/src/assets/web-panel/assets/index-B8bNwM9U.js +1 -0
  101. package/src/assets/web-panel/assets/{index-CDM6OO4D.js → index-BC20EQ7h.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Cokjvq67.js → index-BGrmPk8T.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-5Ll5Fdqb.js → index-BPJ7uL2Q.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-H_31JkaZ.js → index-BRNyE3Kb.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-D9HwtJX5.js → index-BVPsegMN.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-Bpz5RnQy.js → index-B_egGFcR.js} +3 -3
  107. package/src/assets/web-panel/assets/{index-CjuJ1FYZ.js → index-BdZLA7k9.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Cx5dAdFu.js → index-Bk_Te9OR.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CHSghc3j.js → index-Bz8C8VXx.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-RwcHDSqP.js → index-C7MHbmwn.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CtbMRqD-.js → index-CFL1Hewx.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-D0EQSoEb.js → index-CV1SgaBd.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-C3D5NSjS.js → index-CXIPAeAB.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BZ6bWk4x.js → index-Ca8YZU2B.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-AtAiEmjM.js → index-Caf9UjhG.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DKJ-d5F1.js → index-Cb1uNDOv.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-mF8UmKqp.js → index-CquUCUzS.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CpOQeTac.js → index-CwHoF-TP.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Na5QA1LE.js → index-Cxk0mCoQ.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BUvpjPMv.js → index-D3o-pacB.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BZcdP3id.js → index-DA3n0Y28.js} +1 -1
  122. package/src/assets/web-panel/assets/index-DC0cpgIP.js +1 -0
  123. package/src/assets/web-panel/assets/{index-LLQQqj9B.js → index-DRRK_8Eg.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-D5LV04FO.js → index-DUMvVGyf.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BkcCllZ7.js → index-DdHdbXpy.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-OYyn8GoU.js → index-Ddw05Myq.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CgogPjKJ.js → index-Dfrb3Prv.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CbHEQTU6.js → index-DiKaYIdo.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CQCdk4dn.js → index-DmZLZsyC.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-uHI8QHu4.js → index-FgUrhq_H.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-I4A_y2Ee.js → index-Khw7wzVk.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BSlTGxUJ.js → index-San3zacc.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-BYxia8nl.js → index-coOi37of.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CkP2DW3a.js → index-hyeBuocp.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-Ryflob2W.js → index-uk59xr0W.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-DcVj7YJB.js → index-wjvn8-9F.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-BPHGo-UX.js → initDefaultProps-Id2dFdjh.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-BBr8JvWc.js → motion-DRxtwxng.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-CdKWToz7.js → move-BDYvdTb6.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-B8tkkKBs.js → mtc-parser-cz8LGI8Z.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-DN4aP33H.js → omit-DHJeh6tH.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-CoHRkRJq.js → pickAttrs-XJEQIp7e.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-DpGGGAPa.js → placementArrow-AFcf8lEn.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-BabRsZo5.js → responsiveObserve-CDEeBxs1.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-DJjyrwqK.js → slide-CvbVfi6T.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-BaRVkO5S.js → statusUtils-DtCyuEnq.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-HcMYUjTR.js → styleChecker--UgmTsGY.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-c3IBzp2l.js → useFlexGapSupport-D9i1as-Y.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-DD7igwyF.js → useFs-CJx3zw01.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-GEF0hhnd.js → usePersonalDataHub-ZsIKYdZv.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-D51u7zqF.js → vnode-B2RGEQG4.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-tXG23Lc9.js → zoom-ob-0px2z.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +1 -1
  155. package/src/commands/evolution-attestor-trust.js +113 -0
  156. package/src/commands/evolution.js +2 -0
  157. package/src/commands/learning.js +34 -5
  158. package/src/data/changelog.json +13 -0
  159. package/src/lib/evolution/evolution-artifact-ports.js +21 -0
  160. package/src/lib/evolution/evolution-deployment-loader.js +56 -0
  161. package/src/lib/evolution/evolution-immutable-ledger-segment-store.js +812 -0
  162. package/src/lib/evolution/evolution-ledger-file-manifest-catalog.js +218 -0
  163. package/src/lib/evolution/evolution-ledger-manifest-catalog.js +472 -0
  164. package/src/lib/evolution/evolution-ledger-manifest-chain.js +997 -0
  165. package/src/lib/evolution/evolution-ledger-manifest-head-store.js +408 -0
  166. package/src/lib/evolution/evolution-ledger-manifest-witness-adapter.js +554 -0
  167. package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +460 -0
  168. package/src/lib/evolution/governed-skill-synthesis-attestor-ipc-endpoint.js +94 -0
  169. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-approval-client.js +485 -0
  170. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-ipc-capability.js +200 -0
  171. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-ledger.js +1222 -0
  172. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations-cli-host.js +802 -0
  173. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations-client.js +445 -0
  174. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations.js +1082 -0
  175. package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operator-registry.js +1453 -0
  176. package/src/lib/evolution/governed-skill-synthesis-candidate-evaluator.js +147 -0
  177. package/src/lib/evolution/governed-skill-synthesis-cli-host.js +115 -0
  178. package/src/lib/evolution/governed-skill-synthesis-evaluation-ledger-adapter.js +715 -0
  179. package/src/lib/evolution/governed-skill-synthesis-external-attestor.js +499 -0
  180. package/src/lib/evolution/governed-skill-synthesis-model-evaluator.js +514 -0
  181. package/src/lib/evolution/governed-skill-synthesis-process-attestor-worker.mjs +208 -0
  182. package/src/lib/evolution/governed-skill-synthesis-process-attestor.js +557 -0
  183. package/src/lib/evolution/governed-skill-synthesis-process-grader-worker.mjs +143 -0
  184. package/src/lib/evolution/governed-skill-synthesis-process-grader.js +444 -0
  185. package/src/lib/evolution/governed-skill-synthesis-provider-chat.js +220 -0
  186. package/src/lib/evolution/governed-skill-synthesis-windows-secure-pipe-host.js +236 -0
  187. package/src/lib/hook-audit-store.js +68 -2
  188. package/src/lib/hooks-v2-runtime.js +52 -26
  189. package/src/lib/learning/skill-synthesizer.js +66 -5
  190. package/src/lib/remote-read-loop-guard.js +30 -3
  191. package/src/assets/web-panel/assets/MarkdownRenderer-DnSfkf98.js +0 -1
  192. package/src/assets/web-panel/assets/OrderTableRenderer-CFbhBT44.js +0 -1
  193. package/src/assets/web-panel/assets/PdhVaultBrowser-Cv9PLMWJ.js +0 -7
  194. package/src/assets/web-panel/assets/devWarning-CxKkOIjh.js +0 -1
  195. package/src/assets/web-panel/assets/index-b5a6l3Uu.js +0 -1
  196. package/src/assets/web-panel/assets/index-xt-BOyp_.js +0 -1
@@ -0,0 +1,499 @@
1
+ import { createHash, createPublicKey, randomBytes, verify } from "node:crypto";
2
+ import net from "node:net";
3
+ import { types as utilTypes } from "node:util";
4
+
5
+ import { isGovernedSkillSynthesisAttestorIpcEndpoint } from "./governed-skill-synthesis-attestor-ipc-endpoint.js";
6
+
7
+ export const GOVERNED_SKILL_SYNTHESIS_EXTERNAL_ATTESTOR_SCHEMA =
8
+ "chainlesschain.governed-skill-synthesis-external-attestor/v1";
9
+ export const GOVERNED_SKILL_SYNTHESIS_EXTERNAL_ATTESTATION_SCHEMA =
10
+ "chainlesschain.skill-synthesis-evaluation-external-attestation/v1";
11
+ export const GOVERNED_SKILL_SYNTHESIS_EXTERNAL_ATTESTOR_REQUEST_SCHEMA =
12
+ "chainlesschain.skill-synthesis-external-attestor-request/v1";
13
+
14
+ const AUTHORITIES = new WeakSet();
15
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
16
+ const SERVICE_ID = /^[a-z][a-z0-9]*(?:[.:_-][a-z0-9]+){1,7}$/u;
17
+ const OPTION_KEYS = new Set([
18
+ "capabilityToken",
19
+ "endpoint",
20
+ "publicKeyPem",
21
+ "serviceId",
22
+ "timeoutMs",
23
+ ]);
24
+ const REQUEST_KEYS = new Set([
25
+ "candidateDigest",
26
+ "descriptor",
27
+ "receiptDigest",
28
+ ]);
29
+ const ATTESTATION_KEYS = new Set([
30
+ "algorithm",
31
+ "attestorSchema",
32
+ "endpointDigest",
33
+ "isolation",
34
+ "keyId",
35
+ "publicKeyDigest",
36
+ "requestId",
37
+ "requestTimeoutMs",
38
+ "schema",
39
+ "serviceId",
40
+ "signature",
41
+ "transport",
42
+ ]);
43
+ const MAX_FRAME_BYTES = 32 * 1024;
44
+
45
+ function sha256(bytes) {
46
+ return `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
47
+ }
48
+
49
+ function canonical(value) {
50
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
51
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
52
+ return `{${Object.keys(value)
53
+ .sort()
54
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
55
+ .join(",")}}`;
56
+ }
57
+
58
+ function record(value, label, allowedKeys, exact = true) {
59
+ if (
60
+ !value ||
61
+ typeof value !== "object" ||
62
+ Array.isArray(value) ||
63
+ utilTypes.isProxy(value) ||
64
+ Object.getPrototypeOf(value) !== Object.prototype
65
+ ) {
66
+ throw new TypeError(`${label} must be a plain object`);
67
+ }
68
+ const descriptors = Object.getOwnPropertyDescriptors(value);
69
+ if (
70
+ (exact && Reflect.ownKeys(descriptors).length !== allowedKeys.size) ||
71
+ Reflect.ownKeys(descriptors).some(
72
+ (key) =>
73
+ typeof key !== "string" ||
74
+ !allowedKeys.has(key) ||
75
+ !("value" in descriptors[key]) ||
76
+ descriptors[key].enumerable !== true,
77
+ )
78
+ ) {
79
+ throw new TypeError(`${label} has unexpected fields`);
80
+ }
81
+ return value;
82
+ }
83
+
84
+ function text(value, label, maximum = 256, trim = true) {
85
+ if (
86
+ typeof value !== "string" ||
87
+ value.trim().length === 0 ||
88
+ value.length > maximum ||
89
+ value.includes("\0") ||
90
+ (trim && value.trim() !== value)
91
+ ) {
92
+ throw new TypeError(`${label} is invalid`);
93
+ }
94
+ return value;
95
+ }
96
+
97
+ function normalizeEndpoint(value) {
98
+ const endpoint = text(value, "external attestor endpoint", 1024);
99
+ if (
100
+ !isGovernedSkillSynthesisAttestorIpcEndpoint(endpoint, {
101
+ kind: "external",
102
+ })
103
+ ) {
104
+ throw new TypeError(
105
+ "external attestor endpoint must be a dedicated local IPC path",
106
+ );
107
+ }
108
+ return endpoint;
109
+ }
110
+
111
+ function normalizeEvaluatorDescriptor(value) {
112
+ record(
113
+ value,
114
+ "external attestor evaluator descriptor",
115
+ new Set(["authorityId", "handlerArtifactDigest", "revision"]),
116
+ );
117
+ if (
118
+ !DIGEST.test(value.handlerArtifactDigest ?? "") ||
119
+ !Number.isSafeInteger(value.revision) ||
120
+ value.revision < 1
121
+ ) {
122
+ throw new TypeError("external attestor evaluator descriptor is invalid");
123
+ }
124
+ return Object.freeze({
125
+ authorityId: text(value.authorityId, "external attestor authorityId"),
126
+ handlerArtifactDigest: value.handlerArtifactDigest,
127
+ revision: value.revision,
128
+ });
129
+ }
130
+
131
+ function normalizeRequest(value) {
132
+ record(value, "external attestor request", REQUEST_KEYS);
133
+ if (
134
+ !DIGEST.test(value.receiptDigest ?? "") ||
135
+ !DIGEST.test(value.candidateDigest ?? "")
136
+ ) {
137
+ throw new TypeError("external attestor request digests are invalid");
138
+ }
139
+ return Object.freeze({
140
+ receiptDigest: value.receiptDigest,
141
+ candidateDigest: value.candidateDigest,
142
+ descriptor: normalizeEvaluatorDescriptor(value.descriptor),
143
+ });
144
+ }
145
+
146
+ function signingMessage(request, attestor, requestId) {
147
+ return Buffer.from(
148
+ `${GOVERNED_SKILL_SYNTHESIS_EXTERNAL_ATTESTATION_SCHEMA}\0${canonical({
149
+ receiptDigest: request.receiptDigest,
150
+ candidateDigest: request.candidateDigest,
151
+ evaluatorDescriptor: request.descriptor,
152
+ attestor,
153
+ requestId,
154
+ })}`,
155
+ "utf8",
156
+ );
157
+ }
158
+
159
+ function requestSignature({
160
+ endpoint,
161
+ capabilityToken,
162
+ request,
163
+ descriptor,
164
+ requestId,
165
+ timeoutMs,
166
+ }) {
167
+ return new Promise((resolve, reject) => {
168
+ const socket = net.connect(endpoint);
169
+ let settled = false;
170
+ let carry = "";
171
+ const finish = (error, value) => {
172
+ if (settled) return;
173
+ settled = true;
174
+ clearTimeout(timer);
175
+ socket.destroy();
176
+ if (error) reject(error);
177
+ else resolve(value);
178
+ };
179
+ const timer = setTimeout(() => {
180
+ const error = new Error(
181
+ `external evaluation attestor timed out after ${timeoutMs}ms`,
182
+ );
183
+ error.code = "LEARNING_SYNTHESIS_EXTERNAL_ATTESTOR_TIMEOUT";
184
+ finish(error);
185
+ }, timeoutMs);
186
+ timer.unref?.();
187
+ socket.once("connect", () => {
188
+ socket.write(
189
+ `${JSON.stringify({
190
+ schema: GOVERNED_SKILL_SYNTHESIS_EXTERNAL_ATTESTOR_REQUEST_SCHEMA,
191
+ serviceId: descriptor.serviceId,
192
+ capabilityToken,
193
+ requestId,
194
+ receiptDigest: request.receiptDigest,
195
+ candidateDigest: request.candidateDigest,
196
+ evaluatorDescriptor: request.descriptor,
197
+ attestor: descriptor,
198
+ })}\n`,
199
+ );
200
+ });
201
+ socket.on("data", (chunk) => {
202
+ carry += chunk.toString("utf8");
203
+ if (Buffer.byteLength(carry, "utf8") > MAX_FRAME_BYTES) {
204
+ finish(new Error("external attestor response exceeded its byte limit"));
205
+ return;
206
+ }
207
+ const newline = carry.indexOf("\n");
208
+ if (newline === -1) return;
209
+ if (carry.slice(newline + 1).trim().length > 0) {
210
+ finish(new Error("external attestor returned multiple records"));
211
+ return;
212
+ }
213
+ try {
214
+ const response = JSON.parse(
215
+ carry.slice(0, newline).replace(/\r$/u, ""),
216
+ );
217
+ record(
218
+ response,
219
+ "external attestor response",
220
+ new Set(["ok", "requestId", "signature"]),
221
+ );
222
+ if (
223
+ response.ok !== true ||
224
+ response.requestId !== requestId ||
225
+ typeof response.signature !== "string" ||
226
+ response.signature.length === 0 ||
227
+ response.signature.length > 1024
228
+ ) {
229
+ throw new Error("external attestor response binding is invalid");
230
+ }
231
+ finish(null, response.signature);
232
+ } catch (error) {
233
+ finish(error);
234
+ }
235
+ });
236
+ socket.once("error", (error) => finish(error));
237
+ socket.once("close", () => {
238
+ if (!settled) {
239
+ finish(new Error("external attestor closed without a response"));
240
+ }
241
+ });
242
+ });
243
+ }
244
+
245
+ function verifyInput(value) {
246
+ if (
247
+ !value ||
248
+ typeof value !== "object" ||
249
+ Array.isArray(value) ||
250
+ utilTypes.isProxy(value) ||
251
+ Object.getPrototypeOf(value) !== Object.prototype
252
+ ) {
253
+ return null;
254
+ }
255
+ const descriptors = Object.getOwnPropertyDescriptors(value);
256
+ const keys = new Set([
257
+ "attestation",
258
+ "candidateDigest",
259
+ "descriptor",
260
+ "receiptDigest",
261
+ ]);
262
+ if (
263
+ Reflect.ownKeys(descriptors).length !== keys.size ||
264
+ Reflect.ownKeys(descriptors).some(
265
+ (key) =>
266
+ typeof key !== "string" ||
267
+ !keys.has(key) ||
268
+ !("value" in descriptors[key]) ||
269
+ descriptors[key].enumerable !== true,
270
+ )
271
+ ) {
272
+ return null;
273
+ }
274
+ try {
275
+ return {
276
+ request: normalizeRequest({
277
+ receiptDigest: descriptors.receiptDigest.value,
278
+ candidateDigest: descriptors.candidateDigest.value,
279
+ descriptor: descriptors.descriptor.value,
280
+ }),
281
+ attestation: descriptors.attestation.value,
282
+ };
283
+ } catch {
284
+ return null;
285
+ }
286
+ }
287
+
288
+ function attestationData(value) {
289
+ if (
290
+ !value ||
291
+ typeof value !== "object" ||
292
+ Array.isArray(value) ||
293
+ utilTypes.isProxy(value) ||
294
+ Object.getPrototypeOf(value) !== Object.prototype
295
+ ) {
296
+ return null;
297
+ }
298
+ const descriptors = Object.getOwnPropertyDescriptors(value);
299
+ if (
300
+ Reflect.ownKeys(descriptors).length !== ATTESTATION_KEYS.size ||
301
+ Reflect.ownKeys(descriptors).some(
302
+ (key) =>
303
+ typeof key !== "string" ||
304
+ !ATTESTATION_KEYS.has(key) ||
305
+ !("value" in descriptors[key]) ||
306
+ descriptors[key].enumerable !== true,
307
+ )
308
+ ) {
309
+ return null;
310
+ }
311
+ return Object.fromEntries(
312
+ Object.entries(descriptors).map(([key, entry]) => [key, entry.value]),
313
+ );
314
+ }
315
+
316
+ export function getGovernedSkillSynthesisExternalAttestationIdentity(value) {
317
+ const data = attestationData(value);
318
+ if (
319
+ !data ||
320
+ data.schema !== GOVERNED_SKILL_SYNTHESIS_EXTERNAL_ATTESTATION_SCHEMA ||
321
+ data.attestorSchema !== GOVERNED_SKILL_SYNTHESIS_EXTERNAL_ATTESTOR_SCHEMA ||
322
+ !/^key:ed25519:[a-f0-9]{64}$/u.test(data.keyId ?? "") ||
323
+ !SERVICE_ID.test(data.serviceId ?? "")
324
+ ) {
325
+ return null;
326
+ }
327
+ return Object.freeze({ keyId: data.keyId, serviceId: data.serviceId });
328
+ }
329
+
330
+ export function verifyGovernedSkillSynthesisExternalAttestation(
331
+ value,
332
+ { publicKey: publicKeyInput, expectedDescriptor = null } = {},
333
+ ) {
334
+ const input = verifyInput(value);
335
+ if (!input) return false;
336
+ const data = attestationData(input.attestation);
337
+ if (!data) return false;
338
+ let publicKey;
339
+ try {
340
+ if (
341
+ utilTypes.isKeyObject(publicKeyInput) &&
342
+ publicKeyInput.type !== "public"
343
+ ) {
344
+ return false;
345
+ }
346
+ publicKey = utilTypes.isKeyObject(publicKeyInput)
347
+ ? publicKeyInput
348
+ : createPublicKey(publicKeyInput);
349
+ } catch {
350
+ return false;
351
+ }
352
+ if (publicKey.asymmetricKeyType !== "ed25519") return false;
353
+ const publicDer = publicKey.export({ type: "spki", format: "der" });
354
+ const publicKeyDigest = sha256(publicDer);
355
+ const {
356
+ attestorSchema,
357
+ requestId,
358
+ signature,
359
+ schema: attestationSchema,
360
+ ...execution
361
+ } = data;
362
+ const attestor = { schema: attestorSchema, ...execution };
363
+ if (
364
+ attestationSchema !==
365
+ GOVERNED_SKILL_SYNTHESIS_EXTERNAL_ATTESTATION_SCHEMA ||
366
+ attestorSchema !== GOVERNED_SKILL_SYNTHESIS_EXTERNAL_ATTESTOR_SCHEMA ||
367
+ execution.algorithm !== "Ed25519" ||
368
+ execution.keyId !== `key:ed25519:${publicKeyDigest.slice(7)}` ||
369
+ execution.publicKeyDigest !== publicKeyDigest ||
370
+ execution.isolation !== "external-service" ||
371
+ !SERVICE_ID.test(execution.serviceId ?? "") ||
372
+ execution.transport !== "local-ipc-v1" ||
373
+ !DIGEST.test(execution.endpointDigest ?? "") ||
374
+ !Number.isSafeInteger(execution.requestTimeoutMs) ||
375
+ execution.requestTimeoutMs < 1_000 ||
376
+ execution.requestTimeoutMs > 30_000 ||
377
+ !/^[a-f0-9]{32}$/u.test(requestId ?? "") ||
378
+ typeof signature !== "string" ||
379
+ signature.length === 0 ||
380
+ signature.length > 1024 ||
381
+ (expectedDescriptor !== null &&
382
+ canonical(attestor) !== canonical(expectedDescriptor))
383
+ ) {
384
+ return false;
385
+ }
386
+ try {
387
+ const signatureBytes = Buffer.from(signature, "base64");
388
+ return (
389
+ signatureBytes.length === 64 &&
390
+ signatureBytes.toString("base64") === signature &&
391
+ verify(
392
+ null,
393
+ signingMessage(input.request, attestor, requestId),
394
+ publicKey,
395
+ signatureBytes,
396
+ )
397
+ );
398
+ } catch {
399
+ return false;
400
+ }
401
+ }
402
+
403
+ export function createGovernedSkillSynthesisExternalAttestationAuthority(
404
+ options = {},
405
+ ) {
406
+ record(options, "external attestor options", OPTION_KEYS, false);
407
+ const endpoint = normalizeEndpoint(options.endpoint);
408
+ const capabilityToken = text(
409
+ options.capabilityToken,
410
+ "external attestor capabilityToken",
411
+ 4096,
412
+ );
413
+ if (capabilityToken.length < 32) {
414
+ throw new TypeError("external attestor capabilityToken is invalid");
415
+ }
416
+ const serviceId = text(options.serviceId, "external attestor serviceId", 128);
417
+ if (!SERVICE_ID.test(serviceId)) {
418
+ throw new TypeError("external attestor serviceId is invalid");
419
+ }
420
+ const publicKeyPem = text(
421
+ options.publicKeyPem,
422
+ "external attestor publicKeyPem",
423
+ 16 * 1024,
424
+ false,
425
+ );
426
+ if (/PRIVATE KEY/u.test(publicKeyPem)) {
427
+ throw new TypeError(
428
+ "external attestor publicKeyPem must not contain a private key",
429
+ );
430
+ }
431
+ const publicKey = createPublicKey(publicKeyPem);
432
+ if (publicKey.asymmetricKeyType !== "ed25519") {
433
+ throw new TypeError("external attestor public key must be Ed25519");
434
+ }
435
+ const publicDer = publicKey.export({ type: "spki", format: "der" });
436
+ const publicKeyDigest = sha256(publicDer);
437
+ const timeoutMs = options.timeoutMs ?? 5_000;
438
+ if (
439
+ !Number.isSafeInteger(timeoutMs) ||
440
+ timeoutMs < 1_000 ||
441
+ timeoutMs > 30_000
442
+ ) {
443
+ throw new TypeError("external attestor timeoutMs is invalid");
444
+ }
445
+ const descriptor = Object.freeze({
446
+ schema: GOVERNED_SKILL_SYNTHESIS_EXTERNAL_ATTESTOR_SCHEMA,
447
+ algorithm: "Ed25519",
448
+ keyId: `key:ed25519:${publicKeyDigest.slice(7)}`,
449
+ publicKeyDigest,
450
+ isolation: "external-service",
451
+ serviceId,
452
+ transport: "local-ipc-v1",
453
+ endpointDigest: sha256(Buffer.from(endpoint, "utf8")),
454
+ requestTimeoutMs: timeoutMs,
455
+ });
456
+ const attestReceipt = async (value) => {
457
+ const request = normalizeRequest(value);
458
+ const requestId = randomBytes(16).toString("hex");
459
+ const signature = await requestSignature({
460
+ endpoint,
461
+ capabilityToken,
462
+ request,
463
+ descriptor,
464
+ requestId,
465
+ timeoutMs,
466
+ });
467
+ const message = signingMessage(request, descriptor, requestId);
468
+ if (!verify(null, message, publicKey, Buffer.from(signature, "base64"))) {
469
+ throw new Error("external attestor returned an invalid signature");
470
+ }
471
+ const { schema: attestorSchema, ...execution } = descriptor;
472
+ return Object.freeze({
473
+ schema: GOVERNED_SKILL_SYNTHESIS_EXTERNAL_ATTESTATION_SCHEMA,
474
+ attestorSchema,
475
+ ...execution,
476
+ requestId,
477
+ signature,
478
+ });
479
+ };
480
+ const verifyAttestation = async (value) => {
481
+ return verifyGovernedSkillSynthesisExternalAttestation(value, {
482
+ publicKey,
483
+ expectedDescriptor: descriptor,
484
+ });
485
+ };
486
+ Object.freeze(attestReceipt);
487
+ Object.freeze(verifyAttestation);
488
+ const authority = Object.freeze({
489
+ descriptor,
490
+ attestReceipt,
491
+ verifyAttestation,
492
+ });
493
+ AUTHORITIES.add(authority);
494
+ return authority;
495
+ }
496
+
497
+ export function isGovernedSkillSynthesisExternalAttestationAuthority(value) {
498
+ return AUTHORITIES.has(value);
499
+ }