chainlesschain 0.166.20 → 0.166.22
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.
- package/README.md +67 -9
- package/package.json +2 -2
- package/src/assets/web-panel/assets/{AIOps-CcJst5Zs.js → AIOps-oJ7USzMC.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BpHPFKd3.js → ActionButton-BlgnZe_C.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DHAsASuS.js → Analytics-D2rRbTLu.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BTKwo5RC.js → AppLayout-FwS3f0B2.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BcCBTggA.js → Artifacts-iF-_08Hi.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-z1JvJYbT.js → Audit-D24p0zQw.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CJ7DCMDR.js → BackgroundAgents-Cg3mRVi9.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CKpxw4uw.js → Backup-EOqht3H-.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-2jI_IlUB.js → BaseInput-9XWYq2hj.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-C_4RfBeN.js → Chat-Dq5yardA.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Ds3pA-ET.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-BnF4z4N1.js → Checkbox-CuyCBoBf.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-m_LMamhM.js → Codegen-DjWtYHNe.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DzMbA760.js → Col-CrVr_iuG.js} +1 -1
- package/src/assets/web-panel/assets/{Community-SScuZUcW.js → Community-C6QxpfGc.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CiOHRvwQ.js → Compact-B-v5r6Pa.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-97FzYz-6.js → Compliance-zNiLiFgD.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-C0ss-SRl.js → Cowork-D9K7lMOu.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-CCbdc9fp.js → Cron-DAjO36z4.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BPnabXej.js → Crosschain-Bxqn0aqB.js} +1 -1
- package/src/assets/web-panel/assets/{DID-B65hFnHs.js → DID-DfRmLUe-.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-B6qR_TF2.js → Dashboard-Cz8KF3fr.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-6c-2Fxm-.js → Dropdown-C4oVfkP0.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-GD57mfiz.js → EmailListRenderer-ivyZKN8k.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-B2mxG6LN.js → FamilyGuardDashboard-DoxY1CPW.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-cZS-uvAo.js → Federation-C93gZxnb.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-UbSfBIe1.js → FormItemContext-D_lEjYJE.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BMAtvGt1.js → GenericCardRenderer-BNFN9YjN.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DAlhOiDA.js → Git-mUu2HcLI.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-B-RRVaP8.js → Governance-CNuosrge.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DBl-pXYR.js → Inference-DwY5pbCB.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DjqOkvgY.js → KnowledgeGraph-aRUxhACD.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CEV7AEAD.js → Logs-DFfsWYy_.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BDCxa4d1.js → MarkdownRenderer-DqTx7_u1.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-oRjzfmYJ.js → Marketplace-COI-ciM-.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BiTnznLw.js → McpTools-BJJwaIpe.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-DR0C5K4N.js → Memory-CDO6SGDZ.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge--oR8wEcp.js → MobileBridge-BlZ5tFf4.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DKqpYMuG.js → MobileProjects-DuoxbgWz.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Dg0D6fDQ.js → Mtc-6ec9j70b.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-D4_-yWTK.js → MtcAudit-BuL7HkC7.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-Coz55FxA.js → Multisig-CJxR85lk.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BWVjgW9Y.js → NLProgramming-B71O1S4l.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BflVuGwr.js → Notes-Bsw5zbpV.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-CT0F_dJ7.js → NotificationSettings-BnAhXuK_.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Dyrnqy_o.js → OrderTableRenderer-BJ0R5GGz.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CMDTM2z5.js → Organization-B7wwNxoP.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-acKvvYpC.js → Overflow-CfAGr0gM.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CRq5j9Ax.js → P2P-KhMg22Fz.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DmtzN6Kn.js → PdhVaultBrowser-NdAXI9ft.js} +4 -4
- package/src/assets/web-panel/assets/{Permissions-SZ-kjJDa.js → Permissions-CIYjqyT7.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DXh-ZfgJ.js → PersonalDataHub-D2ht3P_R.js} +6 -6
- package/src/assets/web-panel/assets/{Pipeline-DhBU9ftP.js → Pipeline-i6flZW1m.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BgEXpO_V.js → Privacy-DE0lhYVc.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B2DJ-dmK.js → ProjectInit-BL3YbyxS.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-ve3SocWc.js → ProjectSettings-CEtdg7ni.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-5ZvFasSJ.js → Projects-CvtU5peJ.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-C8fcF3BK.js → Providers-DKt_Cg-j.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-unjO8lNO.js → QrScannerModal-DA61jNSx.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BT1QtT7D.js → QuickAsk-fS9ryUmq.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BSjFrY1w.js → Recommend-CR9dZU5Y.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-CWV0bICg.js → RemoteSession-BV0BR2Dz.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-BMjiMsk2.js → Reputation-BIeGUvYD.js} +1 -1
- package/src/assets/web-panel/assets/{Row-9XCY22PM.js → Row-DHDT1aro.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DQ9PDy7Q.js → RssFeed-Cq6YKb1h.js} +3 -3
- package/src/assets/web-panel/assets/{Search-Boym2HwG.js → Search-DEF6vsy6.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Gbq3lGQb.js → Security-CHtYiKY9.js} +4 -4
- package/src/assets/web-panel/assets/{Services-OcUfLdnu.js → Services-u16lvBJN.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BjTog6cA.js → Skeleton-CGbizyDj.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-Dny4ft_1.js → Skills-BZMQcAa7.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Cy_VnhpZ.js → Sla-Bm-CycVi.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CrFuL_lp.js → SpeechSettings-BudpA5kr.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-k-FnjuOR.js → SyncSettings-B8q1C1eC.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-ZEqDSo0_.js → Tasks-SU1pBWc-.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CYYksYV5.js → Templates-CyOfJzmt.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BvTTRTHS.js → Tenant-xqWSm2GP.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DMOQOtkj.js → Terminal-D1Ttgjsi.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CnudkJxk.js → TimelineRenderer-Da2lYs5D.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-VW6Wocdp.js → Tokens-B34-SduO.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BtOxZqP6.js → Trigger-C8zyYm4R.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-XcGJoTQx.js → Trust-D1Pvqems.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-aASNCs5j.js → UkeySign-Do3VVnAy.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Bz89M52u.js → VideoEditing-Dz7egVIA.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-uU4dSS_N.js → Wallet-Dcuw-OxR.js} +3 -3
- package/src/assets/web-panel/assets/{WebAuthn-Brrroxgr.js → WebAuthn-DPlw-QsB.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-Cny-evI9.js → WorkflowEditor-h4OsnU5q.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CJ5iSwWq.js → chat-eO9wEwrW.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DWa-2flG.js → colors-34lSmOXw.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DFwUfptU.js → compact-item-CK4kEWJ4.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-FHWWcyeB.js → createContext-E0A57xed.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CF3xafX2.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-QY_TElrN.js → hasIn-BD9ZMGAl.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcVr-LOk.js → index--N0u6kTG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUiTugu3.js → index-8qMA1DWQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-0umhind6.js → index-B0rkHxKK.js} +1 -1
- package/src/assets/web-panel/assets/{index-wqiOz655.js → index-B_G_ElKO.js} +1 -1
- package/src/assets/web-panel/assets/{index-B18zERdP.js → index-BbX_Dted.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dy2PnKZx.js → index-Bjs90Eh9.js} +1 -1
- package/src/assets/web-panel/assets/{index-th467RN6.js → index-BmNbU2Z6.js} +1 -1
- package/src/assets/web-panel/assets/{index-uRUZdL7I.js → index-Brqc9Emx.js} +1 -1
- package/src/assets/web-panel/assets/{index-hw1J_Oxs.js → index-BsGmo6v1.js} +1 -1
- package/src/assets/web-panel/assets/index-C907rPwd.js +1 -0
- package/src/assets/web-panel/assets/{index-CjejB-z9.js → index-CT1_eRL-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaHvj4jA.js → index-CZBaqe3d.js} +1 -1
- package/src/assets/web-panel/assets/{index-B33frlaD.js → index-CZkFMeWL.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYbwQ7SP.js → index-Ch175NUw.js} +1 -1
- package/src/assets/web-panel/assets/{index-va4Rt-yM.js → index-CsrKJJcX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDpXDi4J.js → index-CuSau5ya.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-Mhq8K6.js → index-Cx3Jn1r0.js} +1 -1
- package/src/assets/web-panel/assets/{index-CKS7n6mE.js → index-Cz3unNfL.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRsGZBHc.js → index-D4bB_x_v.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bd7McYpJ.js → index-DCn-ECvK.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUfILsc-.js → index-DFLE2qO9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUepuy7O.js → index-DGRxt5wj.js} +1 -1
- package/src/assets/web-panel/assets/{index-BR4RMPnB.js → index-DONOUtlz.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dlq-u9E4.js → index-DP-UZAQN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCHMVYG1.js → index-Da5fmOHB.js} +1 -1
- package/src/assets/web-panel/assets/{index-BiHRihC0.js → index-DcE1BspQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CGv5In_T.js → index-DcbgVLOH.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQCtBurK.js → index-DeXNCyQJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2rPJ6Sv.js → index-DiT_REby.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUoLd1dt.js → index-DpfisY1g.js} +1 -1
- package/src/assets/web-panel/assets/{index-2ufsNuVn.js → index-DrOalGut.js} +1 -1
- package/src/assets/web-panel/assets/{index-aTiI7lOQ.js → index-DrSAAuJj.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUNwuu5v.js → index-DrsDA_md.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkmgbT7h.js → index-DvKcroix.js} +1 -1
- package/src/assets/web-panel/assets/{index-BEjwv2x6.js → index-DzXjP44T.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeGn0A4W.js → index-MIg5Z8qe.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5F1vwec.js → index-o8pYehRq.js} +3 -3
- package/src/assets/web-panel/assets/index-wueRSK2d.js +1 -0
- package/src/assets/web-panel/assets/{index-w3SdYwaC.js → index-yAGBu2E0.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BeSPUFDz.js → initDefaultProps-DMTkAomF.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Dcajvjm9.js → motion-Cnti1F5g.js} +1 -1
- package/src/assets/web-panel/assets/{move-B76orau-.js → move-CGxmHUga.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-zB6yFwcX.js → mtc-parser-CuwwLoq7.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BsbNjz8w.js → omit-BpdlTkPM.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BiJ9tssQ.js → pickAttrs-D7nWrThp.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BdfMjMeN.js → placementArrow-Bhx0TV8F.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-rV4LGpbU.js → responsiveObserve-CZ1KesZh.js} +1 -1
- package/src/assets/web-panel/assets/{slide-HsVw1qFQ.js → slide-CnldF8J6.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-D1ry8XPE.js → statusUtils-CZfo_GOA.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-B1t6aQQ_.js → styleChecker-B2QCcAv5.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-C8qbl-9w.js → useFlexGapSupport-DzzjIS4J.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-R7g_mYTC.js → useFs-B_atg9M0.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-Cd-kCe7Z.js → usePersonalDataHub-DhZs3QYN.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-9WhK5UWA.js → vnode-DcePTYAm.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CUqppPco.js → zoom-BYmlnjRk.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +2 -2
- package/src/commands/agent.js +19 -1
- package/src/commands/evolution-knowledge.js +54 -0
- package/src/commands/evolution-workbench.js +83 -0
- package/src/commands/evolution.js +6 -1
- package/src/commands/serve.js +47 -0
- package/src/commands/skill.js +158 -16
- package/src/data/changelog.json +26 -0
- package/src/gateways/ws/session-protocol.js +2 -0
- package/src/gateways/ws/ws-agent-handler.js +124 -69
- package/src/gateways/ws/ws-server.js +19 -0
- package/src/generated/cc-agent-protocol.schema.json +7 -1
- package/src/harness/jsonl-session-store.js +25 -1
- package/src/index.js +11 -3
- package/src/lazy-dispatch.js +9 -1
- package/src/lib/app-server/cli-agent-kernel-adapter.js +8 -0
- package/src/lib/app-server/graph-runtime.js +40 -1
- package/src/lib/app-server/server.js +181 -3
- package/src/lib/app-server/websocket-transport.js +23 -0
- package/src/lib/evolution/agent-evolution-runtime-composition-brand.js +17 -0
- package/src/lib/evolution/agent-evolution-runtime-composition.js +165 -1
- package/src/lib/evolution/controlled-skill-production-pilot.js +912 -0
- package/src/lib/evolution/evolution-artifact-ports.js +30 -0
- package/src/lib/evolution/evolution-deployment-loader.js +208 -0
- package/src/lib/evolution/evolution-raw-crypto-shred.js +185 -0
- package/src/lib/evolution/evolution-release-train-ledger-adapter.js +335 -0
- package/src/lib/evolution/evolution-release-train.js +538 -0
- package/src/lib/evolution/evolution-workbench-batch-executor.js +195 -0
- package/src/lib/evolution/evolution-workbench-cli-host.js +169 -0
- package/src/lib/evolution/evolution-workbench-metrics-ledger-adapter.js +648 -0
- package/src/lib/evolution/evolution-workbench-metrics.js +943 -0
- package/src/lib/evolution/evolution-workbench-projection.js +753 -0
- package/src/lib/evolution/evolution-workbench-version-control.js +272 -0
- package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +688 -0
- package/src/lib/evolution/governed-knowledge-artifact-lifecycle.js +364 -0
- package/src/lib/evolution/governed-knowledge-conflict-merge.js +352 -0
- package/src/lib/evolution/governed-knowledge-dependency-authority.js +273 -0
- package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +646 -0
- package/src/lib/evolution/governed-knowledge-merge-ledger-executor.js +671 -0
- package/src/lib/evolution/governed-knowledge-merge-publisher-authority.js +310 -0
- package/src/lib/evolution/governed-knowledge-node-crypto-authority.js +348 -0
- package/src/lib/evolution/governed-knowledge-rbac-approval-authority.js +621 -0
- package/src/lib/evolution/governed-knowledge-review-host.js +249 -0
- package/src/lib/evolution/governed-knowledge-sync-ledger-adapter.js +729 -0
- package/src/lib/evolution/governed-knowledge-sync-merge-publisher.js +312 -0
- package/src/lib/evolution/governed-knowledge-sync.js +795 -0
- package/src/lib/evolution/governed-knowledge-trust-ledger.js +707 -0
- package/src/lib/evolution/governed-skill-marketplace.js +430 -0
- package/src/lib/evolution/governed-wiki-pruning.js +435 -0
- package/src/lib/evolution/skill-outcome-index-authority.js +268 -0
- package/src/lib/evolution/skill-outcome-source-catalog-authority.js +237 -0
- package/src/lib/evolution/skill-writer-inventory-manifest.js +7 -6
- package/src/lib/evolution/statistical-progressive-canary.js +683 -0
- package/src/lib/evolution/wikiskill-benchmark.js +510 -0
- package/src/lib/public-ide-capability-manifest.js +4 -0
- package/src/lib/session-host-lease.js +11 -16
- package/src/lib/skill-outcome-authority.js +43 -0
- package/src/lib/skill-outcome-transcript-authority.js +252 -0
- package/src/lib/skill-retrieval-router-benchmark.js +135 -0
- package/src/lib/skill-retrieval-router.js +235 -0
- package/src/lib/skill-vector-authority.js +325 -0
- package/src/lib/skill-vector-process-authority.js +386 -0
- package/src/repl/agent-repl.js +7 -1
- package/src/runtime/agent-core.js +133 -13
- package/src/runtime/agent-runtime.js +42 -0
- package/src/runtime/headless-runner.js +32 -0
- package/src/runtime/headless-stream.js +39 -1
- package/src/runtime/runtime-factory.js +62 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-eMmw1eZF.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DxufPwXC.js +0 -1
- package/src/assets/web-panel/assets/index-ZMTB9p5z.js +0 -1
- package/src/assets/web-panel/assets/index-_PvIDelE.js +0 -1
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
|
|
3
|
+
export const WIKISKILL_BENCHMARK_PLAN_SCHEMA =
|
|
4
|
+
"chainlesschain.wikiskill-benchmark-plan/v1";
|
|
5
|
+
export const WIKISKILL_BENCHMARK_REPORT_SCHEMA =
|
|
6
|
+
"chainlesschain.wikiskill-benchmark-report/v1";
|
|
7
|
+
export const WIKISKILL_BENCHMARK_ENVELOPE_SCHEMA =
|
|
8
|
+
"chainlesschain.wikiskill-benchmark-envelope/v1";
|
|
9
|
+
|
|
10
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
11
|
+
const COMMIT = /^[a-f0-9]{40}$/u;
|
|
12
|
+
const FAILURE_CLASSES = new Set([
|
|
13
|
+
"none",
|
|
14
|
+
"model",
|
|
15
|
+
"tool",
|
|
16
|
+
"provider",
|
|
17
|
+
"sandbox",
|
|
18
|
+
"permission",
|
|
19
|
+
"infrastructure",
|
|
20
|
+
"grader",
|
|
21
|
+
"unknown",
|
|
22
|
+
]);
|
|
23
|
+
|
|
24
|
+
function canonical(value) {
|
|
25
|
+
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
26
|
+
if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
|
|
27
|
+
return `{${Object.keys(value)
|
|
28
|
+
.sort()
|
|
29
|
+
.map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
|
|
30
|
+
.join(",")}}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function digest(domain, value) {
|
|
34
|
+
return `sha256:${createHash("sha256")
|
|
35
|
+
.update(domain)
|
|
36
|
+
.update("\0")
|
|
37
|
+
.update(canonical(value))
|
|
38
|
+
.digest("hex")}`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function exactKeys(value, keys, name) {
|
|
42
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
43
|
+
throw new TypeError(`${name} must be an object`);
|
|
44
|
+
const actual = Object.keys(value).sort();
|
|
45
|
+
const expected = [...keys].sort();
|
|
46
|
+
if (canonical(actual) !== canonical(expected))
|
|
47
|
+
throw new TypeError(`${name} has unexpected or missing fields`);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function string(value, name) {
|
|
51
|
+
if (typeof value !== "string" || value.trim() === "")
|
|
52
|
+
throw new TypeError(`${name} must be a non-empty string`);
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function sha(value, name) {
|
|
57
|
+
if (!DIGEST.test(value ?? ""))
|
|
58
|
+
throw new TypeError(`${name} must be a sha256 digest`);
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function finite(value, name, { min = 0, max = Number.MAX_VALUE } = {}) {
|
|
63
|
+
const number = Number(value);
|
|
64
|
+
if (!Number.isFinite(number) || number < min || number > max)
|
|
65
|
+
throw new TypeError(`${name} is outside its allowed range`);
|
|
66
|
+
return number;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function normalizeDatasets(datasets) {
|
|
70
|
+
if (!Array.isArray(datasets) || datasets.length !== 5)
|
|
71
|
+
throw new TypeError("datasets must contain exactly five entries");
|
|
72
|
+
const ids = new Set();
|
|
73
|
+
return datasets.map((dataset, index) => {
|
|
74
|
+
exactKeys(
|
|
75
|
+
dataset,
|
|
76
|
+
["id", "version", "digest", "splitIds"],
|
|
77
|
+
`dataset ${index}`,
|
|
78
|
+
);
|
|
79
|
+
const id = string(dataset.id, `dataset ${index} id`);
|
|
80
|
+
if (ids.has(id)) throw new TypeError(`duplicate dataset id: ${id}`);
|
|
81
|
+
ids.add(id);
|
|
82
|
+
if (!Array.isArray(dataset.splitIds) || dataset.splitIds.length === 0)
|
|
83
|
+
throw new TypeError(`dataset ${id} must contain splitIds`);
|
|
84
|
+
const splitIds = dataset.splitIds.map((item, splitIndex) =>
|
|
85
|
+
string(item, `dataset ${id} split ${splitIndex}`),
|
|
86
|
+
);
|
|
87
|
+
if (new Set(splitIds).size !== splitIds.length)
|
|
88
|
+
throw new TypeError(`dataset ${id} contains duplicate splitIds`);
|
|
89
|
+
return Object.freeze({
|
|
90
|
+
id,
|
|
91
|
+
version: string(dataset.version, `dataset ${id} version`),
|
|
92
|
+
digest: sha(dataset.digest, `dataset ${id} digest`),
|
|
93
|
+
splitIds: Object.freeze(splitIds),
|
|
94
|
+
splitDigest: digest(WIKISKILL_BENCHMARK_PLAN_SCHEMA, splitIds),
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function createWikiSkillBenchmarkPlan(input = {}) {
|
|
100
|
+
exactKeys(
|
|
101
|
+
input,
|
|
102
|
+
[
|
|
103
|
+
"gitCommit",
|
|
104
|
+
"runnerDigest",
|
|
105
|
+
"model",
|
|
106
|
+
"inference",
|
|
107
|
+
"environment",
|
|
108
|
+
"datasets",
|
|
109
|
+
"toolDigest",
|
|
110
|
+
"apiDigest",
|
|
111
|
+
"promptDigest",
|
|
112
|
+
"skillDigest",
|
|
113
|
+
"wikiDigest",
|
|
114
|
+
"seedSchedule",
|
|
115
|
+
"bootstrapSamples",
|
|
116
|
+
],
|
|
117
|
+
"benchmark plan",
|
|
118
|
+
);
|
|
119
|
+
exactKeys(input.model, ["checkpoint", "digest"], "model");
|
|
120
|
+
exactKeys(
|
|
121
|
+
input.environment,
|
|
122
|
+
["containerDigest", "vllmVersion", "hardware"],
|
|
123
|
+
"environment",
|
|
124
|
+
);
|
|
125
|
+
if (
|
|
126
|
+
!input.inference ||
|
|
127
|
+
typeof input.inference !== "object" ||
|
|
128
|
+
Array.isArray(input.inference)
|
|
129
|
+
)
|
|
130
|
+
throw new TypeError("inference must be an object");
|
|
131
|
+
if (!Array.isArray(input.seedSchedule) || input.seedSchedule.length < 3)
|
|
132
|
+
throw new TypeError(
|
|
133
|
+
"seedSchedule must contain at least three independent runs",
|
|
134
|
+
);
|
|
135
|
+
const seedSchedule = input.seedSchedule.map((seed, index) => {
|
|
136
|
+
if (!Number.isSafeInteger(seed) || seed < 0)
|
|
137
|
+
throw new TypeError(
|
|
138
|
+
`seedSchedule ${index} must be a non-negative safe integer`,
|
|
139
|
+
);
|
|
140
|
+
return seed;
|
|
141
|
+
});
|
|
142
|
+
if (new Set(seedSchedule).size !== seedSchedule.length)
|
|
143
|
+
throw new TypeError("seedSchedule must not contain duplicates");
|
|
144
|
+
if (input.bootstrapSamples !== 1_000)
|
|
145
|
+
throw new TypeError("bootstrapSamples must equal 1000");
|
|
146
|
+
const gitCommit = string(input.gitCommit, "gitCommit");
|
|
147
|
+
if (!COMMIT.test(gitCommit))
|
|
148
|
+
throw new TypeError("gitCommit must be a full commit SHA");
|
|
149
|
+
const core = {
|
|
150
|
+
schema: WIKISKILL_BENCHMARK_PLAN_SCHEMA,
|
|
151
|
+
gitCommit,
|
|
152
|
+
runnerDigest: sha(input.runnerDigest, "runnerDigest"),
|
|
153
|
+
model: Object.freeze({
|
|
154
|
+
checkpoint: string(input.model.checkpoint, "model checkpoint"),
|
|
155
|
+
digest: sha(input.model.digest, "model digest"),
|
|
156
|
+
}),
|
|
157
|
+
inference: Object.freeze(JSON.parse(canonical(input.inference))),
|
|
158
|
+
environment: Object.freeze({
|
|
159
|
+
containerDigest: sha(
|
|
160
|
+
input.environment.containerDigest,
|
|
161
|
+
"container digest",
|
|
162
|
+
),
|
|
163
|
+
vllmVersion: string(input.environment.vllmVersion, "vLLM version"),
|
|
164
|
+
hardware: string(input.environment.hardware, "hardware"),
|
|
165
|
+
}),
|
|
166
|
+
datasets: Object.freeze(normalizeDatasets(input.datasets)),
|
|
167
|
+
toolDigest: sha(input.toolDigest, "toolDigest"),
|
|
168
|
+
apiDigest: sha(input.apiDigest, "apiDigest"),
|
|
169
|
+
promptDigest: sha(input.promptDigest, "promptDigest"),
|
|
170
|
+
skillDigest: sha(input.skillDigest, "skillDigest"),
|
|
171
|
+
wikiDigest: sha(input.wikiDigest, "wikiDigest"),
|
|
172
|
+
seedSchedule: Object.freeze(seedSchedule),
|
|
173
|
+
bootstrapSamples: 1_000,
|
|
174
|
+
};
|
|
175
|
+
return Object.freeze({
|
|
176
|
+
...core,
|
|
177
|
+
planDigest: digest(WIKISKILL_BENCHMARK_PLAN_SCHEMA, core),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function normalizeArm(arm, name) {
|
|
182
|
+
exactKeys(
|
|
183
|
+
arm,
|
|
184
|
+
[
|
|
185
|
+
"score",
|
|
186
|
+
"traceDigest",
|
|
187
|
+
"graderReceiptDigest",
|
|
188
|
+
"failureClass",
|
|
189
|
+
"tokens",
|
|
190
|
+
"cost",
|
|
191
|
+
"latencyMs",
|
|
192
|
+
],
|
|
193
|
+
name,
|
|
194
|
+
);
|
|
195
|
+
if (!FAILURE_CLASSES.has(arm.failureClass))
|
|
196
|
+
throw new TypeError(`${name} failureClass is invalid`);
|
|
197
|
+
return Object.freeze({
|
|
198
|
+
score: finite(arm.score, `${name} score`, { max: 1 }),
|
|
199
|
+
traceDigest: sha(arm.traceDigest, `${name} traceDigest`),
|
|
200
|
+
graderReceiptDigest: sha(
|
|
201
|
+
arm.graderReceiptDigest,
|
|
202
|
+
`${name} graderReceiptDigest`,
|
|
203
|
+
),
|
|
204
|
+
failureClass: arm.failureClass,
|
|
205
|
+
tokens: finite(arm.tokens, `${name} tokens`),
|
|
206
|
+
cost: finite(arm.cost, `${name} cost`),
|
|
207
|
+
latencyMs: finite(arm.latencyMs, `${name} latencyMs`),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function percentile(sorted, probability) {
|
|
212
|
+
if (sorted.length === 1) return sorted[0];
|
|
213
|
+
const position = (sorted.length - 1) * probability;
|
|
214
|
+
const lower = Math.floor(position);
|
|
215
|
+
const upper = Math.ceil(position);
|
|
216
|
+
const weight = position - lower;
|
|
217
|
+
return sorted[lower] * (1 - weight) + sorted[upper] * weight;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function prngFromDigest(value) {
|
|
221
|
+
let state = Number.parseInt(value.slice(7, 15), 16) || 0x9e3779b9;
|
|
222
|
+
return () => {
|
|
223
|
+
state ^= state << 13;
|
|
224
|
+
state ^= state >>> 17;
|
|
225
|
+
state ^= state << 5;
|
|
226
|
+
return (state >>> 0) / 0x1_0000_0000;
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function mean(values) {
|
|
231
|
+
return values.reduce((sum, value) => sum + value, 0) / values.length;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export function buildWikiSkillBenchmarkReport({ plan, runs } = {}) {
|
|
235
|
+
if (
|
|
236
|
+
!plan ||
|
|
237
|
+
plan.schema !== WIKISKILL_BENCHMARK_PLAN_SCHEMA ||
|
|
238
|
+
!DIGEST.test(plan.planDigest ?? "")
|
|
239
|
+
)
|
|
240
|
+
throw new TypeError("a canonical benchmark plan is required");
|
|
241
|
+
const expectedPlanDigest = digest(
|
|
242
|
+
WIKISKILL_BENCHMARK_PLAN_SCHEMA,
|
|
243
|
+
Object.fromEntries(
|
|
244
|
+
Object.entries(plan).filter(([key]) => key !== "planDigest"),
|
|
245
|
+
),
|
|
246
|
+
);
|
|
247
|
+
if (expectedPlanDigest !== plan.planDigest)
|
|
248
|
+
throw new Error("benchmark plan digest mismatch");
|
|
249
|
+
if (!Array.isArray(runs) || runs.length !== plan.seedSchedule.length)
|
|
250
|
+
throw new TypeError("runs must exactly cover the seed schedule");
|
|
251
|
+
const expectedCases = new Map(
|
|
252
|
+
plan.datasets.flatMap((dataset) =>
|
|
253
|
+
dataset.splitIds.map((splitId) => [`${dataset.id}\0${splitId}`, dataset]),
|
|
254
|
+
),
|
|
255
|
+
);
|
|
256
|
+
const seenSeeds = new Set();
|
|
257
|
+
const normalizedRuns = runs.map((run, runIndex) => {
|
|
258
|
+
exactKeys(run, ["runId", "seed", "cases"], `run ${runIndex}`);
|
|
259
|
+
if (!plan.seedSchedule.includes(run.seed) || seenSeeds.has(run.seed))
|
|
260
|
+
throw new TypeError(`run ${runIndex} seed is absent or duplicated`);
|
|
261
|
+
seenSeeds.add(run.seed);
|
|
262
|
+
if (!Array.isArray(run.cases) || run.cases.length !== expectedCases.size)
|
|
263
|
+
throw new TypeError(`run ${runIndex} does not cover every split`);
|
|
264
|
+
const seenCases = new Set();
|
|
265
|
+
const cases = run.cases.map((item, caseIndex) => {
|
|
266
|
+
exactKeys(
|
|
267
|
+
item,
|
|
268
|
+
["datasetId", "splitId", "baseline", "skill"],
|
|
269
|
+
`run ${runIndex} case ${caseIndex}`,
|
|
270
|
+
);
|
|
271
|
+
const key = `${item.datasetId}\0${item.splitId}`;
|
|
272
|
+
if (!expectedCases.has(key) || seenCases.has(key))
|
|
273
|
+
throw new TypeError(`run ${runIndex} has an absent or duplicate split`);
|
|
274
|
+
seenCases.add(key);
|
|
275
|
+
return Object.freeze({
|
|
276
|
+
datasetId: item.datasetId,
|
|
277
|
+
splitId: item.splitId,
|
|
278
|
+
baseline: normalizeArm(item.baseline, `run ${runIndex} baseline`),
|
|
279
|
+
skill: normalizeArm(item.skill, `run ${runIndex} skill`),
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
cases.sort((left, right) =>
|
|
283
|
+
`${left.datasetId}\0${left.splitId}`.localeCompare(
|
|
284
|
+
`${right.datasetId}\0${right.splitId}`,
|
|
285
|
+
),
|
|
286
|
+
);
|
|
287
|
+
return Object.freeze({
|
|
288
|
+
runId: string(run.runId, `run ${runIndex} runId`),
|
|
289
|
+
seed: run.seed,
|
|
290
|
+
cases: Object.freeze(cases),
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
normalizedRuns.sort(
|
|
294
|
+
(left, right) =>
|
|
295
|
+
plan.seedSchedule.indexOf(left.seed) -
|
|
296
|
+
plan.seedSchedule.indexOf(right.seed),
|
|
297
|
+
);
|
|
298
|
+
|
|
299
|
+
const perDataset = plan.datasets.map((dataset) => {
|
|
300
|
+
const observations = normalizedRuns.flatMap((run) =>
|
|
301
|
+
run.cases.filter((item) => item.datasetId === dataset.id),
|
|
302
|
+
);
|
|
303
|
+
const baseline = mean(observations.map((item) => item.baseline.score));
|
|
304
|
+
const skill = mean(observations.map((item) => item.skill.score));
|
|
305
|
+
return Object.freeze({
|
|
306
|
+
datasetId: dataset.id,
|
|
307
|
+
count: observations.length,
|
|
308
|
+
baseline,
|
|
309
|
+
skill,
|
|
310
|
+
delta: skill - baseline,
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
const equalWeightBaseline = mean(perDataset.map((item) => item.baseline));
|
|
314
|
+
const equalWeightSkill = mean(perDataset.map((item) => item.skill));
|
|
315
|
+
const deltas = normalizedRuns.flatMap((run) =>
|
|
316
|
+
run.cases.map((item) => item.skill.score - item.baseline.score),
|
|
317
|
+
);
|
|
318
|
+
const random = prngFromDigest(plan.planDigest);
|
|
319
|
+
const bootstrap = Array.from({ length: plan.bootstrapSamples }, () => {
|
|
320
|
+
const sample = Array.from(
|
|
321
|
+
{ length: deltas.length },
|
|
322
|
+
() => deltas[Math.floor(random() * deltas.length)],
|
|
323
|
+
);
|
|
324
|
+
return mean(sample);
|
|
325
|
+
}).sort((left, right) => left - right);
|
|
326
|
+
const measurements = normalizedRuns.flatMap((run) =>
|
|
327
|
+
run.cases.flatMap((item) => [item.baseline, item.skill]),
|
|
328
|
+
);
|
|
329
|
+
const core = {
|
|
330
|
+
schema: WIKISKILL_BENCHMARK_REPORT_SCHEMA,
|
|
331
|
+
planDigest: plan.planDigest,
|
|
332
|
+
gitCommit: plan.gitCommit,
|
|
333
|
+
runnerDigest: plan.runnerDigest,
|
|
334
|
+
datasetDigests: Object.freeze(
|
|
335
|
+
plan.datasets.map(({ id, digest: datasetDigest, splitDigest }) => ({
|
|
336
|
+
id,
|
|
337
|
+
digest: datasetDigest,
|
|
338
|
+
splitDigest,
|
|
339
|
+
})),
|
|
340
|
+
),
|
|
341
|
+
runCount: normalizedRuns.length,
|
|
342
|
+
pairedObservationCount: deltas.length,
|
|
343
|
+
perDataset: Object.freeze(perDataset),
|
|
344
|
+
metrics: Object.freeze({
|
|
345
|
+
equalWeightBaseline,
|
|
346
|
+
equalWeightSkill,
|
|
347
|
+
delta: equalWeightSkill - equalWeightBaseline,
|
|
348
|
+
pairedBootstrap95Ci: Object.freeze([
|
|
349
|
+
percentile(bootstrap, 0.025),
|
|
350
|
+
percentile(bootstrap, 0.975),
|
|
351
|
+
]),
|
|
352
|
+
bootstrapSamples: plan.bootstrapSamples,
|
|
353
|
+
tokens: measurements.reduce((sum, item) => sum + item.tokens, 0),
|
|
354
|
+
cost: measurements.reduce((sum, item) => sum + item.cost, 0),
|
|
355
|
+
latencyMs: Object.freeze({
|
|
356
|
+
p50: percentile(
|
|
357
|
+
measurements.map((item) => item.latencyMs).sort((a, b) => a - b),
|
|
358
|
+
0.5,
|
|
359
|
+
),
|
|
360
|
+
p95: percentile(
|
|
361
|
+
measurements.map((item) => item.latencyMs).sort((a, b) => a - b),
|
|
362
|
+
0.95,
|
|
363
|
+
),
|
|
364
|
+
p99: percentile(
|
|
365
|
+
measurements.map((item) => item.latencyMs).sort((a, b) => a - b),
|
|
366
|
+
0.99,
|
|
367
|
+
),
|
|
368
|
+
}),
|
|
369
|
+
}),
|
|
370
|
+
failureCounts: Object.freeze(
|
|
371
|
+
[...FAILURE_CLASSES].reduce((result, classification) => {
|
|
372
|
+
result[classification] = measurements.filter(
|
|
373
|
+
(item) => item.failureClass === classification,
|
|
374
|
+
).length;
|
|
375
|
+
return result;
|
|
376
|
+
}, {}),
|
|
377
|
+
),
|
|
378
|
+
runs: Object.freeze(normalizedRuns),
|
|
379
|
+
};
|
|
380
|
+
return Object.freeze({
|
|
381
|
+
...core,
|
|
382
|
+
reportDigest: digest(WIKISKILL_BENCHMARK_REPORT_SCHEMA, core),
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
export async function executeWikiSkillBenchmark({ plan, runner } = {}) {
|
|
387
|
+
if (
|
|
388
|
+
!plan ||
|
|
389
|
+
plan.schema !== WIKISKILL_BENCHMARK_PLAN_SCHEMA ||
|
|
390
|
+
!DIGEST.test(plan.planDigest ?? "")
|
|
391
|
+
)
|
|
392
|
+
throw new TypeError("a canonical benchmark plan is required");
|
|
393
|
+
if (typeof runner !== "function")
|
|
394
|
+
throw new TypeError("benchmark runner is required");
|
|
395
|
+
const runs = [];
|
|
396
|
+
for (const seed of plan.seedSchedule) {
|
|
397
|
+
const cases = [];
|
|
398
|
+
for (const dataset of plan.datasets) {
|
|
399
|
+
for (const splitId of dataset.splitIds) {
|
|
400
|
+
const common = Object.freeze({
|
|
401
|
+
planDigest: plan.planDigest,
|
|
402
|
+
seed,
|
|
403
|
+
dataset: Object.freeze({
|
|
404
|
+
id: dataset.id,
|
|
405
|
+
version: dataset.version,
|
|
406
|
+
digest: dataset.digest,
|
|
407
|
+
splitId,
|
|
408
|
+
splitDigest: dataset.splitDigest,
|
|
409
|
+
}),
|
|
410
|
+
model: plan.model,
|
|
411
|
+
inference: plan.inference,
|
|
412
|
+
environment: plan.environment,
|
|
413
|
+
toolDigest: plan.toolDigest,
|
|
414
|
+
apiDigest: plan.apiDigest,
|
|
415
|
+
promptDigest: plan.promptDigest,
|
|
416
|
+
runnerDigest: plan.runnerDigest,
|
|
417
|
+
});
|
|
418
|
+
const baseline = await runner(
|
|
419
|
+
Object.freeze({
|
|
420
|
+
...common,
|
|
421
|
+
arm: "no-skill",
|
|
422
|
+
skillDigest: null,
|
|
423
|
+
wikiDigest: null,
|
|
424
|
+
}),
|
|
425
|
+
);
|
|
426
|
+
const skill = await runner(
|
|
427
|
+
Object.freeze({
|
|
428
|
+
...common,
|
|
429
|
+
arm: "skill",
|
|
430
|
+
skillDigest: plan.skillDigest,
|
|
431
|
+
wikiDigest: plan.wikiDigest,
|
|
432
|
+
}),
|
|
433
|
+
);
|
|
434
|
+
cases.push({
|
|
435
|
+
datasetId: dataset.id,
|
|
436
|
+
splitId,
|
|
437
|
+
baseline,
|
|
438
|
+
skill,
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
runs.push({
|
|
443
|
+
runId: digest(WIKISKILL_BENCHMARK_REPORT_SCHEMA, {
|
|
444
|
+
planDigest: plan.planDigest,
|
|
445
|
+
seed,
|
|
446
|
+
}),
|
|
447
|
+
seed,
|
|
448
|
+
cases,
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
return buildWikiSkillBenchmarkReport({ plan, runs });
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
export async function signWikiSkillBenchmarkReport({ report, attestor } = {}) {
|
|
455
|
+
if (
|
|
456
|
+
!report ||
|
|
457
|
+
report.schema !== WIKISKILL_BENCHMARK_REPORT_SCHEMA ||
|
|
458
|
+
!DIGEST.test(report.reportDigest ?? "")
|
|
459
|
+
)
|
|
460
|
+
throw new TypeError("a canonical benchmark report is required");
|
|
461
|
+
if (typeof attestor !== "function")
|
|
462
|
+
throw new TypeError("attestor is required");
|
|
463
|
+
const attestation = await attestor(report.reportDigest);
|
|
464
|
+
if (!attestation || typeof attestation !== "object")
|
|
465
|
+
throw new Error("benchmark attestor returned no attestation");
|
|
466
|
+
return Object.freeze({
|
|
467
|
+
schema: WIKISKILL_BENCHMARK_ENVELOPE_SCHEMA,
|
|
468
|
+
report,
|
|
469
|
+
attestation: Object.freeze({ ...attestation }),
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
export async function projectWikiSkillBenchmarkClaim({
|
|
474
|
+
envelope,
|
|
475
|
+
verifyAttestation,
|
|
476
|
+
} = {}) {
|
|
477
|
+
const hold = Object.freeze({
|
|
478
|
+
provenance: "external-paper-only",
|
|
479
|
+
status: "HOLD",
|
|
480
|
+
reportDigest: null,
|
|
481
|
+
metrics: null,
|
|
482
|
+
});
|
|
483
|
+
if (!envelope) return hold;
|
|
484
|
+
if (
|
|
485
|
+
envelope.schema !== WIKISKILL_BENCHMARK_ENVELOPE_SCHEMA ||
|
|
486
|
+
typeof verifyAttestation !== "function"
|
|
487
|
+
)
|
|
488
|
+
throw new TypeError("signed benchmark envelope and verifier are required");
|
|
489
|
+
const { report } = envelope;
|
|
490
|
+
if (!report || report.schema !== WIKISKILL_BENCHMARK_REPORT_SCHEMA)
|
|
491
|
+
throw new Error("benchmark report is invalid");
|
|
492
|
+
const core = Object.fromEntries(
|
|
493
|
+
Object.entries(report).filter(([key]) => key !== "reportDigest"),
|
|
494
|
+
);
|
|
495
|
+
if (digest(WIKISKILL_BENCHMARK_REPORT_SCHEMA, core) !== report.reportDigest)
|
|
496
|
+
throw new Error("benchmark report digest mismatch");
|
|
497
|
+
if (
|
|
498
|
+
!(await verifyAttestation({
|
|
499
|
+
digest: report.reportDigest,
|
|
500
|
+
attestation: envelope.attestation,
|
|
501
|
+
}))
|
|
502
|
+
)
|
|
503
|
+
throw new Error("benchmark report attestation rejected");
|
|
504
|
+
return Object.freeze({
|
|
505
|
+
provenance: "chainlesschain-measured",
|
|
506
|
+
status: "VERIFIED",
|
|
507
|
+
reportDigest: report.reportDigest,
|
|
508
|
+
metrics: report.metrics,
|
|
509
|
+
});
|
|
510
|
+
}
|
|
@@ -59,6 +59,8 @@ const VSCODE_COMMANDS = [
|
|
|
59
59
|
"chainlesschain.appServerPilot.interrupt",
|
|
60
60
|
"chainlesschain.usage.show",
|
|
61
61
|
"chainlesschain.plugins.manage",
|
|
62
|
+
"chainlesschain.skills.retrieve",
|
|
63
|
+
"chainlesschain.evolution.workbench",
|
|
62
64
|
"chainlesschain.worktree.tasks",
|
|
63
65
|
"chainlesschain.chrome.connector",
|
|
64
66
|
"chainlesschain.artifacts.show",
|
|
@@ -114,6 +116,8 @@ const JETBRAINS_ACTIONS = [
|
|
|
114
116
|
"chainlesschain.policy.Viewer",
|
|
115
117
|
"chainlesschain.context.Center",
|
|
116
118
|
"chainlesschain.plugins.Manage",
|
|
119
|
+
"chainlesschain.skills.Retrieve",
|
|
120
|
+
"chainlesschain.evolution.Workbench",
|
|
117
121
|
"chainlesschain.worktree.Tasks",
|
|
118
122
|
"chainlesschain.chrome.Connector",
|
|
119
123
|
"chainlesschain.workspace.ScanAutoExec",
|
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* A lease is cooperative authority for production hosts, not a same-UID
|
|
5
5
|
* sandbox. Every process sharing CHAINLESSCHAIN_HOME observes the same strict
|
|
6
|
-
* state file. A monotonically increasing fencing token prevents
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* state file. A monotonically increasing fencing token prevents a crashed host
|
|
7
|
+
* from publishing through guarded session-store write paths after a successor
|
|
8
|
+
* takes over. A separate monotonic revocation epoch lets an operator fence a
|
|
9
|
+
* still-live host; every guarded transition re-reads it. An exact local owner
|
|
10
|
+
* may renew after its TTL when the event loop was blocked: no successor can
|
|
11
|
+
* have been admitted while that owner PID remained live, and any revocation or
|
|
12
|
+
* takeover still changes the durable authority tuple and fences the old host.
|
|
10
13
|
*/
|
|
11
14
|
|
|
12
15
|
import fs from "node:fs";
|
|
@@ -440,9 +443,9 @@ export class SessionHostLeaseAuthority {
|
|
|
440
443
|
const incumbent = snapshot.active;
|
|
441
444
|
// Never take authority from a process that the OS still reports as
|
|
442
445
|
// alive, even after its heartbeat TTL. It may be blocked inside an
|
|
443
|
-
// external side effect and resume later.
|
|
444
|
-
//
|
|
445
|
-
//
|
|
446
|
+
// external side effect and resume later. The exact local owner may
|
|
447
|
+
// renew late; takeover additionally requires proven process death so
|
|
448
|
+
// two executors cannot overlap.
|
|
446
449
|
if (incumbent && this._isProcessAlive(incumbent.ownerPid)) {
|
|
447
450
|
throw leaseError(
|
|
448
451
|
SESSION_HOST_LEASE_HELD_CODE,
|
|
@@ -522,13 +525,6 @@ export class SessionHostLeaseAuthority {
|
|
|
522
525
|
);
|
|
523
526
|
}
|
|
524
527
|
const now = Math.trunc(this._now());
|
|
525
|
-
if (snapshot.active.expiresAtMs <= now) {
|
|
526
|
-
throw leaseError(
|
|
527
|
-
SESSION_HOST_LEASE_FENCED_CODE,
|
|
528
|
-
`Session host lease expired for ${id}`,
|
|
529
|
-
{ sessionId: id, fencingToken: record.active.fencingToken },
|
|
530
|
-
);
|
|
531
|
-
}
|
|
532
528
|
const next = {
|
|
533
529
|
...snapshot.active,
|
|
534
530
|
renewedAtMs: now,
|
|
@@ -898,8 +894,7 @@ export class SessionHostLeaseAuthority {
|
|
|
898
894
|
record &&
|
|
899
895
|
(record.released ||
|
|
900
896
|
record.active.revocationEpoch !== snapshot.revocationEpoch ||
|
|
901
|
-
!sameLease(snapshot.active, record.active)
|
|
902
|
-
snapshot.active.expiresAtMs <= now)
|
|
897
|
+
!sameLease(snapshot.active, record.active))
|
|
903
898
|
) {
|
|
904
899
|
const error = leaseError(
|
|
905
900
|
SESSION_HOST_LEASE_FENCED_CODE,
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildSkillOutcomeIndexAuthority,
|
|
3
|
+
unavailableSkillOutcomeIndexAuthority,
|
|
4
|
+
} from "./evolution/skill-outcome-index-authority.js";
|
|
5
|
+
import {
|
|
6
|
+
buildSkillOutcomeTranscriptAuthority,
|
|
7
|
+
unavailableSkillOutcomeTranscriptAuthority,
|
|
8
|
+
} from "./skill-outcome-transcript-authority.js";
|
|
9
|
+
|
|
10
|
+
export function resolveSkillOutcomeAuthority(options = {}, dependencies = {}) {
|
|
11
|
+
if (
|
|
12
|
+
options &&
|
|
13
|
+
typeof options === "object" &&
|
|
14
|
+
Object.prototype.hasOwnProperty.call(options, "index")
|
|
15
|
+
) {
|
|
16
|
+
const buildIndex =
|
|
17
|
+
dependencies.buildSkillOutcomeIndexAuthority ||
|
|
18
|
+
buildSkillOutcomeIndexAuthority;
|
|
19
|
+
const unavailableIndex =
|
|
20
|
+
dependencies.unavailableSkillOutcomeIndexAuthority ||
|
|
21
|
+
unavailableSkillOutcomeIndexAuthority;
|
|
22
|
+
try {
|
|
23
|
+
return buildIndex(options.index, dependencies.indexDependencies);
|
|
24
|
+
} catch (error) {
|
|
25
|
+
return unavailableIndex(error);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const buildTranscript =
|
|
30
|
+
dependencies.buildSkillOutcomeTranscriptAuthority ||
|
|
31
|
+
buildSkillOutcomeTranscriptAuthority;
|
|
32
|
+
const unavailableTranscript =
|
|
33
|
+
dependencies.unavailableSkillOutcomeTranscriptAuthority ||
|
|
34
|
+
unavailableSkillOutcomeTranscriptAuthority;
|
|
35
|
+
try {
|
|
36
|
+
return buildTranscript(
|
|
37
|
+
options?.transcriptOptions,
|
|
38
|
+
dependencies.transcriptDependencies,
|
|
39
|
+
);
|
|
40
|
+
} catch (error) {
|
|
41
|
+
return unavailableTranscript(error);
|
|
42
|
+
}
|
|
43
|
+
}
|