@cerebriline/core 4.100.250 → 4.100.252

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.
@@ -1,5 +1,5 @@
1
- import{createRequire as t0}from"node:module";var a0=t0(import.meta.url);import{homedir as l1}from"node:os";import{claimHubDaemonProcess as c1}from"@cerebriline/shared";import{setHomeDirIfUnset as i1}from"@cerebriline/shared/storage";import{createSessionId as O1,ensureLoopbackProxyBypass as k0,isHubProtocolCompatible as B1,resolveClineBuildEnv as A1,resolveHubCommandTimeoutMs as f1}from"@cerebriline/shared";import U1 from"ws";var x={name:"@cerebriline/core",description:"Cline Core SDK for Node Runtime",version:"0.0.92",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:{"@cerebriline/agents":"workspace:*","@cerebriline/llms":"workspace:*","@cerebriline/shared":"workspace:*","@joplin/turndown-plugin-gfm":"1.0.68","@lingo-reader/epub-parser":"0.4.6","@lingo-reader/fb2-parser":"0.4.6","@lingo-reader/mobi-parser":"0.4.6","@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","@tesseract.js-data/eng":"1.0.0",cfb:"1.2.2","fast-png":"8.0.0",jiti:"^2.7.0",nanoid:"^5.1.7","node-machine-id":"^1.1.12",officeparser:"8.0.0","pdfjs-dist":"6.2.108","simple-git":"3.36.0","tesseract.js":"7.0.0","tree-sitter-wasms":"^0.1.12",turndown:"7.2.0","web-tree-sitter":"^0.25.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/turndown":"^5.0.6","@types/ws":"^8.18.1","posthog-node":"^5.8.0"},engines:{node:">=22"},files:["assets","dist","scripts/document-reader-assets.mjs","!dist/**/*.d.ts.map"]};var $0="session_not_found";class u extends Error{sessionId;code="session_not_found";constructor(J,j){super(j??(J?`session not found: ${J}`:"session not found"));this.sessionId=J;this.name="SessionNotFoundError"}}import{spawn as k2}from"node:child_process";import{closeSync as y2,mkdirSync as b2,openSync as h2,readFileSync as m2,unlinkSync as v2}from"node:fs";import{basename as u2,dirname as p2,join as l2}from"node:path";import{fileURLToPath as c2}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as i2,isBunEmbeddedModulePath as n2,isHubDaemonProcess as s2,resolveClineBuildEnv as S0,withResolvedClineBuildEnv as d2}from"@cerebriline/shared";import{createHash as r0,randomBytes as e0}from"node:crypto";import{mkdir as l,open as X0,readFile as W0,rename as J2,rm as I,writeFile as j2}from"node:fs/promises";import{dirname as G0,join as c}from"node:path";import{ensureLoopbackProxyBypass as Q2,isHubProtocolCompatible as Z2}from"@cerebriline/shared";import{resolveClineDataDir as D,resolveClineDir as Q6}from"@cerebriline/shared/storage";var $2="CLINE_HUB_DISCOVERY_PATH",X2="CLINE_HUB_BUILD_ID",z2="CLINE_HUB_BUILD_EPOCH_MS",V2=30000,Y2=15000,z0=100;function N2(J){return J.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function W2(J){return r0("sha256").update(J).digest("hex").slice(0,12)}function G2(J){if(!Number.isInteger(J)||!J||J<=0)return!1;try{return process.kill(J,0),!0}catch(j){return j instanceof Error&&"code"in j?String(j.code)==="EPERM":!1}}function V0(J){return new Promise((j)=>setTimeout(j,J))}function K2(J){return`${J}.lock`}async function q2(J){try{let j=JSON.parse(await W0(c(J,"owner.json"),"utf8"));if(typeof j.pid!=="number"||typeof j.acquiredAt!=="string")return;return{pid:j.pid,acquiredAt:j.acquiredAt}}catch{return}}async function p(J){await I(J,{recursive:!0,force:!0}).catch(()=>{return})}function C(){let J=process.env[X2]?.trim();if(J)return J;return"sdk-v1-60a66114367f2ef4b034ec68043e8c751e15bcf46da4f62bffd40c3b75ccf1fc".trim()||`source-${String(x.version)}`}function F2(){let J=Number(process.env[z2]);if(Number.isFinite(J)&&J>0)return J;return Number.isFinite(1791878691346)?1791878691346:void 0}function w(J,j=C()){let Q=Z2(J);if(!Q.compatible)return Q;let Z=J.buildId?.trim();if(!Z)return{compatible:!1,reason:"missing_build"};if(Z!==j)return{compatible:!1,reason:"build_mismatch"};return{compatible:!0}}function Y0(J){return typeof J==="number"&&Number.isFinite(J)&&J>0?J:void 0}function N0(J){let j=J?.trim().split(/[-+]/,1)[0];if(!j)return;let Q=j.split(".").map((Z)=>Number(Z));if(Q.length===0||Q.some((Z)=>!Number.isInteger(Z)||Z<0))return;return Q}function L2(J,j){for(let Q=0;Q<Math.max(J.length,j.length);Q++){let Z=J[Q]??0,$=j[Q]??0;if(Z!==$)return Z<$?-1:1}return 0}function K0(J,j){let Q=J.buildId?.trim(),Z=j.buildId?.trim();if(Q&&Z&&Q===Z)return 0;let $=Y0(J.buildEpochMs),X=Y0(j.buildEpochMs);if($!==void 0&&X!==void 0&&$!==X)return $<X?-1:1;let z=N0(J.coreVersion),N=N0(j.coreVersion);if(z&&N){let Y=L2(z,N);if(Y!==0)return Y}if(Q&&Z&&Q!==Z)return Q<Z?-1:1;return 0}function q0(){return{buildId:C(),buildEpochMs:F2(),coreVersion:String(x.version)}}function P(J,j){let Q=j?.self??q0(),Z=w(J,Q.buildId??"");if(Z.compatible)return!0;if(Z.reason!=="build_mismatch"&&Z.reason!=="missing_build")return!1;return K0(Q,J)<=0}function F0(J=process.argv[1]?.trim()||process.cwd()){let j=`hub-${W2(J)}`,Q=process.env[$2]?.trim()||c(D(),"locks","hub","owners",`${N2(j)}.json`);return{ownerId:j,discoveryPath:Q}}async function B(J){try{let j=JSON.parse(await W0(J,"utf8"));if(typeof j.hubId!=="string"||typeof j.protocolVersion!=="string"||typeof j.authToken!=="string"||typeof j.host!=="string"||typeof j.port!=="number"||typeof j.url!=="string"||typeof j.startedAt!=="string"||typeof j.updatedAt!=="string")return;return{hubId:j.hubId,protocolVersion:j.protocolVersion,minClientProtocolVersion:typeof j.minClientProtocolVersion==="string"?j.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof j.maxClientProtocolVersion==="string"?j.maxClientProtocolVersion:void 0,capabilities:Array.isArray(j.capabilities)?j.capabilities.filter((Q)=>typeof Q==="string"):void 0,coreVersion:typeof j.coreVersion==="string"?j.coreVersion:void 0,buildId:typeof j.buildId==="string"?j.buildId:void 0,buildEpochMs:typeof j.buildEpochMs==="number"?j.buildEpochMs:void 0,authToken:j.authToken,host:j.host,port:j.port,url:j.url,pid:typeof j.pid==="number"?j.pid:void 0,startedAt:j.startedAt,updatedAt:j.updatedAt}}catch{return}}async function L0(J,j,Q){await i(J,async()=>{let Z=G0(J);await l(Z,{recursive:!0});let $=`${J}.${process.pid}.${e0(6).toString("hex")}.tmp`,X;try{X=await X0($,"wx",384),await X.writeFile(`${JSON.stringify(j,null,2)}
2
- `,{encoding:"utf8"}),await X.sync(),await X.close(),X=void 0,Q?.beforePublish?.(),await J2($,J);let z;try{z=await X0(Z,"r"),await z.sync()}catch{}finally{await z?.close().catch(()=>{return})}}catch(z){throw await X?.close().catch(()=>{return}),await I($,{force:!0}).catch(()=>{return}),z}})}async function _(J){await i(J,async()=>{await I(J,{force:!0}).catch(()=>{return})})}async function O0(J,j){return await i(J,async()=>{if((await B(J))?.hubId!==j)return!1;return await I(J,{force:!0}),!0})}async function B0(J,j,Q){let Z=K2(J);await l(G0(Z),{recursive:!0});let $=Date.now()+Y2;while(!0){try{await l(Z,{recursive:!1})}catch(X){if((X instanceof Error&&"code"in X?String(X.code):"")!=="EEXIST")throw X;let N=await q2(Z);if(!N){if(Date.now()>=$){await p(Z);continue}await V0(z0);continue}let Y=Date.now()-Date.parse(N.acquiredAt);if(!G2(N.pid)||Y>V2){await p(Z);continue}if(Date.now()>=$)throw Error(`Timed out waiting for hub ${j} lock ${Z}`);await V0(z0);continue}try{return await j2(c(Z,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
3
- `,"utf8"),await Q()}finally{await p(Z)}}}function i(J,j){return B0(`${J}.mutation`,"discovery mutation",j)}function A0(J,j){return B0(J,"startup",j)}async function T(J,j){Q2();try{let Q=await fetch(j?.authToken?O2(J):U0(J),{headers:j?.authToken?{authorization:`Bearer ${j.authToken}`}:void 0,signal:j?.signal});if(!Q.ok)return;let Z=await Q.json();if(typeof Z.protocolVersion!=="string"||typeof Z.host!=="string"||typeof Z.port!=="number"||typeof Z.url!=="string")return;return{protocolVersion:Z.protocolVersion,minClientProtocolVersion:typeof Z.minClientProtocolVersion==="string"?Z.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof Z.maxClientProtocolVersion==="string"?Z.maxClientProtocolVersion:void 0,capabilities:Array.isArray(Z.capabilities)?Z.capabilities.filter(($)=>typeof $==="string"):void 0,coreVersion:typeof Z.coreVersion==="string"?Z.coreVersion:void 0,buildId:typeof Z.buildId==="string"?Z.buildId:void 0,buildEpochMs:typeof Z.buildEpochMs==="number"?Z.buildEpochMs:void 0,host:Z.host,port:Z.port,url:Z.url,hubId:typeof Z.hubId==="string"?Z.hubId:void 0,authToken:typeof Z.authToken==="string"?Z.authToken:void 0,pid:typeof Z.pid==="number"?Z.pid:void 0,startedAt:typeof Z.startedAt==="string"?Z.startedAt:void 0,updatedAt:typeof Z.updatedAt==="string"?Z.updatedAt:void 0}}catch{return}}function f0(J,j,Q="/hub"){return new URL(`ws://${J}:${j}${Q}`).toString()}function U0(J){let j=new URL(J);return j.protocol=j.protocol==="wss:"?"https:":"http:",j.pathname="/health",j.search="",j.toString()}function O2(J){let j=new URL(U0(J));return j.pathname="/status",j.toString()}import{CLINE_HUB_DEV_PORT as B2,CLINE_HUB_PORT as A2,resolveClineBuildEnv as f2}from"@cerebriline/shared";var U2="CLINE_HUB_HOST",M2="CLINE_HUB_PORT",x2="CLINE_HUB_PATHNAME",C2="127.0.0.1",_2=A2,D2="/hub";function M0(J){return f2(J)==="development"?B2:_2}function R2(J={}){return(J.env??process.env)[U2]?.trim()||C2}function E2(J={}){let Q=(J.env??process.env)[M2]?.trim();if(!Q)return M0(J);let Z=Number.parseInt(Q,10);if(!Number.isInteger(Z)||Z<1||Z>65535)return M0(J);return Z}function S2(J={}){return(J.env??process.env)[x2]?.trim()||D2}function x0(J={},j={}){return{host:J.host??R2(j),port:J.port??E2(j),pathname:J.pathname??S2(j)}}import{join as w2}from"node:path";import{execFile as g2}from"node:child_process";import{promisify as I2}from"node:util";import{processWorkspaceInfo as W6}from"@cerebriline/shared";import K6 from"simple-git";var q6=I2(g2);var P2="shared:cline",T2="CLINE_HUB_DISCOVERY_PATH",H2="hub-production";function R(J=P2){return F0(`${J}@${C()}`)}function H(){return{ownerId:H2,discoveryPath:process.env[T2]?.trim()||w2(D(),"locks","hub","production.json")}}var C0=15000,t2=200,_0=3000,a2=100,o2=[100,250,500,1000,2000],r2="--cline-hub-daemon",e2=3,J1=60000,D0=new Map;function j1(J,j=Date.now()){let Q=D0.get(J);if(!Q||j-Q.windowStartedAt>J1)return D0.set(J,{count:1,windowStartedAt:j}),!0;return Q.count+=1,Q.count<=e2}function Q1(J){return[...J.host?["--host",J.host]:[],...typeof J.port==="number"?["--port",String(J.port)]:[],...J.pathname?["--pathname",J.pathname]:[]]}function Z1(){try{let J=l2(D(),"logs","hub-daemon.log");return b2(p2(J),{recursive:!0}),{fd:h2(J,"a"),logPath:J}}catch{return}}function $1(){return S0()==="production"?H():R()}function E(J){return P(J)}function X1(J){try{let j=JSON.parse(m2(`${J}.superseded`,"utf8"));return{url:typeof j.url==="string"?j.url:void 0,authToken:typeof j.authToken==="string"?j.authToken:void 0,pid:typeof j.pid==="number"?j.pid:void 0}}catch{return}}function n(J){try{v2(`${J}.superseded`)}catch{}}function R0(J,j,Q){if(!j||j.url!==Q)return J;return{...J,authToken:J.authToken??j.authToken,pid:J.pid??j.pid}}async function S(J,j){try{return await T(J,{authToken:j})}catch{return}}async function E0(J,j){let Q=Date.now()+j;while(Date.now()<Q){if(!(await S(J))?.url)return!0;await new Promise(($)=>setTimeout($,a2))}return!1}async function d(J,j){if(!j1(J.url))return!1;await g(J.url,J.authToken,"retired by newer install").catch(()=>!1),await b(J.url,J.authToken).catch(()=>!1);let Q=await E0(J.url,_0);if(!Q&&J.pid&&z1(J.pid)){try{process.kill(J.pid,"SIGTERM")}catch{}Q=await E0(J.url,_0)}if(Q)await _(j).catch(()=>{return});return Q}function z1(J){try{return process.kill(J,0),!0}catch(j){return j?.code==="EPERM"}}async function V1(J){try{return(await t(J.url,J.authToken)).activeSessionCount>0}catch{return!1}}async function s(J,j){if(E(J))return"reusable";let Q=await g(J.url,J.authToken,"retired by newer install").catch(()=>!1);if(await V1(J)){if(Q)await g(J.url,J.authToken,"hub retirement deferred",{off:!0}).catch(()=>!1);return"deferred_busy"}let Z=await d(J,j);if(!Z&&Q)await g(J.url,J.authToken,"hub retirement failed",{off:!0}).catch(()=>!1);return Z?"retired":"failed"}async function Y1(J){if(S0()!=="production")return;let j=R();if(j.discoveryPath===J.discoveryPath)return;let Q=await B(j.discoveryPath);if(Q?.url)await d(Q,j.discoveryPath);else await _(j.discoveryPath).catch(()=>{return})}function N1(){let J=import.meta.url.endsWith(".ts")?"ts":"js";return c2(new URL(`./entry.${J}`,import.meta.url))}function W1(J,j){if(n2(J))return[r2];return[...j&&J.toLowerCase().endsWith(".ts")?["--conditions=development"]:[],J]}function G1(J,j){let Q=N1(),Z=process.execPath?.trim();if(!Z)throw Error("unable to resolve runtime executable for hub daemon");let $=u2(Z).toLowerCase().includes("bun"),X=W1(Q,$);return{launcher:Z,args:[...X,"--cwd",J,...Q1(j),...j.manageConnectors===!1?["--no-connectors"]:[]],cwd:J,env:{...d2(process.env),CLINE_NO_INTERACTIVE:"1",[i2]:"1"}}}function K1(J){if(!J||typeof J!=="object")return!1;if(("code"in J?J.code:void 0)==="ETXTBSY")return!0;let Q="message"in J?J.message:void 0;return typeof Q==="string"&&Q.includes("ETXTBSY")}function q1(J,j={}){if(s2())return;let Q=G1(J,j),Z=Z1();try{k2(Q.launcher,Q.args,{detached:!0,stdio:Z?["ignore",Z.fd,Z.fd]:"ignore",env:Q.env,cwd:Q.cwd,windowsHide:!0}).unref()}finally{if(Z)y2(Z.fd)}}async function F1(J,j={}){for(let Q=0;;Q++)try{q1(J,j);return}catch(Z){let $=o2[Q];if(!K1(Z)||$===void 0)throw Z;await new Promise((X)=>setTimeout(X,$))}}async function L1(J,j,Q={}){let Z=Q.host!==void 0||Q.port!==void 0||Q.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),$=x0(Q),X=f0($.host,$.port,$.pathname),z=(G)=>{if(!Z)y(G.url,G.authToken);else g0(G.url,G.authToken);return G};await Y1(J).catch(()=>{return});let N=await B(J.discoveryPath),Y=N?.url?void 0:X1(J.discoveryPath),W=!1;if(N?.url){let G=N.authToken;if(!G)W=!0,await d(N,J.discoveryPath);else{let K=await S(N.url,G);if(K?.url&&E(K)&&await A(K.url,{authToken:G}))return n(J.discoveryPath),z({url:K.url,authToken:G});if(K?.url){if(await s({...K,authToken:G},J.discoveryPath)==="deferred_busy"&&await A(K.url,{authToken:G}))return z({url:K.url,authToken:G})}else await _(J.discoveryPath).catch(()=>{return})}}let V=await S(X);if(V?.url){let G=R0(V,N??Y,X);if(E(V)){let L=[V.authToken,N?.authToken,Y?.authToken].filter((M)=>typeof M==="string"&&M.trim().length>0);for(let M of L){if(!await A(V.url,{authToken:M}))continue;let d0={hubId:V.hubId??`repaired-${V.port}`,protocolVersion:V.protocolVersion,minClientProtocolVersion:V.minClientProtocolVersion,maxClientProtocolVersion:V.maxClientProtocolVersion,capabilities:V.capabilities,coreVersion:V.coreVersion,buildId:V.buildId,authToken:M,host:V.host,port:V.port,url:V.url,pid:V.pid??N?.pid??Y?.pid,startedAt:V.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await L0(J.discoveryPath,d0)}catch{}return n(J.discoveryPath),z({url:V.url,authToken:M})}throw Error(`A compatible Cline Hub is already running at ${X}, but its discovery record is missing or unreadable and no usable auth token is available. Run 'cline doctor fix' to repair local hub discovery.${W?" 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 K=await s(G,J.discoveryPath);if(K==="deferred_busy"){for(let L of[G.authToken,N?.authToken].filter((U)=>typeof U==="string"&&U.trim().length>0))if(await A(V.url,{authToken:L}))return z({url:V.url,authToken:L});if(Q.allowPortFallback!==!0&&$.port!==0)throw Error(`An older Cline Hub is running at ${X} 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(K==="failed"&&Q.allowPortFallback!==!0&&$.port!==0)throw Error(`An incompatible Cline Hub is already running at ${X} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}let O=Q.allowPortFallback===!0&&$.port!==0?{...$,port:0}:$;await F1(j,{...O,manageConnectors:Q.manageConnectors});let f=Date.now()+C0;while(Date.now()<f){let G=await B(J.discoveryPath);if(G?.url&&G.authToken){let L=await S(G.url,G.authToken);if(L?.url&&E(L)&&await A(L.url,{authToken:G.authToken}))return n(J.discoveryPath),z({url:L.url,authToken:G.authToken})}let K=await S(X);if(K?.url&&!E(K)){let L=R0(K,G??Y,X),U=await s(L,J.discoveryPath);if(U==="deferred_busy"&&G?.authToken&&await A(K.url,{authToken:G.authToken}))return z({url:K.url,authToken:G.authToken});if(U==="failed"&&Q.allowPortFallback!==!0&&$.port!==0)throw Error(`An incompatible Cline Hub is still running at ${X} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}await new Promise((L)=>setTimeout(L,t2))}throw Error(`Timed out after ${C0}ms waiting for detached hub startup.`)}async function k(J,j={}){let Q=$1();return await A0(Q.discoveryPath,async()=>L1(Q,J,j))}function M1(){return A1()==="production"?H():R()}function x1(){let J=globalThis.WebSocket;if(!J)throw Error("Global WebSocket is not available in this runtime. Node 22+ is required for hub mode.");return J}function y0(J){if(typeof J==="string")return J;if(J instanceof Uint8Array)return Buffer.from(J).toString();if(J instanceof ArrayBuffer)return Buffer.from(J).toString();if(Array.isArray(J))return Buffer.concat(J.map((j)=>Buffer.from(j))).toString();if(J&&typeof J==="object"&&"data"in J&&typeof J.data<"u")return y0(J.data);return String(J)}function C1(J){if(typeof J==="string")return J;if(J instanceof Uint8Array)return Buffer.from(J).toString("utf8");if(J instanceof ArrayBuffer)return Buffer.from(J).toString("utf8");return""}function I0(J){let j=J,Q=C1(j.reason);return new q("hub_connection_closed",j.code||Q?`Hub connection closed (code=${j.code??0}${Q?`, reason=${Q}`:""})`:o,{closeCode:j.code,closeReason:Q||void 0})}function w0(J,j){if(J instanceof q)return J;if(J instanceof Error)return new q("hub_connect_failed",J.message);if(J&&typeof J==="object"&&"error"in J&&J.error instanceof Error)return new q("hub_connect_failed",J.error.message);let Q=J&&typeof J==="object"&&"message"in J&&typeof J.message==="string"?J.message.trim():"";if(Q)return new q("hub_connect_failed",Q);let Z=J&&typeof J==="object"&&"type"in J&&typeof J.type==="string"?J.type.trim():"";return new q("hub_connect_failed",Z?`Failed to connect to hub at ${j.toString()} (${Z} event before socket open).`:`Failed to connect to hub at ${j.toString()}.`)}var a="*",h=8000,_1="cline-hub-auth.",J0=new Map,b0=new Set,D1=3000;var o="Hub connection closed",R1=250,E1=5000,P0=0.5;class q extends Error{code;details;constructor(J,j,Q){super(j);this.code=J;this.details=Q;this.name="HubTransportError"}}function S1(J){return J instanceof q}class r extends Error{command;code;constructor(J,j,Q){super(Q);this.command=J;this.code=j;this.name="HubCommandError"}}function j0(J,j={}){let Q=J.searchParams.get("authToken")?.trim();if(J.searchParams.delete("authToken"),Q)return Q;if(j.skipRegistry)return;let Z=m(J.toString());return Z?J0.get(Z):void 0}function g1(J){try{let Q=new URL(J).hostname.toLowerCase().replace(/^\[|\]$/g,"");return Q==="localhost"||Q==="127.0.0.1"||Q==="::1"}catch{return!1}}function m(J){if(!g1(J))return;let j=new URL(h0(J));return j.search="",j.hash="",j.toString()}function T0(J){let j=m(J);return!!j&&b0.has(j)}function y(J,j){let Q=m(J);if(Q){if(b0.add(Q),j?.trim())J0.set(Q,j)}return J}function g0(J,j){let Q=m(J);if(Q&&j?.trim())J0.set(Q,j)}class Q0{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 q("hub_connection_closed",o);sawSocketClose=!1;registered=!1;capabilities;constructor(J){this.options=J;if(J.authToken?.trim()&&J.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");this.clientId=J.clientId??`core-${Math.random().toString(36).slice(2,10)}-${Date.now().toString(36)}`,this.currentUrl=J.url,this.capabilities=[...J.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(J){if(this.capabilities=J.map((j)=>({...j})),!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 J=new URL(this.currentUrl),j=this.options.authToken?.trim()||j0(J,{skipRegistry:Boolean(this.options.resolveConnectionHeaders)});if(J.hash="",j&&this.options.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");let Q=++this.connectGeneration,Z=this.openSocket(J,j,Q),$;this.connectPromise=Z.then(async(z)=>{if($=z,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(x.version),pid:process.pid},workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}},void 0,void 0,!1),Q!==this.connectGeneration||this.closedByClient){try{z.close()}catch{}throw this.lastCloseError}this.registered=!0;for(let N of this.subscriptionCounts.keys())this.sendSubscriptionFrame("stream.subscribe",this.subscriptionSessionIdFromKey(N));this.reconnectAttempt=0});let X=this.connectPromise;try{await X}catch(z){if(this.connectPromise===X)this.connectPromise=void 0;if($&&this.socket===$){this.lastCloseError=w0(z,J),this.registered=!1,this.sawSocketClose=!1,this.socket=void 0;try{$.close()}catch{}}if(!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect();throw z}}async openSocket(J,j,Q){let Z=this.options.resolveConnectionHeaders,$;if(Z){let Y;try{$=await Promise.race([Promise.resolve().then(()=>Z()),new Promise((W,V)=>{Y=setTimeout(()=>{V(new q("hub_connect_timeout",`Timed out resolving hub connection headers after ${h}ms`))},h)})])}catch(W){let V=W instanceof q?W:new q("hub_connect_failed",W instanceof Error?W.message:String(W));if(Q===this.connectGeneration)this.lastCloseError=V;throw V}finally{clearTimeout(Y)}}if(Q!==this.connectGeneration||this.closedByClient)throw this.lastCloseError;if($&&Object.keys($).some((Y)=>Y.toLowerCase()==="sec-websocket-protocol")){let Y=new q("hub_connect_failed","Hub connection headers cannot set Sec-WebSocket-Protocol.");if(Q===this.connectGeneration)this.lastCloseError=Y;throw Y}let X=$?new U1(J.toString(),{headers:{...$}}):new(x1())(J.toString(),j?[`${_1}${j}`]:void 0);this.socket=X;let z=!1,N=new Promise((Y,W)=>{let V=!1,F=setTimeout(()=>{if(V)return;V=!0,z=!0;let O=new q("hub_connect_timeout",`Timed out connecting to hub after ${h}ms`);if(this.socket===X)this.lastCloseError=O,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;try{X.close()}catch{}W(O)},h);X.addEventListener("open",()=>{if(V)return;V=!0,clearTimeout(F),Y()}),X.addEventListener("error",(O)=>{if(V)return;V=!0,clearTimeout(F);let f=w0(O,J);if(this.socket===X)this.lastCloseError=f,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;W(f)}),X.addEventListener("close",(O)=>{if(V)return;V=!0,clearTimeout(F);let f=z?this.lastCloseError:I0(O);if(this.socket===X){if(!z)this.lastCloseError=f,this.sawSocketClose=!0;this.connectPromise=void 0,this.socket=void 0}W(f)})});return X.addEventListener("message",(Y)=>{this.handleFrame(JSON.parse(y0(Y)))}),X.addEventListener("close",(Y)=>{if(this.socket!==X)return;if(!z)this.lastCloseError=I0(Y),this.sawSocketClose=!0;this.registered=!1;for(let W of this.pendingReplies.values())W.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,this.socket=void 0,!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect()}),await N,X}subscribe(J,j){let Q=j?.sessionId?.trim()||void 0,Z={listener:J,sessionId:Q};return this.listeners.add(Z),this.adjustSubscriptionCount(Q,1),()=>{if(!this.listeners.delete(Z))return;this.adjustSubscriptionCount(Q,-1)}}async command(J,j,Q,Z){let $=0,X=J!=="client.register"&&J!=="client.unregister";while(!0)try{return await this.commandOnce(J,j,Q,Z)}catch(z){if(!X||$>=1||!await this.recoverLocalHubTransport(z))throw z;$+=1}}async commandOnce(J,j,Q,Z,$=!0){if($)await this.connect();Z?.beforeDispatch?.();let X=O1("hubreq_");Z?.onDispatch?.(X);let z=f1(J,Z?.timeoutMs),N=new Promise((W,V)=>{let F=z===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(X))return;V(new r(J,"hub_command_timeout",`Hub command ${J} timed out after ${z}ms (hub=${this.currentUrl}, requestId=${X}, clientId=${this.clientId}). Check hub-daemon.log for matching command.start/command.slow entries, or run 'cline doctor fix' to restart the hub.`))},z);this.pendingReplies.set(X,{resolve:(O)=>{if(F)clearTimeout(F);W(O)},reject:(O)=>{if(F)clearTimeout(F);V(O)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:J,requestId:X,clientId:this.clientId,sessionId:Q,timeoutMs:z,payload:j}})}catch(W){throw this.pendingReplies.delete(X),W}let Y=await N;if(!Y.ok){if(Y.error?.code===$0){let W=Q??(typeof j?.sessionId==="string"?j.sessionId:void 0);throw new u(W,Y.error.message)}throw new r(J,Y.error?.code,Y.error?.message??`Hub command ${J} failed`)}return Y}async recoverLocalHubTransport(J){if(!T0(this.currentUrl)||!S1(J))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let j=await H0({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}).catch(()=>{return});if(!j)return!1;return this.currentUrl=j,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 J=Math.min(R1*2**this.reconnectAttempt,E1),j=Math.round(J*(1-P0)+Math.random()*J*P0);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.reconnectSubscribedTransport()},j)}async reconnectSubscribedTransport(){if(this.closedByClient||!this.hasActiveSubscriptions())return;try{await this.connect(),this.reconnectAttempt=0}catch{if(!T0(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let J=await H0({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd});if(J){this.currentUrl=J,await this.connect(),this.reconnectAttempt=0;return}}catch{}this.reconnectAttempt+=1,this.scheduleReconnect()}}close(){let J=this.socket;if(this.closedByClient=!0,this.connectGeneration+=1,this.clearReconnectTimer(),this.registered=!1,J)this.lastCloseError=new q("hub_connection_closed",o);for(let j of this.pendingReplies.values())j.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,!J)return;this.sawSocketClose=!1,this.socket=void 0;try{J.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(J){if(!this.socket||this.socket.readyState!==1){if(this.lastCloseError.code==="hub_connection_closed"&&!this.sawSocketClose)throw new q("hub_connection_not_open","Hub connection is not open.");throw this.lastCloseError}this.socket.send(JSON.stringify(J))}sendSubscriptionFrame(J,j){let Q=J==="stream.subscribe"?this.lastEventSequenceByKey.get(this.subscriptionKeyForSessionId(j)):void 0;this.sendFrame({kind:J,clientId:this.clientId,...j?{sessionId:j}:{},...Q!==void 0?{sinceSequence:Q}:{}})}adjustSubscriptionCount(J,j){let Q=this.subscriptionKeyForSessionId(J),Z=(this.subscriptionCounts.get(Q)??0)+j;if(Z<=0){if(this.subscriptionCounts.delete(Q),!this.hasActiveSubscriptions())this.clearReconnectTimer();if(j<0&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.unsubscribe",J);return}if(this.subscriptionCounts.set(Q,Z),j>0&&Z===1&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.subscribe",J)}subscriptionKeyForSessionId(J){return J??a}subscriptionSessionIdFromKey(J){return J===a?void 0:J}handleFrame(J){switch(J.kind){case"reply":{let j=J.envelope.requestId;if(!j)return;let Q=this.pendingReplies.get(j);if(!Q)return;this.pendingReplies.delete(j),Q.resolve(J.envelope);return}case"event":{let j=J.envelope.sequence;if(typeof j==="number"){let Q=J.envelope.sessionId?.trim();for(let Z of[a,Q]){if(!Z||!this.subscriptionCounts.has(Z))continue;let $=this.lastEventSequenceByKey.get(Z)??0;if(j>$)this.lastEventSequenceByKey.set(Z,j)}}for(let Q of this.listeners){if(Q.sessionId&&Q.sessionId!==J.envelope.sessionId?.trim())continue;Q.listener(J.envelope)}return}case"command":case"stream.subscribe":case"stream.unsubscribe":return}}}function h0(J){let j=new URL(J);if(j.protocol==="http:")j.protocol="ws:";else if(j.protocol==="https:")j.protocol="wss:";return j.toString()}async function A(J,j){let Q=new Q0({url:J,authToken:j?.authToken,clientType:"hub-healthcheck",displayName:"hub healthcheck",workspaceRoot:j?.workspaceRoot,cwd:j?.cwd});try{return await Q.connect(),!0}catch{return!1}finally{Q.close()}}async function e(J,j){let Q=h0(J),Z=await T(Q,{authToken:j?.authToken});if(!Z)return{status:"unreachable",url:Q};if(j?.requireCurrentBuild){let $=C(),X=w(Z,$);if(!X.compatible&&!P(Z))return{status:X.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:Q}}else if(!B1(Z).compatible)return{status:"protocol_mismatch",url:Q};if(j?.verifyConnection===!0&&!await A(Q,{workspaceRoot:j.workspaceRoot,cwd:j.cwd,authToken:j.authToken}))return{status:"unreachable",url:Q};return{status:"compatible",url:Q}}function I1(J){let j=J&&typeof J==="object"&&Array.isArray(J.sessions)?J.sessions:[],Q=0,Z=new Set;for(let $ of j){if(!$||typeof $!=="object")continue;let X=$.participants;if(!Array.isArray(X)||X.length===0)continue;Q+=1;for(let z of X){let N=z&&typeof z==="object"?z.clientId:void 0;if(typeof N==="string"&&N.trim())Z.add(N)}}return{activeSessionCount:Q,participantClientCount:Z.size}}async function t(J,j,Q){let Z=new Q0({url:J,authToken:j,clientType:"hub-recovery-check",displayName:"hub recovery check",workspaceRoot:Q?.workspaceRoot,cwd:Q?.cwd});try{let $=await Z.command("session.list",{limit:500},void 0,{timeoutMs:D1});return I1($.payload)}finally{await Z.dispose().catch(()=>{return})}}async function w1(J,j,Q){try{return(await t(J,j,Q)).activeSessionCount===0}catch{return!1}}async function P1(J,j){let Q=`${J.discoveryPath}.superseded`,Z=await B(Q);if(!Z?.url||!Z.authToken)return;let $=await e(Z.url,{authToken:Z.authToken});if($.status!=="compatible")return;if(await w1($.url,Z.authToken,j))return;return y($.url,Z.authToken)}async function T1(J={}){if(J.endpoint?.trim()){let $=await e(J.endpoint);return $.status==="compatible"?$.url:void 0}let j=M1(),Q=await B(j.discoveryPath);if(!Q?.url)return await P1(j,J);let Z=await e(Q.url,{authToken:Q.authToken,requireCurrentBuild:!0});if(Z.status==="compatible")return y(Z.url,Q.authToken);if(Z.status==="protocol_mismatch")await _(j.discoveryPath).catch(()=>{return});return}async function H0(J={}){let j=await T1(J);if(j&&await A(j,{workspaceRoot:J.workspaceRoot,cwd:J.cwd}))return j;if(J.endpoint?.trim())return;try{return(await k(J.workspaceRoot??process.cwd())).url}catch(Q){J.onStartupError?.(Q);return}}async function g(J,j,Q,Z){k0();let $=new URL(J),X=j?.trim()||j0($);if($.protocol==="ws:")$.protocol="http:";else if($.protocol==="wss:")$.protocol="https:";if($.pathname="/drain",$.hash="",Q)$.searchParams.set("reason",Q);if(Z?.off)$.searchParams.set("off","1");return(await fetch($,{method:"POST",headers:X?{authorization:`Bearer ${X}`}:void 0})).ok}async function b(J,j){k0();let Q=new URL(J),Z=j?.trim()||j0(Q);if(Q.protocol==="ws:")Q.protocol="http:";else if(Q.protocol==="wss:")Q.protocol="https:";return Q.pathname="/shutdown",Q.hash="",(await fetch(Q,{method:"POST",headers:Z?{authorization:`Bearer ${Z}`}:void 0})).ok}import{spawn as H1}from"node:child_process";import{userInfo as k1}from"node:os";import{basename as y1,delimiter as v}from"node:path";var Z0="__CLINE_SIDECAR_PATH_START__",v0="__CLINE_SIDECAR_PATH_END__",u0=5000,b1=`/bin/sh -c 'printf "%s%s%s" "${Z0}" "$PATH" "${v0}"'`,m0="CLINE_SIDECAR_SKIP_SHELL_PATH";function p0(J){return J==="darwin"?"/bin/zsh":"/bin/bash"}function h1(J,j){try{let Q=k1().shell?.trim();if(Q)return Q}catch{}return j.SHELL?.trim()||p0(J)}function m1(J,j){let Q=y1(J);if(Q==="csh"||Q==="tcsh")return{args:["-c",j],argv0:`-${Q}`};return{args:["-i","-l","-c",j]}}function v1(J){let j=J.indexOf(Z0);if(j===-1)return;let Q=J.indexOf(v0,j);if(Q===-1)return;let Z=J.slice(j+Z0.length,Q).trim();return Z.length>0?Z:void 0}function u1(J,j){let Q=[...J.split(v),...j.split(v)].map((Z)=>Z.trim()).filter((Z)=>Z.length>0);return Array.from(new Set(Q)).join(v)}function p1(J,j=u0){return new Promise((Q)=>{let Z=m1(J,b1),$=H1(J,Z.args,{argv0:Z.argv0,stdio:["ignore","pipe","ignore"],detached:!0}),X="",z=0,N=()=>{try{if($.pid)process.kill(-$.pid,"SIGKILL")}catch{$.kill("SIGKILL")}},Y=!1,W=(F)=>{if(Y)return;Y=!0,clearTimeout(V),$.stdout?.destroy(),N(),Q(F)},V=setTimeout(()=>{try{if($.pid)process.kill(-$.pid,"SIGKILL")}catch{$.kill("SIGKILL")}W(void 0)},j);$.stdout?.on("data",(F)=>{if(Y)return;if(z+=F.length,z>65536){W(void 0);return}X+=F.toString("utf8")}),$.on("error",()=>W(void 0)),$.on("close",()=>W(v1(X)))})}async function l0(J){let j=J?.platform??process.platform,Q=J?.env??process.env;if(j==="win32")return{status:"skipped",reason:"windows"};if(Q[m0]?.trim())return{status:"skipped",reason:m0};let Z=J?.userShell??h1(j,Q),$=J?.fallbackShell??p0(j),X=J?.timeoutMs??u0,z=Z===$?[[Z,X]]:[[Z,X],[$,X/2]];for(let[N,Y]of z){let W=await p1(N,Y);if(!W)continue;let V=u1(W,Q.PATH??"");return Q.PATH=V,{status:"applied",pathEntries:V.split(v).length,shell:N}}return{status:"failed",shell:Z}}var c0={readHubDiscovery:B,clearHubDiscoveryIfOwned:O0,probeProcess:(J)=>{process.kill(J,0)},requestHubShutdown:b,ensureDetachedHubServer:k,claimHubDaemonProcess:c1,loadHubDaemon:()=>import("@cerebriline/core/hub/daemon-entry"),ensureLoginShellPath:l0,setHomeDirIfUnset:i1,homeDir:l1,cwd:()=>process.cwd(),env:process.env,writeOutput:(J)=>process.stdout.write(J)};function i0(J,j){let Q=J.indexOf(j);return(Q>=0?J[Q+1]:void 0)?.trim()||void 0}function n0(J,j){let Q=i0(J,"--discovery-path");if(!Q)throw Error("--discovery-path is required for remote Hub management");return j.env.CLINE_HUB_DISCOVERY_PATH=Q,Q}async function n1(J=process.argv,j=c0){j.setHomeDirIfUnset(j.homeDir()),await j.ensureLoginShellPath();let Q=i0(J,"--cwd")??j.cwd();n0(J,j);let Z=await j.ensureDetachedHubServer(Q,{host:"127.0.0.1",port:0,pathname:"/hub",allowPortFallback:!0,manageConnectors:!1});j.writeOutput(`${JSON.stringify({...Z,cwd:Q,platform:process.platform,arch:process.arch})}
4
- `)}async function s0(J=process.argv,j=c0){if(J.includes("--remote-hub-stop")){let Q=n0(J,j),Z=await j.readHubDiscovery(Q);if(Z&&typeof Z.pid==="number"&&Number.isInteger(Z.pid)&&Z.pid>0)try{j.probeProcess(Z.pid)}catch($){if($?.code==="ESRCH")return await j.clearHubDiscoveryIfOwned(Q,Z.hubId),!0}if(Z&&!await j.requestHubShutdown(Z.url,Z.authToken))throw Error("Remote Hub shutdown failed");return!0}if(J.includes("--remote-hub-ensure"))return await n1(J,j),!0;if(j.claimHubDaemonProcess())return await j.loadHubDaemon(),!0;return!1}(async()=>{if(!await s0())throw Error("A remote helper command is required")})().catch((J)=>{process.stderr.write(`${J instanceof Error?J.message:String(J)}
1
+ import{homedir as $n}from"node:os";import{claimHubDaemonProcess as jn}from"@cerebriline/shared";import{setHomeDirIfUnset as Gn}from"@cerebriline/shared/storage";import{createSessionId as gn,ensureLoopbackProxyBypass as Ue,isHubProtocolCompatible as bn,resolveClineBuildEnv as yn,resolveHubCommandTimeoutMs as wn}from"@cerebriline/shared";import vn from"ws";var P={name:"@cerebriline/core",description:"Cline Core SDK for Node Runtime",version:"0.0.92",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:{"@cerebriline/agents":"workspace:*","@cerebriline/llms":"workspace:*","@cerebriline/shared":"workspace:*","@joplin/turndown-plugin-gfm":"1.0.68","@lingo-reader/epub-parser":"0.4.6","@lingo-reader/fb2-parser":"0.4.6","@lingo-reader/mobi-parser":"0.4.6","@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","@tesseract.js-data/eng":"1.0.0",cfb:"1.2.2","fast-png":"8.0.0",jiti:"^2.7.0",nanoid:"^5.1.7","node-machine-id":"^1.1.12",officeparser:"8.0.0","pdfjs-dist":"6.2.108","simple-git":"3.36.0","tesseract.js":"7.0.0","tree-sitter-wasms":"^0.1.12",turndown:"7.2.0","web-tree-sitter":"^0.25.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/turndown":"^5.0.6","@types/ws":"^8.18.1","posthog-node":"^5.8.0"},engines:{node:">=22"},files:["assets","dist","scripts/document-reader-assets.mjs","!dist/**/*.d.ts.map"]};var ie="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 Lt,mkdirSync as Ut,openSync as Mt,readFileSync as Bt,unlinkSync as Nt}from"node:fs";import{basename as Vt,dirname as Ft,join as Wt}from"node:path";import{fileURLToPath as $t}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as jt,isBunEmbeddedModulePath as Gt,isHubDaemonProcess as qt,resolveClineBuildEnv as Ee,withResolvedClineBuildEnv as Kt}from"@cerebriline/shared";import{createHash as Xe,randomBytes as Ze}from"node:crypto";import{mkdir as j,open as se,readFile as le,rename as Qe,rm as I,writeFile as et}from"node:fs/promises";import{dirname as pe,join as G}from"node:path";import{ensureLoopbackProxyBypass as tt,isHubProtocolCompatible as nt}from"@cerebriline/shared";import{resolveClineDataDir as H,resolveClineDir as eo}from"@cerebriline/shared/storage";var ot="CLINE_HUB_DISCOVERY_PATH",rt="CLINE_HUB_BUILD_ID",it="CLINE_HUB_BUILD_EPOCH_MS",st=30000,at=15000,ae=100;function ct(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function ut(e){return Xe("sha256").update(e).digest("hex").slice(0,12)}function dt(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 ce(e){return new Promise((t)=>setTimeout(t,e))}function lt(e){return`${e}.lock`}async function pt(e){try{let t=JSON.parse(await le(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 W(e){await I(e,{recursive:!0,force:!0}).catch(()=>{return})}function k(){let e=process.env[rt]?.trim();if(e)return e;return"sdk-v1-8c78914f755a47c295196668265818413b462a97b1a4cf92310a0d4a34dfad90".trim()||`source-${String(P.version)}`}function ft(){let e=Number(process.env[it]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1791961825128)?1791961825128:void 0}function x(e,t=k()){let n=nt(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 ue(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0}function de(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 mt(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 fe(e,t){let n=e.buildId?.trim(),o=t.buildId?.trim();if(n&&o&&n===o)return 0;let r=ue(e.buildEpochMs),i=ue(t.buildEpochMs);if(r!==void 0&&i!==void 0&&r!==i)return r<i?-1:1;let s=de(e.coreVersion),u=de(t.coreVersion);if(s&&u){let c=mt(s,u);if(c!==0)return c}if(n&&o&&n!==o)return n<o?-1:1;return 0}function me(){return{buildId:k(),buildEpochMs:ft(),coreVersion:String(P.version)}}function D(e,t){let n=t?.self??me(),o=x(e,n.buildId??"");if(o.compatible)return!0;if(o.reason!=="build_mismatch"&&o.reason!=="missing_build")return!1;return fe(n,e)<=0}function he(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${ut(e)}`,n=process.env[ot]?.trim()||G(H(),"locks","hub","owners",`${ct(t)}.json`);return{ownerId:t,discoveryPath:n}}async function b(e){try{let t=JSON.parse(await le(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 ge(e,t,n){await q(e,async()=>{let o=pe(e);await j(o,{recursive:!0});let r=`${e}.${process.pid}.${Ze(6).toString("hex")}.tmp`,i;try{i=await se(r,"wx",384),await i.writeFile(`${JSON.stringify(t,null,2)}
2
+ `,{encoding:"utf8"}),await i.sync(),await i.close(),i=void 0,n?.beforePublish?.(),await Qe(r,e);let s;try{s=await se(o,"r"),await s.sync()}catch{}finally{await s?.close().catch(()=>{return})}}catch(s){throw await i?.close().catch(()=>{return}),await I(r,{force:!0}).catch(()=>{return}),s}})}async function C(e){await q(e,async()=>{await I(e,{force:!0}).catch(()=>{return})})}async function be(e,t){return await q(e,async()=>{if((await b(e))?.hubId!==t)return!1;return await I(e,{force:!0}),!0})}async function ye(e,t,n){let o=lt(e);await j(pe(o),{recursive:!0});let r=Date.now()+at;while(!0){try{await j(o,{recursive:!1})}catch(i){if((i instanceof Error&&"code"in i?String(i.code):"")!=="EEXIST")throw i;let u=await pt(o);if(!u){if(Date.now()>=r){await W(o);continue}await ce(ae);continue}let c=Date.now()-Date.parse(u.acquiredAt);if(!dt(u.pid)||c>st){await W(o);continue}if(Date.now()>=r)throw Error(`Timed out waiting for hub ${t} lock ${o}`);await ce(ae);continue}try{return await et(G(o,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
3
+ `,"utf8"),await n()}finally{await W(o)}}}function q(e,t){return ye(`${e}.mutation`,"discovery mutation",t)}function we(e,t){return ye(e,"startup",t)}async function A(e,t){tt();try{let n=await fetch(t?.authToken?ht(e):Se(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 ve(e,t,n="/hub"){return new URL(`ws://${e}:${t}${n}`).toString()}function Se(e){let t=new URL(e);return t.protocol=t.protocol==="wss:"?"https:":"http:",t.pathname="/health",t.search="",t.toString()}function ht(e){let t=new URL(Se(e));return t.pathname="/status",t.toString()}import{CLINE_HUB_DEV_PORT as gt,CLINE_HUB_PORT as bt,resolveClineBuildEnv as yt}from"@cerebriline/shared";var wt="CLINE_HUB_HOST",vt="CLINE_HUB_PORT",St="CLINE_HUB_PATHNAME",kt="127.0.0.1",Ct=bt,Pt="/hub";function ke(e){return yt(e)==="development"?gt:Ct}function Ht(e={}){return(e.env??process.env)[wt]?.trim()||kt}function _t(e={}){let n=(e.env??process.env)[vt]?.trim();if(!n)return ke(e);let o=Number.parseInt(n,10);if(!Number.isInteger(o)||o<1||o>65535)return ke(e);return o}function Rt(e={}){return(e.env??process.env)[St]?.trim()||Pt}function Ce(e={},t={}){return{host:e.host??Ht(t),port:e.port??_t(t),pathname:e.pathname??Rt(t)}}import{join as It}from"node:path";import{execFile as Tt}from"node:child_process";import{promisify as Et}from"node:util";import{processWorkspaceInfo as co}from"@cerebriline/shared";import lo from"simple-git";var po=Et(Tt);var xt="shared:cline",Dt="CLINE_HUB_DISCOVERY_PATH",At="hub-production";function _(e=xt){return he(`${e}@${k()}`)}function O(){return{ownerId:At,discoveryPath:process.env[Dt]?.trim()||It(H(),"locks","hub","production.json")}}var Pe=15000,Jt=200,He=3000,zt=100,Yt=[100,250,500,1000,2000],Xt="--cline-hub-daemon",Zt=3,Qt=60000,_e=new Map;function en(e,t=Date.now()){let n=_e.get(e);if(!n||t-n.windowStartedAt>Qt)return _e.set(e,{count:1,windowStartedAt:t}),!0;return n.count+=1,n.count<=Zt}function tn(e){return[...e.host?["--host",e.host]:[],...typeof e.port==="number"?["--port",String(e.port)]:[],...e.pathname?["--pathname",e.pathname]:[]]}function nn(){try{let e=Wt(H(),"logs","hub-daemon.log");return Ut(Ft(e),{recursive:!0}),{fd:Mt(e,"a"),logPath:e}}catch{return}}function on(){return Ee()==="production"?O():_()}function R(e){return D(e)}function rn(e){try{let t=JSON.parse(Bt(`${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 K(e){try{Nt(`${e}.superseded`)}catch{}}function Re(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 A(e,{authToken:t})}catch{return}}async function Te(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(!en(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 Te(e.url,He);if(!n&&e.pid&&sn(e.pid)){try{process.kill(e.pid,"SIGTERM")}catch{}n=await Te(e.url,He)}if(n)await C(t).catch(()=>{return});return n}function sn(e){try{return process.kill(e,0),!0}catch(t){return t?.code==="EPERM"}}async function an(e){try{return(await Y(e.url,e.authToken)).activeSessionCount>0}catch{return!1}}async function J(e,t){if(R(e))return"reusable";let n=await E(e.url,e.authToken,"retired by newer install").catch(()=>!1);if(await an(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 cn(e){if(Ee()!=="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 un(){let e=import.meta.url.endsWith(".ts")?"ts":"js";return $t(new URL(`./entry.${e}`,import.meta.url))}function dn(e,t){if(Gt(e))return[Xt];return[...t&&e.toLowerCase().endsWith(".ts")?["--conditions=development"]:[],e]}function ln(e,t){let n=un(),o=process.execPath?.trim();if(!o)throw Error("unable to resolve runtime executable for hub daemon");let r=Vt(o).toLowerCase().includes("bun"),i=dn(n,r);return{launcher:o,args:[...i,"--cwd",e,...tn(t),...t.manageConnectors===!1?["--no-connectors"]:[]],cwd:e,env:{...Kt(process.env),CLINE_NO_INTERACTIVE:"1",[jt]:"1"}}}function pn(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 fn(e,t={}){if(qt())return;let n=ln(e,t),o=nn();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)Lt(o.fd)}}async function mn(e,t={}){for(let n=0;;n++)try{fn(e,t);return}catch(o){let r=Yt[n];if(!pn(o)||r===void 0)throw o;await new Promise((i)=>setTimeout(i,r))}}async function hn(e,t,n={}){let o=n.host!==void 0||n.port!==void 0||n.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),r=Ce(n),i=ve(r.host,r.port,r.pathname),s=(l)=>{if(!o)U(l.url,l.authToken);else Ie(l.url,l.authToken);return l};await cn(e).catch(()=>{return});let u=await b(e.discoveryPath),c=u?.url?void 0:rn(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 K(e.discoveryPath),s({url:p.url,authToken:l});if(p?.url){if(await J({...p,authToken:l},e.discoveryPath)==="deferred_busy"&&await y(p.url,{authToken:l}))return s({url:p.url,authToken:l})}else await C(e.discoveryPath).catch(()=>{return})}}let a=await T(i);if(a?.url){let l=Re(a,u??c,i);if(R(a)){let h=[a.authToken,u?.authToken,c?.authToken].filter((S)=>typeof S==="string"&&S.trim().length>0);for(let S of h){if(!await y(a.url,{authToken:S}))continue;let ze={hubId:a.hubId??`repaired-${a.port}`,protocolVersion:a.protocolVersion,minClientProtocolVersion:a.minClientProtocolVersion,maxClientProtocolVersion:a.maxClientProtocolVersion,capabilities:a.capabilities,coreVersion:a.coreVersion,buildId:a.buildId,authToken:S,host:a.host,port:a.port,url:a.url,pid:a.pid??u?.pid??c?.pid,startedAt:a.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await ge(e.discoveryPath,ze)}catch{}return K(e.discoveryPath),s({url:a.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 J(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(a.url,{authToken:h}))return s({url:a.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 mn(t,{...g,manageConnectors:n.manageConnectors});let w=Date.now()+Pe;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 K(e.discoveryPath),s({url:h.url,authToken:l.authToken})}let p=await T(i);if(p?.url&&!R(p)){let h=Re(p,l??c,i),v=await J(h,e.discoveryPath);if(v==="deferred_busy"&&l?.authToken&&await y(p.url,{authToken:l.authToken}))return s({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,Jt))}throw Error(`Timed out after ${Pe}ms waiting for detached hub startup.`)}async function L(e,t={}){let n=on();return await we(n.discoveryPath,async()=>hn(n,e,t))}function Sn(){return yn()==="production"?O():_()}function kn(){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 Me(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 Me(e.data);return String(e)}function Cn(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 xe(e){let t=e,n=Cn(t.reason);return new f("hub_connection_closed",t.code||n?`Hub connection closed (code=${t.code??0}${n?`, reason=${n}`:""})`:Z,{closeCode:t.code,closeReason:n||void 0})}function De(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 X="*",B=8000,Pn="cline-hub-auth.",te=new Map,Be=new Set,Hn=3000;var Z="Hub connection closed",_n=250,Rn=5000,Ae=0.5;class f extends Error{code;details;constructor(e,t,n){super(t);this.code=e;this.details=n;this.name="HubTransportError"}}function Tn(e){return e instanceof f}class Q extends Error{command;code;constructor(e,t,n){super(n);this.command=e;this.code=t;this.name="HubCommandError"}}function ne(e,t={}){let n=e.searchParams.get("authToken")?.trim();if(e.searchParams.delete("authToken"),n)return n;if(t.skipRegistry)return;let o=N(e.toString());return o?te.get(o):void 0}function En(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 N(e){if(!En(e))return;let t=new URL(Ne(e));return t.search="",t.hash="",t.toString()}function Oe(e){let t=N(e);return!!t&&Be.has(t)}function U(e,t){let n=N(e);if(n){if(Be.add(n),t?.trim())te.set(n,t)}return e}function Ie(e,t){let n=N(e);if(n&&t?.trim())te.set(n,t)}class oe{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",Z);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()||ne(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(s)=>{if(r=s,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(P.version),pid:process.pid},workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}},void 0,void 0,!1),n!==this.connectGeneration||this.closedByClient){try{s.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(s){if(this.connectPromise===i)this.connectPromise=void 0;if(r&&this.socket===r){this.lastCloseError=De(s,e),this.registered=!1,this.sawSocketClose=!1,this.socket=void 0;try{r.close()}catch{}}if(!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect();throw s}}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,a)=>{c=setTimeout(()=>{a(new f("hub_connect_timeout",`Timed out resolving hub connection headers after ${B}ms`))},B)})])}catch(d){let a=d instanceof f?d:new f("hub_connect_failed",d instanceof Error?d.message:String(d));if(n===this.connectGeneration)this.lastCloseError=a;throw a}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 vn(e.toString(),{headers:{...r}}):new(kn())(e.toString(),t?[`${Pn}${t}`]:void 0);this.socket=i;let s=!1,u=new Promise((c,d)=>{let a=!1,m=setTimeout(()=>{if(a)return;a=!0,s=!0;let g=new f("hub_connect_timeout",`Timed out connecting to hub after ${B}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)},B);i.addEventListener("open",()=>{if(a)return;a=!0,clearTimeout(m),c()}),i.addEventListener("error",(g)=>{if(a)return;a=!0,clearTimeout(m);let w=De(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(a)return;a=!0,clearTimeout(m);let w=s?this.lastCloseError:xe(g);if(this.socket===i){if(!s)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(Me(c)))}),i.addEventListener("close",(c)=>{if(this.socket!==i)return;if(!s)this.lastCloseError=xe(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(s){if(!i||r>=1||!await this.recoverLocalHubTransport(s))throw s;r+=1}}async commandOnce(e,t,n,o,r=!0){if(r)await this.connect();o?.beforeDispatch?.();let i=gn("hubreq_");o?.onDispatch?.(i);let s=wn(e,o?.timeoutMs),u=new Promise((d,a)=>{let m=s===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(i))return;a(new Q(e,"hub_command_timeout",`Hub command ${e} timed out after ${s}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.`))},s);this.pendingReplies.set(i,{resolve:(g)=>{if(m)clearTimeout(m);d(g)},reject:(g)=>{if(m)clearTimeout(m);a(g)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:e,requestId:i,clientId:this.clientId,sessionId:n,timeoutMs:s,payload:t}})}catch(d){throw this.pendingReplies.delete(i),d}let c=await u;if(!c.ok){if(c.error?.code===ie){let d=n??(typeof t?.sessionId==="string"?t.sessionId:void 0);throw new F(d,c.error.message)}throw new Q(e,c.error?.code,c.error?.message??`Hub command ${e} failed`)}return c}async recoverLocalHubTransport(e){if(!Oe(this.currentUrl)||!Tn(e))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let t=await Le({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(_n*2**this.reconnectAttempt,Rn),t=Math.round(e*(1-Ae)+Math.random()*e*Ae);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 Le({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",Z);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??X}subscriptionSessionIdFromKey(e){return e===X?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[X,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 oe({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 ee(e,t){let n=Ne(e),o=await A(n,{authToken:t?.authToken});if(!o)return{status:"unreachable",url:n};if(t?.requireCurrentBuild){let r=k(),i=x(o,r);if(!i.compatible&&!D(o))return{status:i.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:n}}else if(!bn(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 In(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 s of i){let u=s&&typeof s==="object"?s.clientId:void 0;if(typeof u==="string"&&u.trim())o.add(u)}}return{activeSessionCount:n,participantClientCount:o.size}}async function Y(e,t,n){let o=new oe({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 In(r.payload)}finally{await o.dispose().catch(()=>{return})}}async function xn(e,t,n){try{return(await Y(e,t,n)).activeSessionCount===0}catch{return!1}}async function Dn(e,t){let n=`${e.discoveryPath}.superseded`,o=await b(n);if(!o?.url||!o.authToken)return;let r=await ee(o.url,{authToken:o.authToken});if(r.status!=="compatible")return;if(await xn(r.url,o.authToken,t))return;return U(r.url,o.authToken)}async function An(e={}){if(e.endpoint?.trim()){let r=await ee(e.endpoint);return r.status==="compatible"?r.url:void 0}let t=Sn(),n=await b(t.discoveryPath);if(!n?.url)return await Dn(t,e);let o=await ee(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 Le(e={}){let t=await An(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){Ue();let r=new URL(e),i=t?.trim()||ne(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){Ue();let n=new URL(e),o=t?.trim()||ne(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 Ln}from"node:os";import{basename as Un,delimiter as V}from"node:path";var re="__CLINE_SIDECAR_PATH_START__",Fe="__CLINE_SIDECAR_PATH_END__",We=5000,Mn=`/bin/sh -c 'printf "%s%s%s" "${re}" "$PATH" "${Fe}"'`,Ve="CLINE_SIDECAR_SKIP_SHELL_PATH";function $e(e){return e==="darwin"?"/bin/zsh":"/bin/bash"}function Bn(e,t){try{let n=Ln().shell?.trim();if(n)return n}catch{}return t.SHELL?.trim()||$e(e)}function Nn(e,t){let n=Un(e);if(n==="csh"||n==="tcsh")return{args:["-c",t],argv0:`-${n}`};return{args:["-i","-l","-c",t]}}function Vn(e){let t=e.indexOf(re);if(t===-1)return;let n=e.indexOf(Fe,t);if(n===-1)return;let o=e.slice(t+re.length,n).trim();return o.length>0?o:void 0}function Fn(e,t){let n=[...e.split(V),...t.split(V)].map((o)=>o.trim()).filter((o)=>o.length>0);return Array.from(new Set(n)).join(V)}function Wn(e,t=We){return new Promise((n)=>{let o=Nn(e,Mn),r=On(e,o.args,{argv0:o.argv0,stdio:["ignore","pipe","ignore"],detached:!0}),i="",s=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(a),r.stdout?.destroy(),u(),n(m)},a=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(s+=m.length,s>65536){d(void 0);return}i+=m.toString("utf8")}),r.on("error",()=>d(void 0)),r.on("close",()=>d(Vn(i)))})}async function je(e){let t=e?.platform??process.platform,n=e?.env??process.env;if(t==="win32")return{status:"skipped",reason:"windows"};if(n[Ve]?.trim())return{status:"skipped",reason:Ve};let o=e?.userShell??Bn(t,n),r=e?.fallbackShell??$e(t),i=e?.timeoutMs??We,s=o===r?[[o,i]]:[[o,i],[r,i/2]];for(let[u,c]of s){let d=await Wn(u,c);if(!d)continue;let a=Fn(d,n.PATH??"");return n.PATH=a,{status:"applied",pathEntries:a.split(V).length,shell:u}}return{status:"failed",shell:o}}var Ge={readHubDiscovery:b,clearHubDiscoveryIfOwned:be,probeProcess:(e)=>{process.kill(e,0)},requestHubShutdown:M,ensureDetachedHubServer:L,claimHubDaemonProcess:jn,loadHubDaemon:()=>import("@cerebriline/core/hub/daemon-entry"),ensureLoginShellPath:je,setHomeDirIfUnset:Gn,homeDir:$n,cwd:()=>process.cwd(),env:process.env,writeOutput:(e)=>process.stdout.write(e)};function qe(e,t){let n=e.indexOf(t);return(n>=0?e[n+1]:void 0)?.trim()||void 0}function Ke(e,t){let n=qe(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 qn(e=process.argv,t=Ge){t.setHomeDirIfUnset(t.homeDir()),await t.ensureLoginShellPath();let n=qe(e,"--cwd")??t.cwd();Ke(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
+ `)}async function Je(e=process.argv,t=Ge){if(e.includes("--remote-hub-stop")){let n=Ke(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 qn(e,t),!0;if(t.claimHubDaemonProcess())return await t.loadHubDaemon(),!0;return!1}(async()=>{if(!await Je())throw Error("A remote helper command is required")})().catch((e)=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}
5
5
  `),process.exitCode=1});
@@ -1,4 +1,4 @@
1
- import{createRequire as d0}from"node:module";var t0=d0(import.meta.url);import{homedir as p1}from"node:os";import{claimHubDaemonProcess as l1}from"@cerebriline/shared";import{setHomeDirIfUnset as c1}from"@cerebriline/shared/storage";import{createSessionId as L1,ensureLoopbackProxyBypass as k0,isHubProtocolCompatible as O1,resolveClineBuildEnv as B1,resolveHubCommandTimeoutMs as A1}from"@cerebriline/shared";import f1 from"ws";var x={name:"@cerebriline/core",description:"Cline Core SDK for Node Runtime",version:"0.0.92",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:{"@cerebriline/agents":"workspace:*","@cerebriline/llms":"workspace:*","@cerebriline/shared":"workspace:*","@joplin/turndown-plugin-gfm":"1.0.68","@lingo-reader/epub-parser":"0.4.6","@lingo-reader/fb2-parser":"0.4.6","@lingo-reader/mobi-parser":"0.4.6","@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","@tesseract.js-data/eng":"1.0.0",cfb:"1.2.2","fast-png":"8.0.0",jiti:"^2.7.0",nanoid:"^5.1.7","node-machine-id":"^1.1.12",officeparser:"8.0.0","pdfjs-dist":"6.2.108","simple-git":"3.36.0","tesseract.js":"7.0.0","tree-sitter-wasms":"^0.1.12",turndown:"7.2.0","web-tree-sitter":"^0.25.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/turndown":"^5.0.6","@types/ws":"^8.18.1","posthog-node":"^5.8.0"},engines:{node:">=22"},files:["assets","dist","scripts/document-reader-assets.mjs","!dist/**/*.d.ts.map"]};var $0="session_not_found";class u extends Error{sessionId;code="session_not_found";constructor(J,j){super(j??(J?`session not found: ${J}`:"session not found"));this.sessionId=J;this.name="SessionNotFoundError"}}import{spawn as H2}from"node:child_process";import{closeSync as k2,mkdirSync as y2,openSync as b2,readFileSync as h2,unlinkSync as m2}from"node:fs";import{basename as v2,dirname as u2,join as p2}from"node:path";import{fileURLToPath as l2}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as c2,isBunEmbeddedModulePath as i2,isHubDaemonProcess as n2,resolveClineBuildEnv as S0,withResolvedClineBuildEnv as s2}from"@cerebriline/shared";import{createHash as o0,randomBytes as r0}from"node:crypto";import{mkdir as l,open as X0,readFile as W0,rename as e0,rm as I,writeFile as J2}from"node:fs/promises";import{dirname as G0,join as c}from"node:path";import{ensureLoopbackProxyBypass as j2,isHubProtocolCompatible as Q2}from"@cerebriline/shared";import{resolveClineDataDir as D,resolveClineDir as j6}from"@cerebriline/shared/storage";var Z2="CLINE_HUB_DISCOVERY_PATH",$2="CLINE_HUB_BUILD_ID",X2="CLINE_HUB_BUILD_EPOCH_MS",z2=30000,V2=15000,z0=100;function Y2(J){return J.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function N2(J){return o0("sha256").update(J).digest("hex").slice(0,12)}function W2(J){if(!Number.isInteger(J)||!J||J<=0)return!1;try{return process.kill(J,0),!0}catch(j){return j instanceof Error&&"code"in j?String(j.code)==="EPERM":!1}}function V0(J){return new Promise((j)=>setTimeout(j,J))}function G2(J){return`${J}.lock`}async function K2(J){try{let j=JSON.parse(await W0(c(J,"owner.json"),"utf8"));if(typeof j.pid!=="number"||typeof j.acquiredAt!=="string")return;return{pid:j.pid,acquiredAt:j.acquiredAt}}catch{return}}async function p(J){await I(J,{recursive:!0,force:!0}).catch(()=>{return})}function C(){let J=process.env[$2]?.trim();if(J)return J;return"sdk-v1-60a66114367f2ef4b034ec68043e8c751e15bcf46da4f62bffd40c3b75ccf1fc".trim()||`source-${String(x.version)}`}function q2(){let J=Number(process.env[X2]);if(Number.isFinite(J)&&J>0)return J;return Number.isFinite(1791878691346)?1791878691346:void 0}function w(J,j=C()){let Q=Q2(J);if(!Q.compatible)return Q;let Z=J.buildId?.trim();if(!Z)return{compatible:!1,reason:"missing_build"};if(Z!==j)return{compatible:!1,reason:"build_mismatch"};return{compatible:!0}}function Y0(J){return typeof J==="number"&&Number.isFinite(J)&&J>0?J:void 0}function N0(J){let j=J?.trim().split(/[-+]/,1)[0];if(!j)return;let Q=j.split(".").map((Z)=>Number(Z));if(Q.length===0||Q.some((Z)=>!Number.isInteger(Z)||Z<0))return;return Q}function F2(J,j){for(let Q=0;Q<Math.max(J.length,j.length);Q++){let Z=J[Q]??0,$=j[Q]??0;if(Z!==$)return Z<$?-1:1}return 0}function K0(J,j){let Q=J.buildId?.trim(),Z=j.buildId?.trim();if(Q&&Z&&Q===Z)return 0;let $=Y0(J.buildEpochMs),X=Y0(j.buildEpochMs);if($!==void 0&&X!==void 0&&$!==X)return $<X?-1:1;let z=N0(J.coreVersion),N=N0(j.coreVersion);if(z&&N){let Y=F2(z,N);if(Y!==0)return Y}if(Q&&Z&&Q!==Z)return Q<Z?-1:1;return 0}function q0(){return{buildId:C(),buildEpochMs:q2(),coreVersion:String(x.version)}}function P(J,j){let Q=j?.self??q0(),Z=w(J,Q.buildId??"");if(Z.compatible)return!0;if(Z.reason!=="build_mismatch"&&Z.reason!=="missing_build")return!1;return K0(Q,J)<=0}function F0(J=process.argv[1]?.trim()||process.cwd()){let j=`hub-${N2(J)}`,Q=process.env[Z2]?.trim()||c(D(),"locks","hub","owners",`${Y2(j)}.json`);return{ownerId:j,discoveryPath:Q}}async function B(J){try{let j=JSON.parse(await W0(J,"utf8"));if(typeof j.hubId!=="string"||typeof j.protocolVersion!=="string"||typeof j.authToken!=="string"||typeof j.host!=="string"||typeof j.port!=="number"||typeof j.url!=="string"||typeof j.startedAt!=="string"||typeof j.updatedAt!=="string")return;return{hubId:j.hubId,protocolVersion:j.protocolVersion,minClientProtocolVersion:typeof j.minClientProtocolVersion==="string"?j.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof j.maxClientProtocolVersion==="string"?j.maxClientProtocolVersion:void 0,capabilities:Array.isArray(j.capabilities)?j.capabilities.filter((Q)=>typeof Q==="string"):void 0,coreVersion:typeof j.coreVersion==="string"?j.coreVersion:void 0,buildId:typeof j.buildId==="string"?j.buildId:void 0,buildEpochMs:typeof j.buildEpochMs==="number"?j.buildEpochMs:void 0,authToken:j.authToken,host:j.host,port:j.port,url:j.url,pid:typeof j.pid==="number"?j.pid:void 0,startedAt:j.startedAt,updatedAt:j.updatedAt}}catch{return}}async function L0(J,j,Q){await i(J,async()=>{let Z=G0(J);await l(Z,{recursive:!0});let $=`${J}.${process.pid}.${r0(6).toString("hex")}.tmp`,X;try{X=await X0($,"wx",384),await X.writeFile(`${JSON.stringify(j,null,2)}
2
- `,{encoding:"utf8"}),await X.sync(),await X.close(),X=void 0,Q?.beforePublish?.(),await e0($,J);let z;try{z=await X0(Z,"r"),await z.sync()}catch{}finally{await z?.close().catch(()=>{return})}}catch(z){throw await X?.close().catch(()=>{return}),await I($,{force:!0}).catch(()=>{return}),z}})}async function _(J){await i(J,async()=>{await I(J,{force:!0}).catch(()=>{return})})}async function O0(J,j){return await i(J,async()=>{if((await B(J))?.hubId!==j)return!1;return await I(J,{force:!0}),!0})}async function B0(J,j,Q){let Z=G2(J);await l(G0(Z),{recursive:!0});let $=Date.now()+V2;while(!0){try{await l(Z,{recursive:!1})}catch(X){if((X instanceof Error&&"code"in X?String(X.code):"")!=="EEXIST")throw X;let N=await K2(Z);if(!N){if(Date.now()>=$){await p(Z);continue}await V0(z0);continue}let Y=Date.now()-Date.parse(N.acquiredAt);if(!W2(N.pid)||Y>z2){await p(Z);continue}if(Date.now()>=$)throw Error(`Timed out waiting for hub ${j} lock ${Z}`);await V0(z0);continue}try{return await J2(c(Z,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
3
- `,"utf8"),await Q()}finally{await p(Z)}}}function i(J,j){return B0(`${J}.mutation`,"discovery mutation",j)}function A0(J,j){return B0(J,"startup",j)}async function T(J,j){j2();try{let Q=await fetch(j?.authToken?L2(J):U0(J),{headers:j?.authToken?{authorization:`Bearer ${j.authToken}`}:void 0,signal:j?.signal});if(!Q.ok)return;let Z=await Q.json();if(typeof Z.protocolVersion!=="string"||typeof Z.host!=="string"||typeof Z.port!=="number"||typeof Z.url!=="string")return;return{protocolVersion:Z.protocolVersion,minClientProtocolVersion:typeof Z.minClientProtocolVersion==="string"?Z.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof Z.maxClientProtocolVersion==="string"?Z.maxClientProtocolVersion:void 0,capabilities:Array.isArray(Z.capabilities)?Z.capabilities.filter(($)=>typeof $==="string"):void 0,coreVersion:typeof Z.coreVersion==="string"?Z.coreVersion:void 0,buildId:typeof Z.buildId==="string"?Z.buildId:void 0,buildEpochMs:typeof Z.buildEpochMs==="number"?Z.buildEpochMs:void 0,host:Z.host,port:Z.port,url:Z.url,hubId:typeof Z.hubId==="string"?Z.hubId:void 0,authToken:typeof Z.authToken==="string"?Z.authToken:void 0,pid:typeof Z.pid==="number"?Z.pid:void 0,startedAt:typeof Z.startedAt==="string"?Z.startedAt:void 0,updatedAt:typeof Z.updatedAt==="string"?Z.updatedAt:void 0}}catch{return}}function f0(J,j,Q="/hub"){return new URL(`ws://${J}:${j}${Q}`).toString()}function U0(J){let j=new URL(J);return j.protocol=j.protocol==="wss:"?"https:":"http:",j.pathname="/health",j.search="",j.toString()}function L2(J){let j=new URL(U0(J));return j.pathname="/status",j.toString()}import{CLINE_HUB_DEV_PORT as O2,CLINE_HUB_PORT as B2,resolveClineBuildEnv as A2}from"@cerebriline/shared";var f2="CLINE_HUB_HOST",U2="CLINE_HUB_PORT",M2="CLINE_HUB_PATHNAME",x2="127.0.0.1",C2=B2,_2="/hub";function M0(J){return A2(J)==="development"?O2:C2}function D2(J={}){return(J.env??process.env)[f2]?.trim()||x2}function R2(J={}){let Q=(J.env??process.env)[U2]?.trim();if(!Q)return M0(J);let Z=Number.parseInt(Q,10);if(!Number.isInteger(Z)||Z<1||Z>65535)return M0(J);return Z}function E2(J={}){return(J.env??process.env)[M2]?.trim()||_2}function x0(J={},j={}){return{host:J.host??D2(j),port:J.port??R2(j),pathname:J.pathname??E2(j)}}import{join as I2}from"node:path";import{execFile as S2}from"node:child_process";import{promisify as g2}from"node:util";import{processWorkspaceInfo as N6}from"@cerebriline/shared";import G6 from"simple-git";var K6=g2(S2);var w2="shared:cline",P2="CLINE_HUB_DISCOVERY_PATH",T2="hub-production";function R(J=w2){return F0(`${J}@${C()}`)}function H(){return{ownerId:T2,discoveryPath:process.env[P2]?.trim()||I2(D(),"locks","hub","production.json")}}var C0=15000,d2=200,_0=3000,t2=100,a2=[100,250,500,1000,2000],o2="--cline-hub-daemon",r2=3,e2=60000,D0=new Map;function J1(J,j=Date.now()){let Q=D0.get(J);if(!Q||j-Q.windowStartedAt>e2)return D0.set(J,{count:1,windowStartedAt:j}),!0;return Q.count+=1,Q.count<=r2}function j1(J){return[...J.host?["--host",J.host]:[],...typeof J.port==="number"?["--port",String(J.port)]:[],...J.pathname?["--pathname",J.pathname]:[]]}function Q1(){try{let J=p2(D(),"logs","hub-daemon.log");return y2(u2(J),{recursive:!0}),{fd:b2(J,"a"),logPath:J}}catch{return}}function Z1(){return S0()==="production"?H():R()}function E(J){return P(J)}function $1(J){try{let j=JSON.parse(h2(`${J}.superseded`,"utf8"));return{url:typeof j.url==="string"?j.url:void 0,authToken:typeof j.authToken==="string"?j.authToken:void 0,pid:typeof j.pid==="number"?j.pid:void 0}}catch{return}}function n(J){try{m2(`${J}.superseded`)}catch{}}function R0(J,j,Q){if(!j||j.url!==Q)return J;return{...J,authToken:J.authToken??j.authToken,pid:J.pid??j.pid}}async function S(J,j){try{return await T(J,{authToken:j})}catch{return}}async function E0(J,j){let Q=Date.now()+j;while(Date.now()<Q){if(!(await S(J))?.url)return!0;await new Promise(($)=>setTimeout($,t2))}return!1}async function d(J,j){if(!J1(J.url))return!1;await g(J.url,J.authToken,"retired by newer install").catch(()=>!1),await b(J.url,J.authToken).catch(()=>!1);let Q=await E0(J.url,_0);if(!Q&&J.pid&&X1(J.pid)){try{process.kill(J.pid,"SIGTERM")}catch{}Q=await E0(J.url,_0)}if(Q)await _(j).catch(()=>{return});return Q}function X1(J){try{return process.kill(J,0),!0}catch(j){return j?.code==="EPERM"}}async function z1(J){try{return(await t(J.url,J.authToken)).activeSessionCount>0}catch{return!1}}async function s(J,j){if(E(J))return"reusable";let Q=await g(J.url,J.authToken,"retired by newer install").catch(()=>!1);if(await z1(J)){if(Q)await g(J.url,J.authToken,"hub retirement deferred",{off:!0}).catch(()=>!1);return"deferred_busy"}let Z=await d(J,j);if(!Z&&Q)await g(J.url,J.authToken,"hub retirement failed",{off:!0}).catch(()=>!1);return Z?"retired":"failed"}async function V1(J){if(S0()!=="production")return;let j=R();if(j.discoveryPath===J.discoveryPath)return;let Q=await B(j.discoveryPath);if(Q?.url)await d(Q,j.discoveryPath);else await _(j.discoveryPath).catch(()=>{return})}function Y1(){let J=import.meta.url.endsWith(".ts")?"ts":"js";return l2(new URL(`./entry.${J}`,import.meta.url))}function N1(J,j){if(i2(J))return[o2];return[...j&&J.toLowerCase().endsWith(".ts")?["--conditions=development"]:[],J]}function W1(J,j){let Q=Y1(),Z=process.execPath?.trim();if(!Z)throw Error("unable to resolve runtime executable for hub daemon");let $=v2(Z).toLowerCase().includes("bun"),X=N1(Q,$);return{launcher:Z,args:[...X,"--cwd",J,...j1(j),...j.manageConnectors===!1?["--no-connectors"]:[]],cwd:J,env:{...s2(process.env),CLINE_NO_INTERACTIVE:"1",[c2]:"1"}}}function G1(J){if(!J||typeof J!=="object")return!1;if(("code"in J?J.code:void 0)==="ETXTBSY")return!0;let Q="message"in J?J.message:void 0;return typeof Q==="string"&&Q.includes("ETXTBSY")}function K1(J,j={}){if(n2())return;let Q=W1(J,j),Z=Q1();try{H2(Q.launcher,Q.args,{detached:!0,stdio:Z?["ignore",Z.fd,Z.fd]:"ignore",env:Q.env,cwd:Q.cwd,windowsHide:!0}).unref()}finally{if(Z)k2(Z.fd)}}async function q1(J,j={}){for(let Q=0;;Q++)try{K1(J,j);return}catch(Z){let $=a2[Q];if(!G1(Z)||$===void 0)throw Z;await new Promise((X)=>setTimeout(X,$))}}async function F1(J,j,Q={}){let Z=Q.host!==void 0||Q.port!==void 0||Q.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),$=x0(Q),X=f0($.host,$.port,$.pathname),z=(G)=>{if(!Z)y(G.url,G.authToken);else g0(G.url,G.authToken);return G};await V1(J).catch(()=>{return});let N=await B(J.discoveryPath),Y=N?.url?void 0:$1(J.discoveryPath),W=!1;if(N?.url){let G=N.authToken;if(!G)W=!0,await d(N,J.discoveryPath);else{let K=await S(N.url,G);if(K?.url&&E(K)&&await A(K.url,{authToken:G}))return n(J.discoveryPath),z({url:K.url,authToken:G});if(K?.url){if(await s({...K,authToken:G},J.discoveryPath)==="deferred_busy"&&await A(K.url,{authToken:G}))return z({url:K.url,authToken:G})}else await _(J.discoveryPath).catch(()=>{return})}}let V=await S(X);if(V?.url){let G=R0(V,N??Y,X);if(E(V)){let L=[V.authToken,N?.authToken,Y?.authToken].filter((M)=>typeof M==="string"&&M.trim().length>0);for(let M of L){if(!await A(V.url,{authToken:M}))continue;let s0={hubId:V.hubId??`repaired-${V.port}`,protocolVersion:V.protocolVersion,minClientProtocolVersion:V.minClientProtocolVersion,maxClientProtocolVersion:V.maxClientProtocolVersion,capabilities:V.capabilities,coreVersion:V.coreVersion,buildId:V.buildId,authToken:M,host:V.host,port:V.port,url:V.url,pid:V.pid??N?.pid??Y?.pid,startedAt:V.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await L0(J.discoveryPath,s0)}catch{}return n(J.discoveryPath),z({url:V.url,authToken:M})}throw Error(`A compatible Cline Hub is already running at ${X}, but its discovery record is missing or unreadable and no usable auth token is available. Run 'cline doctor fix' to repair local hub discovery.${W?" 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 K=await s(G,J.discoveryPath);if(K==="deferred_busy"){for(let L of[G.authToken,N?.authToken].filter((U)=>typeof U==="string"&&U.trim().length>0))if(await A(V.url,{authToken:L}))return z({url:V.url,authToken:L});if(Q.allowPortFallback!==!0&&$.port!==0)throw Error(`An older Cline Hub is running at ${X} 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(K==="failed"&&Q.allowPortFallback!==!0&&$.port!==0)throw Error(`An incompatible Cline Hub is already running at ${X} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}let O=Q.allowPortFallback===!0&&$.port!==0?{...$,port:0}:$;await q1(j,{...O,manageConnectors:Q.manageConnectors});let f=Date.now()+C0;while(Date.now()<f){let G=await B(J.discoveryPath);if(G?.url&&G.authToken){let L=await S(G.url,G.authToken);if(L?.url&&E(L)&&await A(L.url,{authToken:G.authToken}))return n(J.discoveryPath),z({url:L.url,authToken:G.authToken})}let K=await S(X);if(K?.url&&!E(K)){let L=R0(K,G??Y,X),U=await s(L,J.discoveryPath);if(U==="deferred_busy"&&G?.authToken&&await A(K.url,{authToken:G.authToken}))return z({url:K.url,authToken:G.authToken});if(U==="failed"&&Q.allowPortFallback!==!0&&$.port!==0)throw Error(`An incompatible Cline Hub is still running at ${X} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}await new Promise((L)=>setTimeout(L,d2))}throw Error(`Timed out after ${C0}ms waiting for detached hub startup.`)}async function k(J,j={}){let Q=Z1();return await A0(Q.discoveryPath,async()=>F1(Q,J,j))}function U1(){return B1()==="production"?H():R()}function M1(){let J=globalThis.WebSocket;if(!J)throw Error("Global WebSocket is not available in this runtime. Node 22+ is required for hub mode.");return J}function y0(J){if(typeof J==="string")return J;if(J instanceof Uint8Array)return Buffer.from(J).toString();if(J instanceof ArrayBuffer)return Buffer.from(J).toString();if(Array.isArray(J))return Buffer.concat(J.map((j)=>Buffer.from(j))).toString();if(J&&typeof J==="object"&&"data"in J&&typeof J.data<"u")return y0(J.data);return String(J)}function x1(J){if(typeof J==="string")return J;if(J instanceof Uint8Array)return Buffer.from(J).toString("utf8");if(J instanceof ArrayBuffer)return Buffer.from(J).toString("utf8");return""}function I0(J){let j=J,Q=x1(j.reason);return new q("hub_connection_closed",j.code||Q?`Hub connection closed (code=${j.code??0}${Q?`, reason=${Q}`:""})`:o,{closeCode:j.code,closeReason:Q||void 0})}function w0(J,j){if(J instanceof q)return J;if(J instanceof Error)return new q("hub_connect_failed",J.message);if(J&&typeof J==="object"&&"error"in J&&J.error instanceof Error)return new q("hub_connect_failed",J.error.message);let Q=J&&typeof J==="object"&&"message"in J&&typeof J.message==="string"?J.message.trim():"";if(Q)return new q("hub_connect_failed",Q);let Z=J&&typeof J==="object"&&"type"in J&&typeof J.type==="string"?J.type.trim():"";return new q("hub_connect_failed",Z?`Failed to connect to hub at ${j.toString()} (${Z} event before socket open).`:`Failed to connect to hub at ${j.toString()}.`)}var a="*",h=8000,C1="cline-hub-auth.",J0=new Map,b0=new Set,_1=3000;var o="Hub connection closed",D1=250,R1=5000,P0=0.5;class q extends Error{code;details;constructor(J,j,Q){super(j);this.code=J;this.details=Q;this.name="HubTransportError"}}function E1(J){return J instanceof q}class r extends Error{command;code;constructor(J,j,Q){super(Q);this.command=J;this.code=j;this.name="HubCommandError"}}function j0(J,j={}){let Q=J.searchParams.get("authToken")?.trim();if(J.searchParams.delete("authToken"),Q)return Q;if(j.skipRegistry)return;let Z=m(J.toString());return Z?J0.get(Z):void 0}function S1(J){try{let Q=new URL(J).hostname.toLowerCase().replace(/^\[|\]$/g,"");return Q==="localhost"||Q==="127.0.0.1"||Q==="::1"}catch{return!1}}function m(J){if(!S1(J))return;let j=new URL(h0(J));return j.search="",j.hash="",j.toString()}function T0(J){let j=m(J);return!!j&&b0.has(j)}function y(J,j){let Q=m(J);if(Q){if(b0.add(Q),j?.trim())J0.set(Q,j)}return J}function g0(J,j){let Q=m(J);if(Q&&j?.trim())J0.set(Q,j)}class Q0{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 q("hub_connection_closed",o);sawSocketClose=!1;registered=!1;capabilities;constructor(J){this.options=J;if(J.authToken?.trim()&&J.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");this.clientId=J.clientId??`core-${Math.random().toString(36).slice(2,10)}-${Date.now().toString(36)}`,this.currentUrl=J.url,this.capabilities=[...J.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(J){if(this.capabilities=J.map((j)=>({...j})),!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 J=new URL(this.currentUrl),j=this.options.authToken?.trim()||j0(J,{skipRegistry:Boolean(this.options.resolveConnectionHeaders)});if(J.hash="",j&&this.options.resolveConnectionHeaders)throw Error("Hub connection headers cannot be combined with authToken authentication.");let Q=++this.connectGeneration,Z=this.openSocket(J,j,Q),$;this.connectPromise=Z.then(async(z)=>{if($=z,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(x.version),pid:process.pid},workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}},void 0,void 0,!1),Q!==this.connectGeneration||this.closedByClient){try{z.close()}catch{}throw this.lastCloseError}this.registered=!0;for(let N of this.subscriptionCounts.keys())this.sendSubscriptionFrame("stream.subscribe",this.subscriptionSessionIdFromKey(N));this.reconnectAttempt=0});let X=this.connectPromise;try{await X}catch(z){if(this.connectPromise===X)this.connectPromise=void 0;if($&&this.socket===$){this.lastCloseError=w0(z,J),this.registered=!1,this.sawSocketClose=!1,this.socket=void 0;try{$.close()}catch{}}if(!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect();throw z}}async openSocket(J,j,Q){let Z=this.options.resolveConnectionHeaders,$;if(Z){let Y;try{$=await Promise.race([Promise.resolve().then(()=>Z()),new Promise((W,V)=>{Y=setTimeout(()=>{V(new q("hub_connect_timeout",`Timed out resolving hub connection headers after ${h}ms`))},h)})])}catch(W){let V=W instanceof q?W:new q("hub_connect_failed",W instanceof Error?W.message:String(W));if(Q===this.connectGeneration)this.lastCloseError=V;throw V}finally{clearTimeout(Y)}}if(Q!==this.connectGeneration||this.closedByClient)throw this.lastCloseError;if($&&Object.keys($).some((Y)=>Y.toLowerCase()==="sec-websocket-protocol")){let Y=new q("hub_connect_failed","Hub connection headers cannot set Sec-WebSocket-Protocol.");if(Q===this.connectGeneration)this.lastCloseError=Y;throw Y}let X=$?new f1(J.toString(),{headers:{...$}}):new(M1())(J.toString(),j?[`${C1}${j}`]:void 0);this.socket=X;let z=!1,N=new Promise((Y,W)=>{let V=!1,F=setTimeout(()=>{if(V)return;V=!0,z=!0;let O=new q("hub_connect_timeout",`Timed out connecting to hub after ${h}ms`);if(this.socket===X)this.lastCloseError=O,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;try{X.close()}catch{}W(O)},h);X.addEventListener("open",()=>{if(V)return;V=!0,clearTimeout(F),Y()}),X.addEventListener("error",(O)=>{if(V)return;V=!0,clearTimeout(F);let f=w0(O,J);if(this.socket===X)this.lastCloseError=f,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;W(f)}),X.addEventListener("close",(O)=>{if(V)return;V=!0,clearTimeout(F);let f=z?this.lastCloseError:I0(O);if(this.socket===X){if(!z)this.lastCloseError=f,this.sawSocketClose=!0;this.connectPromise=void 0,this.socket=void 0}W(f)})});return X.addEventListener("message",(Y)=>{this.handleFrame(JSON.parse(y0(Y)))}),X.addEventListener("close",(Y)=>{if(this.socket!==X)return;if(!z)this.lastCloseError=I0(Y),this.sawSocketClose=!0;this.registered=!1;for(let W of this.pendingReplies.values())W.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,this.socket=void 0,!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect()}),await N,X}subscribe(J,j){let Q=j?.sessionId?.trim()||void 0,Z={listener:J,sessionId:Q};return this.listeners.add(Z),this.adjustSubscriptionCount(Q,1),()=>{if(!this.listeners.delete(Z))return;this.adjustSubscriptionCount(Q,-1)}}async command(J,j,Q,Z){let $=0,X=J!=="client.register"&&J!=="client.unregister";while(!0)try{return await this.commandOnce(J,j,Q,Z)}catch(z){if(!X||$>=1||!await this.recoverLocalHubTransport(z))throw z;$+=1}}async commandOnce(J,j,Q,Z,$=!0){if($)await this.connect();Z?.beforeDispatch?.();let X=L1("hubreq_");Z?.onDispatch?.(X);let z=A1(J,Z?.timeoutMs),N=new Promise((W,V)=>{let F=z===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(X))return;V(new r(J,"hub_command_timeout",`Hub command ${J} timed out after ${z}ms (hub=${this.currentUrl}, requestId=${X}, clientId=${this.clientId}). Check hub-daemon.log for matching command.start/command.slow entries, or run 'cline doctor fix' to restart the hub.`))},z);this.pendingReplies.set(X,{resolve:(O)=>{if(F)clearTimeout(F);W(O)},reject:(O)=>{if(F)clearTimeout(F);V(O)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:J,requestId:X,clientId:this.clientId,sessionId:Q,timeoutMs:z,payload:j}})}catch(W){throw this.pendingReplies.delete(X),W}let Y=await N;if(!Y.ok){if(Y.error?.code===$0){let W=Q??(typeof j?.sessionId==="string"?j.sessionId:void 0);throw new u(W,Y.error.message)}throw new r(J,Y.error?.code,Y.error?.message??`Hub command ${J} failed`)}return Y}async recoverLocalHubTransport(J){if(!T0(this.currentUrl)||!E1(J))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let j=await H0({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}).catch(()=>{return});if(!j)return!1;return this.currentUrl=j,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 J=Math.min(D1*2**this.reconnectAttempt,R1),j=Math.round(J*(1-P0)+Math.random()*J*P0);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.reconnectSubscribedTransport()},j)}async reconnectSubscribedTransport(){if(this.closedByClient||!this.hasActiveSubscriptions())return;try{await this.connect(),this.reconnectAttempt=0}catch{if(!T0(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let J=await H0({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd});if(J){this.currentUrl=J,await this.connect(),this.reconnectAttempt=0;return}}catch{}this.reconnectAttempt+=1,this.scheduleReconnect()}}close(){let J=this.socket;if(this.closedByClient=!0,this.connectGeneration+=1,this.clearReconnectTimer(),this.registered=!1,J)this.lastCloseError=new q("hub_connection_closed",o);for(let j of this.pendingReplies.values())j.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,!J)return;this.sawSocketClose=!1,this.socket=void 0;try{J.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(J){if(!this.socket||this.socket.readyState!==1){if(this.lastCloseError.code==="hub_connection_closed"&&!this.sawSocketClose)throw new q("hub_connection_not_open","Hub connection is not open.");throw this.lastCloseError}this.socket.send(JSON.stringify(J))}sendSubscriptionFrame(J,j){let Q=J==="stream.subscribe"?this.lastEventSequenceByKey.get(this.subscriptionKeyForSessionId(j)):void 0;this.sendFrame({kind:J,clientId:this.clientId,...j?{sessionId:j}:{},...Q!==void 0?{sinceSequence:Q}:{}})}adjustSubscriptionCount(J,j){let Q=this.subscriptionKeyForSessionId(J),Z=(this.subscriptionCounts.get(Q)??0)+j;if(Z<=0){if(this.subscriptionCounts.delete(Q),!this.hasActiveSubscriptions())this.clearReconnectTimer();if(j<0&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.unsubscribe",J);return}if(this.subscriptionCounts.set(Q,Z),j>0&&Z===1&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.subscribe",J)}subscriptionKeyForSessionId(J){return J??a}subscriptionSessionIdFromKey(J){return J===a?void 0:J}handleFrame(J){switch(J.kind){case"reply":{let j=J.envelope.requestId;if(!j)return;let Q=this.pendingReplies.get(j);if(!Q)return;this.pendingReplies.delete(j),Q.resolve(J.envelope);return}case"event":{let j=J.envelope.sequence;if(typeof j==="number"){let Q=J.envelope.sessionId?.trim();for(let Z of[a,Q]){if(!Z||!this.subscriptionCounts.has(Z))continue;let $=this.lastEventSequenceByKey.get(Z)??0;if(j>$)this.lastEventSequenceByKey.set(Z,j)}}for(let Q of this.listeners){if(Q.sessionId&&Q.sessionId!==J.envelope.sessionId?.trim())continue;Q.listener(J.envelope)}return}case"command":case"stream.subscribe":case"stream.unsubscribe":return}}}function h0(J){let j=new URL(J);if(j.protocol==="http:")j.protocol="ws:";else if(j.protocol==="https:")j.protocol="wss:";return j.toString()}async function A(J,j){let Q=new Q0({url:J,authToken:j?.authToken,clientType:"hub-healthcheck",displayName:"hub healthcheck",workspaceRoot:j?.workspaceRoot,cwd:j?.cwd});try{return await Q.connect(),!0}catch{return!1}finally{Q.close()}}async function e(J,j){let Q=h0(J),Z=await T(Q,{authToken:j?.authToken});if(!Z)return{status:"unreachable",url:Q};if(j?.requireCurrentBuild){let $=C(),X=w(Z,$);if(!X.compatible&&!P(Z))return{status:X.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:Q}}else if(!O1(Z).compatible)return{status:"protocol_mismatch",url:Q};if(j?.verifyConnection===!0&&!await A(Q,{workspaceRoot:j.workspaceRoot,cwd:j.cwd,authToken:j.authToken}))return{status:"unreachable",url:Q};return{status:"compatible",url:Q}}function g1(J){let j=J&&typeof J==="object"&&Array.isArray(J.sessions)?J.sessions:[],Q=0,Z=new Set;for(let $ of j){if(!$||typeof $!=="object")continue;let X=$.participants;if(!Array.isArray(X)||X.length===0)continue;Q+=1;for(let z of X){let N=z&&typeof z==="object"?z.clientId:void 0;if(typeof N==="string"&&N.trim())Z.add(N)}}return{activeSessionCount:Q,participantClientCount:Z.size}}async function t(J,j,Q){let Z=new Q0({url:J,authToken:j,clientType:"hub-recovery-check",displayName:"hub recovery check",workspaceRoot:Q?.workspaceRoot,cwd:Q?.cwd});try{let $=await Z.command("session.list",{limit:500},void 0,{timeoutMs:_1});return g1($.payload)}finally{await Z.dispose().catch(()=>{return})}}async function I1(J,j,Q){try{return(await t(J,j,Q)).activeSessionCount===0}catch{return!1}}async function w1(J,j){let Q=`${J.discoveryPath}.superseded`,Z=await B(Q);if(!Z?.url||!Z.authToken)return;let $=await e(Z.url,{authToken:Z.authToken});if($.status!=="compatible")return;if(await I1($.url,Z.authToken,j))return;return y($.url,Z.authToken)}async function P1(J={}){if(J.endpoint?.trim()){let $=await e(J.endpoint);return $.status==="compatible"?$.url:void 0}let j=U1(),Q=await B(j.discoveryPath);if(!Q?.url)return await w1(j,J);let Z=await e(Q.url,{authToken:Q.authToken,requireCurrentBuild:!0});if(Z.status==="compatible")return y(Z.url,Q.authToken);if(Z.status==="protocol_mismatch")await _(j.discoveryPath).catch(()=>{return});return}async function H0(J={}){let j=await P1(J);if(j&&await A(j,{workspaceRoot:J.workspaceRoot,cwd:J.cwd}))return j;if(J.endpoint?.trim())return;try{return(await k(J.workspaceRoot??process.cwd())).url}catch(Q){J.onStartupError?.(Q);return}}async function g(J,j,Q,Z){k0();let $=new URL(J),X=j?.trim()||j0($);if($.protocol==="ws:")$.protocol="http:";else if($.protocol==="wss:")$.protocol="https:";if($.pathname="/drain",$.hash="",Q)$.searchParams.set("reason",Q);if(Z?.off)$.searchParams.set("off","1");return(await fetch($,{method:"POST",headers:X?{authorization:`Bearer ${X}`}:void 0})).ok}async function b(J,j){k0();let Q=new URL(J),Z=j?.trim()||j0(Q);if(Q.protocol==="ws:")Q.protocol="http:";else if(Q.protocol==="wss:")Q.protocol="https:";return Q.pathname="/shutdown",Q.hash="",(await fetch(Q,{method:"POST",headers:Z?{authorization:`Bearer ${Z}`}:void 0})).ok}import{spawn as T1}from"node:child_process";import{userInfo as H1}from"node:os";import{basename as k1,delimiter as v}from"node:path";var Z0="__CLINE_SIDECAR_PATH_START__",v0="__CLINE_SIDECAR_PATH_END__",u0=5000,y1=`/bin/sh -c 'printf "%s%s%s" "${Z0}" "$PATH" "${v0}"'`,m0="CLINE_SIDECAR_SKIP_SHELL_PATH";function p0(J){return J==="darwin"?"/bin/zsh":"/bin/bash"}function b1(J,j){try{let Q=H1().shell?.trim();if(Q)return Q}catch{}return j.SHELL?.trim()||p0(J)}function h1(J,j){let Q=k1(J);if(Q==="csh"||Q==="tcsh")return{args:["-c",j],argv0:`-${Q}`};return{args:["-i","-l","-c",j]}}function m1(J){let j=J.indexOf(Z0);if(j===-1)return;let Q=J.indexOf(v0,j);if(Q===-1)return;let Z=J.slice(j+Z0.length,Q).trim();return Z.length>0?Z:void 0}function v1(J,j){let Q=[...J.split(v),...j.split(v)].map((Z)=>Z.trim()).filter((Z)=>Z.length>0);return Array.from(new Set(Q)).join(v)}function u1(J,j=u0){return new Promise((Q)=>{let Z=h1(J,y1),$=T1(J,Z.args,{argv0:Z.argv0,stdio:["ignore","pipe","ignore"],detached:!0}),X="",z=0,N=()=>{try{if($.pid)process.kill(-$.pid,"SIGKILL")}catch{$.kill("SIGKILL")}},Y=!1,W=(F)=>{if(Y)return;Y=!0,clearTimeout(V),$.stdout?.destroy(),N(),Q(F)},V=setTimeout(()=>{try{if($.pid)process.kill(-$.pid,"SIGKILL")}catch{$.kill("SIGKILL")}W(void 0)},j);$.stdout?.on("data",(F)=>{if(Y)return;if(z+=F.length,z>65536){W(void 0);return}X+=F.toString("utf8")}),$.on("error",()=>W(void 0)),$.on("close",()=>W(m1(X)))})}async function l0(J){let j=J?.platform??process.platform,Q=J?.env??process.env;if(j==="win32")return{status:"skipped",reason:"windows"};if(Q[m0]?.trim())return{status:"skipped",reason:m0};let Z=J?.userShell??b1(j,Q),$=J?.fallbackShell??p0(j),X=J?.timeoutMs??u0,z=Z===$?[[Z,X]]:[[Z,X],[$,X/2]];for(let[N,Y]of z){let W=await u1(N,Y);if(!W)continue;let V=v1(W,Q.PATH??"");return Q.PATH=V,{status:"applied",pathEntries:V.split(v).length,shell:N}}return{status:"failed",shell:Z}}var c0={readHubDiscovery:B,clearHubDiscoveryIfOwned:O0,probeProcess:(J)=>{process.kill(J,0)},requestHubShutdown:b,ensureDetachedHubServer:k,claimHubDaemonProcess:l1,loadHubDaemon:()=>import("@cerebriline/core/hub/daemon-entry"),ensureLoginShellPath:l0,setHomeDirIfUnset:c1,homeDir:p1,cwd:()=>process.cwd(),env:process.env,writeOutput:(J)=>process.stdout.write(J)};function i0(J,j){let Q=J.indexOf(j);return(Q>=0?J[Q+1]:void 0)?.trim()||void 0}function n0(J,j){let Q=i0(J,"--discovery-path");if(!Q)throw Error("--discovery-path is required for remote Hub management");return j.env.CLINE_HUB_DISCOVERY_PATH=Q,Q}async function i1(J=process.argv,j=c0){j.setHomeDirIfUnset(j.homeDir()),await j.ensureLoginShellPath();let Q=i0(J,"--cwd")??j.cwd();n0(J,j);let Z=await j.ensureDetachedHubServer(Q,{host:"127.0.0.1",port:0,pathname:"/hub",allowPortFallback:!0,manageConnectors:!1});j.writeOutput(`${JSON.stringify({...Z,cwd:Q,platform:process.platform,arch:process.arch})}
4
- `)}async function d6(J=process.argv,j=c0){if(J.includes("--remote-hub-stop")){let Q=n0(J,j),Z=await j.readHubDiscovery(Q);if(Z&&typeof Z.pid==="number"&&Number.isInteger(Z.pid)&&Z.pid>0)try{j.probeProcess(Z.pid)}catch($){if($?.code==="ESRCH")return await j.clearHubDiscoveryIfOwned(Q,Z.hubId),!0}if(Z&&!await j.requestHubShutdown(Z.url,Z.authToken))throw Error("Remote Hub shutdown failed");return!0}if(J.includes("--remote-hub-ensure"))return await i1(J,j),!0;if(j.claimHubDaemonProcess())return await j.loadHubDaemon(),!0;return!1}export{i1 as runRemoteHubEnsure,d6 as runRemoteHelperEntrypoint};
1
+ import{homedir as Wn}from"node:os";import{claimHubDaemonProcess as $n}from"@cerebriline/shared";import{setHomeDirIfUnset as jn}from"@cerebriline/shared/storage";import{createSessionId as hn,ensureLoopbackProxyBypass as Ue,isHubProtocolCompatible as gn,resolveClineBuildEnv as bn,resolveHubCommandTimeoutMs as yn}from"@cerebriline/shared";import wn from"ws";var P={name:"@cerebriline/core",description:"Cline Core SDK for Node Runtime",version:"0.0.92",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:{"@cerebriline/agents":"workspace:*","@cerebriline/llms":"workspace:*","@cerebriline/shared":"workspace:*","@joplin/turndown-plugin-gfm":"1.0.68","@lingo-reader/epub-parser":"0.4.6","@lingo-reader/fb2-parser":"0.4.6","@lingo-reader/mobi-parser":"0.4.6","@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","@tesseract.js-data/eng":"1.0.0",cfb:"1.2.2","fast-png":"8.0.0",jiti:"^2.7.0",nanoid:"^5.1.7","node-machine-id":"^1.1.12",officeparser:"8.0.0","pdfjs-dist":"6.2.108","simple-git":"3.36.0","tesseract.js":"7.0.0","tree-sitter-wasms":"^0.1.12",turndown:"7.2.0","web-tree-sitter":"^0.25.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/turndown":"^5.0.6","@types/ws":"^8.18.1","posthog-node":"^5.8.0"},engines:{node:">=22"},files:["assets","dist","scripts/document-reader-assets.mjs","!dist/**/*.d.ts.map"]};var ie="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 At}from"node:child_process";import{closeSync as Ot,mkdirSync as Lt,openSync as Ut,readFileSync as Mt,unlinkSync as Bt}from"node:fs";import{basename as Nt,dirname as Vt,join as Ft}from"node:path";import{fileURLToPath as Wt}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as $t,isBunEmbeddedModulePath as jt,isHubDaemonProcess as Gt,resolveClineBuildEnv as Ee,withResolvedClineBuildEnv as qt}from"@cerebriline/shared";import{createHash as Ye,randomBytes as Xe}from"node:crypto";import{mkdir as j,open as se,readFile as le,rename as Ze,rm as I,writeFile as Qe}from"node:fs/promises";import{dirname as pe,join as G}from"node:path";import{ensureLoopbackProxyBypass as et,isHubProtocolCompatible as tt}from"@cerebriline/shared";import{resolveClineDataDir as H,resolveClineDir as Qn}from"@cerebriline/shared/storage";var nt="CLINE_HUB_DISCOVERY_PATH",ot="CLINE_HUB_BUILD_ID",rt="CLINE_HUB_BUILD_EPOCH_MS",it=30000,st=15000,ae=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 ce(e){return new Promise((t)=>setTimeout(t,e))}function dt(e){return`${e}.lock`}async function lt(e){try{let t=JSON.parse(await le(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 W(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-8c78914f755a47c295196668265818413b462a97b1a4cf92310a0d4a34dfad90".trim()||`source-${String(P.version)}`}function pt(){let e=Number(process.env[rt]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1791961825128)?1791961825128: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 ue(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0}function de(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 fe(e,t){let n=e.buildId?.trim(),o=t.buildId?.trim();if(n&&o&&n===o)return 0;let r=ue(e.buildEpochMs),i=ue(t.buildEpochMs);if(r!==void 0&&i!==void 0&&r!==i)return r<i?-1:1;let s=de(e.coreVersion),u=de(t.coreVersion);if(s&&u){let c=ft(s,u);if(c!==0)return c}if(n&&o&&n!==o)return n<o?-1:1;return 0}function me(){return{buildId:k(),buildEpochMs:pt(),coreVersion:String(P.version)}}function D(e,t){let n=t?.self??me(),o=x(e,n.buildId??"");if(o.compatible)return!0;if(o.reason!=="build_mismatch"&&o.reason!=="missing_build")return!1;return fe(n,e)<=0}function he(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${ct(e)}`,n=process.env[nt]?.trim()||G(H(),"locks","hub","owners",`${at(t)}.json`);return{ownerId:t,discoveryPath:n}}async function b(e){try{let t=JSON.parse(await le(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 ge(e,t,n){await q(e,async()=>{let o=pe(e);await j(o,{recursive:!0});let r=`${e}.${process.pid}.${Xe(6).toString("hex")}.tmp`,i;try{i=await se(r,"wx",384),await i.writeFile(`${JSON.stringify(t,null,2)}
2
+ `,{encoding:"utf8"}),await i.sync(),await i.close(),i=void 0,n?.beforePublish?.(),await Ze(r,e);let s;try{s=await se(o,"r"),await s.sync()}catch{}finally{await s?.close().catch(()=>{return})}}catch(s){throw await i?.close().catch(()=>{return}),await I(r,{force:!0}).catch(()=>{return}),s}})}async function C(e){await q(e,async()=>{await I(e,{force:!0}).catch(()=>{return})})}async function be(e,t){return await q(e,async()=>{if((await b(e))?.hubId!==t)return!1;return await I(e,{force:!0}),!0})}async function ye(e,t,n){let o=dt(e);await j(pe(o),{recursive:!0});let r=Date.now()+st;while(!0){try{await j(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 W(o);continue}await ce(ae);continue}let c=Date.now()-Date.parse(u.acquiredAt);if(!ut(u.pid)||c>it){await W(o);continue}if(Date.now()>=r)throw Error(`Timed out waiting for hub ${t} lock ${o}`);await ce(ae);continue}try{return await Qe(G(o,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
3
+ `,"utf8"),await n()}finally{await W(o)}}}function q(e,t){return ye(`${e}.mutation`,"discovery mutation",t)}function we(e,t){return ye(e,"startup",t)}async function A(e,t){et();try{let n=await fetch(t?.authToken?mt(e):Se(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 ve(e,t,n="/hub"){return new URL(`ws://${e}:${t}${n}`).toString()}function Se(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(Se(e));return t.pathname="/status",t.toString()}import{CLINE_HUB_DEV_PORT as ht,CLINE_HUB_PORT as gt,resolveClineBuildEnv as bt}from"@cerebriline/shared";var yt="CLINE_HUB_HOST",wt="CLINE_HUB_PORT",vt="CLINE_HUB_PATHNAME",St="127.0.0.1",kt=gt,Ct="/hub";function ke(e){return bt(e)==="development"?ht:kt}function Pt(e={}){return(e.env??process.env)[yt]?.trim()||St}function Ht(e={}){let n=(e.env??process.env)[wt]?.trim();if(!n)return ke(e);let o=Number.parseInt(n,10);if(!Number.isInteger(o)||o<1||o>65535)return ke(e);return o}function _t(e={}){return(e.env??process.env)[vt]?.trim()||Ct}function Ce(e={},t={}){return{host:e.host??Pt(t),port:e.port??Ht(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"@cerebriline/shared";import uo from"simple-git";var lo=Tt(Rt);var It="shared:cline",xt="CLINE_HUB_DISCOVERY_PATH",Dt="hub-production";function _(e=It){return he(`${e}@${k()}`)}function O(){return{ownerId:Dt,discoveryPath:process.env[xt]?.trim()||Et(H(),"locks","hub","production.json")}}var Pe=15000,Kt=200,He=3000,Jt=100,zt=[100,250,500,1000,2000],Yt="--cline-hub-daemon",Xt=3,Zt=60000,_e=new Map;function Qt(e,t=Date.now()){let n=_e.get(e);if(!n||t-n.windowStartedAt>Zt)return _e.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=Ft(H(),"logs","hub-daemon.log");return Lt(Vt(e),{recursive:!0}),{fd:Ut(e,"a"),logPath:e}}catch{return}}function nn(){return Ee()==="production"?O():_()}function R(e){return D(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 K(e){try{Bt(`${e}.superseded`)}catch{}}function Re(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 A(e,{authToken:t})}catch{return}}async function Te(e,t){let n=Date.now()+t;while(Date.now()<n){if(!(await T(e))?.url)return!0;await new Promise((r)=>setTimeout(r,Jt))}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 Te(e.url,He);if(!n&&e.pid&&rn(e.pid)){try{process.kill(e.pid,"SIGTERM")}catch{}n=await Te(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 Y(e.url,e.authToken)).activeSessionCount>0}catch{return!1}}async function J(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(Ee()!=="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(jt(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=Nt(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(Gt())return;let n=dn(e,t),o=tn();try{At(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)Ot(o.fd)}}async function fn(e,t={}){for(let n=0;;n++)try{pn(e,t);return}catch(o){let r=zt[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=Ce(n),i=ve(r.host,r.port,r.pathname),s=(l)=>{if(!o)U(l.url,l.authToken);else Ie(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 K(e.discoveryPath),s({url:p.url,authToken:l});if(p?.url){if(await J({...p,authToken:l},e.discoveryPath)==="deferred_busy"&&await y(p.url,{authToken:l}))return s({url:p.url,authToken:l})}else await C(e.discoveryPath).catch(()=>{return})}}let a=await T(i);if(a?.url){let l=Re(a,u??c,i);if(R(a)){let h=[a.authToken,u?.authToken,c?.authToken].filter((S)=>typeof S==="string"&&S.trim().length>0);for(let S of h){if(!await y(a.url,{authToken:S}))continue;let Je={hubId:a.hubId??`repaired-${a.port}`,protocolVersion:a.protocolVersion,minClientProtocolVersion:a.minClientProtocolVersion,maxClientProtocolVersion:a.maxClientProtocolVersion,capabilities:a.capabilities,coreVersion:a.coreVersion,buildId:a.buildId,authToken:S,host:a.host,port:a.port,url:a.url,pid:a.pid??u?.pid??c?.pid,startedAt:a.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await ge(e.discoveryPath,Je)}catch{}return K(e.discoveryPath),s({url:a.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 J(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(a.url,{authToken:h}))return s({url:a.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()+Pe;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 K(e.discoveryPath),s({url:h.url,authToken:l.authToken})}let p=await T(i);if(p?.url&&!R(p)){let h=Re(p,l??c,i),v=await J(h,e.discoveryPath);if(v==="deferred_busy"&&l?.authToken&&await y(p.url,{authToken:l.authToken}))return s({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 ${Pe}ms waiting for detached hub startup.`)}async function L(e,t={}){let n=nn();return await we(n.discoveryPath,async()=>mn(n,e,t))}function vn(){return bn()==="production"?O():_()}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 Me(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 Me(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 xe(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}`:""})`:Z,{closeCode:t.code,closeReason:n||void 0})}function De(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 X="*",B=8000,Cn="cline-hub-auth.",te=new Map,Be=new Set,Pn=3000;var Z="Hub connection closed",Hn=250,_n=5000,Ae=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 Q extends Error{command;code;constructor(e,t,n){super(n);this.command=e;this.code=t;this.name="HubCommandError"}}function ne(e,t={}){let n=e.searchParams.get("authToken")?.trim();if(e.searchParams.delete("authToken"),n)return n;if(t.skipRegistry)return;let o=N(e.toString());return o?te.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 N(e){if(!Tn(e))return;let t=new URL(Ne(e));return t.search="",t.hash="",t.toString()}function Oe(e){let t=N(e);return!!t&&Be.has(t)}function U(e,t){let n=N(e);if(n){if(Be.add(n),t?.trim())te.set(n,t)}return e}function Ie(e,t){let n=N(e);if(n&&t?.trim())te.set(n,t)}class oe{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",Z);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()||ne(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(s)=>{if(r=s,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(P.version),pid:process.pid},workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}},void 0,void 0,!1),n!==this.connectGeneration||this.closedByClient){try{s.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(s){if(this.connectPromise===i)this.connectPromise=void 0;if(r&&this.socket===r){this.lastCloseError=De(s,e),this.registered=!1,this.sawSocketClose=!1,this.socket=void 0;try{r.close()}catch{}}if(!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect();throw s}}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,a)=>{c=setTimeout(()=>{a(new f("hub_connect_timeout",`Timed out resolving hub connection headers after ${B}ms`))},B)})])}catch(d){let a=d instanceof f?d:new f("hub_connect_failed",d instanceof Error?d.message:String(d));if(n===this.connectGeneration)this.lastCloseError=a;throw a}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 s=!1,u=new Promise((c,d)=>{let a=!1,m=setTimeout(()=>{if(a)return;a=!0,s=!0;let g=new f("hub_connect_timeout",`Timed out connecting to hub after ${B}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)},B);i.addEventListener("open",()=>{if(a)return;a=!0,clearTimeout(m),c()}),i.addEventListener("error",(g)=>{if(a)return;a=!0,clearTimeout(m);let w=De(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(a)return;a=!0,clearTimeout(m);let w=s?this.lastCloseError:xe(g);if(this.socket===i){if(!s)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(Me(c)))}),i.addEventListener("close",(c)=>{if(this.socket!==i)return;if(!s)this.lastCloseError=xe(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(s){if(!i||r>=1||!await this.recoverLocalHubTransport(s))throw s;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 s=yn(e,o?.timeoutMs),u=new Promise((d,a)=>{let m=s===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(i))return;a(new Q(e,"hub_command_timeout",`Hub command ${e} timed out after ${s}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.`))},s);this.pendingReplies.set(i,{resolve:(g)=>{if(m)clearTimeout(m);d(g)},reject:(g)=>{if(m)clearTimeout(m);a(g)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:e,requestId:i,clientId:this.clientId,sessionId:n,timeoutMs:s,payload:t}})}catch(d){throw this.pendingReplies.delete(i),d}let c=await u;if(!c.ok){if(c.error?.code===ie){let d=n??(typeof t?.sessionId==="string"?t.sessionId:void 0);throw new F(d,c.error.message)}throw new Q(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 Le({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,_n),t=Math.round(e*(1-Ae)+Math.random()*e*Ae);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 Le({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",Z);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??X}subscriptionSessionIdFromKey(e){return e===X?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[X,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 oe({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 ee(e,t){let n=Ne(e),o=await A(n,{authToken:t?.authToken});if(!o)return{status:"unreachable",url:n};if(t?.requireCurrentBuild){let r=k(),i=x(o,r);if(!i.compatible&&!D(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 s of i){let u=s&&typeof s==="object"?s.clientId:void 0;if(typeof u==="string"&&u.trim())o.add(u)}}return{activeSessionCount:n,participantClientCount:o.size}}async function Y(e,t,n){let o=new oe({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:Pn});return En(r.payload)}finally{await o.dispose().catch(()=>{return})}}async function In(e,t,n){try{return(await Y(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 ee(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 Dn(e={}){if(e.endpoint?.trim()){let r=await ee(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 ee(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 Le(e={}){let t=await Dn(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){Ue();let r=new URL(e),i=t?.trim()||ne(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){Ue();let n=new URL(e),o=t?.trim()||ne(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 An}from"node:child_process";import{userInfo as On}from"node:os";import{basename as Ln,delimiter as V}from"node:path";var re="__CLINE_SIDECAR_PATH_START__",Fe="__CLINE_SIDECAR_PATH_END__",We=5000,Un=`/bin/sh -c 'printf "%s%s%s" "${re}" "$PATH" "${Fe}"'`,Ve="CLINE_SIDECAR_SKIP_SHELL_PATH";function $e(e){return e==="darwin"?"/bin/zsh":"/bin/bash"}function Mn(e,t){try{let n=On().shell?.trim();if(n)return n}catch{}return t.SHELL?.trim()||$e(e)}function Bn(e,t){let n=Ln(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(re);if(t===-1)return;let n=e.indexOf(Fe,t);if(n===-1)return;let o=e.slice(t+re.length,n).trim();return o.length>0?o:void 0}function Vn(e,t){let n=[...e.split(V),...t.split(V)].map((o)=>o.trim()).filter((o)=>o.length>0);return Array.from(new Set(n)).join(V)}function Fn(e,t=We){return new Promise((n)=>{let o=Bn(e,Un),r=An(e,o.args,{argv0:o.argv0,stdio:["ignore","pipe","ignore"],detached:!0}),i="",s=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(a),r.stdout?.destroy(),u(),n(m)},a=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(s+=m.length,s>65536){d(void 0);return}i+=m.toString("utf8")}),r.on("error",()=>d(void 0)),r.on("close",()=>d(Nn(i)))})}async function je(e){let t=e?.platform??process.platform,n=e?.env??process.env;if(t==="win32")return{status:"skipped",reason:"windows"};if(n[Ve]?.trim())return{status:"skipped",reason:Ve};let o=e?.userShell??Mn(t,n),r=e?.fallbackShell??$e(t),i=e?.timeoutMs??We,s=o===r?[[o,i]]:[[o,i],[r,i/2]];for(let[u,c]of s){let d=await Fn(u,c);if(!d)continue;let a=Vn(d,n.PATH??"");return n.PATH=a,{status:"applied",pathEntries:a.split(V).length,shell:u}}return{status:"failed",shell:o}}var Ge={readHubDiscovery:b,clearHubDiscoveryIfOwned:be,probeProcess:(e)=>{process.kill(e,0)},requestHubShutdown:M,ensureDetachedHubServer:L,claimHubDaemonProcess:$n,loadHubDaemon:()=>import("@cerebriline/core/hub/daemon-entry"),ensureLoginShellPath:je,setHomeDirIfUnset:jn,homeDir:Wn,cwd:()=>process.cwd(),env:process.env,writeOutput:(e)=>process.stdout.write(e)};function qe(e,t){let n=e.indexOf(t);return(n>=0?e[n+1]:void 0)?.trim()||void 0}function Ke(e,t){let n=qe(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=qe(e,"--cwd")??t.cwd();Ke(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
+ `)}async function Ko(e=process.argv,t=Ge){if(e.includes("--remote-hub-stop")){let n=Ke(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{Ko as runRemoteHelperEntrypoint,Gn as runRemoteHubEnsure};
@@ -1 +1 @@
1
- import{PostHog as s}from"posthog-node";function a(e,t){return new s(e,{host:"https://data.cline.bot",...t})}class o{client;settings;logger;constructor(e){if(!e.client)throw Error("PostHog client is required for feature flags");this.logger=e.config.logger,this.settings={enabled:!0},this.client=e.client}async getAllFlagsAndPayloads(e){if(!this.enabled)return;let t=this.resolveDistinctId(e.context);if(!t)return this.logger?.log?.("PostHog feature flags requested without a distinct ID"),{};try{return await this.client.getAllFlagsAndPayloads(t,{flagKeys:e.flagKeys?[...e.flagKeys]:void 0})}catch(r){return this.logger?.error?.("Error getting PostHog feature flags",{error:r}),{}}}get enabled(){return this.settings.enabled}getSettings(){return{...this.settings}}async dispose(){try{await this.client.shutdown()}catch(e){this.logger?.error?.("Error shutting down PostHog feature flags client",{error:e})}}resolveDistinctId(e){return e?.distinctId?.trim()||e?.userId?.trim()||void 0}}export{a as buildClinePostHogClient,o as PostHogFeatureFlagsProvider};
1
+ import{PostHog as s}from"posthog-node";function a(e,t){return new s(e,{host:"https://data.cline.bot",...t})}class o{client;settings;logger;constructor(e){if(!e.client)throw Error("PostHog client is required for feature flags");this.logger=e.config.logger,this.settings={enabled:!0},this.client=e.client}async getAllFlagsAndPayloads(e){if(!this.enabled)return;let t=this.resolveDistinctId(e.context);if(!t)return this.logger?.log?.("PostHog feature flags requested without a distinct ID"),{};try{return await this.client.getAllFlagsAndPayloads(t,{flagKeys:e.flagKeys?[...e.flagKeys]:void 0})}catch(r){return this.logger?.error?.("Error getting PostHog feature flags",{error:r}),{}}}get enabled(){return this.settings.enabled}getSettings(){return{...this.settings}}async dispose(){try{await this.client.shutdown()}catch(e){this.logger?.error?.("Error shutting down PostHog feature flags client",{error:e})}}resolveDistinctId(e){return e?.distinctId?.trim()||e?.userId?.trim()||void 0}}export{o as PostHogFeatureFlagsProvider,a as buildClinePostHogClient};
@@ -99,6 +99,7 @@ export declare const SamplingSettingsSchema: z.ZodObject<{
99
99
  stop: z.ZodOptional<z.ZodArray<z.ZodString>>;
100
100
  thinkBudget: z.ZodOptional<z.ZodString>;
101
101
  thinkBudgetMessage: z.ZodOptional<z.ZodString>;
102
+ reasoningLevel: z.ZodOptional<z.ZodString>;
102
103
  }, z.core.$strip>;
103
104
  export type SamplingSettings = z.infer<typeof SamplingSettingsSchema>;
104
105
  /**
@@ -110,6 +111,19 @@ export type SamplingSettings = z.infer<typeof SamplingSettingsSchema>;
110
111
  * All of it is inert unless `enabled`, and inert anyway on a server launched
111
112
  * without `--polykv-max-pools`.
112
113
  */
114
+ /**
115
+ * Generation notices (opencoti, xOllama): one short line the engine plants
116
+ * into the model's output when its thinking or answer room is nearly used, or
117
+ * when a message is waiting. Off unless `enabled`. Each phase takes up to four
118
+ * steps, as a percent of that phase's room; absent, the steps are 60/70/80/90.
119
+ * See `@cerebriline/llms`' `generation-notices.ts`.
120
+ */
121
+ export declare const GenerationNoticeSettingsSchema: z.ZodObject<{
122
+ enabled: z.ZodOptional<z.ZodBoolean>;
123
+ thinkSteps: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
124
+ answerSteps: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
125
+ }, z.core.$strip>;
126
+ export type GenerationNoticeSettings = z.infer<typeof GenerationNoticeSettingsSchema>;
113
127
  /**
114
128
  * The tools a configuration withholds from its sessions.
115
129
  *
@@ -304,6 +318,7 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
304
318
  stop: z.ZodOptional<z.ZodArray<z.ZodString>>;
305
319
  thinkBudget: z.ZodOptional<z.ZodString>;
306
320
  thinkBudgetMessage: z.ZodOptional<z.ZodString>;
321
+ reasoningLevel: z.ZodOptional<z.ZodString>;
307
322
  }, z.core.$strip>>;
308
323
  polykv: z.ZodOptional<z.ZodObject<{
309
324
  enabled: z.ZodOptional<z.ZodBoolean>;
@@ -330,6 +345,11 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
330
345
  continuationCompaction: z.ZodOptional<z.ZodBoolean>;
331
346
  contextFloor: z.ZodOptional<z.ZodNumber>;
332
347
  }, z.core.$strip>>;
348
+ notices: z.ZodOptional<z.ZodObject<{
349
+ enabled: z.ZodOptional<z.ZodBoolean>;
350
+ thinkSteps: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
351
+ answerSteps: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
352
+ }, z.core.$strip>>;
333
353
  tools: z.ZodOptional<z.ZodObject<{
334
354
  disabled: z.ZodOptional<z.ZodArray<z.ZodString>>;
335
355
  readLimitEnabled: z.ZodOptional<z.ZodBoolean>;
@@ -14,7 +14,7 @@
14
14
  * - the cap is a configured `num_predict`, then a per-turn override, then a
15
15
  * manual budget, then `auto` against the session's window, then the
16
16
  * gateway's own default;
17
- * - thinking is asked of the server on Ollama, which resolves a level itself,
17
+ * - thinking is asked of the server on Ollama, which resolves a budget itself,
18
18
  * and computed from the same table on a llama.cpp server, which takes an
19
19
  * absolute count;
20
20
  * - the budget message is the configured one, then the model's own.
@@ -50,8 +50,14 @@ export interface SessionThinkingInput {
50
50
  /** `false` is thinking switched off; anything else leaves it to the level. */
51
51
  thinking?: boolean;
52
52
  reasoningEffort?: string;
53
- /** `sampling.thinkBudget`: a level or a bare count, llama.cpp only. */
53
+ /** `sampling.thinkBudget`: a share or a bare count. */
54
54
  configuredThinkBudget?: string;
55
+ /**
56
+ * `sampling.reasoningLevel`: the model's own level, Ollama's `think`.
57
+ * Asked about only so the probe describes the request this session sends;
58
+ * a level bounds nothing on a current server.
59
+ */
60
+ configuredReasoningLevel?: string;
55
61
  configuredNumPredict?: number;
56
62
  outputCap: number;
57
63
  contextWindow: number | undefined;
@@ -62,7 +68,8 @@ export interface SessionThinkingInput {
62
68
  * this model, this level, this num_predict and num_ctx.
63
69
  */
64
70
  probeOllama?: (baseUrl: string | undefined, modelId: string, query: {
65
- think: string;
71
+ think?: string;
72
+ thinkBudget?: string;
66
73
  numPredict: number;
67
74
  numCtx: number | undefined;
68
75
  }) => Promise<{