@cerebriline/core 4.100.260 → 4.100.262
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cline-core/types.d.ts +15 -0
- package/dist/cloud/index.js +1 -1
- package/dist/hub/daemon/entry.js +2 -2
- package/dist/hub/index.js +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +597 -596
- package/dist/remote/remote-helper-entry.js +1 -1
- package/dist/remote/remote-helper.js +1 -1
- package/dist/services/llms/model-request-files.d.ts +37 -0
- package/package.json +4 -4
|
@@ -8,6 +8,7 @@ import type { SessionHistoryListOptions } from "../runtime/host/history";
|
|
|
8
8
|
import type { SessionBackend } from "../runtime/host/host";
|
|
9
9
|
import type { LocalRuntimeStartOptions, RuntimeHostMode, StartSessionInput, StartSessionResult } from "../runtime/host/runtime-host";
|
|
10
10
|
import type { FeatureFlagsService } from "../services/feature-flags";
|
|
11
|
+
import type { ModelRequestCaptureOptions } from "../services/llms/model-request-files";
|
|
11
12
|
import type { CheckpointWorkspaceCompareResult } from "../session/checkpoint-diff";
|
|
12
13
|
import type { ClineCoreStartConfig } from "../types/config";
|
|
13
14
|
import type { SessionMessagesArtifactUploader } from "../types/session";
|
|
@@ -140,6 +141,20 @@ export interface ClineCoreOptions {
|
|
|
140
141
|
* is read: pass it to the first `ClineCore.create`.
|
|
141
142
|
*/
|
|
142
143
|
dataDir?: string;
|
|
144
|
+
/**
|
|
145
|
+
* Save the exact body of every generation request, and the response it got,
|
|
146
|
+
* one file each under `<dataDir>/logs/requests/<session>/` (or `dir`). The
|
|
147
|
+
* VS Code extension's "Save model requests" setting, and off by default as
|
|
148
|
+
* it is there.
|
|
149
|
+
*
|
|
150
|
+
* The request is what the model saw after the history was reshaped --
|
|
151
|
+
* reasoning scope, inlined reasoning, compaction -- and the response is the
|
|
152
|
+
* raw stream it generated, so a pair is a replayable turn. Headers are never
|
|
153
|
+
* saved. Applies to the whole process; set it on the first
|
|
154
|
+
* `ClineCore.create`, or switch it later with `applyModelRequestCapture`.
|
|
155
|
+
* See `model-request-files.ts`.
|
|
156
|
+
*/
|
|
157
|
+
saveModelRequests?: boolean | ModelRequestCaptureOptions;
|
|
143
158
|
/**
|
|
144
159
|
* A human-readable name for this SDK client (e.g. `"my-app"`, `"acme-bot"`).
|
|
145
160
|
* Used to identify the consumer in telemetry and logs.
|
package/dist/cloud/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import{execFile as sn}from"node:child_process";import{basename as To,resolve as
|
|
|
5
5
|
...and ${l.length-5} more`:"";throw new _("dirty_worktree",`Commit and push local changes before handing off to cloud. Uncommitted files are not transferred.
|
|
6
6
|
|
|
7
7
|
${m}${y}`)}let i;try{i=await t.symbolicBranch()}catch(l){let m=Q(l)===1,y=K(l),w=m?"Cloud handoff requires a checked-out branch; detached HEAD is not supported.":"Could not inspect the current Git branch.";throw new _(m?"detached_head":"git_command_failed",y?`${w} (${y})`:w,{cause:l})}if(!i)throw new _("detached_head","Cloud handoff requires a checked-out branch; detached HEAD is not supported.");let[r,a,d]=await Promise.all([O(()=>t.branchRemote(i),"missing_upstream",`Branch ${i} has no upstream. Push it with -u before handing off.`),O(()=>t.branchMergeRef(i),"missing_upstream",`Branch ${i} has no upstream. Push it with -u before handing off.`),O(t.headSha,"git_command_failed","Could not resolve the current commit.")]);if(!r||r==="."||!a.startsWith("refs/heads/"))throw new _("missing_upstream",`Branch ${i} has no remote branch upstream. Push it with -u before handing off.`);let u=a.slice(11),f=r;if(!Ze(r))try{f=await t.remoteUrl(r)}catch{throw new _("missing_upstream","Could not resolve the upstream remote.")}let c=Ze(f);if(!c)throw new _("unsupported_remote","Cloud handoff currently requires a github.com upstream remote.");let h;try{h=await t.remoteRefs(r,a)}catch(l){let m=Q(l)===2,y=m?`The upstream branch ${u} was not found. Push it before handing off.`:"Could not verify the remote branch. Check your network and GitHub authentication, then try again.";throw new _(m?"remote_branch_missing":"git_command_failed",y)}let p=cn(h,u);if(!p)throw new _("remote_branch_missing",`The upstream branch ${u} was not found. Push it before handing off.`);if(p.toLowerCase()!==d.toLowerCase())throw new _("unpushed_commits",`Local HEAD does not match the upstream branch ${u}. Push the current commit before handing off.`);return{repoUrl:c,branch:u,headSha:d,...s?{workspaceRelativePath:s}:{}}}function fe(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:void 0}function x(e){if(typeof e!=="string")return;return e.trim()||void 0}function ln(e){return typeof e==="string"&&e.length>0?e:void 0}function pn(e){let t=x(e.repoUrl),n=x(e.branch),s=x(e.headSha),o=x(e.modelId);if(!t||!n||!s||!o)throw Error("Cloud handoff fingerprint fields cannot be empty.");let i=x(e.organizationId),r=ln(e.workspaceRelativePath),a=e.mode;return{repoUrl:t,branch:n,headSha:s,modelId:o,...i?{organizationId:i}:{},...r?{workspaceRelativePath:r}:{},...a?{mode:a}:{}}}function Lo(e,t){return e!==void 0&&t!==void 0&&e.repoUrl===t.repoUrl&&e.branch===t.branch&&e.headSha.toLowerCase()===t.headSha.toLowerCase()&&e.modelId===t.modelId&&e.organizationId===t.organizationId&&e.workspaceRelativePath===t.workspaceRelativePath&&e.mode===t.mode}function fn(e){let t=fe(e);if(!t||typeof t.repoUrl!=="string"||typeof t.branch!=="string"||typeof t.headSha!=="string"||typeof t.modelId!=="string")return;try{return pn({repoUrl:t.repoUrl,branch:t.branch,headSha:t.headSha,modelId:t.modelId,...typeof t.organizationId==="string"?{organizationId:t.organizationId}:{},...typeof t.workspaceRelativePath==="string"?{workspaceRelativePath:t.workspaceRelativePath}:{},...t.mode==="plan"||t.mode==="yolo"||t.mode==="zen"?{mode:t.mode}:{}})}catch{return}}function Bo(e){let t=fe(fe(e)?.handoff);if(!t)return;let n=x(t.toCloudSessionId),s=x(t.handedOffAt),o=t.status;if(!n||!s||o!=="pending"&&o!=="complete")return;let i=x(t.innerSessionId),r=x(t.dashboardUrl),a=fn(t.fingerprint);return{toCloudSessionId:n,handedOffAt:s,status:o,...i?{innerSessionId:i}:{},...r?{dashboardUrl:r}:{},...a?{fingerprint:a}:{}}}function qo(e,t){return{...e??{},handoff:t}}function No(e){let{handoff:t,cloudHandoffIntent:n,cloudHandoffSeedDispatched:s,...o}=e??{};return o}function $o(e,t){let n=t.trim();if(!n)throw Error("Cloud session id cannot be empty.");let s=new URL("/agents",e);return s.searchParams.set("sessionId",n),s.toString()}function et(e){return e.map((t)=>{let n=t&&typeof t==="object"?t:{};return{role:n.role,content:n.content}})}function he(e,t){return e.length===t.length&&JSON.stringify(et(e))===JSON.stringify(et(t))}class me extends Error{constructor(e,t){super(`Cloud transcript verification failed (local ${e} messages, cloud ${t}).`);this.name="CloudHandoffTranscriptMismatchError"}}import{randomUUID as hn}from"node:crypto";import{decodeJwtPayload as mn}from"@cerebriline/shared";var gn=610000,yn=3000,B=15000,bn="CLOUD_SESSION_ERROR:",st="__cline_create_request__:";function ot(e){return(e.trim().split(`
|
|
8
|
-
`)[0]??"").trim().slice(0,72)}class g extends Error{code;detail;connectUrl;status;constructor(e,t,n,s){super(`${bn}${JSON.stringify({code:e,message:t,connectUrl:n})}`);this.code=e;this.detail=t;this.connectUrl=n;this.status=s;this.name="CloudSessionError"}}class it extends Error{constructor(e){super(e instanceof Error?e.message:"Cloud handoff creation was rejected.",{cause:e});this.name="CloudHandoffCreationRejectedError"}}function be(e){let t=e.length;while(t>0&&e[t-1]==="/")t--;return e.slice(0,t)}function wn(e){return`${st}${e}`.slice(0,255)}function tt(e){return e?.startsWith(st)===!0}function we(e){switch(e){case"provisioning":case"cloning_repo":case"agent_starting":case"ready":case"failed":return e;default:return}}function ge(e){let t=mn(e.replace(/^workos:/,""));return typeof t?.sub==="string"&&t.sub.trim()?t.sub.trim():void 0}function nt(e){return new Promise((t,n)=>{if(e.aborted){n(e.reason);return}let s=()=>{clearTimeout(o),n(e.reason)},o=setTimeout(()=>{e.removeEventListener("abort",s),t()},yn);e.addEventListener("abort",s,{once:!0})})}function vn(e,t){if(e&&typeof e==="object"){let n=e.error;if(typeof n==="string"&&n.trim())return n.trim()}return t}function ye(e,t,n,s){let o=vn(t,`Cloud session request failed (${e})`);if(e===401)return new g("authentication_required",o);if(e===404)return new g("session_not_found",o);if(e===410)return new g("session_expired",o);if(e===412)return new g("github_not_connected",o,s??`${be(n)}/dashboard/integrations`);if(e===403&&o.trim().toLowerCase()==="forbidden")return new g("request_failed","Your active account or organization cannot create cloud sessions. Switch to Personal or another organization in Settings → Account, then try again.",void 0,e);return new g("request_failed",o,void 0,e)}class Cn{options;apiBaseUrl;appBaseUrl;fetchImpl;createTimeoutMs;unconfirmedHandoffCreates=new Set;completedHandoffCreates=new Map;constructor(e){this.options=e;this.apiBaseUrl=be(e.apiBaseUrl),this.appBaseUrl=be(e.appBaseUrl),this.fetchImpl=e.fetch??fetch,this.createTimeoutMs=e.createTimeoutMs??gn}async request(e,t={},n,s,o){let i=!1,r;while(!0){let a;try{a=typeof s==="string"?s:await this.options.getAuthToken()}catch(f){if(r)throw ye(401,void 0,this.appBaseUrl,n);throw f}if(!a?.trim())throw new g("authentication_required","Sign in to Cline before starting a cloud session.");if(a.trim()===r)throw new g("authentication_required","The cloud session credential was rejected. Sign in again.");if(typeof s==="object"){if(s.subject?ge(a.trim())!==s.subject:a.trim()!==s.token)throw new g("authentication_required","The signed-in account changed during cloud session creation.");s.token=a.trim()}o?.();let d=await this.fetchImpl(`${this.apiBaseUrl}${e}`,{...t,signal:t.signal??AbortSignal.timeout(B),headers:{Accept:"application/json",Authorization:`Bearer ${a.trim()}`,...t.body?{"Content-Type":"application/json"}:{},...t.headers}}),u=d.status===204?void 0:await d.json().catch(()=>{return});if(!d.ok){if(d.status===401&&typeof s==="object"&&!i&&s.subject){i=!0,r=a.trim();continue}throw ye(d.status,u,this.appBaseUrl,n)}return u?.data}}async list(e){return await this.listWithToken(e)}async listWithToken(e,t,n=!1){let s=e?.trim()?`?organizationId=${encodeURIComponent(e.trim())}`:"";return(await this.request(`/api/v1/session${s}`,{},void 0,t)??[]).flatMap((i)=>{if(!i||typeof i!=="object"||typeof i.id!=="string")return[];return[{...i,title:!n&&tt(i.title)?void 0:i.title,repoContext:i.repoContext&&typeof i.repoContext==="object"?i.repoContext:{},metadata:{...i.metadata&&typeof i.metadata==="object"?i.metadata:{},...!n&&tt(i.title)?{createRequestTitle:i.title}:{}}}]})}async listRepositories(e){let t=e?.trim(),n=t?`${this.appBaseUrl}/dashboard/organization/integrations`:`${this.appBaseUrl}/dashboard/integrations`,s=t?`/api/v1/organizations/${encodeURIComponent(t)}/integrations/github/repositories`:"/api/v1/integrations/github/repositories";try{let o=await this.request(s)??[];return{connected:!0,connectUrl:n,repositories:o.flatMap((i)=>{let r=Number(i.id),a=String(i.html_url??i.clone_url??"").trim();if(!Number.isSafeInteger(r)||r<=0||!a)return[];let d=String(i.name??"").trim();return[{id:r,name:d,fullName:String(i.full_name??(d||a)).trim(),url:a,defaultBranch:String(i.default_branch??"").trim()}]})}}catch(o){if(o instanceof g&&o.code==="session_not_found")return{connected:!1,connectUrl:n,repositories:[]};throw o}}async listBranches(e,t,n={}){if(!Number.isSafeInteger(e)||e<=0)throw new g("request_failed","Select a GitHub repository before loading branches.");let s=t?.trim(),o=s?`/api/v1/organizations/${encodeURIComponent(s)}/integrations/github/repositories/${e}/branches`:`/api/v1/integrations/github/repositories/${e}/branches`,i=new URLSearchParams,r=n.query?.trim(),a=n.cursor?.trim();if(r)i.set("query",r);if(a)i.set("cursor",a);let d=i.size>0?`${o}?${i}`:o;try{let u=await this.request(d),f=Array.isArray(u)?u:Array.isArray(u?.items)?u.items:[],c=r?.toLowerCase();return{available:!0,branches:f.flatMap((h)=>{let p=String(h.name??"").trim();return p&&(!Array.isArray(u)||!c||p.toLowerCase().includes(c))?[p]:[]}),nextToken:Array.isArray(u)?"":String(u?.nextToken??"").trim()}}catch(u){if(u instanceof g&&u.code==="session_not_found")return{available:!1,branches:[]};throw u}}async status(e,t={}){return await this.request(`/api/v1/session/${encodeURIComponent(e)}/status`,{signal:t.signal?AbortSignal.any([t.signal,AbortSignal.timeout(B)]):void 0},void 0,t.authToken)}async create(e){if(e.handoff&&typeof e.handoff.onCreating!=="function")throw new g("request_failed","Cloud handoff requires an onCreating callback to persist creation intent before dispatch.");let t=(await this.options.getAuthToken())?.trim();if(!t)throw new g("authentication_required","Sign in to Cline before starting a cloud session.");let n={token:t,subject:ge(t)},s=wn(e.requestId?.trim()||hn()),o=e.handoff?`${n.subject??t}/${e.organizationId??""}/${e.requestId?.trim()??""}`:void 0;if(e.handoff&&!e.requestId?.trim())throw new g("request_failed","A stable request id is required for cloud handoff creation.");let i=async()=>(await this.listWithToken(e.organizationId??void 0,n,!0)).filter((c)=>c.title===s&&c.repoContext.repoUrl===e.repoUrl&&c.metadata.modelId===e.modelId&&(!e.branch?.trim()||c.repoContext.branch===e.branch.trim())),r=async(c)=>{if(c.status==="failed"||c.expiredAt&&Date.parse(c.expiredAt)<=Date.now()){let p=new g(c.status==="failed"?"session_failed":"session_expired","The recovered cloud handoff workspace is no longer usable.");try{await this.deleteWithAuth(c.id,n)}catch(l){if(!(l instanceof g&&(l.code==="session_not_found"||l.code==="session_expired")))throw AggregateError([p,l],"The unusable recovered cloud handoff workspace could not be removed.")}if(o)this.unconfirmedHandoffCreates.delete(o),this.completedHandoffCreates.delete(o);throw await e.handoff?.onOuterSessionRemoved?.(c.id),p}await e.handoff?.onOuterSessionCreated(c.id,{created:!1});let h={sessionId:c.id,status:c.status,sandboxUrl:c.sandboxUrl,cleanupAuthToken:n.token};if(o)this.unconfirmedHandoffCreates.delete(o),this.completedHandoffCreates.set(o,h);return h};if(o){let c=await i();if(c.length>1)throw new g("request_failed","Cloud handoff creation is ambiguous; inspect your cloud session list before continuing.");if(c[0])return await r(c[0]);let h=this.completedHandoffCreates.get(o);if(h){try{await this.request(`/api/v1/session/${encodeURIComponent(h.sessionId)}/status`,{},void 0,n)}catch(p){if(p instanceof g&&(p.code==="session_not_found"||p.code==="session_expired"))await e.handoff?.onOuterSessionRemoved?.(h.sessionId),this.completedHandoffCreates.delete(o),this.unconfirmedHandoffCreates.delete(o);throw p}return await e.handoff?.onOuterSessionCreated(h.sessionId,{created:!1}),{...h,cleanupAuthToken:n.token}}if(this.unconfirmedHandoffCreates.has(o))throw new g("request_failed","Cloud handoff creation is still unconfirmed. Recover the original request before creating another workspace.");this.unconfirmedHandoffCreates.add(o)}try{await e.handoff?.onCreating()}catch(c){if(o)this.unconfirmedHandoffCreates.delete(o);throw c}let a=new AbortController,d=setTimeout(()=>a.abort(),this.createTimeoutMs),u,f=!1;try{let c=await this.request("/api/v1/session",{method:"POST",body:JSON.stringify({modelId:e.modelId,repoUrl:e.repoUrl,...e.sandboxType?{sandboxType:e.sandboxType}:{},title:s,...e.branch?.trim()?{branch:e.branch.trim()}:{},...e.organizationId?.trim()?{organizationId:e.organizationId.trim()}:{}}),signal:a.signal},e.organizationId?.trim()?`${this.appBaseUrl}/dashboard/organization/integrations`:void 0,n,()=>{f=!0}),h=c?.sessionId?.trim();if(!h)throw new g("request_failed","The cloud session service returned no session id.");u=h,await this.persistHandoffOuterSession(e,h,n,o);let p={sessionId:h,status:c.status?.trim()||"provisioning",sandboxUrl:c.sandboxUrl?.trim()??"",cleanupAuthToken:n.token};if(o)this.unconfirmedHandoffCreates.delete(o),this.completedHandoffCreates.set(o,p);return p}catch(c){if(u)throw c;let h=!f||c instanceof g&&(c.status!==void 0&&c.status>=400&&c.status<500&&c.status!==408&&c.status!==409||["authentication_required","github_not_connected","session_not_found","session_expired"].includes(c.code));if(o&&h)throw this.unconfirmedHandoffCreates.delete(o),new it(c);if(a.signal.aborted||!(c instanceof g)||c instanceof g&&c.code==="request_failed"&&(c.status===void 0||c.status>=500||c.status===408||c.status===409)){let l=[];try{l=await i()}catch(y){if(e.handoff)throw AggregateError([c,y],"Cloud handoff creation is unconfirmed and its session list could not be checked.")}if(l.length>1)throw new g("request_failed","Cloud session creation had an ambiguous result. Check your cloud session list before trying again.");let m=l[0];if(m){if(e.handoff)return await r(m);return{sessionId:m.id,status:m.status,sandboxUrl:m.sandboxUrl,cleanupAuthToken:n.token}}}else if(o)this.unconfirmedHandoffCreates.delete(o);throw c}finally{clearTimeout(d)}}async persistHandoffOuterSession(e,t,n,s){if(!e.handoff)return;try{await e.handoff.onOuterSessionCreated(t,{created:!0})}catch(o){try{await this.deleteWithAuth(t,n.token)}catch(i){if(!(i instanceof g&&(i.code==="session_not_found"||i.code==="session_expired")))throw AggregateError([o,i],`Cloud session ${t} was created but its recovery record could not be saved or its sandbox removed.`)}if(s)this.unconfirmedHandoffCreates.delete(s);throw await e.handoff.onOuterSessionRemoved?.(t),o}}async waitUntilReady(e,t,n){t=AbortSignal.any([t,AbortSignal.timeout(this.createTimeoutMs)]);let s=await this.options.getAuthToken(),o=s?{token:s,subject:ge(s)}:void 0;while(!t.aborted){let i;try{i=await this.request(`/api/v1/session/${encodeURIComponent(e)}/status`,{signal:AbortSignal.any([t,AbortSignal.timeout(B)])},void 0,o)}catch(a){if(t.aborted)throw a;if(a instanceof g&&a.code!=="request_failed")throw a;await nt(t);continue}let r=i?.status?.trim().toLowerCase();if(n?.({phase:we(i?.phase)}),r==="ready"||r==="active")return;if(r==="failed")throw new g("session_failed",i?.statusReason?.trim()||"The cloud sandbox could not be prepared.");if(r!=="provisioning")throw new g("request_failed","The cloud session service returned an unexpected provisioning status.");await nt(t)}throw t.reason}async resume(e,t){return await this.request(`/api/v1/session/${encodeURIComponent(e)}/resume`,{method:"POST",signal:t?AbortSignal.any([t,AbortSignal.timeout(B)]):void 0})}async delete(e,t){await this.deleteWithAuth(e,t)}async deleteWithAuth(e,t){let n;try{await this.request(`/api/v1/session/${encodeURIComponent(e)}`,{method:"DELETE"},void 0,t)}catch(s){if(!(s instanceof g)||s.code!=="session_not_found"&&s.code!=="session_expired")throw s;n=s}for(let[s,o]of this.completedHandoffCreates)if(o.sessionId===e)this.completedHandoffCreates.delete(s),this.unconfirmedHandoffCreates.delete(s);if(n)throw n}async updateTitle(e,t){return await this.request(`/api/v1/session/${encodeURIComponent(e)}`,{method:"PATCH",body:JSON.stringify({title:t})})}async history(e){let t=await this.options.getAuthToken();if(!t?.trim())throw new g("authentication_required","Sign in to Cline to load this session's history.");let n=await this.fetchImpl(`${this.apiBaseUrl}/api/v1/session/${encodeURIComponent(e)}/history`,{headers:{Accept:"application/json",Authorization:`Bearer ${t.trim()}`},signal:AbortSignal.timeout(B)});if(n.status===404)return null;let s=await n.json().catch(()=>{return});if(!n.ok)throw ye(n.status,s,this.appBaseUrl);if(!s||typeof s!=="object"||!("version"in s)||s.version!==1||!("messages"in s)||!Array.isArray(s.messages))throw new g("request_failed","Invalid archived session history");return s.messages}}import{randomUUID as yo}from"node:crypto";import{posix as le}from"node:path";import{createSessionId as qs,ensureLoopbackProxyBypass as qt,isHubProtocolCompatible as Ns,resolveClineBuildEnv as $s,resolveHubCommandTimeoutMs as Ws}from"@cerebriline/shared";import js from"ws";var q={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 rt="session_not_found";class Y 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"}}function ve(e){return e instanceof Y||typeof e==="object"&&e!==null&&"code"in e&&e.code==="session_not_found"}import{spawn as os}from"node:child_process";import{closeSync as is,mkdirSync as rs,openSync as as,readFileSync as ds,unlinkSync as cs}from"node:fs";import{basename as us,dirname as ls,join as ps}from"node:path";import{fileURLToPath as fs}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as hs,isBunEmbeddedModulePath as ms,isHubDaemonProcess as gs,resolveClineBuildEnv as Et,withResolvedClineBuildEnv as ys}from"@cerebriline/shared";import{createHash as kn,randomBytes as Rn}from"node:crypto";import{mkdir as Se,open as at,readFile as pt,rename as _n,rm as ke,writeFile as Pn}from"node:fs/promises";import{dirname as ft,join as Re}from"node:path";import{ensureLoopbackProxyBypass as An,isHubProtocolCompatible as Tn}from"@cerebriline/shared";import{resolveClineDataDir as N,resolveClineDir as ii}from"@cerebriline/shared/storage";var xn="CLINE_HUB_DISCOVERY_PATH",En="CLINE_HUB_BUILD_ID",Hn="CLINE_HUB_BUILD_EPOCH_MS",In=30000,Mn=15000,dt=100;function On(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function Un(e){return kn("sha256").update(e).digest("hex").slice(0,12)}function Dn(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 ct(e){return new Promise((t)=>setTimeout(t,e))}function Ln(e){return`${e}.lock`}async function Bn(e){try{let t=JSON.parse(await pt(Re(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 Ce(e){await ke(e,{recursive:!0,force:!0}).catch(()=>{return})}function U(){let e=process.env[En]?.trim();if(e)return e;return"sdk-v1-1071053872eb3698f38cf3974442712ce92c210baff6d552a25a556dce7bb8f7".trim()||`source-${String(q.version)}`}function qn(){let e=Number(process.env[Hn]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1792766280951)?1792766280951:void 0}function X(e,t=U()){let n=Tn(e);if(!n.compatible)return n;let s=e.buildId?.trim();if(!s)return{compatible:!1,reason:"missing_build"};if(s!==t)return{compatible:!1,reason:"build_mismatch"};return{compatible:!0}}function ut(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0}function lt(e){let t=e?.trim().split(/[-+]/,1)[0];if(!t)return;let n=t.split(".").map((s)=>Number(s));if(n.length===0||n.some((s)=>!Number.isInteger(s)||s<0))return;return n}function Nn(e,t){for(let n=0;n<Math.max(e.length,t.length);n++){let s=e[n]??0,o=t[n]??0;if(s!==o)return s<o?-1:1}return 0}function ht(e,t){let n=e.buildId?.trim(),s=t.buildId?.trim();if(n&&s&&n===s)return 0;let o=ut(e.buildEpochMs),i=ut(t.buildEpochMs);if(o!==void 0&&i!==void 0&&o!==i)return o<i?-1:1;let r=lt(e.coreVersion),a=lt(t.coreVersion);if(r&&a){let d=Nn(r,a);if(d!==0)return d}if(n&&s&&n!==s)return n<s?-1:1;return 0}function mt(){return{buildId:U(),buildEpochMs:qn(),coreVersion:String(q.version)}}function Z(e,t){let n=t?.self??mt(),s=X(e,n.buildId??"");if(s.compatible)return!0;if(s.reason!=="build_mismatch"&&s.reason!=="missing_build")return!1;return ht(n,e)<=0}function gt(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${Un(e)}`,n=process.env[xn]?.trim()||Re(N(),"locks","hub","owners",`${On(t)}.json`);return{ownerId:t,discoveryPath:n}}async function I(e){try{let t=JSON.parse(await pt(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 yt(e,t,n){await wt(e,async()=>{let s=ft(e);await Se(s,{recursive:!0});let o=`${e}.${process.pid}.${Rn(6).toString("hex")}.tmp`,i;try{i=await at(o,"wx",384),await i.writeFile(`${JSON.stringify(t,null,2)}
|
|
8
|
+
`)[0]??"").trim().slice(0,72)}class g extends Error{code;detail;connectUrl;status;constructor(e,t,n,s){super(`${bn}${JSON.stringify({code:e,message:t,connectUrl:n})}`);this.code=e;this.detail=t;this.connectUrl=n;this.status=s;this.name="CloudSessionError"}}class it extends Error{constructor(e){super(e instanceof Error?e.message:"Cloud handoff creation was rejected.",{cause:e});this.name="CloudHandoffCreationRejectedError"}}function be(e){let t=e.length;while(t>0&&e[t-1]==="/")t--;return e.slice(0,t)}function wn(e){return`${st}${e}`.slice(0,255)}function tt(e){return e?.startsWith(st)===!0}function we(e){switch(e){case"provisioning":case"cloning_repo":case"agent_starting":case"ready":case"failed":return e;default:return}}function ge(e){let t=mn(e.replace(/^workos:/,""));return typeof t?.sub==="string"&&t.sub.trim()?t.sub.trim():void 0}function nt(e){return new Promise((t,n)=>{if(e.aborted){n(e.reason);return}let s=()=>{clearTimeout(o),n(e.reason)},o=setTimeout(()=>{e.removeEventListener("abort",s),t()},yn);e.addEventListener("abort",s,{once:!0})})}function vn(e,t){if(e&&typeof e==="object"){let n=e.error;if(typeof n==="string"&&n.trim())return n.trim()}return t}function ye(e,t,n,s){let o=vn(t,`Cloud session request failed (${e})`);if(e===401)return new g("authentication_required",o);if(e===404)return new g("session_not_found",o);if(e===410)return new g("session_expired",o);if(e===412)return new g("github_not_connected",o,s??`${be(n)}/dashboard/integrations`);if(e===403&&o.trim().toLowerCase()==="forbidden")return new g("request_failed","Your active account or organization cannot create cloud sessions. Switch to Personal or another organization in Settings → Account, then try again.",void 0,e);return new g("request_failed",o,void 0,e)}class Cn{options;apiBaseUrl;appBaseUrl;fetchImpl;createTimeoutMs;unconfirmedHandoffCreates=new Set;completedHandoffCreates=new Map;constructor(e){this.options=e;this.apiBaseUrl=be(e.apiBaseUrl),this.appBaseUrl=be(e.appBaseUrl),this.fetchImpl=e.fetch??fetch,this.createTimeoutMs=e.createTimeoutMs??gn}async request(e,t={},n,s,o){let i=!1,r;while(!0){let a;try{a=typeof s==="string"?s:await this.options.getAuthToken()}catch(f){if(r)throw ye(401,void 0,this.appBaseUrl,n);throw f}if(!a?.trim())throw new g("authentication_required","Sign in to Cline before starting a cloud session.");if(a.trim()===r)throw new g("authentication_required","The cloud session credential was rejected. Sign in again.");if(typeof s==="object"){if(s.subject?ge(a.trim())!==s.subject:a.trim()!==s.token)throw new g("authentication_required","The signed-in account changed during cloud session creation.");s.token=a.trim()}o?.();let d=await this.fetchImpl(`${this.apiBaseUrl}${e}`,{...t,signal:t.signal??AbortSignal.timeout(B),headers:{Accept:"application/json",Authorization:`Bearer ${a.trim()}`,...t.body?{"Content-Type":"application/json"}:{},...t.headers}}),u=d.status===204?void 0:await d.json().catch(()=>{return});if(!d.ok){if(d.status===401&&typeof s==="object"&&!i&&s.subject){i=!0,r=a.trim();continue}throw ye(d.status,u,this.appBaseUrl,n)}return u?.data}}async list(e){return await this.listWithToken(e)}async listWithToken(e,t,n=!1){let s=e?.trim()?`?organizationId=${encodeURIComponent(e.trim())}`:"";return(await this.request(`/api/v1/session${s}`,{},void 0,t)??[]).flatMap((i)=>{if(!i||typeof i!=="object"||typeof i.id!=="string")return[];return[{...i,title:!n&&tt(i.title)?void 0:i.title,repoContext:i.repoContext&&typeof i.repoContext==="object"?i.repoContext:{},metadata:{...i.metadata&&typeof i.metadata==="object"?i.metadata:{},...!n&&tt(i.title)?{createRequestTitle:i.title}:{}}}]})}async listRepositories(e){let t=e?.trim(),n=t?`${this.appBaseUrl}/dashboard/organization/integrations`:`${this.appBaseUrl}/dashboard/integrations`,s=t?`/api/v1/organizations/${encodeURIComponent(t)}/integrations/github/repositories`:"/api/v1/integrations/github/repositories";try{let o=await this.request(s)??[];return{connected:!0,connectUrl:n,repositories:o.flatMap((i)=>{let r=Number(i.id),a=String(i.html_url??i.clone_url??"").trim();if(!Number.isSafeInteger(r)||r<=0||!a)return[];let d=String(i.name??"").trim();return[{id:r,name:d,fullName:String(i.full_name??(d||a)).trim(),url:a,defaultBranch:String(i.default_branch??"").trim()}]})}}catch(o){if(o instanceof g&&o.code==="session_not_found")return{connected:!1,connectUrl:n,repositories:[]};throw o}}async listBranches(e,t,n={}){if(!Number.isSafeInteger(e)||e<=0)throw new g("request_failed","Select a GitHub repository before loading branches.");let s=t?.trim(),o=s?`/api/v1/organizations/${encodeURIComponent(s)}/integrations/github/repositories/${e}/branches`:`/api/v1/integrations/github/repositories/${e}/branches`,i=new URLSearchParams,r=n.query?.trim(),a=n.cursor?.trim();if(r)i.set("query",r);if(a)i.set("cursor",a);let d=i.size>0?`${o}?${i}`:o;try{let u=await this.request(d),f=Array.isArray(u)?u:Array.isArray(u?.items)?u.items:[],c=r?.toLowerCase();return{available:!0,branches:f.flatMap((h)=>{let p=String(h.name??"").trim();return p&&(!Array.isArray(u)||!c||p.toLowerCase().includes(c))?[p]:[]}),nextToken:Array.isArray(u)?"":String(u?.nextToken??"").trim()}}catch(u){if(u instanceof g&&u.code==="session_not_found")return{available:!1,branches:[]};throw u}}async status(e,t={}){return await this.request(`/api/v1/session/${encodeURIComponent(e)}/status`,{signal:t.signal?AbortSignal.any([t.signal,AbortSignal.timeout(B)]):void 0},void 0,t.authToken)}async create(e){if(e.handoff&&typeof e.handoff.onCreating!=="function")throw new g("request_failed","Cloud handoff requires an onCreating callback to persist creation intent before dispatch.");let t=(await this.options.getAuthToken())?.trim();if(!t)throw new g("authentication_required","Sign in to Cline before starting a cloud session.");let n={token:t,subject:ge(t)},s=wn(e.requestId?.trim()||hn()),o=e.handoff?`${n.subject??t}/${e.organizationId??""}/${e.requestId?.trim()??""}`:void 0;if(e.handoff&&!e.requestId?.trim())throw new g("request_failed","A stable request id is required for cloud handoff creation.");let i=async()=>(await this.listWithToken(e.organizationId??void 0,n,!0)).filter((c)=>c.title===s&&c.repoContext.repoUrl===e.repoUrl&&c.metadata.modelId===e.modelId&&(!e.branch?.trim()||c.repoContext.branch===e.branch.trim())),r=async(c)=>{if(c.status==="failed"||c.expiredAt&&Date.parse(c.expiredAt)<=Date.now()){let p=new g(c.status==="failed"?"session_failed":"session_expired","The recovered cloud handoff workspace is no longer usable.");try{await this.deleteWithAuth(c.id,n)}catch(l){if(!(l instanceof g&&(l.code==="session_not_found"||l.code==="session_expired")))throw AggregateError([p,l],"The unusable recovered cloud handoff workspace could not be removed.")}if(o)this.unconfirmedHandoffCreates.delete(o),this.completedHandoffCreates.delete(o);throw await e.handoff?.onOuterSessionRemoved?.(c.id),p}await e.handoff?.onOuterSessionCreated(c.id,{created:!1});let h={sessionId:c.id,status:c.status,sandboxUrl:c.sandboxUrl,cleanupAuthToken:n.token};if(o)this.unconfirmedHandoffCreates.delete(o),this.completedHandoffCreates.set(o,h);return h};if(o){let c=await i();if(c.length>1)throw new g("request_failed","Cloud handoff creation is ambiguous; inspect your cloud session list before continuing.");if(c[0])return await r(c[0]);let h=this.completedHandoffCreates.get(o);if(h){try{await this.request(`/api/v1/session/${encodeURIComponent(h.sessionId)}/status`,{},void 0,n)}catch(p){if(p instanceof g&&(p.code==="session_not_found"||p.code==="session_expired"))await e.handoff?.onOuterSessionRemoved?.(h.sessionId),this.completedHandoffCreates.delete(o),this.unconfirmedHandoffCreates.delete(o);throw p}return await e.handoff?.onOuterSessionCreated(h.sessionId,{created:!1}),{...h,cleanupAuthToken:n.token}}if(this.unconfirmedHandoffCreates.has(o))throw new g("request_failed","Cloud handoff creation is still unconfirmed. Recover the original request before creating another workspace.");this.unconfirmedHandoffCreates.add(o)}try{await e.handoff?.onCreating()}catch(c){if(o)this.unconfirmedHandoffCreates.delete(o);throw c}let a=new AbortController,d=setTimeout(()=>a.abort(),this.createTimeoutMs),u,f=!1;try{let c=await this.request("/api/v1/session",{method:"POST",body:JSON.stringify({modelId:e.modelId,repoUrl:e.repoUrl,...e.sandboxType?{sandboxType:e.sandboxType}:{},title:s,...e.branch?.trim()?{branch:e.branch.trim()}:{},...e.organizationId?.trim()?{organizationId:e.organizationId.trim()}:{}}),signal:a.signal},e.organizationId?.trim()?`${this.appBaseUrl}/dashboard/organization/integrations`:void 0,n,()=>{f=!0}),h=c?.sessionId?.trim();if(!h)throw new g("request_failed","The cloud session service returned no session id.");u=h,await this.persistHandoffOuterSession(e,h,n,o);let p={sessionId:h,status:c.status?.trim()||"provisioning",sandboxUrl:c.sandboxUrl?.trim()??"",cleanupAuthToken:n.token};if(o)this.unconfirmedHandoffCreates.delete(o),this.completedHandoffCreates.set(o,p);return p}catch(c){if(u)throw c;let h=!f||c instanceof g&&(c.status!==void 0&&c.status>=400&&c.status<500&&c.status!==408&&c.status!==409||["authentication_required","github_not_connected","session_not_found","session_expired"].includes(c.code));if(o&&h)throw this.unconfirmedHandoffCreates.delete(o),new it(c);if(a.signal.aborted||!(c instanceof g)||c instanceof g&&c.code==="request_failed"&&(c.status===void 0||c.status>=500||c.status===408||c.status===409)){let l=[];try{l=await i()}catch(y){if(e.handoff)throw AggregateError([c,y],"Cloud handoff creation is unconfirmed and its session list could not be checked.")}if(l.length>1)throw new g("request_failed","Cloud session creation had an ambiguous result. Check your cloud session list before trying again.");let m=l[0];if(m){if(e.handoff)return await r(m);return{sessionId:m.id,status:m.status,sandboxUrl:m.sandboxUrl,cleanupAuthToken:n.token}}}else if(o)this.unconfirmedHandoffCreates.delete(o);throw c}finally{clearTimeout(d)}}async persistHandoffOuterSession(e,t,n,s){if(!e.handoff)return;try{await e.handoff.onOuterSessionCreated(t,{created:!0})}catch(o){try{await this.deleteWithAuth(t,n.token)}catch(i){if(!(i instanceof g&&(i.code==="session_not_found"||i.code==="session_expired")))throw AggregateError([o,i],`Cloud session ${t} was created but its recovery record could not be saved or its sandbox removed.`)}if(s)this.unconfirmedHandoffCreates.delete(s);throw await e.handoff.onOuterSessionRemoved?.(t),o}}async waitUntilReady(e,t,n){t=AbortSignal.any([t,AbortSignal.timeout(this.createTimeoutMs)]);let s=await this.options.getAuthToken(),o=s?{token:s,subject:ge(s)}:void 0;while(!t.aborted){let i;try{i=await this.request(`/api/v1/session/${encodeURIComponent(e)}/status`,{signal:AbortSignal.any([t,AbortSignal.timeout(B)])},void 0,o)}catch(a){if(t.aborted)throw a;if(a instanceof g&&a.code!=="request_failed")throw a;await nt(t);continue}let r=i?.status?.trim().toLowerCase();if(n?.({phase:we(i?.phase)}),r==="ready"||r==="active")return;if(r==="failed")throw new g("session_failed",i?.statusReason?.trim()||"The cloud sandbox could not be prepared.");if(r!=="provisioning")throw new g("request_failed","The cloud session service returned an unexpected provisioning status.");await nt(t)}throw t.reason}async resume(e,t){return await this.request(`/api/v1/session/${encodeURIComponent(e)}/resume`,{method:"POST",signal:t?AbortSignal.any([t,AbortSignal.timeout(B)]):void 0})}async delete(e,t){await this.deleteWithAuth(e,t)}async deleteWithAuth(e,t){let n;try{await this.request(`/api/v1/session/${encodeURIComponent(e)}`,{method:"DELETE"},void 0,t)}catch(s){if(!(s instanceof g)||s.code!=="session_not_found"&&s.code!=="session_expired")throw s;n=s}for(let[s,o]of this.completedHandoffCreates)if(o.sessionId===e)this.completedHandoffCreates.delete(s),this.unconfirmedHandoffCreates.delete(s);if(n)throw n}async updateTitle(e,t){return await this.request(`/api/v1/session/${encodeURIComponent(e)}`,{method:"PATCH",body:JSON.stringify({title:t})})}async history(e){let t=await this.options.getAuthToken();if(!t?.trim())throw new g("authentication_required","Sign in to Cline to load this session's history.");let n=await this.fetchImpl(`${this.apiBaseUrl}/api/v1/session/${encodeURIComponent(e)}/history`,{headers:{Accept:"application/json",Authorization:`Bearer ${t.trim()}`},signal:AbortSignal.timeout(B)});if(n.status===404)return null;let s=await n.json().catch(()=>{return});if(!n.ok)throw ye(n.status,s,this.appBaseUrl);if(!s||typeof s!=="object"||!("version"in s)||s.version!==1||!("messages"in s)||!Array.isArray(s.messages))throw new g("request_failed","Invalid archived session history");return s.messages}}import{randomUUID as yo}from"node:crypto";import{posix as le}from"node:path";import{createSessionId as qs,ensureLoopbackProxyBypass as qt,isHubProtocolCompatible as Ns,resolveClineBuildEnv as $s,resolveHubCommandTimeoutMs as Ws}from"@cerebriline/shared";import js from"ws";var q={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 rt="session_not_found";class Y 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"}}function ve(e){return e instanceof Y||typeof e==="object"&&e!==null&&"code"in e&&e.code==="session_not_found"}import{spawn as os}from"node:child_process";import{closeSync as is,mkdirSync as rs,openSync as as,readFileSync as ds,unlinkSync as cs}from"node:fs";import{basename as us,dirname as ls,join as ps}from"node:path";import{fileURLToPath as fs}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as hs,isBunEmbeddedModulePath as ms,isHubDaemonProcess as gs,resolveClineBuildEnv as Et,withResolvedClineBuildEnv as ys}from"@cerebriline/shared";import{createHash as kn,randomBytes as Rn}from"node:crypto";import{mkdir as Se,open as at,readFile as pt,rename as _n,rm as ke,writeFile as Pn}from"node:fs/promises";import{dirname as ft,join as Re}from"node:path";import{ensureLoopbackProxyBypass as An,isHubProtocolCompatible as Tn}from"@cerebriline/shared";import{resolveClineDataDir as N,resolveClineDir as ii}from"@cerebriline/shared/storage";var xn="CLINE_HUB_DISCOVERY_PATH",En="CLINE_HUB_BUILD_ID",Hn="CLINE_HUB_BUILD_EPOCH_MS",In=30000,Mn=15000,dt=100;function On(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function Un(e){return kn("sha256").update(e).digest("hex").slice(0,12)}function Dn(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 ct(e){return new Promise((t)=>setTimeout(t,e))}function Ln(e){return`${e}.lock`}async function Bn(e){try{let t=JSON.parse(await pt(Re(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 Ce(e){await ke(e,{recursive:!0,force:!0}).catch(()=>{return})}function U(){let e=process.env[En]?.trim();if(e)return e;return"sdk-v1-34a535a13d156348559d06088ca1d67cf0890077ffb8eae5f4f7dc502bff2722".trim()||`source-${String(q.version)}`}function qn(){let e=Number(process.env[Hn]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1792773013448)?1792773013448:void 0}function X(e,t=U()){let n=Tn(e);if(!n.compatible)return n;let s=e.buildId?.trim();if(!s)return{compatible:!1,reason:"missing_build"};if(s!==t)return{compatible:!1,reason:"build_mismatch"};return{compatible:!0}}function ut(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0}function lt(e){let t=e?.trim().split(/[-+]/,1)[0];if(!t)return;let n=t.split(".").map((s)=>Number(s));if(n.length===0||n.some((s)=>!Number.isInteger(s)||s<0))return;return n}function Nn(e,t){for(let n=0;n<Math.max(e.length,t.length);n++){let s=e[n]??0,o=t[n]??0;if(s!==o)return s<o?-1:1}return 0}function ht(e,t){let n=e.buildId?.trim(),s=t.buildId?.trim();if(n&&s&&n===s)return 0;let o=ut(e.buildEpochMs),i=ut(t.buildEpochMs);if(o!==void 0&&i!==void 0&&o!==i)return o<i?-1:1;let r=lt(e.coreVersion),a=lt(t.coreVersion);if(r&&a){let d=Nn(r,a);if(d!==0)return d}if(n&&s&&n!==s)return n<s?-1:1;return 0}function mt(){return{buildId:U(),buildEpochMs:qn(),coreVersion:String(q.version)}}function Z(e,t){let n=t?.self??mt(),s=X(e,n.buildId??"");if(s.compatible)return!0;if(s.reason!=="build_mismatch"&&s.reason!=="missing_build")return!1;return ht(n,e)<=0}function gt(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${Un(e)}`,n=process.env[xn]?.trim()||Re(N(),"locks","hub","owners",`${On(t)}.json`);return{ownerId:t,discoveryPath:n}}async function I(e){try{let t=JSON.parse(await pt(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 yt(e,t,n){await wt(e,async()=>{let s=ft(e);await Se(s,{recursive:!0});let o=`${e}.${process.pid}.${Rn(6).toString("hex")}.tmp`,i;try{i=await at(o,"wx",384),await i.writeFile(`${JSON.stringify(t,null,2)}
|
|
9
9
|
`,{encoding:"utf8"}),await i.sync(),await i.close(),i=void 0,n?.beforePublish?.(),await _n(o,e);let r;try{r=await at(s,"r"),await r.sync()}catch{}finally{await r?.close().catch(()=>{return})}}catch(r){throw await i?.close().catch(()=>{return}),await ke(o,{force:!0}).catch(()=>{return}),r}})}async function D(e){await wt(e,async()=>{await ke(e,{force:!0}).catch(()=>{return})})}async function bt(e,t,n){let s=Ln(e);await Se(ft(s),{recursive:!0});let o=Date.now()+Mn;while(!0){try{await Se(s,{recursive:!1})}catch(i){if((i instanceof Error&&"code"in i?String(i.code):"")!=="EEXIST")throw i;let a=await Bn(s);if(!a){if(Date.now()>=o){await Ce(s);continue}await ct(dt);continue}let d=Date.now()-Date.parse(a.acquiredAt);if(!Dn(a.pid)||d>In){await Ce(s);continue}if(Date.now()>=o)throw Error(`Timed out waiting for hub ${t} lock ${s}`);await ct(dt);continue}try{return await Pn(Re(s,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
|
|
10
10
|
`,"utf8"),await n()}finally{await Ce(s)}}}function wt(e,t){return bt(`${e}.mutation`,"discovery mutation",t)}function vt(e,t){return bt(e,"startup",t)}async function ee(e,t){An();try{let n=await fetch(t?.authToken?$n(e):St(e),{headers:t?.authToken?{authorization:`Bearer ${t.authToken}`}:void 0,signal:t?.signal});if(!n.ok)return;let s=await n.json();if(typeof s.protocolVersion!=="string"||typeof s.host!=="string"||typeof s.port!=="number"||typeof s.url!=="string")return;return{protocolVersion:s.protocolVersion,minClientProtocolVersion:typeof s.minClientProtocolVersion==="string"?s.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof s.maxClientProtocolVersion==="string"?s.maxClientProtocolVersion:void 0,capabilities:Array.isArray(s.capabilities)?s.capabilities.filter((o)=>typeof o==="string"):void 0,coreVersion:typeof s.coreVersion==="string"?s.coreVersion:void 0,buildId:typeof s.buildId==="string"?s.buildId:void 0,buildEpochMs:typeof s.buildEpochMs==="number"?s.buildEpochMs:void 0,host:s.host,port:s.port,url:s.url,hubId:typeof s.hubId==="string"?s.hubId:void 0,authToken:typeof s.authToken==="string"?s.authToken:void 0,pid:typeof s.pid==="number"?s.pid:void 0,startedAt:typeof s.startedAt==="string"?s.startedAt:void 0,updatedAt:typeof s.updatedAt==="string"?s.updatedAt:void 0}}catch{return}}function Ct(e,t,n="/hub"){return new URL(`ws://${e}:${t}${n}`).toString()}function St(e){let t=new URL(e);return t.protocol=t.protocol==="wss:"?"https:":"http:",t.pathname="/health",t.search="",t.toString()}function $n(e){let t=new URL(St(e));return t.pathname="/status",t.toString()}import{CLINE_HUB_DEV_PORT as Wn,CLINE_HUB_PORT as jn,resolveClineBuildEnv as Fn}from"@cerebriline/shared";var zn="CLINE_HUB_HOST",Vn="CLINE_HUB_PORT",Gn="CLINE_HUB_PATHNAME",Jn="127.0.0.1",Kn=jn,Qn="/hub";function kt(e){return Fn(e)==="development"?Wn:Kn}function Yn(e={}){return(e.env??process.env)[zn]?.trim()||Jn}function Xn(e={}){let n=(e.env??process.env)[Vn]?.trim();if(!n)return kt(e);let s=Number.parseInt(n,10);if(!Number.isInteger(s)||s<1||s>65535)return kt(e);return s}function Zn(e={}){return(e.env??process.env)[Gn]?.trim()||Qn}function Rt(e={},t={}){return{host:e.host??Yn(t),port:e.port??Xn(t),pathname:e.pathname??Zn(t)}}import{join as es}from"node:path";var ts="shared:cline",ns="CLINE_HUB_DISCOVERY_PATH",ss="hub-production";function W(e=ts){return gt(`${e}@${U()}`)}function te(){return{ownerId:ss,discoveryPath:process.env[ns]?.trim()||es(N(),"locks","hub","production.json")}}var _t=15000,bs=200,Pt=3000,ws=100,vs=[100,250,500,1000,2000],Cs="--cline-hub-daemon",Ss=3,ks=60000,At=new Map;function Rs(e,t=Date.now()){let n=At.get(e);if(!n||t-n.windowStartedAt>ks)return At.set(e,{count:1,windowStartedAt:t}),!0;return n.count+=1,n.count<=Ss}function _s(e){return[...e.host?["--host",e.host]:[],...typeof e.port==="number"?["--port",String(e.port)]:[],...e.pathname?["--pathname",e.pathname]:[]]}function Ps(){try{let e=ps(N(),"logs","hub-daemon.log");return rs(ls(e),{recursive:!0}),{fd:as(e,"a"),logPath:e}}catch{return}}function As(){return Et()==="production"?te():W()}function j(e){return Z(e)}function Ts(e){try{let t=JSON.parse(ds(`${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 _e(e){try{cs(`${e}.superseded`)}catch{}}function Tt(e,t,n){if(!t||t.url!==n)return e;return{...e,authToken:e.authToken??t.authToken,pid:e.pid??t.pid}}async function F(e,t){try{return await ee(e,{authToken:t})}catch{return}}async function xt(e,t){let n=Date.now()+t;while(Date.now()<n){if(!(await F(e))?.url)return!0;await new Promise((o)=>setTimeout(o,ws))}return!1}async function Ae(e,t){if(!Rs(e.url))return!1;await z(e.url,e.authToken,"retired by newer install").catch(()=>!1),await Mt(e.url,e.authToken).catch(()=>!1);let n=await xt(e.url,Pt);if(!n&&e.pid&&xs(e.pid)){try{process.kill(e.pid,"SIGTERM")}catch{}n=await xt(e.url,Pt)}if(n)await D(t).catch(()=>{return});return n}function xs(e){try{return process.kill(e,0),!0}catch(t){return t?.code==="EPERM"}}async function Es(e){try{return(await Te(e.url,e.authToken)).activeSessionCount>0}catch{return!1}}async function Pe(e,t){if(j(e))return"reusable";let n=await z(e.url,e.authToken,"retired by newer install").catch(()=>!1);if(await Es(e)){if(n)await z(e.url,e.authToken,"hub retirement deferred",{off:!0}).catch(()=>!1);return"deferred_busy"}let s=await Ae(e,t);if(!s&&n)await z(e.url,e.authToken,"hub retirement failed",{off:!0}).catch(()=>!1);return s?"retired":"failed"}async function Hs(e){if(Et()!=="production")return;let t=W();if(t.discoveryPath===e.discoveryPath)return;let n=await I(t.discoveryPath);if(n?.url)await Ae(n,t.discoveryPath);else await D(t.discoveryPath).catch(()=>{return})}function Is(){let e=import.meta.url.endsWith(".ts")?"ts":"js";return fs(new URL(`./entry.${e}`,import.meta.url))}function Ms(e,t){if(ms(e))return[Cs];return[...t&&e.toLowerCase().endsWith(".ts")?["--conditions=development"]:[],e]}function Os(e,t){let n=Is(),s=process.execPath?.trim();if(!s)throw Error("unable to resolve runtime executable for hub daemon");let o=us(s).toLowerCase().includes("bun"),i=Ms(n,o);return{launcher:s,args:[...i,"--cwd",e,..._s(t),...t.manageConnectors===!1?["--no-connectors"]:[]],cwd:e,env:{...ys(process.env),CLINE_NO_INTERACTIVE:"1",[hs]:"1"}}}function Us(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 Ds(e,t={}){if(gs())return;let n=Os(e,t),s=Ps();try{os(n.launcher,n.args,{detached:!0,stdio:s?["ignore",s.fd,s.fd]:"ignore",env:n.env,cwd:n.cwd,windowsHide:!0}).unref()}finally{if(s)is(s.fd)}}async function Ls(e,t={}){for(let n=0;;n++)try{Ds(e,t);return}catch(s){let o=vs[n];if(!Us(s)||o===void 0)throw s;await new Promise((i)=>setTimeout(i,o))}}async function Bs(e,t,n={}){let s=n.host!==void 0||n.port!==void 0||n.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),o=Rt(n),i=Ct(o.host,o.port,o.pathname),r=(l)=>{if(!s)ne(l.url,l.authToken);else It(l.url,l.authToken);return l};await Hs(e).catch(()=>{return});let a=await I(e.discoveryPath),d=a?.url?void 0:Ts(e.discoveryPath),u=!1;if(a?.url){let l=a.authToken;if(!l)u=!0,await Ae(a,e.discoveryPath);else{let m=await F(a.url,l);if(m?.url&&j(m)&&await E(m.url,{authToken:l}))return _e(e.discoveryPath),r({url:m.url,authToken:l});if(m?.url){if(await Pe({...m,authToken:l},e.discoveryPath)==="deferred_busy"&&await E(m.url,{authToken:l}))return r({url:m.url,authToken:l})}else await D(e.discoveryPath).catch(()=>{return})}}let f=await F(i);if(f?.url){let l=Tt(f,a??d,i);if(j(f)){let y=[f.authToken,a?.authToken,d?.authToken].filter((v)=>typeof v==="string"&&v.trim().length>0);for(let v of y){if(!await E(f.url,{authToken:v}))continue;let P={hubId:f.hubId??`repaired-${f.port}`,protocolVersion:f.protocolVersion,minClientProtocolVersion:f.minClientProtocolVersion,maxClientProtocolVersion:f.maxClientProtocolVersion,capabilities:f.capabilities,coreVersion:f.coreVersion,buildId:f.buildId,authToken:v,host:f.host,port:f.port,url:f.url,pid:f.pid??a?.pid??d?.pid,startedAt:f.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await yt(e.discoveryPath,P)}catch{}return _e(e.discoveryPath),r({url:f.url,authToken:v})}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.${u?" 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 m=await Pe(l,e.discoveryPath);if(m==="deferred_busy"){for(let y of[l.authToken,a?.authToken].filter((w)=>typeof w==="string"&&w.trim().length>0))if(await E(f.url,{authToken:y}))return r({url:f.url,authToken:y});if(n.allowPortFallback!==!0&&o.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(m==="failed"&&n.allowPortFallback!==!0&&o.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 h=n.allowPortFallback===!0&&o.port!==0?{...o,port:0}:o;await Ls(t,{...h,manageConnectors:n.manageConnectors});let p=Date.now()+_t;while(Date.now()<p){let l=await I(e.discoveryPath);if(l?.url&&l.authToken){let y=await F(l.url,l.authToken);if(y?.url&&j(y)&&await E(y.url,{authToken:l.authToken}))return _e(e.discoveryPath),r({url:y.url,authToken:l.authToken})}let m=await F(i);if(m?.url&&!j(m)){let y=Tt(m,l??d,i),w=await Pe(y,e.discoveryPath);if(w==="deferred_busy"&&l?.authToken&&await E(m.url,{authToken:l.authToken}))return r({url:m.url,authToken:l.authToken});if(w==="failed"&&n.allowPortFallback!==!0&&o.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((y)=>setTimeout(y,bs))}throw Error(`Timed out after ${_t}ms waiting for detached hub startup.`)}async function Ht(e,t={}){let n=As();return await vt(n.discoveryPath,async()=>Bs(n,e,t))}function Fs(){return $s()==="production"?te():W()}function zs(){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 Nt(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 Nt(e.data);return String(e)}function Vs(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 Ot(e){let t=e,n=Vs(t.reason);return new k("hub_connection_closed",t.code||n?`Hub connection closed (code=${t.code??0}${n?`, reason=${n}`:""})`:Ee,{closeCode:t.code,closeReason:n||void 0})}function Ut(e,t){if(e instanceof k)return e;if(e instanceof Error)return new k("hub_connect_failed",e.message);if(e&&typeof e==="object"&&"error"in e&&e.error instanceof Error)return new k("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 k("hub_connect_failed",n);let s=e&&typeof e==="object"&&"type"in e&&typeof e.type==="string"?e.type.trim():"";return new k("hub_connect_failed",s?`Failed to connect to hub at ${t.toString()} (${s} event before socket open).`:`Failed to connect to hub at ${t.toString()}.`)}var xe="*",se=8000,Gs="cline-hub-auth.",Me=new Map,$t=new Set,Js=3000;var Ee="Hub connection closed",Ks=250,Qs=5000,Dt=0.5;class k extends Error{code;details;constructor(e,t,n){super(t);this.code=e;this.details=n;this.name="HubTransportError"}}function Ys(e){return e instanceof k}class He extends Error{command;code;constructor(e,t,n){super(n);this.command=e;this.code=t;this.name="HubCommandError"}}function Oe(e,t={}){let n=e.searchParams.get("authToken")?.trim();if(e.searchParams.delete("authToken"),n)return n;if(t.skipRegistry)return;let s=oe(e.toString());return s?Me.get(s):void 0}function Xs(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 oe(e){if(!Xs(e))return;let t=new URL(Wt(e));return t.search="",t.hash="",t.toString()}function Lt(e){let t=oe(e);return!!t&&$t.has(t)}function ne(e,t){let n=oe(e);if(n){if($t.add(n),t?.trim())Me.set(n,t)}return e}function It(e,t){let n=oe(e);if(n&&t?.trim())Me.set(n,t)}class V{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 k("hub_connection_closed",Ee);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()||Oe(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,s=this.openSocket(e,t,n),o;this.connectPromise=s.then(async(r)=>{if(o=r,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(q.version),pid:process.pid},workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}},void 0,void 0,!1),n!==this.connectGeneration||this.closedByClient){try{r.close()}catch{}throw this.lastCloseError}this.registered=!0;for(let a of this.subscriptionCounts.keys())this.sendSubscriptionFrame("stream.subscribe",this.subscriptionSessionIdFromKey(a));this.reconnectAttempt=0});let i=this.connectPromise;try{await i}catch(r){if(this.connectPromise===i)this.connectPromise=void 0;if(o&&this.socket===o){this.lastCloseError=Ut(r,e),this.registered=!1,this.sawSocketClose=!1,this.socket=void 0;try{o.close()}catch{}}if(!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect();throw r}}async openSocket(e,t,n){let s=this.options.resolveConnectionHeaders,o;if(s){let d;try{o=await Promise.race([Promise.resolve().then(()=>s()),new Promise((u,f)=>{d=setTimeout(()=>{f(new k("hub_connect_timeout",`Timed out resolving hub connection headers after ${se}ms`))},se)})])}catch(u){let f=u instanceof k?u:new k("hub_connect_failed",u instanceof Error?u.message:String(u));if(n===this.connectGeneration)this.lastCloseError=f;throw f}finally{clearTimeout(d)}}if(n!==this.connectGeneration||this.closedByClient)throw this.lastCloseError;if(o&&Object.keys(o).some((d)=>d.toLowerCase()==="sec-websocket-protocol")){let d=new k("hub_connect_failed","Hub connection headers cannot set Sec-WebSocket-Protocol.");if(n===this.connectGeneration)this.lastCloseError=d;throw d}let i=o?new js(e.toString(),{headers:{...o}}):new(zs())(e.toString(),t?[`${Gs}${t}`]:void 0);this.socket=i;let r=!1,a=new Promise((d,u)=>{let f=!1,c=setTimeout(()=>{if(f)return;f=!0,r=!0;let h=new k("hub_connect_timeout",`Timed out connecting to hub after ${se}ms`);if(this.socket===i)this.lastCloseError=h,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;try{i.close()}catch{}u(h)},se);i.addEventListener("open",()=>{if(f)return;f=!0,clearTimeout(c),d()}),i.addEventListener("error",(h)=>{if(f)return;f=!0,clearTimeout(c);let p=Ut(h,e);if(this.socket===i)this.lastCloseError=p,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;u(p)}),i.addEventListener("close",(h)=>{if(f)return;f=!0,clearTimeout(c);let p=r?this.lastCloseError:Ot(h);if(this.socket===i){if(!r)this.lastCloseError=p,this.sawSocketClose=!0;this.connectPromise=void 0,this.socket=void 0}u(p)})});return i.addEventListener("message",(d)=>{this.handleFrame(JSON.parse(Nt(d)))}),i.addEventListener("close",(d)=>{if(this.socket!==i)return;if(!r)this.lastCloseError=Ot(d),this.sawSocketClose=!0;this.registered=!1;for(let u of this.pendingReplies.values())u.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,this.socket=void 0,!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect()}),await a,i}subscribe(e,t){let n=t?.sessionId?.trim()||void 0,s={listener:e,sessionId:n};return this.listeners.add(s),this.adjustSubscriptionCount(n,1),()=>{if(!this.listeners.delete(s))return;this.adjustSubscriptionCount(n,-1)}}async command(e,t,n,s){let o=0,i=e!=="client.register"&&e!=="client.unregister";while(!0)try{return await this.commandOnce(e,t,n,s)}catch(r){if(!i||o>=1||!await this.recoverLocalHubTransport(r))throw r;o+=1}}async commandOnce(e,t,n,s,o=!0){if(o)await this.connect();s?.beforeDispatch?.();let i=qs("hubreq_");s?.onDispatch?.(i);let r=Ws(e,s?.timeoutMs),a=new Promise((u,f)=>{let c=r===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(i))return;f(new He(e,"hub_command_timeout",`Hub command ${e} timed out after ${r}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.`))},r);this.pendingReplies.set(i,{resolve:(h)=>{if(c)clearTimeout(c);u(h)},reject:(h)=>{if(c)clearTimeout(c);f(h)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:e,requestId:i,clientId:this.clientId,sessionId:n,timeoutMs:r,payload:t}})}catch(u){throw this.pendingReplies.delete(i),u}let d=await a;if(!d.ok){if(d.error?.code===rt){let u=n??(typeof t?.sessionId==="string"?t.sessionId:void 0);throw new Y(u,d.error.message)}throw new He(e,d.error?.code,d.error?.message??`Hub command ${e} failed`)}return d}async recoverLocalHubTransport(e){if(!Lt(this.currentUrl)||!Ys(e))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let t=await Bt({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(Ks*2**this.reconnectAttempt,Qs),t=Math.round(e*(1-Dt)+Math.random()*e*Dt);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(!Lt(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let e=await Bt({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 k("hub_connection_closed",Ee);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 k("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),s=(this.subscriptionCounts.get(n)??0)+t;if(s<=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,s),t>0&&s===1&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.subscribe",e)}subscriptionKeyForSessionId(e){return e??xe}subscriptionSessionIdFromKey(e){return e===xe?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 s of[xe,n]){if(!s||!this.subscriptionCounts.has(s))continue;let o=this.lastEventSequenceByKey.get(s)??0;if(t>o)this.lastEventSequenceByKey.set(s,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 Wt(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 E(e,t){let n=new V({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 Ie(e,t){let n=Wt(e),s=await ee(n,{authToken:t?.authToken});if(!s)return{status:"unreachable",url:n};if(t?.requireCurrentBuild){let o=U(),i=X(s,o);if(!i.compatible&&!Z(s))return{status:i.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:n}}else if(!Ns(s).compatible)return{status:"protocol_mismatch",url:n};if(t?.verifyConnection===!0&&!await E(n,{workspaceRoot:t.workspaceRoot,cwd:t.cwd,authToken:t.authToken}))return{status:"unreachable",url:n};return{status:"compatible",url:n}}function Zs(e){let t=e&&typeof e==="object"&&Array.isArray(e.sessions)?e.sessions:[],n=0,s=new Set;for(let o of t){if(!o||typeof o!=="object")continue;let i=o.participants;if(!Array.isArray(i)||i.length===0)continue;n+=1;for(let r of i){let a=r&&typeof r==="object"?r.clientId:void 0;if(typeof a==="string"&&a.trim())s.add(a)}}return{activeSessionCount:n,participantClientCount:s.size}}async function Te(e,t,n){let s=new V({url:e,authToken:t,clientType:"hub-recovery-check",displayName:"hub recovery check",workspaceRoot:n?.workspaceRoot,cwd:n?.cwd});try{let o=await s.command("session.list",{limit:500},void 0,{timeoutMs:Js});return Zs(o.payload)}finally{await s.dispose().catch(()=>{return})}}async function eo(e,t,n){try{return(await Te(e,t,n)).activeSessionCount===0}catch{return!1}}async function to(e,t){let n=`${e.discoveryPath}.superseded`,s=await I(n);if(!s?.url||!s.authToken)return;let o=await Ie(s.url,{authToken:s.authToken});if(o.status!=="compatible")return;if(await eo(o.url,s.authToken,t))return;return ne(o.url,s.authToken)}async function no(e={}){if(e.endpoint?.trim()){let o=await Ie(e.endpoint);return o.status==="compatible"?o.url:void 0}let t=Fs(),n=await I(t.discoveryPath);if(!n?.url)return await to(t,e);let s=await Ie(n.url,{authToken:n.authToken,requireCurrentBuild:!0});if(s.status==="compatible")return ne(s.url,n.authToken);if(s.status==="protocol_mismatch")await D(t.discoveryPath).catch(()=>{return});return}async function Bt(e={}){let t=await no(e);if(t&&await E(t,{workspaceRoot:e.workspaceRoot,cwd:e.cwd}))return t;if(e.endpoint?.trim())return;try{return(await Ht(e.workspaceRoot??process.cwd())).url}catch(n){e.onStartupError?.(n);return}}async function z(e,t,n,s){qt();let o=new URL(e),i=t?.trim()||Oe(o);if(o.protocol==="ws:")o.protocol="http:";else if(o.protocol==="wss:")o.protocol="https:";if(o.pathname="/drain",o.hash="",n)o.searchParams.set("reason",n);if(s?.off)o.searchParams.set("off","1");return(await fetch(o,{method:"POST",headers:i?{authorization:`Bearer ${i}`}:void 0})).ok}async function Mt(e,t){qt();let n=new URL(e),s=t?.trim()||Oe(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:s?{authorization:`Bearer ${s}`}:void 0})).ok}function so(e,t){if(!e||typeof e!=="object")return;let n=e,s=typeof n.id==="string"?n.id.trim():"";if(!s)return;let o=typeof n.display_name==="string"?n.display_name.trim():typeof n.displayName==="string"?n.displayName.trim():"",i=typeof n.name==="string"?n.name.trim():"";return{id:s,name:o||i||s,catalogId:t}}function Ue(e,t){return Array.isArray(e)?e.flatMap((n)=>{let s=so(n,t);return s?[s]:[]}):[]}async function jt(e,t={}){let n=e.trim(),s=n.length;while(s>0&&n[s-1]==="/")s--;let o=n.slice(0,s),i=async(m)=>{let y=await(t.fetchImpl??fetch)(`${o}${m}`,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(1e4)});if(!y.ok)throw Error(`HTTP ${y.status}`);return await y.json()},r,a;try{[r,a]=await Promise.all([i("/api/v1/ai/cline/models"),i("/api/v1/ai/cline/recommended-models")])}catch(m){throw Error("Could not load the cloud model catalog.",{cause:m})}let d=r&&typeof r==="object"?r:void 0,u=Ue(Array.isArray(r)?r:d?.data,"cline"),f=a&&typeof a==="object"?a:void 0,c=f?.data&&typeof f.data==="object"?f.data:f,h=Ue(c?.clinePass,"cline-pass"),p=Ue(c?.clineCloud,"cline-cloud"),l=new Set;return[...t.isOrganizationSession?[]:h,...p,...u].filter((m)=>{if(l.has(m.id))return!1;return l.add(m.id),!0})}import{formatDisplayUserInput as Ft}from"@cerebriline/shared";var oo=new Set(["auto_compaction","compaction_budget_emergency","completion_reminder","loop_detection_notice","manual_compaction","mistake_stop_notice","recovery_notice"]);function io(e){switch(e){case"user":case"assistant":case"tool":case"system":case"status":case"error":return e;default:return"assistant"}}function ro(e){return e.metadata&&typeof e.metadata==="object"&&!Array.isArray(e.metadata)?e.metadata:void 0}function ao(e){let t=e?.userRunSpan;return typeof t==="number"&&Number.isInteger(t)&&t>=0?t:void 0}function co(e){if(typeof e.content==="string")return{hasAttachment:!1,text:e.content};if(!Array.isArray(e.content))return{hasAttachment:!1,text:"unknown"};let t=!1,n=!1,s=[];for(let o of e.content){if(!o||typeof o!=="object"||Array.isArray(o))continue;let i=o;if(i.type==="text"&&typeof i.text==="string")s.push(i.text);else if(i.type==="tool_result"||i.type==="tool-result")n=!0;else if(i.type==="file"||i.type==="image")t=!0}return{hasAttachment:t&&!n,text:s.join(`
|
|
11
11
|
`)}}function uo(e){let t=Ft(e);return t.startsWith("[TASK RESUMPTION]")||t==="The user approved switching to act mode. Continue with the approved plan now."}function lo(e){if(io(e.role)!=="user")return 0;let t=ro(e),n=typeof t?.kind==="string"?t.kind:void 0,s=ao(t);if(n==="compaction"||n==="compaction_summary")return s??1;if(s!==void 0)return s;if(n&&oo.has(n))return 0;let o=co(e);if(!o.hasAttachment&&!Ft(o.text))return 0;if(!o.hasAttachment&&uo(o.text))return 0;return 1}function zt(e){return lo(e)>0}function ae(e){return Array.isArray(e?.sessions)?e.sessions.filter((t)=>Boolean(t)&&typeof t==="object"&&!Array.isArray(t)):[]}function De(e){let t=e.updatedAt;return typeof t==="number"?t:Date.parse(String(t??""))||0}function Le(e){let t=e?.metadata&&typeof e.metadata==="object"?e.metadata:void 0;return String(t?.model??e?.model??"").trim()}function de(e){let t=e.metadata&&typeof e.metadata==="object"?e.metadata:void 0;return!String(t?.parentSessionId??e.parentSessionId??"").trim()}function Kt(e,t="text"){if(!e||typeof e!=="object"||Array.isArray(e))return"";let n=e.content;if(typeof n==="string")return t==="text"?n.trim():"";if(!Array.isArray(n))return"";return n.map((s)=>s&&typeof s==="object"&&!Array.isArray(s)?t==="thinking"&&s.type==="redacted_thinking"?"[redacted]":String(s[t]??""):"").join("").trim()}function ie(e){let t=e.trim(),n=t.match(/^<user_input\b[^>]*>([\s\S]*)<\/user_input>$/);return(n?n[1]:t).trim()}function G(e,t,n){let s=ie(n);return e.filter((o)=>Boolean(o)&&typeof o==="object"&&!Array.isArray(o)&&String(o.role??"").toLowerCase()==="user"&&(s!==""||zt(o))&&ie(Kt(o))===s).length+t.filter((o)=>ie(o.prompt)===s).length}function Be(e){return e.flatMap((t)=>{if(t.event!=="session.pending_prompt_submitted")return[];let n=t.payload?.prompt&&typeof t.payload.prompt==="object"&&!Array.isArray(t.payload.prompt)?t.payload.prompt:void 0,s=String(n?.id??"").trim();if(!s)return[];return[{id:s,prompt:String(n?.prompt??""),steer:n?.delivery==="steer",attachmentCount:typeof n?.attachmentCount==="number"?n.attachmentCount:0,userImages:Array.isArray(n?.userImages)?n.userImages.filter((o)=>typeof o==="string"):void 0}]})}var po=new Set(["run.completed","run.aborted","run.failed"]),fo=new Set(["assistant.delta","assistant.finished","reasoning.delta","reasoning.finished"]);function Vt(e,t){return e.filter((n)=>Boolean(n)&&typeof n==="object"&&!Array.isArray(n)&&String(n.role??"").toLowerCase()==="assistant").map((n)=>Kt(n,t)).filter(Boolean)}function Gt(e,t,n="text"){let s=new Map;for(let o of Vt(t,n))s.set(o,(s.get(o)??0)+1);return Vt(e,n).filter((o)=>{let i=s.get(o)??0;if(i===0)return!0;if(i===1)s.delete(o);else s.set(o,i-1);return!1})}function re(e,t,n=new Set){if(!e||typeof e!=="object")return n;if(Array.isArray(e)){for(let i of e)re(i,t,n);return n}let s=e,o=t==="tool_use"?s.id:s.tool_use_id;if(s.type===t&&typeof o==="string")n.add(o);for(let i of Object.values(s))re(i,t,n);return n}function Jt(e,t="assistant"){let n="",s="";for(let o of e)if(o.event===`${t}.delta`)s+=t==="reasoning"&&o.payload?.redacted&&!o.payload?.text?"[redacted]":typeof o.payload?.text==="string"?o.payload.text:"";else if(o.event===`${t}.finished`){let i=o.payload?.[t==="assistant"?"text":"reasoning"],r=typeof i==="string"&&i?i:s;if(r)n=r;s=""}return(n||s).trim()}function Qt(e,t,n={}){let s=n.queueSnapshotApplied!==!1,o=Gt(t,n.baselineMessages??[]),i=Gt(t,n.baselineMessages??[],"thinking"),r=re(t,"tool_use"),a=re(t,"tool_result"),d=new Set(e.slice(0,n.messagesSnapshotEventCutoff??e.length)),u=new Set,f=new Map;for(let y of e.slice(0,n.messagesSnapshotEventCutoff??e.length)){let w=Be([y])[0];if(!w)continue;let v=ie(w.prompt),P=f.get(v)??Math.max(0,G(t,[],v)-G(n.baselineMessages??[],[],v));if(f.set(v,Math.max(0,P-1)),P>0)u.add(y)}let h=[...s?e.slice(n.queueSnapshotEventCutoff??e.length):e].reverse().find((y)=>y.event==="session.pending_prompts"),p=[],l=[],m=(y)=>{if(l.length===0)return;let w=l.filter((A)=>d.has(A)),v=(A)=>{if(!y)return-1;let S=[...w].reverse().findIndex((nn)=>nn.event===`${A}.finished`),L=S<0?-1:w.length-1-S;return L>=0||l.at(-1)?.event==="run.aborted"?L:w.length-1},P=v("assistant"),H=v("reasoning"),b=Jt(w.slice(0,P+1)),R=b?o.findIndex((A)=>A.endsWith(b)):-1,M=R>=0;if(M)o.splice(R,1);let J=Jt(w.slice(0,H+1),"reasoning"),pe=J?i.findIndex((A)=>A.endsWith(J)):-1;if(pe>=0)i.splice(pe,1);for(let[A,S]of l.entries()){if(u.has(S)){p.push({...S,payload:{...S.payload,transcriptReflected:!0}});continue}if(d.has(S)&&fo.has(S.event)&&(S.event.startsWith("reasoning.")?pe>=0&&A<=H:M&&A<=P))continue;if(S.event==="session.pending_prompts"&&S!==h)continue;if(d.has(S)&&S.event.startsWith("tool.")){let L=String(S.payload?.toolCallId??"").trim();if(a.has(L)||S.event==="tool.started"&&r.has(L))continue}p.push(S)}l=[]};for(let y of e)if(l.push(y),po.has(y.event))m(!0);return m(!1),p}import{formatDisplayUserInput as ho}from"@cerebriline/shared";function ce(e){let t=structuredClone(e),n=(s)=>{if(!s||typeof s!=="object"||Object.isFrozen(s))return;for(let o of Object.values(s))n(o);Object.freeze(s)};return n(t),t}function ue(e){let t=e?.trim();return t?ho(t).slice(0,120):void 0}function qe(e){if(typeof e==="string")return e;if(Array.isArray(e)){let t=[];for(let n of e){if(typeof n==="string"){if(n.trim())t.push(n);continue}if(!n||typeof n!=="object")continue;let s=n,o=typeof s.type==="string"?s.type:"",i=o==="text"?String(s.text??""):o==="thinking"?String(s.thinking??""):o==="tool_use"?`[tool] ${String(s.name??"tool_call")}`:o==="tool_result"?`[tool_result]
|
package/dist/hub/daemon/entry.js
CHANGED
|
@@ -180,7 +180,7 @@ The tool calls this summary stands for, recorded by the harness rather than writ
|
|
|
180
180
|
|
|
181
181
|
${r}
|
|
182
182
|
|
|
183
|
-
`}]:[]],metadata:{kind:"compaction_summary",displayRole:"system",userRunSpan:e.userRunSpan,summary:e.summary,details:e.fileOps,tokensBefore:e.tokensBefore,generatedAt:Date.now(),generation:Math.max(1,Math.floor(e.generation??1)),...t?{thinkingSummary:t}:{},...r?{toolLedger:r}:{},...e.toolLedgerEntries&&e.toolLedgerEntries.length>0?{toolLedgerEntries:e.toolLedgerEntries}:{},...o.length>0?{userRequests:o}:{}}}}function MO(e){for(let t=e.messages.length-1;t>=0;t-=1){let n=e.messages[t];if(n?.role!=="assistant")continue;let r=n.metrics?.inputTokens;if(typeof r!=="number"||!Number.isFinite(r)||r<=0)continue;c7(l7({systemPrompt:e.systemPrompt,messages:e.messages.slice(0,t),tools:e.tools},{reasoningHistory:e.reasoningHistory,toolResultFormat:e.toolResultFormat}),r,e.sessionId);return}}import{clearPolykvSession as nT,createPolykvClient as BQ,engineSessionId as HQ,getPolykvSession as WQ,hasOpencotiFeature as Fo,normalizeProviderId as qQ,OPENCOTI_FEATURES as Uo,probeOpencotiProps as jQ,readOpencotiKv as iL,setPolykvSession as tL}from"@cerebriline/llms";import{classifyTurnFault as zQ,classifyTurnFaultError as GQ,describeAdmissionWait as KQ,hasPromptEnvironment as VQ}from"@cerebriline/shared";import{EMPTY_CONTENT_TEXT as Z7}from"@cerebriline/shared";import{TOOL_RESULT_SERIALIZED_JSON as Q7}from"@cerebriline/shared";function Zm(e){if(typeof e==="string")return e;if(Array.isArray(e))return e;return JSON.stringify(e)}function Kk(e){if(e.serialized)return e.serialized;let t=e.output;return typeof t==="string"||Array.isArray(t)||t===void 0?void 0:Q7}function eQ(e){if(e.metadata?.displayOnly===!0)return[];let t=nQ(e.content),n=[],r=e.id??iQ(),o=0,i=[],s=e.role==="user"&&typeof e.metadata?.userRunSpan==="number"&&Number.isInteger(e.metadata.userRunSpan)&&e.metadata.userRunSpan>=0?e.metadata.userRunSpan:void 0,a=!1,d=(u)=>{if(s===void 0)return e.metadata;if(u&&!a)return a=!0,e.metadata;return{...e.metadata,userRunSpan:0}},l=()=>{if(i.length===0)return;let u=o===0?r:`${r}_part_${o}`;o+=1,n.push({id:u,role:e.role,content:i.map(rQ),createdAt:e.ts??Date.now(),metadata:d(!0),modelInfo:e.modelInfo,metrics:OO(e.metrics)}),i=[]};if(t.length===0)return n.push({id:r,role:e.role,content:[{type:"text",text:Z7}],createdAt:e.ts??Date.now(),metadata:e.metadata,modelInfo:e.modelInfo,metrics:OO(e.metrics)}),n;let c=t.length===1&&t[0].type==="tool_result";for(let u of t){if(u.type!=="tool_result"){i.push(u);continue}l();let h=`_tool_${u.tool_use_id}`;n.push({id:c||r.endsWith(h)?r:`${r}${h}`,role:"tool",content:[NO(u)],createdAt:e.ts??Date.now(),metadata:d(!1)})}return l(),n}function vd(e){return e.flatMap(eQ)}function tQ(e){let t=e.content.map(DO).filter((n)=>n!==void 0);return{id:e.id,role:e.role==="tool"?"user":e.role,content:t,ts:e.createdAt,metadata:e.metadata,modelInfo:e.modelInfo,metrics:oQ(e.metrics)}}function au(e){return e.map(tQ)}function ef(e){let t=[];for(let n of e){let r=n.content.map(DO).filter((s)=>s!==void 0),o=n.role==="tool"?"user":n.role,i=t[t.length-1];if(o==="user"&&r.length>0&&r.every((s)=>s.type==="tool_result")&&i?.role==="user"&&Array.isArray(i.content)&&i.content.every((s)=>s.type==="tool_result")){i.content.push(...r);continue}t.push({role:o,content:r})}return t}function nQ(e){if(typeof e==="string")return e.trim().length>0?[{type:"text",text:e}]:[];return[...e]}function rQ(e){switch(e.type){case"text":return{type:"text",text:e.text};case"thinking":return{type:"reasoning",text:e.thinking,metadata:e.signature?{signature:e.signature,details:e.details}:e.details?{details:e.details}:void 0};case"redacted_thinking":return{type:"reasoning",text:"",redacted:!0,metadata:{data:e.data}};case"image":return{type:"image",image:e.data,mediaType:e.mediaType};case"media":return{type:"media",media:e.media};case"file":return{type:"file",path:e.path,content:e.content};case"tool_use":return{type:"tool-call",toolCallId:e.id,toolName:e.name,input:e.input,metadata:e.signature?{signature:e.signature}:void 0};case"tool_result":return NO(e)}}function NO(e){return{type:"tool-result",toolCallId:e.tool_use_id,toolName:e.name,output:e.content,isError:e.is_error,...e.note?{note:e.note}:{},...e.serialized?{serialized:e.serialized}:{}}}function DO(e){switch(e.type){case"text":return{type:"text",text:e.text};case"reasoning":{if(e.redacted===!0)return{type:"redacted_thinking",data:e.metadata?.data??""};let t=e.metadata;return{type:"thinking",thinking:e.text,signature:t?.signature,details:t?.details}}case"image":return typeof e.image==="string"?{type:"image",data:e.image,mediaType:e.mediaType??"image/png"}:void 0;case"file":return{type:"file",path:e.path,content:e.content};case"media":return{type:"media",media:e.media};case"tool-call":{let t=e.metadata;return{type:"tool_use",id:e.toolCallId,name:e.toolName,input:e.input??{},signature:t?.thoughtSignature??t?.signature}}case"tool-result":return{type:"tool_result",tool_use_id:e.toolCallId,name:e.toolName,content:Zm(e.output),is_error:e.isError,...e.note?{note:e.note}:{},...Kk(e)?{serialized:Kk(e)}:{}}}}function OO(e){if(!e)return;return{inputTokens:e.inputTokens??0,outputTokens:e.outputTokens??0,cacheReadTokens:e.cacheReadTokens??0,cacheWriteTokens:e.cacheWriteTokens??0,cost:e.cost,reasoningTokenCount:e.reasoningTokenCount,timings:e.timings}}function oQ(e){if(!e)return;return{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens,cost:e.cost,reasoningTokenCount:e.reasoningTokenCount,timings:e.timings}}var LO=0;function iQ(){return LO+=1,`msg_${Date.now().toString(36)}_${LO.toString(36)}`}import{createGateway as cQ,createHandlerAsync as uQ,hasRegisteredHandler as hQ,isModelRequestCaptureOn as pQ,MODEL_COLLECTIONS_BY_PROVIDER_ID as mQ,normalizeProviderId as Vk,resolveGatewayProviderRegistrationSync as fQ,toGatewayModelCapabilities as gQ,withModelRequestCapture as yQ}from"@cerebriline/llms";import{classifyProviderError as $O}from"@cerebriline/llms";import{toolResultForModel as sQ}from"@cerebriline/shared";function aQ(e,t){let n=t==="text";return e.map((r)=>{if(typeof r.content==="string")return r;if(!r.content.some((o)=>o.type==="tool_result"&&(n||o.note)))return r;return{...r,content:r.content.map((o)=>{if(o.type!=="tool_result"||!n&&!o.note)return o;let{note:i,serialized:s,...a}=o;return{...a,content:sQ(a.content,i,{...t?{format:t}:{},...s?{serialized:s}:{}})}})}})}function dQ(e){switch(e.type){case"text":return[{type:"text-delta",text:e.text}];case"media":return[{type:"media",media:e.media}];case"reasoning":return[{type:"reasoning-delta",text:e.reasoning,metadata:e.signature?{thoughtSignature:e.signature,details:e.details}:{details:e.details}}];case"tool_calls":{let t=e.tool_call.function,n=t.arguments;return[{type:"tool-call-delta",toolCallId:e.tool_call.call_id??t.id,toolName:t.name,inputText:typeof n==="string"?n:void 0,input:typeof n==="string"?void 0:n,...e.signature?{metadata:{thoughtSignature:e.signature}}:{}}]}case"usage":return[{type:"usage",usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens,reasoningTokenCount:e.thoughtsTokenCount,totalCost:e.totalCost}}];case"done":return[{type:"finish",reason:lQ(e),error:e.error,...e.error?{errorClass:$O(e.error)}:{}}];default:return[]}}function lQ(e){if(e.success===!1)return"error";if(e.incompleteReason==="max_output_tokens"||e.incompleteReason==="max-tokens")return"max-tokens";if(e.incompleteReason==="content_filter"||e.incompleteReason==="content-filter")return"content-filter";return"stop"}function FO(e,t){return{async*stream(n){let r=!1,o=!1;try{let i=typeof e==="function"?await e():e;i.setAbortSignal?.(n.signal);let s=aQ(ef(n.messages),t?.toolResultFormat),a=n.tools.map((d)=>({name:d.name,description:d.description,inputSchema:d.inputSchema}));for await(let d of i.createMessage(n.systemPrompt??"",s,a))for(let l of dQ(d)){if(l.type==="finish")r=!0;else if(l.type==="tool-call-delta")o=!0;yield l}if(!r)yield{type:"finish",reason:o?"tool-calls":"stop"}}catch(i){if(!r){let s=n.signal?.aborted===!0;yield{type:"finish",reason:s?"aborted":"error",error:i instanceof Error?i.message:String(i),...s?{}:{errorClass:$O(i)}}}}}}}function wQ(e){let t=Object.fromEntries(Object.entries(e).filter(([,n])=>n!==void 0));return Object.keys(t).length>0?t:void 0}function bQ(e){return e.providerId==="openai-compatible"||e.clientType==="openai-compatible"}var UO;function vQ(){return UO??=`cerebriline-aux-${Math.random().toString(36).slice(2,10)}`,UO}function kQ(e,t){let n={region:e.region,apiLine:e.apiLine,openRouterProviderSorting:e.openRouterProviderSorting,modelCatalog:e.modelCatalog,sampling:e.sampling,polykv:e.polykv};if(bQ(e))Object.assign(n,{apiVersion:e.azure?.apiVersion,useIdentity:e.azure?.useIdentity});let r=Vk(e.providerId);if(r==="opencoti"||r==="xollama"){let o=e.engineSessionId||t||vQ();if(n.polykvSessionId=o,e.polykvWorker)n.polykvWorker={...e.polykvWorker,sessionId:o};if(e.polykvBooking)n.polykvBooking=e.polykvBooking;if(e.polykvLeadPool===!1)n.polykvLeadPool=!1;if(e.sideCallOf)n.polykvSideCallOf=e.sideCallOf;if(e.requestedContextWindow)n.requestedContextWindow=e.requestedContextWindow;if(e.agentWindow)n.agentWindow=e.agentWindow;if(e.notices&&(e.engineSessionId||t))n.notices=e.notices}if(e.providerId==="bedrock")Object.assign(n,{authentication:e.aws?.authentication,profile:e.aws?.profile,accessKeyId:e.aws?.accessKey,secretAccessKey:e.aws?.secretKey,sessionToken:e.aws?.sessionToken,usePromptCache:e.aws?.usePromptCache,useCrossRegionInference:e.useCrossRegionInference,useGlobalInference:e.useGlobalInference,endpoint:e.aws?.endpoint,customModelBaseId:e.aws?.customModelBaseId});if(e.providerId==="vertex"){let o=e.gcp?.region??e.region;Object.assign(n,{project:e.gcp?.projectId,projectId:e.gcp?.projectId,location:o,region:o})}if(e.providerId==="claude-code"){let o=e.extensionContext?.workspace;Object.assign(n,{cwd:o?.cwd??o?.rootPath})}if(e.providerId==="sapaicore")Object.assign(n,e.sap);return wQ(n)}function TQ(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?Math.floor(e):void 0}function Xk(e){let t=e.providerConfig,n=t?.knownModels?t.knownModels:e.knownModels??mQ[e.providerId]?.models??void 0,r=TQ(t?.maxInputTokens),o=t?.modelInfo&&t.modelInfo.id===e.modelId?t.modelInfo:void 0;if(r===void 0&&!o)return n;return{...n??{},[e.modelId]:{...n?.[e.modelId],...r!==void 0?{contextWindow:r,maxInputTokens:r}:{},...o,id:e.modelId}}}function SQ(e,t){return{id:e,name:t.name??e,description:t.description,contextWindow:t.contextWindow,maxInputTokens:t.maxInputTokens,maxOutputTokens:t.maxTokens,operation:t.operation,operationModes:t.operationModes,modalities:t.modalities,capabilities:gQ(t.capabilities),reasoningOptions:t.reasoningOptions,metadata:{...t.metadata?.apiProtocol?{apiProtocol:t.metadata.apiProtocol}:{},family:t.family,pricing:t.pricing,status:t.status,releaseDate:t.releaseDate}}}function Yk(e){let t=e.providerConfig,n=t?.providerId===e.providerId?t:void 0;return{...n??{},providerId:e.providerId,modelId:e.modelId,apiKey:e.apiKey??n?.apiKey,baseUrl:e.baseUrl??n?.baseUrl,headers:e.headers??n?.headers}}function tf(e,t,n,r){let o={...Yk(e),knownModels:Xk(e),maxOutputTokens:e.maxTokensPerTurn,temperature:e.temperature,reasoningEffort:e.reasoningEffort,thinkingBudgetTokens:e.thinkingBudgetTokens,thinking:e.thinking,logger:t,extensionContext:e.extensionContext,...e.engineSessionId?{engineSessionId:e.engineSessionId}:{},...e.polykvWorker?{polykvWorker:e.polykvWorker}:{},...e.toolResultFormat?{toolResultFormat:e.toolResultFormat}:{}},i=Vk(o.providerId);if(pQ()&&i!=="ollama"&&i!=="xollama")o.fetch=yQ(o.fetch??globalThis.fetch,e.sessionId);if(hQ(Vk(o.providerId)))return FO(()=>uQ(o),o.toolResultFormat?{toolResultFormat:o.toolResultFormat}:void 0);let s=cQ({fetch:o.fetch,providerConfigs:[{providerId:o.providerId,apiKey:o.apiKey,baseUrl:o.baseUrl,headers:o.headers,timeoutMs:o.timeoutMs,fetch:o.fetch,defaultMaxOutputTokens:o.defaultMaxOutputTokens,reasoningHistory:o.reasoningHistory,reasoningInline:o.reasoningInline,toolResultFormat:o.toolResultFormat,options:kQ(o,e.sessionId),models:o.knownModels?Object.entries(o.knownModels).map(([d,l])=>SQ(d,l)):void 0}],logger:t,telemetry:n??e.telemetry??e.extensionContext?.telemetry}),a=fQ(o);if(a)s.registerProvider(a);return s.createAgentModel({providerId:o.providerId,modelId:o.modelId},{maxTokens:o.maxOutputTokens,temperature:o.temperature,auxiliary:r?.auxiliary??o.auxiliary,conversation:r?.conversation===!0,sessionId:e.engineSessionId||e.sessionId})}import{clearPolykvSession as xQ,createPolykvClient as BO,deferPolykvLeadClose as HO,engineSessionId as of,getPolykvSession as du,getPolykvWindowGrant as _Q,hasOpencotiFeature as EQ,normalizeProviderId as Is,OPENCOTI_FEATURES as AQ,polykvEffectiveWindow as RQ,polykvWorkerChargedTo as IQ,probeOpencotiProps as WO,readOpencotiKv as CQ,releasePolykvLead as PQ,setPolykvSession as MQ,withXollamaAuth as Jk,XOLLAMA_DEFAULT_BASE_URL as Qk,xollamaDrivesModel as OQ,xollamaEngineFetch as qO,xollamaEngineRoot as jO}from"@cerebriline/llms";import{hasPromptEnvironment as LQ}from"@cerebriline/shared";var sf=0.85;function lu(e){return e?.providerId!==void 0&&Is(e.providerId)==="opencoti"&&Boolean(e.baseUrl)&&e.polykv?.enabled!==!1}function $o(e){return lu(e)||e?.providerId!==void 0&&Is(e.providerId)==="xollama"&&e.polykv?.enabled!==!1}async function zO(e){if(!e.modelId||e.polykv?.enabled===!1)return!1;let t=e.baseUrl||Qk,n={...e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{},...e.headers??{}};return OQ(t,e.modelId,Jk(e.fetch??fetch,t,n))}async function Cs(e){if(e?.providerId===void 0)return;let t=Is(e.providerId);if(t==="opencoti")return e.baseUrl?e:void 0;if(t!=="xollama"||!e.modelId)return;if(!await zO(e).catch(()=>!1))return;let n=e.baseUrl||Qk,r={...e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{},...e.headers??{}},{headers:o,...i}=e;return{...i,providerId:"opencoti",baseUrl:jO(n,e.modelId),fetch:qO(Jk(e.fetch??fetch,n,r))}}async function NQ(e,t){let n=t.providerConfig;if(!n.modelId)return;let r=n.baseUrl||Qk,o={...n.apiKey?{Authorization:`Bearer ${n.apiKey}`}:{},...n.headers??{}},i=BO({baseUrl:jO(r,n.modelId),fetch:qO(Jk(n.fetch??fetch,r,o))}),s=async()=>{try{let a=await i.closeSession(of(e));t.logger?.log(a?`[xOllama] Closed engine session ${e}: its window is free for the next conversation`:`[xOllama] The engine held no window for session ${e}`)}catch(a){t.logger?.log(`[xOllama] Could not close engine session ${e}; its window stays booked until the idle TTL: ${a instanceof Error?a.message:String(a)}`,{severity:"warn"})}};if(HO(e,s)){t.logger?.log(`[xOllama] Session ${e} ended with priority-0 agents still running in it; its window is closed after the last of them`);return}await s()}async function Zk(e){if(e?.providerId!==void 0&&Is(e.providerId)==="xollama")return zO(e).catch(()=>!1);if(!e||!lu(e))return!1;return(await WO(e.baseUrl,e.fetch).catch(()=>{return}))?.poolsEnabled===!0}function kd(e){if(!e.baseUrl)return;return BO({baseUrl:e.baseUrl,...e.fetch?{fetch:e.fetch}:{},...e.headers?{headers:e.headers}:{}})}function DQ(e){if(!e.systemPrompt)return;let t=$Q(e.tools);return{messages:[{role:"system",content:e.systemPrompt}],...t.length>0?{tools:t}:{}}}function $Q(e){let t=[];for(let n of e??[]){if(!n||typeof n!=="object")continue;let r=n;if(r.type==="function"&&r.function){t.push(n);continue}let o=r.name;if(typeof o!=="string"||o==="")continue;t.push({type:"function",function:{name:o,description:typeof r.description==="string"?r.description:"",parameters:r.inputSchema??r.parameters??{type:"object"}}})}return t}function FQ(e){let t=e.replace(/[ \t]+$/,"");return t.endsWith(`
|
|
183
|
+
`}]:[]],metadata:{kind:"compaction_summary",displayRole:"system",userRunSpan:e.userRunSpan,summary:e.summary,details:e.fileOps,tokensBefore:e.tokensBefore,generatedAt:Date.now(),generation:Math.max(1,Math.floor(e.generation??1)),...t?{thinkingSummary:t}:{},...r?{toolLedger:r}:{},...e.toolLedgerEntries&&e.toolLedgerEntries.length>0?{toolLedgerEntries:e.toolLedgerEntries}:{},...o.length>0?{userRequests:o}:{}}}}function MO(e){for(let t=e.messages.length-1;t>=0;t-=1){let n=e.messages[t];if(n?.role!=="assistant")continue;let r=n.metrics?.inputTokens;if(typeof r!=="number"||!Number.isFinite(r)||r<=0)continue;c7(l7({systemPrompt:e.systemPrompt,messages:e.messages.slice(0,t),tools:e.tools},{reasoningHistory:e.reasoningHistory,toolResultFormat:e.toolResultFormat}),r,e.sessionId);return}}import{clearPolykvSession as nT,createPolykvClient as BQ,engineSessionId as HQ,getPolykvSession as WQ,hasOpencotiFeature as Fo,normalizeProviderId as qQ,OPENCOTI_FEATURES as Uo,probeOpencotiProps as jQ,readOpencotiKv as iL,setPolykvSession as tL}from"@cerebriline/llms";import{classifyTurnFault as zQ,classifyTurnFaultError as GQ,describeAdmissionWait as KQ,hasPromptEnvironment as VQ}from"@cerebriline/shared";import{EMPTY_CONTENT_TEXT as Z7}from"@cerebriline/shared";import{TOOL_RESULT_SERIALIZED_JSON as Q7}from"@cerebriline/shared";function Zm(e){if(typeof e==="string")return e;if(Array.isArray(e))return e;return JSON.stringify(e)}function Kk(e){if(e.serialized)return e.serialized;let t=e.output;return typeof t==="string"||Array.isArray(t)||t===void 0?void 0:Q7}function eQ(e){if(e.metadata?.displayOnly===!0)return[];let t=nQ(e.content),n=[],r=e.id??iQ(),o=0,i=[],s=e.role==="user"&&typeof e.metadata?.userRunSpan==="number"&&Number.isInteger(e.metadata.userRunSpan)&&e.metadata.userRunSpan>=0?e.metadata.userRunSpan:void 0,a=!1,d=(u)=>{if(s===void 0)return e.metadata;if(u&&!a)return a=!0,e.metadata;return{...e.metadata,userRunSpan:0}},l=()=>{if(i.length===0)return;let u=o===0?r:`${r}_part_${o}`;o+=1,n.push({id:u,role:e.role,content:i.map(rQ),createdAt:e.ts??Date.now(),metadata:d(!0),modelInfo:e.modelInfo,metrics:OO(e.metrics)}),i=[]};if(t.length===0)return n.push({id:r,role:e.role,content:[{type:"text",text:Z7}],createdAt:e.ts??Date.now(),metadata:e.metadata,modelInfo:e.modelInfo,metrics:OO(e.metrics)}),n;let c=t.length===1&&t[0].type==="tool_result";for(let u of t){if(u.type!=="tool_result"){i.push(u);continue}l();let h=`_tool_${u.tool_use_id}`;n.push({id:c||r.endsWith(h)?r:`${r}${h}`,role:"tool",content:[NO(u)],createdAt:e.ts??Date.now(),metadata:d(!1)})}return l(),n}function vd(e){return e.flatMap(eQ)}function tQ(e){let t=e.content.map(DO).filter((n)=>n!==void 0);return{id:e.id,role:e.role==="tool"?"user":e.role,content:t,ts:e.createdAt,metadata:e.metadata,modelInfo:e.modelInfo,metrics:oQ(e.metrics)}}function au(e){return e.map(tQ)}function ef(e){let t=[];for(let n of e){let r=n.content.map(DO).filter((s)=>s!==void 0),o=n.role==="tool"?"user":n.role,i=t[t.length-1];if(o==="user"&&r.length>0&&r.every((s)=>s.type==="tool_result")&&i?.role==="user"&&Array.isArray(i.content)&&i.content.every((s)=>s.type==="tool_result")){i.content.push(...r);continue}t.push({role:o,content:r})}return t}function nQ(e){if(typeof e==="string")return e.trim().length>0?[{type:"text",text:e}]:[];return[...e]}function rQ(e){switch(e.type){case"text":return{type:"text",text:e.text};case"thinking":return{type:"reasoning",text:e.thinking,metadata:e.signature?{signature:e.signature,details:e.details}:e.details?{details:e.details}:void 0};case"redacted_thinking":return{type:"reasoning",text:"",redacted:!0,metadata:{data:e.data}};case"image":return{type:"image",image:e.data,mediaType:e.mediaType};case"media":return{type:"media",media:e.media};case"file":return{type:"file",path:e.path,content:e.content};case"tool_use":return{type:"tool-call",toolCallId:e.id,toolName:e.name,input:e.input,metadata:e.signature?{signature:e.signature}:void 0};case"tool_result":return NO(e)}}function NO(e){return{type:"tool-result",toolCallId:e.tool_use_id,toolName:e.name,output:e.content,isError:e.is_error,...e.note?{note:e.note}:{},...e.serialized?{serialized:e.serialized}:{}}}function DO(e){switch(e.type){case"text":return{type:"text",text:e.text};case"reasoning":{if(e.redacted===!0)return{type:"redacted_thinking",data:e.metadata?.data??""};let t=e.metadata;return{type:"thinking",thinking:e.text,signature:t?.signature,details:t?.details}}case"image":return typeof e.image==="string"?{type:"image",data:e.image,mediaType:e.mediaType??"image/png"}:void 0;case"file":return{type:"file",path:e.path,content:e.content};case"media":return{type:"media",media:e.media};case"tool-call":{let t=e.metadata;return{type:"tool_use",id:e.toolCallId,name:e.toolName,input:e.input??{},signature:t?.thoughtSignature??t?.signature}}case"tool-result":return{type:"tool_result",tool_use_id:e.toolCallId,name:e.toolName,content:Zm(e.output),is_error:e.isError,...e.note?{note:e.note}:{},...Kk(e)?{serialized:Kk(e)}:{}}}}function OO(e){if(!e)return;return{inputTokens:e.inputTokens??0,outputTokens:e.outputTokens??0,cacheReadTokens:e.cacheReadTokens??0,cacheWriteTokens:e.cacheWriteTokens??0,cost:e.cost,reasoningTokenCount:e.reasoningTokenCount,timings:e.timings}}function oQ(e){if(!e)return;return{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens,cost:e.cost,reasoningTokenCount:e.reasoningTokenCount,timings:e.timings}}var LO=0;function iQ(){return LO+=1,`msg_${Date.now().toString(36)}_${LO.toString(36)}`}import{createGateway as cQ,createHandlerAsync as uQ,hasRegisteredHandler as hQ,isModelRequestCaptureOn as pQ,MODEL_COLLECTIONS_BY_PROVIDER_ID as mQ,normalizeProviderId as Vk,resolveGatewayProviderRegistrationSync as fQ,toGatewayModelCapabilities as gQ,withModelRequestCapture as yQ}from"@cerebriline/llms";import{classifyProviderError as $O}from"@cerebriline/llms";import{toolResultForModel as sQ}from"@cerebriline/shared";function aQ(e,t){let n=t==="text";return e.map((r)=>{if(typeof r.content==="string")return r;if(!r.content.some((o)=>o.type==="tool_result"&&(n||o.note)))return r;return{...r,content:r.content.map((o)=>{if(o.type!=="tool_result"||!n&&!o.note)return o;let{note:i,serialized:s,...a}=o;return{...a,content:sQ(a.content,i,{...t?{format:t}:{},...s?{serialized:s}:{}})}})}})}function dQ(e){switch(e.type){case"text":return[{type:"text-delta",text:e.text}];case"media":return[{type:"media",media:e.media}];case"reasoning":return[{type:"reasoning-delta",text:e.reasoning,metadata:e.signature?{thoughtSignature:e.signature,details:e.details}:{details:e.details}}];case"tool_calls":{let t=e.tool_call.function,n=t.arguments;return[{type:"tool-call-delta",toolCallId:e.tool_call.call_id??t.id,toolName:t.name,inputText:typeof n==="string"?n:void 0,input:typeof n==="string"?void 0:n,...e.signature?{metadata:{thoughtSignature:e.signature}}:{}}]}case"usage":return[{type:"usage",usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens,reasoningTokenCount:e.thoughtsTokenCount,totalCost:e.totalCost}}];case"done":return[{type:"finish",reason:lQ(e),error:e.error,...e.error?{errorClass:$O(e.error)}:{}}];default:return[]}}function lQ(e){if(e.success===!1)return"error";if(e.incompleteReason==="max_output_tokens"||e.incompleteReason==="max-tokens")return"max-tokens";if(e.incompleteReason==="content_filter"||e.incompleteReason==="content-filter")return"content-filter";return"stop"}function FO(e,t){return{async*stream(n){let r=!1,o=!1;try{let i=typeof e==="function"?await e():e;i.setAbortSignal?.(n.signal);let s=aQ(ef(n.messages),t?.toolResultFormat),a=n.tools.map((d)=>({name:d.name,description:d.description,inputSchema:d.inputSchema}));for await(let d of i.createMessage(n.systemPrompt??"",s,a))for(let l of dQ(d)){if(l.type==="finish")r=!0;else if(l.type==="tool-call-delta")o=!0;yield l}if(!r)yield{type:"finish",reason:o?"tool-calls":"stop"}}catch(i){if(!r){let s=n.signal?.aborted===!0;yield{type:"finish",reason:s?"aborted":"error",error:i instanceof Error?i.message:String(i),...s?{}:{errorClass:$O(i)}}}}}}}function wQ(e){let t=Object.fromEntries(Object.entries(e).filter(([,n])=>n!==void 0));return Object.keys(t).length>0?t:void 0}function bQ(e){return e.providerId==="openai-compatible"||e.clientType==="openai-compatible"}var UO;function vQ(){return UO??=`cerebriline-aux-${Math.random().toString(36).slice(2,10)}`,UO}function kQ(e,t){let n={region:e.region,apiLine:e.apiLine,openRouterProviderSorting:e.openRouterProviderSorting,modelCatalog:e.modelCatalog,sampling:e.sampling,polykv:e.polykv};if(bQ(e))Object.assign(n,{apiVersion:e.azure?.apiVersion,useIdentity:e.azure?.useIdentity});let r=Vk(e.providerId);if(r==="ollama"&&t)n.requestCaptureSessionId=t;if(r==="opencoti"||r==="xollama"){let o=e.engineSessionId||t||vQ();if(n.polykvSessionId=o,e.polykvWorker)n.polykvWorker={...e.polykvWorker,sessionId:o};if(e.polykvBooking)n.polykvBooking=e.polykvBooking;if(e.polykvLeadPool===!1)n.polykvLeadPool=!1;if(e.sideCallOf)n.polykvSideCallOf=e.sideCallOf;if(e.requestedContextWindow)n.requestedContextWindow=e.requestedContextWindow;if(e.agentWindow)n.agentWindow=e.agentWindow;if(e.notices&&(e.engineSessionId||t))n.notices=e.notices}if(e.providerId==="bedrock")Object.assign(n,{authentication:e.aws?.authentication,profile:e.aws?.profile,accessKeyId:e.aws?.accessKey,secretAccessKey:e.aws?.secretKey,sessionToken:e.aws?.sessionToken,usePromptCache:e.aws?.usePromptCache,useCrossRegionInference:e.useCrossRegionInference,useGlobalInference:e.useGlobalInference,endpoint:e.aws?.endpoint,customModelBaseId:e.aws?.customModelBaseId});if(e.providerId==="vertex"){let o=e.gcp?.region??e.region;Object.assign(n,{project:e.gcp?.projectId,projectId:e.gcp?.projectId,location:o,region:o})}if(e.providerId==="claude-code"){let o=e.extensionContext?.workspace;Object.assign(n,{cwd:o?.cwd??o?.rootPath})}if(e.providerId==="sapaicore")Object.assign(n,e.sap);return wQ(n)}function TQ(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?Math.floor(e):void 0}function Xk(e){let t=e.providerConfig,n=t?.knownModels?t.knownModels:e.knownModels??mQ[e.providerId]?.models??void 0,r=TQ(t?.maxInputTokens),o=t?.modelInfo&&t.modelInfo.id===e.modelId?t.modelInfo:void 0;if(r===void 0&&!o)return n;return{...n??{},[e.modelId]:{...n?.[e.modelId],...r!==void 0?{contextWindow:r,maxInputTokens:r}:{},...o,id:e.modelId}}}function SQ(e,t){return{id:e,name:t.name??e,description:t.description,contextWindow:t.contextWindow,maxInputTokens:t.maxInputTokens,maxOutputTokens:t.maxTokens,operation:t.operation,operationModes:t.operationModes,modalities:t.modalities,capabilities:gQ(t.capabilities),reasoningOptions:t.reasoningOptions,metadata:{...t.metadata?.apiProtocol?{apiProtocol:t.metadata.apiProtocol}:{},family:t.family,pricing:t.pricing,status:t.status,releaseDate:t.releaseDate}}}function Yk(e){let t=e.providerConfig,n=t?.providerId===e.providerId?t:void 0;return{...n??{},providerId:e.providerId,modelId:e.modelId,apiKey:e.apiKey??n?.apiKey,baseUrl:e.baseUrl??n?.baseUrl,headers:e.headers??n?.headers}}function tf(e,t,n,r){let o={...Yk(e),knownModels:Xk(e),maxOutputTokens:e.maxTokensPerTurn,temperature:e.temperature,reasoningEffort:e.reasoningEffort,thinkingBudgetTokens:e.thinkingBudgetTokens,thinking:e.thinking,logger:t,extensionContext:e.extensionContext,...e.engineSessionId?{engineSessionId:e.engineSessionId}:{},...e.polykvWorker?{polykvWorker:e.polykvWorker}:{},...e.toolResultFormat?{toolResultFormat:e.toolResultFormat}:{}},i=Vk(o.providerId);if(pQ()&&i!=="ollama"&&i!=="xollama")o.fetch=yQ(o.fetch??globalThis.fetch,e.sessionId);if(hQ(Vk(o.providerId)))return FO(()=>uQ(o),o.toolResultFormat?{toolResultFormat:o.toolResultFormat}:void 0);let s=cQ({fetch:o.fetch,providerConfigs:[{providerId:o.providerId,apiKey:o.apiKey,baseUrl:o.baseUrl,headers:o.headers,timeoutMs:o.timeoutMs,fetch:o.fetch,defaultMaxOutputTokens:o.defaultMaxOutputTokens,reasoningHistory:o.reasoningHistory,reasoningInline:o.reasoningInline,toolResultFormat:o.toolResultFormat,options:kQ(o,e.sessionId),models:o.knownModels?Object.entries(o.knownModels).map(([d,l])=>SQ(d,l)):void 0}],logger:t,telemetry:n??e.telemetry??e.extensionContext?.telemetry}),a=fQ(o);if(a)s.registerProvider(a);return s.createAgentModel({providerId:o.providerId,modelId:o.modelId},{maxTokens:o.maxOutputTokens,temperature:o.temperature,auxiliary:r?.auxiliary??o.auxiliary,conversation:r?.conversation===!0,sessionId:e.engineSessionId||e.sessionId})}import{clearPolykvSession as xQ,createPolykvClient as BO,deferPolykvLeadClose as HO,engineSessionId as of,getPolykvSession as du,getPolykvWindowGrant as _Q,hasOpencotiFeature as EQ,normalizeProviderId as Is,OPENCOTI_FEATURES as AQ,polykvEffectiveWindow as RQ,polykvWorkerChargedTo as IQ,probeOpencotiProps as WO,readOpencotiKv as CQ,releasePolykvLead as PQ,setPolykvSession as MQ,withXollamaAuth as Jk,XOLLAMA_DEFAULT_BASE_URL as Qk,xollamaDrivesModel as OQ,xollamaEngineFetch as qO,xollamaEngineRoot as jO}from"@cerebriline/llms";import{hasPromptEnvironment as LQ}from"@cerebriline/shared";var sf=0.85;function lu(e){return e?.providerId!==void 0&&Is(e.providerId)==="opencoti"&&Boolean(e.baseUrl)&&e.polykv?.enabled!==!1}function $o(e){return lu(e)||e?.providerId!==void 0&&Is(e.providerId)==="xollama"&&e.polykv?.enabled!==!1}async function zO(e){if(!e.modelId||e.polykv?.enabled===!1)return!1;let t=e.baseUrl||Qk,n={...e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{},...e.headers??{}};return OQ(t,e.modelId,Jk(e.fetch??fetch,t,n))}async function Cs(e){if(e?.providerId===void 0)return;let t=Is(e.providerId);if(t==="opencoti")return e.baseUrl?e:void 0;if(t!=="xollama"||!e.modelId)return;if(!await zO(e).catch(()=>!1))return;let n=e.baseUrl||Qk,r={...e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{},...e.headers??{}},{headers:o,...i}=e;return{...i,providerId:"opencoti",baseUrl:jO(n,e.modelId),fetch:qO(Jk(e.fetch??fetch,n,r))}}async function NQ(e,t){let n=t.providerConfig;if(!n.modelId)return;let r=n.baseUrl||Qk,o={...n.apiKey?{Authorization:`Bearer ${n.apiKey}`}:{},...n.headers??{}},i=BO({baseUrl:jO(r,n.modelId),fetch:qO(Jk(n.fetch??fetch,r,o))}),s=async()=>{try{let a=await i.closeSession(of(e));t.logger?.log(a?`[xOllama] Closed engine session ${e}: its window is free for the next conversation`:`[xOllama] The engine held no window for session ${e}`)}catch(a){t.logger?.log(`[xOllama] Could not close engine session ${e}; its window stays booked until the idle TTL: ${a instanceof Error?a.message:String(a)}`,{severity:"warn"})}};if(HO(e,s)){t.logger?.log(`[xOllama] Session ${e} ended with priority-0 agents still running in it; its window is closed after the last of them`);return}await s()}async function Zk(e){if(e?.providerId!==void 0&&Is(e.providerId)==="xollama")return zO(e).catch(()=>!1);if(!e||!lu(e))return!1;return(await WO(e.baseUrl,e.fetch).catch(()=>{return}))?.poolsEnabled===!0}function kd(e){if(!e.baseUrl)return;return BO({baseUrl:e.baseUrl,...e.fetch?{fetch:e.fetch}:{},...e.headers?{headers:e.headers}:{}})}function DQ(e){if(!e.systemPrompt)return;let t=$Q(e.tools);return{messages:[{role:"system",content:e.systemPrompt}],...t.length>0?{tools:t}:{}}}function $Q(e){let t=[];for(let n of e??[]){if(!n||typeof n!=="object")continue;let r=n;if(r.type==="function"&&r.function){t.push(n);continue}let o=r.name;if(typeof o!=="string"||o==="")continue;t.push({type:"function",function:{name:o,description:typeof r.description==="string"?r.description:"",parameters:r.inputSchema??r.parameters??{type:"object"}}})}return t}function FQ(e){let t=e.replace(/[ \t]+$/,"");return t.endsWith(`
|
|
184
184
|
`)?t:`${t}
|
|
185
185
|
`}async function GO(e){if(!e.sessionId||!lu(e.providerConfig)||e.providerConfig.polykvWorker)return;let t=du(e.sessionId);if(t)return t.poolId;if(LQ(e.systemPrompt))return;let n=kd(e.providerConfig);if(!n)return;try{let r=DQ({...e.systemPrompt?{systemPrompt:e.systemPrompt}:{},...e.tools?{tools:e.tools}:{}});if(!r)return;let o=FQ(await n.applyTemplate(r));if(o.trim()==="")return;let i=await n.createPool({prompt:o,pin:!0,session_id:e.sessionId});return MQ(e.sessionId,{poolId:i.pool_id,prefixTokens:i.prefix_len}),e.logger?.log?.(`[PolyKV] Pinned ${i.prefix_len} prefix tokens as pool ${i.pool_id}`),i.pool_id}catch(r){e.logger?.log?.(`[PolyKV] Could not pin the prefix; running unpooled: ${r instanceof Error?r.message:String(r)}`,{severity:"warn"});return}}var KO=5000,nf=new Map;function UQ(e){if(e===void 0){nf.clear();return}nf.delete(e)}async function Td(e){let t=du(e.sessionId);if(!t||e.providerConfig.polykv?.enabled===!1)return;let n=await Cs(e.providerConfig),r=n?kd(n):void 0;if(!r)return;let o=e.sessionId??"",i=nf.get(o);if(i&&i.poolId===t.poolId&&Date.now()-i.at<KO)return i.value;let s;try{s=await r.capacity(t.poolId,{...e.expectedTokens!==void 0?{expected_tokens:e.expectedTokens}:{}})}catch(a){e.logger?.debug?.(`[PolyKV] Capacity unavailable for pool ${t.poolId}: ${a instanceof Error?a.message:String(a)}`),s=void 0}return nf.set(o,{at:Date.now(),poolId:t.poolId,value:s}),s}var rf=new Map;function VO(){rf.clear()}async function eT(e){let t=await tT(e);if(!t||!e.sessionId)return;let n=of(e.sessionId),r=e.providerConfig.polykvWorker?IQ(e.sessionId):void 0,o=r&&r!==n?[r,n]:[n];for(let i of o){let s=t.allocations.find((a)=>a.sessionId===i);if(s)return s}return}async function tT(e){if(!e.sessionId)return;let t=await Cs(e.providerConfig);if(!t?.baseUrl)return;let n=rf.get(e.sessionId);if(n&&Date.now()-n.at<KO)return n.value;let r;try{r=await CQ(t.baseUrl,t.fetch)}catch(o){e.logger?.debug?.(`[PolyKV] Allocations unavailable: ${o instanceof Error?o.message:String(o)}`),r=void 0}return rf.set(e.sessionId,{at:Date.now(),value:r}),r}function XO(e,t,n){let r=typeof t==="number"&&t>0&&t<=1?t:sf,o=(s)=>typeof s==="number"&&Number.isFinite(s)?s:void 0,i=o(n?.pressure);if(i!==void 0)return i>=r;if(!e||e.settling)return!1;return(o(e.pressure)??e.compaction_pressure??0)>=r}function YO(e,t,n){if(t===void 0||Is(t)!=="opencoti"&&Is(t)!=="xollama")return;let r=RQ(_Q(e));if(r===void 0)return;if(typeof n==="number"&&Number.isFinite(n)&&n>0&&r>=n)return;return r}async function JO(e){let t=du(e.sessionId);if(!e.sessionId||!t||!lu(e.providerConfig))return;if(t.layout==="borrowed"||e.sessionCellsReleased)return t.poolId;let n=kd(e.providerConfig);if(!n)return t.poolId;let r=of(e.sessionId);try{if((await eT({sessionId:e.sessionId,providerConfig:{...e.providerConfig,polykvWorker:!1}}))?.sessionId===r){let i=await n.eraseSessionSlot(r);e.logger?.log?.(`[PolyKV] After compaction: staying on pool ${t.poolId}; erased ${i??0} stale cells from the slot, booking kept`)}else{let i=await n.eraseSessionSlot(r);e.logger?.log?.(`[PolyKV] After compaction: staying on pool ${t.poolId}; ${i!==void 0?`erased ${i} stale cells from the slot`:"no slot was resident"}`)}}catch(o){e.logger?.log?.(`[PolyKV] After compaction: could not drop the slot's stale cells: ${o instanceof Error?o.message:String(o)}`,{severity:"warn"})}return t.poolId}async function QO(e){if(!e.sessionId)return;let t=e.sessionId,n=du(t);if(await PQ(t).catch(()=>{return}),xQ(t),UQ(t),rf.delete(t),e.providerConfig.providerId!==void 0&&Is(e.providerConfig.providerId)==="xollama"){await NQ(t,e);return}let r=kd(e.providerConfig);if(!r)return;if(n&&n.layout!=="lead"&&n.layout!=="borrowed")try{await r.unpin(n.poolId),await r.releasePool(n.poolId),e.logger?.debug?.(`[PolyKV] Released pool ${n.poolId}`)}catch(s){e.logger?.debug?.(`[PolyKV] Could not release pool ${n.poolId}: ${s instanceof Error?s.message:String(s)}`)}let o=await WO(e.providerConfig.baseUrl,e.providerConfig.fetch).catch(()=>{return});if(!EQ(o?.features,AQ.sessionClose))return;let i=async()=>{try{let s=await r.closeSession(of(t));e.logger?.debug?.(s?`[PolyKV] Closed session ${t}`:`[PolyKV] Server held no window for session ${t}`)}catch(s){e.logger?.debug?.(`[PolyKV] Could not close session ${t}: ${s instanceof Error?s.message:String(s)}`)}};if(HO(t,i)){e.logger?.log(`[PolyKV] Session ${t} ended with priority-0 agents still running in it; its window is closed after the last of them`);return}await i()}async function ZO(e){if(!e.sessionId||!lu(e.providerConfig))return;let t=kd(e.providerConfig);if(!t)return;try{let n=await t.createPool({from_session:e.sessionId,session_id:e.sessionId,ephemeral:!0});return e.logger?.debug?.(`[PolyKV] Snapshotted session ${e.sessionId} into pool ${n.pool_id} (${n.prefix_len} tokens)`),{poolId:n.pool_id,prefixTokens:n.prefix_len}}catch(n){let r=du(e.sessionId);if(r)return e.logger?.debug?.(`[PolyKV] Could not snapshot session ${e.sessionId} (${n instanceof Error?n.message:String(n)}); the workers will share its root pool ${r.poolId} instead`),{poolId:r.poolId,prefixTokens:r.prefixTokens,borrowed:!0};e.logger?.debug?.(`[PolyKV] Could not snapshot session ${e.sessionId}: ${n instanceof Error?n.message:String(n)}`);return}}async function eL(e){let t=kd(e.providerConfig);if(!t)return;try{await t.unpin(e.poolId),await t.releasePool(e.poolId),e.logger?.debug?.(`[PolyKV] Released pool ${e.poolId}`)}catch(n){e.logger?.debug?.(`[PolyKV] Could not release pool ${e.poolId}: ${n instanceof Error?n.message:String(n)}`)}}var XQ=new Set(["opencoti","ollama","xollama","lmstudio","openai-compatible"]),nL=256,YQ=3,af=512,JQ=3,rL=[2000,4000,8000,15000,30000];function sL(e){return Math.ceil(e/nL)*nL}function Si(e){return Math.ceil(Math.max(0,e)/YQ)}function rT(e,t){return sL(Si(e)+Math.max(0,t)+af)}class oT extends Error{errorClass;constructor(e,t){super(e);this.errorClass=t;this.name="ContinuationCallError"}}function QQ(e){let t=[];for(let n of e){let r=n??{};if(typeof r.name!=="string"||r.name==="")continue;t.push({name:r.name,description:typeof r.description==="string"?r.description:"",inputSchema:r.inputSchema??{type:"object"}})}return t}var ZQ=async(e,t)=>{let n=e.providerConfig,r=tf({providerId:n.providerId,modelId:n.modelId,providerConfig:n,...e.sessionId?{sessionId:e.sessionId}:{},...n.engineSessionId?{engineSessionId:n.engineSessionId}:{},...n.polykvWorker?{polykvWorker:n.polykvWorker}:{}},t,void 0,{auxiliary:!1}),o=e.reasoning??{},i=await r.stream({systemPrompt:e.systemPrompt,messages:vd(e.messages),tools:QQ(e.tools),...e.abortSignal?{signal:e.abortSignal}:{},options:{maxTokens:e.maxTokens,...e.toolChoice?{toolChoice:e.toolChoice}:{},...o.thinking!==void 0?{thinking:o.thinking}:{},...o.reasoningEffort!==void 0?{reasoningEffort:o.reasoningEffort}:{},...o.thinkingBudgetTokens!==void 0?{thinkingBudgetTokens:o.thinkingBudgetTokens}:{},...o.temperature!==void 0?{temperature:o.temperature}:{}}}),s="",a=0,d,l,c;for await(let u of i)switch(u.type){case"text-delta":s+=u.text;break;case"reasoning-delta":a+=u.text.length;break;case"usage":if(u.timings)l=u.timings;c=df(c,u.usage);break;case"finish":if(u.reason==="error")throw new oT(u.error??"the model call failed",u.errorClass);if(u.reason==="max-tokens")d="max_tokens";break;default:break}return{text:s.trim(),reasoningChars:a,incompleteReason:d,timings:l,...c?{usage:c}:{}}};function df(e,t){if(!t)return e;let n=(o,i)=>o===void 0&&i===void 0?void 0:(o??0)+(i??0),r={};for(let o of["inputTokens","outputTokens","cacheReadTokens","cacheWriteTokens","totalCost"]){let i=n(e?.[o],t[o]);if(i!==void 0)r[o]=i}return r}function eZ(e){if(!e||e.promptTokens===void 0)return;return e.engine==="ollama"?Math.max(0,e.promptTokens-(e.cachedTokens??0)):e.promptTokens}function iT(e){return{...e?{onUsage:e}:{},prefillTokens:0,unmeasuredCalls:0,calls:0,peakBookedCells:0,criticCacheN:[],siblingCacheN:[],released:[],leaked:[],notes:[]}}function sT(e,t,n,r){if(!e)return;if(e.calls+=1,e.usage=df(e.usage,r),r&&e.onUsage)try{e.onUsage(r)}catch{}let o=eZ(t)??n;if(o===void 0){e.unmeasuredCalls+=1;return}e.prefillTokens+=o}var tZ=0;function nZ(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??Error("aborted"));return}let o=setTimeout(()=>{t?.removeEventListener("abort",i),n()},e),i=()=>{clearTimeout(o),r(t?.reason??Error("aborted"))};t?.addEventListener("abort",i,{once:!0})})}function rZ(e){if(e instanceof oT)return zQ(e.message,e.errorClass)!==void 0;return GQ(e)!==void 0}function cu(e,t){let n=qQ(e.providerId??"");if(e.polykv?.continuationCompaction===!1)return"switched off (polykv.continuationCompaction: false)";if(t)return"a summarizer model of its own is configured; it cannot continue this session";if(!XQ.has(n))return`${n||"this provider"} keeps no prefix a continuation could share`;return}async function aL(e){let t=e.providerConfig,n=cu(t,e.separateSummarizer);if(n!==void 0)return{reason:n};if(e.overflowRecovery)return{reason:"overflow recovery: the session's own prompt no longer fits its window"};let r=e.contextWindow,o=e.requestTokens+Math.max(0,e.pendingTokens??0),i=Lk(r);if(typeof r==="number"&&r>0&&o+i>r)return{reason:`no room in the window for the writer (conversation ${Math.round(o)} + instruction ${Vm} + summary ${i-Vm} > ${r})`};let s="continuation",a="prompt-cache continuation",d,l=[],c=!1,u,h=await Cs(t),p=h!==void 0,f=HQ(t.engineSessionId||e.sessionId||"");if(h?.baseUrl&&f){let g=await jQ(h.baseUrl,h.fetch).catch(()=>{return});if(l=g?.features??[],c=g?.poolsEnabled===!0,d=BQ({baseUrl:h.baseUrl,...h.fetch?{fetch:h.fetch}:{},...h.headers?{headers:h.headers}:{}}),u=(Fo(l,Uo.kvStatus)?await iL(h.baseUrl,h.fetch).catch(()=>{return}):void 0)?.allocations.find((x)=>x.sessionId===f),!(t.polykv?.enabled!==!1&&c&&Fo(l,Uo.subpools)&&Fo(l,Uo.sessionClose)&&Fo(l,Uo.kvStatus)))a="the engine does not advertise pools, sub-pools, session close and /kv";else if(e.kvPressureActive)a="the server is under KV pressure and queues new bookings: no pools, no new bookings";else s="pooled",a=u?"pooled on the session's own booking":t.polykvWorker?"pooled from a swarm worker (unowned)":"pooled on an exact writer booking"}let m=new dL({input:e,path:s,reason:a,wireId:f,opencoti:p,features:l,held:u,prefixPooled:p&&c&&t.polykv?.enabled!==!1&&(Boolean(t.polykvWorker)||WQ(e.sessionId)!==void 0||VQ(e.systemPrompt)),...d?{client:d}:{}});return await m.start(),{continuation:m,reason:m.reason}}class dL{state;meter;path;reason;serial;p;pPrime;pPrimeOwned=!1;lastWriter;writerBooking;openSessions=new Set;released=!1;disposed=!1;bookedNow=0;ownerRoom;claimed=0;criticClaim=0;constructor(e){this.state=e;this.meter=e.input.meter??iT(),this.path=e.path,this.reason=e.reason,this.serial=e.input.serial??++tZ}get input(){return this.state.input}get logger(){return this.input.logger}note(e){this.meter.notes.push(e),this.logger?.debug?.(`[compaction] ${e}`)}book(e){this.bookedNow+=e,this.meter.peakBookedCells=Math.max(this.meter.peakBookedCells,this.bookedNow)}unbook(e){this.bookedNow=Math.max(0,this.bookedNow-e)}idFor(e){return`${this.state.wireId}~cc${this.serial}-${e}`}async start(){if(this.path!=="pooled"||!this.state.client)return;try{this.p=await this.state.client.createPool({from_session:this.state.wireId,pin:!0}),this.note(`froze the session as pool ${this.p.pool_id} (${this.p.prefix_len} tokens, owner ${this.p.owner===void 0?"?":this.p.owner||"none"})`)}catch(e){this.path="continuation",this.reason=`freeze refused (${Ti(e)}); prompt-cache continuation`,this.note(this.reason)}}async call(e,t){let n=this.input.model??ZQ,r=this.input.sleep??nZ;for(let o=0;;o+=1)try{let i=await n(e,this.logger);return sT(this.meter,i.timings,void 0,i.usage),i}catch(i){if(this.input.abortSignal?.aborted)throw i;if(!rZ(i))throw i;if(t.boundedWaits&&o>=JQ)throw i;let s=rL[Math.min(o,rL.length-1)];this.logger?.log(`[compaction] ${e.purpose} queued by the server; retrying in ${s}ms (${KQ(Ti(i))})`,{severity:"info"}),await r(s,this.input.abortSignal)}}writerMessages(e){return[...this.input.apiMessages,{role:"user",content:[{type:"text",text:e}]}]}async write(e,t){let n=this.input.providerConfig,r=n;if(this.state.opencoti&&!this.state.held&&!n.polykvWorker&&Fo(this.state.features,Uo.guaranteedAlloc)){let i=sL(Math.ceil(this.input.requestTokens*1.1)+Si(e.length)+t+af);if(this.writerBooking===void 0)this.book(i);else if(i>this.writerBooking)this.book(i-this.writerBooking);this.writerBooking=Math.max(this.writerBooking??0,i),r={...n,polykvBooking:{numCtx:this.writerBooking},polykvLeadPool:!1}}let o=await this.call({purpose:"writer",providerConfig:r,...this.input.sessionId?{sessionId:this.input.sessionId}:{},systemPrompt:this.input.systemPrompt,messages:this.writerMessages(e),tools:this.input.tools,maxTokens:t,toolChoice:"none",reasoning:this.input.reasoning,...this.input.abortSignal?{abortSignal:this.input.abortSignal}:{}},{boundedWaits:!1});return this.lastWriter={instruction:e,text:o.text,...o.timings?.cachedTokens!==void 0?{cacheN:o.timings.cachedTokens}:{},...o.usage?.inputTokens!==void 0?{inputTokens:o.usage.inputTokens}:{},...o.usage?.outputTokens!==void 0?{outputTokens:o.usage.outputTokens}:{}},this.meter.writerCacheN=o.timings?.cachedTokens,this.meter.writerExpectedCacheN=this.p?.prefix_len??this.input.observedRequestTokens,o}async afterWriter(e,t){let n=this.state.client,r=e*2+6000,o=Si(r)+t;if(this.path==="pooled"&&n&&this.p){let s=Math.min(this.lastWriter?.cacheN??0,this.p.prefix_len);try{this.pPrime=s>0?await n.forkPool(this.p.pool_id,{from_session:this.state.wireId,branch_pos:s,pin:!0}):await n.createPool({from_session:this.state.wireId,pin:!0})}catch(a){this.note(`fork of P refused (${Ti(a)}); freezing P' as a root`);try{this.pPrime=await n.createPool({from_session:this.state.wireId,pin:!0})}catch(d){this.note(`P' could not be frozen (${Ti(d)})`)}}}if(this.pPrime&&n){this.meter.criticExpectedCacheN=this.pPrime.prefix_len;let s=this.pPrime.owner??(this.state.held||this.writerBooking!==void 0?this.state.wireId:"");if(this.pPrimeOwned=s!=="",this.note(`froze P' as pool ${this.pPrime.pool_id} (${this.pPrime.prefix_len} tokens, ${this.pPrimeOwned?`owned by ${s}`:"unowned"})`),!this.pPrimeOwned){if(Fo(this.state.features,Uo.privateWindow))return{critics:"concurrent",reason:"critics attach the unowned P' on exact bookings"};this.note("no private windows on this engine: critics run in the session"),this.releasePPrimeLater=!0}else{let a=await this.readOwnerRoom(s);if(this.ownerRoom=a,a===void 0||a>=o*2)return this.criticClaim=o*2,this.claimed+=this.criticClaim,{critics:"concurrent",reason:`critics are workers of ${s}${a===void 0?"":` (${a} cells free)`}`};if(a>=o)return this.criticClaim=o,this.claimed+=this.criticClaim,{critics:"serial",reason:`room for one critic at a time in ${s} (${a} of ${o*2} cells)`};return{critics:"skip",reason:`no room in ${s}'s window for a critic (${a} free, ${o} needed)`}}}let i=this.input.contextWindow;if(typeof i==="number"&&i>0){let s=this.input.requestTokens+Si((this.lastWriter?.instruction.length??0)+e)+o;if(s>i)return{critics:"skip",reason:`no room in the window for a critic (${s} > ${i})`}}return{critics:"serial",reason:"critics continue the session, one at a time"}}releasePPrimeLater=!1;async readOwnerRoom(e){let t=await Cs(this.input.providerConfig);if(!t?.baseUrl)return;let r=(await iL(t.baseUrl,t.fetch).catch(()=>{return}))?.allocations.find((o)=>o.sessionId===e);return r?Math.max(0,r.window-r.used):void 0}async critic(e,t,n,r){let o=this.lastWriter;if(!o)throw Error("no writer turn to continue");let i=[...this.writerMessages(o.instruction),{role:"assistant",content:[{type:"text",text:o.text}]},{role:"user",content:[{type:"text",text:`${t}
|
|
186
186
|
|
|
@@ -1531,7 +1531,7 @@ ${a}`:a,t.mode??e.config.mode),l=this.resolveAbsoluteFilePaths(e.config.cwd,t.us
|
|
|
1531
1531
|
provider, model, cwd, workspace_root, team_name, enable_tools, enable_spawn, enable_teams,
|
|
1532
1532
|
parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent, prompt,
|
|
1533
1533
|
metadata_json, transcript_path, hook_path, messages_path, updated_at
|
|
1534
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[e.sessionId,e.source,e.pid,e.startedAt,null,null,"running",0,e.interactive?1:0,e.provider,e.model,e.cwd,e.workspaceRoot,e.teamName??null,e.enableTools?1:0,e.enableSpawn?1:0,e.enableTeams?1:0,null,null,null,null,0,e.prompt??null,e.metadata?JSON.stringify(e.metadata):null,"","",e.messagesPath,ft()])}}function WDe(e){return{text:e.text,usage:e.usage,inputTokens:e.usage.inputTokens,outputTokens:e.usage.outputTokens,iterations:e.iterations,finishReason:e.finishReason,toolCalls:e.toolCalls.map((t)=>({name:t.name,input:t.input,output:t.output,error:t.error,durationMs:t.durationMs}))}}function qDe(e){return e.mode==="plan"?"plan":e.mode==="yolo"?"yolo":"act"}function CV(e={}){let t=async(r)=>r,n=new im({sessionService:new lm(new dm),capabilities:{toolExecutors:{submit:t}},fetch:e.fetch,telemetry:e.telemetry});return{async startSession(r,o){let i=(r.cwd?.trim()||r.workspaceRoot).trim(),s=await n.startSession({source:Kt.CORE,mode:"automation",sessionMetadata:Jn(o?.sessionMetadata,{mode:"automation",trigger:r.source}),interactive:!1,config:{providerId:HDe(r.provider),modelId:r.model,apiKey:r.apiKey?.trim()||void 0,cwd:i,workspaceRoot:r.workspaceRoot,systemPrompt:r.systemPrompt??"",mode:qDe(r),maxIterations:r.maxIterations,enableTools:r.enableTools!==!1,enableSpawnAgent:r.enableSpawn!==!1,enableAgentTeams:r.enableTeams!==!1,disableMcpSettingsTools:r.disableMcpSettingsTools,agentPluginPaths:r.agentPluginPaths,missionLogIntervalSteps:r.missionStepInterval,missionLogIntervalMs:r.missionTimeIntervalMs},toolPolicies:r.toolPolicies??{"*":{autoApprove:r.autoApproveTools!==!1}},localRuntime:{configExtensions:r.configExtensions}});return{sessionId:s.sessionId,startResult:{sessionId:s.sessionId,manifestPath:s.manifestPath,messagesPath:s.messagesPath}}},async sendSession(r,o){let i=await n.runTurn({sessionId:r,prompt:o.prompt,userImages:o.attachments?.userImages,userFiles:o.attachments?.userFiles?.map((s)=>s.content)});if(!i)throw Error("local hub schedule runtime returned no turn result");return{result:WDe(i)}},async abortSession(r){return await n.abort(r,Error("hub schedule abort")),{applied:!0}},async stopSession(r){return await n.stopSession(r),{applied:!0}}}}import{CLINE_HUB_DEV_PORT as jDe,CLINE_HUB_PORT as zDe,resolveClineBuildEnv as GDe}from"@cerebriline/shared";var KDe="CLINE_HUB_HOST",VDe="CLINE_HUB_PORT",XDe="CLINE_HUB_PATHNAME",YDe="127.0.0.1",JDe=zDe,QDe="/hub";function PV(e){return GDe(e)==="development"?jDe:JDe}function ZDe(e={}){return(e.env??process.env)[KDe]?.trim()||YDe}function cP(e={}){let n=(e.env??process.env)[VDe]?.trim();if(!n)return PV(e);let r=Number.parseInt(n,10);if(!Number.isInteger(r)||r<1||r>65535)return PV(e);return r}function e$e(e={}){return(e.env??process.env)[XDe]?.trim()||QDe}function uP(e={},t={}){return{host:e.host??ZDe(t),port:e.port??cP(t),pathname:e.pathname??e$e(t)}}import{chmodSync as t$e,existsSync as n$e,mkdirSync as r$e}from"node:fs";import{dirname as o$e}from"node:path";import{loadSqliteDb as i$e}from"@cerebriline/shared/db";var MV=3;class OV extends Error{lockFile;constructor(e){super(`Hub instance lock is held by a live Hub: ${e}. Connect to the running Hub or diagnose it; never replace it.`);this.name="HubLockHeldError",this.lockFile=e}}function cm(e){return e instanceof Error&&e.name==="HubLockHeldError"}function LV(e){return`${e}.instance.lock`}class $c{db;lockFile;constructor(e,t){this.lockFile=e,this.db=t}get held(){return this.db!==void 0}release(){let e=this.db;if(!e)return;this.db=void 0;try{e.exec("ROLLBACK;")}catch{}e.close?.()}static acquire(e){let t=!1,n;try{r$e(o$e(e),{recursive:!0}),t=n$e(e),n=i$e(e)}catch{return new $c(e,void 0)}try{n.exec("PRAGMA busy_timeout = 0;"),n.exec("BEGIN EXCLUSIVE;")}catch(r){if(n.close?.(),s$e(r))throw new OV(e);return new $c(e,void 0)}if(!t)try{t$e(e,384)}catch{}return new $c(e,n)}}function s$e(e){let t=e instanceof Error?e.message:String(e),n=e?.code;return n==="SQLITE_BUSY"||n==="SQLITE_LOCKED"||t.includes("SQLITE_BUSY")||t.includes("SQLITE_LOCKED")||t.includes("database is locked")}import{join as S$e}from"node:path";import{createHash as a$e,randomBytes as FV}from"node:crypto";import{mkdir as pP,open as NV,readFile as UV,rename as d$e,rm as mP,writeFile as l$e}from"node:fs/promises";import{dirname as BV,join as fP}from"node:path";import{ensureLoopbackProxyBypass as c$e,isHubProtocolCompatible as Qft}from"@cerebriline/shared";import{resolveClineDataDir as Cv,resolveClineDir as egt}from"@cerebriline/shared/storage";var u$e="CLINE_HUB_DISCOVERY_PATH",h$e="CLINE_HUB_BUILD_ID",p$e="CLINE_HUB_BUILD_EPOCH_MS",m$e=30000,f$e=15000,DV=100;function g$e(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function y$e(e){return a$e("sha256").update(e).digest("hex").slice(0,12)}function w$e(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 HV(){return FV(32).toString("hex")}function $V(e){return new Promise((t)=>setTimeout(t,e))}function b$e(e){return`${e}.lock`}async function v$e(e){try{let t=JSON.parse(await UV(fP(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 hP(e){await mP(e,{recursive:!0,force:!0}).catch(()=>{return})}function um(){let e=process.env[h$e]?.trim();if(e)return e;return"sdk-v1-
|
|
1534
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[e.sessionId,e.source,e.pid,e.startedAt,null,null,"running",0,e.interactive?1:0,e.provider,e.model,e.cwd,e.workspaceRoot,e.teamName??null,e.enableTools?1:0,e.enableSpawn?1:0,e.enableTeams?1:0,null,null,null,null,0,e.prompt??null,e.metadata?JSON.stringify(e.metadata):null,"","",e.messagesPath,ft()])}}function WDe(e){return{text:e.text,usage:e.usage,inputTokens:e.usage.inputTokens,outputTokens:e.usage.outputTokens,iterations:e.iterations,finishReason:e.finishReason,toolCalls:e.toolCalls.map((t)=>({name:t.name,input:t.input,output:t.output,error:t.error,durationMs:t.durationMs}))}}function qDe(e){return e.mode==="plan"?"plan":e.mode==="yolo"?"yolo":"act"}function CV(e={}){let t=async(r)=>r,n=new im({sessionService:new lm(new dm),capabilities:{toolExecutors:{submit:t}},fetch:e.fetch,telemetry:e.telemetry});return{async startSession(r,o){let i=(r.cwd?.trim()||r.workspaceRoot).trim(),s=await n.startSession({source:Kt.CORE,mode:"automation",sessionMetadata:Jn(o?.sessionMetadata,{mode:"automation",trigger:r.source}),interactive:!1,config:{providerId:HDe(r.provider),modelId:r.model,apiKey:r.apiKey?.trim()||void 0,cwd:i,workspaceRoot:r.workspaceRoot,systemPrompt:r.systemPrompt??"",mode:qDe(r),maxIterations:r.maxIterations,enableTools:r.enableTools!==!1,enableSpawnAgent:r.enableSpawn!==!1,enableAgentTeams:r.enableTeams!==!1,disableMcpSettingsTools:r.disableMcpSettingsTools,agentPluginPaths:r.agentPluginPaths,missionLogIntervalSteps:r.missionStepInterval,missionLogIntervalMs:r.missionTimeIntervalMs},toolPolicies:r.toolPolicies??{"*":{autoApprove:r.autoApproveTools!==!1}},localRuntime:{configExtensions:r.configExtensions}});return{sessionId:s.sessionId,startResult:{sessionId:s.sessionId,manifestPath:s.manifestPath,messagesPath:s.messagesPath}}},async sendSession(r,o){let i=await n.runTurn({sessionId:r,prompt:o.prompt,userImages:o.attachments?.userImages,userFiles:o.attachments?.userFiles?.map((s)=>s.content)});if(!i)throw Error("local hub schedule runtime returned no turn result");return{result:WDe(i)}},async abortSession(r){return await n.abort(r,Error("hub schedule abort")),{applied:!0}},async stopSession(r){return await n.stopSession(r),{applied:!0}}}}import{CLINE_HUB_DEV_PORT as jDe,CLINE_HUB_PORT as zDe,resolveClineBuildEnv as GDe}from"@cerebriline/shared";var KDe="CLINE_HUB_HOST",VDe="CLINE_HUB_PORT",XDe="CLINE_HUB_PATHNAME",YDe="127.0.0.1",JDe=zDe,QDe="/hub";function PV(e){return GDe(e)==="development"?jDe:JDe}function ZDe(e={}){return(e.env??process.env)[KDe]?.trim()||YDe}function cP(e={}){let n=(e.env??process.env)[VDe]?.trim();if(!n)return PV(e);let r=Number.parseInt(n,10);if(!Number.isInteger(r)||r<1||r>65535)return PV(e);return r}function e$e(e={}){return(e.env??process.env)[XDe]?.trim()||QDe}function uP(e={},t={}){return{host:e.host??ZDe(t),port:e.port??cP(t),pathname:e.pathname??e$e(t)}}import{chmodSync as t$e,existsSync as n$e,mkdirSync as r$e}from"node:fs";import{dirname as o$e}from"node:path";import{loadSqliteDb as i$e}from"@cerebriline/shared/db";var MV=3;class OV extends Error{lockFile;constructor(e){super(`Hub instance lock is held by a live Hub: ${e}. Connect to the running Hub or diagnose it; never replace it.`);this.name="HubLockHeldError",this.lockFile=e}}function cm(e){return e instanceof Error&&e.name==="HubLockHeldError"}function LV(e){return`${e}.instance.lock`}class $c{db;lockFile;constructor(e,t){this.lockFile=e,this.db=t}get held(){return this.db!==void 0}release(){let e=this.db;if(!e)return;this.db=void 0;try{e.exec("ROLLBACK;")}catch{}e.close?.()}static acquire(e){let t=!1,n;try{r$e(o$e(e),{recursive:!0}),t=n$e(e),n=i$e(e)}catch{return new $c(e,void 0)}try{n.exec("PRAGMA busy_timeout = 0;"),n.exec("BEGIN EXCLUSIVE;")}catch(r){if(n.close?.(),s$e(r))throw new OV(e);return new $c(e,void 0)}if(!t)try{t$e(e,384)}catch{}return new $c(e,n)}}function s$e(e){let t=e instanceof Error?e.message:String(e),n=e?.code;return n==="SQLITE_BUSY"||n==="SQLITE_LOCKED"||t.includes("SQLITE_BUSY")||t.includes("SQLITE_LOCKED")||t.includes("database is locked")}import{join as S$e}from"node:path";import{createHash as a$e,randomBytes as FV}from"node:crypto";import{mkdir as pP,open as NV,readFile as UV,rename as d$e,rm as mP,writeFile as l$e}from"node:fs/promises";import{dirname as BV,join as fP}from"node:path";import{ensureLoopbackProxyBypass as c$e,isHubProtocolCompatible as Qft}from"@cerebriline/shared";import{resolveClineDataDir as Cv,resolveClineDir as egt}from"@cerebriline/shared/storage";var u$e="CLINE_HUB_DISCOVERY_PATH",h$e="CLINE_HUB_BUILD_ID",p$e="CLINE_HUB_BUILD_EPOCH_MS",m$e=30000,f$e=15000,DV=100;function g$e(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function y$e(e){return a$e("sha256").update(e).digest("hex").slice(0,12)}function w$e(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 HV(){return FV(32).toString("hex")}function $V(e){return new Promise((t)=>setTimeout(t,e))}function b$e(e){return`${e}.lock`}async function v$e(e){try{let t=JSON.parse(await UV(fP(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 hP(e){await mP(e,{recursive:!0,force:!0}).catch(()=>{return})}function um(){let e=process.env[h$e]?.trim();if(e)return e;return"sdk-v1-34a535a13d156348559d06088ca1d67cf0890077ffb8eae5f4f7dc502bff2722".trim()||`source-${String(Ql.version)}`}function WV(){let e=Number(process.env[p$e]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1792773013448)?1792773013448:void 0}function Pv(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${y$e(e)}`,n=process.env[u$e]?.trim()||fP(Cv(),"locks","hub","owners",`${g$e(t)}.json`);return{ownerId:t,discoveryPath:n}}async function Mv(e){try{let t=JSON.parse(await UV(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 gP(e,t,n){await jV(e,async()=>{let r=BV(e);await pP(r,{recursive:!0});let o=`${e}.${process.pid}.${FV(6).toString("hex")}.tmp`,i;try{i=await NV(o,"wx",384),await i.writeFile(`${JSON.stringify(t,null,2)}
|
|
1535
1535
|
`,{encoding:"utf8"}),await i.sync(),await i.close(),i=void 0,n?.beforePublish?.(),await d$e(o,e);let s;try{s=await NV(r,"r"),await s.sync()}catch{}finally{await s?.close().catch(()=>{return})}}catch(s){throw await i?.close().catch(()=>{return}),await mP(o,{force:!0}).catch(()=>{return}),s}})}async function qV(e,t){return await jV(e,async()=>{if((await Mv(e))?.hubId!==t)return!1;return await mP(e,{force:!0}),!0})}async function k$e(e,t,n){let r=b$e(e);await pP(BV(r),{recursive:!0});let o=Date.now()+f$e;while(!0){try{await pP(r,{recursive:!1})}catch(i){if((i instanceof Error&&"code"in i?String(i.code):"")!=="EEXIST")throw i;let a=await v$e(r);if(!a){if(Date.now()>=o){await hP(r);continue}await $V(DV);continue}let d=Date.now()-Date.parse(a.acquiredAt);if(!w$e(a.pid)||d>m$e){await hP(r);continue}if(Date.now()>=o)throw Error(`Timed out waiting for hub ${t} lock ${r}`);await $V(DV);continue}try{return await l$e(fP(r,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
|
|
1536
1536
|
`,"utf8"),await n()}finally{await hP(r)}}}function jV(e,t){return k$e(`${e}.mutation`,"discovery mutation",t)}async function hm(e,t){c$e();try{let n=await fetch(t?.authToken?T$e(e):zV(e),{headers:t?.authToken?{authorization:`Bearer ${t.authToken}`}:void 0,signal:t?.signal});if(!n.ok)return;let r=await n.json();if(typeof r.protocolVersion!=="string"||typeof r.host!=="string"||typeof r.port!=="number"||typeof r.url!=="string")return;return{protocolVersion:r.protocolVersion,minClientProtocolVersion:typeof r.minClientProtocolVersion==="string"?r.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof r.maxClientProtocolVersion==="string"?r.maxClientProtocolVersion:void 0,capabilities:Array.isArray(r.capabilities)?r.capabilities.filter((o)=>typeof o==="string"):void 0,coreVersion:typeof r.coreVersion==="string"?r.coreVersion:void 0,buildId:typeof r.buildId==="string"?r.buildId:void 0,buildEpochMs:typeof r.buildEpochMs==="number"?r.buildEpochMs:void 0,host:r.host,port:r.port,url:r.url,hubId:typeof r.hubId==="string"?r.hubId:void 0,authToken:typeof r.authToken==="string"?r.authToken:void 0,pid:typeof r.pid==="number"?r.pid:void 0,startedAt:typeof r.startedAt==="string"?r.startedAt:void 0,updatedAt:typeof r.updatedAt==="string"?r.updatedAt:void 0}}catch{return}}function Fc(e,t,n="/hub"){return new URL(`ws://${e}:${t}${n}`).toString()}function zV(e){let t=new URL(e);return t.protocol=t.protocol==="wss:"?"https:":"http:",t.pathname="/health",t.search="",t.toString()}function T$e(e){let t=new URL(zV(e));return t.pathname="/status",t.toString()}var x$e="shared:cline",_$e="CLINE_HUB_DISCOVERY_PATH",E$e="hub-production";function Ov(e=x$e){return Pv(`${e}@${um()}`)}function Lv(){return{ownerId:E$e,discoveryPath:process.env[_$e]?.trim()||S$e(Cv(),"locks","hub","production.json")}}function A$e(e){if(typeof e==="string")return e.trim()||void 0;if(!Array.isArray(e))return;return e.map((n)=>{if(n&&typeof n==="object"&&"type"in n&&n.type==="text"&&"text"in n&&typeof n.text==="string")return n.text.trim();return""}).filter(Boolean).join(`
|
|
1537
1537
|
`).trim()||void 0}var GV=120,yP="...";function wP(e){let t=e.trim();if(!t)return"";if(Buffer.byteLength(t,"utf8")<=GV)return t;let n=GV-Buffer.byteLength(yP,"utf8");if(n<=0)return yP;let r="";for(let o of t){if(Buffer.byteLength(r+o,"utf8")>n)break;r+=o}return`${r}${yP}`}async function KV(e){let t=e?.sessionId?.trim()||"unknown",n=typeof e?.metadata?.messagesPath==="string"?e.metadata.messagesPath:void 0,o=[...await Nc(n)].reverse().find((d)=>d.role==="assistant"),i=o?A$e(o.content):void 0,s=e?.workspaceRoot?.trim()||"workspace",a=typeof e?.metadata?.prompt==="string"?e.metadata.prompt.trim():s;return{title:`Task completed (${t})`,body:wP(i&&i.length>0?i:a.length>0?a:s),severity:"info"}}import{resolve as QBe}from"node:path";import{CLINE_DEFAULT_MODEL_ID as ZBe,captureSdkError as ek,createSessionId as E0,HUB_CLIENT_TOOL_APPROVAL_CAPABILITY as eHe}from"@cerebriline/shared";import{isChatWorkspacePath as tHe}from"@cerebriline/shared/storage";function pm(e){return!!e&&typeof e==="object"&&!Array.isArray(e)}function bP(e){let t=e?.trim();return t?t:void 0}function R$e(e,t){let n=e?.trim();if(!n)return t;let r=Date.parse(n);if(!Number.isFinite(r))return t;return new Date(r).toISOString()}function VV(e,t){return new Date(new Date(e).getTime()+Math.max(0,Math.floor(t))*1000).toISOString()}function XV(e,t){return new Date(new Date(e).getTime()-Math.max(0,Math.floor(t))*1000).toISOString()}function I$e(e,t){if(!e)return t;return new Date(e).getTime()>=new Date(t).getTime()?e:t}function C$e(e,t){let n=e.eventId.trim(),r=e.eventType.trim(),o=e.source.trim(),i=bP(e.subject),s=bP(e.dedupeKey)??`${r}:${o}:${i??n}`;return{eventId:n,eventType:r,source:o,subject:i,occurredAt:R$e(e.occurredAt,t),workspaceRoot:bP(e.workspaceRoot),payload:pm(e.payload)?e.payload:void 0,attributes:pm(e.attributes)?e.attributes:void 0,dedupeKey:s}}function vP(e,t){if(!t)return;let n=t.split("."),r=e;for(let o of n){if(!pm(r))return;r=r[o]}return r}function P$e(e,t){if(e.attributes&&Object.hasOwn(e.attributes,t))return e.attributes[t];if(e.payload&&Object.hasOwn(e.payload,t))return e.payload[t];let n={eventId:e.eventId,eventType:e.eventType,source:e.source,subject:e.subject,occurredAt:e.occurredAt,workspaceRoot:e.workspaceRoot,dedupeKey:e.dedupeKey,attributes:e.attributes,payload:e.payload},r=vP(n,t);if(r!==void 0)return r;if(e.attributes){let o=vP(e.attributes,t);if(o!==void 0)return o}if(e.payload)return vP(e.payload,t);return}function Nv(e,t){if(Array.isArray(t))return t.some((n)=>Nv(e,n));if(Array.isArray(e))return e.some((n)=>Nv(n,t));if(pm(t)){if(!pm(e))return!1;return Object.entries(t).every(([n,r])=>Nv(e[n],r))}return Object.is(e,t)}function M$e(e,t){if(!t||Object.keys(t).length===0)return!0;return Object.entries(t).every(([n,r])=>Nv(P$e(e,n),r))}class kP{store;nowFn;logger;constructor(e){this.store=e.store,this.nowFn=e.now??(()=>Date.now()),this.logger=e.logger}ingestEvent(e){let t=new Date(this.nowFn()).toISOString(),n=C$e(e,t);try{let r=this.store.eventTransaction(()=>this.materializeEvent(n,t));return this.logger?.debug(r.duplicate?"cron.event.duplicate":"cron.event.processed",{eventId:r.event.eventId,eventType:r.event.eventType,source:r.event.source,status:r.event.processingStatus,matchedSpecCount:r.event.matchedSpecCount,queuedRunCount:r.event.queuedRunCount}),r}catch(r){throw this.logger?.error?.("cron.event.failed",{eventId:n.eventId,eventType:n.eventType,error:r}),r}}materializeEvent(e,t){let n=this.store.insertEventLog(e,{receivedAtIso:t});if(!n.created)return{event:n.record,duplicate:!0,matchedSpecs:[],queuedRuns:[],suppressions:[{reason:"duplicate_event",dedupeKey:n.record.dedupeKey}]};let r=this.store.listEventSpecsForType(e.eventType),o=[],i=[],s=[];for(let l of r){if(!M$e(e,l.filters)){o.push({specId:l.specId,externalId:l.externalId,reason:"filter_mismatch",dedupeKey:e.dedupeKey});continue}i.push(l);let c=this.materializeForSpec(l,e,n.record.receivedAt);if(c.run)s.push(c.run);else o.push({specId:l.specId,externalId:l.externalId,reason:c.reason,dedupeKey:e.dedupeKey})}let a=i.length===0?"unmatched":s.length>0?"queued":"suppressed";return this.store.updateEventLogProcessing(n.record.eventId,{status:a,matchedSpecCount:i.length,queuedRunCount:s.length,suppressedCount:o.filter((l)=>l.reason!=="filter_mismatch").length}),{event:this.store.getEventLog(n.record.eventId)??n.record,duplicate:!1,matchedSpecs:i,queuedRuns:s,suppressions:o}}materializeForSpec(e,t,n){let r=t.dedupeKey??t.eventId,o=e.debounceSeconds??0;if(o>0){let d=this.store.findQueuedEventRunForDedupe({specId:e.specId,dedupeKey:r});if(d){let l=I$e(d.scheduledFor,VV(n,o)),c=this.store.updateQueuedEventRunForDebounce({runId:d.runId,triggerEventId:t.eventId,scheduledFor:l});if(c)return{run:c,reason:"dedupe_window"}}}let i=e.dedupeWindowSeconds??0;if(i>0&&this.store.hasRecentEventRunForDedupe({specId:e.specId,dedupeKey:r,sinceIso:XV(n,i)}))return{reason:"dedupe_window"};let s=e.cooldownSeconds??0;if(s>0&&this.store.hasRecentEventRunForSpec({specId:e.specId,sinceIso:XV(n,s)}))return{reason:"cooldown"};return{run:this.store.enqueueRun({specId:e.specId,specRevision:e.revision,triggerKind:"event",triggerEventId:t.eventId,scheduledFor:o>0?VV(n,o):n}),reason:"dedupe_window"}}}class mm{store;nowFn;constructor(e){this.store=e.store,this.nowFn=e.now??(()=>Date.now())}materializeAll(){let e={oneOffQueued:0,scheduleQueued:0},t=this.store.listSpecs({triggerKind:"one_off",enabled:!0,parseStatus:"valid"});for(let r of t)if(this.materializeOneOff(r))e.oneOffQueued+=1;let n=this.store.listSpecs({triggerKind:"schedule",enabled:!0,parseStatus:"valid"});for(let r of n)try{if(this.materializeSchedule(r))e.scheduleQueued+=1}catch{}return e}materializeOneOff(e){if(e.triggerKind!=="one_off")return!1;if(!e.enabled||e.removed)return!1;if(this.store.hasConsumedOneOffRevision(e.specId,e.revision))return!1;return this.store.enqueueRun({specId:e.specId,specRevision:e.revision,triggerKind:"one_off",scheduledFor:e.nextRunAt??new Date(this.nowFn()).toISOString()}),!0}materializeSchedule(e){if(e.triggerKind!=="schedule")return!1;if(!e.enabled||e.removed)return!1;if(!e.scheduleExpr)return!1;return this.store.materializeDueScheduleRun({specId:e.specId,nowMs:this.nowFn()}).queued}}import{basename as q$e}from"node:path";import{buildClineSystemPrompt as j$e}from"@cerebriline/shared";import{nowIso as e5}from"@cerebriline/shared/db";import{mkdirSync as O$e,writeFileSync as L$e}from"node:fs";import{isAbsolute as N$e,join as JV}from"node:path";import{resolveCronReportsDir as D$e,resolveCronSpecsDir as $$e}from"@cerebriline/shared/storage";function us(e){if(/[:#\n]/.test(e)||e.includes('"'))return JSON.stringify(e);return e}function kr(e,t){if(t===void 0||t===null)return;return`${e}: ${us(t)}`}function QV(e){let t=0;for(let r of e.matchAll(/`+/g))t=Math.max(t,r[0].length);let n="`".repeat(Math.max(3,t+1));return`${n}
|