chainlesschain 0.166.14 → 0.166.16
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/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-C8SyFhOo.js → AIOps-CTxa2Wbq.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Dup5gFK0.js → ActionButton-DHrQyYhy.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-8FyOWA7V.js → Analytics-DQiUqcNl.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DBzdU9dg.js → AppLayout-_Iz4r6wt.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-C_0Z8gNy.js → Artifacts-BNs63YHo.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Cf2a-58m.js → Audit-BgHIqRLn.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-M7w-2zgB.js → BackgroundAgents-DUQ5axBB.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CCTHQXoL.js → Backup-CJ51E9Vw.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-DjXpeFwJ.js → BaseInput-o-5toA_R.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-cAvchsJU.js → Chat-Cu7a-x1L.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DvEvxlZv.js → ChatBubbleRenderer-BUyYkAXr.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DKs6qvOn.js → Checkbox-DwdmZ71L.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DlkA7b9X.js → Codegen-BrH2eYiP.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CkfdKhyJ.js → Col-BVJQEP2j.js} +1 -1
- package/src/assets/web-panel/assets/{Community-iNXMHzj6.js → Community-FGO3vZPq.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DQxPEd09.js → Compact-DYGAFVnT.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CSKvMCjs.js → Compliance-CRvc8Bdt.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CkWqazpD.js → Cowork-D6Ah2m7A.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-k6W8IzhB.js → Cron-AXbU2ifR.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-C8MS1OuY.js → Crosschain-C5DXgEFd.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DJuCcgiQ.js → DID-Bxh9QV9v.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-LeThKzp3.js → Dashboard-B-ZHEta-.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BvxwgpE4.js → Dropdown-66Ik1jqa.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-n3e_a1M3.js → EmailListRenderer-CCWk1BIM.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-509W6W6v.js → FamilyGuardDashboard--9faIULK.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-xgZReQm0.js → Federation-CejW9CgX.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-jZOhKcQx.js → FormItemContext-acHgcXki.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-Jo0ULzHv.js → GenericCardRenderer-D2ghd_K4.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BsRcyWQP.js → Git-BOe1YJrV.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-JlpMYTAk.js → Governance-BjgzJsof.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CUEz872-.js → Inference-CXCD5rnP.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DgrvvEDU.js → KnowledgeGraph-CHA8QgJT.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-Df-KY4U3.js → Logs-DORPMcL6.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-CPPHz01z.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-kPZDTOeI.js → Marketplace-BCFlo1Yx.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CRRzPqNX.js → McpTools-Dl_uZAKh.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-D6pNSkg9.js → Memory-DupHamwz.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-g-pvtwRC.js → MobileBridge-BRSMPJxW.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-Bzayfrfe.js → MobileProjects-BHpuzsDl.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-B7S3W-XL.js → Mtc-Ch0jOQfZ.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-B8OMEWVb.js → MtcAudit-qzwQrDi7.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-CowRp7GH.js → Multisig-B5wHzUcm.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BkQNyi4c.js → NLProgramming-Hy9uAiA0.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Cm7gtkKz.js → Notes-DkuchMC7.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-CbPTVh9m.js → NotificationSettings-CYZhD7Pi.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Dswi26mJ.js → OrderTableRenderer-DKOoqajt.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BkjQ9yy7.js → Organization-D9AXn6j8.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DmRFXP7Y.js → Overflow-Bg15J6hX.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DQE1toAu.js → P2P--B54HoQn.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-Cz9Kk2Nb.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-xSjfOaiU.js → Permissions-DHx38eS1.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-B9ICLqVP.js → PersonalDataHub-Dw8i2hAs.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-CUNwyN9E.js → Pipeline-B2o6Ur2G.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-SOoCricX.js → Privacy-8g-h2fnu.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CSaFul0F.js → ProjectInit-DuVTcINx.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CueiB_oe.js → ProjectSettings-C8njvdZX.js} +2 -2
- package/src/assets/web-panel/assets/Projects-Ca9BAfu7.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CTqf_31h.js → Providers-wFqgod_W.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-C8ZP31E9.js → QrScannerModal-9NCXrpmA.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CPgn4713.js → QuickAsk-WUTNvFkY.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-8_e0zw0i.js → Recommend-xT4nYmju.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-iT7lbGqw.js → RemoteSession-fak1PBGC.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-B4q9SUOz.js → Reputation-D1AkQvD-.js} +1 -1
- package/src/assets/web-panel/assets/{Row-CA_nASyL.js → Row-DVfm6xGt.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Cwb0E3yv.js → RssFeed-BDunoLSE.js} +3 -3
- package/src/assets/web-panel/assets/{Search-D9iVsOxJ.js → Search-OPycRoU3.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DPLbYchG.js → Security-C8-Fm3Dt.js} +3 -3
- package/src/assets/web-panel/assets/{Services-DGMVL_LF.js → Services-qM_sMpMl.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-B_6kym0D.js → Skeleton-D3HBJjVF.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-Ds6r0dXB.js → Skills-jr67X-tP.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BLHAbBhb.js → Sla-CS3ggyCg.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CZuddd14.js → SpeechSettings-CTOCYxOi.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CdBq7oSl.js → SyncSettings-D3s3cLT5.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DfT60Nyl.js → Tasks-CdfoJ25m.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-RLfsKy2V.js → Templates-Drb4AI8X.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-Cw8xCNLE.js → Tenant-DzwR3Qkz.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BOUkNu4f.js → Terminal-D-ESq7xp.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CgGZWaRm.js → TimelineRenderer-BK-AUuws.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CpwjVyir.js → Tokens-xGTouuNp.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DL21H-eb.js → Trigger-BvZj-v2H.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-B3ffFclW.js → Trust-BLC9CGmc.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CkBeb5aI.js → UkeySign-BSuCXpmE.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-U2iVaE3r.js → VideoEditing-DT3A-_Ql.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CQk2wzYd.js → Wallet-c1OXao85.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DYIuIYzT.js → WebAuthn-CuA-F7KJ.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-tg1c2mZQ.js → WorkflowEditor-MANZrf82.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CtL61spq.js → chat-D4Y4Ey0O.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DKpbeo8s.js → colors-DDH06hKO.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-gPZsrswt.js → compact-item-Cym756Xj.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CfHlwzVr.js → createContext-By4Nb1k-.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-KO3pAGeO.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-MV47g_6X.js → hasIn-Ch7OY258.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMMvlLp9.js → index-6-2eYBXr.js} +1 -1
- package/src/assets/web-panel/assets/{index-DsH-i_3d.js → index-6CpOV3Pn.js} +1 -1
- package/src/assets/web-panel/assets/{index-CB1HnbNK.js → index-ArMrnx0v.js} +1 -1
- package/src/assets/web-panel/assets/{index-DU4rZpiK.js → index-B51otVoZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRv_uMLV.js → index-BBBUn5v7.js} +1 -1
- package/src/assets/web-panel/assets/{index-srBc9U_s.js → index-BFydNU6a.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnZ_zS1M.js → index-BIrRX-ra.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGtEBodr.js → index-BZB9q-Lp.js} +1 -1
- package/src/assets/web-panel/assets/index-Bh4Rgkg2.js +1 -0
- package/src/assets/web-panel/assets/{index-BjlPD7GO.js → index-Bo20BfdS.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_B9LiKs.js → index-CF3Lhyns.js} +1 -1
- package/src/assets/web-panel/assets/{index-Rb7CRMw9.js → index-CGsvEbbq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIeJmlAA.js → index-CJPks33Y.js} +1 -1
- package/src/assets/web-panel/assets/{index-xUlgG0Xe.js → index-CT-3FYwd.js} +1 -1
- package/src/assets/web-panel/assets/{index-6G0ETFTW.js → index-CUSUzaB8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CzfxTSPW.js → index-CV1UC4zo.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmPJpLoD.js → index-CV8qXTvb.js} +1 -1
- package/src/assets/web-panel/assets/{index-fYcS7NS0.js → index-CZn6dmZe.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cjv0kKCU.js → index-CjNUTBwe.js} +1 -1
- package/src/assets/web-panel/assets/{index-Df9sWKpl.js → index-CpudmDhf.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9RF4ieu.js → index-CykROEJA.js} +1 -1
- package/src/assets/web-panel/assets/{index-Zvkt9xqi.js → index-D5sADPGY.js} +1 -1
- package/src/assets/web-panel/assets/{index-yxxXlqBA.js → index-D9le0-dc.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBw52sEl.js → index-DAkk1M7x.js} +1 -1
- package/src/assets/web-panel/assets/{index-ExAGPAnX.js → index-DNEJzc0r.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQp5M0s1.js → index-DNlxihs8.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ddcpj1El.js → index-DiewptTL.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOyGUuBE.js → index-DjwgJ5Jd.js} +1 -1
- package/src/assets/web-panel/assets/index-Dox_coTY.js +1 -0
- package/src/assets/web-panel/assets/{index-CmM9jqwe.js → index-DtGValNi.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfLyHCWi.js → index-DvnywwUj.js} +1 -1
- package/src/assets/web-panel/assets/{index-BN-wxSQ8.js → index-OU8DZ9BL.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1XB5-t5.js → index-XGeQMvWK.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4lF-f_z.js → index-ZY2Qs_Sn.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9gtY4nG.js → index-jx7kr6mB.js} +3 -3
- package/src/assets/web-panel/assets/{index-C6nC_DyY.js → index-mL3nOcH6.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dd19vRwy.js → index-oBsfUbyH.js} +1 -1
- package/src/assets/web-panel/assets/{index-bSFrAszw.js → index-q-s04OKn.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_Pl1GnW.js → index-tZ5BUdad.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BeOZoSZ4.js → initDefaultProps-DGcX9iPP.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BXE8VMKx.js → motion-2SeL1D8A.js} +1 -1
- package/src/assets/web-panel/assets/{move-I9sdvPGX.js → move-3cYbQCpS.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-d25zrJd0.js → mtc-parser-IDdxfw0z.js} +1 -1
- package/src/assets/web-panel/assets/{omit-D71V_T4e.js → omit-BNswdKO6.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BNZKpIAR.js → pickAttrs-BwCnem2I.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-jOcgxTTz.js → placementArrow-B9PtZ5rq.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-pta_O8AU.js → responsiveObserve-CPB6iSzV.js} +1 -1
- package/src/assets/web-panel/assets/{slide-Dlq6om7z.js → slide-DZgyblZa.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BnkO_yRv.js → statusUtils-D82IBdsx.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-p8NfWmcG.js → styleChecker-qSHtosM-.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-KcjZZ5U7.js → useFlexGapSupport-CmWO7h0I.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-gqonDMWB.js → useFs-yLrs_ub4.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-jIIfE4go.js → usePersonalDataHub-CJ1VW6rh.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Dyo7fBrM.js → vnode-CzY_moQ4.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-6l8BMg9W.js → zoom-DAa7rEY5.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +62 -11
- package/src/commands/learning.js +71 -1
- package/src/commands/team.js +100 -3
- package/src/data/changelog.json +29 -3
- package/src/harness/worktree-isolator.js +74 -9
- package/src/lib/agent-team/task-lease.js +12 -1
- package/src/lib/agent-team/team-graph-runtime-adapter.js +6 -0
- package/src/lib/agent-team/team-runner.js +4 -0
- package/src/lib/agent-team/team-worktree.js +4 -0
- package/src/lib/capability-manifest.js +212 -1
- package/src/lib/evolution/evolution-artifact-ports.js +3277 -0
- package/src/lib/evolution/evolution-eval-gate.js +6442 -0
- package/src/lib/evolution/evolution-evidence-projector.js +3786 -0
- package/src/lib/evolution/evolution-ledger-ports.js +2689 -0
- package/src/lib/evolution/evolution-ledger.js +4280 -0
- package/src/lib/evolution/skill-candidate-registry.js +2258 -0
- package/src/lib/evolution/skill-execution-manifest.js +942 -0
- package/src/lib/evolution/skill-mutation-authority.js +1677 -0
- package/src/lib/evolution/skill-promotion-controller.js +506 -0
- package/src/lib/evolution/skill-release-registry.js +3277 -0
- package/src/lib/evolution/skill-target-matrix-eval.js +3233 -0
- package/src/lib/evolution/skill-writer-inventory-manifest.js +998 -0
- package/src/lib/evolution/skill-writer-inventory-validator.js +816 -0
- package/src/lib/formal-quality-eval-runtime.js +192 -0
- package/src/lib/graph-kernel/cutover-contract.js +7 -0
- package/src/lib/graph-kernel/cutover-ledger.js +8 -7
- package/src/lib/graph-kernel/evidence-digest.js +47 -0
- package/src/lib/graph-kernel/graph-runtime-surfaces.json +8 -1
- package/src/lib/graph-kernel/production-cutover-evidence.js +342 -15
- package/src/lib/graph-kernel/production-source-evidence.js +1599 -0
- package/src/lib/graph-kernel/retirement-evidence.js +15 -5
- package/src/lib/graph-kernel/runtime-surface-manifest.js +67 -2
- package/src/lib/headless-manifest.js +3 -1
- package/src/lib/learning/skill-improver.js +311 -43
- package/src/lib/learning/skill-synthesizer.js +236 -16
- package/src/lib/process-execution-broker/index.js +32 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +5 -4
- package/src/lib/secure-fs.js +45 -2
- package/src/runtime/agent-core.js +17 -5
- package/src/runtime/headless-runner.js +16 -9
- package/src/assets/web-panel/assets/MarkdownRenderer-BEPDcSwz.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-BujyoDRG.js +0 -7
- package/src/assets/web-panel/assets/Projects-BOeXvU7y.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DdqnMhzi.js +0 -1
- package/src/assets/web-panel/assets/index-BcK8o4ke.js +0 -1
- package/src/assets/web-panel/assets/index-DvbAjyYI.js +0 -1
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
|
|
6
|
+
export const FORMAL_QUALITY_HERMETIC_ENV = "CC_FORMAL_QUALITY_EVAL_HERMETIC";
|
|
7
|
+
export const FORMAL_QUALITY_PROVIDER_ENV = "CC_FORMAL_QUALITY_EVAL_PROVIDER";
|
|
8
|
+
export const FORMAL_QUALITY_ISOLATION_ROOT_ENV =
|
|
9
|
+
"CC_FORMAL_QUALITY_EVAL_ISOLATION_ROOT";
|
|
10
|
+
export const FORMAL_QUALITY_ALLOWED_FILES_ENV =
|
|
11
|
+
"CC_FORMAL_QUALITY_EVAL_ALLOWED_FILES";
|
|
12
|
+
export const FORMAL_QUALITY_FILE_TOOLS = Object.freeze([
|
|
13
|
+
"read_file",
|
|
14
|
+
"search_files",
|
|
15
|
+
"list_dir",
|
|
16
|
+
"write_file",
|
|
17
|
+
"edit_file",
|
|
18
|
+
"edit_file_hashed",
|
|
19
|
+
]);
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The real-model quality harness opts into the already-supported hermetic
|
|
23
|
+
* headless boundary through a launcher-only environment marker. Keep the
|
|
24
|
+
* check exact so inherited or malformed values never change normal CLI runs.
|
|
25
|
+
*/
|
|
26
|
+
export function isFormalQualityHermeticRuntime(environment = process.env) {
|
|
27
|
+
if (environment?.[FORMAL_QUALITY_HERMETIC_ENV] !== "1") return false;
|
|
28
|
+
const configuredHome = String(environment?.CHAINLESSCHAIN_HOME || "").trim();
|
|
29
|
+
if (!configuredHome) return false;
|
|
30
|
+
const temporaryRoot = path.resolve(os.tmpdir());
|
|
31
|
+
const resolvedHome = path.resolve(configuredHome);
|
|
32
|
+
const relation = path.relative(temporaryRoot, resolvedHome);
|
|
33
|
+
return Boolean(
|
|
34
|
+
relation &&
|
|
35
|
+
relation !== ".." &&
|
|
36
|
+
!relation.startsWith(`..${path.sep}`) &&
|
|
37
|
+
!path.isAbsolute(relation),
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function formalQualityIsolationRoot(environment) {
|
|
42
|
+
if (!isFormalQualityHermeticRuntime(environment)) return null;
|
|
43
|
+
const configuredRoot = String(
|
|
44
|
+
environment?.[FORMAL_QUALITY_ISOLATION_ROOT_ENV] || "",
|
|
45
|
+
).trim();
|
|
46
|
+
if (!configuredRoot) {
|
|
47
|
+
throw new Error("formal quality isolation root is missing");
|
|
48
|
+
}
|
|
49
|
+
const temporaryRoot = path.resolve(os.tmpdir());
|
|
50
|
+
const resolvedRoot = path.resolve(configuredRoot);
|
|
51
|
+
const relation = path.relative(temporaryRoot, resolvedRoot);
|
|
52
|
+
const configuredHome = path.resolve(String(environment.CHAINLESSCHAIN_HOME));
|
|
53
|
+
const homeRelation = path.relative(resolvedRoot, configuredHome);
|
|
54
|
+
if (
|
|
55
|
+
!relation ||
|
|
56
|
+
relation === ".." ||
|
|
57
|
+
relation.startsWith(`..${path.sep}`) ||
|
|
58
|
+
path.isAbsolute(relation) ||
|
|
59
|
+
!homeRelation ||
|
|
60
|
+
homeRelation === ".." ||
|
|
61
|
+
homeRelation.startsWith(`..${path.sep}`) ||
|
|
62
|
+
path.isAbsolute(homeRelation)
|
|
63
|
+
) {
|
|
64
|
+
throw new Error("formal quality isolation root is invalid");
|
|
65
|
+
}
|
|
66
|
+
return resolvedRoot;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Give concurrent formal teammates separate ephemeral config/cache trees.
|
|
71
|
+
* Sharing one Windows config root makes independent processes contend on DACL
|
|
72
|
+
* repair and lets platform first-use caches leak into the benchmark cwd.
|
|
73
|
+
*/
|
|
74
|
+
export function formalQualityChildEnvironment(
|
|
75
|
+
identity,
|
|
76
|
+
environment = process.env,
|
|
77
|
+
) {
|
|
78
|
+
const isolationRoot = formalQualityIsolationRoot(environment);
|
|
79
|
+
if (!isolationRoot) return null;
|
|
80
|
+
const normalizedIdentity = String(identity || "").trim();
|
|
81
|
+
if (
|
|
82
|
+
!normalizedIdentity ||
|
|
83
|
+
normalizedIdentity.length > 256 ||
|
|
84
|
+
normalizedIdentity.includes("\0")
|
|
85
|
+
) {
|
|
86
|
+
throw new Error("formal quality child identity is invalid");
|
|
87
|
+
}
|
|
88
|
+
const identityDigest = createHash("sha256")
|
|
89
|
+
.update(normalizedIdentity, "utf8")
|
|
90
|
+
.digest("hex")
|
|
91
|
+
.slice(0, 24);
|
|
92
|
+
const childRoot = path.join(isolationRoot, "agent-homes", identityDigest);
|
|
93
|
+
const userHome = path.join(childRoot, "user-home");
|
|
94
|
+
const configHome = path.join(childRoot, "chainlesschain-home");
|
|
95
|
+
const appData = path.join(userHome, "app-data");
|
|
96
|
+
const localAppData = path.join(userHome, "local-app-data");
|
|
97
|
+
const xdgConfigHome = path.join(userHome, "xdg-config");
|
|
98
|
+
const xdgCacheHome = path.join(userHome, "xdg-cache");
|
|
99
|
+
const xdgDataHome = path.join(userHome, "xdg-data");
|
|
100
|
+
const dotnetHome = path.join(userHome, "dotnet-home");
|
|
101
|
+
const nugetPackages = path.join(userHome, "nuget-packages");
|
|
102
|
+
for (const directory of [
|
|
103
|
+
childRoot,
|
|
104
|
+
userHome,
|
|
105
|
+
configHome,
|
|
106
|
+
appData,
|
|
107
|
+
localAppData,
|
|
108
|
+
xdgConfigHome,
|
|
109
|
+
xdgCacheHome,
|
|
110
|
+
xdgDataHome,
|
|
111
|
+
dotnetHome,
|
|
112
|
+
nugetPackages,
|
|
113
|
+
]) {
|
|
114
|
+
fs.mkdirSync(directory, { recursive: true });
|
|
115
|
+
}
|
|
116
|
+
const childEnvironment = {
|
|
117
|
+
HOME: userHome,
|
|
118
|
+
USERPROFILE: userHome,
|
|
119
|
+
APPDATA: appData,
|
|
120
|
+
LOCALAPPDATA: localAppData,
|
|
121
|
+
XDG_CONFIG_HOME: xdgConfigHome,
|
|
122
|
+
XDG_CACHE_HOME: xdgCacheHome,
|
|
123
|
+
XDG_DATA_HOME: xdgDataHome,
|
|
124
|
+
CHAINLESSCHAIN_HOME: configHome,
|
|
125
|
+
DOTNET_CLI_HOME: dotnetHome,
|
|
126
|
+
NUGET_PACKAGES: nugetPackages,
|
|
127
|
+
POWERSHELL_TELEMETRY_OPTOUT: "1",
|
|
128
|
+
POWERSHELL_UPDATECHECK: "Off",
|
|
129
|
+
};
|
|
130
|
+
if (/^[A-Za-z]:[\\/]/u.test(userHome)) {
|
|
131
|
+
childEnvironment.HOMEDRIVE = userHome.slice(0, 2);
|
|
132
|
+
childEnvironment.HOMEPATH = userHome.slice(2);
|
|
133
|
+
}
|
|
134
|
+
return Object.freeze(childEnvironment);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** Resolve the provider that the formal harness bound before any model call. */
|
|
138
|
+
export function formalQualityProvider(environment = process.env) {
|
|
139
|
+
if (!isFormalQualityHermeticRuntime(environment)) return null;
|
|
140
|
+
const provider = String(environment?.[FORMAL_QUALITY_PROVIDER_ENV] || "")
|
|
141
|
+
.trim()
|
|
142
|
+
.toLowerCase();
|
|
143
|
+
return provider || null;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function validateAllowedFiles(value) {
|
|
147
|
+
const allowedFiles = Array.isArray(value) ? value : null;
|
|
148
|
+
if (
|
|
149
|
+
!allowedFiles ||
|
|
150
|
+
allowedFiles.length === 0 ||
|
|
151
|
+
allowedFiles.length > 16 ||
|
|
152
|
+
allowedFiles.some(
|
|
153
|
+
(file) =>
|
|
154
|
+
typeof file !== "string" ||
|
|
155
|
+
file.length === 0 ||
|
|
156
|
+
file.includes("\\") ||
|
|
157
|
+
file.includes("\0") ||
|
|
158
|
+
path.posix.isAbsolute(file) ||
|
|
159
|
+
path.posix.normalize(file) !== file ||
|
|
160
|
+
file === "." ||
|
|
161
|
+
file === ".." ||
|
|
162
|
+
file.startsWith("../"),
|
|
163
|
+
) ||
|
|
164
|
+
new Set(allowedFiles).size !== allowedFiles.length
|
|
165
|
+
) {
|
|
166
|
+
throw new Error("formal quality allowed-files binding is invalid");
|
|
167
|
+
}
|
|
168
|
+
return Object.freeze([...allowedFiles]);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** Resolve the exact task-local file allowlist passed to a formal child. */
|
|
172
|
+
export function formalQualityAllowedFiles(environment = process.env) {
|
|
173
|
+
if (!isFormalQualityHermeticRuntime(environment)) return null;
|
|
174
|
+
let allowedFiles;
|
|
175
|
+
try {
|
|
176
|
+
allowedFiles = JSON.parse(
|
|
177
|
+
String(environment?.[FORMAL_QUALITY_ALLOWED_FILES_ENV] || ""),
|
|
178
|
+
);
|
|
179
|
+
} catch {
|
|
180
|
+
throw new Error("formal quality allowed-files binding is invalid");
|
|
181
|
+
}
|
|
182
|
+
return validateAllowedFiles(allowedFiles);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** Bind a validated plan allowlist to the child without widening normal runs. */
|
|
186
|
+
export function formalQualityTaskAllowedFiles(
|
|
187
|
+
allowedFiles,
|
|
188
|
+
environment = process.env,
|
|
189
|
+
) {
|
|
190
|
+
if (!isFormalQualityHermeticRuntime(environment)) return null;
|
|
191
|
+
return validateAllowedFiles(allowedFiles);
|
|
192
|
+
}
|
|
@@ -8,14 +8,15 @@ import {
|
|
|
8
8
|
normalizeGraphRetirementEvidence,
|
|
9
9
|
} from "./retirement-evidence.js";
|
|
10
10
|
import { graphStoreEvidenceDigest } from "./store-cutover-evidence.js";
|
|
11
|
+
import {
|
|
12
|
+
GRAPH_CUTOVER_LEDGER_SCHEMA,
|
|
13
|
+
GRAPH_CUTOVER_REQUIRED_PLATFORMS,
|
|
14
|
+
} from "./cutover-contract.js";
|
|
11
15
|
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
"windows",
|
|
17
|
-
"macos",
|
|
18
|
-
]);
|
|
16
|
+
export {
|
|
17
|
+
GRAPH_CUTOVER_LEDGER_SCHEMA,
|
|
18
|
+
GRAPH_CUTOVER_REQUIRED_PLATFORMS,
|
|
19
|
+
} from "./cutover-contract.js";
|
|
19
20
|
|
|
20
21
|
const IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,159}$/u;
|
|
21
22
|
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
|
|
3
|
+
function stableValue(value, state = { seen: new WeakSet(), nodes: 0 }) {
|
|
4
|
+
state.nodes += 1;
|
|
5
|
+
if (state.nodes > 250_000) {
|
|
6
|
+
throw new TypeError("Graph evidence exceeds canonicalization limits");
|
|
7
|
+
}
|
|
8
|
+
if (Array.isArray(value))
|
|
9
|
+
return value.map((item) => stableValue(item, state));
|
|
10
|
+
if (!value || typeof value !== "object") {
|
|
11
|
+
if (typeof value === "number" && !Number.isFinite(value)) {
|
|
12
|
+
throw new TypeError("Graph evidence contains a non-finite number");
|
|
13
|
+
}
|
|
14
|
+
if (["bigint", "function", "symbol", "undefined"].includes(typeof value)) {
|
|
15
|
+
throw new TypeError("Graph evidence contains a non-JSON value");
|
|
16
|
+
}
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
if (state.seen.has(value)) {
|
|
20
|
+
throw new TypeError("Graph evidence contains a cycle or repeated object");
|
|
21
|
+
}
|
|
22
|
+
state.seen.add(value);
|
|
23
|
+
if (
|
|
24
|
+
Object.getPrototypeOf(value) !== Object.prototype &&
|
|
25
|
+
Object.getPrototypeOf(value) !== null
|
|
26
|
+
) {
|
|
27
|
+
throw new TypeError("Graph evidence must contain plain JSON objects");
|
|
28
|
+
}
|
|
29
|
+
return Object.fromEntries(
|
|
30
|
+
Object.keys(value)
|
|
31
|
+
.filter((key) => value[key] !== undefined)
|
|
32
|
+
.sort()
|
|
33
|
+
.map((key) => [key, stableValue(value[key], state)]),
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function canonicalGraphEvidenceJson(value) {
|
|
38
|
+
return JSON.stringify(stableValue(value));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function graphEvidenceDigest(value, domain) {
|
|
42
|
+
return `sha256:${createHash("sha256")
|
|
43
|
+
.update(domain)
|
|
44
|
+
.update("\0")
|
|
45
|
+
.update(canonicalGraphEvidenceJson(value))
|
|
46
|
+
.digest("hex")}`;
|
|
47
|
+
}
|
|
@@ -6,7 +6,14 @@
|
|
|
6
6
|
"ledgerSchema": "chainlesschain.graph-cutover-ledger/v1",
|
|
7
7
|
"scope": "entry",
|
|
8
8
|
"requiredPlatforms": ["linux", "windows", "macos"],
|
|
9
|
-
"existingCanonicalRunRollback": "retain_authority"
|
|
9
|
+
"existingCanonicalRunRollback": "retain_authority",
|
|
10
|
+
"legacyMutationErrorCodes": {
|
|
11
|
+
"browser": "CC_CLI_LEGACY_RUNTIME_READ_ONLY",
|
|
12
|
+
"cli_team": "CC_CLI_LEGACY_RUNTIME_READ_ONLY",
|
|
13
|
+
"cowork": "CC_CLI_LEGACY_RUNTIME_READ_ONLY",
|
|
14
|
+
"desktop": "CC_DESKTOP_LEGACY_RUNTIME_READ_ONLY",
|
|
15
|
+
"scheduler": "CC_CLI_LEGACY_RUNTIME_READ_ONLY"
|
|
16
|
+
}
|
|
10
17
|
},
|
|
11
18
|
"surfaces": [
|
|
12
19
|
{
|