@cline/core 0.0.88 → 0.0.89
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/dist/cloud/index.js +1 -1
- package/dist/hub/daemon/entry.js +200 -200
- package/dist/hub/index.js +190 -190
- package/dist/index.js +223 -223
- package/dist/remote/remote-helper-entry.js +1 -1
- package/dist/remote/remote-helper.js +1 -1
- package/dist/runtime/orchestration/session-runtime-orchestrator.d.ts +3 -0
- package/dist/services/providers/local-provider-registry.d.ts +2 -0
- package/dist/services/providers/local-provider-service.d.ts +11 -6
- package/dist/services/providers/model-source.d.ts +6 -1
- package/dist/session/services/message-builder.d.ts +8 -1
- package/dist/session/services/tool-result-cache.d.ts +30 -0
- package/package.json +4 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{homedir as Wn}from"node:os";import{claimHubDaemonProcess as $n}from"@cline/shared";import{setHomeDirIfUnset as Gn}from"@cline/shared/storage";import{createSessionId as hn,ensureLoopbackProxyBypass as Ae,isHubProtocolCompatible as gn,resolveClineBuildEnv as bn,resolveHubCommandTimeoutMs as yn}from"@cline/shared";import wn from"ws";var H={name:"@cline/core",description:"Cline Core SDK for Node Runtime",version:"0.0.
|
|
1
|
+
import{homedir as Wn}from"node:os";import{claimHubDaemonProcess as $n}from"@cline/shared";import{setHomeDirIfUnset as Gn}from"@cline/shared/storage";import{createSessionId as hn,ensureLoopbackProxyBypass as Ae,isHubProtocolCompatible as gn,resolveClineBuildEnv as bn,resolveHubCommandTimeoutMs as yn}from"@cline/shared";import wn from"ws";var H={name:"@cline/core",description:"Cline Core SDK for Node Runtime",version:"0.0.89",repository:{type:"git",url:"https://github.com/cline/cline",directory:"sdk/packages/core"},type:"module",types:"./dist/index.d.ts",main:"./dist/index.js",private:!1,publishConfig:{access:"public"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./hub":{types:"./dist/hub/index.d.ts",import:"./dist/hub/index.js"},"./hub/daemon-entry":{types:"./dist/hub/daemon/entry.d.ts",import:"./dist/hub/daemon/entry.js"},"./telemetry":{types:"./dist/services/telemetry/index.d.ts",import:"./dist/services/telemetry/index.js"},"./services/feature-flags/posthog":{types:"./dist/services/feature-flags/posthog.d.ts",import:"./dist/services/feature-flags/posthog.js"},"./remote/helper-entry":{types:"./dist/remote/remote-helper-entry.d.ts",import:"./dist/remote/remote-helper-entry.js"},"./cloud":{types:"./dist/cloud/index.d.ts",import:"./dist/cloud/index.js"},"./remote/helper":{types:"./dist/remote/remote-helper.d.ts",import:"./dist/remote/remote-helper.js"}},scripts:{build:"bun run ./bun.mts && bun tsc -p tsconfig.build.json && bun run ./scripts/verify-runtime-build-id.ts",typecheck:"bun tsc -p tsconfig.dev.json --noEmit && bun run typecheck:smoke","typecheck:smoke":"bun tsc -p tsconfig.smoke.json --noEmit",test:"bun run test:unit && bun run test:e2e","test:live":"vitest run --config vitest.config.ts src/extensions/context/compaction.live.test.ts","test:compaction":"bun --conditions=development run scripts/compact-session.ts","test:unit":"vitest run --config vitest.config.ts","test:e2e":"vitest run --config vitest.e2e.config.ts","verify:routines":"zsh -lc 'bunx vitest run src/cron/schedule-service.test.ts --config vitest.config.ts'","test:watch":"vitest --config vitest.config.ts"},dependencies:{"@cline/agents":"workspace:*","@cline/shared":"workspace:*","@cline/llms":"workspace:*","@modelcontextprotocol/sdk":"^1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.214.0","@opentelemetry/exporter-logs-otlp-http":"^0.214.0","@opentelemetry/exporter-metrics-otlp-http":"^0.214.0","@opentelemetry/exporter-trace-otlp-http":"^0.214.0","@opentelemetry/resources":"^2.6.1","@opentelemetry/sdk-logs":"^0.214.0","@opentelemetry/sdk-metrics":"^2.6.1","@opentelemetry/sdk-trace-base":"^2.6.1","@opentelemetry/sdk-trace-node":"^2.6.1","@opentelemetry/semantic-conventions":"^1.40.0",jiti:"^2.7.0","node-machine-id":"^1.1.12",nanoid:"^5.1.7","simple-git":"3.36.0",ws:"^8.20.0",yaml:"^2.8.2",zod:"^4.3.6"},peerDependencies:{"posthog-node":"^5.8.0"},peerDependenciesMeta:{"posthog-node":{optional:!0}},devDependencies:{"@types/ws":"^8.18.1","posthog-node":"^5.8.0"},engines:{node:">=22"},files:["dist","!dist/**/*.d.ts.map"]};var re="session_not_found";class F extends Error{sessionId;code="session_not_found";constructor(e,t){super(t??(e?`session not found: ${e}`:"session not found"));this.sessionId=e;this.name="SessionNotFoundError"}}import{spawn as Dt}from"node:child_process";import{closeSync as At,mkdirSync as Lt,openSync as Ut,readFileSync as Mt,unlinkSync as Nt}from"node:fs";import{basename as Bt,dirname as Ft,join as Vt}from"node:path";import{fileURLToPath as Wt}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as $t,isBunEmbeddedModulePath as Gt,isHubDaemonProcess as jt,resolveClineBuildEnv as Te,withResolvedClineBuildEnv as qt}from"@cline/shared";import{createHash as Ye,randomBytes as Xe}from"node:crypto";import{mkdir as W,open as ie,readFile as de,rename as Ze,rm as I,writeFile as Qe}from"node:fs/promises";import{dirname as le,join as G}from"node:path";import{ensureLoopbackProxyBypass as et,isHubProtocolCompatible as tt}from"@cline/shared";import{resolveClineDataDir as P,resolveClineDir as Qn}from"@cline/shared/storage";var nt="CLINE_HUB_DISCOVERY_PATH",ot="CLINE_HUB_BUILD_ID",rt="CLINE_HUB_BUILD_EPOCH_MS",it=30000,st=15000,se=100;function at(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function ct(e){return Ye("sha256").update(e).digest("hex").slice(0,12)}function ut(e){if(!Number.isInteger(e)||!e||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return t instanceof Error&&"code"in t?String(t.code)==="EPERM":!1}}function ae(e){return new Promise((t)=>setTimeout(t,e))}function dt(e){return`${e}.lock`}async function lt(e){try{let t=JSON.parse(await de(G(e,"owner.json"),"utf8"));if(typeof t.pid!=="number"||typeof t.acquiredAt!=="string")return;return{pid:t.pid,acquiredAt:t.acquiredAt}}catch{return}}async function V(e){await I(e,{recursive:!0,force:!0}).catch(()=>{return})}function k(){let e=process.env[ot]?.trim();if(e)return e;return"sdk-v1-320526e16fc49dc154a7a13f617d0519faa9a32e6ef1a78b3e596c061889b15d".trim()||`source-${String(H.version)}`}function pt(){let e=Number(process.env[rt]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1790811192802)?1790811192802:void 0}function x(e,t=k()){let n=tt(e);if(!n.compatible)return n;let o=e.buildId?.trim();if(!o)return{compatible:!1,reason:"missing_build"};if(o!==t)return{compatible:!1,reason:"build_mismatch"};return{compatible:!0}}function ce(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0}function ue(e){let t=e?.trim().split(/[-+]/,1)[0];if(!t)return;let n=t.split(".").map((o)=>Number(o));if(n.length===0||n.some((o)=>!Number.isInteger(o)||o<0))return;return n}function ft(e,t){for(let n=0;n<Math.max(e.length,t.length);n++){let o=e[n]??0,r=t[n]??0;if(o!==r)return o<r?-1:1}return 0}function pe(e,t){let n=e.buildId?.trim(),o=t.buildId?.trim();if(n&&o&&n===o)return 0;let r=ce(e.buildEpochMs),i=ce(t.buildEpochMs);if(r!==void 0&&i!==void 0&&r!==i)return r<i?-1:1;let a=ue(e.coreVersion),u=ue(t.coreVersion);if(a&&u){let c=ft(a,u);if(c!==0)return c}if(n&&o&&n!==o)return n<o?-1:1;return 0}function fe(){return{buildId:k(),buildEpochMs:pt(),coreVersion:String(H.version)}}function O(e,t){let n=t?.self??fe(),o=x(e,n.buildId??"");if(o.compatible)return!0;if(o.reason!=="build_mismatch"&&o.reason!=="missing_build")return!1;return pe(n,e)<=0}function me(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${ct(e)}`,n=process.env[nt]?.trim()||G(P(),"locks","hub","owners",`${at(t)}.json`);return{ownerId:t,discoveryPath:n}}async function b(e){try{let t=JSON.parse(await de(e,"utf8"));if(typeof t.hubId!=="string"||typeof t.protocolVersion!=="string"||typeof t.authToken!=="string"||typeof t.host!=="string"||typeof t.port!=="number"||typeof t.url!=="string"||typeof t.startedAt!=="string"||typeof t.updatedAt!=="string")return;return{hubId:t.hubId,protocolVersion:t.protocolVersion,minClientProtocolVersion:typeof t.minClientProtocolVersion==="string"?t.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof t.maxClientProtocolVersion==="string"?t.maxClientProtocolVersion:void 0,capabilities:Array.isArray(t.capabilities)?t.capabilities.filter((n)=>typeof n==="string"):void 0,coreVersion:typeof t.coreVersion==="string"?t.coreVersion:void 0,buildId:typeof t.buildId==="string"?t.buildId:void 0,buildEpochMs:typeof t.buildEpochMs==="number"?t.buildEpochMs:void 0,authToken:t.authToken,host:t.host,port:t.port,url:t.url,pid:typeof t.pid==="number"?t.pid:void 0,startedAt:t.startedAt,updatedAt:t.updatedAt}}catch{return}}async function he(e,t){await j(e,async()=>{let n=le(e);await W(n,{recursive:!0});let o=`${e}.${process.pid}.${Xe(6).toString("hex")}.tmp`,r;try{r=await ie(o,"wx",384),await r.writeFile(`${JSON.stringify(t,null,2)}
|
|
2
2
|
`,{encoding:"utf8"}),await r.sync(),await r.close(),r=void 0,await Ze(o,e);let i;try{i=await ie(n,"r"),await i.sync()}catch{}finally{await i?.close().catch(()=>{return})}}catch(i){throw await r?.close().catch(()=>{return}),await I(o,{force:!0}).catch(()=>{return}),i}})}async function C(e){await j(e,async()=>{await I(e,{force:!0}).catch(()=>{return})})}async function ge(e,t){return await j(e,async()=>{if((await b(e))?.hubId!==t)return!1;return await I(e,{force:!0}),!0})}async function be(e,t,n){let o=dt(e);await W(le(o),{recursive:!0});let r=Date.now()+st;while(!0){try{await W(o,{recursive:!1})}catch(i){if((i instanceof Error&&"code"in i?String(i.code):"")!=="EEXIST")throw i;let u=await lt(o);if(!u){if(Date.now()>=r){await V(o);continue}await ae(se);continue}let c=Date.now()-Date.parse(u.acquiredAt);if(!ut(u.pid)||c>it){await V(o);continue}if(Date.now()>=r)throw Error(`Timed out waiting for hub ${t} lock ${o}`);await ae(se);continue}try{return await Qe(G(o,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
|
|
3
3
|
`,"utf8"),await n()}finally{await V(o)}}}function j(e,t){return be(`${e}.mutation`,"discovery mutation",t)}function ye(e,t){return be(e,"startup",t)}async function D(e,t){et();try{let n=await fetch(t?.authToken?mt(e):ve(e),{headers:t?.authToken?{authorization:`Bearer ${t.authToken}`}:void 0,signal:t?.signal});if(!n.ok)return;let o=await n.json();if(typeof o.protocolVersion!=="string"||typeof o.host!=="string"||typeof o.port!=="number"||typeof o.url!=="string")return;return{protocolVersion:o.protocolVersion,minClientProtocolVersion:typeof o.minClientProtocolVersion==="string"?o.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof o.maxClientProtocolVersion==="string"?o.maxClientProtocolVersion:void 0,capabilities:Array.isArray(o.capabilities)?o.capabilities.filter((r)=>typeof r==="string"):void 0,coreVersion:typeof o.coreVersion==="string"?o.coreVersion:void 0,buildId:typeof o.buildId==="string"?o.buildId:void 0,buildEpochMs:typeof o.buildEpochMs==="number"?o.buildEpochMs:void 0,host:o.host,port:o.port,url:o.url,hubId:typeof o.hubId==="string"?o.hubId:void 0,authToken:typeof o.authToken==="string"?o.authToken:void 0,pid:typeof o.pid==="number"?o.pid:void 0,startedAt:typeof o.startedAt==="string"?o.startedAt:void 0,updatedAt:typeof o.updatedAt==="string"?o.updatedAt:void 0}}catch{return}}function we(e,t,n="/hub"){return new URL(`ws://${e}:${t}${n}`).toString()}function ve(e){let t=new URL(e);return t.protocol=t.protocol==="wss:"?"https:":"http:",t.pathname="/health",t.search="",t.toString()}function mt(e){let t=new URL(ve(e));return t.pathname="/status",t.toString()}import{CLINE_HUB_DEV_PORT as ht,CLINE_HUB_PORT as gt,resolveClineBuildEnv as bt}from"@cline/shared";var yt="CLINE_HUB_HOST",wt="CLINE_HUB_PORT",vt="CLINE_HUB_PATHNAME",St="127.0.0.1",kt=gt,Ct="/hub";function Se(e){return bt(e)==="development"?ht:kt}function Ht(e={}){return(e.env??process.env)[yt]?.trim()||St}function Pt(e={}){let n=(e.env??process.env)[wt]?.trim();if(!n)return Se(e);let o=Number.parseInt(n,10);if(!Number.isInteger(o)||o<1||o>65535)return Se(e);return o}function _t(e={}){return(e.env??process.env)[vt]?.trim()||Ct}function ke(e={},t={}){return{host:e.host??Ht(t),port:e.port??Pt(t),pathname:e.pathname??_t(t)}}import{join as Et}from"node:path";import{execFile as Rt}from"node:child_process";import{promisify as Tt}from"node:util";import{processWorkspaceInfo as ao}from"@cline/shared";import uo from"simple-git";var lo=Tt(Rt);var It="shared:cline",xt="CLINE_HUB_DISCOVERY_PATH",Ot="hub-production";function _(e=It){return me(`${e}@${k()}`)}function A(){return{ownerId:Ot,discoveryPath:process.env[xt]?.trim()||Et(P(),"locks","hub","production.json")}}var Ce=15000,Kt=200,He=3000,zt=100,Jt=[100,250,500,1000,2000],Yt="--cline-hub-daemon",Xt=3,Zt=60000,Pe=new Map;function Qt(e,t=Date.now()){let n=Pe.get(e);if(!n||t-n.windowStartedAt>Zt)return Pe.set(e,{count:1,windowStartedAt:t}),!0;return n.count+=1,n.count<=Xt}function en(e){return[...e.host?["--host",e.host]:[],...typeof e.port==="number"?["--port",String(e.port)]:[],...e.pathname?["--pathname",e.pathname]:[]]}function tn(){try{let e=Vt(P(),"logs","hub-daemon.log");return Lt(Ft(e),{recursive:!0}),{fd:Ut(e,"a"),logPath:e}}catch{return}}function nn(){return Te()==="production"?A():_()}function R(e){return O(e)}function on(e){try{let t=JSON.parse(Mt(`${e}.superseded`,"utf8"));return{url:typeof t.url==="string"?t.url:void 0,authToken:typeof t.authToken==="string"?t.authToken:void 0,pid:typeof t.pid==="number"?t.pid:void 0}}catch{return}}function q(e){try{Nt(`${e}.superseded`)}catch{}}function _e(e,t,n){if(!t||t.url!==n)return e;return{...e,authToken:e.authToken??t.authToken,pid:e.pid??t.pid}}async function T(e,t){try{return await D(e,{authToken:t})}catch{return}}async function Re(e,t){let n=Date.now()+t;while(Date.now()<n){if(!(await T(e))?.url)return!0;await new Promise((r)=>setTimeout(r,zt))}return!1}async function z(e,t){if(!Qt(e.url))return!1;await E(e.url,e.authToken,"retired by newer install").catch(()=>!1),await M(e.url,e.authToken).catch(()=>!1);let n=await Re(e.url,He);if(!n&&e.pid&&rn(e.pid)){try{process.kill(e.pid,"SIGTERM")}catch{}n=await Re(e.url,He)}if(n)await C(t).catch(()=>{return});return n}function rn(e){try{return process.kill(e,0),!0}catch(t){return t?.code==="EPERM"}}async function sn(e){try{return(await J(e.url,e.authToken)).activeSessionCount>0}catch{return!1}}async function K(e,t){if(R(e))return"reusable";let n=await E(e.url,e.authToken,"retired by newer install").catch(()=>!1);if(await sn(e)){if(n)await E(e.url,e.authToken,"hub retirement deferred",{off:!0}).catch(()=>!1);return"deferred_busy"}let o=await z(e,t);if(!o&&n)await E(e.url,e.authToken,"hub retirement failed",{off:!0}).catch(()=>!1);return o?"retired":"failed"}async function an(e){if(Te()!=="production")return;let t=_();if(t.discoveryPath===e.discoveryPath)return;let n=await b(t.discoveryPath);if(n?.url)await z(n,t.discoveryPath);else await C(t.discoveryPath).catch(()=>{return})}function cn(){let e=import.meta.url.endsWith(".ts")?"ts":"js";return Wt(new URL(`./entry.${e}`,import.meta.url))}function un(e,t){if(Gt(e))return[Yt];return[...t&&e.toLowerCase().endsWith(".ts")?["--conditions=development"]:[],e]}function dn(e,t){let n=cn(),o=process.execPath?.trim();if(!o)throw Error("unable to resolve runtime executable for hub daemon");let r=Bt(o).toLowerCase().includes("bun"),i=un(n,r);return{launcher:o,args:[...i,"--cwd",e,...en(t),...t.manageConnectors===!1?["--no-connectors"]:[]],cwd:e,env:{...qt(process.env),CLINE_NO_INTERACTIVE:"1",[$t]:"1"}}}function ln(e){if(!e||typeof e!=="object")return!1;if(("code"in e?e.code:void 0)==="ETXTBSY")return!0;let n="message"in e?e.message:void 0;return typeof n==="string"&&n.includes("ETXTBSY")}function pn(e,t={}){if(jt())return;let n=dn(e,t),o=tn();try{Dt(n.launcher,n.args,{detached:!0,stdio:o?["ignore",o.fd,o.fd]:"ignore",env:n.env,cwd:n.cwd,windowsHide:!0}).unref()}finally{if(o)At(o.fd)}}async function fn(e,t={}){for(let n=0;;n++)try{pn(e,t);return}catch(o){let r=Jt[n];if(!ln(o)||r===void 0)throw o;await new Promise((i)=>setTimeout(i,r))}}async function mn(e,t,n={}){let o=n.host!==void 0||n.port!==void 0||n.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),r=ke(n),i=we(r.host,r.port,r.pathname),a=(l)=>{if(!o)U(l.url,l.authToken);return l};await an(e).catch(()=>{return});let u=await b(e.discoveryPath),c=u?.url?void 0:on(e.discoveryPath),d=!1;if(u?.url){let l=u.authToken;if(!l)d=!0,await z(u,e.discoveryPath);else{let p=await T(u.url,l);if(p?.url&&R(p)&&await y(p.url,{authToken:l}))return q(e.discoveryPath),a({url:p.url,authToken:l});if(p?.url){if(await K({...p,authToken:l},e.discoveryPath)==="deferred_busy"&&await y(p.url,{authToken:l}))return a({url:p.url,authToken:l})}else await C(e.discoveryPath).catch(()=>{return})}}let s=await T(i);if(s?.url){let l=_e(s,u??c,i);if(R(s)){let h=[s.authToken,u?.authToken,c?.authToken].filter((S)=>typeof S==="string"&&S.trim().length>0);for(let S of h){if(!await y(s.url,{authToken:S}))continue;let ze={hubId:s.hubId??`repaired-${s.port}`,protocolVersion:s.protocolVersion,minClientProtocolVersion:s.minClientProtocolVersion,maxClientProtocolVersion:s.maxClientProtocolVersion,capabilities:s.capabilities,coreVersion:s.coreVersion,buildId:s.buildId,authToken:S,host:s.host,port:s.port,url:s.url,pid:s.pid??u?.pid??c?.pid,startedAt:s.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await he(e.discoveryPath,ze)}catch{}return q(e.discoveryPath),a({url:s.url,authToken:S})}throw Error(`A compatible Cline Hub is already running at ${i}, but its discovery record is missing or unreadable and no usable auth token is available. Run 'cline doctor fix' to repair local hub discovery.${d?" This can happen immediately after upgrading from a build that wrote an empty hub auth token; run 'cline doctor fix' to stop the old daemon and repair local hub discovery.":""}`)}let p=await K(l,e.discoveryPath);if(p==="deferred_busy"){for(let h of[l.authToken,u?.authToken].filter((v)=>typeof v==="string"&&v.trim().length>0))if(await y(s.url,{authToken:h}))return a({url:s.url,authToken:h});if(n.allowPortFallback!==!0&&r.port!==0)throw Error(`An older Cline Hub is running at ${i} and is still serving active sessions, so it was not replaced, but no usable auth token is available to attach to it. Finish those sessions, or run 'cline doctor fix' to stop the hub.`)}if(p==="failed"&&n.allowPortFallback!==!0&&r.port!==0)throw Error(`An incompatible Cline Hub is already running at ${i} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}let g=n.allowPortFallback===!0&&r.port!==0?{...r,port:0}:r;await fn(t,{...g,manageConnectors:n.manageConnectors});let w=Date.now()+Ce;while(Date.now()<w){let l=await b(e.discoveryPath);if(l?.url&&l.authToken){let h=await T(l.url,l.authToken);if(h?.url&&R(h)&&await y(h.url,{authToken:l.authToken}))return q(e.discoveryPath),a({url:h.url,authToken:l.authToken})}let p=await T(i);if(p?.url&&!R(p)){let h=_e(p,l??c,i),v=await K(h,e.discoveryPath);if(v==="deferred_busy"&&l?.authToken&&await y(p.url,{authToken:l.authToken}))return a({url:p.url,authToken:l.authToken});if(v==="failed"&&n.allowPortFallback!==!0&&r.port!==0)throw Error(`An incompatible Cline Hub is still running at ${i} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}await new Promise((h)=>setTimeout(h,Kt))}throw Error(`Timed out after ${Ce}ms waiting for detached hub startup.`)}async function L(e,t={}){let n=nn();return await ye(n.discoveryPath,async()=>mn(n,e,t))}function vn(){return bn()==="production"?A():_()}function Sn(){let e=globalThis.WebSocket;if(!e)throw Error("Global WebSocket is not available in this runtime. Node 22+ is required for hub mode.");return e}function Le(e){if(typeof e==="string")return e;if(e instanceof Uint8Array)return Buffer.from(e).toString();if(e instanceof ArrayBuffer)return Buffer.from(e).toString();if(Array.isArray(e))return Buffer.concat(e.map((t)=>Buffer.from(t))).toString();if(e&&typeof e==="object"&&"data"in e&&typeof e.data<"u")return Le(e.data);return String(e)}function kn(e){if(typeof e==="string")return e;if(e instanceof Uint8Array)return Buffer.from(e).toString("utf8");if(e instanceof ArrayBuffer)return Buffer.from(e).toString("utf8");return""}function Ee(e){let t=e,n=kn(t.reason);return new f("hub_connection_closed",t.code||n?`Hub connection closed (code=${t.code??0}${n?`, reason=${n}`:""})`:X,{closeCode:t.code,closeReason:n||void 0})}function Ie(e,t){if(e instanceof f)return e;if(e instanceof Error)return new f("hub_connect_failed",e.message);if(e&&typeof e==="object"&&"error"in e&&e.error instanceof Error)return new f("hub_connect_failed",e.error.message);let n=e&&typeof e==="object"&&"message"in e&&typeof e.message==="string"?e.message.trim():"";if(n)return new f("hub_connect_failed",n);let o=e&&typeof e==="object"&&"type"in e&&typeof e.type==="string"?e.type.trim():"";return new f("hub_connect_failed",o?`Failed to connect to hub at ${t.toString()} (${o} event before socket open).`:`Failed to connect to hub at ${t.toString()}.`)}var Y="*",N=8000,Cn="cline-hub-auth.",Ue=new Map,Me=new Set,Hn=3000;var X="Hub connection closed",Pn=250,_n=5000,xe=0.5;class f extends Error{code;details;constructor(e,t,n){super(t);this.code=e;this.details=n;this.name="HubTransportError"}}function Rn(e){return e instanceof f}class Z extends Error{command;code;constructor(e,t,n){super(n);this.command=e;this.code=t;this.name="HubCommandError"}}function ee(e,t={}){let n=e.searchParams.get("authToken")?.trim();if(e.searchParams.delete("authToken"),n)return n;if(t.skipRegistry)return;let o=te(e.toString());return o?Ue.get(o):void 0}function Tn(e){try{let n=new URL(e).hostname.toLowerCase().replace(/^\[|\]$/g,"");return n==="localhost"||n==="127.0.0.1"||n==="::1"}catch{return!1}}function te(e){if(!Tn(e))return;let t=new URL(Ne(e));return t.search="",t.hash="",t.toString()}function Oe(e){let t=te(e);return!!t&&Me.has(t)}function U(e,t){let n=te(e);if(n){if(Me.add(n),t?.trim())Ue.set(n,t)}return e}class ne{options;socket;connectPromise;clientId;currentUrl;recoveryPromise;pendingReplies=new Map;listeners=new Set;subscriptionCounts=new Map;lastEventSequenceByKey=new Map;reconnectTimer;reconnectAttempt=0;closedByClient=!1;connectGeneration=0;lastCloseError=new f("hub_connection_closed",X);sawSocketClose=!1;registered=!1;capabilities;constructor(e){this.options=e;if(e.authToken?.trim()&&e.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");this.clientId=e.clientId??`core-${Math.random().toString(36).slice(2,10)}-${Date.now().toString(36)}`,this.currentUrl=e.url,this.capabilities=[...e.capabilities??[]]}getClientId(){return this.clientId}getUrl(){return this.currentUrl}isConnected(){return this.socket?.readyState===1&&this.registered}getConnectionError(){return this.isConnected()?null:this.lastCloseError}async updateCapabilities(e){if(this.capabilities=e.map((t)=>({...t})),!this.registered)return;await this.command("client.update",{capabilities:this.capabilities})}async connect(){if(this.connectPromise)return this.connectPromise;if(this.socket&&(this.socket.readyState===1||this.socket.readyState===0))return this.connectPromise??Promise.resolve();this.closedByClient=!1,this.clearReconnectTimer();let e=new URL(this.currentUrl),t=this.options.authToken?.trim()||ee(e,{skipRegistry:Boolean(this.options.resolveConnectionHeaders)});if(e.hash="",t&&this.options.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");let n=++this.connectGeneration,o=this.openSocket(e,t,n),r;this.connectPromise=o.then(async(a)=>{if(r=a,await this.commandOnce("client.register",{clientId:this.clientId,clientType:this.options.clientType??"core",displayName:this.options.displayName??"core",transport:"native",actorKind:"client",capabilities:this.capabilities,metadata:{...this.options.metadata,version:this.options.clientVersion??String(H.version),pid:process.pid},workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}},void 0,void 0,!1),n!==this.connectGeneration||this.closedByClient){try{a.close()}catch{}throw this.lastCloseError}this.registered=!0;for(let u of this.subscriptionCounts.keys())this.sendSubscriptionFrame("stream.subscribe",this.subscriptionSessionIdFromKey(u));this.reconnectAttempt=0});let i=this.connectPromise;try{await i}catch(a){if(this.connectPromise===i)this.connectPromise=void 0;if(r&&this.socket===r){this.lastCloseError=Ie(a,e),this.registered=!1,this.sawSocketClose=!1,this.socket=void 0;try{r.close()}catch{}}if(!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect();throw a}}async openSocket(e,t,n){let o=this.options.resolveConnectionHeaders,r;if(o){let c;try{r=await Promise.race([Promise.resolve().then(()=>o()),new Promise((d,s)=>{c=setTimeout(()=>{s(new f("hub_connect_timeout",`Timed out resolving hub connection headers after ${N}ms`))},N)})])}catch(d){let s=d instanceof f?d:new f("hub_connect_failed",d instanceof Error?d.message:String(d));if(n===this.connectGeneration)this.lastCloseError=s;throw s}finally{clearTimeout(c)}}if(n!==this.connectGeneration||this.closedByClient)throw this.lastCloseError;if(r&&Object.keys(r).some((c)=>c.toLowerCase()==="sec-websocket-protocol")){let c=new f("hub_connect_failed","Hub connection headers cannot set Sec-WebSocket-Protocol.");if(n===this.connectGeneration)this.lastCloseError=c;throw c}let i=r?new wn(e.toString(),{headers:{...r}}):new(Sn())(e.toString(),t?[`${Cn}${t}`]:void 0);this.socket=i;let a=!1,u=new Promise((c,d)=>{let s=!1,m=setTimeout(()=>{if(s)return;s=!0,a=!0;let g=new f("hub_connect_timeout",`Timed out connecting to hub after ${N}ms`);if(this.socket===i)this.lastCloseError=g,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;try{i.close()}catch{}d(g)},N);i.addEventListener("open",()=>{if(s)return;s=!0,clearTimeout(m),c()}),i.addEventListener("error",(g)=>{if(s)return;s=!0,clearTimeout(m);let w=Ie(g,e);if(this.socket===i)this.lastCloseError=w,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;d(w)}),i.addEventListener("close",(g)=>{if(s)return;s=!0,clearTimeout(m);let w=a?this.lastCloseError:Ee(g);if(this.socket===i){if(!a)this.lastCloseError=w,this.sawSocketClose=!0;this.connectPromise=void 0,this.socket=void 0}d(w)})});return i.addEventListener("message",(c)=>{this.handleFrame(JSON.parse(Le(c)))}),i.addEventListener("close",(c)=>{if(this.socket!==i)return;if(!a)this.lastCloseError=Ee(c),this.sawSocketClose=!0;this.registered=!1;for(let d of this.pendingReplies.values())d.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,this.socket=void 0,!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect()}),await u,i}subscribe(e,t){let n=t?.sessionId?.trim()||void 0,o={listener:e,sessionId:n};return this.listeners.add(o),this.adjustSubscriptionCount(n,1),()=>{if(!this.listeners.delete(o))return;this.adjustSubscriptionCount(n,-1)}}async command(e,t,n,o){let r=0,i=e!=="client.register"&&e!=="client.unregister";while(!0)try{return await this.commandOnce(e,t,n,o)}catch(a){if(!i||r>=1||!await this.recoverLocalHubTransport(a))throw a;r+=1}}async commandOnce(e,t,n,o,r=!0){if(r)await this.connect();o?.beforeDispatch?.();let i=hn("hubreq_");o?.onDispatch?.(i);let a=yn(e,o?.timeoutMs),u=new Promise((d,s)=>{let m=a===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(i))return;s(new Z(e,"hub_command_timeout",`Hub command ${e} timed out after ${a}ms (hub=${this.currentUrl}, requestId=${i}, clientId=${this.clientId}). Check hub-daemon.log for matching command.start/command.slow entries, or run 'cline doctor fix' to restart the hub.`))},a);this.pendingReplies.set(i,{resolve:(g)=>{if(m)clearTimeout(m);d(g)},reject:(g)=>{if(m)clearTimeout(m);s(g)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:e,requestId:i,clientId:this.clientId,sessionId:n,timeoutMs:a,payload:t}})}catch(d){throw this.pendingReplies.delete(i),d}let c=await u;if(!c.ok){if(c.error?.code===re){let d=n??(typeof t?.sessionId==="string"?t.sessionId:void 0);throw new F(d,c.error.message)}throw new Z(e,c.error?.code,c.error?.message??`Hub command ${e} failed`)}return c}async recoverLocalHubTransport(e){if(!Oe(this.currentUrl)||!Rn(e))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let t=await De({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}).catch(()=>{return});if(!t)return!1;return this.currentUrl=t,this.close(),!0})().finally(()=>{this.recoveryPromise=void 0}),await this.recoveryPromise}hasActiveSubscriptions(){return this.subscriptionCounts.size>0}clearReconnectTimer(){if(!this.reconnectTimer)return;clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0}scheduleReconnect(){if(this.reconnectTimer||this.closedByClient||!this.hasActiveSubscriptions())return;let e=Math.min(Pn*2**this.reconnectAttempt,_n),t=Math.round(e*(1-xe)+Math.random()*e*xe);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.reconnectSubscribedTransport()},t)}async reconnectSubscribedTransport(){if(this.closedByClient||!this.hasActiveSubscriptions())return;try{await this.connect(),this.reconnectAttempt=0}catch{if(!Oe(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let e=await De({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd});if(e){this.currentUrl=e,await this.connect(),this.reconnectAttempt=0;return}}catch{}this.reconnectAttempt+=1,this.scheduleReconnect()}}close(){let e=this.socket;if(this.closedByClient=!0,this.connectGeneration+=1,this.clearReconnectTimer(),this.registered=!1,e)this.lastCloseError=new f("hub_connection_closed",X);for(let t of this.pendingReplies.values())t.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,!e)return;this.sawSocketClose=!1,this.socket=void 0;try{e.close()}catch{}}async dispose(){if(this.socket?.readyState===1&&this.registered)try{await this.command("client.unregister",void 0,void 0,{timeoutMs:2000})}catch{}this.close()}sendFrame(e){if(!this.socket||this.socket.readyState!==1){if(this.lastCloseError.code==="hub_connection_closed"&&!this.sawSocketClose)throw new f("hub_connection_not_open","Hub connection is not open.");throw this.lastCloseError}this.socket.send(JSON.stringify(e))}sendSubscriptionFrame(e,t){let n=e==="stream.subscribe"?this.lastEventSequenceByKey.get(this.subscriptionKeyForSessionId(t)):void 0;this.sendFrame({kind:e,clientId:this.clientId,...t?{sessionId:t}:{},...n!==void 0?{sinceSequence:n}:{}})}adjustSubscriptionCount(e,t){let n=this.subscriptionKeyForSessionId(e),o=(this.subscriptionCounts.get(n)??0)+t;if(o<=0){if(this.subscriptionCounts.delete(n),!this.hasActiveSubscriptions())this.clearReconnectTimer();if(t<0&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.unsubscribe",e);return}if(this.subscriptionCounts.set(n,o),t>0&&o===1&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.subscribe",e)}subscriptionKeyForSessionId(e){return e??Y}subscriptionSessionIdFromKey(e){return e===Y?void 0:e}handleFrame(e){switch(e.kind){case"reply":{let t=e.envelope.requestId;if(!t)return;let n=this.pendingReplies.get(t);if(!n)return;this.pendingReplies.delete(t),n.resolve(e.envelope);return}case"event":{let t=e.envelope.sequence;if(typeof t==="number"){let n=e.envelope.sessionId?.trim();for(let o of[Y,n]){if(!o||!this.subscriptionCounts.has(o))continue;let r=this.lastEventSequenceByKey.get(o)??0;if(t>r)this.lastEventSequenceByKey.set(o,t)}}for(let n of this.listeners){if(n.sessionId&&n.sessionId!==e.envelope.sessionId?.trim())continue;n.listener(e.envelope)}return}case"command":case"stream.subscribe":case"stream.unsubscribe":return}}}function Ne(e){let t=new URL(e);if(t.protocol==="http:")t.protocol="ws:";else if(t.protocol==="https:")t.protocol="wss:";return t.toString()}async function y(e,t){let n=new ne({url:e,authToken:t?.authToken,clientType:"hub-healthcheck",displayName:"hub healthcheck",workspaceRoot:t?.workspaceRoot,cwd:t?.cwd});try{return await n.connect(),!0}catch{return!1}finally{n.close()}}async function Q(e,t){let n=Ne(e),o=await D(n,{authToken:t?.authToken});if(!o)return{status:"unreachable",url:n};if(t?.requireCurrentBuild){let r=k(),i=x(o,r);if(!i.compatible&&!O(o))return{status:i.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:n}}else if(!gn(o).compatible)return{status:"protocol_mismatch",url:n};if(t?.verifyConnection===!0&&!await y(n,{workspaceRoot:t.workspaceRoot,cwd:t.cwd,authToken:t.authToken}))return{status:"unreachable",url:n};return{status:"compatible",url:n}}function En(e){let t=e&&typeof e==="object"&&Array.isArray(e.sessions)?e.sessions:[],n=0,o=new Set;for(let r of t){if(!r||typeof r!=="object")continue;let i=r.participants;if(!Array.isArray(i)||i.length===0)continue;n+=1;for(let a of i){let u=a&&typeof a==="object"?a.clientId:void 0;if(typeof u==="string"&&u.trim())o.add(u)}}return{activeSessionCount:n,participantClientCount:o.size}}async function J(e,t,n){let o=new ne({url:e,authToken:t,clientType:"hub-recovery-check",displayName:"hub recovery check",workspaceRoot:n?.workspaceRoot,cwd:n?.cwd});try{let r=await o.command("session.list",{limit:500},void 0,{timeoutMs:Hn});return En(r.payload)}finally{await o.dispose().catch(()=>{return})}}async function In(e,t,n){try{return(await J(e,t,n)).activeSessionCount===0}catch{return!1}}async function xn(e,t){let n=`${e.discoveryPath}.superseded`,o=await b(n);if(!o?.url||!o.authToken)return;let r=await Q(o.url,{authToken:o.authToken});if(r.status!=="compatible")return;if(await In(r.url,o.authToken,t))return;return U(r.url,o.authToken)}async function On(e={}){if(e.endpoint?.trim()){let r=await Q(e.endpoint);return r.status==="compatible"?r.url:void 0}let t=vn(),n=await b(t.discoveryPath);if(!n?.url)return await xn(t,e);let o=await Q(n.url,{authToken:n.authToken,requireCurrentBuild:!0});if(o.status==="compatible")return U(o.url,n.authToken);if(o.status==="protocol_mismatch")await C(t.discoveryPath).catch(()=>{return});return}async function De(e={}){let t=await On(e);if(t&&await y(t,{workspaceRoot:e.workspaceRoot,cwd:e.cwd}))return t;if(e.endpoint?.trim())return;try{return(await L(e.workspaceRoot??process.cwd())).url}catch(n){e.onStartupError?.(n);return}}async function E(e,t,n,o){Ae();let r=new URL(e),i=t?.trim()||ee(r);if(r.protocol==="ws:")r.protocol="http:";else if(r.protocol==="wss:")r.protocol="https:";if(r.pathname="/drain",r.hash="",n)r.searchParams.set("reason",n);if(o?.off)r.searchParams.set("off","1");return(await fetch(r,{method:"POST",headers:i?{authorization:`Bearer ${i}`}:void 0})).ok}async function M(e,t){Ae();let n=new URL(e),o=t?.trim()||ee(n);if(n.protocol==="ws:")n.protocol="http:";else if(n.protocol==="wss:")n.protocol="https:";return n.pathname="/shutdown",n.hash="",(await fetch(n,{method:"POST",headers:o?{authorization:`Bearer ${o}`}:void 0})).ok}import{spawn as Dn}from"node:child_process";import{userInfo as An}from"node:os";import{basename as Ln,delimiter as B}from"node:path";var oe="__CLINE_SIDECAR_PATH_START__",Fe="__CLINE_SIDECAR_PATH_END__",Ve=5000,Un=`/bin/sh -c 'printf "%s%s%s" "${oe}" "$PATH" "${Fe}"'`,Be="CLINE_SIDECAR_SKIP_SHELL_PATH";function We(e){return e==="darwin"?"/bin/zsh":"/bin/bash"}function Mn(e,t){try{let n=An().shell?.trim();if(n)return n}catch{}return t.SHELL?.trim()||We(e)}function Nn(e,t){let n=Ln(e);if(n==="csh"||n==="tcsh")return{args:["-c",t],argv0:`-${n}`};return{args:["-i","-l","-c",t]}}function Bn(e){let t=e.indexOf(oe);if(t===-1)return;let n=e.indexOf(Fe,t);if(n===-1)return;let o=e.slice(t+oe.length,n).trim();return o.length>0?o:void 0}function Fn(e,t){let n=[...e.split(B),...t.split(B)].map((o)=>o.trim()).filter((o)=>o.length>0);return Array.from(new Set(n)).join(B)}function Vn(e,t=Ve){return new Promise((n)=>{let o=Nn(e,Un),r=Dn(e,o.args,{argv0:o.argv0,stdio:["ignore","pipe","ignore"],detached:!0}),i="",a=0,u=()=>{try{if(r.pid)process.kill(-r.pid,"SIGKILL")}catch{r.kill("SIGKILL")}},c=!1,d=(m)=>{if(c)return;c=!0,clearTimeout(s),r.stdout?.destroy(),u(),n(m)},s=setTimeout(()=>{try{if(r.pid)process.kill(-r.pid,"SIGKILL")}catch{r.kill("SIGKILL")}d(void 0)},t);r.stdout?.on("data",(m)=>{if(c)return;if(a+=m.length,a>65536){d(void 0);return}i+=m.toString("utf8")}),r.on("error",()=>d(void 0)),r.on("close",()=>d(Bn(i)))})}async function $e(e){let t=e?.platform??process.platform,n=e?.env??process.env;if(t==="win32")return{status:"skipped",reason:"windows"};if(n[Be]?.trim())return{status:"skipped",reason:Be};let o=e?.userShell??Mn(t,n),r=e?.fallbackShell??We(t),i=e?.timeoutMs??Ve,a=o===r?[[o,i]]:[[o,i],[r,i/2]];for(let[u,c]of a){let d=await Vn(u,c);if(!d)continue;let s=Fn(d,n.PATH??"");return n.PATH=s,{status:"applied",pathEntries:s.split(B).length,shell:u}}return{status:"failed",shell:o}}var Ge={readHubDiscovery:b,clearHubDiscoveryIfOwned:ge,probeProcess:(e)=>{process.kill(e,0)},requestHubShutdown:M,ensureDetachedHubServer:L,claimHubDaemonProcess:$n,loadHubDaemon:()=>import("@cline/core/hub/daemon-entry"),ensureLoginShellPath:$e,setHomeDirIfUnset:Gn,homeDir:Wn,cwd:()=>process.cwd(),env:process.env,writeOutput:(e)=>process.stdout.write(e)};function je(e,t){let n=e.indexOf(t);return(n>=0?e[n+1]:void 0)?.trim()||void 0}function qe(e,t){let n=je(e,"--discovery-path");if(!n)throw Error("--discovery-path is required for remote Hub management");return t.env.CLINE_HUB_DISCOVERY_PATH=n,n}async function jn(e=process.argv,t=Ge){t.setHomeDirIfUnset(t.homeDir()),await t.ensureLoginShellPath();let n=je(e,"--cwd")??t.cwd();qe(e,t);let o=await t.ensureDetachedHubServer(n,{host:"127.0.0.1",port:0,pathname:"/hub",allowPortFallback:!0,manageConnectors:!1});t.writeOutput(`${JSON.stringify({...o,cwd:n,platform:process.platform,arch:process.arch})}
|
|
4
4
|
`)}async function Ke(e=process.argv,t=Ge){if(e.includes("--remote-hub-stop")){let n=qe(e,t),o=await t.readHubDiscovery(n);if(o&&typeof o.pid==="number"&&Number.isInteger(o.pid)&&o.pid>0)try{t.probeProcess(o.pid)}catch(r){if(r?.code==="ESRCH")return await t.clearHubDiscoveryIfOwned(n,o.hubId),!0}if(o&&!await t.requestHubShutdown(o.url,o.authToken))throw Error("Remote Hub shutdown failed");return!0}if(e.includes("--remote-hub-ensure"))return await jn(e,t),!0;if(t.claimHubDaemonProcess())return await t.loadHubDaemon(),!0;return!1}(async()=>{if(!await Ke())throw Error("A remote helper command is required")})().catch((e)=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{homedir as Vn}from"node:os";import{claimHubDaemonProcess as Wn}from"@cline/shared";import{setHomeDirIfUnset as $n}from"@cline/shared/storage";import{createSessionId as mn,ensureLoopbackProxyBypass as Ae,isHubProtocolCompatible as hn,resolveClineBuildEnv as bn,resolveHubCommandTimeoutMs as gn}from"@cline/shared";import yn from"ws";var H={name:"@cline/core",description:"Cline Core SDK for Node Runtime",version:"0.0.
|
|
1
|
+
import{homedir as Vn}from"node:os";import{claimHubDaemonProcess as Wn}from"@cline/shared";import{setHomeDirIfUnset as $n}from"@cline/shared/storage";import{createSessionId as mn,ensureLoopbackProxyBypass as Ae,isHubProtocolCompatible as hn,resolveClineBuildEnv as bn,resolveHubCommandTimeoutMs as gn}from"@cline/shared";import yn from"ws";var H={name:"@cline/core",description:"Cline Core SDK for Node Runtime",version:"0.0.89",repository:{type:"git",url:"https://github.com/cline/cline",directory:"sdk/packages/core"},type:"module",types:"./dist/index.d.ts",main:"./dist/index.js",private:!1,publishConfig:{access:"public"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./hub":{types:"./dist/hub/index.d.ts",import:"./dist/hub/index.js"},"./hub/daemon-entry":{types:"./dist/hub/daemon/entry.d.ts",import:"./dist/hub/daemon/entry.js"},"./telemetry":{types:"./dist/services/telemetry/index.d.ts",import:"./dist/services/telemetry/index.js"},"./services/feature-flags/posthog":{types:"./dist/services/feature-flags/posthog.d.ts",import:"./dist/services/feature-flags/posthog.js"},"./remote/helper-entry":{types:"./dist/remote/remote-helper-entry.d.ts",import:"./dist/remote/remote-helper-entry.js"},"./cloud":{types:"./dist/cloud/index.d.ts",import:"./dist/cloud/index.js"},"./remote/helper":{types:"./dist/remote/remote-helper.d.ts",import:"./dist/remote/remote-helper.js"}},scripts:{build:"bun run ./bun.mts && bun tsc -p tsconfig.build.json && bun run ./scripts/verify-runtime-build-id.ts",typecheck:"bun tsc -p tsconfig.dev.json --noEmit && bun run typecheck:smoke","typecheck:smoke":"bun tsc -p tsconfig.smoke.json --noEmit",test:"bun run test:unit && bun run test:e2e","test:live":"vitest run --config vitest.config.ts src/extensions/context/compaction.live.test.ts","test:compaction":"bun --conditions=development run scripts/compact-session.ts","test:unit":"vitest run --config vitest.config.ts","test:e2e":"vitest run --config vitest.e2e.config.ts","verify:routines":"zsh -lc 'bunx vitest run src/cron/schedule-service.test.ts --config vitest.config.ts'","test:watch":"vitest --config vitest.config.ts"},dependencies:{"@cline/agents":"workspace:*","@cline/shared":"workspace:*","@cline/llms":"workspace:*","@modelcontextprotocol/sdk":"^1.29.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.214.0","@opentelemetry/exporter-logs-otlp-http":"^0.214.0","@opentelemetry/exporter-metrics-otlp-http":"^0.214.0","@opentelemetry/exporter-trace-otlp-http":"^0.214.0","@opentelemetry/resources":"^2.6.1","@opentelemetry/sdk-logs":"^0.214.0","@opentelemetry/sdk-metrics":"^2.6.1","@opentelemetry/sdk-trace-base":"^2.6.1","@opentelemetry/sdk-trace-node":"^2.6.1","@opentelemetry/semantic-conventions":"^1.40.0",jiti:"^2.7.0","node-machine-id":"^1.1.12",nanoid:"^5.1.7","simple-git":"3.36.0",ws:"^8.20.0",yaml:"^2.8.2",zod:"^4.3.6"},peerDependencies:{"posthog-node":"^5.8.0"},peerDependenciesMeta:{"posthog-node":{optional:!0}},devDependencies:{"@types/ws":"^8.18.1","posthog-node":"^5.8.0"},engines:{node:">=22"},files:["dist","!dist/**/*.d.ts.map"]};var re="session_not_found";class F extends Error{sessionId;code="session_not_found";constructor(e,t){super(t??(e?`session not found: ${e}`:"session not found"));this.sessionId=e;this.name="SessionNotFoundError"}}import{spawn as Ot}from"node:child_process";import{closeSync as Dt,mkdirSync as At,openSync as Lt,readFileSync as Ut,unlinkSync as Mt}from"node:fs";import{basename as Nt,dirname as Bt,join as Ft}from"node:path";import{fileURLToPath as Vt}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as Wt,isBunEmbeddedModulePath as $t,isHubDaemonProcess as Gt,resolveClineBuildEnv as Te,withResolvedClineBuildEnv as jt}from"@cline/shared";import{createHash as Je,randomBytes as Ye}from"node:crypto";import{mkdir as W,open as ie,readFile as de,rename as Xe,rm as I,writeFile as Ze}from"node:fs/promises";import{dirname as le,join as G}from"node:path";import{ensureLoopbackProxyBypass as Qe,isHubProtocolCompatible as et}from"@cline/shared";import{resolveClineDataDir as P,resolveClineDir as Zn}from"@cline/shared/storage";var tt="CLINE_HUB_DISCOVERY_PATH",nt="CLINE_HUB_BUILD_ID",ot="CLINE_HUB_BUILD_EPOCH_MS",rt=30000,it=15000,se=100;function st(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function at(e){return Je("sha256").update(e).digest("hex").slice(0,12)}function ct(e){if(!Number.isInteger(e)||!e||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return t instanceof Error&&"code"in t?String(t.code)==="EPERM":!1}}function ae(e){return new Promise((t)=>setTimeout(t,e))}function ut(e){return`${e}.lock`}async function dt(e){try{let t=JSON.parse(await de(G(e,"owner.json"),"utf8"));if(typeof t.pid!=="number"||typeof t.acquiredAt!=="string")return;return{pid:t.pid,acquiredAt:t.acquiredAt}}catch{return}}async function V(e){await I(e,{recursive:!0,force:!0}).catch(()=>{return})}function k(){let e=process.env[nt]?.trim();if(e)return e;return"sdk-v1-320526e16fc49dc154a7a13f617d0519faa9a32e6ef1a78b3e596c061889b15d".trim()||`source-${String(H.version)}`}function lt(){let e=Number(process.env[ot]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1790811192802)?1790811192802:void 0}function x(e,t=k()){let n=et(e);if(!n.compatible)return n;let o=e.buildId?.trim();if(!o)return{compatible:!1,reason:"missing_build"};if(o!==t)return{compatible:!1,reason:"build_mismatch"};return{compatible:!0}}function ce(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0}function ue(e){let t=e?.trim().split(/[-+]/,1)[0];if(!t)return;let n=t.split(".").map((o)=>Number(o));if(n.length===0||n.some((o)=>!Number.isInteger(o)||o<0))return;return n}function pt(e,t){for(let n=0;n<Math.max(e.length,t.length);n++){let o=e[n]??0,r=t[n]??0;if(o!==r)return o<r?-1:1}return 0}function pe(e,t){let n=e.buildId?.trim(),o=t.buildId?.trim();if(n&&o&&n===o)return 0;let r=ce(e.buildEpochMs),i=ce(t.buildEpochMs);if(r!==void 0&&i!==void 0&&r!==i)return r<i?-1:1;let a=ue(e.coreVersion),u=ue(t.coreVersion);if(a&&u){let c=pt(a,u);if(c!==0)return c}if(n&&o&&n!==o)return n<o?-1:1;return 0}function fe(){return{buildId:k(),buildEpochMs:lt(),coreVersion:String(H.version)}}function O(e,t){let n=t?.self??fe(),o=x(e,n.buildId??"");if(o.compatible)return!0;if(o.reason!=="build_mismatch"&&o.reason!=="missing_build")return!1;return pe(n,e)<=0}function me(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${at(e)}`,n=process.env[tt]?.trim()||G(P(),"locks","hub","owners",`${st(t)}.json`);return{ownerId:t,discoveryPath:n}}async function g(e){try{let t=JSON.parse(await de(e,"utf8"));if(typeof t.hubId!=="string"||typeof t.protocolVersion!=="string"||typeof t.authToken!=="string"||typeof t.host!=="string"||typeof t.port!=="number"||typeof t.url!=="string"||typeof t.startedAt!=="string"||typeof t.updatedAt!=="string")return;return{hubId:t.hubId,protocolVersion:t.protocolVersion,minClientProtocolVersion:typeof t.minClientProtocolVersion==="string"?t.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof t.maxClientProtocolVersion==="string"?t.maxClientProtocolVersion:void 0,capabilities:Array.isArray(t.capabilities)?t.capabilities.filter((n)=>typeof n==="string"):void 0,coreVersion:typeof t.coreVersion==="string"?t.coreVersion:void 0,buildId:typeof t.buildId==="string"?t.buildId:void 0,buildEpochMs:typeof t.buildEpochMs==="number"?t.buildEpochMs:void 0,authToken:t.authToken,host:t.host,port:t.port,url:t.url,pid:typeof t.pid==="number"?t.pid:void 0,startedAt:t.startedAt,updatedAt:t.updatedAt}}catch{return}}async function he(e,t){await j(e,async()=>{let n=le(e);await W(n,{recursive:!0});let o=`${e}.${process.pid}.${Ye(6).toString("hex")}.tmp`,r;try{r=await ie(o,"wx",384),await r.writeFile(`${JSON.stringify(t,null,2)}
|
|
2
2
|
`,{encoding:"utf8"}),await r.sync(),await r.close(),r=void 0,await Xe(o,e);let i;try{i=await ie(n,"r"),await i.sync()}catch{}finally{await i?.close().catch(()=>{return})}}catch(i){throw await r?.close().catch(()=>{return}),await I(o,{force:!0}).catch(()=>{return}),i}})}async function C(e){await j(e,async()=>{await I(e,{force:!0}).catch(()=>{return})})}async function be(e,t){return await j(e,async()=>{if((await g(e))?.hubId!==t)return!1;return await I(e,{force:!0}),!0})}async function ge(e,t,n){let o=ut(e);await W(le(o),{recursive:!0});let r=Date.now()+it;while(!0){try{await W(o,{recursive:!1})}catch(i){if((i instanceof Error&&"code"in i?String(i.code):"")!=="EEXIST")throw i;let u=await dt(o);if(!u){if(Date.now()>=r){await V(o);continue}await ae(se);continue}let c=Date.now()-Date.parse(u.acquiredAt);if(!ct(u.pid)||c>rt){await V(o);continue}if(Date.now()>=r)throw Error(`Timed out waiting for hub ${t} lock ${o}`);await ae(se);continue}try{return await Ze(G(o,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
|
|
3
3
|
`,"utf8"),await n()}finally{await V(o)}}}function j(e,t){return ge(`${e}.mutation`,"discovery mutation",t)}function ye(e,t){return ge(e,"startup",t)}async function D(e,t){Qe();try{let n=await fetch(t?.authToken?ft(e):ve(e),{headers:t?.authToken?{authorization:`Bearer ${t.authToken}`}:void 0,signal:t?.signal});if(!n.ok)return;let o=await n.json();if(typeof o.protocolVersion!=="string"||typeof o.host!=="string"||typeof o.port!=="number"||typeof o.url!=="string")return;return{protocolVersion:o.protocolVersion,minClientProtocolVersion:typeof o.minClientProtocolVersion==="string"?o.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof o.maxClientProtocolVersion==="string"?o.maxClientProtocolVersion:void 0,capabilities:Array.isArray(o.capabilities)?o.capabilities.filter((r)=>typeof r==="string"):void 0,coreVersion:typeof o.coreVersion==="string"?o.coreVersion:void 0,buildId:typeof o.buildId==="string"?o.buildId:void 0,buildEpochMs:typeof o.buildEpochMs==="number"?o.buildEpochMs:void 0,host:o.host,port:o.port,url:o.url,hubId:typeof o.hubId==="string"?o.hubId:void 0,authToken:typeof o.authToken==="string"?o.authToken:void 0,pid:typeof o.pid==="number"?o.pid:void 0,startedAt:typeof o.startedAt==="string"?o.startedAt:void 0,updatedAt:typeof o.updatedAt==="string"?o.updatedAt:void 0}}catch{return}}function we(e,t,n="/hub"){return new URL(`ws://${e}:${t}${n}`).toString()}function ve(e){let t=new URL(e);return t.protocol=t.protocol==="wss:"?"https:":"http:",t.pathname="/health",t.search="",t.toString()}function ft(e){let t=new URL(ve(e));return t.pathname="/status",t.toString()}import{CLINE_HUB_DEV_PORT as mt,CLINE_HUB_PORT as ht,resolveClineBuildEnv as bt}from"@cline/shared";var gt="CLINE_HUB_HOST",yt="CLINE_HUB_PORT",wt="CLINE_HUB_PATHNAME",vt="127.0.0.1",St=ht,kt="/hub";function Se(e){return bt(e)==="development"?mt:St}function Ct(e={}){return(e.env??process.env)[gt]?.trim()||vt}function Ht(e={}){let n=(e.env??process.env)[yt]?.trim();if(!n)return Se(e);let o=Number.parseInt(n,10);if(!Number.isInteger(o)||o<1||o>65535)return Se(e);return o}function Pt(e={}){return(e.env??process.env)[wt]?.trim()||kt}function ke(e={},t={}){return{host:e.host??Ct(t),port:e.port??Ht(t),pathname:e.pathname??Pt(t)}}import{join as Tt}from"node:path";import{execFile as _t}from"node:child_process";import{promisify as Rt}from"node:util";import{processWorkspaceInfo as so}from"@cline/shared";import co from"simple-git";var uo=Rt(_t);var Et="shared:cline",It="CLINE_HUB_DISCOVERY_PATH",xt="hub-production";function _(e=Et){return me(`${e}@${k()}`)}function A(){return{ownerId:xt,discoveryPath:process.env[It]?.trim()||Tt(P(),"locks","hub","production.json")}}var Ce=15000,qt=200,He=3000,Kt=100,zt=[100,250,500,1000,2000],Jt="--cline-hub-daemon",Yt=3,Xt=60000,Pe=new Map;function Zt(e,t=Date.now()){let n=Pe.get(e);if(!n||t-n.windowStartedAt>Xt)return Pe.set(e,{count:1,windowStartedAt:t}),!0;return n.count+=1,n.count<=Yt}function Qt(e){return[...e.host?["--host",e.host]:[],...typeof e.port==="number"?["--port",String(e.port)]:[],...e.pathname?["--pathname",e.pathname]:[]]}function en(){try{let e=Ft(P(),"logs","hub-daemon.log");return At(Bt(e),{recursive:!0}),{fd:Lt(e,"a"),logPath:e}}catch{return}}function tn(){return Te()==="production"?A():_()}function R(e){return O(e)}function nn(e){try{let t=JSON.parse(Ut(`${e}.superseded`,"utf8"));return{url:typeof t.url==="string"?t.url:void 0,authToken:typeof t.authToken==="string"?t.authToken:void 0,pid:typeof t.pid==="number"?t.pid:void 0}}catch{return}}function q(e){try{Mt(`${e}.superseded`)}catch{}}function _e(e,t,n){if(!t||t.url!==n)return e;return{...e,authToken:e.authToken??t.authToken,pid:e.pid??t.pid}}async function T(e,t){try{return await D(e,{authToken:t})}catch{return}}async function Re(e,t){let n=Date.now()+t;while(Date.now()<n){if(!(await T(e))?.url)return!0;await new Promise((r)=>setTimeout(r,Kt))}return!1}async function z(e,t){if(!Zt(e.url))return!1;await E(e.url,e.authToken,"retired by newer install").catch(()=>!1),await M(e.url,e.authToken).catch(()=>!1);let n=await Re(e.url,He);if(!n&&e.pid&&on(e.pid)){try{process.kill(e.pid,"SIGTERM")}catch{}n=await Re(e.url,He)}if(n)await C(t).catch(()=>{return});return n}function on(e){try{return process.kill(e,0),!0}catch(t){return t?.code==="EPERM"}}async function rn(e){try{return(await J(e.url,e.authToken)).activeSessionCount>0}catch{return!1}}async function K(e,t){if(R(e))return"reusable";let n=await E(e.url,e.authToken,"retired by newer install").catch(()=>!1);if(await rn(e)){if(n)await E(e.url,e.authToken,"hub retirement deferred",{off:!0}).catch(()=>!1);return"deferred_busy"}let o=await z(e,t);if(!o&&n)await E(e.url,e.authToken,"hub retirement failed",{off:!0}).catch(()=>!1);return o?"retired":"failed"}async function sn(e){if(Te()!=="production")return;let t=_();if(t.discoveryPath===e.discoveryPath)return;let n=await g(t.discoveryPath);if(n?.url)await z(n,t.discoveryPath);else await C(t.discoveryPath).catch(()=>{return})}function an(){let e=import.meta.url.endsWith(".ts")?"ts":"js";return Vt(new URL(`./entry.${e}`,import.meta.url))}function cn(e,t){if($t(e))return[Jt];return[...t&&e.toLowerCase().endsWith(".ts")?["--conditions=development"]:[],e]}function un(e,t){let n=an(),o=process.execPath?.trim();if(!o)throw Error("unable to resolve runtime executable for hub daemon");let r=Nt(o).toLowerCase().includes("bun"),i=cn(n,r);return{launcher:o,args:[...i,"--cwd",e,...Qt(t),...t.manageConnectors===!1?["--no-connectors"]:[]],cwd:e,env:{...jt(process.env),CLINE_NO_INTERACTIVE:"1",[Wt]:"1"}}}function dn(e){if(!e||typeof e!=="object")return!1;if(("code"in e?e.code:void 0)==="ETXTBSY")return!0;let n="message"in e?e.message:void 0;return typeof n==="string"&&n.includes("ETXTBSY")}function ln(e,t={}){if(Gt())return;let n=un(e,t),o=en();try{Ot(n.launcher,n.args,{detached:!0,stdio:o?["ignore",o.fd,o.fd]:"ignore",env:n.env,cwd:n.cwd,windowsHide:!0}).unref()}finally{if(o)Dt(o.fd)}}async function pn(e,t={}){for(let n=0;;n++)try{ln(e,t);return}catch(o){let r=zt[n];if(!dn(o)||r===void 0)throw o;await new Promise((i)=>setTimeout(i,r))}}async function fn(e,t,n={}){let o=n.host!==void 0||n.port!==void 0||n.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),r=ke(n),i=we(r.host,r.port,r.pathname),a=(l)=>{if(!o)U(l.url,l.authToken);return l};await sn(e).catch(()=>{return});let u=await g(e.discoveryPath),c=u?.url?void 0:nn(e.discoveryPath),d=!1;if(u?.url){let l=u.authToken;if(!l)d=!0,await z(u,e.discoveryPath);else{let p=await T(u.url,l);if(p?.url&&R(p)&&await y(p.url,{authToken:l}))return q(e.discoveryPath),a({url:p.url,authToken:l});if(p?.url){if(await K({...p,authToken:l},e.discoveryPath)==="deferred_busy"&&await y(p.url,{authToken:l}))return a({url:p.url,authToken:l})}else await C(e.discoveryPath).catch(()=>{return})}}let s=await T(i);if(s?.url){let l=_e(s,u??c,i);if(R(s)){let h=[s.authToken,u?.authToken,c?.authToken].filter((S)=>typeof S==="string"&&S.trim().length>0);for(let S of h){if(!await y(s.url,{authToken:S}))continue;let Ke={hubId:s.hubId??`repaired-${s.port}`,protocolVersion:s.protocolVersion,minClientProtocolVersion:s.minClientProtocolVersion,maxClientProtocolVersion:s.maxClientProtocolVersion,capabilities:s.capabilities,coreVersion:s.coreVersion,buildId:s.buildId,authToken:S,host:s.host,port:s.port,url:s.url,pid:s.pid??u?.pid??c?.pid,startedAt:s.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await he(e.discoveryPath,Ke)}catch{}return q(e.discoveryPath),a({url:s.url,authToken:S})}throw Error(`A compatible Cline Hub is already running at ${i}, but its discovery record is missing or unreadable and no usable auth token is available. Run 'cline doctor fix' to repair local hub discovery.${d?" This can happen immediately after upgrading from a build that wrote an empty hub auth token; run 'cline doctor fix' to stop the old daemon and repair local hub discovery.":""}`)}let p=await K(l,e.discoveryPath);if(p==="deferred_busy"){for(let h of[l.authToken,u?.authToken].filter((v)=>typeof v==="string"&&v.trim().length>0))if(await y(s.url,{authToken:h}))return a({url:s.url,authToken:h});if(n.allowPortFallback!==!0&&r.port!==0)throw Error(`An older Cline Hub is running at ${i} and is still serving active sessions, so it was not replaced, but no usable auth token is available to attach to it. Finish those sessions, or run 'cline doctor fix' to stop the hub.`)}if(p==="failed"&&n.allowPortFallback!==!0&&r.port!==0)throw Error(`An incompatible Cline Hub is already running at ${i} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}let b=n.allowPortFallback===!0&&r.port!==0?{...r,port:0}:r;await pn(t,{...b,manageConnectors:n.manageConnectors});let w=Date.now()+Ce;while(Date.now()<w){let l=await g(e.discoveryPath);if(l?.url&&l.authToken){let h=await T(l.url,l.authToken);if(h?.url&&R(h)&&await y(h.url,{authToken:l.authToken}))return q(e.discoveryPath),a({url:h.url,authToken:l.authToken})}let p=await T(i);if(p?.url&&!R(p)){let h=_e(p,l??c,i),v=await K(h,e.discoveryPath);if(v==="deferred_busy"&&l?.authToken&&await y(p.url,{authToken:l.authToken}))return a({url:p.url,authToken:l.authToken});if(v==="failed"&&n.allowPortFallback!==!0&&r.port!==0)throw Error(`An incompatible Cline Hub is still running at ${i} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}await new Promise((h)=>setTimeout(h,qt))}throw Error(`Timed out after ${Ce}ms waiting for detached hub startup.`)}async function L(e,t={}){let n=tn();return await ye(n.discoveryPath,async()=>fn(n,e,t))}function wn(){return bn()==="production"?A():_()}function vn(){let e=globalThis.WebSocket;if(!e)throw Error("Global WebSocket is not available in this runtime. Node 22+ is required for hub mode.");return e}function Le(e){if(typeof e==="string")return e;if(e instanceof Uint8Array)return Buffer.from(e).toString();if(e instanceof ArrayBuffer)return Buffer.from(e).toString();if(Array.isArray(e))return Buffer.concat(e.map((t)=>Buffer.from(t))).toString();if(e&&typeof e==="object"&&"data"in e&&typeof e.data<"u")return Le(e.data);return String(e)}function Sn(e){if(typeof e==="string")return e;if(e instanceof Uint8Array)return Buffer.from(e).toString("utf8");if(e instanceof ArrayBuffer)return Buffer.from(e).toString("utf8");return""}function Ee(e){let t=e,n=Sn(t.reason);return new f("hub_connection_closed",t.code||n?`Hub connection closed (code=${t.code??0}${n?`, reason=${n}`:""})`:X,{closeCode:t.code,closeReason:n||void 0})}function Ie(e,t){if(e instanceof f)return e;if(e instanceof Error)return new f("hub_connect_failed",e.message);if(e&&typeof e==="object"&&"error"in e&&e.error instanceof Error)return new f("hub_connect_failed",e.error.message);let n=e&&typeof e==="object"&&"message"in e&&typeof e.message==="string"?e.message.trim():"";if(n)return new f("hub_connect_failed",n);let o=e&&typeof e==="object"&&"type"in e&&typeof e.type==="string"?e.type.trim():"";return new f("hub_connect_failed",o?`Failed to connect to hub at ${t.toString()} (${o} event before socket open).`:`Failed to connect to hub at ${t.toString()}.`)}var Y="*",N=8000,kn="cline-hub-auth.",Ue=new Map,Me=new Set,Cn=3000;var X="Hub connection closed",Hn=250,Pn=5000,xe=0.5;class f extends Error{code;details;constructor(e,t,n){super(t);this.code=e;this.details=n;this.name="HubTransportError"}}function _n(e){return e instanceof f}class Z extends Error{command;code;constructor(e,t,n){super(n);this.command=e;this.code=t;this.name="HubCommandError"}}function ee(e,t={}){let n=e.searchParams.get("authToken")?.trim();if(e.searchParams.delete("authToken"),n)return n;if(t.skipRegistry)return;let o=te(e.toString());return o?Ue.get(o):void 0}function Rn(e){try{let n=new URL(e).hostname.toLowerCase().replace(/^\[|\]$/g,"");return n==="localhost"||n==="127.0.0.1"||n==="::1"}catch{return!1}}function te(e){if(!Rn(e))return;let t=new URL(Ne(e));return t.search="",t.hash="",t.toString()}function Oe(e){let t=te(e);return!!t&&Me.has(t)}function U(e,t){let n=te(e);if(n){if(Me.add(n),t?.trim())Ue.set(n,t)}return e}class ne{options;socket;connectPromise;clientId;currentUrl;recoveryPromise;pendingReplies=new Map;listeners=new Set;subscriptionCounts=new Map;lastEventSequenceByKey=new Map;reconnectTimer;reconnectAttempt=0;closedByClient=!1;connectGeneration=0;lastCloseError=new f("hub_connection_closed",X);sawSocketClose=!1;registered=!1;capabilities;constructor(e){this.options=e;if(e.authToken?.trim()&&e.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");this.clientId=e.clientId??`core-${Math.random().toString(36).slice(2,10)}-${Date.now().toString(36)}`,this.currentUrl=e.url,this.capabilities=[...e.capabilities??[]]}getClientId(){return this.clientId}getUrl(){return this.currentUrl}isConnected(){return this.socket?.readyState===1&&this.registered}getConnectionError(){return this.isConnected()?null:this.lastCloseError}async updateCapabilities(e){if(this.capabilities=e.map((t)=>({...t})),!this.registered)return;await this.command("client.update",{capabilities:this.capabilities})}async connect(){if(this.connectPromise)return this.connectPromise;if(this.socket&&(this.socket.readyState===1||this.socket.readyState===0))return this.connectPromise??Promise.resolve();this.closedByClient=!1,this.clearReconnectTimer();let e=new URL(this.currentUrl),t=this.options.authToken?.trim()||ee(e,{skipRegistry:Boolean(this.options.resolveConnectionHeaders)});if(e.hash="",t&&this.options.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");let n=++this.connectGeneration,o=this.openSocket(e,t,n),r;this.connectPromise=o.then(async(a)=>{if(r=a,await this.commandOnce("client.register",{clientId:this.clientId,clientType:this.options.clientType??"core",displayName:this.options.displayName??"core",transport:"native",actorKind:"client",capabilities:this.capabilities,metadata:{...this.options.metadata,version:this.options.clientVersion??String(H.version),pid:process.pid},workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}},void 0,void 0,!1),n!==this.connectGeneration||this.closedByClient){try{a.close()}catch{}throw this.lastCloseError}this.registered=!0;for(let u of this.subscriptionCounts.keys())this.sendSubscriptionFrame("stream.subscribe",this.subscriptionSessionIdFromKey(u));this.reconnectAttempt=0});let i=this.connectPromise;try{await i}catch(a){if(this.connectPromise===i)this.connectPromise=void 0;if(r&&this.socket===r){this.lastCloseError=Ie(a,e),this.registered=!1,this.sawSocketClose=!1,this.socket=void 0;try{r.close()}catch{}}if(!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect();throw a}}async openSocket(e,t,n){let o=this.options.resolveConnectionHeaders,r;if(o){let c;try{r=await Promise.race([Promise.resolve().then(()=>o()),new Promise((d,s)=>{c=setTimeout(()=>{s(new f("hub_connect_timeout",`Timed out resolving hub connection headers after ${N}ms`))},N)})])}catch(d){let s=d instanceof f?d:new f("hub_connect_failed",d instanceof Error?d.message:String(d));if(n===this.connectGeneration)this.lastCloseError=s;throw s}finally{clearTimeout(c)}}if(n!==this.connectGeneration||this.closedByClient)throw this.lastCloseError;if(r&&Object.keys(r).some((c)=>c.toLowerCase()==="sec-websocket-protocol")){let c=new f("hub_connect_failed","Hub connection headers cannot set Sec-WebSocket-Protocol.");if(n===this.connectGeneration)this.lastCloseError=c;throw c}let i=r?new yn(e.toString(),{headers:{...r}}):new(vn())(e.toString(),t?[`${kn}${t}`]:void 0);this.socket=i;let a=!1,u=new Promise((c,d)=>{let s=!1,m=setTimeout(()=>{if(s)return;s=!0,a=!0;let b=new f("hub_connect_timeout",`Timed out connecting to hub after ${N}ms`);if(this.socket===i)this.lastCloseError=b,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;try{i.close()}catch{}d(b)},N);i.addEventListener("open",()=>{if(s)return;s=!0,clearTimeout(m),c()}),i.addEventListener("error",(b)=>{if(s)return;s=!0,clearTimeout(m);let w=Ie(b,e);if(this.socket===i)this.lastCloseError=w,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;d(w)}),i.addEventListener("close",(b)=>{if(s)return;s=!0,clearTimeout(m);let w=a?this.lastCloseError:Ee(b);if(this.socket===i){if(!a)this.lastCloseError=w,this.sawSocketClose=!0;this.connectPromise=void 0,this.socket=void 0}d(w)})});return i.addEventListener("message",(c)=>{this.handleFrame(JSON.parse(Le(c)))}),i.addEventListener("close",(c)=>{if(this.socket!==i)return;if(!a)this.lastCloseError=Ee(c),this.sawSocketClose=!0;this.registered=!1;for(let d of this.pendingReplies.values())d.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,this.socket=void 0,!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect()}),await u,i}subscribe(e,t){let n=t?.sessionId?.trim()||void 0,o={listener:e,sessionId:n};return this.listeners.add(o),this.adjustSubscriptionCount(n,1),()=>{if(!this.listeners.delete(o))return;this.adjustSubscriptionCount(n,-1)}}async command(e,t,n,o){let r=0,i=e!=="client.register"&&e!=="client.unregister";while(!0)try{return await this.commandOnce(e,t,n,o)}catch(a){if(!i||r>=1||!await this.recoverLocalHubTransport(a))throw a;r+=1}}async commandOnce(e,t,n,o,r=!0){if(r)await this.connect();o?.beforeDispatch?.();let i=mn("hubreq_");o?.onDispatch?.(i);let a=gn(e,o?.timeoutMs),u=new Promise((d,s)=>{let m=a===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(i))return;s(new Z(e,"hub_command_timeout",`Hub command ${e} timed out after ${a}ms (hub=${this.currentUrl}, requestId=${i}, clientId=${this.clientId}). Check hub-daemon.log for matching command.start/command.slow entries, or run 'cline doctor fix' to restart the hub.`))},a);this.pendingReplies.set(i,{resolve:(b)=>{if(m)clearTimeout(m);d(b)},reject:(b)=>{if(m)clearTimeout(m);s(b)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:e,requestId:i,clientId:this.clientId,sessionId:n,timeoutMs:a,payload:t}})}catch(d){throw this.pendingReplies.delete(i),d}let c=await u;if(!c.ok){if(c.error?.code===re){let d=n??(typeof t?.sessionId==="string"?t.sessionId:void 0);throw new F(d,c.error.message)}throw new Z(e,c.error?.code,c.error?.message??`Hub command ${e} failed`)}return c}async recoverLocalHubTransport(e){if(!Oe(this.currentUrl)||!_n(e))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let t=await De({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}).catch(()=>{return});if(!t)return!1;return this.currentUrl=t,this.close(),!0})().finally(()=>{this.recoveryPromise=void 0}),await this.recoveryPromise}hasActiveSubscriptions(){return this.subscriptionCounts.size>0}clearReconnectTimer(){if(!this.reconnectTimer)return;clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0}scheduleReconnect(){if(this.reconnectTimer||this.closedByClient||!this.hasActiveSubscriptions())return;let e=Math.min(Hn*2**this.reconnectAttempt,Pn),t=Math.round(e*(1-xe)+Math.random()*e*xe);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.reconnectSubscribedTransport()},t)}async reconnectSubscribedTransport(){if(this.closedByClient||!this.hasActiveSubscriptions())return;try{await this.connect(),this.reconnectAttempt=0}catch{if(!Oe(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let e=await De({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd});if(e){this.currentUrl=e,await this.connect(),this.reconnectAttempt=0;return}}catch{}this.reconnectAttempt+=1,this.scheduleReconnect()}}close(){let e=this.socket;if(this.closedByClient=!0,this.connectGeneration+=1,this.clearReconnectTimer(),this.registered=!1,e)this.lastCloseError=new f("hub_connection_closed",X);for(let t of this.pendingReplies.values())t.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,!e)return;this.sawSocketClose=!1,this.socket=void 0;try{e.close()}catch{}}async dispose(){if(this.socket?.readyState===1&&this.registered)try{await this.command("client.unregister",void 0,void 0,{timeoutMs:2000})}catch{}this.close()}sendFrame(e){if(!this.socket||this.socket.readyState!==1){if(this.lastCloseError.code==="hub_connection_closed"&&!this.sawSocketClose)throw new f("hub_connection_not_open","Hub connection is not open.");throw this.lastCloseError}this.socket.send(JSON.stringify(e))}sendSubscriptionFrame(e,t){let n=e==="stream.subscribe"?this.lastEventSequenceByKey.get(this.subscriptionKeyForSessionId(t)):void 0;this.sendFrame({kind:e,clientId:this.clientId,...t?{sessionId:t}:{},...n!==void 0?{sinceSequence:n}:{}})}adjustSubscriptionCount(e,t){let n=this.subscriptionKeyForSessionId(e),o=(this.subscriptionCounts.get(n)??0)+t;if(o<=0){if(this.subscriptionCounts.delete(n),!this.hasActiveSubscriptions())this.clearReconnectTimer();if(t<0&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.unsubscribe",e);return}if(this.subscriptionCounts.set(n,o),t>0&&o===1&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.subscribe",e)}subscriptionKeyForSessionId(e){return e??Y}subscriptionSessionIdFromKey(e){return e===Y?void 0:e}handleFrame(e){switch(e.kind){case"reply":{let t=e.envelope.requestId;if(!t)return;let n=this.pendingReplies.get(t);if(!n)return;this.pendingReplies.delete(t),n.resolve(e.envelope);return}case"event":{let t=e.envelope.sequence;if(typeof t==="number"){let n=e.envelope.sessionId?.trim();for(let o of[Y,n]){if(!o||!this.subscriptionCounts.has(o))continue;let r=this.lastEventSequenceByKey.get(o)??0;if(t>r)this.lastEventSequenceByKey.set(o,t)}}for(let n of this.listeners){if(n.sessionId&&n.sessionId!==e.envelope.sessionId?.trim())continue;n.listener(e.envelope)}return}case"command":case"stream.subscribe":case"stream.unsubscribe":return}}}function Ne(e){let t=new URL(e);if(t.protocol==="http:")t.protocol="ws:";else if(t.protocol==="https:")t.protocol="wss:";return t.toString()}async function y(e,t){let n=new ne({url:e,authToken:t?.authToken,clientType:"hub-healthcheck",displayName:"hub healthcheck",workspaceRoot:t?.workspaceRoot,cwd:t?.cwd});try{return await n.connect(),!0}catch{return!1}finally{n.close()}}async function Q(e,t){let n=Ne(e),o=await D(n,{authToken:t?.authToken});if(!o)return{status:"unreachable",url:n};if(t?.requireCurrentBuild){let r=k(),i=x(o,r);if(!i.compatible&&!O(o))return{status:i.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:n}}else if(!hn(o).compatible)return{status:"protocol_mismatch",url:n};if(t?.verifyConnection===!0&&!await y(n,{workspaceRoot:t.workspaceRoot,cwd:t.cwd,authToken:t.authToken}))return{status:"unreachable",url:n};return{status:"compatible",url:n}}function Tn(e){let t=e&&typeof e==="object"&&Array.isArray(e.sessions)?e.sessions:[],n=0,o=new Set;for(let r of t){if(!r||typeof r!=="object")continue;let i=r.participants;if(!Array.isArray(i)||i.length===0)continue;n+=1;for(let a of i){let u=a&&typeof a==="object"?a.clientId:void 0;if(typeof u==="string"&&u.trim())o.add(u)}}return{activeSessionCount:n,participantClientCount:o.size}}async function J(e,t,n){let o=new ne({url:e,authToken:t,clientType:"hub-recovery-check",displayName:"hub recovery check",workspaceRoot:n?.workspaceRoot,cwd:n?.cwd});try{let r=await o.command("session.list",{limit:500},void 0,{timeoutMs:Cn});return Tn(r.payload)}finally{await o.dispose().catch(()=>{return})}}async function En(e,t,n){try{return(await J(e,t,n)).activeSessionCount===0}catch{return!1}}async function In(e,t){let n=`${e.discoveryPath}.superseded`,o=await g(n);if(!o?.url||!o.authToken)return;let r=await Q(o.url,{authToken:o.authToken});if(r.status!=="compatible")return;if(await En(r.url,o.authToken,t))return;return U(r.url,o.authToken)}async function xn(e={}){if(e.endpoint?.trim()){let r=await Q(e.endpoint);return r.status==="compatible"?r.url:void 0}let t=wn(),n=await g(t.discoveryPath);if(!n?.url)return await In(t,e);let o=await Q(n.url,{authToken:n.authToken,requireCurrentBuild:!0});if(o.status==="compatible")return U(o.url,n.authToken);if(o.status==="protocol_mismatch")await C(t.discoveryPath).catch(()=>{return});return}async function De(e={}){let t=await xn(e);if(t&&await y(t,{workspaceRoot:e.workspaceRoot,cwd:e.cwd}))return t;if(e.endpoint?.trim())return;try{return(await L(e.workspaceRoot??process.cwd())).url}catch(n){e.onStartupError?.(n);return}}async function E(e,t,n,o){Ae();let r=new URL(e),i=t?.trim()||ee(r);if(r.protocol==="ws:")r.protocol="http:";else if(r.protocol==="wss:")r.protocol="https:";if(r.pathname="/drain",r.hash="",n)r.searchParams.set("reason",n);if(o?.off)r.searchParams.set("off","1");return(await fetch(r,{method:"POST",headers:i?{authorization:`Bearer ${i}`}:void 0})).ok}async function M(e,t){Ae();let n=new URL(e),o=t?.trim()||ee(n);if(n.protocol==="ws:")n.protocol="http:";else if(n.protocol==="wss:")n.protocol="https:";return n.pathname="/shutdown",n.hash="",(await fetch(n,{method:"POST",headers:o?{authorization:`Bearer ${o}`}:void 0})).ok}import{spawn as On}from"node:child_process";import{userInfo as Dn}from"node:os";import{basename as An,delimiter as B}from"node:path";var oe="__CLINE_SIDECAR_PATH_START__",Fe="__CLINE_SIDECAR_PATH_END__",Ve=5000,Ln=`/bin/sh -c 'printf "%s%s%s" "${oe}" "$PATH" "${Fe}"'`,Be="CLINE_SIDECAR_SKIP_SHELL_PATH";function We(e){return e==="darwin"?"/bin/zsh":"/bin/bash"}function Un(e,t){try{let n=Dn().shell?.trim();if(n)return n}catch{}return t.SHELL?.trim()||We(e)}function Mn(e,t){let n=An(e);if(n==="csh"||n==="tcsh")return{args:["-c",t],argv0:`-${n}`};return{args:["-i","-l","-c",t]}}function Nn(e){let t=e.indexOf(oe);if(t===-1)return;let n=e.indexOf(Fe,t);if(n===-1)return;let o=e.slice(t+oe.length,n).trim();return o.length>0?o:void 0}function Bn(e,t){let n=[...e.split(B),...t.split(B)].map((o)=>o.trim()).filter((o)=>o.length>0);return Array.from(new Set(n)).join(B)}function Fn(e,t=Ve){return new Promise((n)=>{let o=Mn(e,Ln),r=On(e,o.args,{argv0:o.argv0,stdio:["ignore","pipe","ignore"],detached:!0}),i="",a=0,u=()=>{try{if(r.pid)process.kill(-r.pid,"SIGKILL")}catch{r.kill("SIGKILL")}},c=!1,d=(m)=>{if(c)return;c=!0,clearTimeout(s),r.stdout?.destroy(),u(),n(m)},s=setTimeout(()=>{try{if(r.pid)process.kill(-r.pid,"SIGKILL")}catch{r.kill("SIGKILL")}d(void 0)},t);r.stdout?.on("data",(m)=>{if(c)return;if(a+=m.length,a>65536){d(void 0);return}i+=m.toString("utf8")}),r.on("error",()=>d(void 0)),r.on("close",()=>d(Nn(i)))})}async function $e(e){let t=e?.platform??process.platform,n=e?.env??process.env;if(t==="win32")return{status:"skipped",reason:"windows"};if(n[Be]?.trim())return{status:"skipped",reason:Be};let o=e?.userShell??Un(t,n),r=e?.fallbackShell??We(t),i=e?.timeoutMs??Ve,a=o===r?[[o,i]]:[[o,i],[r,i/2]];for(let[u,c]of a){let d=await Fn(u,c);if(!d)continue;let s=Bn(d,n.PATH??"");return n.PATH=s,{status:"applied",pathEntries:s.split(B).length,shell:u}}return{status:"failed",shell:o}}var Ge={readHubDiscovery:g,clearHubDiscoveryIfOwned:be,probeProcess:(e)=>{process.kill(e,0)},requestHubShutdown:M,ensureDetachedHubServer:L,claimHubDaemonProcess:Wn,loadHubDaemon:()=>import("@cline/core/hub/daemon-entry"),ensureLoginShellPath:$e,setHomeDirIfUnset:$n,homeDir:Vn,cwd:()=>process.cwd(),env:process.env,writeOutput:(e)=>process.stdout.write(e)};function je(e,t){let n=e.indexOf(t);return(n>=0?e[n+1]:void 0)?.trim()||void 0}function qe(e,t){let n=je(e,"--discovery-path");if(!n)throw Error("--discovery-path is required for remote Hub management");return t.env.CLINE_HUB_DISCOVERY_PATH=n,n}async function Gn(e=process.argv,t=Ge){t.setHomeDirIfUnset(t.homeDir()),await t.ensureLoginShellPath();let n=je(e,"--cwd")??t.cwd();qe(e,t);let o=await t.ensureDetachedHubServer(n,{host:"127.0.0.1",port:0,pathname:"/hub",allowPortFallback:!0,manageConnectors:!1});t.writeOutput(`${JSON.stringify({...o,cwd:n,platform:process.platform,arch:process.arch})}
|
|
4
4
|
`)}async function qo(e=process.argv,t=Ge){if(e.includes("--remote-hub-stop")){let n=qe(e,t),o=await t.readHubDiscovery(n);if(o&&typeof o.pid==="number"&&Number.isInteger(o.pid)&&o.pid>0)try{t.probeProcess(o.pid)}catch(r){if(r?.code==="ESRCH")return await t.clearHubDiscoveryIfOwned(n,o.hubId),!0}if(o&&!await t.requestHubShutdown(o.url,o.authToken))throw Error("Remote Hub shutdown failed");return!0}if(e.includes("--remote-hub-ensure"))return await Gn(e,t),!0;if(t.claimHubDaemonProcess())return await t.loadHubDaemon(),!0;return!1}export{qo as runRemoteHelperEntrypoint,Gn as runRemoteHubEnsure};
|
|
@@ -68,6 +68,9 @@ export declare class SessionRuntime {
|
|
|
68
68
|
private readonly logger?;
|
|
69
69
|
readonly telemetry?: ITelemetryService;
|
|
70
70
|
private readonly conversation;
|
|
71
|
+
private readonly toolResultCache;
|
|
72
|
+
private cacheableToolNames;
|
|
73
|
+
private readonly maxCachedResultChars;
|
|
71
74
|
private pendingTerminalError;
|
|
72
75
|
private readonly mistakeTracker;
|
|
73
76
|
private readonly loopTracker;
|
|
@@ -210,6 +210,7 @@ export declare const StoredProviderEntrySchema: z.ZodObject<{
|
|
|
210
210
|
r1: "r1";
|
|
211
211
|
}>>;
|
|
212
212
|
}, z.core.$loose>>>;
|
|
213
|
+
discoveredModelIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
213
214
|
}, z.core.$loose>;
|
|
214
215
|
export type StoredProviderEntry = z.infer<typeof StoredProviderEntrySchema>;
|
|
215
216
|
export declare const StoredModelsFileSchema: z.ZodObject<{
|
|
@@ -318,6 +319,7 @@ export declare const StoredModelsFileSchema: z.ZodObject<{
|
|
|
318
319
|
r1: "r1";
|
|
319
320
|
}>>;
|
|
320
321
|
}, z.core.$loose>>>;
|
|
322
|
+
discoveredModelIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
321
323
|
}, z.core.$loose>>;
|
|
322
324
|
}, z.core.$strip>;
|
|
323
325
|
export type StoredModelsFile = z.infer<typeof StoredModelsFileSchema>;
|
|
@@ -40,19 +40,22 @@ export interface CreateConfiguredStreamingTranscriptionSessionRequest {
|
|
|
40
40
|
abortSignal?: AbortSignal;
|
|
41
41
|
}
|
|
42
42
|
export declare function isDedicatedTranscriptionModel(model: Pick<ProviderModel, "operation" | "inputModalities" | "outputModalities">): boolean;
|
|
43
|
-
export declare function addLocalProvider(manager: ProviderSettingsManager, request: Omit<AddProviderActionRequest, "action">):
|
|
43
|
+
export declare function addLocalProvider(manager: ProviderSettingsManager, request: Omit<AddProviderActionRequest, "action">): ReturnType<typeof addLocalProviderUnlocked>;
|
|
44
|
+
declare function addLocalProviderUnlocked(manager: ProviderSettingsManager, request: Omit<AddProviderActionRequest, "action">): Promise<{
|
|
44
45
|
providerId: string;
|
|
45
46
|
settingsPath: string;
|
|
46
47
|
modelsPath: string;
|
|
47
48
|
modelsCount: number;
|
|
48
49
|
}>;
|
|
49
|
-
export declare function updateLocalProvider(manager: ProviderSettingsManager, request: UpdateLocalProviderRequest):
|
|
50
|
+
export declare function updateLocalProvider(manager: ProviderSettingsManager, request: UpdateLocalProviderRequest): ReturnType<typeof updateLocalProviderUnlocked>;
|
|
51
|
+
declare function updateLocalProviderUnlocked(manager: ProviderSettingsManager, request: UpdateLocalProviderRequest): Promise<{
|
|
50
52
|
providerId: string;
|
|
51
53
|
settingsPath: string;
|
|
52
54
|
modelsPath: string;
|
|
53
55
|
modelsCount: number;
|
|
54
56
|
}>;
|
|
55
|
-
export declare function deleteLocalProvider(manager: ProviderSettingsManager, request: DeleteLocalProviderRequest):
|
|
57
|
+
export declare function deleteLocalProvider(manager: ProviderSettingsManager, request: DeleteLocalProviderRequest): ReturnType<typeof deleteLocalProviderUnlocked>;
|
|
58
|
+
declare function deleteLocalProviderUnlocked(manager: ProviderSettingsManager, request: DeleteLocalProviderRequest): Promise<{
|
|
56
59
|
providerId: string;
|
|
57
60
|
settingsPath: string;
|
|
58
61
|
modelsPath: string;
|
|
@@ -87,12 +90,14 @@ export declare function saveVoiceInputSettings(manager: ProviderSettingsManager,
|
|
|
87
90
|
}>;
|
|
88
91
|
export declare function transcribeConfiguredVoiceInput(manager: ProviderSettingsManager, request: TranscribeConfiguredVoiceInputRequest): Promise<LlmsModels.AudioTranscriptionResult>;
|
|
89
92
|
export declare function createConfiguredStreamingTranscriptionSession(manager: ProviderSettingsManager, request?: CreateConfiguredStreamingTranscriptionSessionRequest): Promise<LlmsModels.StreamingAudioTranscriptionSession>;
|
|
90
|
-
export declare function saveLocalProviderSettings(manager: ProviderSettingsManager, request: Omit<SaveProviderSettingsActionRequest, "action">):
|
|
93
|
+
export declare function saveLocalProviderSettings(manager: ProviderSettingsManager, request: Omit<SaveProviderSettingsActionRequest, "action">): ReturnType<typeof saveLocalProviderSettingsUnlocked>;
|
|
94
|
+
declare function saveLocalProviderSettingsUnlocked(manager: ProviderSettingsManager, request: Omit<SaveProviderSettingsActionRequest, "action">): Promise<{
|
|
91
95
|
providerId: string;
|
|
92
96
|
enabled: boolean;
|
|
93
97
|
settingsPath: string;
|
|
94
|
-
}
|
|
95
|
-
export declare function refreshProviderModelsFromSource(manager: ProviderSettingsManager, providerId: string):
|
|
98
|
+
}>;
|
|
99
|
+
export declare function refreshProviderModelsFromSource(manager: ProviderSettingsManager, providerId: string): ReturnType<typeof refreshProviderModelsFromSourceUnlocked>;
|
|
100
|
+
declare function refreshProviderModelsFromSourceUnlocked(manager: ProviderSettingsManager, providerId: string): Promise<{
|
|
96
101
|
providerId: string;
|
|
97
102
|
refreshed: boolean;
|
|
98
103
|
modelsCount?: number;
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
export declare function extractModelIdsFromPayload(payload: unknown, providerId: string): string[];
|
|
2
|
-
export
|
|
2
|
+
export interface ModelSourceAuth {
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export declare function fetchModelIdsFromSource(url: string, providerId: string, auth?: ModelSourceAuth): Promise<string[]>;
|
|
3
8
|
export declare function resolveModelsSourceUrl(baseUrl: string | undefined, defaultBaseUrl: string | undefined, modelsSourceUrl: string | undefined): string | undefined;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* tool-result truncation and outdated-file-content rewrite for compaction.
|
|
9
9
|
* Per-instance caches make this host state.
|
|
10
10
|
*/
|
|
11
|
-
import { type MediaBudgetOptions, type Message } from "@cline/shared";
|
|
11
|
+
import { type MediaBudgetOptions, type Message, type ToolResultContent } from "@cline/shared";
|
|
12
12
|
export declare const DEFAULT_MAX_TOOL_RESULT_CHARS = 8000;
|
|
13
13
|
export declare const DEFAULT_MAX_FILE_CONTENT_CHARS = 50000;
|
|
14
14
|
export declare const DEFAULT_MAX_TOTAL_TEXT_BYTES = 6000000;
|
|
@@ -21,6 +21,10 @@ export declare const MESSAGE_BUILDER_LIMIT_ENV: {
|
|
|
21
21
|
readonly minOutdatedRewriteBytes: "CLINE_MESSAGE_BUILDER_MIN_OUTDATED_REWRITE_BYTES";
|
|
22
22
|
};
|
|
23
23
|
export interface MessageBuilderOptions {
|
|
24
|
+
/** Synchronous Core-owned recovery lookup; undefined leaves the normal result projection unchanged. */
|
|
25
|
+
getToolResultRecovery?: (result: ToolResultContent) => {
|
|
26
|
+
uri?: string;
|
|
27
|
+
} | undefined;
|
|
24
28
|
maxToolResultChars?: number;
|
|
25
29
|
maxFileContentChars?: number;
|
|
26
30
|
maxTotalTextBytes?: number;
|
|
@@ -34,6 +38,9 @@ export declare function getMessageBuilderOptionsFromEnv(env?: Record<string, str
|
|
|
34
38
|
* Builds an API-safe message copy without mutating original conversation history.
|
|
35
39
|
*/
|
|
36
40
|
export declare class MessageBuilder {
|
|
41
|
+
private readonly recoveryNotices;
|
|
42
|
+
private readonly getToolResultRecovery?;
|
|
43
|
+
private recoveryNoticeBytes;
|
|
37
44
|
private indexedMessageCount;
|
|
38
45
|
private indexedTailRef;
|
|
39
46
|
private readonly toolNameByIdCache;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ImageContent } from "@cline/shared";
|
|
2
|
+
export declare const TOOL_RESULT_CACHE_MAX_BYTES: number;
|
|
3
|
+
export declare const TOOL_RESULT_CACHE_IDLE_ITERATIONS = 5;
|
|
4
|
+
export declare const TOOL_RESULT_CACHE_MISS = "Cache not found. Make a new tool call for the latest result again if needed. DO NOT repeat side-effecting actions to recover output.";
|
|
5
|
+
/** Session-owned volatile text cache. Looking up a URI never extends its lifetime. */
|
|
6
|
+
export declare class ToolResultCache {
|
|
7
|
+
private readonly sessionId;
|
|
8
|
+
private readonly maxBytes;
|
|
9
|
+
private readonly entries;
|
|
10
|
+
private readonly referencesByToolCall;
|
|
11
|
+
private iteration;
|
|
12
|
+
private bytes;
|
|
13
|
+
constructor(sessionId: string, maxBytes?: number);
|
|
14
|
+
store(toolCallId: string, text: string): string | undefined;
|
|
15
|
+
uriFor(toolCallId: string): string | undefined;
|
|
16
|
+
read(uri: string): string;
|
|
17
|
+
advanceIteration(): void;
|
|
18
|
+
clear(): void;
|
|
19
|
+
private remove;
|
|
20
|
+
}
|
|
21
|
+
/** Size and truncate the persisted representation sent to the model. */
|
|
22
|
+
export declare function prepareToolResultPreview(content: unknown): {
|
|
23
|
+
text: string | undefined;
|
|
24
|
+
images: ImageContent[];
|
|
25
|
+
};
|
|
26
|
+
/** YAML is only the readable recovery copy, not the truncation threshold. */
|
|
27
|
+
export declare function prepareToolResultRecovery(output: unknown): {
|
|
28
|
+
text: string | undefined;
|
|
29
|
+
images: ImageContent[];
|
|
30
|
+
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cline/core",
|
|
3
3
|
"description": "Cline Core SDK for Node Runtime",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.89",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/cline/cline",
|
|
@@ -61,9 +61,9 @@
|
|
|
61
61
|
"test:watch": "vitest --config vitest.config.ts"
|
|
62
62
|
},
|
|
63
63
|
"dependencies": {
|
|
64
|
-
"@cline/agents": "0.0.
|
|
65
|
-
"@cline/shared": "0.0.
|
|
66
|
-
"@cline/llms": "0.0.
|
|
64
|
+
"@cline/agents": "0.0.89",
|
|
65
|
+
"@cline/shared": "0.0.89",
|
|
66
|
+
"@cline/llms": "0.0.89",
|
|
67
67
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
68
68
|
"@opentelemetry/api": "^1.9.0",
|
|
69
69
|
"@opentelemetry/api-logs": "^0.214.0",
|