chainlesschain 0.162.175 → 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-DherW0Rh.js → AIOps-BDLu5Elz.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CDGfqt2Y.js → ActionButton-DH5us-CK.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BYhkzdgD.js → Analytics-BZ0u8IFG.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-cEKk1cpb.js → AppLayout-Duu8xR14.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-_aXR3WWc.js → Artifacts-Br2YBbh_.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CYAf-gY7.js → Audit-C3C6a482.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-D4Q20phR.js → BackgroundAgents-CzHvebcj.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Cq0Tyk58.js → Backup-DZNHYDFd.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CPj_CdAv.js → BaseInput-VRiC4fIx.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BQ-Qq0es.js → Chat-Cm08WWAD.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-Ci97vNTs.js → ChatBubbleRenderer-CGHYrugQ.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-rke6l3yg.js → Checkbox-DtByk7d7.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DiacrIPq.js → Codegen-CphXXOfD.js} +1 -1
- package/src/assets/web-panel/assets/{Col-Cx3BY-Up.js → Col-Hz86TnLR.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DfmWiQy8.js → Community-HP03ltpD.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DdQnpxy5.js → Compact-B_N1mqQz.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-lzliOH_r.js → Compliance-CVztRpi8.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CYx4Un5k.js → Cowork-wUVOyZih.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-BGDcPFlo.js → Cron-DW5TLJKw.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-0_X5g2ri.js → Crosschain-CrAFGhWH.js} +1 -1
- package/src/assets/web-panel/assets/{DID-C0PEf3Eu.js → DID-pA-oD8ke.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DULQjQ58.js → Dashboard-CXrd5gAw.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DGRHRbW6.js → Dropdown-EweJcsek.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-ChX8XPwB.js → EmailListRenderer-C9xVLPG4.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Dyq6IBNu.js → FamilyGuardDashboard-CDcEEqlu.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DH1NfAL2.js → Federation-DtZda9A_.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BN1I_uNi.js → FormItemContext-CiYdcVz3.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-Dq_2UYpe.js → GenericCardRenderer-DA13uwA0.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BAy1yvI2.js → Git-DzRhZD1O.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-Db6Q2iSy.js → Governance-D5RMgOSb.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-0ub6yHcr.js → Inference-BgrPfSNk.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DtLetM36.js → KnowledgeGraph-DzjnD571.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-Bcoy7CUd.js → Logs-BhWzVDtN.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BfEMFAXf.js → MarkdownRenderer-BDape9cx.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-tt2rzwRR.js → Marketplace-DJtL5GV7.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BhOgX-MU.js → McpTools-CZcQygI7.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-BJUxeWBL.js → Memory-DUWSDUUu.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BwUY2G9w.js → MobileBridge-BTwq2WKY.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-NZvvfDME.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-B2WMboOm.js → Mtc-BiGugEQm.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-8pNEXO63.js → MtcAudit-DY7a6gUe.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-C1wm5a_1.js → Multisig-BQbDu_w7.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-C1QpKF7g.js → NLProgramming-CM2wXTLv.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CiQUcxFu.js → Notes-DI6gGs1v.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-BblDPJ_x.js → NotificationSettings-BsZOLWAB.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DRjYcPtb.js → OrderTableRenderer-C48mu09U.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Dp3VKB0X.js → Organization-Cds0_tXr.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Czx161m9.js → Overflow-WunYMD87.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-ClFi6wOs.js → P2P-Bo6j4DDv.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CRweW0lz.js → PdhVaultBrowser-Bh2XPD5f.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BzcRoqTn.js → Permissions-EMvMMC8N.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-ChGTpNMd.js → PersonalDataHub-AX3ypUDV.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-BMOOpKWA.js → Pipeline-BOx8HOgL.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-D0AZHObH.js → Privacy-tBeTVQVM.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-yYFlZ6Ja.js → ProjectInit-CVYg1W4M.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DJNVuMQs.js → ProjectSettings-Dvt5I7y1.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Br0rBWH1.js → Projects-Cc7FC9-e.js} +1 -1
- package/src/assets/web-panel/assets/Providers-Ct8xqY-E.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-81NZOitV.js → QrScannerModal-Cni8Ooja.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Dic2lCbJ.js → QuickAsk-BJVLKdxr.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Dh9iwViE.js → Recommend-DPG8Rbbm.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-Bq9VYEFy.js → RemoteSession-DsdR7dCt.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-CxFZ-NbJ.js → Reputation-Csg1YM-b.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BVSLcaX2.js → Row-D9DoFoEf.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BbC-5DOH.js → RssFeed-BsvKrXMS.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BfjZ1GCr.js → Search-DFUStfgQ.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CVjhOV5r.js → Security-ILg1zxdK.js} +4 -4
- package/src/assets/web-panel/assets/{Services-D45u-Aqe.js → Services-Dd41PCaY.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-WkGoK4he.js → Skeleton-Bzo1cN80.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-D_jvQZcj.js → Skills-BDHh17P0.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Bf4QTF3E.js → Sla-jl7UTiRY.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DVpZdbMN.js → SpeechSettings-BePa-RF6.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DEEojoMS.js → SyncSettings-DiqqDKGZ.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DFwxpLIk.js → Tasks-DYQ_6lxj.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Bzl-9wY5.js → Templates-JiDeI06L.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-0khxUOB8.js → Tenant-hhgI6zwS.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-CjTZPa37.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-B0Y4LONc.js → TimelineRenderer-B8uB5Llk.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DEE07SFh.js → Tokens-C3b_6r2z.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BM7xvA5z.js → Trigger-tIP7HKVe.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-Dv3ijvvZ.js → Trust-vjoc11vJ.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B1-enmMt.js → UkeySign-DUPBnGuH.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DYiIPByd.js → VideoEditing-CBvhUY5T.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-D-y374BQ.js → Wallet-DUaQ0uA5.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-HBDjcUhi.js → WebAuthn-DllSivjE.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-sKn4qTID.js → WorkflowEditor-xc8D3uO6.js} +1 -1
- package/src/assets/web-panel/assets/{chat-TVYhaBXj.js → chat-BVicU7oA.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DMADxY9v.js → colors-DJzLmhLm.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-OftcHpO_.js → compact-item-BvYRfThE.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DW1zVUSN.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-CaUathNp.js → hasIn-SBDJB1y4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeCIYYG7.js → index-1SdDS6lR.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAfT3EMd.js → index-9gdI7uUW.js} +1 -1
- package/src/assets/web-panel/assets/index-B7nuIywP.js +1 -0
- package/src/assets/web-panel/assets/{index-sm1sGIxW.js → index-BJZf9DhV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBNg08cD.js → index-BO1itZaY.js} +3 -3
- package/src/assets/web-panel/assets/{index-CKNdnJRo.js → index-BTrBGBJs.js} +1 -1
- package/src/assets/web-panel/assets/{index--5UvwqH_.js → index-BYqz4Wrr.js} +1 -1
- package/src/assets/web-panel/assets/{index-8YelceUU.js → index-Bf-ctERC.js} +1 -1
- package/src/assets/web-panel/assets/{index-Lr0MO-GU.js → index-CKyEivf8.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZdT8nio.js → index-CdGY9P8a.js} +1 -1
- package/src/assets/web-panel/assets/{index-s-EnkUCn.js → index-Cf-O_g_8.js} +1 -1
- package/src/assets/web-panel/assets/{index-pSVCBsG4.js → index-CloCgBUR.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-19mFhn.js → index-CoJAO1Lm.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKjqFpYa.js → index-Crk5NTb0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJ1PjRY3.js → index-Cs2rmLFt.js} +1 -1
- package/src/assets/web-panel/assets/{index-77kgkUgY.js → index-CtwqO5qo.js} +1 -1
- package/src/assets/web-panel/assets/{index-D63QVAiJ.js → index-D7HimK0M.js} +1 -1
- package/src/assets/web-panel/assets/{index-B52Ztt8Q.js → index-DCdRAgjy.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHi634g9.js → index-DCqRS6da.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFVbDpqg.js → index-DHVLJ8q0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvRw4Fna.js → index-DKrvvWm4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZXYI5LU.js → index-DMarmfrv.js} +1 -1
- package/src/assets/web-panel/assets/{index-CM8W07sc.js → index-DRfiXB_p.js} +1 -1
- package/src/assets/web-panel/assets/{index-iDmgT2Dg.js → index-Dm_77jgR.js} +1 -1
- package/src/assets/web-panel/assets/{index-hXq7QRA_.js → index-DnjPdvR6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BEzLLVYd.js → index-DonCnfMr.js} +1 -1
- package/src/assets/web-panel/assets/{index-DYwwUKDg.js → index-DvUTDYXX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXcqvWBp.js → index-FxZzRyE1.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cmdv6Dev.js → index-MjC4G09d.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9JoaYSs.js → index-VMfwIH5G.js} +1 -1
- package/src/assets/web-panel/assets/{index-CK-p7Hji.js → index-YJkzy8ZF.js} +1 -1
- package/src/assets/web-panel/assets/{index-BupSWDcl.js → index-d5BVd-cL.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bg-7FpaL.js → index-e4fXH_WO.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpDtN0dl.js → index-hxTODbM1.js} +1 -1
- package/src/assets/web-panel/assets/{index-kdMl_0zL.js → index-lpaGoTH3.js} +1 -1
- package/src/assets/web-panel/assets/{index-GUKz4Pv9.js → index-wcCL-miV.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWVZ3T0t.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-BSp1Ofvx.js → index-z1ZylsLq.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DdcKTlQR.js → initDefaultProps-C1zO1KnY.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CL-hTBQj.js → motion-CWLtEGmC.js} +1 -1
- package/src/assets/web-panel/assets/{move-qYSAkxNG.js → move-DzD_C3Vm.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-ZwRSZtRP.js → mtc-parser-D880PYJl.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Bld-8ftI.js → omit-CFR_z2ov.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DGHs-a9Z.js → pickAttrs-srIhgrSC.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DRQPMyI5.js → placementArrow-C1rXpibP.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-C5MJG_Yo.js → responsiveObserve-C30gRcSS.js} +1 -1
- package/src/assets/web-panel/assets/{slide-VZ-fpZCD.js → slide-CvtKiMfV.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-9ocfCyHk.js → statusUtils-DNHO7ITG.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-B6QAwAN5.js → styleChecker-Dt_Sl-g4.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Bq1twor3.js → useFlexGapSupport-Cjev42Gh.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DKZq96tz.js → useFs-Baxglj2V.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-D0RmRVXf.js → usePersonalDataHub-B4NkcLaP.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-D6kEj_tt.js → vnode-mIRkdT7o.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-2yfasoQf.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 +39 -1
- 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/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 +74 -2
- package/src/harness/jsonl-session-store.js +13 -6
- package/src/harness/mcp-client.js +200 -1
- 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 +12 -2
- 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/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 +6 -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/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 +23 -3
- package/src/lib/process-execution-broker/index.js +315 -38
- package/src/lib/process-execution-broker/patch-child-process.js +2 -3
- package/src/lib/process-manager.js +18 -3
- package/src/lib/publish-workspace.js +14 -6
- package/src/lib/secret-store.js +159 -0
- package/src/lib/service-manager.js +64 -29
- 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/turn-context.js +14 -8
- package/src/lib/unattended-action-policy.js +83 -0
- package/src/lib/update-notice.js +6 -2
- package/src/lib/with-file-lock.js +7 -0
- package/src/lib/ws-server.js +1 -0
- package/src/repl/agent-repl.js +32 -0
- 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/assets/web-panel/assets/MobileProjects-BLRfHhqi.js +0 -1
- package/src/assets/web-panel/assets/Providers-zZRhNtSu.js +0 -1
- package/src/assets/web-panel/assets/Terminal-DWGYhAYU.js +0 -3
- package/src/assets/web-panel/assets/devWarning-CLOk6rdE.js +0 -1
- package/src/assets/web-panel/assets/index-CSgUfMTM.js +0 -1
- package/src/assets/web-panel/assets/index-DliSZvAP.js +0 -1
package/src/assets/web-panel/assets/{responsiveObserve-C5MJG_Yo.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-Bq1twor3.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).
|
|
@@ -754,6 +777,16 @@ export function registerAgentCommand(program) {
|
|
|
754
777
|
await import("../lib/settings-loader.cjs");
|
|
755
778
|
const sc = loadSettingsConfig({
|
|
756
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,
|
|
757
790
|
settingsFile: options.settings || null,
|
|
758
791
|
});
|
|
759
792
|
for (const [k, v] of Object.entries(sc.env || {})) {
|
|
@@ -997,7 +1030,11 @@ export function registerAgentCommand(program) {
|
|
|
997
1030
|
jsonSchema: options.jsonSchema || null,
|
|
998
1031
|
});
|
|
999
1032
|
} catch (err) {
|
|
1000
|
-
process.stderr.write(
|
|
1033
|
+
process.stderr.write(
|
|
1034
|
+
process.env.CC_DEBUG && err?.stack
|
|
1035
|
+
? `${err.stack}\n`
|
|
1036
|
+
: `Error: ${err.message}\n`,
|
|
1037
|
+
);
|
|
1001
1038
|
await _finishWorktree();
|
|
1002
1039
|
process.exit(1);
|
|
1003
1040
|
}
|
|
@@ -1168,6 +1205,7 @@ export function registerAgentCommand(program) {
|
|
|
1168
1205
|
baseUrl: visionLlm.baseUrl || options.baseUrl,
|
|
1169
1206
|
apiKey: visionLlm.apiKey || options.apiKey,
|
|
1170
1207
|
sessionId: options.session,
|
|
1208
|
+
toolAdmission,
|
|
1171
1209
|
// A resolved --session/--continue/--resume id means "replay this
|
|
1172
1210
|
// conversation and persist the new turns"; the runner loads prior
|
|
1173
1211
|
// history when the id already exists and creates it otherwise.
|
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}`);
|
package/src/commands/context.js
CHANGED
|
@@ -100,12 +100,17 @@ export function registerContextCommand(program) {
|
|
|
100
100
|
// different window.
|
|
101
101
|
let recordedModel = "";
|
|
102
102
|
let recordedProvider = "";
|
|
103
|
+
let recordedContextSources = null;
|
|
103
104
|
try {
|
|
104
|
-
const
|
|
105
|
+
const sessionEvents = readEvents(sessionId) || [];
|
|
106
|
+
const start = sessionEvents.find(
|
|
105
107
|
(e) => e.type === "session_start",
|
|
106
108
|
);
|
|
107
109
|
recordedModel = start?.data?.model || "";
|
|
108
110
|
recordedProvider = start?.data?.provider || "";
|
|
111
|
+
recordedContextSources = [...sessionEvents]
|
|
112
|
+
.reverse()
|
|
113
|
+
.find((e) => e.type === "context_sources")?.data || null;
|
|
109
114
|
} catch {
|
|
110
115
|
// header optional — fall through to flags/defaults
|
|
111
116
|
}
|
|
@@ -129,7 +134,12 @@ export function registerContextCommand(program) {
|
|
|
129
134
|
try {
|
|
130
135
|
const { loadProjectInstructions } =
|
|
131
136
|
await import("../lib/project-instructions.js");
|
|
132
|
-
const {
|
|
137
|
+
const {
|
|
138
|
+
breakdownInstructionSources,
|
|
139
|
+
breakdownMcpSchemas,
|
|
140
|
+
breakdownSkillSources,
|
|
141
|
+
rankContextSources,
|
|
142
|
+
} =
|
|
133
143
|
await import("../lib/context-breakdown.js");
|
|
134
144
|
const cwd = process.cwd();
|
|
135
145
|
let instructionExcludes;
|
|
@@ -151,15 +161,37 @@ export function registerContextCommand(program) {
|
|
|
151
161
|
estimateTokens,
|
|
152
162
|
cwd,
|
|
153
163
|
);
|
|
164
|
+
const mcp = breakdownMcpSchemas(
|
|
165
|
+
recordedContextSources?.mcp || [],
|
|
166
|
+
estimateTokens,
|
|
167
|
+
);
|
|
168
|
+
const skills = breakdownSkillSources(
|
|
169
|
+
recordedContextSources?.skills || [],
|
|
170
|
+
estimateTokens,
|
|
171
|
+
);
|
|
154
172
|
const ranked = rankContextSources({
|
|
155
173
|
instructionTotal: instr.total,
|
|
156
174
|
buckets,
|
|
157
175
|
counts,
|
|
176
|
+
extraSources: [
|
|
177
|
+
...mcp.sources.map((source) => ({
|
|
178
|
+
...source,
|
|
179
|
+
kind: "mcp_schema",
|
|
180
|
+
})),
|
|
181
|
+
...skills.sources.map((source) => ({
|
|
182
|
+
...source,
|
|
183
|
+
kind: "skill",
|
|
184
|
+
})),
|
|
185
|
+
],
|
|
158
186
|
});
|
|
159
187
|
sourceReport = {
|
|
160
188
|
cwd,
|
|
161
189
|
instructions: instr.sources,
|
|
162
190
|
instructionTokens: instr.total,
|
|
191
|
+
mcpSchemas: mcp.sources,
|
|
192
|
+
mcpSchemaTokens: mcp.total,
|
|
193
|
+
skills: skills.sources,
|
|
194
|
+
skillTokens: skills.total,
|
|
163
195
|
ranked: ranked.sources,
|
|
164
196
|
combinedTotal: ranked.total,
|
|
165
197
|
};
|
|
@@ -189,6 +221,8 @@ export function registerContextCommand(program) {
|
|
|
189
221
|
sources: sourceReport.ranked,
|
|
190
222
|
instructions: sourceReport.instructions,
|
|
191
223
|
instructionTokens: sourceReport.instructionTokens,
|
|
224
|
+
mcpSchemas: sourceReport.mcpSchemas,
|
|
225
|
+
mcpSchemaTokens: sourceReport.mcpSchemaTokens,
|
|
192
226
|
combinedTotal: sourceReport.combinedTotal,
|
|
193
227
|
cwd: sourceReport.cwd,
|
|
194
228
|
}
|
package/src/commands/hub.js
CHANGED
|
@@ -531,6 +531,12 @@ async function cmdSyncAdapter(name, options) {
|
|
|
531
531
|
// sources (wechat-pc), --db-path as an explicit alias for the DB file.
|
|
532
532
|
if (options.key) opts.key = String(options.key);
|
|
533
533
|
if (options.dbPath) opts.dbPath = String(options.dbPath);
|
|
534
|
+
// WhatsApp public-backup ADB path. `--key` accepts the crypt15 64-hex
|
|
535
|
+
// root key or a crypt14/encrypted_backup.key file path. Device selection
|
|
536
|
+
// follows --serial, then ADB_SERIAL, then the single connected device.
|
|
537
|
+
if (options.serial) opts.serial = String(options.serial);
|
|
538
|
+
if (options.whatsappBusiness) opts.business = true;
|
|
539
|
+
if (options.remotePath) opts.remotePath = String(options.remotePath);
|
|
534
540
|
// QQ NT (qq-pc): the SQLCipher passphrase from qq-win-db-key (ASCII, e.g.
|
|
535
541
|
// "5{sww#,6aq=)8=A@"). Routes qq-pc through the decrypt+parse sidecar.
|
|
536
542
|
if (options.passphrase) opts.passphrase = String(options.passphrase);
|
|
@@ -3013,7 +3019,19 @@ export function registerHubCommand(program) {
|
|
|
3013
3019
|
)
|
|
3014
3020
|
.option(
|
|
3015
3021
|
"--key <hex>",
|
|
3016
|
-
"
|
|
3022
|
+
"Encryption key: SQLCipher 64-hex, WhatsApp crypt15 64-hex, or WhatsApp key-file path",
|
|
3023
|
+
)
|
|
3024
|
+
.option(
|
|
3025
|
+
"--serial <adb-serial>",
|
|
3026
|
+
"Android device serial for ADB-backed adapters (otherwise ADB_SERIAL or the single connected device)",
|
|
3027
|
+
)
|
|
3028
|
+
.option(
|
|
3029
|
+
"--whatsapp-business",
|
|
3030
|
+
"Pull the WhatsApp Business public backup instead of the personal app backup",
|
|
3031
|
+
)
|
|
3032
|
+
.option(
|
|
3033
|
+
"--remote-path <android-path>",
|
|
3034
|
+
"Explicit WhatsApp msgstore backup path inside an allowed public Databases directory",
|
|
3017
3035
|
)
|
|
3018
3036
|
.option(
|
|
3019
3037
|
"--passphrase <key>",
|
package/src/commands/memory.js
CHANGED
|
@@ -4,8 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import chalk from "chalk";
|
|
7
|
+
import path from "node:path";
|
|
7
8
|
import { logger } from "../lib/logger.js";
|
|
8
9
|
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
10
|
+
import { parseEditorCommand } from "./config.js";
|
|
11
|
+
import { executionBroker } from "../lib/process-execution-broker/index.js";
|
|
9
12
|
import {
|
|
10
13
|
getMemoryDir,
|
|
11
14
|
addMemory,
|
|
@@ -50,6 +53,22 @@ import {
|
|
|
50
53
|
getMemoryManagerStatsV2,
|
|
51
54
|
} from "../lib/memory-manager.js";
|
|
52
55
|
|
|
56
|
+
export const _deps = {
|
|
57
|
+
execFileSync: (...args) => executionBroker.execFileSync(...args),
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export function openMemoryEditor(editor, filePath, deps = _deps) {
|
|
61
|
+
const [file, ...editorArgs] = parseEditorCommand(editor);
|
|
62
|
+
if (!file) throw new Error("EDITOR command is empty");
|
|
63
|
+
return deps.execFileSync(file, [...editorArgs, filePath], {
|
|
64
|
+
stdio: "inherit",
|
|
65
|
+
origin: "memory:editor",
|
|
66
|
+
policy: "allow",
|
|
67
|
+
scope: "memory",
|
|
68
|
+
shell: false,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
53
72
|
export function registerMemoryCommand(program) {
|
|
54
73
|
const memory = program
|
|
55
74
|
.command("memory")
|
|
@@ -596,17 +615,13 @@ export function registerMemoryCommand(program) {
|
|
|
596
615
|
const content = getMemoryFile(memoryDir);
|
|
597
616
|
|
|
598
617
|
if (options.edit) {
|
|
599
|
-
const { execSync } = await import("child_process");
|
|
600
618
|
const editor =
|
|
601
619
|
process.env.EDITOR ||
|
|
602
620
|
process.env.VISUAL ||
|
|
603
621
|
(process.platform === "win32" ? "notepad" : "nano");
|
|
604
|
-
const filePath =
|
|
622
|
+
const filePath = path.join(memoryDir, "MEMORY.md");
|
|
605
623
|
try {
|
|
606
|
-
|
|
607
|
-
// arg (editor stays unquoted so `$EDITOR` values with args work).
|
|
608
|
-
const safePath = filePath.replace(/"/g, '\\"');
|
|
609
|
-
execSync(`${editor} "${safePath}"`, { stdio: "inherit" });
|
|
624
|
+
openMemoryEditor(editor, filePath);
|
|
610
625
|
logger.success("Memory file updated");
|
|
611
626
|
} catch {
|
|
612
627
|
logger.error(
|