chainlesschain 0.162.174 → 0.162.176
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 +10 -10
- package/src/assets/web-panel/assets/{AIOps-Dcl-X1Hw.js → AIOps-BDLu5Elz.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-ClMh9HzT.js → ActionButton-DH5us-CK.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DPj0rSQ5.js → Analytics-BZ0u8IFG.js} +3 -3
- package/src/assets/web-panel/assets/AppLayout-Duu8xR14.js +9 -0
- package/src/assets/web-panel/assets/{Artifacts-L8781rE8.js → Artifacts-Br2YBbh_.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CffB6WIP.js → Audit-C3C6a482.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BkLhayyY.js → BackgroundAgents-CzHvebcj.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BQnwFI78.js → Backup-DZNHYDFd.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-xuUGHQch.js → BaseInput-VRiC4fIx.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-feQXwWrg.js → Chat-Cm08WWAD.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-CGHYrugQ.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-DVaIiUGW.js → Checkbox-DtByk7d7.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-D2kEnzeU.js → Codegen-CphXXOfD.js} +1 -1
- package/src/assets/web-panel/assets/{Col-azDoyusS.js → Col-Hz86TnLR.js} +1 -1
- package/src/assets/web-panel/assets/{Community-OZdnPWM5.js → Community-HP03ltpD.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-VDMvBN-C.js → Compact-B_N1mqQz.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CPJ_zgQ1.js → Compliance-CVztRpi8.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-iRBwcsOA.js → Cowork-wUVOyZih.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-DrxrspUz.js → Cron-DW5TLJKw.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-D-rkAZXF.js → Crosschain-CrAFGhWH.js} +1 -1
- package/src/assets/web-panel/assets/{DID-5Pp1Xnmr.js → DID-pA-oD8ke.js} +2 -2
- package/src/assets/web-panel/assets/Dashboard-CXrd5gAw.js +3 -0
- package/src/assets/web-panel/assets/{Dropdown-BWj_E0Ie.js → Dropdown-EweJcsek.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BT-wgSEh.js → EmailListRenderer-C9xVLPG4.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-1PzH23pa.js → FamilyGuardDashboard-CDcEEqlu.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BxMIXGC6.js → Federation-DtZda9A_.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CyJobBln.js → FormItemContext-CiYdcVz3.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-YkjFuQTN.js → GenericCardRenderer-DA13uwA0.js} +1 -1
- package/src/assets/web-panel/assets/{Git-C2a98Wp_.js → Git-DzRhZD1O.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DKL3Fl84.js → Governance-D5RMgOSb.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BJ2cQC_3.js → Inference-BgrPfSNk.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DBAsOngt.js → KnowledgeGraph-DzjnD571.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-COt8g9LO.js → Logs-BhWzVDtN.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-3Lfht1Fd.js → MarkdownRenderer-BDape9cx.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-C9Zk9Pb2.js → Marketplace-DJtL5GV7.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DDWDFWPO.js → McpTools-CZcQygI7.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-BRmVye_o.js → Memory-DUWSDUUu.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CppBbWpD.js → MobileBridge-BTwq2WKY.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-NZvvfDME.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-CcWpeGa6.js → Mtc-BiGugEQm.js} +6 -6
- package/src/assets/web-panel/assets/{MtcAudit-BcllEq0K.js → MtcAudit-DY7a6gUe.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-BFD1CarL.js → Multisig-BQbDu_w7.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-QNXXYvjz.js → NLProgramming-CM2wXTLv.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-07YwgQVy.js → Notes-DI6gGs1v.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-bOccEInE.js → NotificationSettings-BsZOLWAB.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DlRi29WL.js → OrderTableRenderer-C48mu09U.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CBaezzEr.js → Organization-Cds0_tXr.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Bl5NohFO.js → Overflow-WunYMD87.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CLMal9Aw.js → P2P-Bo6j4DDv.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CGO0NITk.js → PdhVaultBrowser-Bh2XPD5f.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CPSw48E2.js → Permissions-EMvMMC8N.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-CDM5n134.js → PersonalDataHub-AX3ypUDV.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-BdsqG7WV.js → Pipeline-BOx8HOgL.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-B6L4E-M7.js → Privacy-tBeTVQVM.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DXPyZKRs.js → ProjectInit-CVYg1W4M.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BrCC3xYT.js → ProjectSettings-Dvt5I7y1.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BYmuHC2q.js → Projects-Cc7FC9-e.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-CbCe2eUl.js → Providers-Ct8xqY-E.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DkukgCrR.js → QrScannerModal-Cni8Ooja.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-D-htOrV8.js → QuickAsk-BJVLKdxr.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Bm7SIfzu.js → Recommend-DPG8Rbbm.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-C9rP-iMc.js → RemoteSession-DsdR7dCt.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-kGlUgbsl.js → Reputation-Csg1YM-b.js} +1 -1
- package/src/assets/web-panel/assets/{Row-PBupbbUA.js → Row-D9DoFoEf.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-njlwKUGK.js → RssFeed-BsvKrXMS.js} +2 -2
- package/src/assets/web-panel/assets/{Search-DLdEmgBw.js → Search-DFUStfgQ.js} +1 -1
- package/src/assets/web-panel/assets/{Security-SXGPSHdu.js → Security-ILg1zxdK.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CuFGnNsb.js → Services-Dd41PCaY.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CtUC0mDa.js → Skeleton-Bzo1cN80.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-P1qgOVFn.js → Skills-BDHh17P0.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CsppE8YV.js → Sla-jl7UTiRY.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Cq1oG56m.js → SpeechSettings-BePa-RF6.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DdKW6V-C.js → SyncSettings-DiqqDKGZ.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BCc9san5.js → Tasks-DYQ_6lxj.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CcHC1dMA.js → Templates-JiDeI06L.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CA4PqU22.js → Tenant-hhgI6zwS.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-CjTZPa37.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-DHWTSvOy.js → TimelineRenderer-B8uB5Llk.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Ddz-P_yh.js → Tokens-C3b_6r2z.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-ePmrmLZ1.js → Trigger-tIP7HKVe.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DmuK1CCE.js → Trust-vjoc11vJ.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CqqBuRrT.js → UkeySign-DUPBnGuH.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BGlR3uWM.js → VideoEditing-CBvhUY5T.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Ba_Qx6Ga.js → Wallet-DUaQ0uA5.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-29neXKt2.js → WebAuthn-DllSivjE.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-lD0lR0UQ.js → WorkflowEditor-xc8D3uO6.js} +1 -1
- package/src/assets/web-panel/assets/{chat-B3stH01u.js → chat-BVicU7oA.js} +1 -1
- package/src/assets/web-panel/assets/{colors-Czly56MN.js → colors-DJzLmhLm.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-C0TkbkAJ.js → compact-item-BvYRfThE.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BJmpSlf1.js → createContext-DGXxCBKR.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BT46Y_QI.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-D1q-zw7u.js → hasIn-SBDJB1y4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DV-twjNO.js → index-1SdDS6lR.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-kTvMq7.js → index-9gdI7uUW.js} +1 -1
- package/src/assets/web-panel/assets/index-B7nuIywP.js +1 -0
- package/src/assets/web-panel/assets/{index-Bm_-RKal.js → index-BJZf9DhV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQftlZn-.js → index-BO1itZaY.js} +3 -3
- package/src/assets/web-panel/assets/{index-Dw3L_smW.js → index-BTrBGBJs.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7sFKQ53.js → index-BYqz4Wrr.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlvsSuBC.js → index-Bf-ctERC.js} +1 -1
- package/src/assets/web-panel/assets/{index-ChESIe5r.js → index-CKyEivf8.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaqEHaCg.js → index-CdGY9P8a.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZeoKL6t.js → index-Cf-O_g_8.js} +1 -1
- package/src/assets/web-panel/assets/{index-XWV8JWMc.js → index-CloCgBUR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpMIdPJ0.js → index-CoJAO1Lm.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgS8XUBU.js → index-Crk5NTb0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmUta2lw.js → index-Cs2rmLFt.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dpz_7sf-.js → index-CtwqO5qo.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRcQsPez.js → index-D7HimK0M.js} +1 -1
- package/src/assets/web-panel/assets/{index-BEt2-3x5.js → index-DCdRAgjy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CHvPlzWJ.js → index-DCqRS6da.js} +1 -1
- package/src/assets/web-panel/assets/{index-BDHXx65P.js → index-DHVLJ8q0.js} +1 -1
- package/src/assets/web-panel/assets/{index-K4YaPDOn.js → index-DKrvvWm4.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1pOqU7D.js → index-DMarmfrv.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAhrn9EJ.js → index-DRfiXB_p.js} +1 -1
- package/src/assets/web-panel/assets/{index-cPjWjvmW.js → index-Dm_77jgR.js} +1 -1
- package/src/assets/web-panel/assets/{index-C27TnOoT.js → index-DnjPdvR6.js} +1 -1
- package/src/assets/web-panel/assets/{index-upY9rkGZ.js → index-DonCnfMr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbvNJUwu.js → index-DvUTDYXX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVwJ3jht.js → index-FxZzRyE1.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIF6XHIi.js → index-MjC4G09d.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8KqsomG.js → index-VMfwIH5G.js} +1 -1
- package/src/assets/web-panel/assets/{index-8GKykbS4.js → index-YJkzy8ZF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpGs96FC.js → index-d5BVd-cL.js} +1 -1
- package/src/assets/web-panel/assets/{index-DO8xOwxi.js → index-e4fXH_WO.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cu_4HaUS.js → index-hxTODbM1.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cf7Gr3NG.js → index-lpaGoTH3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBqAm8es.js → index-wcCL-miV.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZDUhX41Z.js → index-xfluRkCT.js} +1 -1
- package/src/assets/web-panel/assets/index-ycwAfC-i.js +1 -0
- package/src/assets/web-panel/assets/{index-z8ATo2aQ.js → index-z1ZylsLq.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-QWEXi6-t.js → initDefaultProps-C1zO1KnY.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BfrQwvV1.js → motion-CWLtEGmC.js} +1 -1
- package/src/assets/web-panel/assets/{move-Dn7x0H9t.js → move-DzD_C3Vm.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-F61D_TgE.js → mtc-parser-D880PYJl.js} +1 -1
- package/src/assets/web-panel/assets/{omit-4SQZ39PF.js → omit-CFR_z2ov.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-C7DTe126.js → pickAttrs-srIhgrSC.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-40NeyzDK.js → placementArrow-C1rXpibP.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BiUJ6qWs.js → responsiveObserve-C30gRcSS.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CacJTM3f.js → slide-CvtKiMfV.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-K812HB-k.js → statusUtils-DNHO7ITG.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CKeHA2eM.js → styleChecker-Dt_Sl-g4.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CKl4FqXF.js → useFlexGapSupport-Cjev42Gh.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DPoiJjSZ.js → useFs-Baxglj2V.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-aHwBspmt.js → usePersonalDataHub-B4NkcLaP.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DrA-GuCT.js → vnode-mIRkdT7o.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-G3LMswgy.js → zoom-HzI5DlH_.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/auth/npm-auth.js +30 -5
- package/src/commands/agenda.js +64 -2
- package/src/commands/agent.js +45 -3
- package/src/commands/background-session.js +103 -0
- package/src/commands/config.js +70 -5
- package/src/commands/context.js +36 -2
- package/src/commands/hub.js +19 -1
- package/src/commands/memory.js +21 -6
- package/src/commands/permissions.js +57 -1
- package/src/commands/plugin.js +2 -0
- package/src/commands/review.js +23 -11
- package/src/commands/routine.js +31 -8
- package/src/commands/session.js +11 -3
- package/src/commands/team.js +20 -7
- package/src/commands/update.js +65 -10
- package/src/esm-bridge.js +3 -0
- package/src/gateways/terminal/PtyManager.js +8 -1
- package/src/gateways/ws/message-dispatcher.js +3 -0
- package/src/gateways/ws/session-protocol.js +26 -0
- package/src/gateways/ws/ws-agent-handler.js +107 -69
- package/src/gateways/ws/ws-server.js +92 -4
- package/src/harness/jsonl-session-store.js +13 -6
- package/src/harness/mcp-client.js +200 -1
- package/src/index.js +123 -55
- package/src/lazy-dispatch.js +86 -85
- package/src/lib/__tests__/personal-data-hub-aichat-wizard.test.js +15 -0
- package/src/lib/agent-coordinator.js +4 -0
- package/src/lib/agent-ipc-bus.js +32 -2
- package/src/lib/agent-sandbox.js +16 -2
- package/src/lib/agent-schedule-store.js +55 -0
- package/src/lib/agent-tool-admission.js +104 -0
- package/src/lib/api-key-helper.js +10 -2
- package/src/lib/async-hook-supervisor.cjs +26 -4
- package/src/lib/background-interaction-resolver.js +71 -0
- package/src/lib/background-session-transport.js +59 -1
- package/src/lib/changelog.js +19 -11
- package/src/lib/channels/channel-manager.js +6 -0
- package/src/lib/channels/telegram-channel.js +11 -1
- package/src/lib/channels/webhook-channel.js +15 -3
- package/src/lib/checkpoint-store.js +10 -2
- package/src/lib/cloud/bundle.js +12 -2
- package/src/lib/code-review.js +32 -8
- package/src/lib/computer-use/control-backend.js +18 -3
- package/src/lib/context-breakdown.js +46 -0
- package/src/lib/context-source-ledger.js +43 -0
- package/src/lib/crash-reporter.js +6 -0
- package/src/lib/diff-review-follow-up.js +154 -0
- package/src/lib/downloader.js +17 -3
- package/src/lib/ensure-utf8.js +11 -3
- package/src/lib/event-runtime-producer.js +58 -0
- package/src/lib/event-runtime-store.js +354 -0
- package/src/lib/event-runtime-worker.js +109 -0
- package/src/lib/execution-backend.js +72 -21
- package/src/lib/git-integration.js +19 -4
- package/src/lib/hook-manager.js +34 -15
- package/src/lib/hook-runner.cjs +48 -3
- package/src/lib/hooks-v2-producers.js +15 -0
- package/src/lib/hooks-v2-runtime.js +70 -21
- package/src/lib/host-adb-bridge.js +111 -21
- package/src/lib/ide-context.js +128 -1
- package/src/lib/interaction-adapter.js +39 -0
- package/src/lib/ipc-attach-protocol.js +98 -0
- package/src/lib/json-schema-validate.js +190 -36
- package/src/lib/lan-pairing-preflight.js +13 -2
- package/src/lib/lsp/__tests__/lsp-server-registry.test.js +18 -0
- package/src/lib/lsp/lsp-client.js +18 -1
- package/src/lib/lsp/lsp-manager.js +4 -0
- package/src/lib/lsp/lsp-server-registry.js +11 -0
- package/src/lib/mcp-oauth.js +8 -2
- package/src/lib/npm-invocation.js +29 -0
- package/src/lib/packer/pkg-runner.js +13 -2
- package/src/lib/packer/precheck.js +33 -16
- package/src/lib/packer/web-panel-builder.js +16 -2
- package/src/lib/permission-rules.cjs +5 -1
- package/src/lib/personal-data-hub-aichat-wizard.js +22 -6
- package/src/lib/personal-data-hub-wiring.js +27 -3
- package/src/lib/plan-mode.js +204 -11
- package/src/lib/plugin-monitor-supervisor.js +39 -4
- package/src/lib/plugin-runtime/bin.js +45 -0
- package/src/lib/plugin-runtime/hooks.js +14 -1
- package/src/lib/plugin-runtime/install.js +2 -1
- package/src/lib/plugin-runtime/lsp.js +3 -0
- package/src/lib/plugin-runtime/mcp.js +8 -1
- package/src/lib/plugin-runtime/monitors.js +4 -0
- package/src/lib/plugin-runtime/plugin-options.js +74 -7
- package/src/lib/plugin-runtime/signature.js +45 -0
- package/src/lib/pr-create.js +21 -8
- package/src/lib/pr-link-ledger.js +15 -3
- package/src/lib/process-execution-broker/credential-agent.js +295 -0
- package/src/lib/process-execution-broker/index.js +440 -14
- package/src/lib/process-execution-broker/patch-child-process.js +2 -3
- package/src/lib/process-execution-broker/platform-sandbox.js +351 -0
- package/src/lib/process-manager.js +18 -3
- package/src/lib/provenance-api.js +6 -0
- package/src/lib/proxy-bootstrap.js +19 -0
- package/src/lib/publish-workspace.js +14 -6
- package/src/lib/repl-rewind.js +9 -4
- package/src/lib/secret-store.js +159 -0
- package/src/lib/service-manager.js +64 -29
- package/src/lib/session-hooks.js +328 -473
- package/src/lib/session-telemetry-middleware.js +6 -0
- package/src/lib/settings-hook-events.cjs +61 -1
- package/src/lib/settings-hooks.cjs +4 -0
- package/src/lib/side-effect-ledger.js +22 -0
- package/src/lib/sub-agent-context.js +5 -0
- package/src/lib/sub-agent-profiles.js +4 -0
- package/src/lib/trace-api.js +6 -0
- package/src/lib/turn-context.js +14 -8
- package/src/lib/unattended-action-policy.js +83 -0
- package/src/lib/update-notice.js +9 -45
- package/src/lib/with-file-lock.js +7 -0
- package/src/lib/ws-server.js +1 -0
- package/src/repl/agent-repl.js +71 -13
- package/src/repl/clipboard-copy.js +8 -2
- package/src/repl/pr-comments.js +30 -7
- package/src/runtime/agent-core.js +439 -87
- package/src/runtime/agent-runtime.js +1 -0
- package/src/runtime/coding-agent-contract-shared.cjs +52 -0
- package/src/runtime/coding-agent-policy.cjs +20 -0
- package/src/runtime/diagnostics.js +73 -8
- package/src/runtime/headless-runner.js +63 -0
- package/src/runtime/headless-stream.js +269 -17
- package/src/runtime/mcp-config.js +16 -1
- package/src/workers/background-agent-worker.js +80 -1
- package/src/assets/web-panel/assets/AppLayout-7iSKDmlI.js +0 -9
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DcbUHeGW.js +0 -1
- package/src/assets/web-panel/assets/Dashboard-BAKYNavw.js +0 -3
- package/src/assets/web-panel/assets/MobileProjects-C4GKn1dH.js +0 -1
- package/src/assets/web-panel/assets/Terminal-Fj7ea0In.js +0 -3
- package/src/assets/web-panel/assets/devWarning-CDI8Sbaj.js +0 -1
- package/src/assets/web-panel/assets/index-96LBR96V.js +0 -1
- package/src/assets/web-panel/assets/index-DyQkiW24.js +0 -1
package/src/assets/web-panel/assets/{responsiveObserve-BiUJ6qWs.js → responsiveObserve-C30gRcSS.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{J as o,h}from"./index-
|
|
1
|
+
import{J as o,h}from"./index-BO1itZaY.js";import{b as x}from"./vendor-Bn1JzzAn.js";const v=["xxxl","xxl","xl","lg","md","sm","xs"],p=r=>({xs:`(max-width: ${r.screenXSMax}px)`,sm:`(min-width: ${r.screenSM}px)`,md:`(min-width: ${r.screenMD}px)`,lg:`(min-width: ${r.screenLG}px)`,xl:`(min-width: ${r.screenXL}px)`,xxl:`(min-width: ${r.screenXXL}px)`,xxxl:`{min-width: ${r.screenXXXL}px}`});function w(){const[,r]=o();return x(()=>{const n=p(r.value),i=new Map;let a=-1,c={};return{matchHandlers:{},dispatch(e){return c=e,i.forEach(t=>t(c)),i.size>=1},subscribe(e){return i.size||this.register(),a+=1,i.set(a,e),e(c),a},unsubscribe(e){i.delete(e),i.size||this.unregister()},unregister(){Object.keys(n).forEach(e=>{const t=n[e],s=this.matchHandlers[t];s?.mql.removeListener(s?.listener)}),i.clear()},register(){Object.keys(n).forEach(e=>{const t=n[e],s=l=>{let{matches:m}=l;this.dispatch(h(h({},c),{[e]:m}))},d=window.matchMedia(t);d.addListener(s),this.matchHandlers[t]={mql:d,listener:s},s(d)})},responsiveMap:n}})}export{v as r,w as u};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{K as n}from"./index-
|
|
1
|
+
import{K as n}from"./index-BO1itZaY.js";import{i as e}from"./motion-CWLtEGmC.js";const m=new n("antSlideUpIn",{"0%":{transform:"scaleY(0.8)",transformOrigin:"0% 0%",opacity:0},"100%":{transform:"scaleY(1)",transformOrigin:"0% 0%",opacity:1}}),f=new n("antSlideUpOut",{"0%":{transform:"scaleY(1)",transformOrigin:"0% 0%",opacity:1},"100%":{transform:"scaleY(0.8)",transformOrigin:"0% 0%",opacity:0}}),c=new n("antSlideDownIn",{"0%":{transform:"scaleY(0.8)",transformOrigin:"100% 100%",opacity:0},"100%":{transform:"scaleY(1)",transformOrigin:"100% 100%",opacity:1}}),l=new n("antSlideDownOut",{"0%":{transform:"scaleY(1)",transformOrigin:"100% 100%",opacity:1},"100%":{transform:"scaleY(0.8)",transformOrigin:"100% 100%",opacity:0}}),y=new n("antSlideLeftIn",{"0%":{transform:"scaleX(0.8)",transformOrigin:"0% 0%",opacity:0},"100%":{transform:"scaleX(1)",transformOrigin:"0% 0%",opacity:1}}),p=new n("antSlideLeftOut",{"0%":{transform:"scaleX(1)",transformOrigin:"0% 0%",opacity:1},"100%":{transform:"scaleX(0.8)",transformOrigin:"0% 0%",opacity:0}}),O=new n("antSlideRightIn",{"0%":{transform:"scaleX(0.8)",transformOrigin:"100% 0%",opacity:0},"100%":{transform:"scaleX(1)",transformOrigin:"100% 0%",opacity:1}}),d=new n("antSlideRightOut",{"0%":{transform:"scaleX(1)",transformOrigin:"100% 0%",opacity:1},"100%":{transform:"scaleX(0.8)",transformOrigin:"100% 0%",opacity:0}}),g={"slide-up":{inKeyframes:m,outKeyframes:f},"slide-down":{inKeyframes:c,outKeyframes:l},"slide-left":{inKeyframes:y,outKeyframes:p},"slide-right":{inKeyframes:O,outKeyframes:d}},K=(t,r)=>{const{antCls:a}=t,i=`${a}-${r}`,{inKeyframes:s,outKeyframes:o}=g[r];return[e(i,s,o,t.motionDurationMid),{[`
|
|
2
2
|
${i}-enter,
|
|
3
3
|
${i}-appear
|
|
4
4
|
`]:{transform:"scale(0)",transformOrigin:"0% 0%",opacity:0,animationTimingFunction:t.motionEaseOutQuint},[`${i}-leave`]:{animationTimingFunction:t.motionEaseInQuint}}]};export{f as a,c as b,m as c,K as i,l as s};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./index-
|
|
1
|
+
import{i as e}from"./index-BO1itZaY.js";function r(a,s,t){return e({[`${a}-status-success`]:s==="success",[`${a}-status-warning`]:s==="warning",[`${a}-status-error`]:s==="error",[`${a}-status-validating`]:s==="validating",[`${a}-has-feedback`]:t})}const c=(a,s)=>s||a;export{c as a,r as g};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{B as d}from"./index-
|
|
1
|
+
import{B as d}from"./index-BO1itZaY.js";const i=()=>d()&&window.document.documentElement,c=e=>{if(d()&&window.document.documentElement){const t=Array.isArray(e)?e:[e],{documentElement:n}=window.document;return t.some(r=>r in n.style)}return!1},u=(e,t)=>{if(!c(e))return!1;const n=document.createElement("div"),r=n.style[e];return n.style[e]=t,n.style[e]!==r};function s(e,t){return!Array.isArray(e)&&t!==void 0?u(e,t):c(e)}let o;const p=()=>{if(!i())return!1;if(o!==void 0)return o;const e=document.createElement("div");return e.style.display="flex",e.style.flexDirection="column",e.style.rowGap="1px",e.appendChild(document.createElement("div")),e.appendChild(document.createElement("div")),document.body.appendChild(e),o=e.scrollHeight===1,document.body.removeChild(e),o};export{i as c,p as d,s as i};
|
package/src/assets/web-panel/assets/{useFlexGapSupport-CKl4FqXF.js → useFlexGapSupport-Cjev42Gh.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-Dt_Sl-g4.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-BO1itZaY.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 f}from"./index-
|
|
1
|
+
import{u as f}from"./index-BO1itZaY.js";function d(n){if(!n)return n;if(n.error)throw new Error(n.error);return n.result!==void 0?n.result:n}function p(n,t,a,e,r){return typeof n.onMessage!="function"||typeof n.sendRaw!="function"?n.sendRaw({type:t,...a},r).then(d):new Promise((u,s)=>{const l=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${t}.event`,g=`${t}.end`;let c=!1,y=()=>{};const o=(i,b)=>{if(!c){c=!0,clearTimeout(m);try{y()}catch{}i(b)}},m=setTimeout(()=>{o(s,new Error(`stream timeout (${r}ms): ${t}`))},r),h=n.onMessage(i=>{if(!(c||!i)&&!(i.id!==l&&i.requestId!==l)){if(i.type===w){if(typeof e=="function")try{e(i.event||i)}catch{}return}if(i.type===g){o(u,d(i));return}i.type==="error"&&o(s,new Error(i.message||"stream error"))}});y=typeof h=="function"?h:()=>{},Promise.resolve(n.sendRaw({id:l,type:t,...a},r)).catch(()=>{})})}function D(){const n=f(),t=(a,e={},r=3e4)=>n.sendRaw({type:a,...e},r).then(d);return{async health(){return await t("personal-data-hub.health",{},8e3)},async stats(){return await t("personal-data-hub.stats",{},8e3)},async listAdapters(){return await t("personal-data-hub.list-adapters",{},5e3)},async pickFile(a={}){try{const e=await n.sendRaw({type:"fs.openDialog",title:a.title,filters:a.filters},6e4),r=e&&e.result!==void 0?e.result:e;return r&&r.ok&&typeof r.filePath=="string"?r.filePath:null}catch{return null}},async adapterReadiness(a){return await t("personal-data-hub.adapter-readiness",Number.isInteger(a)?{timeoutMs:a}:{},15e3)},async syncAdapter(a,e={}){return await t("personal-data-hub.sync-adapter",{name:a,options:e},12e4)},async syncAll(a={}){return await t("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:e=20,seed:r=1}={}){return await t("personal-data-hub.register-mock",{name:a,count:e,seed:r})},async unregister(a){return await t("personal-data-hub.unregister",{name:a})},async ask(a,e={}){return await t("personal-data-hub.ask",{question:a,options:e},18e4)},async queryEvents(a={}){return await t("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await t("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await t("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await t("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await t("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,e={}){return await t("personal-data-hub.register-email",{account:a,opts:e},15e3)},async unregisterEmail(a){return await t("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await t("personal-data-hub.list-email-accounts",{},5e3)},async eventDetail(a){return await t("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,e={},r){return await p(n,"personal-data-hub.sync-adapter-stream",{name:a,options:e},r,6e5)},async syncAllStream(a={},e){return await p(n,"personal-data-hub.sync-all-stream",{options:a},e,9e5)},async registerAlipay(a,e={}){return await t("personal-data-hub.register-alipay",{account:a,opts:e},15e3)},async unregisterAlipay(a){return await t("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await t("personal-data-hub.list-alipay-accounts",{},5e3)},async importAlipayBill({zipPath:a,csvPath:e,zipPassword:r}={}){return await t("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:e,zipPassword:r},3e5)},async reviewQueueList(a=50){return await t("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,e){return await t("personal-data-hub.review-decision",{reviewId:a,decision:e},5e3)},async manualMerge(a,e){return await t("personal-data-hub.manual-merge",{aId:a,bId:e},5e3)},async manualUnmerge(a){return await t("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await t("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await t("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await t("personal-data-hub.skills-list",{},5e3)},async runSkill(a,e={}){return await t("personal-data-hub.run-skill",{name:a,options:e},12e4)},async openAichatLogin(a,e={}){return await t("personal-data-hub.aichat-open-login",{vendor:a,opts:e},1e4)},async probeAichatCookies(a,e){return await t("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:e},1e4)},async registerAichatVendor(a,e,r={}){return await t("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:e,opts:r},3e4)},async rotateAichatLogin(a){return await t("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await t("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await t("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await t("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await t("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s}={}){return await t("personal-data-hub.register-wechat",{account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s},45e3)},async listWechatAccounts(){return await t("personal-data-hub.list-wechat-accounts",{},5e3)},async unregisterWechat(a){return await t("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await t("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await t("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await t("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await t("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await t("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await t("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await t("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await t("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{D 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-BO1itZaY.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-BO1itZaY.js";import{i as f}from"./motion-CWLtEGmC.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-BO1itZaY.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/auth/npm-auth.js
CHANGED
|
@@ -4,8 +4,33 @@
|
|
|
4
4
|
* @module auth/npm-auth
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { execSync } from "child_process";
|
|
8
7
|
import { logger } from "../lib/logger.js";
|
|
8
|
+
import { executionBroker } from "../lib/process-execution-broker/index.js";
|
|
9
|
+
import { resolveNpmInvocation } from "../lib/npm-invocation.js";
|
|
10
|
+
|
|
11
|
+
export const _deps = {
|
|
12
|
+
platform: process.platform,
|
|
13
|
+
execPath: process.execPath,
|
|
14
|
+
execFileSync: (...args) => executionBroker.execFileSync(...args),
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
function runNpm(args, options = {}) {
|
|
18
|
+
const invocation = resolveNpmInvocation({
|
|
19
|
+
platform: _deps.platform,
|
|
20
|
+
execPath: _deps.execPath,
|
|
21
|
+
});
|
|
22
|
+
return _deps.execFileSync(
|
|
23
|
+
invocation.command,
|
|
24
|
+
[...invocation.prefixArgs, ...args],
|
|
25
|
+
{
|
|
26
|
+
...options,
|
|
27
|
+
origin: "auth:npm",
|
|
28
|
+
policy: "allow",
|
|
29
|
+
scope: "auth",
|
|
30
|
+
shell: false,
|
|
31
|
+
},
|
|
32
|
+
);
|
|
33
|
+
}
|
|
9
34
|
|
|
10
35
|
/**
|
|
11
36
|
* Check if user is currently logged in to npm
|
|
@@ -13,7 +38,7 @@ import { logger } from "../lib/logger.js";
|
|
|
13
38
|
*/
|
|
14
39
|
export function isLoggedIn() {
|
|
15
40
|
try {
|
|
16
|
-
|
|
41
|
+
runNpm(["whoami"], { stdio: "ignore" });
|
|
17
42
|
return true;
|
|
18
43
|
} catch {
|
|
19
44
|
return false;
|
|
@@ -26,7 +51,7 @@ export function isLoggedIn() {
|
|
|
26
51
|
*/
|
|
27
52
|
export function getCurrentUser() {
|
|
28
53
|
try {
|
|
29
|
-
return
|
|
54
|
+
return runNpm(["whoami"], { encoding: "utf8" }).trim();
|
|
30
55
|
} catch {
|
|
31
56
|
return null;
|
|
32
57
|
}
|
|
@@ -39,7 +64,7 @@ export function getCurrentUser() {
|
|
|
39
64
|
export async function login() {
|
|
40
65
|
try {
|
|
41
66
|
logger.info("Running npm login...");
|
|
42
|
-
|
|
67
|
+
runNpm(["login"], { stdio: "inherit" });
|
|
43
68
|
return isLoggedIn();
|
|
44
69
|
} catch (err) {
|
|
45
70
|
logger.error(`Login failed: ${err.message}`);
|
|
@@ -54,7 +79,7 @@ export async function login() {
|
|
|
54
79
|
export async function logout() {
|
|
55
80
|
try {
|
|
56
81
|
logger.info("Running npm logout...");
|
|
57
|
-
|
|
82
|
+
runNpm(["logout"], { stdio: "inherit" });
|
|
58
83
|
return !isLoggedIn();
|
|
59
84
|
} catch (err) {
|
|
60
85
|
logger.error(`Logout failed: ${err.message}`);
|
package/src/commands/agenda.js
CHANGED
|
@@ -53,8 +53,14 @@ export function registerAgendaCommand(program) {
|
|
|
53
53
|
.description("Fire every entry that is due now")
|
|
54
54
|
.option("--dry-run", "Show what would fire without running anything")
|
|
55
55
|
.option("--json", "Machine-readable JSON output")
|
|
56
|
+
.option(
|
|
57
|
+
"--watch <seconds>",
|
|
58
|
+
"Keep running as a resident scheduler and poll at this interval",
|
|
59
|
+
)
|
|
56
60
|
.action(async (options) => {
|
|
57
|
-
process.exitCode =
|
|
61
|
+
process.exitCode = options.watch
|
|
62
|
+
? await runAgendaDaemon(options)
|
|
63
|
+
: await runAgendaRun(options);
|
|
58
64
|
});
|
|
59
65
|
|
|
60
66
|
cmd
|
|
@@ -219,7 +225,11 @@ export async function runAgendaRun(options = {}, _deps = {}) {
|
|
|
219
225
|
const retired = options.dryRun
|
|
220
226
|
? partitionSchedule(store.list(), { now }).expired
|
|
221
227
|
: store.retireExpired(now);
|
|
222
|
-
const due =
|
|
228
|
+
const due = options.dryRun
|
|
229
|
+
? store.due(null, now)
|
|
230
|
+
: typeof store.claimDue === "function"
|
|
231
|
+
? store.claimDue(now, options.leaseMs)
|
|
232
|
+
: store.due(null, now);
|
|
223
233
|
const actions = [];
|
|
224
234
|
|
|
225
235
|
for (const entry of due) {
|
|
@@ -337,6 +347,7 @@ export async function runAgendaRun(options = {}, _deps = {}) {
|
|
|
337
347
|
}
|
|
338
348
|
}
|
|
339
349
|
} catch (err) {
|
|
350
|
+
store.releaseClaim?.(entry.id);
|
|
340
351
|
actions.push({
|
|
341
352
|
id: entry.id,
|
|
342
353
|
kind: entry.kind,
|
|
@@ -373,6 +384,53 @@ export async function runAgendaRun(options = {}, _deps = {}) {
|
|
|
373
384
|
return actions.some((a) => a.action === "error") ? 1 : 0;
|
|
374
385
|
}
|
|
375
386
|
|
|
387
|
+
/**
|
|
388
|
+
* Resident scheduler loop for `cc agenda run --watch <seconds>`.
|
|
389
|
+
*
|
|
390
|
+
* The store remains the source of truth: every tick re-reads durable entries,
|
|
391
|
+
* retires expired work, and claims due entries through the same lease path as
|
|
392
|
+
* one-shot execution. A signal or injected AbortSignal stops after the current
|
|
393
|
+
* tick; `maxTicks` is intentionally supported for deterministic tests.
|
|
394
|
+
*/
|
|
395
|
+
export async function runAgendaDaemon(options = {}, _deps = {}) {
|
|
396
|
+
const intervalSeconds = Number(options.watch);
|
|
397
|
+
const intervalMs = Math.max(
|
|
398
|
+
250,
|
|
399
|
+
Number.isFinite(intervalSeconds) && intervalSeconds > 0
|
|
400
|
+
? intervalSeconds * 1000
|
|
401
|
+
: 60000,
|
|
402
|
+
);
|
|
403
|
+
const signal = options.signal || _deps.signal || null;
|
|
404
|
+
const runOnce = _deps.runOnce || ((next) => runAgendaRun(next, _deps));
|
|
405
|
+
const sleep =
|
|
406
|
+
_deps.sleep ||
|
|
407
|
+
((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
408
|
+
let stopped = Boolean(signal?.aborted);
|
|
409
|
+
let lastCode = 0;
|
|
410
|
+
let ticks = 0;
|
|
411
|
+
const stop = () => {
|
|
412
|
+
stopped = true;
|
|
413
|
+
};
|
|
414
|
+
const onAbort = () => stop();
|
|
415
|
+
signal?.addEventListener?.("abort", onAbort, { once: true });
|
|
416
|
+
const onSignal = () => stop();
|
|
417
|
+
process.once("SIGINT", onSignal);
|
|
418
|
+
process.once("SIGTERM", onSignal);
|
|
419
|
+
try {
|
|
420
|
+
while (!stopped) {
|
|
421
|
+
lastCode = Math.max(lastCode, await runOnce({ ...options, watch: null }));
|
|
422
|
+
ticks += 1;
|
|
423
|
+
if (Number.isFinite(_deps.maxTicks) && ticks >= _deps.maxTicks) break;
|
|
424
|
+
await sleep(intervalMs);
|
|
425
|
+
}
|
|
426
|
+
} finally {
|
|
427
|
+
signal?.removeEventListener?.("abort", onAbort);
|
|
428
|
+
process.removeListener("SIGINT", onSignal);
|
|
429
|
+
process.removeListener("SIGTERM", onSignal);
|
|
430
|
+
}
|
|
431
|
+
return lastCode;
|
|
432
|
+
}
|
|
433
|
+
|
|
376
434
|
// ─── default effectful deps (overridable in tests) ─────────────────────────
|
|
377
435
|
|
|
378
436
|
/**
|
|
@@ -397,6 +455,10 @@ export function buildAgentArgs(prompt, policy = null) {
|
|
|
397
455
|
if (disallow.length > 0) {
|
|
398
456
|
args.push("--disallowed-tools", disallow.join(","));
|
|
399
457
|
}
|
|
458
|
+
args.push("--unattended");
|
|
459
|
+
if (policy && Array.isArray(policy.unattendedAllowlist) && policy.unattendedAllowlist.length > 0) {
|
|
460
|
+
args.push("--unattended-allow", policy.unattendedAllowlist.join(","));
|
|
461
|
+
}
|
|
400
462
|
if (policy && typeof policy === "object") {
|
|
401
463
|
if (
|
|
402
464
|
typeof policy.permissionMode === "string" &&
|
package/src/commands/agent.js
CHANGED
|
@@ -195,6 +195,14 @@ export function registerAgentCommand(program) {
|
|
|
195
195
|
"--worktree",
|
|
196
196
|
"Run this session in a fresh git worktree (isolated branch; auto-removed when the session changes nothing)",
|
|
197
197
|
)
|
|
198
|
+
.option(
|
|
199
|
+
"--unattended",
|
|
200
|
+
"Enable fail-closed shell action policy for scheduled/event-driven runs",
|
|
201
|
+
)
|
|
202
|
+
.option(
|
|
203
|
+
"--unattended-allow <classes>",
|
|
204
|
+
"Comma-separated action classes explicitly allowed for unattended shell runs",
|
|
205
|
+
)
|
|
198
206
|
.option(
|
|
199
207
|
"--sandbox [image]",
|
|
200
208
|
"Run shell commands in an ephemeral Docker sandbox (network disabled by default)",
|
|
@@ -422,6 +430,21 @@ export function registerAgentCommand(program) {
|
|
|
422
430
|
console.log(JSON.stringify(buildAgentCapabilities(), null, 2));
|
|
423
431
|
return;
|
|
424
432
|
}
|
|
433
|
+
let toolAdmission = null;
|
|
434
|
+
if (process.env.CC_TOOL_ADMISSION) {
|
|
435
|
+
try {
|
|
436
|
+
const { parseToolAdmissionConfig } =
|
|
437
|
+
await import("../lib/agent-tool-admission.js");
|
|
438
|
+
toolAdmission = parseToolAdmissionConfig(
|
|
439
|
+
process.env.CC_TOOL_ADMISSION,
|
|
440
|
+
);
|
|
441
|
+
} catch (error) {
|
|
442
|
+
process.stderr.write(
|
|
443
|
+
`CC_TOOL_ADMISSION: ${error.message}; refusing an ungoverned session.\n`,
|
|
444
|
+
);
|
|
445
|
+
process.exit(6);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
425
448
|
// CC_API_KEY env fallback for --api-key: lets callers (IDE plugins,
|
|
426
449
|
// scripts) pass the key via the environment instead of argv, where it
|
|
427
450
|
// is visible to every local process (/proc/<pid>/cmdline, Win32_Process).
|
|
@@ -517,7 +540,11 @@ export function registerAgentCommand(program) {
|
|
|
517
540
|
const { setupAgentWorktree, finishAgentWorktree } =
|
|
518
541
|
await import("../lib/agent-worktree.js");
|
|
519
542
|
_finishAgentWorktreeFn = finishAgentWorktree;
|
|
520
|
-
|
|
543
|
+
const worktreeCwd =
|
|
544
|
+
process.platform === "darwin"
|
|
545
|
+
? process.cwd().replace(/^\/private\//, "/")
|
|
546
|
+
: process.cwd();
|
|
547
|
+
_worktree = setupAgentWorktree({ cwd: worktreeCwd });
|
|
521
548
|
process.chdir(_worktree.path);
|
|
522
549
|
process.stderr.write(
|
|
523
550
|
`worktree: ${_worktree.path} (branch ${_worktree.branch})\n`,
|
|
@@ -750,6 +777,16 @@ export function registerAgentCommand(program) {
|
|
|
750
777
|
await import("../lib/settings-loader.cjs");
|
|
751
778
|
const sc = loadSettingsConfig({
|
|
752
779
|
cwd: process.cwd(),
|
|
780
|
+
unattendedActionPolicy: options.unattended
|
|
781
|
+
? {
|
|
782
|
+
unattended: true,
|
|
783
|
+
allowlist: String(options.unattendedAllow || "")
|
|
784
|
+
.split(",")
|
|
785
|
+
.map((value) => value.trim())
|
|
786
|
+
.filter(Boolean),
|
|
787
|
+
trigger: { trusted: true },
|
|
788
|
+
}
|
|
789
|
+
: null,
|
|
753
790
|
settingsFile: options.settings || null,
|
|
754
791
|
});
|
|
755
792
|
for (const [k, v] of Object.entries(sc.env || {})) {
|
|
@@ -993,7 +1030,11 @@ export function registerAgentCommand(program) {
|
|
|
993
1030
|
jsonSchema: options.jsonSchema || null,
|
|
994
1031
|
});
|
|
995
1032
|
} catch (err) {
|
|
996
|
-
process.stderr.write(
|
|
1033
|
+
process.stderr.write(
|
|
1034
|
+
process.env.CC_DEBUG && err?.stack
|
|
1035
|
+
? `${err.stack}\n`
|
|
1036
|
+
: `Error: ${err.message}\n`,
|
|
1037
|
+
);
|
|
997
1038
|
await _finishWorktree();
|
|
998
1039
|
process.exit(1);
|
|
999
1040
|
}
|
|
@@ -1079,7 +1120,7 @@ export function registerAgentCommand(program) {
|
|
|
1079
1120
|
if (promptWasPiped) childArgv.push(prompt);
|
|
1080
1121
|
const state = launchBackgroundAgent({
|
|
1081
1122
|
argv: childArgv,
|
|
1082
|
-
cwd: process.cwd(),
|
|
1123
|
+
cwd: _worktree ? _worktree.path : process.cwd(),
|
|
1083
1124
|
sessionId,
|
|
1084
1125
|
title: prompt.slice(0, 100),
|
|
1085
1126
|
followUpArgv,
|
|
@@ -1164,6 +1205,7 @@ export function registerAgentCommand(program) {
|
|
|
1164
1205
|
baseUrl: visionLlm.baseUrl || options.baseUrl,
|
|
1165
1206
|
apiKey: visionLlm.apiKey || options.apiKey,
|
|
1166
1207
|
sessionId: options.session,
|
|
1208
|
+
toolAdmission,
|
|
1167
1209
|
// A resolved --session/--continue/--resume id means "replay this
|
|
1168
1210
|
// conversation and persist the new turns"; the runner loads prior
|
|
1169
1211
|
// history when the id already exists and creates it otherwise.
|
|
@@ -151,6 +151,7 @@ async function followBackgroundAgent(id, options = {}) {
|
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
logger.log(chalk.gray(`Attached to ${id}. Streaming logs; Ctrl-C detaches.`));
|
|
154
|
+
// eslint-disable-next-line no-constant-condition
|
|
154
155
|
while (true) {
|
|
155
156
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
156
157
|
const next = readLogFromOffset(logFile, offset);
|
|
@@ -224,6 +225,84 @@ export async function interactiveAttach(id, state, options = {}) {
|
|
|
224
225
|
case "error":
|
|
225
226
|
logger.log(chalk.yellow(`— ${message.message}`));
|
|
226
227
|
return;
|
|
228
|
+
case "interaction_request": {
|
|
229
|
+
// P0-2: Human-in-the-loop interaction request from the agent
|
|
230
|
+
const {
|
|
231
|
+
intId,
|
|
232
|
+
prompt,
|
|
233
|
+
hint,
|
|
234
|
+
options: opts,
|
|
235
|
+
multiSelect,
|
|
236
|
+
timeoutMs,
|
|
237
|
+
} = message;
|
|
238
|
+
logger.log("");
|
|
239
|
+
logger.log(chalk.cyan.bold("? Agent asks for your input:"));
|
|
240
|
+
logger.log(chalk.white(` ${prompt}`));
|
|
241
|
+
if (hint) logger.log(chalk.gray(` (${hint})`));
|
|
242
|
+
if (timeoutMs)
|
|
243
|
+
logger.log(
|
|
244
|
+
chalk.gray(` (timeout: ${Math.round(timeoutMs / 1000)}s)`),
|
|
245
|
+
);
|
|
246
|
+
let promptText = " Your answer";
|
|
247
|
+
if (opts && Array.isArray(opts) && opts.length > 0) {
|
|
248
|
+
logger.log("");
|
|
249
|
+
opts.forEach((opt, idx) => {
|
|
250
|
+
const label =
|
|
251
|
+
typeof opt === "string" ? opt : opt.label || String(opt);
|
|
252
|
+
const desc =
|
|
253
|
+
typeof opt === "object" && opt.description
|
|
254
|
+
? ` - ${opt.description}`
|
|
255
|
+
: "";
|
|
256
|
+
logger.log(chalk.white(` ${idx + 1}) ${label}${desc}`));
|
|
257
|
+
});
|
|
258
|
+
promptText = multiSelect
|
|
259
|
+
? " Enter number(s) (comma-separated)"
|
|
260
|
+
: " Enter a number";
|
|
261
|
+
}
|
|
262
|
+
if (multiSelect)
|
|
263
|
+
logger.log(chalk.gray(" (multiple selections allowed)"));
|
|
264
|
+
// Pause the log stream and prompt the user via readline
|
|
265
|
+
rl.question(chalk.cyan(`${promptText}: `), (raw) => {
|
|
266
|
+
const answer = raw.trim();
|
|
267
|
+
let resolved = answer;
|
|
268
|
+
if (opts && Array.isArray(opts) && opts.length > 0) {
|
|
269
|
+
// Parse numeric selection
|
|
270
|
+
const nums = answer
|
|
271
|
+
.split(",")
|
|
272
|
+
.map((s) => parseInt(s.trim(), 10))
|
|
273
|
+
.filter((n) => n >= 1 && n <= opts.length);
|
|
274
|
+
if (nums.length === 0) {
|
|
275
|
+
logger.log(
|
|
276
|
+
chalk.yellow(" Invalid selection, sending raw text"),
|
|
277
|
+
);
|
|
278
|
+
} else if (multiSelect) {
|
|
279
|
+
resolved = nums.map((n) => opts[n - 1]);
|
|
280
|
+
} else {
|
|
281
|
+
resolved = opts[nums[0] - 1];
|
|
282
|
+
}
|
|
283
|
+
// Normalize to value if object option
|
|
284
|
+
if (multiSelect) {
|
|
285
|
+
resolved = resolved.map((o) =>
|
|
286
|
+
typeof o === "object" && o.value !== undefined
|
|
287
|
+
? o.value
|
|
288
|
+
: o,
|
|
289
|
+
);
|
|
290
|
+
} else if (
|
|
291
|
+
typeof resolved === "object" &&
|
|
292
|
+
resolved.value !== undefined
|
|
293
|
+
) {
|
|
294
|
+
resolved = resolved.value;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
conn.send({
|
|
298
|
+
type: "interaction_response",
|
|
299
|
+
intId,
|
|
300
|
+
answer: resolved,
|
|
301
|
+
});
|
|
302
|
+
logger.log(chalk.gray("— response sent to agent"));
|
|
303
|
+
});
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
227
306
|
default:
|
|
228
307
|
return;
|
|
229
308
|
}
|
|
@@ -248,6 +327,14 @@ export async function interactiveAttach(id, state, options = {}) {
|
|
|
248
327
|
),
|
|
249
328
|
);
|
|
250
329
|
|
|
330
|
+
// P0-2: If the agent is already waiting for human input (e.g. the question
|
|
331
|
+
// was issued before this client attached, or a previous client detached
|
|
332
|
+
// without answering), re-prompt immediately.
|
|
333
|
+
const preExistingQuestion =
|
|
334
|
+
state.status === "awaiting-input" && state.pendingQuestion
|
|
335
|
+
? { ...state.pendingQuestion }
|
|
336
|
+
: null;
|
|
337
|
+
|
|
251
338
|
const readline = await import("node:readline");
|
|
252
339
|
const rl = readline.createInterface({
|
|
253
340
|
input: process.stdin,
|
|
@@ -273,6 +360,21 @@ export async function interactiveAttach(id, state, options = {}) {
|
|
|
273
360
|
const detach = () => rl.close();
|
|
274
361
|
rl.on("SIGINT", detach);
|
|
275
362
|
|
|
363
|
+
if (preExistingQuestion) {
|
|
364
|
+
setImmediate(() => {
|
|
365
|
+
conn.onEvent?.({
|
|
366
|
+
type: "interaction_request",
|
|
367
|
+
intId: preExistingQuestion.intId,
|
|
368
|
+
prompt: preExistingQuestion.prompt,
|
|
369
|
+
hint: preExistingQuestion.hint,
|
|
370
|
+
options: preExistingQuestion.options,
|
|
371
|
+
multiSelect: preExistingQuestion.multiSelect,
|
|
372
|
+
timeoutMs: preExistingQuestion.timeoutMs,
|
|
373
|
+
_deferred: true,
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
|
|
276
378
|
await new Promise((resolve) => {
|
|
277
379
|
rl.on("close", resolve);
|
|
278
380
|
const poll = setInterval(() => {
|
|
@@ -692,3 +794,4 @@ export function registerBackgroundSessionCommands(program) {
|
|
|
692
794
|
}
|
|
693
795
|
});
|
|
694
796
|
}
|
|
797
|
+
|
package/src/commands/config.js
CHANGED
|
@@ -9,6 +9,75 @@ import {
|
|
|
9
9
|
import { getConfigPath } from "../lib/paths.js";
|
|
10
10
|
import logger from "../lib/logger.js";
|
|
11
11
|
import { listFeatures, setFeature, getFlagInfo } from "../lib/feature-flags.js";
|
|
12
|
+
import { executionBroker } from "../lib/process-execution-broker/index.js";
|
|
13
|
+
|
|
14
|
+
export const _deps = {
|
|
15
|
+
spawnSync: (...args) => executionBroker.spawnSync(...args),
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/** Parse the conventional $EDITOR string without invoking a shell. */
|
|
19
|
+
export function parseEditorCommand(value) {
|
|
20
|
+
const input = String(value || "").trim();
|
|
21
|
+
if (!input) return [];
|
|
22
|
+
const tokens = [];
|
|
23
|
+
let token = "";
|
|
24
|
+
let quote = null;
|
|
25
|
+
let started = false;
|
|
26
|
+
for (let index = 0; index < input.length; index += 1) {
|
|
27
|
+
const char = input[index];
|
|
28
|
+
if (quote) {
|
|
29
|
+
if (char === quote) {
|
|
30
|
+
quote = null;
|
|
31
|
+
started = true;
|
|
32
|
+
} else if (char === "\\" && input[index + 1] === quote) {
|
|
33
|
+
token += quote;
|
|
34
|
+
index += 1;
|
|
35
|
+
} else {
|
|
36
|
+
token += char;
|
|
37
|
+
}
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (char === '"' || char === "'") {
|
|
41
|
+
quote = char;
|
|
42
|
+
started = true;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (/\s/.test(char)) {
|
|
46
|
+
if (started || token) {
|
|
47
|
+
tokens.push(token);
|
|
48
|
+
token = "";
|
|
49
|
+
started = false;
|
|
50
|
+
}
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (
|
|
54
|
+
char === "\\" &&
|
|
55
|
+
(input[index + 1] === '"' || input[index + 1] === "'")
|
|
56
|
+
) {
|
|
57
|
+
token += input[index + 1];
|
|
58
|
+
index += 1;
|
|
59
|
+
started = true;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
token += char;
|
|
63
|
+
started = true;
|
|
64
|
+
}
|
|
65
|
+
if (quote) throw new Error("EDITOR contains an unterminated quote");
|
|
66
|
+
if (started || token) tokens.push(token);
|
|
67
|
+
return tokens;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function openConfigEditor(editor, configPath, deps = _deps) {
|
|
71
|
+
const [file, ...editorArgs] = parseEditorCommand(editor);
|
|
72
|
+
if (!file) throw new Error("EDITOR command is empty");
|
|
73
|
+
return deps.spawnSync(file, [...editorArgs, configPath], {
|
|
74
|
+
stdio: "inherit",
|
|
75
|
+
origin: "config:editor",
|
|
76
|
+
policy: "allow",
|
|
77
|
+
scope: "config",
|
|
78
|
+
shell: false,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
12
81
|
|
|
13
82
|
export function registerConfigCommand(program) {
|
|
14
83
|
const cmd = program
|
|
@@ -109,12 +178,8 @@ export function registerConfigCommand(program) {
|
|
|
109
178
|
process.env.EDITOR ||
|
|
110
179
|
process.env.VISUAL ||
|
|
111
180
|
(process.platform === "win32" ? "notepad" : "vi");
|
|
112
|
-
const { execSync } = await import("node:child_process");
|
|
113
181
|
try {
|
|
114
|
-
|
|
115
|
-
// (editor stays unquoted so `$EDITOR` values with args still work).
|
|
116
|
-
const safePath = configPath.replace(/"/g, '\\"');
|
|
117
|
-
execSync(`${editor} "${safePath}"`, { stdio: "inherit" });
|
|
182
|
+
openConfigEditor(editor, configPath);
|
|
118
183
|
} catch (err) {
|
|
119
184
|
logger.error(`Failed to open editor: ${err.message}`);
|
|
120
185
|
logger.info(`Config file is at: ${configPath}`);
|