chainlesschain 0.166.78 → 0.166.80
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/README.md +8 -16
- package/package.json +1 -1
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-DSyZEY2G.js → AIOps-C5NtVVBN.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DhNyZ577.js → ActionButton-CE9-HsoR.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-HMMpxmyi.js → Analytics-DRO6sI0Z.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CwKMM5Ie.js → AppLayout-CuVJiyC_.js} +3 -3
- package/src/assets/web-panel/assets/{Artifacts-CNzDmph7.js → Artifacts-GNahHsyZ.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DxWpUW3V.js → Audit-DWvTomfm.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-C1R2ST-P.js → BackgroundAgents-k4TuA3ec.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-B6biTaEV.js → Backup-BxqN-65D.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CVnkD2Z5.js → BaseInput-CYYLvwwD.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Dbewl4Je.js → Chat-CoDmZ9yb.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DVZ6SwC5.js → ChatBubbleRenderer-ChTIMWch.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BqqiF1JE.js → Checkbox-CRVlfbkN.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BVMkGumc.js → Codegen-BttMy7rW.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DmiRHy96.js → Col-DsdlE4QC.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BDlpygqA.js → Community-BulheyO-.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-B2NME_m-.js → Compact-BC_7wMxW.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BlzDLE-R.js → Compliance-BA3PDNLK.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-C8raPybB.js → Cowork-B6Y3L-GP.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-DA8Py0zP.js → Cron-DLk_CG77.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DU2XyHqB.js → Crosschain-CvsKV-90.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Df098fT_.js → DID-CD8K9G3F.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-D1rT702x.js → Dashboard-CXNE434f.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BweXGo1O.js → Dropdown-C_P5mttB.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-B9ShbgJH.js → EmailListRenderer-MxZvItNA.js} +1 -1
- package/src/assets/web-panel/assets/EvolutionSettings-DRoJQrDb.js +1 -0
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DrznZFVs.js → FamilyGuardDashboard-CBrz9T6T.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DQZ2adIA.js → Federation-DKlGgjNs.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DN30Dowh.js → FormItemContext-CteicPS5.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DRdt0j1e.js → GenericCardRenderer-Bs10mDna.js} +1 -1
- package/src/assets/web-panel/assets/{Git-wwRgStzk.js → Git-CXwzFBIh.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CI4Uw0Nh.js → Governance-CYzcwfwf.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-5TuE2AJI.js → Inference-pYpCF1ws.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-oXyvmFSR.js → KnowledgeGraph-B0YJnOpj.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-ewudSWuv.js → Logs-D-hJWfq-.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-Cz5nyufm.js → MarkdownRenderer-BPQlDtB7.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-DcZeWFrs.js → Marketplace-D5ZmI-si.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BcV9p1RS.js → McpTools-DByD6jY1.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-CMhYvugt.js → Memory--lsjJd7Y.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-5RP2uwvT.js → MobileBridge-GQ3vGZO9.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BIuM9Ze4.js → MobileProjects-Dh2wq-NU.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-DmBszTDe.js → Mtc-uQFoRe_Z.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-Czdp5ZGt.js → MtcAudit-BUBYbvuz.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DRWUuNr-.js → Multisig-D790SLqM.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-IRQQN0-c.js → NLProgramming-DcV9gSqn.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CGhD1lW9.js → Notes-sVl7Y_vt.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BtyPgQAh.js → NotificationSettings-BHRPqBZ3.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-yUaqwCty.js → OrderTableRenderer-B029pIMF.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-C3kTVn5i.js → Organization-BKrF-dtp.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-C2-0iZhq.js → Overflow-DOAGxhhi.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CISoEUxA.js → P2P-7uQ4F7lh.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-NfTVtvKQ.js → PdhVaultBrowser-BegpATva.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-CfK0jJhm.js → Permissions-C0qK0tAi.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-OsVxxh_j.js → PersonalDataHub-DCnfXKyb.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-DEmK_Ch2.js → Pipeline-D8wdVvao.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-D61s73b0.js → Privacy-C-dGmb9y.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DkLF5gHb.js → ProjectInit-ChKvrsfc.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BA7odTrI.js → ProjectSettings-CaWnzNBi.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-CdI1GcAG.js → Projects-2uNBqS05.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-D9BYyP1r.js → Providers-DTufbN-S.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CXMItUDD.js → QrScannerModal-CGv6QJMC.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-8-tF9ffZ.js → QuickAsk-BfNcUCfG.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-C2QGWOSi.js → Recommend-B0s5YT2K.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-B1M_v1lx.js → RemoteSession-YCs5wa8P.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-D0WZHgv1.js → Reputation-DBC__Ylq.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D6nf9-c-.js → Row-D_NT1ROe.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-ClZ6M-mN.js → RssFeed-Dd9ktNRw.js} +3 -3
- package/src/assets/web-panel/assets/{Search-ZWkt8vuO.js → Search-BsmlT4PY.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BUlQut2m.js → Security-DN-_e3oM.js} +3 -3
- package/src/assets/web-panel/assets/{Services-Cd_3xJOc.js → Services-Bm_KqSDz.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-C8e2-cHW.js → Skeleton-BYldeYI0.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DucVRJp1.js → Skills-h7XAXSls.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Csr5pUwI.js → Sla-4ArxAaMJ.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CXvyaRAT.js → SpeechSettings-B639ejZr.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-KdsIcV5h.js → SyncSettings-DR6RRo1O.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-B-eHmJm9.js → Tasks-DysrrJVE.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BglVeaLK.js → Templates-DyyB9L9f.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BBbQ8qan.js → Tenant-XbmWbUl1.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-Ca_pCVBi.js → Terminal-C5GeciJG.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-YD6XG_vZ.js → TimelineRenderer-Db-NjeVy.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-2lRoeVli.js → Tokens-Btm9pYvJ.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-C-3XNAU9.js → Trigger-BhJ35b0V.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-k-1PxdLG.js → Trust-C5T4GJky.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-FG-qW646.js → UkeySign-CqWxh5U0.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BNOe1cmd.js → VideoEditing-DKyI9zg1.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-D5C3i2Kw.js → Wallet-kgvyQOtT.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-BOpztqd3.js → WebAuthn-1wWucdJt.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-BpVrpUEv.js → WorkflowEditor-rHVIbLME.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DIuMHb38.js → chat-DV8ZtfWQ.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CTFJPyzQ.js → colors-zznFfEpj.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CONfmJcW.js → compact-item-CWk10Qsu.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-RkW5CRrz.js → createContext-CtoMW-kY.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-_Wlo1cZJ.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CW4XOjDC.js → hasIn-ieyHKAZZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Akmg1WdH.js → index--6zQrvYc.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMg2JFmW.js → index-0GSB8LOT.js} +1 -1
- package/src/assets/web-panel/assets/{index-YaeGscSw.js → index-14ADEHo7.js} +1 -1
- package/src/assets/web-panel/assets/{index-7wMSBCU7.js → index-2TTLREp7.js} +1 -1
- package/src/assets/web-panel/assets/{index-asWsB34i.js → index-9fgmdiB_.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bf19fKef.js → index-B2WI4Jse.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFs1Tznc.js → index-B9w6Zr_O.js} +1 -1
- package/src/assets/web-panel/assets/{index-B54qoVff.js → index-BG9KlVJl.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEZWQthY.js → index-BGYCtfL-.js} +1 -1
- package/src/assets/web-panel/assets/{index-YlMnFNOi.js → index-Bf9069uM.js} +1 -1
- package/src/assets/web-panel/assets/{index-DidrMvOx.js → index-BrpyZMUe.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBjb2A5R.js → index-CBS8OtL2.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9XoBoty.js → index-CGZGQTF5.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWY7YwDu.js → index-CLeX8Qp7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DP5pPedy.js → index-CdSnkhrR.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSlXL6Ju.js → index-CewbVIM8.js} +1 -1
- package/src/assets/web-panel/assets/index-Cj8Mcdok.js +1 -0
- package/src/assets/web-panel/assets/{index-gkjiFjQd.js → index-CjkiJdIX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFGLf88d.js → index-Cn71LASJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-lpTPS8.js → index-Cqpfzkch.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAESljiJ.js → index-CrBful_u.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cvmc3f25.js → index-CxSgg3Xc.js} +1 -1
- package/src/assets/web-panel/assets/{index-CixqfdRk.js → index-D7yq9nAq.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRZsPxNn.js → index-D9jmNLfO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWCJnn2O.js → index-DNlvUg0O.js} +1 -1
- package/src/assets/web-panel/assets/{index-D59GbWCN.js → index-DPwOEcUt.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKgaRT0b.js → index-DR1Uw5as.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dj3K5kHs.js → index-DRuSuXJh.js} +1 -1
- package/src/assets/web-panel/assets/{index-CM2X25Er.js → index-DSnQWQ4L.js} +1 -1
- package/src/assets/web-panel/assets/{index-BM7bOUvu.js → index-DdMho2Wr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLUa68JH.js → index-DjNjO-VL.js} +3 -3
- package/src/assets/web-panel/assets/{index-CkRojEip.js → index-DmtyRKy8.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9aS2VLu.js → index-Dz1TqS34.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8r2t0Ch.js → index-G9bqTRu6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkAbfBF-.js → index-McW2cdbg.js} +1 -1
- package/src/assets/web-panel/assets/{index-CX4T2uKN.js → index-esCpkxIZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDHUx4Yz.js → index-fmwnODwg.js} +1 -1
- package/src/assets/web-panel/assets/index-vira2aS_.js +1 -0
- package/src/assets/web-panel/assets/{index-DZTwP364.js → index-zY56IXHj.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BOr4igh3.js → initDefaultProps-CVk4LKJK.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CK469n2j.js → motion-IAABGXc_.js} +1 -1
- package/src/assets/web-panel/assets/{move-DzjudlYQ.js → move-B9HSYeZc.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BQaKUxC6.js → mtc-parser-CJfDtM89.js} +1 -1
- package/src/assets/web-panel/assets/{omit-MciovCFD.js → omit-D5dYnom7.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DDPJ4zAz.js → pickAttrs-xbUkaZdY.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Cznyb-jI.js → placementArrow-CIUU5NKN.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-AJK3SLzJ.js → responsiveObserve-BZpgHE8P.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CPQ28wu7.js → slide-x_8rsSKk.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CFjzvqf_.js → statusUtils-BZyDnVJs.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BPyFfTuR.js → styleChecker-DusfWp6J.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Dq7N6R05.js → useFlexGapSupport-022JzYAL.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-C3GS0uTc.js → useFs-DRDxX7-3.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BhgIVzP_.js → usePersonalDataHub-DFrCp7m_.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-4ZD9-MDr.js → vnode-bCuSFOmr.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Bx4MRVNW.js → zoom-sCpZ0sw7.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/data/changelog.json +26 -0
- package/src/lib/agent-sandbox.js +319 -2
- package/src/lib/lsp/code-intelligence.js +7 -1
- package/src/lib/sandbox-docker-egress.js +507 -0
- package/src/lib/sandbox-egress-authority-monitor.js +137 -0
- package/src/lib/sandbox-egress-proxy.js +167 -10
- package/src/lib/sandbox-egress-worker-thread.js +38 -0
- package/src/lib/sandbox-egress-worker.js +196 -0
- package/src/runtime/agent-core.js +211 -25
- package/src/assets/web-panel/assets/EvolutionSettings-D75_iBoc.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DaEBln_q.js +0 -1
- package/src/assets/web-panel/assets/index-DG1mcYTa.js +0 -1
- package/src/assets/web-panel/assets/index-DRs5Pe8u.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as v}from"./index-
|
|
1
|
+
import{u as v}from"./index-DjNjO-VL.js";import{u as _}from"./useShellMode-CgR0wCYM.js";function d(r){if(!r)return r;if(r.error)throw new Error(r.error);return r.result!==void 0?r.result:r}async function p(r,s={},e=!0){try{if(e!==!0||!r||typeof r.sendRaw!="function")return{status:"unavailable",path:null};const a=await r.sendRaw({type:"fs.openDirectory",title:s.title},6e4);if(a&&(a.ok===!1||a.error))return{status:"unavailable",path:null};const t=a&&a.result!==void 0?a.result:a;return t&&(t.ok===!1||t.error||t.unsupported===!0)?{status:"unavailable",path:null}:t&&t.canceled===!0?{status:"cancelled",path:null}:t&&typeof t.path=="string"&&t.path.length>0?{status:"selected",path:t.path}:{status:"unavailable",path:null}}catch{return{status:"unavailable",path:null}}}function b(r,s,e,a,t){return typeof r.onMessage!="function"||typeof r.sendRaw!="function"?r.sendRaw({type:s,...e},t).then(d):new Promise((n,u)=>{const l=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${s}.event`,m=`${s}.end`;let c=!1,h=()=>{};const o=(i,f)=>{if(!c){c=!0,clearTimeout(g);try{h()}catch{}i(f)}},g=setTimeout(()=>{o(u,new Error(`stream timeout (${t}ms): ${s}`))},t),y=r.onMessage(i=>{if(!(c||!i)&&!(i.id!==l&&i.requestId!==l)){if(i.type===w){if(typeof a=="function")try{a(i.event||i)}catch{}return}if(i.type===m){o(n,d(i));return}i.type==="error"&&o(u,new Error(i.message||"stream error"))}});h=typeof y=="function"?y:()=>{},Promise.resolve(r.sendRaw({id:l,type:s,...e},t)).catch(()=>{})})}function k(){const r=v(),s=_(),e=(a,t={},n=3e4)=>r.sendRaw({type:a,...t},n).then(d);return{async health(){return await e("personal-data-hub.health",{},8e3)},async stats(){return await e("personal-data-hub.stats",{},8e3)},async listAdapters(){return await e("personal-data-hub.list-adapters",{},5e3)},async pickFile(a={}){try{const t=await r.sendRaw({type:"fs.openDialog",title:a.title,filters:a.filters},6e4),n=t&&t.result!==void 0?t.result:t,u=n&&typeof n.path=="string"?n.path:n&&typeof n.filePath=="string"?n.filePath:null;return n&&n.canceled!==!0&&u?u:null}catch{return null}},async pickDirectoryResult(a={}){return await p(r,a,s.isEmbedded)},async pickDirectory(a={}){const t=await p(r,a,s.isEmbedded);return t.status==="selected"?t.path:null},async adapterReadiness(a){return await e("personal-data-hub.adapter-readiness",Number.isInteger(a)?{timeoutMs:a}:{},15e3)},async syncAdapter(a,t={}){return await e("personal-data-hub.sync-adapter",{name:a,options:t},6e5)},async syncAll(a={}){return await e("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:t=20,seed:n=1}={}){return await e("personal-data-hub.register-mock",{name:a,count:t,seed:n})},async unregister(a){return await e("personal-data-hub.unregister",{name:a})},async ask(a,t={}){return await e("personal-data-hub.ask",{question:a,options:t},18e4)},async queryEvents(a={}){return await e("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await e("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await e("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await e("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await e("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,t={}){return await e("personal-data-hub.register-email",{account:a,opts:t},15e3)},async unregisterEmail(a){return await e("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await e("personal-data-hub.list-email-accounts",{},5e3)},async activateEmail(a){return await e("personal-data-hub.activate-email",{email:a},5e3)},async eventDetail(a){return await e("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,t={},n){return await b(r,"personal-data-hub.sync-adapter-stream",{name:a,options:t},n,6e5)},async syncAllStream(a={},t){return await b(r,"personal-data-hub.sync-all-stream",{options:a},t,9e5)},async registerAlipay(a,t={}){return await e("personal-data-hub.register-alipay",{account:a,opts:t},15e3)},async unregisterAlipay(a){return await e("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await e("personal-data-hub.list-alipay-accounts",{},5e3)},async activateAlipay(a){return await e("personal-data-hub.activate-alipay",{email:a},5e3)},async importAlipayBill({zipPath:a,csvPath:t,zipPassword:n}={}){return await e("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:t,zipPassword:n},3e5)},async reviewQueueList(a=50){return await e("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,t){return await e("personal-data-hub.review-decision",{reviewId:a,decision:t},5e3)},async manualMerge(a,t){return await e("personal-data-hub.manual-merge",{aId:a,bId:t},5e3)},async manualUnmerge(a){return await e("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await e("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await e("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await e("personal-data-hub.skills-list",{},5e3)},async runSkill(a,t={}){return await e("personal-data-hub.run-skill",{name:a,options:t},12e4)},async openAichatLogin(a,t={}){return await e("personal-data-hub.aichat-open-login",{vendor:a,opts:t},1e4)},async probeAichatCookies(a,t){return await e("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:t},1e4)},async registerAichatVendor(a,t,n={}){return await e("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:t,opts:n},3e4)},async rotateAichatLogin(a){return await e("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await e("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await e("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await e("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await e("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:t,wechatDataPath:n,fridaOpts:u,keyProviderOverride:l}={}){return await e("personal-data-hub.register-wechat",{account:a,dbPath:t,wechatDataPath:n,fridaOpts:u,keyProviderOverride:l},45e3)},async listWechatAccounts(){return await e("personal-data-hub.list-wechat-accounts",{},5e3)},async activateWechat(a,t={}){return await e("personal-data-hub.activate-wechat",{uin:a,fridaOpts:t.fridaOpts,keyProviderOverride:t.keyProviderOverride},45e3)},async unregisterWechat(a){return await e("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await e("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await e("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await e("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await e("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await e("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await e("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await e("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await e("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{k as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as i,h as a,w as l}from"./index-
|
|
1
|
+
import{N as i,h as a,w as l}from"./index-DjNjO-VL.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-DjNjO-VL.js";import{i as f}from"./motion-IAABGXc_.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-DjNjO-VL.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/data/changelog.json
CHANGED
|
@@ -1,6 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"source": "CHANGELOG.md",
|
|
3
3
|
"releases": [
|
|
4
|
+
{
|
|
5
|
+
"productVersion": null,
|
|
6
|
+
"cliVersion": "0.166.80",
|
|
7
|
+
"cliVersions": ["0.166.80"],
|
|
8
|
+
"date": null,
|
|
9
|
+
"title": "",
|
|
10
|
+
"sections": [
|
|
11
|
+
{
|
|
12
|
+
"heading": "Fixed - cc CLI 0.166.80: revoke active Docker egress shells",
|
|
13
|
+
"body": "- Revalidate live shell and sandbox authority while a Docker egress command is\n running. A failed or timed-out check locks revocation, cuts the policy broker,\n closes the target container, and prevents a successful execution receipt.\n- Check authority again immediately before target start and receipt issuance;\n reject sessions delivered after revocation. A real Linux Docker probe checks\n tunnel closure, target termination, container cleanup, and rejected outcome.\n- This bounded poll does not provide a lossless policy revision subscription;\n a policy change reverted between checks remains outside its detection scope."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"productVersion": null,
|
|
19
|
+
"cliVersion": "0.166.79",
|
|
20
|
+
"cliVersions": ["0.166.79"],
|
|
21
|
+
"date": null,
|
|
22
|
+
"title": "",
|
|
23
|
+
"sections": [
|
|
24
|
+
{
|
|
25
|
+
"heading": "Added - cc CLI 0.166.79: opt-in Docker domain egress",
|
|
26
|
+
"body": "- Add an explicit Linux Docker egress engine for `run_shell`, with pinned target\n and relay images, a Unix-socket policy broker, target isolation verification,\n and a real product-path Docker probe.\n- Report an unknown execution outcome after target start or cleanup uncertainty\n without suggesting a safe automatic retry. Lossless policy-revision\n subscription remains under development."
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
4
30
|
{
|
|
5
31
|
"productVersion": null,
|
|
6
32
|
"cliVersion": "0.166.78",
|
package/src/lib/agent-sandbox.js
CHANGED
|
@@ -13,6 +13,9 @@ export const AGENT_SANDBOX_MODES = Object.freeze([
|
|
|
13
13
|
]);
|
|
14
14
|
export const AGENT_SANDBOX_CAPABILITY_SCHEMA =
|
|
15
15
|
"chainlesschain.agent-sandbox-capabilities/v1";
|
|
16
|
+
const dockerEgressReceipts = new WeakMap();
|
|
17
|
+
const PINNED_DOCKER_IMAGE =
|
|
18
|
+
/^[a-zA-Z0-9][a-zA-Z0-9./:_-]*@sha256:[a-f0-9]{64}$/;
|
|
16
19
|
export const _deps = {
|
|
17
20
|
spawnSync: (...args) => executionBroker.spawnSync(...args),
|
|
18
21
|
host: () => ({
|
|
@@ -249,12 +252,21 @@ export function normalizeAgentSandbox(value, options = {}) {
|
|
|
249
252
|
return {
|
|
250
253
|
engine: effectiveSettings.engine || "docker",
|
|
251
254
|
image: effectiveSettings.image || image,
|
|
255
|
+
...(effectiveSettings.engine === "docker-egress"
|
|
256
|
+
? { relayImage: effectiveSettings.relayImage || null }
|
|
257
|
+
: {}),
|
|
252
258
|
cwd: path.resolve(options.cwd || process.cwd()),
|
|
253
259
|
network: managedNetworkDisabled
|
|
254
260
|
? false
|
|
255
261
|
: options.network === true || effectiveSettings.network === true,
|
|
256
262
|
policy: normalizeSandboxPolicy(
|
|
257
|
-
effectiveSettings
|
|
263
|
+
effectiveSettings.engine === "docker-egress"
|
|
264
|
+
? {
|
|
265
|
+
...effectiveSettings,
|
|
266
|
+
allowUnsandboxedCommands: false,
|
|
267
|
+
failIfUnavailable: true,
|
|
268
|
+
}
|
|
269
|
+
: effectiveSettings,
|
|
258
270
|
options.cwd || process.cwd(),
|
|
259
271
|
),
|
|
260
272
|
};
|
|
@@ -340,6 +352,149 @@ function addUniqueCapability(target, entry) {
|
|
|
340
352
|
}
|
|
341
353
|
}
|
|
342
354
|
|
|
355
|
+
function egressBinding(sandbox) {
|
|
356
|
+
return JSON.stringify({
|
|
357
|
+
engine: sandbox.engine,
|
|
358
|
+
image: sandbox.image,
|
|
359
|
+
relayImage: sandbox.relayImage,
|
|
360
|
+
cwd: sandbox.cwd,
|
|
361
|
+
network: sandbox.network,
|
|
362
|
+
mode: sandbox.mode || null,
|
|
363
|
+
policy: sandbox.policy || {},
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
function assessDockerEgressCapabilities(sandbox, options, host) {
|
|
368
|
+
const policy = sandbox.policy || {};
|
|
369
|
+
const domainRules =
|
|
370
|
+
(policy.allowedDomains?.length || 0) + (policy.deniedDomains?.length || 0);
|
|
371
|
+
const requested = [
|
|
372
|
+
capability("isolation.container"),
|
|
373
|
+
capability("filesystem.workspace-read-write"),
|
|
374
|
+
capability("network.domain-policy", { entries: domainRules }),
|
|
375
|
+
];
|
|
376
|
+
const unsupported = [];
|
|
377
|
+
const reject = (id, reason, message) =>
|
|
378
|
+
unsupported.push(capability(id, { reason, message }));
|
|
379
|
+
if (policy.excludedCommands?.length)
|
|
380
|
+
reject(
|
|
381
|
+
"execution.excluded-commands",
|
|
382
|
+
"docker_egress_exclusions_prohibited",
|
|
383
|
+
"Docker egress does not allow commands to bypass its execution route.",
|
|
384
|
+
);
|
|
385
|
+
if (host.platform !== "linux")
|
|
386
|
+
reject(
|
|
387
|
+
"backend.platform",
|
|
388
|
+
"docker_egress_requires_linux",
|
|
389
|
+
"Docker egress requires a Linux host.",
|
|
390
|
+
);
|
|
391
|
+
if (!["x64", "arm64"].includes(host.arch))
|
|
392
|
+
reject(
|
|
393
|
+
"backend.architecture",
|
|
394
|
+
"docker_egress_architecture_unsupported",
|
|
395
|
+
"Docker egress requires x64 or arm64.",
|
|
396
|
+
);
|
|
397
|
+
if (sandbox.mode === "strict" || sandbox.network !== true)
|
|
398
|
+
reject(
|
|
399
|
+
"network.domain-policy",
|
|
400
|
+
"docker_egress_network_disabled",
|
|
401
|
+
"Docker egress requires network=true and is prohibited in strict mode.",
|
|
402
|
+
);
|
|
403
|
+
if (!domainRules)
|
|
404
|
+
reject(
|
|
405
|
+
"network.domain-policy",
|
|
406
|
+
"docker_egress_domain_policy_required",
|
|
407
|
+
"Docker egress requires explicit domain rules.",
|
|
408
|
+
);
|
|
409
|
+
for (const field of ["image", "relayImage"]) {
|
|
410
|
+
if (
|
|
411
|
+
typeof sandbox[field] !== "string" ||
|
|
412
|
+
!PINNED_DOCKER_IMAGE.test(sandbox[field])
|
|
413
|
+
)
|
|
414
|
+
reject(
|
|
415
|
+
`backend.${field}`,
|
|
416
|
+
"docker_egress_image_digest_required",
|
|
417
|
+
`Docker egress ${field} must be pinned to a sha256 digest.`,
|
|
418
|
+
);
|
|
419
|
+
}
|
|
420
|
+
for (const field of ["allowRead", "denyRead", "allowWrite", "denyWrite"]) {
|
|
421
|
+
if (policy[field]?.length)
|
|
422
|
+
reject(
|
|
423
|
+
`filesystem.${field}`,
|
|
424
|
+
"docker_fine_grained_filesystem_unsupported",
|
|
425
|
+
"Docker egress does not support additional or masked filesystem paths.",
|
|
426
|
+
);
|
|
427
|
+
}
|
|
428
|
+
const enforceable = unsupported.length
|
|
429
|
+
? []
|
|
430
|
+
: [
|
|
431
|
+
capability("isolation.container", { enforcement: "docker-container" }),
|
|
432
|
+
capability("filesystem.workspace-read-write", {
|
|
433
|
+
enforcement: "docker-bind-mount",
|
|
434
|
+
}),
|
|
435
|
+
capability("network.domain-policy", {
|
|
436
|
+
enforcement: "docker-none-network-uds-proxy-seccomp",
|
|
437
|
+
}),
|
|
438
|
+
];
|
|
439
|
+
const receipt = options.execution?.receipt;
|
|
440
|
+
const registered =
|
|
441
|
+
receipt && typeof receipt === "object"
|
|
442
|
+
? dockerEgressReceipts.get(receipt)
|
|
443
|
+
: null;
|
|
444
|
+
const started =
|
|
445
|
+
unsupported.length === 0 &&
|
|
446
|
+
registered?.binding === egressBinding(sandbox) &&
|
|
447
|
+
registered.host.platform === host.platform &&
|
|
448
|
+
registered.host.arch === host.arch;
|
|
449
|
+
const attempted = started || options.execution?.attempted === true;
|
|
450
|
+
const outcomeUnknown = options.execution?.outcomeUnknown === true;
|
|
451
|
+
const checked = started || options.availability != null;
|
|
452
|
+
const available = started
|
|
453
|
+
? true
|
|
454
|
+
: checked
|
|
455
|
+
? options.availability?.available === true
|
|
456
|
+
: null;
|
|
457
|
+
return {
|
|
458
|
+
schema: AGENT_SANDBOX_CAPABILITY_SCHEMA,
|
|
459
|
+
host: {
|
|
460
|
+
platform: String(host.platform),
|
|
461
|
+
release: String(host.release),
|
|
462
|
+
arch: String(host.arch),
|
|
463
|
+
},
|
|
464
|
+
backend: {
|
|
465
|
+
engine: "docker-egress",
|
|
466
|
+
isolationLevel: "container",
|
|
467
|
+
availabilityChecked: checked,
|
|
468
|
+
available,
|
|
469
|
+
reason: started
|
|
470
|
+
? null
|
|
471
|
+
: outcomeUnknown
|
|
472
|
+
? "docker_egress_outcome_unknown"
|
|
473
|
+
: options.availability?.reason || null,
|
|
474
|
+
},
|
|
475
|
+
status: unsupported.length
|
|
476
|
+
? "unsupported"
|
|
477
|
+
: started
|
|
478
|
+
? "applied"
|
|
479
|
+
: outcomeUnknown
|
|
480
|
+
? "outcome-unknown"
|
|
481
|
+
: attempted
|
|
482
|
+
? "failed-to-start"
|
|
483
|
+
: checked && !available
|
|
484
|
+
? "unavailable"
|
|
485
|
+
: "ready",
|
|
486
|
+
execution: {
|
|
487
|
+
observed: Boolean(started || options.execution),
|
|
488
|
+
attempted,
|
|
489
|
+
started: Boolean(started),
|
|
490
|
+
},
|
|
491
|
+
requested,
|
|
492
|
+
enforceable,
|
|
493
|
+
applied: started ? enforceable.map((entry) => ({ ...entry })) : [],
|
|
494
|
+
unsupported,
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
|
|
343
498
|
/**
|
|
344
499
|
* Describe the exact legacy agent-shell sandbox request without claiming that
|
|
345
500
|
* a command has run. `enforceable` is backend capability; `applied` is only
|
|
@@ -351,6 +506,8 @@ export function assessAgentSandboxCapabilities(sandbox, options = {}) {
|
|
|
351
506
|
release: os.release(),
|
|
352
507
|
arch: process.arch,
|
|
353
508
|
};
|
|
509
|
+
if (sandbox?.engine === "docker-egress")
|
|
510
|
+
return assessDockerEgressCapabilities(sandbox, options, host);
|
|
354
511
|
const execution = options.execution || null;
|
|
355
512
|
const availability = options.availability || null;
|
|
356
513
|
const requested = [];
|
|
@@ -594,6 +751,22 @@ function attachSandboxCapabilityReport(
|
|
|
594
751
|
}
|
|
595
752
|
|
|
596
753
|
export function executeSandboxedShell(command, sandbox, options = {}) {
|
|
754
|
+
if (sandbox?.engine === "docker-egress") {
|
|
755
|
+
return {
|
|
756
|
+
stdout: "",
|
|
757
|
+
stderr: "Docker egress requires the asynchronous execution route",
|
|
758
|
+
exitCode: 1,
|
|
759
|
+
failedToStart: true,
|
|
760
|
+
sandboxCapabilities: assessAgentSandboxCapabilities(sandbox, {
|
|
761
|
+
host: _deps.host(),
|
|
762
|
+
execution: { attempted: true },
|
|
763
|
+
availability: {
|
|
764
|
+
available: false,
|
|
765
|
+
reason: "docker_egress_async_execution_required",
|
|
766
|
+
},
|
|
767
|
+
}),
|
|
768
|
+
};
|
|
769
|
+
}
|
|
597
770
|
if (!sandbox || !["docker", "bubblewrap"].includes(sandbox.engine)) {
|
|
598
771
|
throw new Error("A supported agent sandbox configuration is required");
|
|
599
772
|
}
|
|
@@ -783,7 +956,7 @@ function executeBubblewrapShell(command, sandbox, options, hostCwd, policy) {
|
|
|
783
956
|
export function isolationLevel(sandbox) {
|
|
784
957
|
if (!sandbox) return "policy-only";
|
|
785
958
|
if (sandbox.engine === "bubblewrap") return "os-sandbox";
|
|
786
|
-
if (
|
|
959
|
+
if (["docker", "docker-egress"].includes(sandbox.engine)) return "container";
|
|
787
960
|
return "policy-only";
|
|
788
961
|
}
|
|
789
962
|
|
|
@@ -836,6 +1009,11 @@ export function assertSandboxAvailable(sandbox, deps = _deps) {
|
|
|
836
1009
|
if (!sandbox || sandbox.policy?.failIfUnavailable !== true) return;
|
|
837
1010
|
const probe = probeSandboxAvailability(sandbox, deps);
|
|
838
1011
|
if (!probe.available) {
|
|
1012
|
+
if (sandbox.engine === "docker-egress") {
|
|
1013
|
+
throw new Error(
|
|
1014
|
+
"Docker egress is unavailable; this backend never falls back to unsandboxed execution.",
|
|
1015
|
+
);
|
|
1016
|
+
}
|
|
839
1017
|
throw new Error(
|
|
840
1018
|
`sandbox.failIfUnavailable: ${sandbox.engine} sandbox is unavailable (${probe.reason}) — refusing to start. Install/start ${sandbox.engine === "bubblewrap" ? "bubblewrap" : "Docker"}, or unset failIfUnavailable to allow per-command degradation.`,
|
|
841
1019
|
);
|
|
@@ -860,5 +1038,144 @@ export function sandboxSummary(sandbox) {
|
|
|
860
1038
|
},
|
|
861
1039
|
};
|
|
862
1040
|
if (sandbox.mode) summary.mode = sandbox.mode;
|
|
1041
|
+
if (sandbox.engine === "docker-egress")
|
|
1042
|
+
summary.relayImage = sandbox.relayImage;
|
|
863
1043
|
return summary;
|
|
864
1044
|
}
|
|
1045
|
+
|
|
1046
|
+
/** Own the asynchronous session and mint execution evidence only after its
|
|
1047
|
+
* real implementation reports a terminal result and cleanup completes. */
|
|
1048
|
+
export async function executeDockerEgressShell(command, sandbox, options = {}) {
|
|
1049
|
+
if (sandbox?.engine !== "docker-egress")
|
|
1050
|
+
throw new TypeError("docker-egress configuration is required");
|
|
1051
|
+
const host = _deps.host();
|
|
1052
|
+
const snapshot = JSON.parse(JSON.stringify(sandbox));
|
|
1053
|
+
const preflight = assessAgentSandboxCapabilities(snapshot, { host });
|
|
1054
|
+
let startAuthorized = false;
|
|
1055
|
+
let observedResult;
|
|
1056
|
+
const failure = () => ({
|
|
1057
|
+
stdout:
|
|
1058
|
+
startAuthorized && typeof observedResult?.stdout === "string"
|
|
1059
|
+
? observedResult.stdout
|
|
1060
|
+
: "",
|
|
1061
|
+
stderr: startAuthorized
|
|
1062
|
+
? "Docker egress execution outcome or cleanup could not be verified; do not retry automatically."
|
|
1063
|
+
: preflight.unsupported.length
|
|
1064
|
+
? preflight.unsupported.map((entry) => entry.message).join("; ")
|
|
1065
|
+
: "Docker egress execution is unavailable or did not complete safely.",
|
|
1066
|
+
exitCode: 1,
|
|
1067
|
+
...(startAuthorized
|
|
1068
|
+
? {
|
|
1069
|
+
executionOutcome: observedResult
|
|
1070
|
+
? "completed-cleanup-unknown"
|
|
1071
|
+
: "unknown",
|
|
1072
|
+
retrySafe: false,
|
|
1073
|
+
}
|
|
1074
|
+
: { failedToStart: true }),
|
|
1075
|
+
sandboxCapabilities: assessAgentSandboxCapabilities(snapshot, {
|
|
1076
|
+
host,
|
|
1077
|
+
execution: { attempted: true, outcomeUnknown: startAuthorized },
|
|
1078
|
+
...(startAuthorized
|
|
1079
|
+
? {}
|
|
1080
|
+
: {
|
|
1081
|
+
availability: {
|
|
1082
|
+
available: false,
|
|
1083
|
+
reason: "docker_egress_execution_unavailable",
|
|
1084
|
+
},
|
|
1085
|
+
}),
|
|
1086
|
+
}),
|
|
1087
|
+
});
|
|
1088
|
+
if (preflight.unsupported.length) return failure();
|
|
1089
|
+
let session;
|
|
1090
|
+
let authorityError;
|
|
1091
|
+
try {
|
|
1092
|
+
const { startDockerEgressSession } =
|
|
1093
|
+
await import("./sandbox-docker-egress.js");
|
|
1094
|
+
session = await startDockerEgressSession({
|
|
1095
|
+
brokerSocketPath: options.brokerSocketPath,
|
|
1096
|
+
relayImage: snapshot.relayImage,
|
|
1097
|
+
targetImage: snapshot.image,
|
|
1098
|
+
workspaceRoot: options.cwd || snapshot.cwd,
|
|
1099
|
+
auditContext: options.auditContext,
|
|
1100
|
+
});
|
|
1101
|
+
try {
|
|
1102
|
+
options.onSession?.(session);
|
|
1103
|
+
} catch (error) {
|
|
1104
|
+
authorityError = error;
|
|
1105
|
+
throw error;
|
|
1106
|
+
}
|
|
1107
|
+
const result = await session.run(command, {
|
|
1108
|
+
timeoutMs: options.timeoutMs || options.timeout,
|
|
1109
|
+
auditContext: options.auditContext,
|
|
1110
|
+
env: options.env,
|
|
1111
|
+
async beforeStart() {
|
|
1112
|
+
try {
|
|
1113
|
+
if (egressBinding(sandbox) !== egressBinding(snapshot))
|
|
1114
|
+
throw Object.assign(
|
|
1115
|
+
new Error("Sandbox policy changed during Docker startup"),
|
|
1116
|
+
{ code: "CC_SHELL_POLICY_AUTHORITY_CHANGED" },
|
|
1117
|
+
);
|
|
1118
|
+
await options.beforeStart?.();
|
|
1119
|
+
if (egressBinding(sandbox) !== egressBinding(snapshot))
|
|
1120
|
+
throw Object.assign(
|
|
1121
|
+
new Error("Sandbox policy changed during Docker startup"),
|
|
1122
|
+
{ code: "CC_SHELL_POLICY_AUTHORITY_CHANGED" },
|
|
1123
|
+
);
|
|
1124
|
+
startAuthorized = true;
|
|
1125
|
+
} catch (error) {
|
|
1126
|
+
authorityError = error;
|
|
1127
|
+
throw error;
|
|
1128
|
+
}
|
|
1129
|
+
},
|
|
1130
|
+
});
|
|
1131
|
+
observedResult = result;
|
|
1132
|
+
await session.close();
|
|
1133
|
+
try {
|
|
1134
|
+
// The final live-authority fence must run after cleanup and immediately
|
|
1135
|
+
// before the execution receipt is issued.
|
|
1136
|
+
await options.beforeReceipt?.();
|
|
1137
|
+
} catch (error) {
|
|
1138
|
+
authorityError = error;
|
|
1139
|
+
throw error;
|
|
1140
|
+
}
|
|
1141
|
+
if (
|
|
1142
|
+
!startAuthorized ||
|
|
1143
|
+
!Number.isInteger(result?.exitCode) ||
|
|
1144
|
+
typeof result.stdout !== "string" ||
|
|
1145
|
+
typeof result.stderr !== "string"
|
|
1146
|
+
) {
|
|
1147
|
+
throw new Error("Docker egress execution proof is incomplete");
|
|
1148
|
+
}
|
|
1149
|
+
const receipt = Object.freeze({ kind: "docker-egress-execution/v1" });
|
|
1150
|
+
dockerEgressReceipts.set(receipt, {
|
|
1151
|
+
binding: egressBinding(snapshot),
|
|
1152
|
+
host: { ...host },
|
|
1153
|
+
});
|
|
1154
|
+
return {
|
|
1155
|
+
...result,
|
|
1156
|
+
sandboxCapabilities: assessAgentSandboxCapabilities(snapshot, {
|
|
1157
|
+
host,
|
|
1158
|
+
execution: { attempted: true, receipt },
|
|
1159
|
+
}),
|
|
1160
|
+
};
|
|
1161
|
+
} catch (error) {
|
|
1162
|
+
if (session) {
|
|
1163
|
+
try {
|
|
1164
|
+
await session.close();
|
|
1165
|
+
} catch (cleanupError) {
|
|
1166
|
+
error.cleanupError = cleanupError;
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
if (authorityError) {
|
|
1170
|
+
if (startAuthorized)
|
|
1171
|
+
return {
|
|
1172
|
+
...failure(),
|
|
1173
|
+
authorityFailure: {
|
|
1174
|
+
code: authorityError.code || "CC_DOCKER_EGRESS_AUTHORITY_CHANGED",
|
|
1175
|
+
},
|
|
1176
|
+
};
|
|
1177
|
+
throw authorityError;
|
|
1178
|
+
}
|
|
1179
|
+
return failure();
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
@@ -86,7 +86,12 @@ export class CodeIntelligence {
|
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
/** Find references to the symbol under a 1-based position. */
|
|
89
|
-
async references(
|
|
89
|
+
async references(
|
|
90
|
+
filePath,
|
|
91
|
+
line,
|
|
92
|
+
col,
|
|
93
|
+
{ includeDeclaration = true, timeoutMs } = {},
|
|
94
|
+
) {
|
|
90
95
|
const ready = await this._ensure(filePath);
|
|
91
96
|
if (ready.unavailable) return unavailable(ready.reason);
|
|
92
97
|
const result = await this._readRequest(
|
|
@@ -97,6 +102,7 @@ export class CodeIntelligence {
|
|
|
97
102
|
position: toLspPosition({ line, col }),
|
|
98
103
|
context: { includeDeclaration },
|
|
99
104
|
},
|
|
105
|
+
{ timeoutMs },
|
|
100
106
|
);
|
|
101
107
|
return { available: true, locations: this._normalizeLocations(result) };
|
|
102
108
|
}
|