chainlesschain 0.162.143 → 0.162.147
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 +2 -2
- package/src/assets/web-panel/assets/{AIOps-Bq1t-B4V.js → AIOps-DywJ7xTv.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BHb3KMc3.js → ActionButton-BTlqcY-q.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DtJrE99O.js → Analytics-FdG1Mvwy.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-HXt309zh.js → AppLayout-CVsnbvN1.js} +5 -5
- package/src/assets/web-panel/assets/{Audit-B-0384hX.js → Audit-ITdpJ7vR.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BXNwUJ7y.js → Backup-BfXqnXo1.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CYdSBe24.js → BaseInput-C09ip3_E.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-C5hSt-bf.js → Chat-qdkhB42l.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-BJQ6SG49.js → ChatBubbleRenderer-D2KfETZD.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DZSpGJs8.js → Checkbox-j6WZCuff.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BKfMmpq3.js → Codegen-CGZ-K3uK.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DgsxR9Gb.js → Col-CIlPOAu6.js} +1 -1
- package/src/assets/web-panel/assets/{Community-B3GhKOp_.js → Community-sY-i-hic.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-Dtk1xHSY.js → Compact-DcoEfyL8.js} +1 -1
- package/src/assets/web-panel/assets/Compliance-T8EtTecW.js +1 -0
- package/src/assets/web-panel/assets/{Cowork-CB_Tby_i.js → Cowork-DLY_fkLv.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-BLQFn3UU.js → Cron-D049pZBC.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-LCVSqtiL.js → Crosschain-DCXdE8M9.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Cv3xor-m.js → DID-JCvPZtjW.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DHAEYeUk.js → Dashboard-Cg2xu3iE.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-FAp99VHO.js → Dropdown-DjJLjbLh.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Cl4enKIT.js → EmailListRenderer-DugNcSLR.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CgbuK_Rv.js → FamilyGuardDashboard-J6Nb-E30.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-C2I5-34o.js → Federation-CQ3Ttpbl.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-4RNlhf3D.js → FormItemContext-Cz0NKag4.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DmaKYzyo.js → GenericCardRenderer-NYcMP6iz.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BMrCOEGV.js → Git-B4hYN18N.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BLwFR0Vd.js → Governance-DOQPCcC0.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Cdlx3Y4t.js → Inference-HtLF746W.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CiwGb2h3.js → KnowledgeGraph-BXrk8rMm.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-C6A4r33C.js → Logs-DS0JnD3-.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-DdybH2YZ.js → Marketplace-Cqnjihrz.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-pgwwEzwg.js → McpTools-Cx3Psk-U.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-BQ31MLPN.js → Memory-BjyysPtj.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CnRXuSP5.js → MobileBridge-CYaITZ7w.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CmnCTggB.js → MobileProjects-Xwf-fdOQ.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-3K6RfaUB.js → Mtc-Djkql5m5.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BN9hXvXq.js → MtcAudit-D2BAZlu0.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-CRxIT2RV.js → Multisig-ByqP1ZzH.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CdPvh_dA.js → NLProgramming-C_kn0nE2.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DzQSZ0ps.js → Notes-7l7eXHPq.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DkqRVvfb.js → NotificationSettings-BrCDoitw.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-ClTA64ji.js → OrderTableRenderer-CmtqIdwr.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-B-Pndhhn.js → Organization-DdoNAxsM.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Dt56UM9b.js → Overflow-Bw7R6dE3.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-JDGQmED0.js → P2P-DJNtBugA.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-Dwhd5_ue.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-Dnqe1sny.js → Permissions-BYoSfhPR.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-mTkYbIR-.js → PersonalDataHub-aYCYJbnH.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-BG6J9UZO.js → Pipeline-DJp6CprF.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BdEydH6w.js → Privacy-Cq9HZweR.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-QPxCoUzs.js → ProjectInit-CmF0HsSt.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-hU_phubM.js → ProjectSettings-P8V5Aea2.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BBzAEGk4.js → Projects-DPd5-lNS.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DJ_bIDRG.js → Providers-D589v0q2.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BNmX7Jgh.js → QuickAsk-lvRV2osB.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Bo1I5nAG.js → Recommend-sb84MTpY.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-Bc9mfsh7.js → Reputation-d9Y3vy-W.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D12ZZx5m.js → Row-DMdhLUTp.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CXSlmgHl.js → RssFeed-OL-SMDkz.js} +2 -2
- package/src/assets/web-panel/assets/{Search-bNXObahl.js → Search-BjStLKq1.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Bt7yBkJc.js → Security-MeI411qr.js} +2 -2
- package/src/assets/web-panel/assets/{Services-ECQDydWI.js → Services-UajosuhT.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BcgzLbTM.js → Skeleton-CGpG-QJ1.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-py_xMG8b.js → Skills-C6P2RPY-.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CzNvjwaW.js → Sla-B_fPprgw.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-S3zMMqbB.js → SpeechSettings-CqxLjSlQ.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BpDfhFv6.js → SyncSettings-DixSfFOQ.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CUn36tpM.js → Tasks-PavzPBxc.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-yzCxc3lI.js → Templates-BYdGRnfX.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BTMrYsHv.js → Tenant-BQLgnarD.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-BzOHpq-B.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-BwJ4nL9S.js → TimelineRenderer-Bv7uZRM7.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-B1OwTaT_.js → Tokens-DxhgszRJ.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BDxi9fib.js → Trigger-nQYHayuc.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-B_5hXqzI.js → Trust-CvqZDuZ4.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BpIMO611.js → UkeySign-DaR8GV2I.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Ds-9lxOW.js → VideoEditing-C6Mpsokw.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CNfFp8if.js → Wallet-B57VRrWc.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DbCj1-qn.js → WebAuthn-BbtEEtpq.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-DjEeb957.js → WorkflowEditor-C5LwvKmH.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BX-27gI4.js → chat-MzuPR5jh.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CfM5FmdA.js → colors-HyW8mi_y.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Cb0Fm64g.js → compact-item-DvUSzWAp.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-D99MZ4gz.js → createContext-4MppZl7X.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-6YJJMjSH.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CW7wPkfb.js → hasIn-D9q3CJ-u.js} +1 -1
- package/src/assets/web-panel/assets/{index-kRlIAKNw.js → index--Bm6OqmU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BqOy4TS5.js → index-B5E4DhVc.js} +1 -1
- package/src/assets/web-panel/assets/{index--Y8IzVi2.js → index-B994UQfE.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dt-h8idq.js → index-BF2JsbiX.js} +1 -1
- package/src/assets/web-panel/assets/{index-ChGWrUQv.js → index-BFGfC5RS.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAIk483F.js → index-BGQtFso0.js} +1 -1
- package/src/assets/web-panel/assets/{index-CxG5S21O.js → index-BcunsBIx.js} +1 -1
- package/src/assets/web-panel/assets/{index-rIKv98lY.js → index-Bl-E4W4q.js} +1 -1
- package/src/assets/web-panel/assets/{index-CxFhtfoo.js → index-BmCo2Xdp.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUENEaPU.js → index-Btz8pU68.js} +1 -1
- package/src/assets/web-panel/assets/{index-D8U1HFcm.js → index-C0DiL97c.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFRrP3LL.js → index-C9I5MuJ0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcRbrdqR.js → index-CLAZs1Vd.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcCSEGzu.js → index-Caqtu6Et.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXrNkD5j.js → index-CgIfXOD9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DwhDhfZ8.js → index-Ci6adKh8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CzwoBX8m.js → index-CifKUNtV.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8tI4Hg_.js → index-Cs-RKRUM.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bf7G5mYl.js → index-CucRo4Vz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CvFAgMxx.js → index-CvAqCAo9.js} +1 -1
- package/src/assets/web-panel/assets/{index-7cahuPKG.js → index-D2jrnaq3.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cavk4P2D.js → index-D7TDMMfu.js} +1 -1
- package/src/assets/web-panel/assets/{index-BoCp5SY7.js → index-DDZ6fP5Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPXhpO02.js → index-DFqvWeGc.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNhZanpM.js → index-DNYqw0MO.js} +1 -1
- package/src/assets/web-panel/assets/index-D_oeGLr6.js +1 -0
- package/src/assets/web-panel/assets/{index-BTlOIaQj.js → index-DcMkjb92.js} +1 -1
- package/src/assets/web-panel/assets/{index-3TDpYBKK.js → index-DmZ6-suL.js} +1 -1
- package/src/assets/web-panel/assets/{index-ClSExghA.js → index-Dv7ffI2g.js} +1 -1
- package/src/assets/web-panel/assets/{index-ab4T5cPr.js → index-Dvg5xYuP.js} +1 -1
- package/src/assets/web-panel/assets/index-Qa57YG19.js +1 -0
- package/src/assets/web-panel/assets/{index-yBiqcb9Z.js → index-SDblbKj6.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDGBasj6.js → index-UUMCA2Sq.js} +3 -3
- package/src/assets/web-panel/assets/{index-kt0S8nXp.js → index-Zvtru2oE.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaPluhcX.js → index-eOQO6KnV.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZjN-U7A.js → index-m0b6Fj9q.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUxnWbi6.js → index-ryFLxB1p.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPmtR1Wr.js → index-xvUVuFnA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAd31-6W.js → index-zLwYpvX0.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-mzQV01we.js → initDefaultProps-CC--PMsC.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DgWAtKps.js → motion-DdrBjRF1.js} +1 -1
- package/src/assets/web-panel/assets/{move-Dm9NMjIw.js → move-D712Gwl2.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BpuQIoKH.js → mtc-parser-39y-keKO.js} +1 -1
- package/src/assets/web-panel/assets/{omit-C507FdFH.js → omit-6Y51gDB9.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BL5eykDR.js → pickAttrs-Cy6EHbq9.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-uSE1U6yg.js → placementArrow-BYxdAm0p.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BVhSz_U1.js → responsiveObserve-C9R6q_cr.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CWCp5XZc.js → slide-CXUJlilB.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-B_rS9tlX.js → statusUtils-DOtrOeql.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DRo4TNq4.js → styleChecker-D5r39o92.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-QsPzwpvi.js → useFlexGapSupport-DfAD5U4Z.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DhsLsCr_.js → useFs-BkrT-Zbc.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BXI-FLwS.js → usePersonalDataHub-BwnnnZjU.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CYE0CVkI.js → vnode-SU-N4pum.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-B2-MtXVF.js → zoom-DHScfpTP.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/auth/npm-auth.js +65 -0
- package/src/commands/agent.js +92 -0
- package/src/commands/agents.js +68 -0
- package/src/commands/permissions.js +66 -10
- package/src/commands/plugin.js +50 -3
- package/src/lib/agent-sandbox.js +72 -0
- package/src/lib/background-agent-supervisor.js +197 -0
- package/src/lib/code-review.js +72 -0
- package/src/lib/plugin-security.js +128 -0
- package/src/lib/pr-create.js +108 -0
- package/src/lib/publish-workspace.js +107 -0
- package/src/lib/resume-session.js +111 -0
- package/src/lib/settings-hooks.cjs +68 -25
- package/src/lib/settings-loader.cjs +115 -2
- package/src/lib/task-list.js +53 -0
- package/src/repl/agent-repl.js +83 -2
- package/src/repl/agents-status.js +8 -2
- package/src/repl/btw-command.js +56 -0
- package/src/repl/chat-repl.js +52 -1
- package/src/repl/hooks-status.js +1 -2
- package/src/repl/slash-command-registry.js +197 -0
- package/src/runtime/agent-core.js +137 -1
- package/src/runtime/coding-agent-contract-shared.cjs +37 -0
- package/src/runtime/coding-agent-policy.cjs +14 -0
- package/src/runtime/headless-runner.js +26 -6
- package/src/runtime/headless-stream.js +25 -6
- package/src/runtime/mcp-config.js +46 -2
- package/src/runtime/policies/agent-policy.js +1 -0
- package/src/workers/background-agent-worker.js +60 -0
- package/src/assets/web-panel/assets/Compliance-DmkkUDze.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-C56Oi811.js +0 -7
- package/src/assets/web-panel/assets/Terminal-BjZry1Jj.js +0 -3
- package/src/assets/web-panel/assets/devWarning-CDh1y3xt.js +0 -1
- package/src/assets/web-panel/assets/index-ACeVMo7x.js +0 -1
- package/src/assets/web-panel/assets/index-gYKDzWA9.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as d}from"./index-
|
|
1
|
+
import{u as d}from"./index-UUMCA2Sq.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-UUMCA2Sq.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-UUMCA2Sq.js";import{a7 as o,k as g,C as d,F as f,A as p}from"./vendor-BvqAck49.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-UUMCA2Sq.js";import{i as f}from"./motion-DdrBjRF1.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-UUMCA2Sq.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="./assets/vendor-BvqAck49.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="./assets/icons-DP3uiYxy.js">
|
|
14
14
|
<link rel="stylesheet" crossorigin href="./assets/index-Cq93VfoF.css">
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* npm authentication utilities (ESM)
|
|
3
|
+
* Mirrors Claude Code /login /logout behavior
|
|
4
|
+
* @module auth/npm-auth
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { execSync } from "child_process";
|
|
8
|
+
import { logger } from "../lib/logger.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Check if user is currently logged in to npm
|
|
12
|
+
* @returns {boolean}
|
|
13
|
+
*/
|
|
14
|
+
export function isLoggedIn() {
|
|
15
|
+
try {
|
|
16
|
+
execSync("npm whoami", { stdio: "ignore" });
|
|
17
|
+
return true;
|
|
18
|
+
} catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Get current npm username
|
|
25
|
+
* @returns {string|null}
|
|
26
|
+
*/
|
|
27
|
+
export function getCurrentUser() {
|
|
28
|
+
try {
|
|
29
|
+
return execSync("npm whoami", { encoding: "utf8" }).trim();
|
|
30
|
+
} catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Run npm login
|
|
37
|
+
* @returns {Promise<boolean>} success
|
|
38
|
+
*/
|
|
39
|
+
export async function login() {
|
|
40
|
+
try {
|
|
41
|
+
logger.info("Running npm login...");
|
|
42
|
+
execSync("npm login", { stdio: "inherit" });
|
|
43
|
+
return isLoggedIn();
|
|
44
|
+
} catch (err) {
|
|
45
|
+
logger.error(`Login failed: ${err.message}`);
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Run npm logout
|
|
52
|
+
* @returns {Promise<boolean>} success
|
|
53
|
+
*/
|
|
54
|
+
export async function logout() {
|
|
55
|
+
try {
|
|
56
|
+
logger.info("Running npm logout...");
|
|
57
|
+
execSync("npm logout", { stdio: "inherit" });
|
|
58
|
+
return !isLoggedIn();
|
|
59
|
+
} catch (err) {
|
|
60
|
+
logger.error(`Logout failed: ${err.message}`);
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export default { isLoggedIn, getCurrentUser, login, logout };
|
package/src/commands/agent.js
CHANGED
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
} from "../runtime/fallback-model.js";
|
|
17
17
|
import { resolveImages, resolveVisionLlm } from "../lib/image-input.js";
|
|
18
18
|
import { loadConfig } from "../lib/config-manager.js";
|
|
19
|
+
import { normalizeAgentSandbox } from "../lib/agent-sandbox.js";
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* Resolve + validate `--add-dir` values into absolute, existing, de-duped
|
|
@@ -171,6 +172,15 @@ export function registerAgentCommand(program) {
|
|
|
171
172
|
"--worktree",
|
|
172
173
|
"Run this session in a fresh git worktree (isolated branch; auto-removed when the session changes nothing)",
|
|
173
174
|
)
|
|
175
|
+
.option(
|
|
176
|
+
"--sandbox [image]",
|
|
177
|
+
"Run shell commands in an ephemeral Docker sandbox (network disabled by default)",
|
|
178
|
+
)
|
|
179
|
+
.option("--sandbox-network", "Allow network access inside --sandbox")
|
|
180
|
+
.option(
|
|
181
|
+
"--bg, --background",
|
|
182
|
+
"Start as a detached background agent and return its id immediately",
|
|
183
|
+
)
|
|
174
184
|
.option("--agent-id <id>", "Agent id for scoped memory recall")
|
|
175
185
|
.option("--recall-limit <n>", "Top-K memories to inject into system prompt")
|
|
176
186
|
.option("--recall-query <q>", "Query string for startup memory recall")
|
|
@@ -308,7 +318,29 @@ export function registerAgentCommand(program) {
|
|
|
308
318
|
"--replay-user-messages",
|
|
309
319
|
"Stream-input mode: echo each accepted stdin user message back as a `user` event (transcript/correlation)",
|
|
310
320
|
)
|
|
321
|
+
.option(
|
|
322
|
+
"--allow-dangerous-bypass",
|
|
323
|
+
"Bypass all permission prompts in headless mode (DANGEROUS: auto-approves all tool calls)",
|
|
324
|
+
false,
|
|
325
|
+
)
|
|
326
|
+
.option("-y, --yolo", "Alias for --allow-dangerous-bypass", false)
|
|
327
|
+
.option(
|
|
328
|
+
"--dangerously-skip-permissions",
|
|
329
|
+
"Alias for --allow-dangerous-bypass",
|
|
330
|
+
false,
|
|
331
|
+
)
|
|
311
332
|
.action(async (task, options, command) => {
|
|
333
|
+
const bypassPermissions = !!(
|
|
334
|
+
options.allowDangerousBypass ||
|
|
335
|
+
options.yolo ||
|
|
336
|
+
options.dangerouslySkipPermissions
|
|
337
|
+
);
|
|
338
|
+
if (bypassPermissions) {
|
|
339
|
+
process.env.CC_BYPASS_PERMISSIONS = "1";
|
|
340
|
+
process.stderr.write(
|
|
341
|
+
"⚠️ DANGER MODE: All permissions bypassed, no prompts will be shown.\n",
|
|
342
|
+
);
|
|
343
|
+
}
|
|
312
344
|
// --safe-mode flag OR CC_SAFE_MODE / CLAUDE_CODE_SAFE_MODE env (Claude-Code
|
|
313
345
|
// 2.1.169 parity): flip every customization kill-switch BEFORE anything
|
|
314
346
|
// loads. Permission rules stay active.
|
|
@@ -735,7 +767,62 @@ export function registerAgentCommand(program) {
|
|
|
735
767
|
if (piped) prompt = piped;
|
|
736
768
|
}
|
|
737
769
|
|
|
770
|
+
if (options.bg && !prompt) {
|
|
771
|
+
process.stderr.write(
|
|
772
|
+
"--bg requires a task via positional text, -p, or piped stdin.\n",
|
|
773
|
+
);
|
|
774
|
+
process.exitCode = 1;
|
|
775
|
+
return;
|
|
776
|
+
}
|
|
777
|
+
|
|
738
778
|
if (prompt) {
|
|
779
|
+
if (options.bg) {
|
|
780
|
+
if (options.worktree) {
|
|
781
|
+
process.stderr.write(
|
|
782
|
+
"--bg and --worktree cannot be combined yet; create the worktree first and launch the background agent from it.\n",
|
|
783
|
+
);
|
|
784
|
+
process.exitCode = 1;
|
|
785
|
+
return;
|
|
786
|
+
}
|
|
787
|
+
const { launchBackgroundAgent } =
|
|
788
|
+
await import("../lib/background-agent-supervisor.js");
|
|
789
|
+
const childArgv = process.argv
|
|
790
|
+
.slice(2)
|
|
791
|
+
.filter((arg) => arg !== "--bg" && arg !== "--background");
|
|
792
|
+
const hasSessionArg = childArgv.some(
|
|
793
|
+
(arg) =>
|
|
794
|
+
arg === "--session" ||
|
|
795
|
+
arg === "--resume" ||
|
|
796
|
+
arg === "--continue" ||
|
|
797
|
+
arg === "-c",
|
|
798
|
+
);
|
|
799
|
+
const sessionId =
|
|
800
|
+
options.session ||
|
|
801
|
+
`session-${Date.now()}-${Math.random().toString(16).slice(2, 8)}`;
|
|
802
|
+
if (!hasSessionArg) childArgv.push("--session", sessionId);
|
|
803
|
+
const promptWasPiped =
|
|
804
|
+
positional.length === 0 &&
|
|
805
|
+
!(typeof options.print === "string" && options.print.trim());
|
|
806
|
+
if (promptWasPiped) childArgv.push(prompt);
|
|
807
|
+
const state = launchBackgroundAgent({
|
|
808
|
+
argv: childArgv,
|
|
809
|
+
cwd: process.cwd(),
|
|
810
|
+
sessionId,
|
|
811
|
+
title: prompt.slice(0, 100),
|
|
812
|
+
});
|
|
813
|
+
if (options.outputFormat === "json") {
|
|
814
|
+
console.log(JSON.stringify(state));
|
|
815
|
+
} else {
|
|
816
|
+
console.log(`Background agent started: ${state.id}`);
|
|
817
|
+
console.log(` logs: cc agents logs ${state.id}`);
|
|
818
|
+
console.log(` stop: cc agents stop ${state.id}`);
|
|
819
|
+
}
|
|
820
|
+
return;
|
|
821
|
+
}
|
|
822
|
+
const agentSandbox = normalizeAgentSandbox(options.sandbox, {
|
|
823
|
+
cwd: process.cwd(),
|
|
824
|
+
network: options.sandboxNetwork === true,
|
|
825
|
+
});
|
|
739
826
|
// Resume requested onto a session with no headless (JSONL) transcript?
|
|
740
827
|
// Warn instead of silently starting empty 鈥?headless resume rebuilds
|
|
741
828
|
// from the JSONL store only (DB-only sessions are not replayable here).
|
|
@@ -775,6 +862,7 @@ export function registerAgentCommand(program) {
|
|
|
775
862
|
allowedTools: parseToolList(options.allowedTools),
|
|
776
863
|
disallowedTools: parseToolList(options.disallowedTools),
|
|
777
864
|
additionalDirectories,
|
|
865
|
+
sandbox: agentSandbox,
|
|
778
866
|
autoCheckpoint,
|
|
779
867
|
maxTurns,
|
|
780
868
|
// commander maps --no-file-refs 鈫?options.fileRefs === false
|
|
@@ -884,6 +972,10 @@ export function registerAgentCommand(program) {
|
|
|
884
972
|
parkOnExit: options.parkOnExit, // false when --no-park-on-exit
|
|
885
973
|
bundlePath: options.bundle || null,
|
|
886
974
|
additionalDirectories,
|
|
975
|
+
sandbox: normalizeAgentSandbox(options.sandbox, {
|
|
976
|
+
cwd: process.cwd(),
|
|
977
|
+
network: options.sandboxNetwork === true,
|
|
978
|
+
}),
|
|
887
979
|
autoCheckpoint,
|
|
888
980
|
// --vim: start the REPL in vim-mode editing (also CC_VIM=1 or /vim).
|
|
889
981
|
vimMode: options.vim === true,
|
package/src/commands/agents.js
CHANGED
|
@@ -22,6 +22,74 @@ export function registerAgentsCommand(program) {
|
|
|
22
22
|
.command("agents")
|
|
23
23
|
.description("User-defined subagents (.claude/agents/*.md)");
|
|
24
24
|
|
|
25
|
+
cmd
|
|
26
|
+
.command("background")
|
|
27
|
+
.alias("bg")
|
|
28
|
+
.description("List background agent sessions")
|
|
29
|
+
.option("--all", "Include completed, failed, stopped and lost sessions")
|
|
30
|
+
.option("--json", "Output as JSON")
|
|
31
|
+
.action(async (options) => {
|
|
32
|
+
const { listBackgroundAgents } =
|
|
33
|
+
await import("../lib/background-agent-supervisor.js");
|
|
34
|
+
const sessions = listBackgroundAgents({ all: options.all === true });
|
|
35
|
+
if (options.json) {
|
|
36
|
+
console.log(JSON.stringify(sessions, null, 2));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (sessions.length === 0) {
|
|
40
|
+
logger.log(chalk.gray("No background agents."));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
for (const session of sessions) {
|
|
44
|
+
const elapsed = session.endedAt
|
|
45
|
+
? session.endedAt - session.startedAt
|
|
46
|
+
: Date.now() - session.startedAt;
|
|
47
|
+
logger.log(
|
|
48
|
+
`${chalk.cyan(session.id)} ${session.status.padEnd(9)} ${Math.max(0, Math.round(elapsed / 1000))}s ${session.title || ""}`,
|
|
49
|
+
);
|
|
50
|
+
logger.log(chalk.gray(` pid ${session.pid} ${session.cwd}`));
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
cmd
|
|
55
|
+
.command("logs <id>")
|
|
56
|
+
.description("Print recent output from a background agent")
|
|
57
|
+
.option("-n, --lines <n>", "Number of lines", "100")
|
|
58
|
+
.action(async (id, options) => {
|
|
59
|
+
try {
|
|
60
|
+
const { readBackgroundAgentState, readBackgroundAgentLog } =
|
|
61
|
+
await import("../lib/background-agent-supervisor.js");
|
|
62
|
+
if (!readBackgroundAgentState(id)) {
|
|
63
|
+
throw new Error(`Background agent not found: ${id}`);
|
|
64
|
+
}
|
|
65
|
+
process.stdout.write(
|
|
66
|
+
readBackgroundAgentLog(id, { lines: Number(options.lines) }),
|
|
67
|
+
);
|
|
68
|
+
} catch (error) {
|
|
69
|
+
logger.error(chalk.red(error.message));
|
|
70
|
+
process.exitCode = 1;
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
cmd
|
|
75
|
+
.command("stop <id>")
|
|
76
|
+
.description("Stop a running background agent")
|
|
77
|
+
.option("--json", "Output as JSON")
|
|
78
|
+
.action(async (id, options) => {
|
|
79
|
+
try {
|
|
80
|
+
const { stopBackgroundAgent } =
|
|
81
|
+
await import("../lib/background-agent-supervisor.js");
|
|
82
|
+
const state = stopBackgroundAgent(id);
|
|
83
|
+
if (options.json) console.log(JSON.stringify(state, null, 2));
|
|
84
|
+
else if (state.stopped)
|
|
85
|
+
logger.log(chalk.green(`Stopped background agent ${id}`));
|
|
86
|
+
else logger.log(chalk.gray(`${id} is already ${state.status}`));
|
|
87
|
+
} catch (error) {
|
|
88
|
+
logger.error(chalk.red(error.message));
|
|
89
|
+
process.exitCode = 1;
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
25
93
|
// ── list ──────────────────────────────────────────────────────────────
|
|
26
94
|
cmd
|
|
27
95
|
.command("list")
|
|
@@ -53,26 +53,33 @@ export function registerPermissionsCommand(program) {
|
|
|
53
53
|
cmd
|
|
54
54
|
.command("list")
|
|
55
55
|
.alias("ls")
|
|
56
|
-
.description(
|
|
56
|
+
.description(
|
|
57
|
+
"Show the merged permission ruleset and where each rule came from",
|
|
58
|
+
)
|
|
57
59
|
.option("--json", "Output as JSON")
|
|
58
60
|
.option("--settings <file>", "Also merge an explicit settings file")
|
|
59
61
|
.action(async (options) => {
|
|
60
62
|
try {
|
|
61
63
|
const { loadSettings } = await import("../lib/settings-loader.cjs");
|
|
62
|
-
const { rules, sources, files } = loadSettings({
|
|
64
|
+
const { rules, sources, files, managed, managedFile } = loadSettings({
|
|
63
65
|
cwd: process.cwd(),
|
|
64
66
|
settingsFile: options.settings,
|
|
65
67
|
});
|
|
66
68
|
if (options.json) {
|
|
67
|
-
console.log(
|
|
69
|
+
console.log(
|
|
70
|
+
JSON.stringify(
|
|
71
|
+
{ rules, sources, files, managed, managedFile },
|
|
72
|
+
null,
|
|
73
|
+
2,
|
|
74
|
+
),
|
|
75
|
+
);
|
|
68
76
|
return;
|
|
69
77
|
}
|
|
70
|
-
const total =
|
|
71
|
-
rules.allow.length + rules.ask.length + rules.deny.length;
|
|
78
|
+
const total = rules.allow.length + rules.ask.length + rules.deny.length;
|
|
72
79
|
if (total === 0) {
|
|
73
80
|
logger.log(
|
|
74
81
|
chalk.gray(
|
|
75
|
-
|
|
82
|
+
'No permission rules. Add one: cc permissions add deny "Bash(rm:*)"\n' +
|
|
76
83
|
"(or create .claude/settings.json with a permissions block)",
|
|
77
84
|
),
|
|
78
85
|
);
|
|
@@ -89,6 +96,40 @@ export function registerPermissionsCommand(program) {
|
|
|
89
96
|
if (files.length) {
|
|
90
97
|
logger.log(chalk.dim(`\nsources: ${files.join(", ")}`));
|
|
91
98
|
}
|
|
99
|
+
if (managedFile) {
|
|
100
|
+
logger.log(chalk.yellow(`managed policy: ${managedFile}`));
|
|
101
|
+
if (managed?.allowManagedPermissionRulesOnly) {
|
|
102
|
+
logger.log(
|
|
103
|
+
chalk.yellow(" user/project permission rules disabled"),
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
if (
|
|
107
|
+
managed?.disableBypassPermissionsMode === true ||
|
|
108
|
+
managed?.disableBypassPermissionsMode === "disable"
|
|
109
|
+
) {
|
|
110
|
+
logger.log(chalk.yellow(" bypassPermissions disabled"));
|
|
111
|
+
}
|
|
112
|
+
if (managed?.allowManagedHooksOnly) {
|
|
113
|
+
logger.log(chalk.yellow(" only managed hooks may run"));
|
|
114
|
+
}
|
|
115
|
+
if (managed?.allowManagedMcpServersOnly) {
|
|
116
|
+
logger.log(
|
|
117
|
+
chalk.yellow(" only managed-allowed MCP servers may connect"),
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
if (managed?.requireSignedPlugins) {
|
|
121
|
+
logger.log(chalk.yellow(" signed plugin manifests required"));
|
|
122
|
+
}
|
|
123
|
+
if (
|
|
124
|
+
Array.isArray(managed?.allowedPlugins) ||
|
|
125
|
+
Array.isArray(managed?.deniedPlugins) ||
|
|
126
|
+
Array.isArray(managed?.blockedMarketplaces)
|
|
127
|
+
) {
|
|
128
|
+
logger.log(
|
|
129
|
+
chalk.yellow(" managed plugin supply-chain policy active"),
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
92
133
|
} catch (err) {
|
|
93
134
|
logger.error(chalk.red(`permissions list failed: ${err.message}`));
|
|
94
135
|
process.exitCode = 1;
|
|
@@ -131,7 +172,13 @@ export function registerPermissionsCommand(program) {
|
|
|
131
172
|
if (options.json) {
|
|
132
173
|
console.log(
|
|
133
174
|
JSON.stringify(
|
|
134
|
-
{
|
|
175
|
+
{
|
|
176
|
+
tool: concrete,
|
|
177
|
+
args: toolArgs,
|
|
178
|
+
decision,
|
|
179
|
+
rule: result.rule,
|
|
180
|
+
source,
|
|
181
|
+
},
|
|
135
182
|
null,
|
|
136
183
|
2,
|
|
137
184
|
),
|
|
@@ -164,14 +211,19 @@ export function registerPermissionsCommand(program) {
|
|
|
164
211
|
cmd
|
|
165
212
|
.command("add <decision> <rule>")
|
|
166
213
|
.description("Append a rule (allow|ask|deny) to a settings file")
|
|
167
|
-
.option(
|
|
214
|
+
.option(
|
|
215
|
+
"--local",
|
|
216
|
+
"Write to .claude/settings.local.json (personal, gitignored)",
|
|
217
|
+
)
|
|
168
218
|
.option("--user", "Write to ~/.claude/settings.json (all projects)")
|
|
169
219
|
.action(async (decision, rule, options) => {
|
|
170
220
|
try {
|
|
171
221
|
const kind = String(decision || "").toLowerCase();
|
|
172
222
|
if (!["allow", "ask", "deny"].includes(kind)) {
|
|
173
223
|
logger.error(
|
|
174
|
-
chalk.red(
|
|
224
|
+
chalk.red(
|
|
225
|
+
`decision must be allow | ask | deny (got "${decision}")`,
|
|
226
|
+
),
|
|
175
227
|
);
|
|
176
228
|
process.exitCode = 1;
|
|
177
229
|
return;
|
|
@@ -188,7 +240,11 @@ export function registerPermissionsCommand(program) {
|
|
|
188
240
|
return;
|
|
189
241
|
}
|
|
190
242
|
|
|
191
|
-
const scope = options.user
|
|
243
|
+
const scope = options.user
|
|
244
|
+
? "user"
|
|
245
|
+
: options.local
|
|
246
|
+
? "local"
|
|
247
|
+
: "project";
|
|
192
248
|
const { addRule } = await import("../lib/settings-loader.cjs");
|
|
193
249
|
const { file, added } = addRule({
|
|
194
250
|
cwd: process.cwd(),
|
package/src/commands/plugin.js
CHANGED
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
import chalk from "chalk";
|
|
7
7
|
import { logger } from "../lib/logger.js";
|
|
8
|
+
import {
|
|
9
|
+
enforcePluginPolicy,
|
|
10
|
+
loadPluginManagedPolicy,
|
|
11
|
+
verifyPluginManifest,
|
|
12
|
+
} from "../lib/plugin-security.js";
|
|
8
13
|
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
9
14
|
import {
|
|
10
15
|
installPlugin,
|
|
@@ -90,9 +95,32 @@ export function registerPluginCommand(program) {
|
|
|
90
95
|
.option("--description <desc>", "Plugin description")
|
|
91
96
|
.option("--author <author>", "Plugin author")
|
|
92
97
|
.option("--manifest <path>", "Plugin manifest file with skill declarations")
|
|
98
|
+
.option("--source <source>", "Plugin source or marketplace identifier")
|
|
99
|
+
.option("--sha256 <hex>", "Expected SHA-256 of the manifest")
|
|
100
|
+
.option("--signature <path>", "Detached Ed25519 signature of the manifest")
|
|
101
|
+
.option("--public-key <path>", "PEM public key used to verify --signature")
|
|
93
102
|
.option("--json", "Output as JSON")
|
|
94
103
|
.action(async (name, options) => {
|
|
95
104
|
try {
|
|
105
|
+
const managed = loadPluginManagedPolicy();
|
|
106
|
+
enforcePluginPolicy(
|
|
107
|
+
{ name, source: options.source, action: "install" },
|
|
108
|
+
managed,
|
|
109
|
+
);
|
|
110
|
+
let verifiedManifest = null;
|
|
111
|
+
let parsedManifest = null;
|
|
112
|
+
if (options.manifest || managed?.requireSignedPlugins) {
|
|
113
|
+
verifiedManifest = verifyPluginManifest({
|
|
114
|
+
manifestFile: options.manifest,
|
|
115
|
+
expectedSha256: options.sha256,
|
|
116
|
+
signatureFile: options.signature,
|
|
117
|
+
publicKeyFile: options.publicKey,
|
|
118
|
+
requireSignature: managed?.requireSignedPlugins === true,
|
|
119
|
+
trustedKeySha256: managed?.trustedPluginKeySha256,
|
|
120
|
+
requireTrustedKey: managed?.requireSignedPlugins === true,
|
|
121
|
+
});
|
|
122
|
+
parsedManifest = JSON.parse(verifiedManifest.bytes.toString("utf8"));
|
|
123
|
+
}
|
|
96
124
|
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
97
125
|
if (!ctx.db) {
|
|
98
126
|
logger.error("Database not available");
|
|
@@ -111,8 +139,9 @@ export function registerPluginCommand(program) {
|
|
|
111
139
|
if (options.manifest) {
|
|
112
140
|
try {
|
|
113
141
|
const fs = await import("fs");
|
|
114
|
-
const
|
|
115
|
-
|
|
142
|
+
const manifest =
|
|
143
|
+
parsedManifest ||
|
|
144
|
+
JSON.parse(fs.readFileSync(options.manifest, "utf-8"));
|
|
116
145
|
if (manifest.skills && manifest.skills.length > 0) {
|
|
117
146
|
const path = await import("path");
|
|
118
147
|
const pluginPath = path.dirname(path.resolve(options.manifest));
|
|
@@ -131,7 +160,17 @@ export function registerPluginCommand(program) {
|
|
|
131
160
|
if (options.json) {
|
|
132
161
|
console.log(
|
|
133
162
|
JSON.stringify(
|
|
134
|
-
{
|
|
163
|
+
{
|
|
164
|
+
...result,
|
|
165
|
+
skills: skillResult.installed,
|
|
166
|
+
integrity: verifiedManifest
|
|
167
|
+
? {
|
|
168
|
+
sha256: verifiedManifest.sha256,
|
|
169
|
+
signatureVerified: verifiedManifest.signatureVerified,
|
|
170
|
+
publicKeySha256: verifiedManifest.publicKeySha256,
|
|
171
|
+
}
|
|
172
|
+
: null,
|
|
173
|
+
},
|
|
135
174
|
null,
|
|
136
175
|
2,
|
|
137
176
|
),
|
|
@@ -205,6 +244,10 @@ export function registerPluginCommand(program) {
|
|
|
205
244
|
.argument("<name>", "Plugin name")
|
|
206
245
|
.action(async (name) => {
|
|
207
246
|
try {
|
|
247
|
+
enforcePluginPolicy(
|
|
248
|
+
{ name, action: "enable" },
|
|
249
|
+
loadPluginManagedPolicy(),
|
|
250
|
+
);
|
|
208
251
|
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
209
252
|
if (!ctx.db) {
|
|
210
253
|
logger.error("Database not available");
|
|
@@ -262,6 +305,10 @@ export function registerPluginCommand(program) {
|
|
|
262
305
|
.argument("<version>", "New version")
|
|
263
306
|
.action(async (name, version) => {
|
|
264
307
|
try {
|
|
308
|
+
enforcePluginPolicy(
|
|
309
|
+
{ name, action: "update" },
|
|
310
|
+
loadPluginManagedPolicy(),
|
|
311
|
+
);
|
|
265
312
|
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
266
313
|
if (!ctx.db) {
|
|
267
314
|
logger.error("Database not available");
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** OS-isolated shell execution for the coding agent. */
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
|
|
5
|
+
export const DEFAULT_SANDBOX_IMAGE = "node:22-bookworm-slim";
|
|
6
|
+
export const _deps = { spawnSync };
|
|
7
|
+
|
|
8
|
+
export function normalizeAgentSandbox(value, options = {}) {
|
|
9
|
+
if (!value) return null;
|
|
10
|
+
const image =
|
|
11
|
+
typeof value === "string" && value.trim() && value !== "true"
|
|
12
|
+
? value.trim()
|
|
13
|
+
: DEFAULT_SANDBOX_IMAGE;
|
|
14
|
+
return {
|
|
15
|
+
engine: "docker",
|
|
16
|
+
image,
|
|
17
|
+
cwd: path.resolve(options.cwd || process.cwd()),
|
|
18
|
+
network: options.network === true,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function executeSandboxedShell(command, sandbox, options = {}) {
|
|
23
|
+
if (!sandbox || sandbox.engine !== "docker") {
|
|
24
|
+
throw new Error("A supported agent sandbox configuration is required");
|
|
25
|
+
}
|
|
26
|
+
const hostCwd = path.resolve(options.cwd || sandbox.cwd);
|
|
27
|
+
const args = ["run", "--rm", "--init"];
|
|
28
|
+
if (!sandbox.network) args.push("--network", "none");
|
|
29
|
+
args.push("--mount", `type=bind,source=${hostCwd},target=/workspace`);
|
|
30
|
+
args.push("--workdir", "/workspace");
|
|
31
|
+
if (process.platform !== "win32" && process.getuid && process.getgid) {
|
|
32
|
+
args.push("--user", `${process.getuid()}:${process.getgid()}`);
|
|
33
|
+
}
|
|
34
|
+
const env = options.env || {};
|
|
35
|
+
for (const key of ["CLAUDECODE", "CC_SESSION_ID", "CLAUDE_CODE_SESSION_ID"]) {
|
|
36
|
+
if (env[key] != null) args.push("--env", `${key}=${env[key]}`);
|
|
37
|
+
}
|
|
38
|
+
args.push(sandbox.image, "sh", "-lc", String(command || ""));
|
|
39
|
+
const result = _deps.spawnSync("docker", args, {
|
|
40
|
+
encoding: "utf8",
|
|
41
|
+
timeout: options.timeout,
|
|
42
|
+
maxBuffer: options.maxBuffer,
|
|
43
|
+
windowsHide: true,
|
|
44
|
+
});
|
|
45
|
+
if (result.error) {
|
|
46
|
+
return {
|
|
47
|
+
stdout: result.stdout || "",
|
|
48
|
+
stderr:
|
|
49
|
+
result.error.code === "ENOENT"
|
|
50
|
+
? "Docker is not installed"
|
|
51
|
+
: result.error.message,
|
|
52
|
+
exitCode: typeof result.status === "number" ? result.status : 1,
|
|
53
|
+
failedToStart: true,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
stdout: result.stdout || "",
|
|
58
|
+
stderr: result.stderr || "",
|
|
59
|
+
exitCode: typeof result.status === "number" ? result.status : 1,
|
|
60
|
+
signal: result.signal || null,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function sandboxSummary(sandbox) {
|
|
65
|
+
if (!sandbox) return null;
|
|
66
|
+
return {
|
|
67
|
+
engine: sandbox.engine,
|
|
68
|
+
image: sandbox.image,
|
|
69
|
+
network: sandbox.network ? "enabled" : "disabled",
|
|
70
|
+
workspace: "read-write",
|
|
71
|
+
};
|
|
72
|
+
}
|