chainlesschain 0.166.85 → 0.166.87
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 +8 -0
- package/package.json +3 -2
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-Cgo7OFpi.js → AIOps-DdQjhXg9.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-lUMnE2Ln.js → ActionButton-CuwA3hPA.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CsvKzTot.js → Analytics-DTVXJSAC.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-C2z1h1Pv.js → AppLayout-j06JBfEQ.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-C5Q0ZhNb.js → Artifacts-BFAK8LEW.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DXnfPKsI.js → Audit-BiGxRpOf.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DjbGcLm3.js → BackgroundAgents-B6uHaPkZ.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-9bVrKvXE.js → Backup-BNAesB8q.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-bx5ri7BD.js → BaseInput-BOuetfCd.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CCFmeUMY.js → Chat-cVzo3m_D.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DZ2Ys-CI.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-ei7MQXe9.js → Checkbox-BaCTS-H8.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CXgBJ9iu.js → Codegen-CBE8NiYh.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DMkMsizS.js → Col-C9wLiUTN.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CvpB_UFR.js → Community-jdClBSIp.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-gay5hbFX.js → Compact-BIjauIlM.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-dG8JQyRL.js → Compliance-CZ-AoaNj.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BA3xfaTW.js → Cowork-BbTKtDS4.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-D1_HsxyY.js → Cron-ImKdtwNi.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DZqoqoy5.js → Crosschain-B54GSHf5.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Cwnr8hCO.js → DID-BQt5WUzs.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CxevypiI.js → Dashboard--gNOffif.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-Bs7-yWgr.js → Dropdown-342A5YJw.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CcEs2Puo.js → EmailListRenderer-CtIZ3ZHd.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-C9ipBzAQ.js → EvolutionSettings-CyZPoTio.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Dt6--mGn.js → FamilyGuardDashboard-B1MCkFEu.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CD0JN5FF.js → Federation-DZWoERUy.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-POypz3Xv.js → FormItemContext-Onmb0mp3.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-Dv9f-0F5.js → GenericCardRenderer-u1qhNNc7.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BbTh5Atv.js → Git-BEowR1C5.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-C71dgoir.js → Governance-BiYd3AAg.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DwSHxbJB.js → Inference-CsC4Vjh5.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Cx1oQYQZ.js → KnowledgeGraph-BXA7ikPM.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BAJWe00o.js → Logs-C9WoplQm.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-CD8a7lHT.js → MarkdownRenderer-DecEsXsy.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-fwuY7P7Y.js → Marketplace-CCoJBfRL.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Di4693uc.js → McpTools-CzaOWBoA.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-Cz3L-GUB.js → Memory-BPwh7u1-.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BuXKIkSb.js → MobileBridge-Bk47v6z2.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-D-CY--Sb.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-LnACMFd0.js → Mtc-ExVyAGlW.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BZy7yE0t.js → MtcAudit-Rrw10csE.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-BFG5iVrE.js → Multisig-8TxxwxZZ.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DgXi04vJ.js → NLProgramming-CNckjtnY.js} +1 -1
- package/src/assets/web-panel/assets/Notes-C4j6cZTu.js +7 -0
- package/src/assets/web-panel/assets/{NotificationSettings-AixrsHw5.js → NotificationSettings-CchU8rWd.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-ZJBoyJ16.js +1 -0
- package/src/assets/web-panel/assets/{Organization-UNCBC3ux.js → Organization-F0Je7EdZ.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-Drh8oAFT.js → Overflow-B2k-JA3u.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-bc2q0xEB.js → P2P-yui9Xxe6.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BGwKxcDM.js → PdhVaultBrowser-CegM7hT6.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-DOnUxUzu.js → Permissions-CSFL0uvh.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-B3qPZkrr.js → PersonalDataHub-BrMcd-vr.js} +6 -6
- package/src/assets/web-panel/assets/{Pipeline-B6hfa4-i.js → Pipeline-fzrliaVP.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Bun3c35F.js → Privacy-BrkUjJ_g.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CCObdzk9.js → ProjectInit-CF_QCsW9.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-C6lKrSXY.js → ProjectSettings-Duwrd8aC.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DYcta7MZ.js → Projects-B0dLVXzU.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BtykxKCe.js → Providers-Db8iS1xQ.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-D9CDyroY.js → QrScannerModal-CHbNzEQs.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CJauCxXx.js → QuickAsk-CIESMfeR.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BbiYZofR.js → Recommend-BTMbCMtR.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BymCrgFW.js → RemoteSession-DavyK6J-.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-BWrGpMpF.js → Reputation-BFKtMelA.js} +1 -1
- package/src/assets/web-panel/assets/{Row-9pOYIhiW.js → Row-BI9AZUvw.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-D3bQJ4qB.js → RssFeed-1nwXt8NY.js} +2 -2
- package/src/assets/web-panel/assets/{Search-BpKOOFE0.js → Search-Ck8PDYbk.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DC6C0NSz.js → Security-BgDqpCbq.js} +4 -4
- package/src/assets/web-panel/assets/{Services-Lkf1046J.js → Services-DF8anXm4.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-eCQ_SsDb.js → Skeleton-CoHyY4ZX.js} +1 -1
- package/src/assets/web-panel/assets/Skills-dOaD4Ztl.js +1 -0
- package/src/assets/web-panel/assets/{Sla-BQbKy8XJ.js → Sla-XuOawvQY.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DHsRx-XA.js → SpeechSettings-DFJ7nAiu.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CC281X_J.js → SyncSettings-B2xYj-Pi.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-D_SzNTLi.js +1 -0
- package/src/assets/web-panel/assets/{Templates-Cr2vC0tg.js → Templates-BXFmKh7W.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DeYO5pIG.js → Tenant-CRg2AXbd.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DBNgbfPr.js → Terminal-DQgxnuep.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-MoxgaF3x.js → TimelineRenderer-BrPQhQVc.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CT2QfAN7.js → Tokens-RByy4USy.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DPUnomxs.js → Trigger-pE3y8u73.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DnufuaTx.js → Trust-DhID9C33.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CJ6iOdPs.js → UkeySign-CPxEPNBH.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-xBWkH8bL.js → VideoEditing-ZD8DUxeQ.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-WYV-4hMR.js → Wallet-Br9JREEd.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DJ5Mhd9L.js → WebAuthn-Cn-YacJg.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-B__UdOjN.js → WorkflowEditor-BTu0oqMp.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CLlmBVhp.js → chat-CEjws_QF.js} +1 -1
- package/src/assets/web-panel/assets/{colors-B8zoPQYm.js → colors-Bv2RNebW.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CvJ-dUsH.js → compact-item-gSc3EofP.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-LAtMm8SC.js → createContext-kyFDaqWC.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Dcc8pILJ.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CLYvg42H.js → hasIn-BuMWcjhx.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cv7vwX3z.js → index--nrQmk8X.js} +1 -1
- package/src/assets/web-panel/assets/index-05NB95_V.js +1 -0
- package/src/assets/web-panel/assets/{index-BUVrYDNV.js → index-42PTBO7a.js} +1 -1
- package/src/assets/web-panel/assets/{index-B6zlMzZz.js → index-BCS5j4SQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-oX216HRH.js → index-BSSIJ-rv.js} +1 -1
- package/src/assets/web-panel/assets/{index-B02qgCao.js → index-BUOCcXou.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_RPWP_5.js → index-Bg5jis0q.js} +1 -1
- package/src/assets/web-panel/assets/{index-DX99e8Xy.js → index-C-LPpwe9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDm9m4vC.js → index-C56Drzol.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHq2Of6z.js → index-C7Jo20JB.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_dq-6_3.js → index-C9U9SjcT.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0Z13xcZ.js → index-CF3TjDNz.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1hHp9_M.js → index-CMS3Mk93.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfOOACfd.js → index-CNt2X-aK.js} +1 -1
- package/src/assets/web-panel/assets/index-Cb6q8wlI.js +1 -0
- package/src/assets/web-panel/assets/{index-DYW4Z3y-.js → index-Cj4RA7oA.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2KFnUsv.js → index-CkfvP2dN.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkcQJvsz.js → index-Cm8K8Evn.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVDcRQuX.js → index-CvSuM_CB.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCzyJ1xS.js → index-Czo_hw97.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cpda0SAz.js → index-D3m3EXbL.js} +1 -1
- package/src/assets/web-panel/assets/{index-iJ6s24bA.js → index-DR561Sqc.js} +1 -1
- package/src/assets/web-panel/assets/{index-Di9vKira.js → index-DRa4R7vv.js} +1 -1
- package/src/assets/web-panel/assets/{index-09YzRb6Z.js → index-DYKSuD02.js} +3 -3
- package/src/assets/web-panel/assets/{index-C5v7cEtm.js → index-DYcPWVN9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGrQ2uEl.js → index-DbVUA5l3.js} +1 -1
- package/src/assets/web-panel/assets/{index-4rr5jFOL.js → index-DbkyTMj-.js} +1 -1
- package/src/assets/web-panel/assets/{index-GR3omApz.js → index-Dej4AGOz.js} +1 -1
- package/src/assets/web-panel/assets/{index-f1ptYBMr.js → index-EpxWlmip.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3uD5H7u.js → index-GpvWtvw3.js} +1 -1
- package/src/assets/web-panel/assets/{index-C6PETyel.js → index-NQ0c4hJ1.js} +1 -1
- package/src/assets/web-panel/assets/{index-CnLXLaEF.js → index-OjZUHz5z.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpeV-6y4.js → index-U-ytt84A.js} +1 -1
- package/src/assets/web-panel/assets/{index-DNQUdPam.js → index-_0bfDTDu.js} +1 -1
- package/src/assets/web-panel/assets/{index-BM2HqHdT.js → index-jmMAqBAm.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bu7-I2L4.js → index-nLemnBZ2.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUcE6rIa.js → index-q65c1kp8.js} +1 -1
- package/src/assets/web-panel/assets/{index-DX0aHEHL.js → index-sJ1F5Txa.js} +1 -1
- package/src/assets/web-panel/assets/{index-CxJ4NPVq.js → index-xfS_WO9b.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-QD-koeaw.js → initDefaultProps-B-wqiSu7.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CTItLW4-.js → motion-BK4_B4MD.js} +1 -1
- package/src/assets/web-panel/assets/{move-CGsdTOdN.js → move-BU2TgDDO.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-C1kW_CNU.js → mtc-parser-DA3E4_EX.js} +1 -1
- package/src/assets/web-panel/assets/{omit-B4PilaYy.js → omit-CaHz1e_q.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DBGUE12e.js → pickAttrs-NXZ19amf.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DZxCLjuo.js → placementArrow-BCXI9AHO.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CZjQiocN.js → responsiveObserve-DdlZ9tLk.js} +1 -1
- package/src/assets/web-panel/assets/{slide-Btz5hh2_.js → slide-DCZm_Vc4.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CfuxuLIt.js → statusUtils-CuEULKQr.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DdO0Obo_.js → styleChecker-Bo_UXG8x.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CxftJ-Zs.js → useFlexGapSupport-B9PaTcFH.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-pVJChh6K.js → useFs-DwSTGdVR.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-wv7Q0uNE.js → usePersonalDataHub-FswSxnDC.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DVOVfAqC.js → vnode-EUztvYTj.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-B5tebZuT.js → zoom-D41MAgV-.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/eval.js +118 -18
- package/src/commands/memory.js +34 -15
- package/src/commands/sandbox.js +9 -0
- package/src/data/changelog.json +26 -0
- package/src/lib/causal-observability.js +6 -45
- package/src/lib/context-memory-kernel/durable-memory-port.js +54 -12
- package/src/lib/context-memory-kernel/index.js +1 -0
- package/src/lib/context-memory-kernel/memory-query-index.js +278 -0
- package/src/lib/context-memory-kernel/memory-service.js +60 -18
- package/src/lib/context-memory-kernel/runtime.js +5 -3
- package/src/lib/context-memory-kernel/segmented-memory-port.js +955 -0
- package/src/lib/eval/outcomes.js +20 -10
- package/src/lib/eval/runner.js +49 -5
- package/src/lib/eval/tasks.js +8 -3
- package/src/lib/eval/verify01-contracts.js +349 -0
- package/src/lib/eval/verify01-execution.js +605 -0
- package/src/lib/execution-support.js +58 -0
- package/src/lib/llm-pricing.js +98 -11
- package/src/lib/model-catalog-review.js +116 -0
- package/src/lib/model-context-catalog.js +23 -1
- package/src/lib/openai-responses.js +39 -0
- package/src/lib/packer/pack-update-applier.js +13 -8
- package/src/lib/permission-authority.js +146 -10
- package/src/lib/process-execution-broker/index.js +8 -0
- package/src/lib/process-execution-broker/linux-subreaper-process.js +24 -2
- package/src/lib/process-execution-broker/process-ownership-journal.js +168 -7
- package/src/lib/process-execution-broker/process-ownership-quarantine.js +56 -1
- package/src/lib/process-execution-broker/process-recovery-cgroup.js +272 -0
- package/src/lib/sandbox-egress-authority-monitor.js +62 -5
- package/src/lib/scoped-permission-store.js +104 -1
- package/src/lib/settings-authority-domain.cjs +37 -2
- package/src/lib/settings-loader.cjs +67 -34
- package/src/lib/settings-permission-authority.cjs +373 -0
- package/src/runtime/agent-core.js +88 -407
- package/src/runtime/headless-runner.js +8 -3
- package/src/runtime/headless-stream.js +10 -3
- package/src/runtime/permission-authority-host.js +151 -0
- package/src/runtime/provider-stream-state.js +379 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-ClqsIfTT.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-Bk-lK4Um.js +0 -1
- package/src/assets/web-panel/assets/Notes-BAj0Kgg4.js +0 -7
- package/src/assets/web-panel/assets/OrderTableRenderer-Dwqk3FlG.js +0 -1
- package/src/assets/web-panel/assets/Skills-BvDSQ3-d.js +0 -1
- package/src/assets/web-panel/assets/Tasks-CHHSWHom.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DgZ4fdGI.js +0 -1
- package/src/assets/web-panel/assets/index-jLEdASOV.js +0 -1
- package/src/assets/web-panel/assets/index-jesGo4rl.js +0 -1
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"economy": "Usage: chainlesschain economy [options] [command]\n\nAgent economy — payments, channels, marketplace, NFTs\n\nOptions:\n -h, --help display help for command\n\nCommands:\n price <service-id> <price> Set a service price\n pay [options] <from> <to> <amount> Make a payment between agents\n balance [options] <agent-id> Show agent balance\n channel State channel management\n market Resource marketplace\n trade <listing-id> <buyer> <quantity> Buy a resource from the marketplace\n nft NFT management\n revenue <pool> <agent-ids> Distribute revenue pool (comma-separated agent IDs)\n contribute <agent-id> <type> <value> Record agent contribution\n payment-types [options] List PAYMENT_TYPE enum values (Phase 85)\n channel-statuses [options] List CHANNEL_STATUS enum values (Phase 85)\n resource-types [options] List RESOURCE_TYPE enum values (Phase 85)\n nft-statuses [options] List NFT_STATUS enum values (Phase 85)\n price-v2 [options] <service-id> <payment-type> <rate> Set a service price with payment-type model (Phase 85)\n price-get [options] <service-id> Get a service's price model (Phase 85)\n pay-v2 [options] <from> <to> <service-id> Pay for a priced service (computes amount from usage) (Phase 85)\n channel-open-v2 [options] <party-a> <party-b> Open a two-sided channel (Phase 85)\n channel-activate [options] <id> OPEN → ACTIVE (Phase 85)\n channel-settle [options] <id> ACTIVE → SETTLING with final balances (Phase 85)\n channel-close-v2 [options] <id> Close channel and release locked funds (Phase 85)\n channel-dispute [options] <id> Mark channel DISPUTED (Phase 85)\n channels-v2 [options] List channels with optional status/party filter (Phase 85)\n market-list-v2 [options] <seller> <resource-type> <price> List a resource with validated RESOURCE_TYPE (Phase 85)\n nft-mint-v2 [options] <owner> <asset-type> Mint NFT with royalty tracking (Phase 85)\n nft-list [options] <id> <price> List NFT for sale at a price (Phase 85)\n nft-buy [options] <id> <buyer> Buy a listed NFT (Phase 85)\n nft-burn [options] <id> Burn an NFT (Phase 85)\n nft-status [options] <id> Get NFT status (Phase 85)\n contribute-task [options] <task-id> <agent-id> Record a weighted task contribution (Phase 85)\n contributions-task [options] <task-id> List contributions for a task (Phase 85)\n distribute-v2 [options] <task-id> <total> Distribute revenue across task contributors (Phase 85)\n distributions [options] List distribution records (Phase 85)\n stats-v2 [options] Extended economy stats (Phase 85)\n enums-v2 Show V2 enums (account maturity + tx lifecycle)\n config-v2 Show V2 config thresholds\n set-max-active-accounts-v2 <n> Set max active accounts per holder\n set-max-pending-txs-v2 <n> Set max pending txs per account\n set-account-idle-ms-v2 <n> Set account idle threshold (ms)\n set-tx-stuck-ms-v2 <n> Set tx stuck threshold (ms)\n register-account-v2 [options] <id> <holder> Register V2 economy account\n activate-account-v2 <id> Activate account (pending→active or frozen→active)\n freeze-account-v2 <id> Freeze account\n close-account-v2 <id> Close account (terminal)\n touch-account-v2 <id> Touch account lastTouchedAt\n get-account-v2 <id> Get V2 account\n list-accounts-v2 List all V2 accounts\n create-tx-v2 [options] <id> <accountId> Create V2 tx (queued)\n start-tx-v2 <id> Start tx (queued→processing)\n settle-tx-v2 <id> Settle tx (processing→settled)\n fail-tx-v2 <id> [reason] Fail tx\n cancel-tx-v2 <id> [reason] Cancel tx\n get-tx-v2 <id> Get V2 tx\n list-txs-v2 List all V2 txs\n auto-freeze-idle-v2 Auto-freeze idle active accounts\n auto-fail-stuck-v2 Auto-fail stuck processing txs\n gov-stats-v2 V2 governance aggregate stats\n help [command] display help for command\n",
|
|
56
56
|
"ecosystem": "Usage: chainlesschain ecosystem|eco [options] [command]\n\nPlugin Ecosystem 2.0 (Phase 64) — registry + deps + install + AI review +\npublish + revenue + recommend\n\nOptions:\n -h, --help display help for command\n\nCommands:\n config Show ecosystem config (severities, statuses, rules, defaults)\n severities List review severities\n statuses List publish / install statuses\n revenue-types List revenue event types\n dep-kinds List dependency kinds\n rules List heuristic AI review rules\n register [options] Register a new plugin (status=draft)\n plugins [options] List plugins\n show <pluginId> Show plugin details\n update-stats [options] <pluginId> Update download count / avg rating\n dep-add [options] <pluginId> Add a dependency to a plugin\n deps <pluginId> List direct dependencies of a plugin\n resolve <pluginId> Resolve dependency tree (detects conflicts + cycles)\n install [options] Install a plugin for a user (auto-fails on cycle/conflict)\n installs [options] List install records\n uninstall <installId> Mark an install as uninstalled\n review [options] <pluginId> Run heuristic AI code review (regex rules + score)\n review-show <reviewId> Show a single review record\n reviews [options] List review records\n sandbox [options] <pluginId> Record a sandbox test result (caller pushes outcome)\n sandbox-show <testId> Show a single sandbox test record\n sandbox-tests [options] List sandbox test records\n submit <pluginId> Submit a plugin for review (draft/rejected → reviewing)\n approve <pluginId> Approve a reviewing plugin\n reject [options] <pluginId> Reject a reviewing plugin (appends a rejection review record)\n publish [options] <pluginId> Publish an approved plugin (computes sourceHash)\n rev-record [options] Record a revenue event (splits via developerShareRatio)\n revenue [options] <developerId> Aggregate a developer's revenue\n recommend [options] Heuristic plugin recommendations for a user\n stats Show ecosystem stats\n maturity-statuses-v2 List V2 plugin maturity statuses\n install-lifecycle-v2 List V2 install lifecycle statuses\n default-max-active-plugins-per-developer Show V2 default max active plugins per developer\n max-active-plugins-per-developer Show current V2 max active plugins per developer\n set-max-active-plugins-per-developer <n> Set V2 max active plugins per developer\n default-max-pending-installs-per-user Show V2 default max pending installs per user\n max-pending-installs-per-user Show current V2 max pending installs per user\n set-max-pending-installs-per-user <n> Set V2 max pending installs per user\n default-auto-deprecate-after-ms Show V2 default auto-deprecate threshold (ms)\n auto-deprecate-after-ms Show current V2 auto-deprecate threshold (ms)\n set-auto-deprecate-after-ms <ms> Set V2 auto-deprecate threshold (ms)\n default-auto-archive-after-ms Show V2 default auto-archive threshold (ms)\n auto-archive-after-ms Show current V2 auto-archive threshold (ms)\n set-auto-archive-after-ms <ms> Set V2 auto-archive threshold (ms)\n active-plugin-count [options] Count V2 active plugins (optionally scoped)\n pending-install-count [options] Count V2 pending+resolving installs (optionally scoped)\n register-plugin-v2 [options] <plugin-id> Register V2 plugin (status=active)\n maturity-v2 <plugin-id> Show V2 plugin maturity\n set-maturity-v2 [options] <plugin-id> <status> Transition V2 plugin maturity\n deprecate-plugin [options] <plugin-id> Deprecate V2 plugin\n archive-plugin-v2 [options] <plugin-id> Archive V2 plugin\n remove-plugin-v2 [options] <plugin-id> Remove V2 plugin (terminal)\n touch-plugin-activity <plugin-id> Bump lastActivityAt for V2 plugin\n submit-install-v2 [options] <install-id> Submit V2 install (status=pending)\n install-status-v2 <install-id> Show V2 install status\n set-install-status-v2 [options] <install-id> <status> Transition V2 install status\n resolve-install [options] <install-id> Mark V2 install as resolving\n complete-install [options] <install-id> Mark V2 install as installed\n fail-install [options] <install-id> Mark V2 install as failed\n uninstall-install-v2 [options] <install-id> Mark V2 install as uninstalled (terminal)\n retry-failed-install [options] <install-id> Retry a failed V2 install (failed → pending)\n auto-deprecate-stale-plugins Bulk-flip stale V2 ACTIVE plugins to DEPRECATED\n auto-archive-long-deprecated Bulk-flip long-deprecated V2 plugins to ARCHIVED\n stats-v2 Show V2 ecosystem stats (maturity + install)\n help [command] display help for command\n",
|
|
57
57
|
"encrypt": "Usage: chainlesschain encrypt [options] [command]\n\nFile encryption and database encryption management\n\nOptions:\n -h, --help display help for command\n\nCommands:\n file [options] <path> Encrypt a file with AES-256-GCM\n db [options] Enable database encryption tracking\n info [options] <path> Check if a file is encrypted\n status [options] Show database encryption status\n key-maturities-v2 [options] [V2] List crypto key maturity states\n job-lifecycles-v2 [options] [V2] List crypto job lifecycle states\n config-v2 [options] [V2] Show governance config\n set-max-active-keys-per-owner-v2 <n> [V2] Set per-owner active key cap\n set-max-pending-jobs-per-key-v2 <n> [V2] Set per-key pending job cap\n set-key-idle-ms-v2 <ms> [V2] Set key idle threshold (ms)\n set-job-stuck-ms-v2 <ms> [V2] Set job stuck threshold (ms)\n register-key-v2 [options] <id> [V2] Register a crypto key profile\n (PENDING)\n activate-key-v2 <id> [V2] Activate key (pending|rotated ->\n active)\n rotate-key-v2 <id> [V2] Rotate key (active -> rotated)\n retire-key-v2 <id> [V2] Retire key (terminal)\n touch-key-v2 <id> [V2] Bump key lastSeenAt\n get-key-v2 [options] <id> [V2] Show crypto key profile\n list-keys-v2 [options] [V2] List crypto key profiles\n create-job-v2 [options] <id> [V2] Create a queued V2 crypto job\n start-job-v2 <id> [V2] Start crypto job (queued ->\n running)\n complete-job-v2 <id> [V2] Complete crypto job (running ->\n completed)\n fail-job-v2 <id> [V2] Fail crypto job (running ->\n failed)\n cancel-job-v2 <id> [V2] Cancel crypto job (queued|running\n -> cancelled)\n get-job-v2 [options] <id> [V2] Show crypto job\n list-jobs-v2 [options] [V2] List V2 crypto jobs\n active-key-count-v2 [options] [V2] Count active crypto keys (optional\n --owner)\n pending-job-count-v2 [options] [V2] Count pending crypto jobs\n (queued+running)\n auto-rotate-idle-keys-v2 [options] [V2] Rotate idle active keys\n auto-fail-stuck-jobs-v2 [options] [V2] Fail stuck running crypto jobs\n stats-v2 [options] [V2] Show governance stats\n help [command] display help for command\n",
|
|
58
|
-
"eval": "Usage: chainlesschain eval [options]\n\nRun the reliability eval suite (self-checking coding tasks) and report the\ntask-success rate\n\nOptions:\n --suite <name> Suite to run (default: \"builtin\")\n --model <model> Model for the agent runs\n --provider <provider> Provider for the agent runs\n --json Output the summary as JSON\n --keep Keep the per-task temp workspaces (debug)\n --otlp <file> Write OpenTelemetry (OTLP/JSON) spans for the\n run to a file\n --dry-run Use a no-op agent (exercise the harness/report\n without a model)\n --history <file> Append this run's summary (JSONL) for trend\n tracking\n --label <label> Tag this run in the history (e.g. a\n version/commit)\n --trend Report the diagnostic pass-rate trend from\n --history instead of running\n --strict With --trend: require complete, comparable\n recent evidence; legacy history cannot pass\n --max-age-hours <hours> With --strict: maximum age of both compared\n runs (default: \"168\")\n --comparison-context <file> Bind explicit provider/model to\n operator-declared modelRevision and\n environment/permission/inference digests (not\n production attestation)\n --regression-threshold <pct> With --trend: pass-rate drop (in points) that\n fails the gate on its own (default: \"0\")\n -h, --help display help for command\n",
|
|
58
|
+
"eval": "Usage: chainlesschain eval [options]\n\nRun the reliability eval suite (self-checking coding tasks) and report the\ntask-success rate\n\nOptions:\n --suite <name> Suite to run (default: \"builtin\")\n --plan-dir <directory> Frozen VERIFY-01 plan bundle\n --plan-digest <digest> Externally pinned frozen plan digest\n --review <file> Independent setup/check review configuration\n --review-digest <digest> Review digest pinned before execution\n --review-root <directory> Trusted evaluator source root outside the task\n project\n --project-root <directory> Actual checkout of the frozen project commit\n --samples <ids> Selected frozen sample IDs; unselected samples\n remain missing\n --evidence-dir <directory> Keep frozen-suite raw process output and\n complete diffs outside compact Eval history\n --model <model> Model for the agent runs\n --provider <provider> Provider for the agent runs\n --json Output the summary as JSON\n --keep Keep the per-task temp workspaces (debug)\n --otlp <file> Write OpenTelemetry (OTLP/JSON) spans for the\n run to a file\n --dry-run Use a no-op agent (exercise the harness/report\n without a model)\n --history <file> Append this run's summary (JSONL) for trend\n tracking\n --label <label> Tag this run in the history (e.g. a\n version/commit)\n --trend Report the diagnostic pass-rate trend from\n --history instead of running\n --strict With --trend: require complete, comparable\n recent evidence; legacy history cannot pass\n --max-age-hours <hours> With --strict: maximum age of both compared\n runs (default: \"168\")\n --comparison-context <file> Bind explicit provider/model to\n operator-declared modelRevision and\n environment/permission/inference digests (not\n production attestation)\n --regression-threshold <pct> With --trend: pass-rate drop (in points) that\n fails the gate on its own (default: \"0\")\n -h, --help display help for command\n",
|
|
59
59
|
"evolution": "Usage: chainlesschain evolution [options] [command]\n\nEvolution metrics and governance records — not model training or active Skill\npromotion\n\nOptions:\n -h, --help display help for command\n\nCommands:\n workbench Review governed Skill evolution evidence and versions\n attestor-trust Operate the governed Skill attestor trust control plane\n knowledge Review encrypted governed knowledge conflicts\n benchmark Run and inspect governed WikiSkill benchmark reports\n deployment Configure the signed governed Skill evolution deployment\n assess [options] <name> <score> Assess and track a capability\n record-model-metrics [options] <model-id> Record a synthetic model metric estimate (no training)\n diagnose [options] Diagnose recorded evolution metrics\n repair [options] <issue> Apply a maintenance strategy to a recorded diagnosis\n predict [options] [user-id] Predict user behavior\n growth [options] Show growth log\n stats [options] Show capabilities and models overview\n export [options] <model-id> Export a model metric record for portability\n dimensions [options] List CAPABILITY_DIMENSION enum\n severities [options] List DIAGNOSIS_SEVERITY enum\n strategies [options] List REPAIR_STRATEGY enum\n milestones [options] List GROWTH_MILESTONE enum\n assess-v2 [options] <dimension> <score> Assess capability by canonical dimension\n capabilities-v2 [options] List V2 capabilities\n record-training-metrics-v2 [options] Record caller-supplied loss metrics (no training)\n training-metrics-v2 [options] List V2 training metric records\n diagnose-v2 [options] Diagnose recorded V2 evolution metrics\n diagnoses-v2 [options] List V2 diagnoses\n diagnosis-show [options] <id> Show a specific diagnosis\n repair-v2 [options] <diagnosis-id> Record a V2 maintenance strategy for a diagnosis\n predict-v2 [options] Project behavior from recorded V2 metrics\n record-milestone [options] <type> Record a growth milestone explicitly\n growth-v2 [options] List V2 growth milestones\n configure [options] Update evolution config\n config [options] Show evolution config\n stats-v2 [options] V2 evolution stats\n enums-v2 Show V2 enums (goal maturity + cycle lifecycle)\n config-v2 Show V2 config thresholds\n set-max-active-goals-v2 <n> Set max active goals per owner\n set-max-pending-cycles-v2 <n> Set max pending cycles per goal\n set-goal-idle-ms-v2 <n> Set goal idle threshold (ms)\n set-cycle-stuck-ms-v2 <n> Set cycle stuck threshold (ms)\n register-goal-v2 [options] <id> <owner> Register V2 evo goal\n activate-goal-v2 <id> Activate evo goal\n pause-goal-v2 <id> Pause evo goal\n archive-goal-v2 <id> Archive goal (terminal)\n touch-goal-v2 <id> Touch goal lastTouchedAt\n get-goal-v2 <id> Get V2 goal\n list-goals-v2 List all V2 goals\n create-cycle-v2 [options] <id> <goalId> Create V2 cycle (queued)\n start-cycle-v2 <id> Start cycle (queued→running)\n complete-cycle-v2 <id> Complete cycle (running→completed)\n fail-cycle-v2 <id> [reason] Fail cycle\n cancel-cycle-v2 <id> [reason] Cancel cycle\n get-cycle-v2 <id> Get V2 cycle\n list-cycles-v2 List all V2 cycles\n auto-pause-idle-v2 Auto-pause idle active goals\n auto-fail-stuck-v2 Auto-fail stuck running cycles\n gov-stats-v2 V2 governance aggregate stats\n help [command] display help for command\n",
|
|
60
60
|
"evomap": "Usage: chainlesschain evomap [options] [command]\n\nEvoMap — gene exchange protocol for agent capabilities\n\nOptions:\n -h, --help display help for command\n\nCommands:\n search [options] <query> Search for genes on the hub\n download <geneId> Download a gene from the hub\n publish [options] Publish a gene to the hub\n list List locally installed genes\n hubs List configured EvoMap hubs\n federation Federated hub management and gene syncing\n gov EvoMap governance — ownership, proposals,\n voting\n enums-v2 Show V2 governance enums\n register-map-v2 [options] Register an evomap profile (pending)\n activate-map-v2 <id> Activate map\n stale-map-v2 <id> Mark map stale\n archive-map-v2 <id> Archive map (terminal)\n touch-map-v2 <id> Refresh lastTouchedAt\n get-map-v2 <id> Get map\n list-maps-v2 List maps\n create-evolution-v2 [options] Create an evolution (queued)\n start-evolution-v2 <id> Transition evolution to running\n complete-evolution-v2 <id> Transition evolution to completed\n fail-evolution-v2 [options] <id> Fail evolution\n cancel-evolution-v2 [options] <id> Cancel evolution\n get-evolution-v2 <id> Get evolution\n list-evolutions-v2 List evolutions\n set-max-active-maps-v2 <n> Set per-owner active cap\n set-max-pending-evolutions-v2 <n> Set per-map pending cap\n set-map-idle-ms-v2 <n> Set idle threshold\n set-evolution-stuck-ms-v2 <n> Set stuck threshold\n auto-stale-idle-maps-v2 Auto-stale idle maps\n auto-fail-stuck-evolutions-v2 Auto-fail stuck running evolutions\n gov-stats-v2 V2 governance aggregate stats\n help [command] display help for command\n",
|
|
61
61
|
"execbe": "Usage: chainlesschain execbe [options] [command]\n\nExecution backend V2 governance\n\nOptions:\n -h, --help display help for command\n\nCommands:\n maturities-v2\n job-lifecycle-v2\n stats-v2\n config-v2\n register-backend-v2 <id> <owner> [kind]\n activate-backend-v2 <id>\n degrade-backend-v2 <id>\n retire-backend-v2 <id>\n touch-backend-v2 <id>\n get-backend-v2 <id>\n list-backends-v2\n create-job-v2 <id> <backendId> [cmd]\n start-job-v2 <id>\n succeed-job-v2 <id>\n fail-job-v2 <id> [reason]\n cancel-job-v2 <id> [reason]\n get-job-v2 <id>\n list-jobs-v2\n auto-degrade-idle-v2\n auto-fail-stuck-v2\n set-max-active-v2 <n>\n set-max-pending-v2 <n>\n set-idle-ms-v2 <n>\n set-stuck-ms-v2 <n>\n reset-state-v2\n help [command] display help for command\n",
|
package/src/commands/eval.js
CHANGED
|
@@ -14,6 +14,7 @@ import path from "path";
|
|
|
14
14
|
import { fileURLToPath } from "url";
|
|
15
15
|
import { runEvalSuite } from "../lib/eval/runner.js";
|
|
16
16
|
import { getSuite } from "../lib/eval/tasks.js";
|
|
17
|
+
import { persistVerify01Receipts } from "../lib/eval/verify01-execution.js";
|
|
17
18
|
import executionBroker from "../lib/process-execution-broker/index.js";
|
|
18
19
|
import {
|
|
19
20
|
TelemetryRecorder,
|
|
@@ -142,7 +143,7 @@ function killAgentTree(child) {
|
|
|
142
143
|
* workspace. acceptEdits lets it write files without an interactive prompt.
|
|
143
144
|
*/
|
|
144
145
|
function makeHeadlessRunAgent(opts = {}) {
|
|
145
|
-
return function runAgent({ prompt, cwd, timeoutMs }) {
|
|
146
|
+
return function runAgent({ prompt, cwd, timeoutMs, costBudgetUsd }) {
|
|
146
147
|
return new Promise((resolve) => {
|
|
147
148
|
let args;
|
|
148
149
|
if (opts._argv) {
|
|
@@ -163,6 +164,9 @@ function makeHeadlessRunAgent(opts = {}) {
|
|
|
163
164
|
if (opts.model) args.push("--model", opts.model);
|
|
164
165
|
if (opts.provider) args.push("--provider", opts.provider);
|
|
165
166
|
if (opts.ephemeral === true) args.push("--ephemeral");
|
|
167
|
+
if (opts.sandboxMode) args.push("--sandbox-mode", opts.sandboxMode);
|
|
168
|
+
if (Number.isFinite(costBudgetUsd) && costBudgetUsd >= 0)
|
|
169
|
+
args.push("--max-budget-usd", String(costBudgetUsd));
|
|
166
170
|
}
|
|
167
171
|
const child = _deps.spawn(process.execPath, args, {
|
|
168
172
|
cwd,
|
|
@@ -272,6 +276,26 @@ export function registerEvalCommand(program, { logger } = {}) {
|
|
|
272
276
|
"Run the reliability eval suite (self-checking coding tasks) and report the task-success rate",
|
|
273
277
|
)
|
|
274
278
|
.option("--suite <name>", "Suite to run", "builtin")
|
|
279
|
+
.option("--plan-dir <directory>", "Frozen VERIFY-01 plan bundle")
|
|
280
|
+
.option("--plan-digest <digest>", "Externally pinned frozen plan digest")
|
|
281
|
+
.option("--review <file>", "Independent setup/check review configuration")
|
|
282
|
+
.option("--review-digest <digest>", "Review digest pinned before execution")
|
|
283
|
+
.option(
|
|
284
|
+
"--review-root <directory>",
|
|
285
|
+
"Trusted evaluator source root outside the task project",
|
|
286
|
+
)
|
|
287
|
+
.option(
|
|
288
|
+
"--project-root <directory>",
|
|
289
|
+
"Actual checkout of the frozen project commit",
|
|
290
|
+
)
|
|
291
|
+
.option(
|
|
292
|
+
"--samples <ids>",
|
|
293
|
+
"Selected frozen sample IDs; unselected samples remain missing",
|
|
294
|
+
)
|
|
295
|
+
.option(
|
|
296
|
+
"--evidence-dir <directory>",
|
|
297
|
+
"Keep frozen-suite raw process output and complete diffs outside compact Eval history",
|
|
298
|
+
)
|
|
275
299
|
.option("--model <model>", "Model for the agent runs")
|
|
276
300
|
.option("--provider <provider>", "Provider for the agent runs")
|
|
277
301
|
.option("--json", "Output the summary as JSON")
|
|
@@ -381,21 +405,54 @@ export function registerEvalCommand(program, { logger } = {}) {
|
|
|
381
405
|
let tasks;
|
|
382
406
|
let comparison;
|
|
383
407
|
try {
|
|
384
|
-
tasks = _deps.getSuite(options.suite
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
})
|
|
397
|
-
: null,
|
|
408
|
+
tasks = _deps.getSuite(options.suite, {
|
|
409
|
+
verify01: {
|
|
410
|
+
planDir: options.planDir,
|
|
411
|
+
planDigest: options.planDigest,
|
|
412
|
+
reviewFile: options.review,
|
|
413
|
+
reviewDigest: options.reviewDigest,
|
|
414
|
+
reviewRoot: options.reviewRoot,
|
|
415
|
+
projectRoot: options.projectRoot,
|
|
416
|
+
sampleIds: options.samples,
|
|
417
|
+
provider: options.provider,
|
|
418
|
+
model: options.model,
|
|
419
|
+
},
|
|
398
420
|
});
|
|
421
|
+
if (tasks.verification && !/^[a-f0-9]{40}$/u.test(options.label || ""))
|
|
422
|
+
throw new Error(
|
|
423
|
+
"frozen suite requires --label <40-character tested CLI source SHA>; this differs from the task project checkout SHA",
|
|
424
|
+
);
|
|
425
|
+
if (tasks.verification)
|
|
426
|
+
tasks.verification.executionSource = {
|
|
427
|
+
declaredCommit: options.label,
|
|
428
|
+
identityVerified: false,
|
|
429
|
+
declarationOnly: true,
|
|
430
|
+
entryDigest: evalDigest(fs.readFileSync(BIN)),
|
|
431
|
+
};
|
|
432
|
+
if (tasks.verification && !options.evidenceDir)
|
|
433
|
+
throw new Error(
|
|
434
|
+
"frozen suite requires --evidence-dir to retain raw execution material",
|
|
435
|
+
);
|
|
436
|
+
if (tasks.verification && options.comparisonContext)
|
|
437
|
+
throw new Error(
|
|
438
|
+
"frozen suite comparison is bound by its plan; --comparison-context cannot override it",
|
|
439
|
+
);
|
|
440
|
+
comparison =
|
|
441
|
+
tasks.verification?.comparison ||
|
|
442
|
+
createEvalComparison({
|
|
443
|
+
suite: options.suite,
|
|
444
|
+
corpusDigest: evalDigest(
|
|
445
|
+
fs.readFileSync(new URL("../lib/eval/tasks.js", import.meta.url)),
|
|
446
|
+
),
|
|
447
|
+
provider: options.provider,
|
|
448
|
+
model: options.model,
|
|
449
|
+
context: options.comparisonContext
|
|
450
|
+
? readComparisonContext(options.comparisonContext, {
|
|
451
|
+
provider: options.provider,
|
|
452
|
+
model: options.model,
|
|
453
|
+
})
|
|
454
|
+
: null,
|
|
455
|
+
});
|
|
399
456
|
} catch (err) {
|
|
400
457
|
log.error ? log.error(err.message) : console.error(err.message);
|
|
401
458
|
process.exitCode = 1;
|
|
@@ -406,6 +463,12 @@ export function registerEvalCommand(program, { logger } = {}) {
|
|
|
406
463
|
: makeHeadlessRunAgent({
|
|
407
464
|
model: options.model,
|
|
408
465
|
provider: options.provider,
|
|
466
|
+
...(tasks.verification
|
|
467
|
+
? {
|
|
468
|
+
ephemeral: true,
|
|
469
|
+
sandboxMode: tasks.verification.requiredSandboxMode,
|
|
470
|
+
}
|
|
471
|
+
: {}),
|
|
409
472
|
});
|
|
410
473
|
|
|
411
474
|
// OTel-shaped telemetry for the run (per-task span + failure class).
|
|
@@ -414,7 +477,7 @@ export function registerEvalCommand(program, { logger } = {}) {
|
|
|
414
477
|
const summary = await _deps.runEvalSuite(tasks, {
|
|
415
478
|
runAgent,
|
|
416
479
|
recorder,
|
|
417
|
-
keepWorkspaces: options.keep === true,
|
|
480
|
+
keepWorkspaces: options.keep === true || Boolean(tasks.verification),
|
|
418
481
|
onResult: options.json
|
|
419
482
|
? undefined
|
|
420
483
|
: (r) =>
|
|
@@ -432,6 +495,40 @@ export function registerEvalCommand(program, { logger } = {}) {
|
|
|
432
495
|
dryRun: options.dryRun === true,
|
|
433
496
|
label: options.label || null,
|
|
434
497
|
});
|
|
498
|
+
if (tasks.verification) {
|
|
499
|
+
try {
|
|
500
|
+
record.verification = {
|
|
501
|
+
...persistVerify01Receipts(
|
|
502
|
+
tasks.verification,
|
|
503
|
+
options.evidenceDir,
|
|
504
|
+
record.runId,
|
|
505
|
+
),
|
|
506
|
+
executionStatus: options.dryRun ? "DRY_RUN" : "ATTEMPTED",
|
|
507
|
+
// Execution material for the existing collector, not an observation
|
|
508
|
+
// or an independent acceptance of the frozen population.
|
|
509
|
+
observationsCreated: false,
|
|
510
|
+
collectionReady:
|
|
511
|
+
options.dryRun !== true &&
|
|
512
|
+
record.results.every(
|
|
513
|
+
(result) =>
|
|
514
|
+
result.executionEvidence?.terminalVerified === true &&
|
|
515
|
+
result.executionEvidence.protocol ===
|
|
516
|
+
EVAL_EXECUTION_PROTOCOL &&
|
|
517
|
+
result.executionEvidence.observedFallback === false &&
|
|
518
|
+
Number.isFinite(result.totalCostUsd) &&
|
|
519
|
+
result.totalCostUsd >= 0 &&
|
|
520
|
+
Array.isArray(result.unrelatedChanges) &&
|
|
521
|
+
result.unrelatedChanges.length === 0,
|
|
522
|
+
),
|
|
523
|
+
};
|
|
524
|
+
} catch (error) {
|
|
525
|
+
(log.error || console.error)(
|
|
526
|
+
`frozen evidence persistence failed: ${error.message}`,
|
|
527
|
+
);
|
|
528
|
+
process.exitCode = 1;
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
435
532
|
|
|
436
533
|
if (options.otlp) {
|
|
437
534
|
try {
|
|
@@ -445,8 +542,9 @@ export function registerEvalCommand(program, { logger } = {}) {
|
|
|
445
542
|
}
|
|
446
543
|
}
|
|
447
544
|
try {
|
|
448
|
-
const { exportTelemetryRecorder } =
|
|
449
|
-
|
|
545
|
+
const { exportTelemetryRecorder } = await import(
|
|
546
|
+
"../lib/observability/index.js"
|
|
547
|
+
);
|
|
450
548
|
exportTelemetryRecorder(recorder);
|
|
451
549
|
} catch {
|
|
452
550
|
// Collector export is best-effort and never changes evaluation gates.
|
|
@@ -485,6 +583,8 @@ export function registerEvalCommand(program, { logger } = {}) {
|
|
|
485
583
|
// Non-zero exit when not every task passed — usable as a CI gate.
|
|
486
584
|
if (summary.total === 0 || summary.passed < summary.total)
|
|
487
585
|
process.exitCode = 1;
|
|
586
|
+
else if (record.verification && !record.verification.collectionReady)
|
|
587
|
+
process.exitCode = 2;
|
|
488
588
|
});
|
|
489
589
|
return program;
|
|
490
590
|
}
|
package/src/commands/memory.js
CHANGED
|
@@ -166,27 +166,40 @@ export function registerMemoryCommand(program) {
|
|
|
166
166
|
.description("Show memory entries")
|
|
167
167
|
.option("-n, --limit <n>", "Max entries", "20")
|
|
168
168
|
.option("--category <cat>", "Filter by category")
|
|
169
|
+
.option("--page", "Return a page with a next-page cursor")
|
|
170
|
+
.option("--cursor <cursor>", "Continue a page using the same filters")
|
|
169
171
|
.option("--json", "Output as JSON")
|
|
170
172
|
.action(async (options) => {
|
|
171
173
|
try {
|
|
172
174
|
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
173
175
|
const service = await resolveCanonicalMemory(ctx);
|
|
174
176
|
if (!ctx.db && !service.decision.canonical) {
|
|
175
|
-
|
|
176
|
-
process.exit(1);
|
|
177
|
+
throw new Error("Database not available");
|
|
177
178
|
}
|
|
178
|
-
const
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
179
|
+
const paged = Boolean(options.page || options.cursor !== undefined);
|
|
180
|
+
if (paged && !service.decision.canonical) {
|
|
181
|
+
throw new Error(
|
|
182
|
+
"Paged memory listing requires canonical memory mode",
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
if (options.cursor !== undefined && !options.cursor.trim()) {
|
|
186
|
+
throw new Error("Pagination cursor must not be empty");
|
|
187
|
+
}
|
|
188
|
+
const query = {
|
|
189
|
+
limit: Math.max(1, parseInt(options.limit) || 20),
|
|
190
|
+
category: options.category,
|
|
191
|
+
};
|
|
192
|
+
const page = paged
|
|
193
|
+
? await service.listPage({ ...query, cursor: options.cursor })
|
|
194
|
+
: null;
|
|
195
|
+
const entries = page
|
|
196
|
+
? page.entries
|
|
197
|
+
: service.decision.canonical
|
|
198
|
+
? await service.list(query)
|
|
199
|
+
: listMemory(ctx.db.getDatabase(), query);
|
|
187
200
|
|
|
188
201
|
if (options.json) {
|
|
189
|
-
console.log(JSON.stringify(entries, null, 2));
|
|
202
|
+
console.log(JSON.stringify(page || entries, null, 2));
|
|
190
203
|
} else if (entries.length === 0) {
|
|
191
204
|
logger.info("No memory entries. Use 'memory add' to create one.");
|
|
192
205
|
} else {
|
|
@@ -206,11 +219,17 @@ export function registerMemoryCommand(program) {
|
|
|
206
219
|
logger.log(` ${chalk.gray(e.created_at)}`);
|
|
207
220
|
}
|
|
208
221
|
}
|
|
209
|
-
|
|
210
|
-
|
|
222
|
+
if (!options.json && page?.nextCursor) {
|
|
223
|
+
logger.log(`Next page cursor: ${page.nextCursor}`);
|
|
224
|
+
logger.log(
|
|
225
|
+
"Use 'memory show --cursor <cursor>' with the same category and limit.",
|
|
226
|
+
);
|
|
227
|
+
}
|
|
211
228
|
} catch (err) {
|
|
212
229
|
logger.error(`Failed: ${err.message}`);
|
|
213
|
-
process.
|
|
230
|
+
process.exitCode = 1;
|
|
231
|
+
} finally {
|
|
232
|
+
await shutdown();
|
|
214
233
|
}
|
|
215
234
|
});
|
|
216
235
|
|
package/src/commands/sandbox.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import chalk from "chalk";
|
|
7
7
|
import { intArg } from "../lib/cli-arg.js";
|
|
8
|
+
import { describeExecutionSupport } from "../lib/execution-support.js";
|
|
8
9
|
import ora from "ora";
|
|
9
10
|
import { logger } from "../lib/logger.js";
|
|
10
11
|
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
@@ -132,6 +133,7 @@ export function registerSandboxCommand(program, dependencies = {}) {
|
|
|
132
133
|
availability,
|
|
133
134
|
host: dependencies.host,
|
|
134
135
|
});
|
|
136
|
+
report.support = describeExecutionSupport({ capabilityReport: report });
|
|
135
137
|
|
|
136
138
|
if (options.json) {
|
|
137
139
|
console.log(JSON.stringify(report, null, 2));
|
|
@@ -144,6 +146,13 @@ export function registerSandboxCommand(program, dependencies = {}) {
|
|
|
144
146
|
` Backend: ${report.backend.engine || "none"} (${report.backend.availabilityChecked ? (report.backend.available ? "available" : "unavailable") : "not probed"})`,
|
|
145
147
|
);
|
|
146
148
|
logger.log(` Status: ${report.status}`);
|
|
149
|
+
logger.log(
|
|
150
|
+
` I/O: ${report.support.io.stdin} stdin; captured stdout/stderr`,
|
|
151
|
+
);
|
|
152
|
+
logger.log(` Permission source: ${report.support.permissionSource}`);
|
|
153
|
+
logger.log(
|
|
154
|
+
` Persistent network revocation: ${report.support.persistentNetworkRevocation.status} (${report.support.persistentNetworkRevocation.reason || "configured"})`,
|
|
155
|
+
);
|
|
147
156
|
logger.log(
|
|
148
157
|
` Execution observed: ${report.execution.observed ? "yes" : "no"}`,
|
|
149
158
|
);
|
package/src/data/changelog.json
CHANGED
|
@@ -1,6 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"source": "CHANGELOG.md",
|
|
3
3
|
"releases": [
|
|
4
|
+
{
|
|
5
|
+
"productVersion": null,
|
|
6
|
+
"cliVersion": "0.166.87",
|
|
7
|
+
"cliVersions": ["0.166.87"],
|
|
8
|
+
"date": null,
|
|
9
|
+
"title": "",
|
|
10
|
+
"sections": [
|
|
11
|
+
{
|
|
12
|
+
"heading": "Added - cc CLI 0.166.87: October model contracts and indexed memory queries",
|
|
13
|
+
"body": "- Add exact GPT-6.1 Sol and Claude Sonnet 5.5 profiles, model-specific cache\n pricing, Responses reasoning/output validation and reviewed catalog drift checks.\n- Push memory list filters and limits into authority-bound query indexes, retain\n stable snapshot pagination and rebuild corrupted derived indexes from authority.\n Upgraded index descriptors require compatible readers; older readers fail closed.\n- Add a reviewed frozen CLI evaluation entry with isolated project snapshots,\n independent acceptance scripts and raw execution evidence. Real provider/IDE\n evaluation and billing acceptance remain separate from fixture validation.\n- Support explicit cooperative Linux cgroup2 ownership cleanup after supervisor\n loss, preserving quarantine when kernel identity or durable settlement is unknown.\n- Verify Codex 0.160.0 native protocol and pinned MCP reference-server recovery\n without expanding the production external-agent admission allowlist.\n- Pair VS Code `0.37.132` and JetBrains `0.4.150` with CLI `0.166.87` for live\n capability diagnostics, strict CLI identity and bounded slow-start draft handling."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"productVersion": null,
|
|
19
|
+
"cliVersion": "0.166.86",
|
|
20
|
+
"cliVersions": ["0.166.86"],
|
|
21
|
+
"date": null,
|
|
22
|
+
"title": "",
|
|
23
|
+
"sections": [
|
|
24
|
+
{
|
|
25
|
+
"heading": "Added - cc CLI 0.166.86: segmented memory and controlled permission authority",
|
|
26
|
+
"body": "- Store canonical Context/Memory records, audit events and reconciliations in\n bounded immutable buckets committed through one atomic manifest; migrate v1\n under the existing authority lock. Shadow mode remains read-only.\n- Keep per-file limits, bounded aggregate capacity and explicit post-commit\n failure reporting. Full queries still scan; this is not an indexed-query SLO.\n- Add an explicit cooperative Linux host for durable settings/scoped permission\n authority across processes and Workers, with bound cleanup acknowledgements.\n Default CLI/IDE activation and Windows/macOS durable support are unchanged.\n- Pair VS Code `0.37.131` bounded image decoding and JetBrains `0.4.149` bounded\n file snapshots only after complete exact-commit gates and public CLI verification."
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
4
30
|
{
|
|
5
31
|
"productVersion": null,
|
|
6
32
|
"cliVersion": "0.166.85",
|
|
@@ -7,7 +7,11 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import crypto from "node:crypto";
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
PRICE_TABLE,
|
|
12
|
+
priceRollup,
|
|
13
|
+
normalizePricingTerms,
|
|
14
|
+
} from "./llm-pricing.js";
|
|
11
15
|
import {
|
|
12
16
|
projectUsagePricingContext,
|
|
13
17
|
mergeUsagePricingBucket,
|
|
@@ -267,50 +271,7 @@ function normalizePricingTable(table = PRICE_TABLE) {
|
|
|
267
271
|
result.exact = entry.exact;
|
|
268
272
|
}
|
|
269
273
|
if (Object.hasOwn(entry, "terms")) {
|
|
270
|
-
|
|
271
|
-
const nonNegative = (value) => {
|
|
272
|
-
if (typeof value !== "number" || !Number.isFinite(value) || value < 0)
|
|
273
|
-
throw new Error("invalid pricing multiplier");
|
|
274
|
-
return value;
|
|
275
|
-
};
|
|
276
|
-
assertKnownOwnKeys(
|
|
277
|
-
terms,
|
|
278
|
-
new Set([
|
|
279
|
-
"cacheReadMultiplier",
|
|
280
|
-
"cacheWriteMultiplier",
|
|
281
|
-
"longContext",
|
|
282
|
-
"serviceMultipliers",
|
|
283
|
-
]),
|
|
284
|
-
"pricing terms",
|
|
285
|
-
);
|
|
286
|
-
assertKnownOwnKeys(
|
|
287
|
-
terms.longContext,
|
|
288
|
-
new Set(["threshold", "inputMultiplier", "outputMultiplier"]),
|
|
289
|
-
"pricing long context",
|
|
290
|
-
);
|
|
291
|
-
const threshold = nonNegative(terms.longContext.threshold);
|
|
292
|
-
if (!Number.isSafeInteger(threshold))
|
|
293
|
-
throw new Error("invalid pricing threshold");
|
|
294
|
-
assertKnownOwnKeys(
|
|
295
|
-
terms.serviceMultipliers,
|
|
296
|
-
new Set(["standard", "default", "auto", "batch", "flex", "fast"]),
|
|
297
|
-
"pricing service multipliers",
|
|
298
|
-
);
|
|
299
|
-
result.terms = {
|
|
300
|
-
cacheReadMultiplier: nonNegative(terms.cacheReadMultiplier),
|
|
301
|
-
cacheWriteMultiplier: nonNegative(terms.cacheWriteMultiplier),
|
|
302
|
-
longContext: {
|
|
303
|
-
threshold,
|
|
304
|
-
inputMultiplier: nonNegative(terms.longContext.inputMultiplier),
|
|
305
|
-
outputMultiplier: nonNegative(terms.longContext.outputMultiplier),
|
|
306
|
-
},
|
|
307
|
-
serviceMultipliers: Object.fromEntries(
|
|
308
|
-
Object.entries(terms.serviceMultipliers).map(([key, value]) => [
|
|
309
|
-
key,
|
|
310
|
-
nonNegative(value),
|
|
311
|
-
]),
|
|
312
|
-
),
|
|
313
|
-
};
|
|
274
|
+
result.terms = normalizePricingTerms(entry.terms);
|
|
314
275
|
}
|
|
315
276
|
return result;
|
|
316
277
|
});
|
|
@@ -21,6 +21,16 @@ import {
|
|
|
21
21
|
} from "@chainlesschain/context-memory-kernel";
|
|
22
22
|
import { withFileLock } from "../with-file-lock.js";
|
|
23
23
|
import { getHomeDir } from "../paths.js";
|
|
24
|
+
import { resolve } from "node:path";
|
|
25
|
+
import {
|
|
26
|
+
compareMemoryRows,
|
|
27
|
+
decodeListCursor,
|
|
28
|
+
encodeListCursor,
|
|
29
|
+
listCursorBinding,
|
|
30
|
+
matchesListQuery,
|
|
31
|
+
normalizeListQuery,
|
|
32
|
+
pageLimit,
|
|
33
|
+
} from "./memory-query-index.js";
|
|
24
34
|
|
|
25
35
|
const STORE_SCHEMA = "chainlesschain.cli-context-memory-store/v1";
|
|
26
36
|
const DEFAULT_MAX_STORE_BYTES = 64 * 1024 * 1024;
|
|
@@ -139,7 +149,7 @@ function advanceRevision(state) {
|
|
|
139
149
|
state.storeRevision += 1;
|
|
140
150
|
}
|
|
141
151
|
|
|
142
|
-
function readBoundedState(filePath, maxStoreBytes) {
|
|
152
|
+
function readBoundedState(filePath, maxStoreBytes, rejectHardLinks = false) {
|
|
143
153
|
const descriptor = openSync(
|
|
144
154
|
filePath,
|
|
145
155
|
constants.O_RDONLY |
|
|
@@ -148,7 +158,7 @@ function readBoundedState(filePath, maxStoreBytes) {
|
|
|
148
158
|
);
|
|
149
159
|
try {
|
|
150
160
|
const stat = fstatSync(descriptor);
|
|
151
|
-
if (!stat.isFile()) {
|
|
161
|
+
if (!stat.isFile() || (rejectHardLinks && stat.nlink !== 1)) {
|
|
152
162
|
throw corruptStore(filePath, "authority path is not a regular file");
|
|
153
163
|
}
|
|
154
164
|
if (stat.size > maxStoreBytes) {
|
|
@@ -292,19 +302,48 @@ export class DurableJsonMemoryPort {
|
|
|
292
302
|
);
|
|
293
303
|
}
|
|
294
304
|
|
|
295
|
-
async listRecords(
|
|
305
|
+
async listRecords(options = {}) {
|
|
306
|
+
const query = normalizeListQuery(options);
|
|
296
307
|
const records = await this.query();
|
|
297
308
|
return records
|
|
298
|
-
.filter(
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
309
|
+
.filter((record) => matchesListQuery(record, query))
|
|
310
|
+
.sort(compareMemoryRows)
|
|
311
|
+
.slice(
|
|
312
|
+
0,
|
|
313
|
+
options.limit == null
|
|
314
|
+
? undefined
|
|
315
|
+
: Math.max(1, Number(options.limit) || 20),
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
async listPage(options = {}) {
|
|
320
|
+
const query = normalizeListQuery(options);
|
|
321
|
+
const count = pageLimit(options.limit);
|
|
322
|
+
return this._locked(() => {
|
|
323
|
+
const state = this._readUnlocked();
|
|
324
|
+
const binding = listCursorBinding(
|
|
325
|
+
resolve(this.filePath),
|
|
326
|
+
state.digest,
|
|
327
|
+
query,
|
|
307
328
|
);
|
|
329
|
+
const after = decodeListCursor(options.cursor, binding);
|
|
330
|
+
const matches = Object.values(state.records)
|
|
331
|
+
.filter(
|
|
332
|
+
(record) =>
|
|
333
|
+
matchesListQuery(record, query) &&
|
|
334
|
+
(!after || compareMemoryRows(record, after) > 0),
|
|
335
|
+
)
|
|
336
|
+
.sort(compareMemoryRows);
|
|
337
|
+
const records = matches.slice(0, count);
|
|
338
|
+
return {
|
|
339
|
+
records,
|
|
340
|
+
storeRevision: state.storeRevision,
|
|
341
|
+
nextCursor:
|
|
342
|
+
matches.length > count
|
|
343
|
+
? encodeListCursor(binding, records.at(-1))
|
|
344
|
+
: null,
|
|
345
|
+
};
|
|
346
|
+
});
|
|
308
347
|
}
|
|
309
348
|
|
|
310
349
|
async commit({ record, event, reconciliation }, expectedRevision = 0) {
|
|
@@ -364,6 +403,9 @@ export class DurableJsonMemoryPort {
|
|
|
364
403
|
}
|
|
365
404
|
|
|
366
405
|
export {
|
|
406
|
+
corruptStore,
|
|
407
|
+
readBoundedState,
|
|
408
|
+
syncDirectory,
|
|
367
409
|
DEFAULT_MAX_EVENTS,
|
|
368
410
|
DEFAULT_MAX_STORE_BYTES,
|
|
369
411
|
STORE_SCHEMA,
|