chainlesschain 0.162.179 → 0.162.181
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 +6 -3
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-BF13YdB-.js → AIOps-cq0dwbnf.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-B9y67AjF.js → ActionButton-CvcgGl3w.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-FcdDHoSC.js → Analytics-hM2-jFqg.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CRm_zwSp.js → AppLayout-B9_Gsd_g.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-Cbo7-usf.js → Artifacts-B7bu52Og.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-vMaLpkHC.js → Audit-DThfDgqB.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-FiUY692t.js → BackgroundAgents-DjlFiD4v.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BK80j_GQ.js → Backup-CK9xJKnG.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-ChNMuYR1.js → BaseInput-DEiSU8K8.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-928UREpm.js → Chat-CpT96czj.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BKPPNmZI.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-dFW-zDbe.js → Checkbox-C1GfDnO0.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BCcNJUj2.js → Codegen-3DAKgiLx.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DcEkLv70.js → Col-74cOwZU1.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DihBRRqg.js → Community-tn9Kkz9j.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DGYxwWET.js → Compact-BcoXH7m4.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-OnYe1vS4.js → Compliance-DIPGUBgi.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CmWB54c2.js → Cowork-doD5_91c.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BrANb2uw.js → Cron-C-IDvubz.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-2HgWzSxg.js → Crosschain-CdcCoBdj.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DdDwNI6K.js → DID-DdH5aMMA.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-D6PnE78-.js → Dashboard-DHLA4mm0.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-ClzvSN4O.js → Dropdown-dEeCt7Md.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BUk9B727.js → EmailListRenderer-BMaecFv9.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-C8hi3v7i.js → FamilyGuardDashboard-DUaUukTN.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-B5SP8xkg.js → Federation-CMBE0_rp.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DWzJ8AU5.js → FormItemContext-PG-JDbXq.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-3E3Q3rjG.js → GenericCardRenderer-Bcb0p88m.js} +1 -1
- package/src/assets/web-panel/assets/{Git-z8IdCMId.js → Git-Bgv15myB.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CgqCF9lX.js → Governance-DB8YTArI.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-zgS-AuH9.js → Inference-BQMwCWaS.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-BdbgmESJ.js → KnowledgeGraph-B1_ZziiB.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BHpknnjy.js → Logs-DovEEnt_.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-D201OL4T.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Di9sAR7j.js → Marketplace-BlCXSpyB.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DtnR9Z_A.js → McpTools-CsCR09Wj.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-BaX9uuXD.js → Memory-CBVRLKno.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-xelyKWTY.js → MobileBridge-C9OIafgA.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BiFTOGBN.js → MobileProjects-D_zoJ8Xs.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-bV3OzTiO.js → Mtc-vE-HdvLj.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-BkwvFTdZ.js → MtcAudit-CPLaekCd.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-_6HQQ-oC.js → Multisig-C_UP9C2o.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BBYhmWQZ.js → NLProgramming-2nODJcU1.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Cq-6dQnU.js → Notes-BhE-SJGu.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-ILZ9zkX6.js → NotificationSettings-D21q7BNU.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DgmTBEvk.js → OrderTableRenderer-0b62GYOD.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CkLnWwCk.js → Organization-CEqmw_sb.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CWVHZbhf.js → Overflow-MW-gMDO_.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BXbqETkr.js → P2P-CY0hjI_G.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser--0JR-0ex.js → PdhVaultBrowser-BbWh7Man.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-Cz9_tfSy.js → Permissions-ChqEA_4Q.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Dq7OWYtx.js → PersonalDataHub-B3YrbYfD.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-DHPUNcc-.js → Pipeline-B8WBhhlW.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CEAbrDkS.js → Privacy-Cmb0PXNx.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CJYfclXE.js → ProjectInit-hF6zW3Nz.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-oCTgPCgp.js → ProjectSettings-BFSVfpW0.js} +2 -2
- package/src/assets/web-panel/assets/Projects-DAWkVFkc.js +1 -0
- package/src/assets/web-panel/assets/{Providers-BLTZtzTG.js → Providers-B8yux8Dx.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-C0b0TQB3.js → QrScannerModal-N76cQluO.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-tOl6N_gM.js → QuickAsk-ClvZ0KYR.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DPzKr8yr.js → Recommend-B-GfgBpT.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-mlglCdQi.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-Cji1Vl79.js → Reputation-DJIZzQeG.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D-NERWf2.js → Row-COzxu_bb.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DzlgmAlB.js → RssFeed-CoYsJQuE.js} +3 -3
- package/src/assets/web-panel/assets/{Search-Cs0SWSa4.js → Search-DC77Mq9S.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DL7EzcUO.js → Security-Loy2EdMO.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CT-PzgTd.js → Services-GUD07Eu0.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-tByJWdJg.js → Skeleton-DWzkptYU.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-Dnr_6TTl.js → Skills-CEDn1r-Z.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-4O-yq0LY.js → Sla-ub_k4pXh.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BYBVg1oR.js → SpeechSettings-D7HLX9CA.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CpOYPbE5.js → SyncSettings-DbwOvl6m.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CGVhOVh6.js → Tasks-CBQzoAu5.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BuHFxR4X.js → Templates-BNVeIhud.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DxDxHzgf.js → Tenant-PS9AzhXU.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B9g_nISg.js → Terminal-Cgb4eLB_.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DlrBC_4A.js → TimelineRenderer-CrmXMOkg.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DvBlYZ6i.js → Tokens-DD-VDHw1.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-Dg8G9bhF.js → Trigger-BsoN_n-n.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-COICx4E-.js → Trust-n8LmN4ZV.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B4pOBv7T.js → UkeySign-C9_7MImA.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Qt4NMA8Q.js → VideoEditing-DyBteNgn.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-X1EkQc2Z.js → Wallet-BS5ixeXI.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CyeEFBE5.js → WebAuthn-spc4UImU.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-nwzbMiVQ.js → WorkflowEditor-D7iVvaBO.js} +1 -1
- package/src/assets/web-panel/assets/chat-6CmBkHrL.js +1 -0
- package/src/assets/web-panel/assets/{colors-5Isz5lhJ.js → colors-BGoCLkxI.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DsFQS3Oy.js → compact-item-fYZBetMO.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-OcEXp2uz.js → createContext-BeM-1UVj.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BzPwHnw8.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CZvC4p09.js → hasIn-CE7ZuEnV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BF1sab0Q.js → index--lap6cf7.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7yeL3rf.js → index-ATcSr_2O.js} +1 -1
- package/src/assets/web-panel/assets/{index-VkFXA9N-.js → index-B2U-ObMq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSmGGg5h.js → index-B3CDgvNW.js} +1 -1
- package/src/assets/web-panel/assets/{index-jrNIrpq4.js → index-B4wiTEOM.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8ibl7bc.js → index-B8BsdNV_.js} +1 -1
- package/src/assets/web-panel/assets/{index-DOLozRk8.js → index-BEVm0lCS.js} +10 -10
- package/src/assets/web-panel/assets/{index-BPgc_bdR.js → index-BNZDILcO.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTZZzlMO.js → index-BU_2qiDk.js} +1 -1
- package/src/assets/web-panel/assets/{index-Vubi6Tf5.js → index-BV551878.js} +1 -1
- package/src/assets/web-panel/assets/{index-nXrnztXp.js → index-BfPL-m46.js} +1 -1
- package/src/assets/web-panel/assets/{index-CN8lPVpQ.js → index-BowH1eLQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgE2BZl2.js → index-BsMfoaeo.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cd5b2JHB.js → index-BunaQCa0.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQlGw0nQ.js → index-C0v6YKKO.js} +1 -1
- package/src/assets/web-panel/assets/{index-Do6FJK32.js → index-C4SJVjs4.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bqvo1f9T.js → index-C9Y3k0HI.js} +1 -1
- package/src/assets/web-panel/assets/{index-LUdgPZg9.js → index-CIpVrf5P.js} +1 -1
- package/src/assets/web-panel/assets/{index-BpD2O7_p.js → index-CRLjEP1H.js} +1 -1
- package/src/assets/web-panel/assets/{index-r_9NG6P7.js → index-CRnUE8Cb.js} +1 -1
- package/src/assets/web-panel/assets/{index-FIgMAfBh.js → index-Cip8emOQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-RsQ1lFDV.js → index-CpIGIB85.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGJupV0S.js → index-D1r9tT3J.js} +1 -1
- package/src/assets/web-panel/assets/{index-BpglwPWl.js → index-DT3zPSVX.js} +1 -1
- package/src/assets/web-panel/assets/index-DacrAdc-.js +1 -0
- package/src/assets/web-panel/assets/{index-CG3B2wCF.js → index-De0quFDw.js} +1 -1
- package/src/assets/web-panel/assets/{index-CxA2PDK1.js → index-DoXk5KJ8.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaGKOVvQ.js → index-DsvfrESp.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7CtJYXq.js → index-Dw1PyYPm.js} +1 -1
- package/src/assets/web-panel/assets/index-EHzNJozo.js +1 -0
- package/src/assets/web-panel/assets/{index-Bu9NXvIa.js → index-MtOuq2i6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BsZkTaa3.js → index-Puq6Luf1.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPE4zHXF.js → index-QIpnpZgz.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bsb-iylv.js → index-RMZ8a7Yt.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMtGRQqw.js → index-WUrJ6S1j.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3lWvhk4.js → index-YjcumOZ4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmVbCGx_.js → index-lJBjB1QX.js} +1 -1
- package/src/assets/web-panel/assets/{index-A5SHQW_M.js → index-ukg99D1V.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFJgt6qM.js → index-zb7rVOhV.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Cdgep9YT.js → initDefaultProps-CYHMs1ag.js} +1 -1
- package/src/assets/web-panel/assets/{motion-7yn1ACEm.js → motion-DDB2Ffk5.js} +1 -1
- package/src/assets/web-panel/assets/{move-D8o133Xc.js → move-Bg3cD-dX.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CClHIG9V.js → mtc-parser-B5nedjTS.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CLnrPE2d.js → omit-BHyuUILu.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-1CTWoZWl.js → pickAttrs-C9YQnEN9.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-xNNtS4Sp.js → placementArrow-DBUFYUe7.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-ypzAofs7.js → responsiveObserve-nBs2Obnk.js} +1 -1
- package/src/assets/web-panel/assets/{slide-QsrY9UwD.js → slide-DkCEaXNU.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DSdThzOB.js → statusUtils-aqE1Wi6U.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-B_kKM8Ob.js → styleChecker-CN5bhfHB.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CcdTBNV9.js → useFlexGapSupport-B_oX_kvJ.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BuAH2XFU.js → useFs-rCuXHeme.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-B3zWiG4A.js → usePersonalDataHub-DZR9Abyd.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-B45Rc-CQ.js → vnode-ConCYQlX.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DaYZDU5f.js → zoom-CUdDxG5M.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +4 -1
- package/src/commands/background-session.js +2 -1
- package/src/commands/context.js +69 -2
- package/src/commands/hub.js +30 -24
- package/src/data/changelog.json +27 -1
- package/src/gateways/ws/background-agent-protocol.js +38 -0
- package/src/gateways/ws/message-dispatcher.js +1 -0
- package/src/gateways/ws/remote-session-protocol.js +65 -6
- package/src/gateways/ws/ws-server.js +8 -1
- package/src/harness/feature-flags.js +15 -8
- package/src/harness/mcp-client.js +618 -43
- package/src/lazy-dispatch.js +30 -1
- package/src/lib/agent-authority.js +22 -0
- package/src/lib/agent-core.js +2 -0
- package/src/lib/agent-sandbox.js +161 -0
- package/src/lib/agent-team/team-runner.js +22 -0
- package/src/lib/artifact-store.js +35 -0
- package/src/lib/async-hook-supervisor.cjs +13 -2
- package/src/lib/audit-mtc.js +3 -2
- package/src/lib/background-agent-supervisor.js +104 -3
- package/src/lib/background-interaction-journal.js +407 -0
- package/src/lib/background-interaction-resolver.js +23 -34
- package/src/lib/background-session-transport.js +12 -2
- package/src/lib/capability-manifest.js +41 -3
- package/src/lib/capability-negotiation.js +1 -1
- package/src/lib/channels/channel-manager.js +33 -0
- package/src/lib/channels/telegram-channel.js +23 -5
- package/src/lib/channels/webhook-channel.js +38 -15
- package/src/lib/chrome-connector.js +169 -23
- package/src/lib/config-manager.js +23 -9
- package/src/lib/context-breakdown.js +31 -0
- package/src/lib/cowork-cron.js +274 -32
- package/src/lib/cross-chain-mtc.js +3 -2
- package/src/lib/durable-security-store.js +124 -0
- package/src/lib/event-runtime-host.js +67 -6
- package/src/lib/event-runtime-store.js +163 -0
- package/src/lib/goal-store.js +32 -12
- package/src/lib/headless-manifest.js +2 -1
- package/src/lib/hook-environment.cjs +58 -0
- package/src/lib/hook-manager.js +12 -5
- package/src/lib/hook-runner.cjs +122 -28
- package/src/lib/hook-runner.js +1 -0
- package/src/lib/hooks-v2-producers.js +36 -0
- package/src/lib/hooks-v2-runtime.js +329 -52
- package/src/lib/interaction-adapter.js +60 -19
- package/src/lib/interaction-binding.js +64 -0
- package/src/lib/json-schema-output.js +439 -14
- package/src/lib/json-schema-validate.js +514 -883
- package/src/lib/lan-pairing-tokens.js +115 -57
- package/src/lib/lsp/__tests__/lsp-client.test.js +32 -0
- package/src/lib/lsp/__tests__/lsp-manager.test.js +25 -0
- package/src/lib/lsp/lsp-client.js +4 -0
- package/src/lib/lsp/lsp-manager.js +3 -0
- package/src/lib/lsp/lsp-server-registry.js +18 -0
- package/src/lib/mcp-client.js +1 -0
- package/src/lib/mcp-oauth.js +35 -21
- package/src/lib/packer/pkg-config-generator.js +1 -0
- package/src/lib/permission-decision.js +99 -0
- package/src/lib/plugin-monitor-supervisor.js +3 -0
- package/src/lib/plugin-runtime/capabilities.js +50 -0
- package/src/lib/plugin-runtime/capability-consent.js +42 -35
- package/src/lib/plugin-runtime/hooks.js +36 -9
- package/src/lib/plugin-runtime/install.js +23 -7
- package/src/lib/plugin-runtime/lsp.js +4 -0
- package/src/lib/plugin-runtime/manifest.js +50 -2
- package/src/lib/plugin-runtime/mcp.js +30 -5
- package/src/lib/plugin-runtime/monitors.js +11 -0
- package/src/lib/plugin-runtime/plugin-options.js +94 -38
- package/src/lib/plugin-runtime/policy.js +29 -2
- package/src/lib/plugin-runtime/sandbox-policy.js +84 -0
- package/src/lib/plugin-runtime/scopes.js +7 -3
- package/src/lib/plugin-runtime/trust.js +36 -31
- package/src/lib/process-execution-broker/credential-agent.js +114 -16
- package/src/lib/process-execution-broker/credential-transport-worker.js +312 -0
- package/src/lib/process-execution-broker/credential-transport.js +378 -0
- package/src/lib/process-execution-broker/index.js +408 -19
- package/src/lib/process-execution-broker/platform-sandbox.js +561 -21
- package/src/lib/process-execution-broker/windows-sandbox.ps1 +999 -0
- package/src/lib/project-mcp-trust.js +21 -26
- package/src/lib/protocol-replay.js +19 -12
- package/src/lib/settings-hooks.cjs +13 -0
- package/src/lib/skill-loader.js +83 -10
- package/src/lib/sync-credentials.js +5 -4
- package/src/lib/turn-binding.js +8 -6
- package/src/repl/agent-repl.js +113 -28
- package/src/repl/repl-turn-binding.js +5 -2
- package/src/runtime/agent-core.js +331 -26
- package/src/runtime/coding-agent-contract-shared.cjs +3 -3
- package/src/runtime/headless-runner.js +101 -4
- package/src/runtime/headless-stream.js +209 -23
- package/src/runtime/mcp-config.js +29 -17
- package/src/runtime/policies/agent-policy.js +2 -0
- package/src/workers/background-agent-worker.js +128 -13
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DvySUzxJ.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-DkxCweb1.js +0 -1
- package/src/assets/web-panel/assets/Projects-ClomCrN0.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-pRgaWsUK.js +0 -4
- package/src/assets/web-panel/assets/chat-Bvl-ojg2.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CSVgo71Z.js +0 -1
- package/src/assets/web-panel/assets/index-DMIWh9fu.js +0 -1
- package/src/assets/web-panel/assets/index-ssTvV1l6.js +0 -1
package/src/assets/web-panel/assets/{useFlexGapSupport-CcdTBNV9.js → useFlexGapSupport-B_oX_kvJ.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o,s as t}from"./vendor-Bn1JzzAn.js";import{d as s}from"./styleChecker-
|
|
1
|
+
import{o,s as t}from"./vendor-Bn1JzzAn.js";import{d as s}from"./styleChecker-CN5bhfHB.js";const r=(()=>{const e=t(!1);return o(()=>{e.value=s()}),e});export{r as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as d}from"./index-
|
|
1
|
+
import{u as d}from"./index-BEVm0lCS.js";import{u as c}from"./useShellMode-CgR0wCYM.js";function u({accept:l=""}={}){return new Promise(a=>{if(typeof document>"u"){a({canceled:!0,path:null,content:null});return}const n=document.createElement("input");n.type="file",l&&(n.accept=l),n.style.display="none",document.body.appendChild(n);let o=!1;const i=()=>{n.parentNode&&n.parentNode.removeChild(n)},r=()=>{if(o)return;o=!0;const e=n.files&&n.files[0];if(!e){i(),a({canceled:!0,path:null,content:null});return}const t=new FileReader;t.onload=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:typeof t.result=="string"?t.result:""})},t.onerror=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:null,reason:"read_failed"})},t.readAsText(e)};n.addEventListener("change",r),n.click()})}function f(l,{defaultPath:a="download.txt"}={}){if(typeof document>"u")return{canceled:!0,path:null};const n=new Blob([l],{type:"text/plain"}),o=URL.createObjectURL(n),i=document.createElement("a");return i.href=o,i.download=a,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(o),{canceled:!1,path:a}}function p(l){if(!Array.isArray(l))return"";const a=[];for(const n of l)if(Array.isArray(n.extensions))for(const o of n.extensions)a.push(`.${o.replace(/^\./,"")}`);return a.join(",")}function m(){const l=d();async function a(r={}){if(c().isEmbedded){const e=await l.sendRaw({type:"fs.openDialog",title:r.title,filters:r.filters},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDialog failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,content:t.content??null,size:t.size,reason:t.reason}}return u({accept:p(r.filters)})}async function n(r,e={}){if(typeof r!="string")throw new Error("content must be a string");if(c().isEmbedded){const t=await l.sendRaw({type:"fs.saveDialog",title:e.title,defaultPath:e.defaultPath,filters:e.filters,content:r},6e4);if(t&&t.ok===!1)throw new Error(t.error||"fs.saveDialog failed");const s=t?.result??t;return{canceled:!!s.canceled,path:s.path??null}}return f(r,{defaultPath:e.defaultPath})}async function o(r,e={}){const t=JSON.stringify(r,null,2),s={...e,defaultPath:e.defaultPath||"data.json",filters:e.filters||[{name:"JSON",extensions:["json"]}]};return n(t,s)}async function i(r={}){if(!c().isEmbedded)return{canceled:!0,path:null,initialized:!1,unsupported:!0};const e=await l.sendRaw({type:"fs.openDirectory",title:r.title},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDirectory failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,initialized:!!t.initialized}}return{pickFileText:a,saveText:n,saveJson:o,pickDirectory:i}}export{m as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as v}from"./index-
|
|
1
|
+
import{u as v}from"./index-BEVm0lCS.js";import{u as _}from"./useShellMode-CgR0wCYM.js";function d(r){if(!r)return r;if(r.error)throw new Error(r.error);return r.result!==void 0?r.result:r}async function p(r,s={},e=!0){try{if(e!==!0||!r||typeof r.sendRaw!="function")return{status:"unavailable",path:null};const a=await r.sendRaw({type:"fs.openDirectory",title:s.title},6e4);if(a&&(a.ok===!1||a.error))return{status:"unavailable",path:null};const t=a&&a.result!==void 0?a.result:a;return t&&(t.ok===!1||t.error||t.unsupported===!0)?{status:"unavailable",path:null}:t&&t.canceled===!0?{status:"cancelled",path:null}:t&&typeof t.path=="string"&&t.path.length>0?{status:"selected",path:t.path}:{status:"unavailable",path:null}}catch{return{status:"unavailable",path:null}}}function b(r,s,e,a,t){return typeof r.onMessage!="function"||typeof r.sendRaw!="function"?r.sendRaw({type:s,...e},t).then(d):new Promise((n,u)=>{const l=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${s}.event`,m=`${s}.end`;let c=!1,h=()=>{};const o=(i,f)=>{if(!c){c=!0,clearTimeout(g);try{h()}catch{}i(f)}},g=setTimeout(()=>{o(u,new Error(`stream timeout (${t}ms): ${s}`))},t),y=r.onMessage(i=>{if(!(c||!i)&&!(i.id!==l&&i.requestId!==l)){if(i.type===w){if(typeof a=="function")try{a(i.event||i)}catch{}return}if(i.type===m){o(n,d(i));return}i.type==="error"&&o(u,new Error(i.message||"stream error"))}});h=typeof y=="function"?y:()=>{},Promise.resolve(r.sendRaw({id:l,type:s,...e},t)).catch(()=>{})})}function k(){const r=v(),s=_(),e=(a,t={},n=3e4)=>r.sendRaw({type:a,...t},n).then(d);return{async health(){return await e("personal-data-hub.health",{},8e3)},async stats(){return await e("personal-data-hub.stats",{},8e3)},async listAdapters(){return await e("personal-data-hub.list-adapters",{},5e3)},async pickFile(a={}){try{const t=await r.sendRaw({type:"fs.openDialog",title:a.title,filters:a.filters},6e4),n=t&&t.result!==void 0?t.result:t,u=n&&typeof n.path=="string"?n.path:n&&typeof n.filePath=="string"?n.filePath:null;return n&&n.canceled!==!0&&u?u:null}catch{return null}},async pickDirectoryResult(a={}){return await p(r,a,s.isEmbedded)},async pickDirectory(a={}){const t=await p(r,a,s.isEmbedded);return t.status==="selected"?t.path:null},async adapterReadiness(a){return await e("personal-data-hub.adapter-readiness",Number.isInteger(a)?{timeoutMs:a}:{},15e3)},async syncAdapter(a,t={}){return await e("personal-data-hub.sync-adapter",{name:a,options:t},6e5)},async syncAll(a={}){return await e("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:t=20,seed:n=1}={}){return await e("personal-data-hub.register-mock",{name:a,count:t,seed:n})},async unregister(a){return await e("personal-data-hub.unregister",{name:a})},async ask(a,t={}){return await e("personal-data-hub.ask",{question:a,options:t},18e4)},async queryEvents(a={}){return await e("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await e("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await e("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await e("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await e("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,t={}){return await e("personal-data-hub.register-email",{account:a,opts:t},15e3)},async unregisterEmail(a){return await e("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await e("personal-data-hub.list-email-accounts",{},5e3)},async activateEmail(a){return await e("personal-data-hub.activate-email",{email:a},5e3)},async eventDetail(a){return await e("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,t={},n){return await b(r,"personal-data-hub.sync-adapter-stream",{name:a,options:t},n,6e5)},async syncAllStream(a={},t){return await b(r,"personal-data-hub.sync-all-stream",{options:a},t,9e5)},async registerAlipay(a,t={}){return await e("personal-data-hub.register-alipay",{account:a,opts:t},15e3)},async unregisterAlipay(a){return await e("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await e("personal-data-hub.list-alipay-accounts",{},5e3)},async activateAlipay(a){return await e("personal-data-hub.activate-alipay",{email:a},5e3)},async importAlipayBill({zipPath:a,csvPath:t,zipPassword:n}={}){return await e("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:t,zipPassword:n},3e5)},async reviewQueueList(a=50){return await e("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,t){return await e("personal-data-hub.review-decision",{reviewId:a,decision:t},5e3)},async manualMerge(a,t){return await e("personal-data-hub.manual-merge",{aId:a,bId:t},5e3)},async manualUnmerge(a){return await e("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await e("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await e("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await e("personal-data-hub.skills-list",{},5e3)},async runSkill(a,t={}){return await e("personal-data-hub.run-skill",{name:a,options:t},12e4)},async openAichatLogin(a,t={}){return await e("personal-data-hub.aichat-open-login",{vendor:a,opts:t},1e4)},async probeAichatCookies(a,t){return await e("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:t},1e4)},async registerAichatVendor(a,t,n={}){return await e("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:t,opts:n},3e4)},async rotateAichatLogin(a){return await e("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await e("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await e("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await e("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await e("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:t,wechatDataPath:n,fridaOpts:u,keyProviderOverride:l}={}){return await e("personal-data-hub.register-wechat",{account:a,dbPath:t,wechatDataPath:n,fridaOpts:u,keyProviderOverride:l},45e3)},async listWechatAccounts(){return await e("personal-data-hub.list-wechat-accounts",{},5e3)},async activateWechat(a,t={}){return await e("personal-data-hub.activate-wechat",{uin:a,fridaOpts:t.fridaOpts,keyProviderOverride:t.keyProviderOverride},45e3)},async unregisterWechat(a){return await e("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await e("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await e("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await e("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await e("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await e("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await e("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await e("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await e("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{k as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as i,h as a,w as l}from"./index-
|
|
1
|
+
import{N as i,h as a,w as l}from"./index-BEVm0lCS.js";import{a7 as o,k as g,C as d,F as f,A as p}from"./vendor-Bn1JzzAn.js";function c(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1,u=e;if(Array.isArray(e)&&(u=i(e)[0]),!u)return null;const n=o(u,r,s);return n.props=t?a(a({},n.props),r):n.props,l(typeof n.props.class!="object","class must be string"),n}function V(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;return e.map(s=>c(s,r,t))}function v(e,r,t){p(o(e,a({},r)),t)}const m=e=>(e||[]).some(r=>g(r)?!(r.type===d||r.type===f&&!m(r.children)):!0)?e:null;function h(e,r,t,s){var u;const n=(u=e[r])===null||u===void 0?void 0:u.call(e,t);return m(n)?n:s?.()}export{h as a,V as b,c,v as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{K as o}from"./index-
|
|
1
|
+
import{K as o}from"./index-BEVm0lCS.js";import{i as f}from"./motion-DDB2Ffk5.js";const c=new o("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),y=new o("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),a=new o("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),s=new o("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),g=new o("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),O=new o("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),l=new o("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),u=new o("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}}),p=new o("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),z=new o("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}}),K=new o("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),w=new o("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}}),I={zoom:{inKeyframes:c,outKeyframes:y},"zoom-big":{inKeyframes:a,outKeyframes:s},"zoom-big-fast":{inKeyframes:a,outKeyframes:s},"zoom-left":{inKeyframes:l,outKeyframes:u},"zoom-right":{inKeyframes:p,outKeyframes:z},"zoom-up":{inKeyframes:g,outKeyframes:O},"zoom-down":{inKeyframes:K,outKeyframes:w}},h=(n,r)=>{const{antCls:m}=n,t=`${m}-${r}`,{inKeyframes:i,outKeyframes:e}=I[r];return[f(t,i,e,r==="zoom-big-fast"?n.motionDurationFast:n.motionDurationMid),{[`
|
|
2
2
|
${t}-enter,
|
|
3
3
|
${t}-appear
|
|
4
4
|
`]:{transform:"scale(0)",opacity:0,animationTimingFunction:n.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${t}-leave`]:{animationTimingFunction:n.motionEaseInOutCirc}}]};export{h as i,c as z};
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// Injected by web-ui-server.js at serve time
|
|
9
9
|
window.__CC_CONFIG__ = __CC_CONFIG_PLACEHOLDER__;
|
|
10
10
|
</script>
|
|
11
|
-
<script type="module" crossorigin src="./assets/index-
|
|
11
|
+
<script type="module" crossorigin src="./assets/index-BEVm0lCS.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="./assets/vendor-Bn1JzzAn.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="./assets/icons-DG5UD-6K.js">
|
|
14
14
|
<link rel="stylesheet" crossorigin href="./assets/index-Cq93VfoF.css">
|
package/src/commands/agent.js
CHANGED
|
@@ -1307,7 +1307,7 @@ export function registerAgentCommand(program) {
|
|
|
1307
1307
|
const jso = await import("../lib/json-schema-output.js");
|
|
1308
1308
|
if (options.outputFormat === "stream-json") {
|
|
1309
1309
|
try {
|
|
1310
|
-
const schema = jso.
|
|
1310
|
+
const schema = await jso.loadSchemaFileWithRefs(
|
|
1311
1311
|
jso._deps.fs,
|
|
1312
1312
|
options.jsonSchema,
|
|
1313
1313
|
);
|
|
@@ -1421,6 +1421,9 @@ export function registerAgentCommand(program) {
|
|
|
1421
1421
|
additionalDirectories,
|
|
1422
1422
|
sandbox: interactiveSandbox,
|
|
1423
1423
|
autoCheckpoint,
|
|
1424
|
+
// Keep interactive --worktree sessions in the same explicit
|
|
1425
|
+
// turn-binding coverage model as headless runs.
|
|
1426
|
+
worktreeId: _worktree ? _worktree.branch : null,
|
|
1424
1427
|
// --vim: start the REPL in vim-mode editing (also CC_VIM=1 or /vim).
|
|
1425
1428
|
vimMode: options.vim === true,
|
|
1426
1429
|
// --system-prompt / --append-system-prompt (literal or @file) also
|
|
@@ -152,7 +152,7 @@ async function followBackgroundAgent(id, options = {}) {
|
|
|
152
152
|
}
|
|
153
153
|
|
|
154
154
|
logger.log(chalk.gray(`Attached to ${id}. Streaming logs; Ctrl-C detaches.`));
|
|
155
|
-
|
|
155
|
+
|
|
156
156
|
while (true) {
|
|
157
157
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
158
158
|
const next = readLogFromOffset(logFile, offset);
|
|
@@ -374,6 +374,7 @@ export async function interactiveAttach(id, state, options = {}) {
|
|
|
374
374
|
options: preExistingQuestion.options,
|
|
375
375
|
multiSelect: preExistingQuestion.multiSelect,
|
|
376
376
|
timeoutMs: preExistingQuestion.timeoutMs,
|
|
377
|
+
binding: preExistingQuestion.binding,
|
|
377
378
|
_deferred: true,
|
|
378
379
|
});
|
|
379
380
|
});
|
package/src/commands/context.js
CHANGED
|
@@ -330,14 +330,81 @@ export function registerContextCommand(program) {
|
|
|
330
330
|
);
|
|
331
331
|
}
|
|
332
332
|
if (sourceReport.skillCache.descriptors.resident > 0) {
|
|
333
|
+
const skillDescriptors = sourceReport.skillCache.descriptors;
|
|
334
|
+
const skillBodies = sourceReport.skillCache.bodies;
|
|
333
335
|
logger.log("");
|
|
334
336
|
logger.log(
|
|
335
337
|
chalk.gray(
|
|
336
|
-
` Skill cache: ${
|
|
337
|
-
|
|
338
|
+
` Skill cache: ${skillDescriptors.resident} descriptors ` +
|
|
339
|
+
`(${skillDescriptors.estimatedTokens} estimated descriptor-token equivalents), ` +
|
|
340
|
+
`${skillBodies.resident} bodies resident ` +
|
|
341
|
+
`(${skillBodies.estimatedTokensResident} estimated body-token equivalents), ` +
|
|
338
342
|
`${sourceReport.skillCache.savings.estimatedTokensAvoided} estimated tokens kept lazy`,
|
|
339
343
|
),
|
|
340
344
|
);
|
|
345
|
+
logger.log(
|
|
346
|
+
chalk.gray(
|
|
347
|
+
` Descriptor prompt returns: ${skillDescriptors.contextLoads} / ` +
|
|
348
|
+
`${skillDescriptors.contextTokens} estimated context tokens`,
|
|
349
|
+
),
|
|
350
|
+
);
|
|
351
|
+
logger.log(
|
|
352
|
+
chalk.gray(
|
|
353
|
+
` On-demand reads: ${skillBodies.cacheMisses} disk / ` +
|
|
354
|
+
`${skillBodies.cacheHits} cache; cache reuse avoided ` +
|
|
355
|
+
`${skillBodies.estimatedTokensAvoidedByCache} body-token equivalents of disk reads`,
|
|
356
|
+
),
|
|
357
|
+
);
|
|
358
|
+
logger.log(
|
|
359
|
+
chalk.gray(
|
|
360
|
+
` Prompt injections: ${skillBodies.contextLoads} loads / ` +
|
|
361
|
+
`${skillBodies.contextTokens} estimated context tokens`,
|
|
362
|
+
),
|
|
363
|
+
);
|
|
364
|
+
const activeBodies = [...skillBodies.entries]
|
|
365
|
+
.filter((entry) => entry.loads > 0 || entry.contextLoads > 0)
|
|
366
|
+
.sort(
|
|
367
|
+
(a, b) =>
|
|
368
|
+
b.contextTokens - a.contextTokens ||
|
|
369
|
+
b.loads - a.loads ||
|
|
370
|
+
a.id.localeCompare(b.id),
|
|
371
|
+
);
|
|
372
|
+
for (const entry of activeBodies.slice(0, 8)) {
|
|
373
|
+
logger.log(
|
|
374
|
+
chalk.gray(
|
|
375
|
+
` ${entry.id} [${entry.source}]: ${entry.estimatedTokens} token body; ` +
|
|
376
|
+
`${entry.cacheMisses} disk / ${entry.cacheHits} cache reads; ` +
|
|
377
|
+
`${entry.contextLoads} prompt loads / ${entry.contextTokens} tokens`,
|
|
378
|
+
),
|
|
379
|
+
);
|
|
380
|
+
}
|
|
381
|
+
if (activeBodies.length > 8) {
|
|
382
|
+
logger.log(
|
|
383
|
+
chalk.gray(` ... ${activeBodies.length - 8} more active bodies`),
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
const usedDescriptors = [...skillDescriptors.entries]
|
|
387
|
+
.filter((entry) => entry.contextLoads > 0)
|
|
388
|
+
.sort(
|
|
389
|
+
(a, b) =>
|
|
390
|
+
b.contextTokens - a.contextTokens ||
|
|
391
|
+
a.id.localeCompare(b.id),
|
|
392
|
+
);
|
|
393
|
+
for (const entry of usedDescriptors.slice(0, 8)) {
|
|
394
|
+
logger.log(
|
|
395
|
+
chalk.gray(
|
|
396
|
+
` descriptor ${entry.id} [${entry.source}]: ` +
|
|
397
|
+
`${entry.contextLoads} prompt returns / ${entry.contextTokens} tokens`,
|
|
398
|
+
),
|
|
399
|
+
);
|
|
400
|
+
}
|
|
401
|
+
if (usedDescriptors.length > 8) {
|
|
402
|
+
logger.log(
|
|
403
|
+
chalk.gray(
|
|
404
|
+
` ... ${usedDescriptors.length - 8} more used descriptors`,
|
|
405
|
+
),
|
|
406
|
+
);
|
|
407
|
+
}
|
|
341
408
|
}
|
|
342
409
|
if (sourceReport.optimizations.length > 0) {
|
|
343
410
|
logger.log("");
|
package/src/commands/hub.js
CHANGED
|
@@ -1626,6 +1626,25 @@ async function cmdSalvage(dumpfile, options) {
|
|
|
1626
1626
|
// the messages, and ingests them. The Android CollectQqNativeTool su-reads the
|
|
1627
1627
|
// DB + uid candidates, then invokes this. Same logic also runs on PC (USB).
|
|
1628
1628
|
// Plaintext is written to a temp file only for parsing, then deleted.
|
|
1629
|
+
function ingestQqParsedBatch(vault, parsed, conflictResolver) {
|
|
1630
|
+
if (!vault || typeof vault.putBatchResolved !== "function") {
|
|
1631
|
+
throw new Error(
|
|
1632
|
+
"collect-qq requires a vault with transactional putBatchResolved support",
|
|
1633
|
+
);
|
|
1634
|
+
}
|
|
1635
|
+
if (typeof conflictResolver !== "function") {
|
|
1636
|
+
throw new Error("collect-qq requires the QQ quality conflict resolver");
|
|
1637
|
+
}
|
|
1638
|
+
const batch = {
|
|
1639
|
+
events: Array.isArray(parsed) ? parsed : parsed?.events || [],
|
|
1640
|
+
persons: Array.isArray(parsed) ? [] : parsed?.persons || [],
|
|
1641
|
+
places: [],
|
|
1642
|
+
items: [],
|
|
1643
|
+
topics: Array.isArray(parsed) ? [] : parsed?.topics || [],
|
|
1644
|
+
};
|
|
1645
|
+
return vault.putBatchResolved(batch, { conflictResolver });
|
|
1646
|
+
}
|
|
1647
|
+
|
|
1629
1648
|
async function cmdCollectQq(options) {
|
|
1630
1649
|
const spinner = options.json
|
|
1631
1650
|
? null
|
|
@@ -1706,30 +1725,14 @@ async function cmdCollectQq(options) {
|
|
|
1706
1725
|
const events = Array.isArray(parsed) ? parsed : parsed.events || [];
|
|
1707
1726
|
const persons = Array.isArray(parsed) ? [] : parsed.persons || [];
|
|
1708
1727
|
const topics = Array.isArray(parsed) ? [] : parsed.topics || [];
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
for (const t of topics) {
|
|
1718
|
-
try {
|
|
1719
|
-
if (typeof vault.putTopic === "function") vault.putTopic(t);
|
|
1720
|
-
} catch {
|
|
1721
|
-
/* dup / optional */
|
|
1722
|
-
}
|
|
1723
|
-
}
|
|
1724
|
-
let ingested = 0;
|
|
1725
|
-
for (const ev of events) {
|
|
1726
|
-
try {
|
|
1727
|
-
vault.putEvent(ev);
|
|
1728
|
-
ingested++;
|
|
1729
|
-
} catch {
|
|
1730
|
-
/* skip dup/invalid */
|
|
1731
|
-
}
|
|
1732
|
-
}
|
|
1728
|
+
const qualityModule =
|
|
1729
|
+
options._qqQuality ||
|
|
1730
|
+
(await importPdh("@chainlesschain/personal-data-hub"));
|
|
1731
|
+
const conflictResolver =
|
|
1732
|
+
qualityModule.mergeQqEntityConflict ||
|
|
1733
|
+
qualityModule.default?.mergeQqEntityConflict;
|
|
1734
|
+
const ingestResult = ingestQqParsedBatch(vault, parsed, conflictResolver);
|
|
1735
|
+
const ingested = ingestResult.counts.events;
|
|
1733
1736
|
const report = {
|
|
1734
1737
|
ok: true,
|
|
1735
1738
|
matchedUid: result.uid,
|
|
@@ -1738,6 +1741,8 @@ async function cmdCollectQq(options) {
|
|
|
1738
1741
|
persons: persons.length,
|
|
1739
1742
|
topics: topics.length,
|
|
1740
1743
|
ingested,
|
|
1744
|
+
entityCounts: ingestResult.counts,
|
|
1745
|
+
resolvedConflicts: ingestResult.conflicts.length,
|
|
1741
1746
|
};
|
|
1742
1747
|
if (spinner) spinner.succeed(`collect-qq: ${ingested} QQ messages → vault`);
|
|
1743
1748
|
if (options.json) {
|
|
@@ -4338,4 +4343,5 @@ export const _internal = {
|
|
|
4338
4343
|
importEventsInto,
|
|
4339
4344
|
cmdExportEvents,
|
|
4340
4345
|
cmdImportEvents,
|
|
4346
|
+
ingestQqParsedBatch,
|
|
4341
4347
|
};
|
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.162.181",
|
|
7
|
+
"cliVersions": ["0.162.181"],
|
|
8
|
+
"date": "2026-07-26",
|
|
9
|
+
"title": "",
|
|
10
|
+
"sections": [
|
|
11
|
+
{
|
|
12
|
+
"heading": "Added — cc CLI 0.162.181 + PDH 0.4.57 + Agent SDK 0.1.7: sandbox contracts and complete collection",
|
|
13
|
+
"body": "> `chainlesschain` **0.162.181** bundles\n> `@chainlesschain/personal-data-hub` **0.4.57** and co-releases\n> `@chainlesschain/agent-sdk` **0.1.7** (2026-07-26).\n\n- **Enforced process boundaries**: the CLI process broker preserves native\n sandbox identity across foreground, detached, IPC, plugin hook, MCP, monitor,\n and LSP launches. Plugin manifests can require explicit sandbox boundaries,\n and Linux launches attest the primitives actually applied.\n- **Runtime and protocol convergence**: restore compatibility-shim exports,\n keep permission-decision fields stable in golden transcripts, and carry the\n current background-session and event-recovery contract through the Agent SDK.\n- **Complete resumable collection**: PDH adapters use explicit cursors and\n bounded page budgets across local databases, desktop clients, mobile APIs,\n maps, social, messaging, education, music, health, shopping, and travel\n sources. Partial or unreadable SQLite results now fail closed instead of\n silently advancing checkpoints.\n- **Release validation**: PDH 282 files / 4,528 tests, Agent SDK build plus\n 50 tests, CLI sandbox/plugin focused regression, Web Panel build, and\n isolated Git-worktree/WebSocket regressions passed before publication."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"productVersion": null,
|
|
19
|
+
"cliVersion": "0.162.180",
|
|
20
|
+
"cliVersions": ["0.162.180"],
|
|
21
|
+
"date": "2026-07-26",
|
|
22
|
+
"title": "",
|
|
23
|
+
"sections": [
|
|
24
|
+
{
|
|
25
|
+
"heading": "Added — cc CLI 0.162.180 + PDH 0.4.56: transactional multi-source ingest",
|
|
26
|
+
"body": "> `chainlesschain` **0.162.180** bundles\n> `@chainlesschain/personal-data-hub` **0.4.56** (2026-07-26).\n\n- **Transactional identity resolution**: adapters can persist source aliases,\n raw observations, and field-level conflict decisions in one transaction;\n entity resolution, KG, and RAG sinks now consume the exact persisted IDs and\n rewritten references.\n- **QQ NT evidence convergence**: direct database reads and Python sidecar\n decoding share canonical message identities while retaining both raw\n observations. Rich decoded text and mutable read state merge without losing\n older evidence, and pre-upgrade rows are rekeyed instead of duplicated.\n- **Reliable bounded sync**: harden cancellation, checkpoint, lookback, and\n resume boundaries for long-running sidecars plus Android and Windows\n incremental collectors.\n- **Release validation**: 253 PDH test files / 4215 tests, the focused\n multi-source ingest suite, and 110 Python bridge tests passed before release."
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
4
30
|
{
|
|
5
31
|
"productVersion": null,
|
|
6
32
|
"cliVersion": "0.162.179",
|
|
@@ -23,7 +49,7 @@
|
|
|
23
49
|
"sections": [
|
|
24
50
|
{
|
|
25
51
|
"heading": "Fixed — cc CLI 0.162.178 + IDE provider 403 diagnosis hotfix",
|
|
26
|
-
"body": "- Preserve structured provider error codes/messages for failed LLM requests and\n `cc llm test`, with credential-shaped text redacted before display.\n- Do not classify every HTTP 403 as an invalid API key: overdue accounts,\n billing failures, and model-access denials now retain their real corrective\n action in CLI, VS Code, and JetBrains.\n- Release VS Code 0.37.33 and JetBrains 0.4.
|
|
52
|
+
"body": "- Preserve structured provider error codes/messages for failed LLM requests and\n `cc llm test`, with credential-shaped text redacted before display.\n- Do not classify every HTTP 403 as an invalid API key: overdue accounts,\n billing failures, and model-access denials now retain their real corrective\n action in CLI, VS Code, and JetBrains.\n- Release VS Code 0.37.33 and JetBrains 0.4.71 with corrected setup guidance;\n JetBrains 0.4.70 was deleted during Marketplace review and superseded after\n clearing the IntelliJ 2026.2 internal-API warning.\n- Prepare JetBrains 0.4.72 so `/status` and the other live-session slash\n commands use the same routing, output, aliases, arguments, and help text as\n the VS Code panel, including `/expand` reasoning-block toggling."
|
|
27
53
|
}
|
|
28
54
|
]
|
|
29
55
|
},
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
* log, latestSeq, [reattached, replayed,
|
|
13
13
|
* replayTruncated]}
|
|
14
14
|
* bg-prompt {bgId, text} → {type:"bg-prompt", bgId, sent}
|
|
15
|
+
* bg-answer {bgId, requestId, binding, answer}
|
|
16
|
+
* → {type:"bg-answer", bgId, sent}
|
|
15
17
|
* bg-stop-turn {bgId} → {type:"bg-stop-turn", bgId, sent}
|
|
16
18
|
* bg-detach {bgId} → {type:"bg-detach", bgId}
|
|
17
19
|
* bg-stop {bgId} → {type:"bg-stop", session} (kill whole session)
|
|
@@ -340,6 +342,42 @@ export async function handleBgPrompt(server, clientId, id, ws, message) {
|
|
|
340
342
|
server._send(ws, { id, type: "bg-prompt", bgId: message.bgId, sent });
|
|
341
343
|
}
|
|
342
344
|
|
|
345
|
+
export async function handleBgAnswer(server, clientId, id, ws, message) {
|
|
346
|
+
const entry = requireAttachment(server, clientId, id, ws, message);
|
|
347
|
+
if (!entry) return;
|
|
348
|
+
const requestId = String(message.requestId || "");
|
|
349
|
+
if (!requestId) {
|
|
350
|
+
return sendError(server, id, ws, "NO_REQUEST_ID", "requestId required");
|
|
351
|
+
}
|
|
352
|
+
if (
|
|
353
|
+
!message.binding ||
|
|
354
|
+
typeof message.binding !== "object" ||
|
|
355
|
+
Array.isArray(message.binding)
|
|
356
|
+
) {
|
|
357
|
+
return sendError(
|
|
358
|
+
server,
|
|
359
|
+
id,
|
|
360
|
+
ws,
|
|
361
|
+
"NO_INTERACTION_BINDING",
|
|
362
|
+
"interaction binding required",
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
const sent = entry.conn.send({
|
|
366
|
+
type: "interaction_response",
|
|
367
|
+
requestId,
|
|
368
|
+
binding: message.binding,
|
|
369
|
+
answer: message.answer,
|
|
370
|
+
...(message.error ? { error: message.error } : {}),
|
|
371
|
+
});
|
|
372
|
+
server._send(ws, {
|
|
373
|
+
id,
|
|
374
|
+
type: "bg-answer",
|
|
375
|
+
bgId: message.bgId,
|
|
376
|
+
requestId,
|
|
377
|
+
sent,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
|
|
343
381
|
export async function handleBgStopTurn(server, clientId, id, ws, message) {
|
|
344
382
|
const entry = requireAttachment(server, clientId, id, ws, message);
|
|
345
383
|
if (!entry) return;
|
|
@@ -182,6 +182,7 @@ export function createWsMessageDispatcher(server) {
|
|
|
182
182
|
"bg-view": () => server._handleBgView(id, ws, message),
|
|
183
183
|
"bg-attach": () => server._handleBgAttach(clientId, id, ws, message),
|
|
184
184
|
"bg-prompt": () => server._handleBgPrompt(clientId, id, ws, message),
|
|
185
|
+
"bg-answer": () => server._handleBgAnswer(clientId, id, ws, message),
|
|
185
186
|
"bg-stop-turn": () =>
|
|
186
187
|
server._handleBgStopTurn(clientId, id, ws, message),
|
|
187
188
|
"bg-detach": () => server._handleBgDetach(clientId, id, ws, message),
|
|
@@ -12,12 +12,15 @@ import { RemoteCommandLedger } from "../../harness/remote-command-ledger.js";
|
|
|
12
12
|
import {
|
|
13
13
|
ORIGIN,
|
|
14
14
|
assertCanApprove,
|
|
15
|
+
assertCanAnswerInteraction,
|
|
15
16
|
describeAuthorityChain,
|
|
16
17
|
} from "../../lib/agent-authority.js";
|
|
18
|
+
import { hasCompleteInteractionBinding } from "../../lib/interaction-binding.js";
|
|
17
19
|
|
|
18
20
|
const CLIENT_EVENT_SCOPES = Object.freeze({
|
|
19
21
|
prompt: "prompt",
|
|
20
22
|
"approval.resolve": "approve",
|
|
23
|
+
"question.answer": "prompt",
|
|
21
24
|
interrupt: "interrupt",
|
|
22
25
|
});
|
|
23
26
|
|
|
@@ -30,7 +33,8 @@ function audit(server, entry) {
|
|
|
30
33
|
}
|
|
31
34
|
|
|
32
35
|
/**
|
|
33
|
-
* Apply a remote-client control event (prompt / approval.resolve /
|
|
36
|
+
* Apply a remote-client control event (prompt / approval.resolve /
|
|
37
|
+
* question.answer / interrupt)
|
|
34
38
|
* idempotently when it carries a stable `commandId`. This is the ACTUAL takeover
|
|
35
39
|
* path — a paired mobile/web device driving the host agent — and it does NOT
|
|
36
40
|
* flow through message-dispatcher's execute/stream ledger, so without this a
|
|
@@ -448,7 +452,7 @@ export async function handleRemoteSessionPublish(
|
|
|
448
452
|
requiredScope || "observe",
|
|
449
453
|
);
|
|
450
454
|
// Runtime/output events are host-only. Remote clients may publish only the
|
|
451
|
-
//
|
|
455
|
+
// explicitly scoped control event types above.
|
|
452
456
|
if (!requiredScope && session.hostClientId !== clientId) {
|
|
453
457
|
throw new Error("Only the host can publish runtime events");
|
|
454
458
|
}
|
|
@@ -468,6 +472,24 @@ export async function handleRemoteSessionPublish(
|
|
|
468
472
|
) {
|
|
469
473
|
throw new Error("prompt content is required");
|
|
470
474
|
}
|
|
475
|
+
if (message.event.type === "question.answer") {
|
|
476
|
+
if (
|
|
477
|
+
typeof message.event.requestId !== "string" ||
|
|
478
|
+
!message.event.requestId
|
|
479
|
+
) {
|
|
480
|
+
throw new Error("question requestId is required");
|
|
481
|
+
}
|
|
482
|
+
if (!hasCompleteInteractionBinding(message.event.binding)) {
|
|
483
|
+
throw new Error("complete question binding is required");
|
|
484
|
+
}
|
|
485
|
+
assertCanAnswerInteraction({
|
|
486
|
+
origin: ORIGIN.REMOTE,
|
|
487
|
+
authenticated: true,
|
|
488
|
+
scopes: ["prompt"],
|
|
489
|
+
principalId: clientId,
|
|
490
|
+
sessionId: message.remoteSessionId,
|
|
491
|
+
});
|
|
492
|
+
}
|
|
471
493
|
// Authority (§"权限来源与跨 Agent 授权边界"): a remote *approve* is honored
|
|
472
494
|
// only from an authenticated, approve-scoped device — the SINGLE
|
|
473
495
|
// authoritative rule, not just the per-device scope check above, so the
|
|
@@ -531,7 +553,9 @@ export async function handleRemoteSessionPublish(
|
|
|
531
553
|
? "control.prompt"
|
|
532
554
|
: message.event.type === "approval.resolve"
|
|
533
555
|
? "control.approval"
|
|
534
|
-
: "
|
|
556
|
+
: message.event.type === "question.answer"
|
|
557
|
+
? "control.question"
|
|
558
|
+
: "control.interrupt";
|
|
535
559
|
audit(server, {
|
|
536
560
|
sessionId: message.remoteSessionId,
|
|
537
561
|
actor: clientId,
|
|
@@ -548,11 +572,23 @@ export async function handleRemoteSessionPublish(
|
|
|
548
572
|
authority: describeAuthorityChain(approvalEnvelope || {}),
|
|
549
573
|
forwarded: true,
|
|
550
574
|
}
|
|
551
|
-
:
|
|
575
|
+
: message.event.type === "question.answer"
|
|
576
|
+
? {
|
|
577
|
+
requestId: message.event.requestId,
|
|
578
|
+
authority: describeAuthorityChain({
|
|
579
|
+
origin: ORIGIN.REMOTE,
|
|
580
|
+
authenticated: true,
|
|
581
|
+
scopes: ["prompt"],
|
|
582
|
+
principalId: clientId,
|
|
583
|
+
sessionId: message.remoteSessionId,
|
|
584
|
+
}),
|
|
585
|
+
forwarded: true,
|
|
586
|
+
}
|
|
587
|
+
: { forwarded: true },
|
|
552
588
|
});
|
|
553
589
|
// Hand the event to the host process. `message.event` carries any
|
|
554
|
-
// echoed approval binding, so the host gate can
|
|
555
|
-
// tampered verdict.
|
|
590
|
+
// echoed approval or interaction binding, so the host gate can
|
|
591
|
+
// reject a stale / tampered verdict.
|
|
556
592
|
server._send(hostTarget.ws, {
|
|
557
593
|
type: "remote-session-control",
|
|
558
594
|
remoteSessionId: message.remoteSessionId,
|
|
@@ -599,6 +635,29 @@ export async function handleRemoteSessionPublish(
|
|
|
599
635
|
// a verdict whose binding doesn't match the pending request.
|
|
600
636
|
binding: message.event.binding ?? null,
|
|
601
637
|
});
|
|
638
|
+
} else if (message.event.type === "question.answer") {
|
|
639
|
+
const authority = {
|
|
640
|
+
origin: ORIGIN.REMOTE,
|
|
641
|
+
authenticated: true,
|
|
642
|
+
scopes: ["prompt"],
|
|
643
|
+
principalId: clientId,
|
|
644
|
+
sessionId: message.remoteSessionId,
|
|
645
|
+
};
|
|
646
|
+
audit(server, {
|
|
647
|
+
sessionId: message.remoteSessionId,
|
|
648
|
+
actor: clientId,
|
|
649
|
+
action: "control.question",
|
|
650
|
+
detail: {
|
|
651
|
+
requestId: message.event.requestId,
|
|
652
|
+
authority: describeAuthorityChain(authority),
|
|
653
|
+
},
|
|
654
|
+
});
|
|
655
|
+
await handleSessionAnswer(server, message.id, ws, {
|
|
656
|
+
...controlMessage,
|
|
657
|
+
requestId: message.event.requestId,
|
|
658
|
+
answer: message.event.answer ?? null,
|
|
659
|
+
binding: message.event.binding,
|
|
660
|
+
});
|
|
602
661
|
} else if (message.event.type === "interrupt") {
|
|
603
662
|
audit(server, {
|
|
604
663
|
sessionId: message.remoteSessionId,
|
|
@@ -95,6 +95,7 @@ import {
|
|
|
95
95
|
import { handleLlmChat } from "./llm-chat-protocol.js";
|
|
96
96
|
import {
|
|
97
97
|
cleanupBgAttachments,
|
|
98
|
+
handleBgAnswer,
|
|
98
99
|
handleBgAttach,
|
|
99
100
|
handleBgDetach,
|
|
100
101
|
handleBgList,
|
|
@@ -569,7 +570,8 @@ export class ChainlessChainWSServer extends EventEmitter {
|
|
|
569
570
|
}
|
|
570
571
|
const rulesMod = await import("../../lib/permission-rules.cjs");
|
|
571
572
|
const mod = rulesMod.default || rulesMod;
|
|
572
|
-
if (!mod.parseRule(message.rule))
|
|
573
|
+
if (!mod.parseRule(message.rule))
|
|
574
|
+
throw new Error("invalid permission rule");
|
|
573
575
|
const { addRule } = await import("../../lib/settings-loader.cjs");
|
|
574
576
|
const scope = ["project", "local", "user"].includes(message.scope)
|
|
575
577
|
? message.scope
|
|
@@ -767,6 +769,11 @@ export class ChainlessChainWSServer extends EventEmitter {
|
|
|
767
769
|
return handleBgPrompt(this, clientId, id, ws, message);
|
|
768
770
|
}
|
|
769
771
|
|
|
772
|
+
/** @private — answer a bound interaction in an attached background session */
|
|
773
|
+
async _handleBgAnswer(clientId, id, ws, message) {
|
|
774
|
+
return handleBgAnswer(this, clientId, id, ws, message);
|
|
775
|
+
}
|
|
776
|
+
|
|
770
777
|
/** @private — stop the current turn of an attached background session */
|
|
771
778
|
async _handleBgStopTurn(clientId, id, ws, message) {
|
|
772
779
|
return handleBgStopTurn(this, clientId, id, ws, message);
|
|
@@ -17,6 +17,8 @@ import { withFileLock } from "../lib/with-file-lock.js";
|
|
|
17
17
|
import { getConfigPath } from "../lib/paths.js";
|
|
18
18
|
import { createHash } from "node:crypto";
|
|
19
19
|
import { hostname } from "node:os";
|
|
20
|
+
import { mkdirSync } from "node:fs";
|
|
21
|
+
import { dirname } from "node:path";
|
|
20
22
|
|
|
21
23
|
const FLAG_REGISTRY = {
|
|
22
24
|
BACKGROUND_TASKS: {
|
|
@@ -115,14 +117,19 @@ export function listFeatures() {
|
|
|
115
117
|
export function setFeature(name, value) {
|
|
116
118
|
// Serialize the read-modify-write across processes so two concurrent
|
|
117
119
|
// `cc config features enable/disable` invocations don't clobber each other
|
|
118
|
-
// (and to space out writes so the atomic rename doesn't collide).
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
120
|
+
// (and to space out writes so the atomic rename doesn't collide).
|
|
121
|
+
const configPath = getConfigPath();
|
|
122
|
+
mkdirSync(dirname(configPath), { recursive: true });
|
|
123
|
+
withFileLock(
|
|
124
|
+
configPath,
|
|
125
|
+
() => {
|
|
126
|
+
const config = loadConfig({ failIfUnavailable: true });
|
|
127
|
+
if (!config.features) config.features = {};
|
|
128
|
+
config.features[name] = value;
|
|
129
|
+
saveConfig(config);
|
|
130
|
+
},
|
|
131
|
+
{ failIfUnavailable: true },
|
|
132
|
+
);
|
|
126
133
|
}
|
|
127
134
|
|
|
128
135
|
export function getFlagInfo(name) {
|