chainlesschain 0.162.150 → 0.162.152
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 +1 -1
- package/package.json +3 -2
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-CBLvrjeG.js → AIOps-CVLVJS-Q.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DYv2GtE0.js → ActionButton-CJ2_GJsI.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CL6PZ-Ww.js → Analytics-CZsmlTF8.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-xuyHt4uA.js → AppLayout-DREvMZ62.js} +5 -5
- package/src/assets/web-panel/assets/{Audit-DOvSVycq.js → Audit-B4NR42w_.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DMhfTswr.js → Backup-CJFmf3In.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CQxDdm63.js → BaseInput-Bh8_iUZY.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BEeNhK2a.js → Chat-DEwKjIxV.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BOqHkxK_.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-CL04O-ER.js → Checkbox-DYWCqYI9.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-C50o-n7x.js → Codegen-BlXrfZAJ.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CH-bDkzs.js → Col-DLPM22eX.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DqAIMvSe.js → Community-PFyzqijs.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-C43fo_my.js → Compact-7DIfY5Wp.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BERnMrdP.js → Compliance-DF4CinPU.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Baw3w1gp.js → Cowork-B1J80Vcj.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-BEqAHF1-.js → Cron-B7sx2OXX.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CvnmKwK4.js → Crosschain-omLkxmu-.js} +1 -1
- package/src/assets/web-panel/assets/{DID-iMPxgVdt.js → DID-B_7r7b5F.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard--4SJX3YR.js → Dashboard-Cp7k3GZg.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BgLV6xgz.js → Dropdown-BCKO89Y8.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Bvb8oUD8.js → EmailListRenderer-CNgTSsFZ.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DpXPjJB5.js → FamilyGuardDashboard-DobM83JP.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BbFfJ1Xi.js → Federation-XVAYQIeu.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DeGq1B-q.js → FormItemContext-DV5ka1KQ.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CNW7s9zM.js → GenericCardRenderer-Dg5q-KpC.js} +1 -1
- package/src/assets/web-panel/assets/{Git-L1PjW-lT.js → Git-Dsn3Xhxf.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-PK-X58to.js → Governance-D06S4Qow.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BePWEH-d.js → Inference-nAvwxUXy.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-LF_sBvdL.js → KnowledgeGraph-CtqRP_rF.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BKkfk9hy.js → Logs-J5aGAyfY.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-BNMqUDla.js → Marketplace-CaeY23Kj.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-w4WPiyz2.js → McpTools-C2HHnwnE.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DUKMVGNi.js → Memory-CWBrdKlR.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BWhiEyTJ.js → MobileBridge-CBLQ8uCY.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-Ocf5JEkX.js → MobileProjects-Q_Cy_W4_.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-D2B6MMhU.js → Mtc-BXur-euo.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-DdYjCq1O.js → MtcAudit-CpQSlOQC.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-Cb1hfuUZ.js → Multisig-DlFwdEOA.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CTeImGp7.js → NLProgramming-DSh7fevc.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BjYNc7eQ.js → Notes-Bv4NOVxg.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-Dn_NtRXQ.js → NotificationSettings-CzHNnIfa.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DVYYIizh.js → OrderTableRenderer-D7pHfKK4.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Be2Kmr5j.js → Organization-COzV01ed.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Cu_-qRlR.js → Overflow-CYRZJb2_.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DD2HoGzE.js → P2P-DFm49FE0.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BRI7DVth.js → PdhVaultBrowser-Ctr-6k5B.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-C9Srcs2M.js → Permissions-DXVrhFyv.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-CUqcMgo1.js → PersonalDataHub-BO5utpLK.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-HBrQGLXt.js → Pipeline-C9irYCg7.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-D-B0vjwh.js → Privacy-r13hrvoF.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-eTeLIu9e.js → ProjectInit-PRKNPZZC.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DrRqCsC6.js → ProjectSettings-QvxM1ZDO.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-1G9DNOhI.js → Projects-DfgmsN3j.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-RkTZzpxP.js → Providers-DxbrccZ7.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BSCUgsgC.js → QrScannerModal-BMHVRxBX.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CHgyM3Bz.js → QuickAsk-Co3_ndAH.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-0lry4OZq.js → Recommend-Cv3UWR6s.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-Cn45UroZ.js → RemoteSession-CSDsO2zA.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-Q-Zjb707.js → Reputation-Bdj59vzM.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BdM70oda.js → Row-CejfUjmo.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DmOAKKap.js → RssFeed-C83yKkvU.js} +2 -2
- package/src/assets/web-panel/assets/{Search-Dwavbm07.js → Search-Ck4l_VI3.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DukXFCnk.js → Security-DGIIEx6K.js} +3 -3
- package/src/assets/web-panel/assets/{Services-BIlRnITu.js → Services-Cj2aNAy3.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-YYVQdhhQ.js → Skeleton-Dlyy8akb.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-B8_iYHz2.js → Skills-C4aDa9Zh.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BdVrhT31.js → Sla-tHd_Bauo.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CD3ggRx7.js → SpeechSettings-DI7R0Qgd.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Bp02VZFH.js → SyncSettings-OOxiPdsE.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DEVmCEsr.js → Tasks-Nro_Ltg5.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-B6czWc4N.js → Templates-Bm7eSMWH.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BCJLv17r.js → Tenant-B8F8eFvD.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CD132d2Y.js → Terminal-2oWhR7QF.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-ZB-CvkZl.js → TimelineRenderer-GLnecmpd.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BnSY0S-s.js → Tokens-CtpFyati.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-VZw9Oy2w.js → Trigger-DGkXZzbN.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-pZq7Hjd2.js → Trust-ClYZMkXN.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DnQaqk4q.js → UkeySign-C1AuEW5-.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BEUfmvJV.js → VideoEditing-DHa9ekSK.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CoZKMXJ2.js → Wallet-CyQv8ZAN.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CBOGVx1I.js → WebAuthn-DPxEEb5Y.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-huSKn7TT.js → WorkflowEditor-C-fCM8Si.js} +1 -1
- package/src/assets/web-panel/assets/{chat-A_3w6FBO.js → chat-BMu1Pk8B.js} +1 -1
- package/src/assets/web-panel/assets/{colors-D1Bem9Oy.js → colors-DYPOXyWQ.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CJYJj0oO.js → compact-item-C5r_plPk.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BkbFiKT4.js → createContext-9fWrWmuJ.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DmRz5Pet.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CKvUafVY.js → hasIn-CjZM2-qE.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHdailyo.js → index-0DVMoDzF.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-WIY-FQ.js → index-B1iUe3Ba.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOoAQjJz.js → index-B56CI20h.js} +1 -1
- package/src/assets/web-panel/assets/{index-AjrSPnvv.js → index-BBVCXmJV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CD62EEGo.js → index-BPucc_ES.js} +1 -1
- package/src/assets/web-panel/assets/{index-tgO8iza6.js → index-BVFtY8Y4.js} +1 -1
- package/src/assets/web-panel/assets/{index-F--HuPG1.js → index-BW-x3mUK.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTs_D1OL.js → index-B_bTdeou.js} +1 -1
- package/src/assets/web-panel/assets/{index-BiDWxzbn.js → index-Bglw_kmu.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBaosWRO.js → index-BsHmE__1.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8i0lViZ.js → index-Bti4lpw5.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJwlEnYo.js → index-ByVDaARk.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVS8Ymuq.js → index-C3E7xVl1.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBlBVJ_m.js → index-CDaA4A0b.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfgCdFrN.js → index-CGqrVLWe.js} +27 -27
- package/src/assets/web-panel/assets/{index-Crp8CbRg.js → index-CJJx0kbR.js} +1 -1
- package/src/assets/web-panel/assets/{index-JEAGMii9.js → index-CTnaRErh.js} +1 -1
- package/src/assets/web-panel/assets/{index-Co3OFL0t.js → index-CYoS2cwK.js} +1 -1
- package/src/assets/web-panel/assets/{index-b-sbVdjQ.js → index-CcDGi9U1.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjYrecNb.js → index-Cd9_KCPs.js} +1 -1
- package/src/assets/web-panel/assets/{index-PF-mpv8K.js → index-Co9kBFxY.js} +1 -1
- package/src/assets/web-panel/assets/index-CrsL7YBW.js +1 -0
- package/src/assets/web-panel/assets/{index-Fuk6t_3K.js → index-CvUR6l7C.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHdHSX06.js → index-CyUtBxnC.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUj-l7GM.js → index-D0rFX-xN.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9bWmTcO.js → index-D6zyUpD6.js} +1 -1
- package/src/assets/web-panel/assets/{index-ChkXUj3f.js → index-DJk9cPrs.js} +1 -1
- package/src/assets/web-panel/assets/{index-pyvMVX8r.js → index-DLCoKst9.js} +1 -1
- package/src/assets/web-panel/assets/{index-ttDQVhZy.js → index-DNxR1CHs.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9Svn0zc.js → index-DWwI0Jjd.js} +1 -1
- package/src/assets/web-panel/assets/{index-BdutMsne.js → index-DjTB4wPn.js} +1 -1
- package/src/assets/web-panel/assets/{index-By5a0T_W.js → index-Du-w2i6G.js} +1 -1
- package/src/assets/web-panel/assets/{index-D22zNXiS.js → index-HJdfPSMz.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSgWxAOG.js → index-I3Qdrfcf.js} +1 -1
- package/src/assets/web-panel/assets/{index-qNTtOVi_.js → index-Mipa7XgU.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpW9cf3e.js → index-jO4lIpFE.js} +1 -1
- package/src/assets/web-panel/assets/{index-C37f6iey.js → index-oerotzoq.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cj0OZ-37.js → index-phHPSXlV.js} +1 -1
- package/src/assets/web-panel/assets/index-zW69WSDA.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-DtrnfsZH.js → initDefaultProps-B7tpABc_.js} +1 -1
- package/src/assets/web-panel/assets/{motion-D4zqSaX3.js → motion-DmvaRoVv.js} +1 -1
- package/src/assets/web-panel/assets/{move-CGFGOUQj.js → move-DF4X29Wf.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DH2HvkJl.js → mtc-parser-C0cbg4PO.js} +1 -1
- package/src/assets/web-panel/assets/{omit-jJ2at5HX.js → omit-DZzcYy0l.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CRyMT1Fv.js → pickAttrs-DaZWfzuH.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DZ_CX0Pt.js → placementArrow-CBxOEyvn.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-wruHk-h5.js → responsiveObserve-CGl8NIlO.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BGgx8q67.js → slide-Bv330MSZ.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Do5M7gKm.js → statusUtils-DJVy5oEM.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CRa-GZpX.js → styleChecker-BiY1H5ST.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BxPcq6pj.js → useFlexGapSupport-D1sN2OlQ.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-v5O2ZcJm.js → useFs-DxxHawzW.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub--z2FU0Px.js → usePersonalDataHub-C1HblLrD.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-1emidVKd.js → vnode-Dex0jy4T.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CcJaRyHs.js → zoom-Bk1MScAD.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-manifest.json +8 -1
- package/src/commands/agent.js +8 -1
- package/src/commands/changelog.js +148 -0
- package/src/commands/eval.js +88 -23
- package/src/commands/plugin.js +10 -0
- package/src/commands/team.js +26 -3
- package/src/data/changelog.json +199 -0
- package/src/gateways/ws/remote-session-protocol.js +9 -2
- package/src/harness/remote-command-ledger.js +60 -10
- package/src/index.js +2 -0
- package/src/lib/agent-sandbox.js +11 -5
- package/src/lib/agent-team/task-lease.js +28 -0
- package/src/lib/agent-team/team-runner.js +25 -0
- package/src/lib/changelog.js +252 -0
- package/src/lib/eval/tasks.js +62 -41
- package/src/lib/eval/trend.js +7 -1
- package/src/lib/lsp/__tests__/lsp-client.test.js +12 -6
- package/src/lib/lsp/code-intelligence.js +55 -17
- package/src/lib/lsp/lsp-client.js +7 -1
- package/src/lib/lsp/lsp-server-registry.js +15 -4
- package/src/lib/plugin-runtime/hooks.js +20 -4
- package/src/lib/plugin-runtime/install.js +20 -1
- package/src/lib/plugin-runtime/monitors.js +20 -4
- package/src/lib/plugin-runtime/policy.js +13 -0
- package/src/lib/plugin-runtime/remote-source.js +34 -0
- package/src/lib/plugin-runtime/signature.js +95 -22
- package/src/lib/plugin-security.js +13 -14
- package/src/lib/sandbox-egress-proxy.js +38 -2
- package/src/lib/sandbox-network-policy.js +26 -4
- package/src/lib/telemetry/span-recorder.js +26 -4
- package/src/repl/agent-repl.js +12 -8
- package/src/runtime/__tests__/auto-pin.test.js +27 -4
- package/src/runtime/auto-pin.js +19 -0
- package/src/runtime/headless-runner.js +23 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-8nul8eTq.js +0 -1
- package/src/assets/web-panel/assets/devWarning-WDr3_M_N.js +0 -1
- package/src/assets/web-panel/assets/index-Dwix3p4g.js +0 -1
- package/src/assets/web-panel/assets/index-SHaoZ0CA.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as d}from"./index-
|
|
1
|
+
import{u as d}from"./index-CGqrVLWe.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-CGqrVLWe.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-CGqrVLWe.js";import{a8 as o,k as g,C as d,F as f,A as p}from"./vendor-BMxUs6UX.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-CGqrVLWe.js";import{i as f}from"./motion-DmvaRoVv.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-CGqrVLWe.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="./assets/vendor-BMxUs6UX.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="./assets/icons-BsDmGpcT.js">
|
|
14
14
|
<link rel="stylesheet" crossorigin href="./assets/index-Cq93VfoF.css">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_generated": "scripts/gen-command-manifest.mjs — do not edit by hand",
|
|
3
|
-
"commandCount":
|
|
3
|
+
"commandCount": 164,
|
|
4
4
|
"commands": [
|
|
5
5
|
{
|
|
6
6
|
"name": "a2a",
|
|
@@ -114,6 +114,13 @@
|
|
|
114
114
|
"register": "registerCcronCommand",
|
|
115
115
|
"summary": "Cowork Cron V2 governance (in-memory, CLI v0.143.0)"
|
|
116
116
|
},
|
|
117
|
+
{
|
|
118
|
+
"name": "changelog",
|
|
119
|
+
"aliases": ["whatsnew"],
|
|
120
|
+
"module": "./commands/changelog.js",
|
|
121
|
+
"register": "registerChangelogCommand",
|
|
122
|
+
"summary": "Show cc CLI version update notes (npm package changelog)"
|
|
123
|
+
},
|
|
117
124
|
{
|
|
118
125
|
"name": "chat",
|
|
119
126
|
"aliases": [],
|
package/src/commands/agent.js
CHANGED
|
@@ -187,7 +187,7 @@ export function registerAgentCommand(program) {
|
|
|
187
187
|
)
|
|
188
188
|
.option(
|
|
189
189
|
"--auto-pin",
|
|
190
|
-
"
|
|
190
|
+
"Force-pin the original task (first user turn) through compaction (ON by default; disable with CC_AUTO_PIN=0 or config context.autoPin=false)",
|
|
191
191
|
)
|
|
192
192
|
.option(
|
|
193
193
|
"--max-rewakes <n>",
|
|
@@ -347,6 +347,13 @@ export function registerAgentCommand(program) {
|
|
|
347
347
|
false,
|
|
348
348
|
)
|
|
349
349
|
.action(async (task, options, command) => {
|
|
350
|
+
// CC_API_KEY env fallback for --api-key: lets callers (IDE plugins,
|
|
351
|
+
// scripts) pass the key via the environment instead of argv, where it
|
|
352
|
+
// is visible to every local process (/proc/<pid>/cmdline, Win32_Process).
|
|
353
|
+
// An explicit --api-key still wins.
|
|
354
|
+
if (!options.apiKey && process.env.CC_API_KEY) {
|
|
355
|
+
options.apiKey = process.env.CC_API_KEY;
|
|
356
|
+
}
|
|
350
357
|
const bypassPermissions = !!(
|
|
351
358
|
options.allowDangerousBypass ||
|
|
352
359
|
options.yolo ||
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { VERSION } from "../constants.js";
|
|
3
|
+
import { loadChangelog } from "../lib/changelog.js";
|
|
4
|
+
import logger from "../lib/logger.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Render a release's markdown-ish body into readable terminal text.
|
|
8
|
+
* Light-touch: **bold** → bold, `code` → cyan, keep bullets, drop blockquote
|
|
9
|
+
* markers, collapse blank runs.
|
|
10
|
+
*/
|
|
11
|
+
function renderBody(body, indent = " ") {
|
|
12
|
+
const out = [];
|
|
13
|
+
let blank = 0;
|
|
14
|
+
for (const raw of body.split("\n")) {
|
|
15
|
+
let line = raw.replace(/^>\s?/, ""); // blockquote marker
|
|
16
|
+
line = line.replace(/\*\*(.+?)\*\*/g, (_, t) => chalk.bold(t));
|
|
17
|
+
line = line.replace(/`([^`]+)`/g, (_, t) => chalk.cyan(t));
|
|
18
|
+
if (line.trim() === "") {
|
|
19
|
+
blank++;
|
|
20
|
+
if (blank > 1) continue;
|
|
21
|
+
out.push("");
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
blank = 0;
|
|
25
|
+
out.push(indent + line);
|
|
26
|
+
}
|
|
27
|
+
return out.join("\n").replace(/\n+$/, "");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function renderRelease(rel, { isCurrent }) {
|
|
31
|
+
const lines = [];
|
|
32
|
+
const ver = chalk.bold.green(rel.cliVersion);
|
|
33
|
+
const meta = [
|
|
34
|
+
rel.productVersion ? `product ${rel.productVersion}` : null,
|
|
35
|
+
rel.date || null,
|
|
36
|
+
]
|
|
37
|
+
.filter(Boolean)
|
|
38
|
+
.join(", ");
|
|
39
|
+
const current = isCurrent ? chalk.yellow(" ← installed") : "";
|
|
40
|
+
lines.push(`${ver} ${chalk.dim("(" + meta + ")")}${current}`);
|
|
41
|
+
if (rel.title) lines.push(" " + chalk.white(rel.title));
|
|
42
|
+
lines.push("");
|
|
43
|
+
for (const s of rel.sections) {
|
|
44
|
+
if (s.heading) lines.push(" " + chalk.bold.cyan("▸ " + s.heading));
|
|
45
|
+
if (s.body) lines.push(renderBody(s.body, s.heading ? " " : " "));
|
|
46
|
+
lines.push("");
|
|
47
|
+
}
|
|
48
|
+
return lines.join("\n").replace(/\n+$/, "");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Find releases matching a user-supplied version query. Matches the CLI npm
|
|
53
|
+
* version (0.162.150 / v0.162.150) or the product version (v5.0.3.134 / 134).
|
|
54
|
+
*/
|
|
55
|
+
function matchVersion(releases, query) {
|
|
56
|
+
const q = query.replace(/^v/i, "").trim();
|
|
57
|
+
return releases.filter((r) => {
|
|
58
|
+
const cli = r.cliVersion || "";
|
|
59
|
+
const prod = (r.productVersion || "").replace(/^v/i, "");
|
|
60
|
+
return (
|
|
61
|
+
cli === q ||
|
|
62
|
+
cli.endsWith("." + q) ||
|
|
63
|
+
prod === q ||
|
|
64
|
+
prod.endsWith("." + q) ||
|
|
65
|
+
(r.cliVersions || []).includes(q)
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function registerChangelogCommand(program) {
|
|
71
|
+
program
|
|
72
|
+
.command("changelog")
|
|
73
|
+
.alias("whatsnew")
|
|
74
|
+
.description("Show cc CLI version update notes (npm package changelog)")
|
|
75
|
+
.argument(
|
|
76
|
+
"[version]",
|
|
77
|
+
"Show notes for a specific version (e.g. 0.162.150 or v5.0.3.134)",
|
|
78
|
+
)
|
|
79
|
+
.option("--all", "Show the full CLI release history")
|
|
80
|
+
.option("-n, --limit <n>", "Show the N most recent releases", "5")
|
|
81
|
+
.option("--json", "Output as JSON")
|
|
82
|
+
.action((version, options) => {
|
|
83
|
+
const data = loadChangelog();
|
|
84
|
+
const releases = data.releases || [];
|
|
85
|
+
|
|
86
|
+
if (releases.length === 0) {
|
|
87
|
+
if (options.json) {
|
|
88
|
+
logger.log(JSON.stringify({ releases: [] }, null, 2));
|
|
89
|
+
} else {
|
|
90
|
+
logger.warn("No changelog data is bundled with this build.");
|
|
91
|
+
}
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
let selected = releases;
|
|
96
|
+
if (version) {
|
|
97
|
+
selected = matchVersion(releases, version);
|
|
98
|
+
if (selected.length === 0) {
|
|
99
|
+
if (options.json) {
|
|
100
|
+
logger.log(JSON.stringify({ releases: [] }, null, 2));
|
|
101
|
+
} else {
|
|
102
|
+
logger.warn(`No CLI release notes found for "${version}".`);
|
|
103
|
+
logger.info(
|
|
104
|
+
`Available CLI versions: ${releases
|
|
105
|
+
.map((r) => r.cliVersion)
|
|
106
|
+
.join(", ")}`,
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
} else if (!options.all) {
|
|
112
|
+
const limit = Math.max(1, parseInt(options.limit, 10) || 5);
|
|
113
|
+
selected = releases.slice(0, limit);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (options.json) {
|
|
117
|
+
logger.log(JSON.stringify({ ...data, releases: selected }, null, 2));
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
logger.newline();
|
|
122
|
+
logger.log(
|
|
123
|
+
chalk.bold(
|
|
124
|
+
` ChainlessChain CLI — update notes ${chalk.dim(`(installed: ${VERSION})`)}`,
|
|
125
|
+
),
|
|
126
|
+
);
|
|
127
|
+
logger.log(
|
|
128
|
+
chalk.dim(
|
|
129
|
+
` Showing ${selected.length} of ${releases.length} documented CLI releases.`,
|
|
130
|
+
),
|
|
131
|
+
);
|
|
132
|
+
logger.newline();
|
|
133
|
+
|
|
134
|
+
for (const rel of selected) {
|
|
135
|
+
logger.log(
|
|
136
|
+
renderRelease(rel, { isCurrent: rel.cliVersion === VERSION }),
|
|
137
|
+
);
|
|
138
|
+
logger.log(chalk.dim(" " + "─".repeat(58)));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (!version && !options.all && releases.length > selected.length) {
|
|
142
|
+
logger.newline();
|
|
143
|
+
logger.info(
|
|
144
|
+
`Run ${chalk.cyan("cc changelog --all")} for the full history, or ${chalk.cyan("cc changelog <version>")} for one release.`,
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
}
|
package/src/commands/eval.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
import fs from "fs";
|
|
12
12
|
import path from "path";
|
|
13
13
|
import { fileURLToPath } from "url";
|
|
14
|
-
import { spawn } from "child_process";
|
|
14
|
+
import { spawn, spawnSync } from "child_process";
|
|
15
15
|
import { runEvalSuite } from "../lib/eval/runner.js";
|
|
16
16
|
import { getSuite } from "../lib/eval/tasks.js";
|
|
17
17
|
import {
|
|
@@ -45,6 +45,40 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
|
45
45
|
// This file is src/commands/eval.js → the CLI entry is bin/chainlesschain.js.
|
|
46
46
|
const BIN = path.resolve(__dirname, "..", "..", "bin", "chainlesschain.js");
|
|
47
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Kill an agent child AND its tool grandchildren. A bare child.kill("SIGTERM")
|
|
50
|
+
* only reaches the direct child (and on Windows TerminateProcess never reaches
|
|
51
|
+
* grandchildren), leaving tools alive and still WRITING into the workspace.
|
|
52
|
+
* POSIX children are spawned detached (own process group) so -pid reaps the
|
|
53
|
+
* whole tree; Windows uses taskkill /T /F. Same pattern as the async-hook
|
|
54
|
+
* supervisor's _killChildTree.
|
|
55
|
+
*/
|
|
56
|
+
function killAgentTree(child) {
|
|
57
|
+
if (!child || !child.pid) return;
|
|
58
|
+
if (process.platform === "win32") {
|
|
59
|
+
try {
|
|
60
|
+
spawnSync("taskkill", ["/PID", String(child.pid), "/T", "/F"], {
|
|
61
|
+
windowsHide: true,
|
|
62
|
+
timeout: 10000,
|
|
63
|
+
});
|
|
64
|
+
} catch {
|
|
65
|
+
/* fall through to the direct kill below */
|
|
66
|
+
}
|
|
67
|
+
} else {
|
|
68
|
+
try {
|
|
69
|
+
process.kill(-child.pid, "SIGKILL"); // negative pid = process group
|
|
70
|
+
return;
|
|
71
|
+
} catch {
|
|
72
|
+
/* not a group leader / already gone — fall through */
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
child.kill("SIGKILL");
|
|
77
|
+
} catch {
|
|
78
|
+
/* already gone */
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
48
82
|
/**
|
|
49
83
|
* Build a runAgent that shells out to a headless `cc agent -p` in the task's
|
|
50
84
|
* workspace. acceptEdits lets it write files without an interactive prompt.
|
|
@@ -52,42 +86,59 @@ const BIN = path.resolve(__dirname, "..", "..", "bin", "chainlesschain.js");
|
|
|
52
86
|
function makeHeadlessRunAgent(opts = {}) {
|
|
53
87
|
return function runAgent({ prompt, cwd, timeoutMs }) {
|
|
54
88
|
return new Promise((resolve) => {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
89
|
+
let args;
|
|
90
|
+
if (opts._argv) {
|
|
91
|
+
// Test seam: run an arbitrary node argv instead of the real agent, so
|
|
92
|
+
// the timeout/tree-kill path is testable offline.
|
|
93
|
+
args = opts._argv;
|
|
94
|
+
} else {
|
|
95
|
+
args = [
|
|
96
|
+
BIN,
|
|
97
|
+
"agent",
|
|
98
|
+
"-p",
|
|
99
|
+
prompt,
|
|
100
|
+
"--permission-mode",
|
|
101
|
+
"acceptEdits",
|
|
102
|
+
"--output-format",
|
|
103
|
+
"text",
|
|
104
|
+
];
|
|
105
|
+
if (opts.model) args.push("--model", opts.model);
|
|
106
|
+
if (opts.provider) args.push("--provider", opts.provider);
|
|
107
|
+
}
|
|
67
108
|
const child = spawn(process.execPath, args, {
|
|
68
109
|
cwd,
|
|
69
110
|
env: { ...process.env, CLAUDECODE: "1" },
|
|
70
111
|
windowsHide: true,
|
|
112
|
+
// Own process group on POSIX so a timeout can reap the whole tree.
|
|
113
|
+
detached: process.platform !== "win32",
|
|
71
114
|
});
|
|
72
115
|
let out = "";
|
|
73
116
|
let err = "";
|
|
74
117
|
let settled = false;
|
|
118
|
+
let timedOut = false;
|
|
119
|
+
let graceTimer = null;
|
|
75
120
|
const done = (result) => {
|
|
76
121
|
if (settled) return;
|
|
77
122
|
settled = true;
|
|
123
|
+
clearTimeout(graceTimer);
|
|
78
124
|
resolve(result);
|
|
79
125
|
};
|
|
80
126
|
const timer = setTimeout(() => {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
127
|
+
// Kill the WHOLE tree, then settle on `close` — resolving immediately
|
|
128
|
+
// would race a still-live agent against the runner's after-snapshot,
|
|
129
|
+
// check() and workspace rmSync (nondeterministic scores + EBUSY leaks).
|
|
130
|
+
timedOut = true;
|
|
131
|
+
killAgentTree(child);
|
|
132
|
+
// Last resort if the process is unkillable and `close` never fires —
|
|
133
|
+
// don't hang the whole suite on one stuck task.
|
|
134
|
+
graceTimer = setTimeout(() => {
|
|
135
|
+
done({
|
|
136
|
+
ok: false,
|
|
137
|
+
output: out,
|
|
138
|
+
error: `timed out after ${timeoutMs || 120000}ms (process did not exit after kill)`,
|
|
139
|
+
});
|
|
140
|
+
}, 10000);
|
|
141
|
+
if (typeof graceTimer.unref === "function") graceTimer.unref();
|
|
91
142
|
}, timeoutMs || 120000);
|
|
92
143
|
if (typeof timer.unref === "function") timer.unref();
|
|
93
144
|
child.stdout?.on("data", (d) => (out += d.toString("utf8")));
|
|
@@ -98,12 +149,23 @@ function makeHeadlessRunAgent(opts = {}) {
|
|
|
98
149
|
});
|
|
99
150
|
child.on("close", (code) => {
|
|
100
151
|
clearTimeout(timer);
|
|
152
|
+
if (timedOut) {
|
|
153
|
+
done({
|
|
154
|
+
ok: false,
|
|
155
|
+
output: out,
|
|
156
|
+
error: `timed out after ${timeoutMs || 120000}ms`,
|
|
157
|
+
});
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
101
160
|
done({ ok: code === 0, output: out, error: code === 0 ? null : err });
|
|
102
161
|
});
|
|
103
162
|
});
|
|
104
163
|
};
|
|
105
164
|
}
|
|
106
165
|
|
|
166
|
+
// For tests: the timeout/tree-kill path needs a real spawned process.
|
|
167
|
+
export { makeHeadlessRunAgent, killAgentTree };
|
|
168
|
+
|
|
107
169
|
export function registerEvalCommand(program, { logger } = {}) {
|
|
108
170
|
const log = logger || console;
|
|
109
171
|
program
|
|
@@ -215,6 +277,9 @@ export function registerEvalCommand(program, { logger } = {}) {
|
|
|
215
277
|
appendHistory(options.history, {
|
|
216
278
|
ranAt: new Date().toISOString(),
|
|
217
279
|
label: options.label || null,
|
|
280
|
+
// Tagged so --trend can exclude it: a dry-run is always 0% and
|
|
281
|
+
// would otherwise report every passing task as a regression.
|
|
282
|
+
...(options.dryRun ? { dryRun: true } : {}),
|
|
218
283
|
passed: summary.passed,
|
|
219
284
|
total: summary.total,
|
|
220
285
|
passRate: summary.passRate,
|
package/src/commands/plugin.js
CHANGED
|
@@ -608,6 +608,10 @@ export function registerPluginCommand(program) {
|
|
|
608
608
|
"Plugin name to select from a multi-plugin registry",
|
|
609
609
|
)
|
|
610
610
|
.option("--token <token>", "Bearer token for a private registry")
|
|
611
|
+
.option(
|
|
612
|
+
"--allow-insecure-registry",
|
|
613
|
+
"Allow a plain-HTTP registry URL (MITM risk — trusted networks only)",
|
|
614
|
+
)
|
|
611
615
|
.option("--json", "Output as JSON")
|
|
612
616
|
.action(async (source, options) => {
|
|
613
617
|
const { installFromSource } =
|
|
@@ -636,6 +640,7 @@ export function registerPluginCommand(program) {
|
|
|
636
640
|
name,
|
|
637
641
|
token: options.token,
|
|
638
642
|
config,
|
|
643
|
+
allowInsecure: options.allowInsecureRegistry === true,
|
|
639
644
|
});
|
|
640
645
|
installSource = resolved.source;
|
|
641
646
|
integritySha = resolved.sha256;
|
|
@@ -694,6 +699,10 @@ export function registerPluginCommand(program) {
|
|
|
694
699
|
)
|
|
695
700
|
.requiredOption("--registry <url>", "Registry/manifest URL to browse")
|
|
696
701
|
.option("--token <token>", "Bearer token for a private registry")
|
|
702
|
+
.option(
|
|
703
|
+
"--allow-insecure-registry",
|
|
704
|
+
"Allow a plain-HTTP registry URL (MITM risk — trusted networks only)",
|
|
705
|
+
)
|
|
697
706
|
.option("--json", "Output as JSON")
|
|
698
707
|
.action(async (query, options) => {
|
|
699
708
|
const { fetchRegistry, listRegistryPlugins, resolveRegistryToken } =
|
|
@@ -712,6 +721,7 @@ export function registerPluginCommand(program) {
|
|
|
712
721
|
});
|
|
713
722
|
const { registry, fromCache } = await fetchRegistry(options.registry, {
|
|
714
723
|
token,
|
|
724
|
+
allowInsecure: options.allowInsecureRegistry === true,
|
|
715
725
|
});
|
|
716
726
|
let rows = listRegistryPlugins(registry);
|
|
717
727
|
if (query) {
|
package/src/commands/team.js
CHANGED
|
@@ -29,7 +29,7 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
|
29
29
|
const BIN = path.resolve(__dirname, "..", "..", "bin", "chainlesschain.js");
|
|
30
30
|
|
|
31
31
|
/** Load + validate a task-graph file into a registry (throws on bad input). */
|
|
32
|
-
function loadRegistry(file, { ttlMs } = {}) {
|
|
32
|
+
export function loadRegistry(file, { ttlMs } = {}) {
|
|
33
33
|
const abs = path.resolve(process.cwd(), file);
|
|
34
34
|
let doc;
|
|
35
35
|
try {
|
|
@@ -41,6 +41,19 @@ function loadRegistry(file, { ttlMs } = {}) {
|
|
|
41
41
|
if (!Array.isArray(tasks) || tasks.length === 0) {
|
|
42
42
|
throw new Error("task file must have a non-empty `tasks` array");
|
|
43
43
|
}
|
|
44
|
+
// Reject unknown dependency keys up front: a typo'd dependsOn ("biuld") makes
|
|
45
|
+
// a task permanently unclaimable — the run silently exits 1 and `plan` drops
|
|
46
|
+
// it from the waves with no diagnosis.
|
|
47
|
+
const keys = new Set(tasks.map((t) => t.key));
|
|
48
|
+
for (const t of tasks) {
|
|
49
|
+
for (const d of t.dependsOn || t.deps || []) {
|
|
50
|
+
if (!keys.has(d)) {
|
|
51
|
+
throw new Error(
|
|
52
|
+
`task "${t.key}" depends on unknown task "${d}" (typo in dependsOn?)`,
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
44
57
|
const reg = new TaskLeaseRegistry({ defaultTtlMs: ttlMs });
|
|
45
58
|
for (const t of tasks) {
|
|
46
59
|
const r = reg.addTask({
|
|
@@ -266,7 +279,12 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
266
279
|
for (const t of reg.list()) {
|
|
267
280
|
if (t.lease && t.lease.holder) lostHolders.add(t.lease.holder);
|
|
268
281
|
}
|
|
269
|
-
|
|
282
|
+
// Reclaim ALL dangling leases, not just expired ones: every holder in
|
|
283
|
+
// the persisted snapshot is from the now-dead prior process, so a lease
|
|
284
|
+
// still inside its TTL (a crash seconds after acquiring) must be
|
|
285
|
+
// reclaimed too — reclaimExpired() would skip it and strand the task,
|
|
286
|
+
// yet we already reported its holder LOST above.
|
|
287
|
+
const freed = reg.reclaimAll();
|
|
270
288
|
for (const h of lostHolders) {
|
|
271
289
|
if (options.json)
|
|
272
290
|
console.log(JSON.stringify({ type: "teammate:lost", holder: h }));
|
|
@@ -296,8 +314,12 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
296
314
|
const persist = () => {
|
|
297
315
|
if (!options.state) return;
|
|
298
316
|
try {
|
|
317
|
+
// Atomic write (tmp + rename): a crash mid-write must not truncate
|
|
318
|
+
// the ONLY resume file — a torn snapshot makes --resume throw and
|
|
319
|
+
// loses all progress.
|
|
320
|
+
const tmp = `${options.state}.tmp`;
|
|
299
321
|
fs.writeFileSync(
|
|
300
|
-
|
|
322
|
+
tmp,
|
|
301
323
|
JSON.stringify(
|
|
302
324
|
{
|
|
303
325
|
version: 2,
|
|
@@ -311,6 +333,7 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
311
333
|
),
|
|
312
334
|
"utf8",
|
|
313
335
|
);
|
|
336
|
+
fs.renameSync(tmp, options.state);
|
|
314
337
|
} catch (e) {
|
|
315
338
|
(log.error || console.error)(` state write failed: ${e.message}`);
|
|
316
339
|
}
|