@cerebriline/core 4.100.260 → 4.100.261
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
package/dist/hub/index.js
CHANGED
|
@@ -318,7 +318,7 @@ ${JSON.stringify(r,null,2)}`}startClaimLeaseHeartbeat(e){let t=Math.max(1000,Mat
|
|
|
318
318
|
scheduled_for = COALESCE(?, scheduled_for),
|
|
319
319
|
updated_at = ?
|
|
320
320
|
WHERE run_id = ? AND claim_token = ?`).run(e.releaseAttempt?1:0,e.error??null,e.scheduledFor??null,t,e.runId,e.claimToken).changes??0)>0}attachSessionIdToRun(e,t,n){return(this.db.prepare("UPDATE cron_runs SET session_id = ?, updated_at = ? WHERE run_id = ? AND claim_token = ? AND status = 'running'").run(t,jt(),e,n).changes??0)===1}attachReportPathToRun(e,t){this.db.prepare("UPDATE cron_runs SET report_path = ?, updated_at = ? WHERE run_id = ?").run(t,jt(),e)}}function ff(e){return e?new Date(e).getTime():void 0}function p7(e){let t=e.metadata?{...e.metadata}:void 0;if(t)delete t.__hubScheduleCreatedBy,delete t.__hubScheduleCwd,delete t.__hubRuntimeOptions;return t}function Su(e){let t=e.metadata;return{scheduleId:e.externalId,name:e.title,cronPattern:e.triggerKind==="one_off"?xu:e.scheduleExpr??"",timezone:e.triggerKind==="schedule"?e.timezone:void 0,prompt:e.prompt??"",workspaceRoot:e.workspaceRoot??"",cwd:typeof t?.__hubScheduleCwd==="string"?t.__hubScheduleCwd:void 0,modelSelection:e.providerId||e.modelId?{providerId:e.providerId??"",modelId:e.modelId??""}:void 0,enabled:e.enabled&&!e.removed&&e.parseStatus==="valid",mode:e.mode==="plan"?"plan":e.mode==="act"?"act":"yolo",systemPrompt:e.systemPrompt,maxIterations:e.maxIterations,timeoutSeconds:e.timeoutSeconds,maxParallel:e.maxParallel??1,createdAt:new Date(e.createdAt).getTime(),updatedAt:new Date(e.updatedAt).getTime(),nextRunAt:ff(e.nextRunAt),lastRunAt:ff(e.lastRunAt),createdBy:typeof t?.__hubScheduleCreatedBy==="string"?t.__hubScheduleCreatedBy:void 0,tags:e.tags,runtimeOptions:t?.__hubRuntimeOptions&&typeof t.__hubRuntimeOptions==="object"&&!Array.isArray(t.__hubRuntimeOptions)?t.__hubRuntimeOptions:void 0,metadata:p7(e)}}function m7(e){switch(e){case"done":return"success";case"cancelled":return"aborted";case"running":return"running";case"queued":return"pending";default:return"failed"}}function Yk(e,t){return{executionId:e.runId,scheduleId:t,sessionId:e.sessionId,triggeredAt:new Date(e.scheduledFor??e.createdAt).getTime(),startedAt:ff(e.startedAt),endedAt:ff(e.completedAt),status:m7(e.status),errorMessage:e.error}}class gf{store;materializer;runner;started=!1;disposed=!1;constructor(e){this.store=new Tu({dbPath:e.dbPath}),this.materializer=new fu({store:this.store}),this.runner=new yu({store:this.store,materializer:this.materializer,runtimeHandlers:e.runtimeHandlers,eventPublisher:e.eventPublisher,workspaceRoot:"",specs:e.specs,logger:e.logger,telemetry:e.telemetry,pollIntervalMs:e.pollIntervalMs,claimLeaseSeconds:e.claimLeaseSeconds,globalMaxConcurrency:e.globalMaxConcurrency})}async start(){if(this.disposed)throw Error("HubScheduleService has been disposed");if(this.started)return;this.started=!0,await this.runner.start()}async stop(){await this.runner.stop(),this.started=!1}async dispose(){if(this.disposed)return;this.disposed=!0,await this.runner.dispose(),this.store.close()}createSchedule(e){let t=e.cronPattern===xu?e.timezone:e.timezone?.trim()||Intl.DateTimeFormat().resolvedOptions().timeZone;if(this.validateScheduleTiming(e.cronPattern,t,e.metadata,!0),!e.workspaceRoot?.trim())throw Error("workspaceRoot is required for schedules");return Su(this.store.createHubSchedule({...e,timezone:t}))}getSchedule(e){let t=this.store.getHubSchedule(e);return t?Su(t):void 0}listSchedules(e={}){return this.store.listHubSchedules(e).map((t)=>Su(t))}updateSchedule(e,t){let n=this.store.getHubSchedule(e);if(!n)return;let r=t.workspaceRoot!==void 0?t.workspaceRoot.trim():n.workspaceRoot,o=t.enabled??n.enabled,i=Su(n),s=t.cronPattern??i.cronPattern;if(s.trim()===xu&&typeof t.timezone==="string"&&t.timezone.trim())throw Error("timezone is only supported for recurring schedules");if(this.validateScheduleTiming(s,s.trim()===xu?void 0:t.timezone===null?void 0:t.timezone??i.timezone,t.metadata??i.metadata,o),o&&!r)throw Error("workspaceRoot is required for enabled schedules");let a=this.store.updateHubSchedule(e,{...t,scheduleId:e});return a?Su(a):void 0}validateScheduleTiming(e,t,n,r){if(e.trim()!==xu){xO(e),Gk(t);return}if(t?.trim())throw Error("timezone is only supported for recurring schedules");let o=n?.[h7];if(typeof o!=="number"||!Number.isFinite(o)||r&&o<=Date.now())throw Error("runAt must be a future timestamp")}deleteSchedule(e){return this.store.deleteHubSchedule(e)}pauseSchedule(e){return this.updateSchedule(e,{scheduleId:e,enabled:!1})}resumeSchedule(e){return this.updateSchedule(e,{scheduleId:e,enabled:!0})}async triggerScheduleNow(e){let t=this.store.enqueueHubScheduleRun(e,"manual");if(!t)return;await this.runner.tick();let n=this.store.getRun(t.runId)??t;return Yk(n,e)}triggerScheduleNowDetached(e){let t=this.store.enqueueHubScheduleRun(e,"manual");if(!t)return;return this.runner.tick().catch(()=>{return}),Yk(t,e)}listScheduleExecutions(e){let t=e.scheduleId?this.store.getHubSchedule(e.scheduleId):void 0,n={specId:t?.specId,limit:e.limit};return this.store.listRuns(n).map((o)=>{let i=t??this.store.getSpec(o.specId);if(!i||i.source!=="hub-schedule")return;return Yk(o,i.externalId)}).filter((o)=>{if(!o)return!1;return!e.status||o.status===e.status})}getScheduleStats(e){let t=this.listScheduleExecutions({scheduleId:e,limit:1e4});if(t.length===0)return{totalRuns:0,successRate:0,avgDurationSeconds:0};let n=0,r=0,o=0,i;for(let s of t){if(s.status==="success"||s.status==="completed")n+=1;if(!i&&s.status!=="success"&&s.status!=="completed")i=s;if(s.startedAt&&s.endedAt)o+=s.endedAt-s.startedAt,r+=1}return{totalRuns:t.length,successRate:n/t.length,avgDurationSeconds:r>0?o/r/1000:0,lastFailure:i}}getActiveExecutions(){return this.runner.getActiveRuns().flatMap((e)=>{let t=this.store.getSpec(e.specId);if(!t||t.source!=="hub-schedule"||!e.sessionId)return[];return[{executionId:e.runId,scheduleId:t.externalId,sessionId:e.sessionId,startedAt:e.startedAt??new Date().toISOString(),timeoutAt:t.timeoutSeconds&&e.startedAt?new Date(new Date(e.startedAt).getTime()+t.timeoutSeconds*1000).toISOString():void 0}]})}getUpcomingRuns(e=20){let t={triggerKind:"schedule",enabled:!0,limit:e};return this.store.listSpecs(t).flatMap((n)=>n.source==="hub-schedule"&&n.nextRunAt?[{spec:n,nextRunAt:n.nextRunAt}]:[]).sort((n,r)=>String(n.nextRunAt).localeCompare(String(r.nextRunAt))).slice(0,e).map(({spec:n,nextRunAt:r})=>({scheduleId:n.externalId,name:n.title,nextRunAt:r}))}}import{realpathSync as Qk,statSync as f7}from"node:fs";import{isAbsolute as NO,relative as g7,sep as DO}from"node:path";import{ONE_TIME_SCHEDULE_CRON_PATTERN as $O,ONE_TIME_SCHEDULE_RUN_AT_METADATA_KEY as FO}from"@cerebriline/shared";import{z as _t}from"zod";var y7=_t.enum(["create","update","list","get","pause","resume","delete","run_now"]),w7=_t.object({provider_id:_t.string().min(1),model_id:_t.string().min(1).optional()}),Cd=_t.object({operation:y7,schedule_id:_t.string().min(1).optional(),schedule_type:_t.enum(["once","recurring"]).optional(),name:_t.string().min(1).optional(),prompt:_t.string().min(1).optional(),run_at:_t.string().datetime({offset:!0}).optional(),cron_pattern:_t.string().min(1).optional(),timezone:_t.string().min(1).nullable().optional().describe("IANA timezone for recurring schedules. Omit unless the user explicitly requests a timezone; new schedules default to the local timezone. Updates preserve the existing timezone when omitted."),enabled:_t.boolean().optional(),mode:_t.enum(["act","plan","yolo"]).optional(),system_prompt:_t.string().nullable().optional(),max_iterations:_t.number().int().positive().nullable().optional(),timeout_seconds:_t.number().int().positive().nullable().optional(),max_parallel:_t.number().int().positive().max(32).optional(),tags:_t.array(_t.string().min(1)).optional(),model_selection:w7.optional(),limit:_t.number().int().positive().max(200).optional()});function Ad(e,t,n,r){if(!UO.has(t.operation))return;Ii(e.telemetry,{ulid:n.sessionId??n.conversationId??n.agentId,tool:`tasks.scheduled.${t.operation}`,success:r,agentId:n.agentId})}var UO=new Set(["create","update","pause","resume","delete","run_now"]);function Id(e,t){let n=e?.trim();if(!n)throw Error(`${t} is required for this operation`);return n}function Zk(e,t){try{let n=Qk.native(e);if(!f7(n).isDirectory())throw Error("not a directory");return n}catch{throw Error(`${t} does not resolve to an existing safe path`)}}function b7(e,t){try{return Qk.native(e)===Qk.native(t)}catch{return!1}}function BO(e,t,n){let r=g7(e,t);if(r===".."||r.startsWith(`..${DO}`)||NO(r))throw Error(`${n} is outside the workspace scope`)}function HO(e,t,n){return Zk(NO(t)?t:`${e}${DO}${t}`,n)}function v7(e){let t=Zk(e.workspaceRoot,"workspaceRoot"),n=e.cwd?HO(t,e.cwd,"cwd"):t;return BO(t,n,"cwd"),{...e,workspaceRoot:t,cwd:n}}function Rd(e,t){if(!e)throw Error("schedule does not exist");if(!b7(e.workspaceRoot,t.workspaceRoot))throw Error("schedule is outside this session's workspace scope");let n=Zk(e.workspaceRoot,"schedule workspaceRoot");if(e.cwd){let r=HO(n,e.cwd,"schedule cwd");BO(n,r,"schedule cwd")}}function LO(e){if(!e)return;return{providerId:e.provider_id.trim(),modelId:e.model_id?.trim()||void 0}}function Jk(e){if(!e)return;return[...new Set(e.map((t)=>t.trim()).filter(Boolean))]}function WO(e){let t=Date.parse(Id(e,"run_at"));if(!Number.isFinite(t))throw Error("run_at must be an ISO timestamp");if(t<=Date.now())throw Error("run_at must be in the future");return t}function k7(e){if(e.schedule_type==="once"){if(e.cron_pattern)throw Error("cron_pattern cannot be used with a one-time schedule");if(e.timezone)throw Error("timezone is encoded in run_at for a one-time schedule");return{cronPattern:$O,metadata:{[FO]:WO(e.run_at)}}}if(e.schedule_type==="recurring"){if(e.run_at)throw Error("run_at cannot be used with a recurring schedule");return{cronPattern:Id(e.cron_pattern,"cron_pattern"),timezone:e.timezone?.trim()||void 0}}throw Error("schedule_type is required for create")}function T7(e){if(e.run_at&&e.cron_pattern)throw Error("run_at and cron_pattern cannot be updated together");if(e.schedule_type==="once"||e.run_at){if(e.cron_pattern)throw Error("cron_pattern cannot be used with a one-time schedule");if(e.timezone)throw Error("timezone is encoded in run_at for a one-time schedule");return{cronPattern:$O,timezone:null,metadata:{[FO]:WO(e.run_at)}}}if(e.schedule_type==="recurring"||e.cron_pattern)return{cronPattern:Id(e.cron_pattern,"cron_pattern"),timezone:e.timezone===null?null:e.timezone?.trim()||void 0};return{timezone:e.timezone===null?null:e.timezone?.trim()||void 0}}function _u(e){return Id(e.schedule_id,"schedule_id")}async function eT(e,t,n){let r=Cd.safeParse(t);if(!r.success)return{ok:!1,error:{code:"invalid_schedule_input",message:r.error.issues[0]?.message??"Invalid schedule input"}};let o=r.data;try{if(!n.sessionId)throw Error("tasks requires a Hub session");let i=await e.resolveSessionDefaults(n.sessionId);if(!i?.workspaceRoot.trim())throw Error("tasks could not resolve the current workspace");let s=v7(i);if(UO.has(o.operation)&&!s.interactive)throw Error("schedule mutations require an interactive user session");switch(o.operation){case"create":{let a=e.schedules.createSchedule({name:Id(o.name,"name"),...k7(o),prompt:Id(o.prompt,"prompt"),workspaceRoot:s.workspaceRoot,cwd:s.cwd,modelSelection:LO(o.model_selection)??s.modelSelection,enabled:o.enabled,mode:o.mode??"yolo",systemPrompt:o.system_prompt??void 0,maxIterations:o.max_iterations??void 0,timeoutSeconds:o.timeout_seconds??void 0,maxParallel:o.max_parallel??1,createdBy:`agent:${n.agentId}`,tags:Jk(o.tags)});return e.publish?.("schedule.created",{schedule:a},n.sessionId),Ad(e,o,n,!0),{ok:!0,operation:o.operation,schedule:a}}case"update":{let a=_u(o);Rd(e.schedules.getSchedule(a),s);let d=e.schedules.updateSchedule(a,{scheduleId:a,...T7(o),name:o.name?.trim()||void 0,prompt:o.prompt?.trim()||void 0,modelSelection:LO(o.model_selection),enabled:o.enabled,mode:o.mode,systemPrompt:o.system_prompt,maxIterations:o.max_iterations,timeoutSeconds:o.timeout_seconds,maxParallel:o.max_parallel,tags:Jk(o.tags)});if(!d)throw Error("schedule does not exist");return e.publish?.("schedule.updated",{schedule:d},n.sessionId),Ad(e,o,n,!0),{ok:!0,operation:o.operation,schedule:d}}case"list":{let a=e.schedules.listSchedules({enabled:o.enabled,tags:Jk(o.tags),workspaceRoot:s.workspaceRoot,limit:o.limit??50}).filter((d)=>{try{return Rd(d,s),!0}catch{return!1}}).slice(0,o.limit??50);return{ok:!0,operation:o.operation,schedules:a}}case"get":{let a=e.schedules.getSchedule(_u(o));return Rd(a,s),{ok:!0,operation:o.operation,schedule:a}}case"pause":case"resume":{let a=_u(o);Rd(e.schedules.getSchedule(a),s);let d=o.operation==="pause"?e.schedules.pauseSchedule(a):e.schedules.resumeSchedule(a);if(!d)throw Error("schedule does not exist");return e.publish?.("schedule.updated",{schedule:d},n.sessionId),Ad(e,o,n,!0),{ok:!0,operation:o.operation,schedule:d}}case"delete":{let a=_u(o);Rd(e.schedules.getSchedule(a),s);let d=e.schedules.deleteSchedule(a);if(!d)throw Error("schedule does not exist");return e.publish?.("schedule.deleted",{deleted:d,scheduleId:a},n.sessionId),Ad(e,o,n,!0),{ok:!0,operation:o.operation,deleted:d}}case"run_now":{let a=_u(o);Rd(e.schedules.getSchedule(a),s);let d=e.schedules.triggerScheduleNowDetached(a);if(!d)throw Error("schedule does not exist");return e.publish?.("schedule.triggered",{execution:d},n.sessionId),Ad(e,o,n,!0),{ok:!0,operation:o.operation,execution:d}}}}catch(i){return Ad(e,o,n,!1),{ok:!1,operation:o.operation,error:{code:"schedule_operation_failed",message:i instanceof Error?i.message:String(i)}}}}import{LangfuseAttributesSpanProcessor as X7}from"@cerebriline/llms";import{markOtlpTraceRelayProvider as Y7}from"@cerebriline/shared";import{metrics as J7,trace as Q7}from"@opentelemetry/api";import{logs as Z7}from"@opentelemetry/api-logs";import{OTLPLogExporter as eQ}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as tQ}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as nQ}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as rQ}from"@opentelemetry/resources";import{BatchLogRecordProcessor as oQ,ConsoleLogRecordExporter as iQ,LoggerProvider as sQ}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as aQ,MeterProvider as dQ,PeriodicExportingMetricReader as sL}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as lQ,ConsoleSpanExporter as cQ,SimpleSpanProcessor as uQ}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as hQ}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as pQ,ATTR_SERVICE_VERSION as mQ}from"@opentelemetry/semantic-conventions";import{mkdirSync as S7,readFileSync as x7,statSync as _7,writeFileSync as E7}from"node:fs";import{dirname as A7}from"node:path";import{CONFIGURABLE_MODEL_TOOL_NAMES as jO}from"@cerebriline/shared";import{resolveGlobalSettingsPath as qO}from"@cerebriline/shared/storage";import{z as Dt}from"zod";var tT=Dt.preprocess((e)=>Array.isArray(e)?e.filter((t)=>typeof t==="string").map((t)=>t.trim()).filter(Boolean):void 0,Dt.array(Dt.string()).optional()).transform((e)=>{if(!e)return;let t=[...new Set(e)].sort((n,r)=>n.localeCompare(r));return t.length>0?t:void 0}),R7=Dt.enum(["basic","agentic"]).catch("agentic"),I7=Dt.partialRecord(Dt.enum(jO),Dt.object({enabled:Dt.boolean()}).strip()).optional(),C7=Dt.record(Dt.string(),Dt.object({enabled:Dt.boolean()}).strip()).optional().catch(void 0),P7=Dt.enum(["plan","act"]),nT=Dt.object({telemetryOptOut:Dt.boolean().default(!1).catch(!1),autoUpdateEnabled:Dt.boolean().default(!0).catch(!0),compactionStrategy:R7.optional(),compactionEnabled:Dt.boolean().optional().catch(void 0),planActMode:P7.optional().catch(void 0),toolAutoApprove:Dt.boolean().optional().catch(void 0),tuiTheme:Dt.string().optional().catch(void 0),disabledTools:tT.optional(),tools:I7,disabledPlugins:tT.optional(),disabledAgentPlugins:tT.optional(),bundledSkills:C7}).strip().transform((e)=>{let t={autoUpdateEnabled:e.autoUpdateEnabled,telemetryOptOut:e.telemetryOptOut};if(e.compactionStrategy)t.compactionStrategy=e.compactionStrategy;if(e.compactionEnabled!==void 0)t.compactionEnabled=e.compactionEnabled;if(e.planActMode)t.planActMode=e.planActMode;if(e.toolAutoApprove!==void 0)t.toolAutoApprove=e.toolAutoApprove;if(e.tuiTheme?.trim())t.tuiTheme=e.tuiTheme.trim();if(e.disabledTools?.length)t.disabledTools=e.disabledTools;if(e.tools&&Object.keys(e.tools).length>0)t.tools=e.tools;if(e.disabledPlugins?.length)t.disabledPlugins=e.disabledPlugins;if(e.disabledAgentPlugins?.length)t.disabledAgentPlugins=e.disabledAgentPlugins;if(e.bundledSkills&&Object.keys(e.bundledSkills).length>0)t.bundledSkills=e.bundledSkills;return t});function yf(){return nT.parse({})}var wf;function M7(){wf=void 0}function O7(e){if(e.disabledTools)Object.freeze(e.disabledTools);if(e.tools){for(let t of Object.values(e.tools))Object.freeze(t);Object.freeze(e.tools)}if(e.disabledPlugins)Object.freeze(e.disabledPlugins);if(e.disabledAgentPlugins)Object.freeze(e.disabledAgentPlugins);return Object.freeze(e)}function L7(e){let t;try{t=x7(e,"utf8")}catch{return{value:yf(),loadFailed:!0}}try{let n=nT.safeParse(JSON.parse(t));return n.success?{value:n.data,loadFailed:!1}:{value:yf(),loadFailed:!0}}catch{return{value:yf(),loadFailed:!0}}}function zO(){let e=qO(),t=_7(e,{throwIfNoEntry:!1}),n=t?.mtimeMs??0,r=t?.size??0,o=wf;if(o&&o.path===e&&o.mtimeMs===n&&o.size===r)return o;let i=t?L7(e):{value:yf(),loadFailed:!1},s=O7(i.value);return wf={path:e,mtimeMs:n,size:r,value:s,loadFailed:i.loadFailed},wf}function fn(){return zO().value}function Ds(e,t={}){let n=qO(),r=fn();S7(A7(n),{recursive:!0});let o=nT.parse(e);if(!r.telemetryOptOut&&o.telemetryOptOut)UM(t.telemetry);E7(n,`${JSON.stringify(o,null,2)}
|
|
321
|
-
`,"utf8"),M7()}function KO(){return fn().telemetryOptOut}function $s(e){return new Set(e??fn().disabledTools??[])}function GO(e){return new Set(e??fn().disabledPlugins??[])}function Eu(e){return new Set(e??fn().disabledAgentPlugins??[])}function VO(e){return jO.includes(e)}function N7(){let e=zO();return{web_search:{enabled:!e.loadFailed},...e.value.tools}}function rT(e){return N7()[e]?.enabled===!0}function D7(e,t){let n=fn();Ds({...n,tools:{...n.tools,[e]:{enabled:t}}})}function XO(e){if(VO(e)){let o=rT(e);return D7(e,!o),o}let t=fn(),n=new Set(t.disabledTools??[]),r=n.has(e);if(r)n.delete(e);else n.add(e);return Ds({...t,disabledTools:[...n]}),!r}function $7(e,t){let n=[...new Set(e.map((s)=>s.trim()).filter(Boolean))];if(n.length===0)return;let r=fn(),o=$s(r.disabledTools),i={...r.tools};for(let s of n){if(VO(s)){i[s]={enabled:!t};continue}if(t)o.add(s);else o.delete(s)}Ds({...r,disabledTools:[...o],tools:i})}function YO(e,t){return $7([e],t),t}function JO(e,t){let n=e.trim();if(!n)return;let r=fn(),o=GO(r.disabledPlugins);if(t)o.add(n);else o.delete(n);Ds({...r,disabledPlugins:[...o]})}function QO(e,t){let n=e.trim();if(!n)return;let r=fn(),o=Eu(r.disabledAgentPlugins);if(t)o.add(n);else o.delete(n);Ds({...r,disabledAgentPlugins:[...o]})}function ZO(e,t){let n=GO(t);if(n.size===0)return[...e];return e.filter((r)=>!n.has(r))}function Mi(e,t){let n=$s(t);if(n.size===0)return[...e];return e.filter((r)=>!n.has(r.name))}function eL(e,t){if(!e||e.length===0)return e;let n=$s(t);if(n.size===0)return e;return e.map((r)=>{if(!r.setup)return r;return{...r,setup:(o,i)=>r.setup?.({...o,registerTool:(s)=>{if(!n.has(s.name))o.registerTool(s)}},i)}})}import{existsSync as F7,mkdirSync as U7,readFileSync as B7,writeFileSync as H7}from"node:fs";import{resolve as W7}from"node:path";import{resolveSessionDataDir as j7}from"@cerebriline/shared/storage";import{nanoid as q7}from"nanoid";import*as z7 from"node-machine-id";var K7="machine-id",tL,nL=!1;function rL(){if(!nL)tL=oL(),nL=!0;return tL??iL()}function Au(e){let t=e?.trim();if(t)return t;let n=oL();if(n)return n;return iL()}function G7(){let e=z7;return e.machineIdSync??e.default?.machineIdSync}function oL(){try{let e=G7();if(!e)return;return e().trim()||void 0}catch{return}}function iL(){let e=j7(),t=W7(e,K7);try{if(F7(t)){let r=B7(t,"utf8").trim();if(r.length>0)return r}}catch{}let n=`cl-${q7()}`;try{U7(e,{recursive:!0}),H7(t,n,"utf8")}catch{}return n}class oT{name;metadata;meter;logger;enabled;distinctId;commonProperties;counters=new Map;histograms=new Map;gauges=new Map;gaugeValues=new Map;meterProvider;loggerProvider;constructor(e){this.name=e.name??"OpenTelemetryAdapter",this.metadata={...e.metadata},this.meterProvider=e.meterProvider,this.loggerProvider=e.loggerProvider,this.meter=e.meterProvider?.getMeter("cline")??null,this.logger=e.loggerProvider?.getLogger("cline")??null,this.enabled=e.enabled??!0,this.distinctId=e.distinctId,this.commonProperties=e.commonProperties?{...e.commonProperties}:{}}emit(e,t){if(!this.isEnabled())return;this.emitLog(e,t,!1)}emitRequired(e,t){this.emitLog(e,t,!0)}recordCounter(e,t,n,r,o=!1){if(!this.meter||!o&&!this.isEnabled())return;let i=this.counters.get(e);if(!i)i=this.meter.createCounter(e,r?{description:r}:void 0),this.counters.set(e,i);i.add(t,this.flattenProperties(this.buildAttributes(n)))}recordHistogram(e,t,n,r,o=!1){if(!this.meter||!o&&!this.isEnabled())return;let i=this.histograms.get(e);if(!i)i=this.meter.createHistogram(e,r?{description:r}:void 0),this.histograms.set(e,i);i.record(t,this.flattenProperties(this.buildAttributes(n)))}recordGauge(e,t,n,r,o=!1){if(!this.meter||!o&&!this.isEnabled())return;let i=this.buildAttributes(n),s=JSON.stringify(i),a=this.gaugeValues.get(e);if(t===null){if(a){if(a.delete(s),a.size===0)this.gaugeValues.delete(e),this.gauges.delete(e)}return}let d=a;if(!d)d=new Map,this.gaugeValues.set(e,d);if(!this.gauges.has(e)){let l=this.meter.createObservableGauge(e,r?{description:r}:void 0);l.addCallback((c)=>{for(let u of this.snapshotGaugeSeries(e))c.observe(u.value,this.flattenProperties(u.attributes))}),this.gauges.set(e,l)}d.set(s,{value:t,attributes:i})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}setDistinctId(e){this.distinctId=e}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}async flush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.()])}emitLog(e,t,n){if(!this.logger)return;let r=this.flattenProperties(this.buildAttributes(t,n));this.logger.emit({severityText:"INFO",body:e,attributes:r})}buildAttributes(e,t=!1){return{...this.commonProperties,...this.metadata,...e,...this.distinctId?{distinct_id:this.distinctId}:{},...t?{_required:!0}:{}}}snapshotGaugeSeries(e){let t=this.gaugeValues.get(e);if(!t)return[];return Array.from(t.values(),(n)=>({value:n.value,attributes:n.attributes?{...n.attributes}:void 0}))}flattenProperties(e,t="",n=new WeakSet,r=0){if(!e)return{};let o={},i=100,s=10;for(let[a,d]of Object.entries(e)){if(a==="__proto__"||a==="constructor"||a==="prototype")continue;let l=t?`${t}.${a}`:a;if(d===null||d===void 0){o[l]=String(d);continue}if(Array.isArray(d)){let c=d.length>i?d.slice(0,i):d;try{o[l]=JSON.stringify(c)}catch{o[l]="[UnserializableArray]"}if(d.length>i)o[`${l}_truncated`]=!0,o[`${l}_original_length`]=d.length;continue}if(typeof d==="object"){if(d instanceof Date){o[l]=d.toISOString();continue}if(d instanceof Error){o[l]=d.message;continue}if(n.has(d)){o[l]="[Circular]";continue}if(r>=s){o[l]="[MaxDepthExceeded]";continue}n.add(d),Object.assign(o,this.flattenProperties(d,l,n,r+1));continue}if(V7(d)){o[l]=d;continue}try{o[l]=JSON.stringify(d)}catch{o[l]=String(d)}}return o}}function V7(e){return typeof e==="string"||typeof e==="number"||typeof e==="boolean"}class iT{name;logger;enabled;constructor(e={}){this.name=e.name??"TelemetryLoggerSink",this.logger=e.logger,this.enabled=e.enabled??!0}emit(e,t){if(!this.isEnabled())return;this.logger?.log("telemetry.event",{telemetrySink:this.name,event:e,properties:t})}emitRequired(e,t){this.logger?.log("telemetry.required_event",{telemetrySink:this.name,severity:"warn",event:e,properties:t})}recordCounter(e,t,n,r,o){if(!o&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:e,value:t,attributes:n,description:r,required:o===!0})}recordHistogram(e,t,n,r,o){if(!o&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:e,value:t,attributes:n,description:r,required:o===!0})}recordGauge(e,t,n,r,o){if(!o&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:e,value:t,attributes:n,description:r,required:o===!0})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}async flush(){}async dispose(){}}class bf{adapters;metadata;distinctId;deviceId;commonProperties;constructor(e={}){if(this.adapters=[...e.adapters??[]],e.logger)this.adapters.push(new iT({logger:e.logger}));this.metadata={...e.metadata??{}},this.distinctId=e.distinctId,this.deviceId=e.deviceId??rL(),this.commonProperties={...e.commonProperties??{}}}addAdapter(e){this.adapters.push(e)}setDistinctId(e){this.distinctId=e}setMetadata(e){this.metadata={...e}}updateMetadata(e){this.metadata={...this.metadata,...e}}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}isEnabled(){return this.adapters.some((e)=>e.isEnabled())}capture(e){let t=this.buildAttributes(e.properties);for(let n of this.adapters)n.emit(e.event,t)}captureRequired(e,t){let n=this.buildAttributes(t);for(let r of this.adapters)r.emitRequired(e,n)}recordCounter(e,t,n,r,o=!1){let i=this.buildAttributes(n);for(let s of this.adapters)s.recordCounter(e,t,i,r,o)}recordHistogram(e,t,n,r,o=!1){let i=this.buildAttributes(n);for(let s of this.adapters)s.recordHistogram(e,t,i,r,o)}recordGauge(e,t,n,r,o=!1){let i=this.buildAttributes(n);for(let s of this.adapters)s.recordGauge(e,t,i,r,o)}async flush(){await Promise.all(this.adapters.map((e)=>e.flush()))}async dispose(){await Promise.all(this.adapters.map((e)=>e.dispose()))}buildAttributes(e){let t=typeof e?.distinct_id==="string"&&e.distinct_id.trim()?e.distinct_id.trim():this.distinctId,n={...this.commonProperties,...this.metadata,...e,...t?{distinct_id:t}:{},device_id:this.deviceId};return Object.fromEntries(Object.entries(n).filter(([,r])=>r!==void 0))}}class aL{distinctId;metadata;commonProperties;constructor(e={}){this.distinctId=e.distinctId,this.metadata={...e.metadata??{}},this.commonProperties={...e.commonProperties??{}}}setDistinctId(e){this.distinctId=e}setMetadata(e){this.metadata={...e}}updateMetadata(e){this.metadata={...this.metadata,...e}}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}isEnabled(){return!1}capture(e){this.resolveProperties(e.properties)}captureRequired(e,t){this.resolveProperties(t)}recordCounter(){}recordHistogram(){}recordGauge(){}async flush(){}async dispose(){}resolveProperties(e){let t=typeof e?.distinct_id==="string"&&e.distinct_id.trim()?e.distinct_id.trim():this.distinctId,n={...this.commonProperties,...this.metadata,...e,...t?{distinct_id:t}:{}};return Object.fromEntries(Object.entries(n).filter(([,r])=>r!==void 0))}}class dL{meterProvider;loggerProvider;tracerProvider;options;constructor(e={}){this.options=e;let t=rQ({[pQ]:e.serviceName??"cline",...e.serviceVersion?{[mQ]:e.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(t),this.loggerProvider=this.createLoggerProvider(t),this.tracerProvider=this.createTracerProvider(t),this.meterProvider)J7.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)Z7.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(e="cline",t){return Q7.getTracer(e,t??this.options.serviceVersion)}createAdapter(e){return new oT({...e,meterProvider:this.meterProvider,loggerProvider:this.loggerProvider})}createTelemetryService(e){let t=this.createAdapter({name:e.name,enabled:this.options.enabled,metadata:e.metadata});return new bf({...e,adapters:[t],distinctId:Au(e.distinctId)})}async forceFlush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.(),this.tracerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.(),this.tracerProvider?.shutdown?.()])}createMeterProvider(e){let t=sT(this.options.metricsExporter);if(t.length===0)return null;let n=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),r=Math.min(30000,Math.floor(n*0.8)),o=t.map((i)=>bQ(i,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:n,timeout:r})).filter((i)=>i!==null);if(o.length===0)return null;return new dQ({resource:e,readers:o})}createTracerProvider(e){let t=sT(this.options.tracesExporter);if(t.length===0)return null;let n=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,r=this.options.otlpTracesHeaders??this.options.otlpHeaders,o=[],i=!1;for(let a of t){let d=wQ(a,{endpoint:n,headers:r,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(d){if(o.push(d),a!=="console")i=!0}}if(o.length===0)return null;let s=new hQ({resource:e,spanProcessors:i?[new X7,...o]:o});if(i)Y7(s);return s}createLoggerProvider(e){let t=sT(this.options.logsExporter);if(t.length===0)return null;let n=t.map((r)=>{let o=yQ(r,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!o)return null;return new oQ(o,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((r)=>r!==null);if(n.length===0)return null;return new sQ({resource:e,processors:n})}}function fQ(e){let t=new dL(e),n=t.createTelemetryService(e),r=()=>{n.captureRequired("telemetry.provider_created",{provider:"opentelemetry",enabled:e.enabled??!0,logsExporter:Array.isArray(e.logsExporter)?e.logsExporter.join(","):e.logsExporter,metricsExporter:Array.isArray(e.metricsExporter)?e.metricsExporter.join(","):e.metricsExporter,tracesExporter:Array.isArray(e.tracesExporter)?e.tracesExporter.join(","):e.tracesExporter,otlpProtocol:e.otlpProtocol,hasOtlpEndpoint:Boolean(e.otlpEndpoint),serviceName:e.serviceName,serviceVersion:e.serviceVersion})};if(!e.deferProviderCreatedEvent)r();return{provider:t,telemetry:n,emitProviderCreated:r}}function lL(e){if(KO())return{telemetry:new aL(e)};if(e.enabled!==!0)return{telemetry:new bf({...e,distinctId:Au(e.distinctId)})};return fQ(e)}function gQ(e){let{telemetry:t,provider:n,emitProviderCreated:r}=lL(e);return{telemetry:t,provider:n,flush:async()=>{let s=n;if(s&&typeof s.forceFlush==="function")try{await s.forceFlush()}catch{}},dispose:async()=>{await Promise.allSettled([t.dispose(),n?.dispose()])},...e.deferProviderCreatedEvent&&r?{emitProviderCreated:r}:{}}}function sT(e){if(!e)return[];return(Array.isArray(e)?e:e.split(",")).map((n)=>n.trim()).filter((n)=>n==="console"||n==="otlp")}function yQ(e,t){if(e==="console")return new iQ;if(!t.endpoint)return null;let n=aT(t.endpoint,"/v1/logs");return new eQ({url:n,headers:t.headers})}function wQ(e,t){if(e==="console")return new uQ(new cQ);if(!t.endpoint)return null;let n=aT(t.endpoint,"/v1/traces");return new lQ(new nQ({url:n,headers:t.headers}))}function bQ(e,t){if(e==="console")return new sL({exporter:new aQ,exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout});if(!t.endpoint)return null;let n=aT(t.endpoint,"/v1/metrics");return new sL({exporter:new tQ({url:n,headers:t.headers}),exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout})}function aT(e,t){let n=new URL(e),r=n.pathname.endsWith("/")?n.pathname.slice(0,-1):n.pathname;return n.pathname=r.endsWith(t)?r:`${r}${t}`,n.toString()}import{createTool as xQ,zodToJsonSchema as _Q}from"@cerebriline/shared";import{z as Zr}from"zod";import{resolve as cL}from"node:path";import{z as Re}from"zod";var uL=Re.enum(["suggestion","follow-up","todo","handoff","idea","reminder"]),vQ=Re.enum(["pending_approval","approved","in_progress","completed","failed","cancelled","expired"]),hL=Re.union([Re.literal(0),Re.literal(1),Re.literal(2),Re.literal(3),Re.literal(4),Re.literal(5)]),kQ=Re.object({provider_id:Re.string().min(1),model_id:Re.string().min(1).optional()}),vf=Re.object({operation:Re.enum(["create","update","list","get"]),task_id:Re.string().min(1).optional(),expected_revision:Re.number().int().positive().optional(),type:uL.optional(),title:Re.string().min(1).optional(),description:Re.string().nullable().optional(),instructions:Re.string().min(1).optional(),scope:Re.enum(["workspace","global"]).optional(),workspace_root:Re.string().min(1).nullable().optional(),cwd:Re.string().min(1).nullable().optional(),resource_paths:Re.array(Re.string().min(1)).optional(),priority:hL.optional(),assignee:Re.string().min(1).nullable().optional(),model_selection:kQ.nullable().optional(),mode:Re.enum(["act","plan","yolo"]).nullable().optional(),system_prompt:Re.string().nullable().optional(),max_iterations:Re.number().int().positive().nullable().optional(),timeout_seconds:Re.number().int().positive().nullable().optional(),available_at:Re.string().datetime().optional(),expires_at:Re.string().datetime().optional(),automation_eligible:Re.boolean().optional(),statuses:Re.array(vQ).optional(),types:Re.array(uL).optional(),priorities:Re.array(hL).optional(),limit:Re.number().int().positive().max(500).optional()}),TQ=new Set(["create","update"]);function dT(e,t,n,r){if(!TQ.has(t.operation))return;Ii(e.telemetry,{ulid:n.sessionId??n.conversationId??n.agentId,tool:`tasks.todo.${t.operation}`,success:r,agentId:n.agentId})}function Pd(e,t){let n=e?.trim();if(!n)throw Error(`${t} is required for this operation`);return n}function pL(e){if(e===void 0||e===null)return e;return{providerId:e.provider_id,modelId:e.model_id}}function fL(e,t){return cL(e)===cL(t)}function mL(e,t){if(!e)throw Error("task does not exist");if(t.workspaceRoot){if(e.scope!=="workspace"||!e.workspaceRoot||!fL(e.workspaceRoot,t.workspaceRoot))throw Error("task is outside this session's workspace scope");return}if(e.scope!=="global")throw Error("task is outside this session's global scope")}function SQ(e,t){let n=t.workspaceRoot?"workspace":"global";if(e.scope&&e.scope!==n)throw Error(`this session can only manage ${n} tasks`);if(e.workspace_root!==void 0){if(!t.workspaceRoot||e.workspace_root===null||!fL(e.workspace_root,t.workspaceRoot))throw Error(`this session can only manage ${n} tasks`)}return n}async function gL(e,t,n){let r=vf.safeParse(t);if(!r.success)return{ok:!1,error:{code:"invalid_task_input",message:r.error.issues[0]?.message??"Invalid task input"}};let o=r.data,i={kind:"agent",id:n.agentId,agentId:n.agentId,sessionId:n.sessionId};try{if(!n.sessionId)throw Error("tasks requires a Hub session");let s=await e.resolveSessionDefaults(n.sessionId);if(!s)throw Error("tasks could not resolve the current session");let a=SQ(o,s);switch(o.operation){case"create":{let d={type:Pd(o.type,"type"),title:Pd(o.title,"title"),description:o.description??void 0,instructions:Pd(o.instructions,"instructions"),scope:a,workspaceRoot:s.workspaceRoot,cwd:a==="workspace"?(o.cwd??s.cwd)?.trim()||void 0:void 0,resourcePaths:o.resource_paths,priority:o.priority,assignee:o.assignee??void 0,modelSelection:pL(o.model_selection)??s.modelSelection,mode:o.mode??void 0,systemPrompt:o.system_prompt??void 0,maxIterations:o.max_iterations??void 0,timeoutSeconds:o.timeout_seconds??void 0,availableAt:o.available_at,expiresAt:Pd(o.expires_at,"expires_at"),automationEligible:o.automation_eligible,createdBy:i,originSessionId:n.sessionId,originTaskId:s.originTaskId},l={ok:!0,operation:o.operation,task:await e.manager.createTask(d)};return dT(e,o,n,!0),l}case"update":{let d=Pd(o.task_id,"task_id");if(mL(await e.manager.getTask(d),s),!o.expected_revision)throw Error("expected_revision is required for update");let l={ok:!0,operation:o.operation,task:await e.manager.updateTask({taskId:d,expectedRevision:o.expected_revision,type:o.type,title:o.title,description:o.description,instructions:o.instructions,scope:a,workspaceRoot:s.workspaceRoot??null,cwd:o.cwd,resourcePaths:o.resource_paths,priority:o.priority,assignee:o.assignee,modelSelection:pL(o.model_selection),mode:o.mode,systemPrompt:o.system_prompt,maxIterations:o.max_iterations,timeoutSeconds:o.timeout_seconds,availableAt:o.available_at,expiresAt:o.expires_at,automationEligible:o.automation_eligible,updatedBy:i})};return dT(e,o,n,!0),l}case"list":{let d={statuses:o.statuses,types:o.types,scope:a,workspaceRoot:s.workspaceRoot,priorities:o.priorities,automationEligible:o.automation_eligible,limit:o.limit};return{ok:!0,operation:o.operation,tasks:await e.manager.listTasks(d)}}case"get":{let d=await e.manager.getTask(Pd(o.task_id,"task_id"));return mL(d,s),{ok:!0,operation:o.operation,task:d}}}}catch(s){return dT(e,o,n,!1),{ok:!1,operation:o.operation,error:{code:"task_operation_failed",message:s instanceof Error?s.message:String(s)}}}}var Ru="tasks",yL='# Tasks\n\nUse the `tasks` tool to manage durable Todo items and explicitly requested scheduled agent work.\n\n- Use `kind: "todo"` for meaningful follow-ups, handoffs, ideas, reminders, and other work that should remain visible after this session. This includes useful work you identify and suggest proactively. Agent-created Todos require user approval; Todos created directly by the user are approved immediately. Todo `available_at` controls availability in the list; it never schedules execution.\n- Use `kind: "scheduled"` only when the user explicitly asks Cline to execute work once at a future time or on a recurrence. One-time schedules require an exact future ISO 8601 `run_at` with an offset or Z. Recurring schedules require a five-field `cron_pattern` and default to the local timezone. Omit `timezone` unless the user explicitly requests a different timezone; never guess EST, UTC, or another zone. When a timezone is requested, use its IANA name (for example, America/New_York) so daylight-saving changes are handled.\n- "Remind me" is ambiguous: ask whether the user wants a reviewed Todo note or an agent to execute work at that time when intent is unclear.\n- Never create both kinds for the same request unless the user explicitly requests both. Check existing items before creating a likely duplicate.\n- Todo instructions and scheduled prompts must be self-contained. Include the goal, constraints, relevant project context, and expected output.\n- Scheduled sessions run in the user\'s schedules home workspace, not this conversation\'s folder. Include absolute paths in the scheduled `prompt` for any project files or repositories the work must touch.\n- Never approve or start a Todo yourself. Only mutate schedules from an interactive user session, and only update, pause, resume, delete, or run one immediately when the user asks.',EQ="# Tasks\n\nUse the `tasks` tool only when the user explicitly asks Cline to execute work once at a future time or on a recurrence. Always pass `kind: \"scheduled\"`.\n\n- One-time schedules require an exact future ISO 8601 `run_at` with an offset or Z. Recurring schedules require a five-field `cron_pattern` and default to the local timezone. Omit `timezone` unless the user explicitly requests a different timezone; never guess EST, UTC, or another zone. When a timezone is requested, use its IANA name (for example, America/New_York) so daylight-saving changes are handled.\n- Never create a schedule proactively. Check existing schedules before creating a likely duplicate.\n- Make the scheduled `prompt` self-contained because it runs in a new unattended session in the user's schedules home workspace, not this conversation's folder. Include the goal, constraints, expected output, and absolute paths for any project files or repositories the work must touch.\n- Only update, pause, resume, delete, or run a schedule immediately when the user asks for that action.",AQ=vf.extend({kind:Zr.literal("todo")}).strict(),wL=Cd.extend({kind:Zr.literal("scheduled")}).strict(),bL=Zr.discriminatedUnion("kind",[AQ,wL]),RQ=Zr.discriminatedUnion("kind",[wL]),vL=["create","update","list","get","pause","resume","delete","run_now"],IQ=Zr.object({...Cd.shape,...vf.shape,kind:Zr.enum(["todo","scheduled"]),operation:Zr.enum(vL)}).strict(),CQ=Zr.object({...Cd.shape,kind:Zr.enum(["scheduled"]),operation:Zr.enum(vL)}).strict();function lT(e){let t=e.todo;return xQ({name:Ru,description:t?'Create and manage reviewed Todo items or explicitly requested scheduled agent work. Use kind "todo" for durable Agenda items that require user or automation approval. Use kind "scheduled" for one-time or recurring autonomous execution. Todo available_at is not an execution timer; schedules use run_at or cron_pattern.':'Create and manage explicitly requested scheduled agent work with kind "scheduled". One-time schedules use a future ISO 8601 run_at; recurring schedules use a five-field cron_pattern.',inputSchema:_Q(t?IQ:CQ),retryable:!1,maxRetries:0,execute:async(n,r)=>{let o=(t?bL:RQ).safeParse(n);if(!o.success)return{ok:!1,kind:typeof n==="object"&&n!==null&&"kind"in n&&(n.kind==="todo"||n.kind==="scheduled")?n.kind:void 0,error:{code:"invalid_tasks_input",message:o.error.issues[0]?.message??"Invalid tasks input"}};if(o.data.kind==="todo"){if(!t)return{ok:!1,kind:"todo",error:{code:"invalid_tasks_input",message:'kind "todo" is not available in this session'}};return{kind:"todo",...await gL(t,o.data,r)}}return{kind:"scheduled",...await eT(e.scheduled,o.data,r)}}})}function cT(e){return{name:"hub-task-guidance",manifest:{capabilities:["rules"]},setup:(t)=>{t.registerRule({id:"hub:task-guidance",content:e?.todoEnabled===!1?EQ:yL,whenToolAvailable:Ru})}}}import{createSessionId as jZ,ensureLoopbackProxyBypass as GL,isHubProtocolCompatible as qZ,resolveClineBuildEnv as zZ,resolveHubCommandTimeoutMs as KZ}from"@cerebriline/shared";import GZ from"ws";var kf="0.0.92";var Oi={name:"@cerebriline/core",description:"Cline Core SDK for Node Runtime",version:kf,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 Tf="session_not_found";class Md 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 Sf(e){return e instanceof Md||typeof e==="object"&&e!==null&&"code"in e&&e.code==="session_not_found"}import{spawn as cZ}from"node:child_process";import{closeSync as uZ,mkdirSync as hZ,openSync as pZ,readFileSync as mZ,unlinkSync as fZ}from"node:fs";import{basename as gZ,dirname as yZ,join as wZ}from"node:path";import{fileURLToPath as bZ}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as vZ,isBunEmbeddedModulePath as kZ,isHubDaemonProcess as UL,resolveClineBuildEnv as BL,withResolvedClineBuildEnv as TZ}from"@cerebriline/shared";import{createHash as PQ,randomBytes as AL}from"node:crypto";import{existsSync as MQ}from"node:fs";import{mkdir as hT,open as TL,readFile as RL,rename as OQ,rm as xf,writeFile as LQ}from"node:fs/promises";import{dirname as IL,join as pT}from"node:path";import{ensureLoopbackProxyBypass as NQ,isHubProtocolCompatible as DQ}from"@cerebriline/shared";import{resolveClineDataDir as Iu,resolveClineDir as qqe}from"@cerebriline/shared/storage";var $Q="CLINE_HUB_DISCOVERY_PATH",FQ="CLINE_HUB_BUILD_ID",UQ="CLINE_HUB_BUILD_EPOCH_MS",BQ=30000,HQ=15000,SL=100;function WQ(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function jQ(e){return PQ("sha256").update(e).digest("hex").slice(0,12)}function qQ(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 CL(){return AL(32).toString("hex")}function xL(e){return new Promise((t)=>setTimeout(t,e))}function zQ(e){return`${e}.lock`}async function KQ(e){try{let t=JSON.parse(await RL(pT(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 uT(e){await xf(e,{recursive:!0,force:!0}).catch(()=>{return})}function eo(){let e=process.env[FQ]?.trim();if(e)return e;return"sdk-v1-1071053872eb3698f38cf3974442712ce92c210baff6d552a25a556dce7bb8f7".trim()||`source-${String(Oi.version)}`}function mT(){let e=Number(process.env[UQ]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1792766280951)?1792766280951:void 0}function Fs(e,t=eo()){let n=DQ(e);if(!n.compatible)return n;let r=e.buildId?.trim();if(!r)return{compatible:!1,reason:"missing_build"};if(r!==t)return{compatible:!1,reason:"build_mismatch"};return{compatible:!0}}function _L(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0}function EL(e){let t=e?.trim().split(/[-+]/,1)[0];if(!t)return;let n=t.split(".").map((r)=>Number(r));if(n.length===0||n.some((r)=>!Number.isInteger(r)||r<0))return;return n}function GQ(e,t){for(let n=0;n<Math.max(e.length,t.length);n++){let r=e[n]??0,o=t[n]??0;if(r!==o)return r<o?-1:1}return 0}function Cu(e,t){let n=e.buildId?.trim(),r=t.buildId?.trim();if(n&&r&&n===r)return 0;let o=_L(e.buildEpochMs),i=_L(t.buildEpochMs);if(o!==void 0&&i!==void 0&&o!==i)return o<i?-1:1;let s=EL(e.coreVersion),a=EL(t.coreVersion);if(s&&a){let d=GQ(s,a);if(d!==0)return d}if(n&&r&&n!==r)return n<r?-1:1;return 0}function Pu(){return{buildId:eo(),buildEpochMs:mT(),coreVersion:String(Oi.version)}}function Od(e,t){let n=t?.self??Pu(),r=Fs(e,n.buildId??"");if(r.compatible)return!0;if(r.reason!=="build_mismatch"&&r.reason!=="missing_build")return!1;return Cu(n,e)<=0}function Us(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${jQ(e)}`,n=process.env[$Q]?.trim()||pT(Iu(),"locks","hub","owners",`${WQ(t)}.json`);return{ownerId:t,discoveryPath:n}}function Kqe(e=`hub-${Date.now().toString(36)}`){return Us(e)}async function qt(e){try{let t=JSON.parse(await RL(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 _f(e,t,n){await fT(e,async()=>{let r=IL(e);await hT(r,{recursive:!0});let o=`${e}.${process.pid}.${AL(6).toString("hex")}.tmp`,i;try{i=await TL(o,"wx",384),await i.writeFile(`${JSON.stringify(t,null,2)}
|
|
321
|
+
`,"utf8"),M7()}function KO(){return fn().telemetryOptOut}function $s(e){return new Set(e??fn().disabledTools??[])}function GO(e){return new Set(e??fn().disabledPlugins??[])}function Eu(e){return new Set(e??fn().disabledAgentPlugins??[])}function VO(e){return jO.includes(e)}function N7(){let e=zO();return{web_search:{enabled:!e.loadFailed},...e.value.tools}}function rT(e){return N7()[e]?.enabled===!0}function D7(e,t){let n=fn();Ds({...n,tools:{...n.tools,[e]:{enabled:t}}})}function XO(e){if(VO(e)){let o=rT(e);return D7(e,!o),o}let t=fn(),n=new Set(t.disabledTools??[]),r=n.has(e);if(r)n.delete(e);else n.add(e);return Ds({...t,disabledTools:[...n]}),!r}function $7(e,t){let n=[...new Set(e.map((s)=>s.trim()).filter(Boolean))];if(n.length===0)return;let r=fn(),o=$s(r.disabledTools),i={...r.tools};for(let s of n){if(VO(s)){i[s]={enabled:!t};continue}if(t)o.add(s);else o.delete(s)}Ds({...r,disabledTools:[...o],tools:i})}function YO(e,t){return $7([e],t),t}function JO(e,t){let n=e.trim();if(!n)return;let r=fn(),o=GO(r.disabledPlugins);if(t)o.add(n);else o.delete(n);Ds({...r,disabledPlugins:[...o]})}function QO(e,t){let n=e.trim();if(!n)return;let r=fn(),o=Eu(r.disabledAgentPlugins);if(t)o.add(n);else o.delete(n);Ds({...r,disabledAgentPlugins:[...o]})}function ZO(e,t){let n=GO(t);if(n.size===0)return[...e];return e.filter((r)=>!n.has(r))}function Mi(e,t){let n=$s(t);if(n.size===0)return[...e];return e.filter((r)=>!n.has(r.name))}function eL(e,t){if(!e||e.length===0)return e;let n=$s(t);if(n.size===0)return e;return e.map((r)=>{if(!r.setup)return r;return{...r,setup:(o,i)=>r.setup?.({...o,registerTool:(s)=>{if(!n.has(s.name))o.registerTool(s)}},i)}})}import{existsSync as F7,mkdirSync as U7,readFileSync as B7,writeFileSync as H7}from"node:fs";import{resolve as W7}from"node:path";import{resolveSessionDataDir as j7}from"@cerebriline/shared/storage";import{nanoid as q7}from"nanoid";import*as z7 from"node-machine-id";var K7="machine-id",tL,nL=!1;function rL(){if(!nL)tL=oL(),nL=!0;return tL??iL()}function Au(e){let t=e?.trim();if(t)return t;let n=oL();if(n)return n;return iL()}function G7(){let e=z7;return e.machineIdSync??e.default?.machineIdSync}function oL(){try{let e=G7();if(!e)return;return e().trim()||void 0}catch{return}}function iL(){let e=j7(),t=W7(e,K7);try{if(F7(t)){let r=B7(t,"utf8").trim();if(r.length>0)return r}}catch{}let n=`cl-${q7()}`;try{U7(e,{recursive:!0}),H7(t,n,"utf8")}catch{}return n}class oT{name;metadata;meter;logger;enabled;distinctId;commonProperties;counters=new Map;histograms=new Map;gauges=new Map;gaugeValues=new Map;meterProvider;loggerProvider;constructor(e){this.name=e.name??"OpenTelemetryAdapter",this.metadata={...e.metadata},this.meterProvider=e.meterProvider,this.loggerProvider=e.loggerProvider,this.meter=e.meterProvider?.getMeter("cline")??null,this.logger=e.loggerProvider?.getLogger("cline")??null,this.enabled=e.enabled??!0,this.distinctId=e.distinctId,this.commonProperties=e.commonProperties?{...e.commonProperties}:{}}emit(e,t){if(!this.isEnabled())return;this.emitLog(e,t,!1)}emitRequired(e,t){this.emitLog(e,t,!0)}recordCounter(e,t,n,r,o=!1){if(!this.meter||!o&&!this.isEnabled())return;let i=this.counters.get(e);if(!i)i=this.meter.createCounter(e,r?{description:r}:void 0),this.counters.set(e,i);i.add(t,this.flattenProperties(this.buildAttributes(n)))}recordHistogram(e,t,n,r,o=!1){if(!this.meter||!o&&!this.isEnabled())return;let i=this.histograms.get(e);if(!i)i=this.meter.createHistogram(e,r?{description:r}:void 0),this.histograms.set(e,i);i.record(t,this.flattenProperties(this.buildAttributes(n)))}recordGauge(e,t,n,r,o=!1){if(!this.meter||!o&&!this.isEnabled())return;let i=this.buildAttributes(n),s=JSON.stringify(i),a=this.gaugeValues.get(e);if(t===null){if(a){if(a.delete(s),a.size===0)this.gaugeValues.delete(e),this.gauges.delete(e)}return}let d=a;if(!d)d=new Map,this.gaugeValues.set(e,d);if(!this.gauges.has(e)){let l=this.meter.createObservableGauge(e,r?{description:r}:void 0);l.addCallback((c)=>{for(let u of this.snapshotGaugeSeries(e))c.observe(u.value,this.flattenProperties(u.attributes))}),this.gauges.set(e,l)}d.set(s,{value:t,attributes:i})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}setDistinctId(e){this.distinctId=e}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}async flush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.()])}emitLog(e,t,n){if(!this.logger)return;let r=this.flattenProperties(this.buildAttributes(t,n));this.logger.emit({severityText:"INFO",body:e,attributes:r})}buildAttributes(e,t=!1){return{...this.commonProperties,...this.metadata,...e,...this.distinctId?{distinct_id:this.distinctId}:{},...t?{_required:!0}:{}}}snapshotGaugeSeries(e){let t=this.gaugeValues.get(e);if(!t)return[];return Array.from(t.values(),(n)=>({value:n.value,attributes:n.attributes?{...n.attributes}:void 0}))}flattenProperties(e,t="",n=new WeakSet,r=0){if(!e)return{};let o={},i=100,s=10;for(let[a,d]of Object.entries(e)){if(a==="__proto__"||a==="constructor"||a==="prototype")continue;let l=t?`${t}.${a}`:a;if(d===null||d===void 0){o[l]=String(d);continue}if(Array.isArray(d)){let c=d.length>i?d.slice(0,i):d;try{o[l]=JSON.stringify(c)}catch{o[l]="[UnserializableArray]"}if(d.length>i)o[`${l}_truncated`]=!0,o[`${l}_original_length`]=d.length;continue}if(typeof d==="object"){if(d instanceof Date){o[l]=d.toISOString();continue}if(d instanceof Error){o[l]=d.message;continue}if(n.has(d)){o[l]="[Circular]";continue}if(r>=s){o[l]="[MaxDepthExceeded]";continue}n.add(d),Object.assign(o,this.flattenProperties(d,l,n,r+1));continue}if(V7(d)){o[l]=d;continue}try{o[l]=JSON.stringify(d)}catch{o[l]=String(d)}}return o}}function V7(e){return typeof e==="string"||typeof e==="number"||typeof e==="boolean"}class iT{name;logger;enabled;constructor(e={}){this.name=e.name??"TelemetryLoggerSink",this.logger=e.logger,this.enabled=e.enabled??!0}emit(e,t){if(!this.isEnabled())return;this.logger?.log("telemetry.event",{telemetrySink:this.name,event:e,properties:t})}emitRequired(e,t){this.logger?.log("telemetry.required_event",{telemetrySink:this.name,severity:"warn",event:e,properties:t})}recordCounter(e,t,n,r,o){if(!o&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:e,value:t,attributes:n,description:r,required:o===!0})}recordHistogram(e,t,n,r,o){if(!o&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:e,value:t,attributes:n,description:r,required:o===!0})}recordGauge(e,t,n,r,o){if(!o&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:e,value:t,attributes:n,description:r,required:o===!0})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}async flush(){}async dispose(){}}class bf{adapters;metadata;distinctId;deviceId;commonProperties;constructor(e={}){if(this.adapters=[...e.adapters??[]],e.logger)this.adapters.push(new iT({logger:e.logger}));this.metadata={...e.metadata??{}},this.distinctId=e.distinctId,this.deviceId=e.deviceId??rL(),this.commonProperties={...e.commonProperties??{}}}addAdapter(e){this.adapters.push(e)}setDistinctId(e){this.distinctId=e}setMetadata(e){this.metadata={...e}}updateMetadata(e){this.metadata={...this.metadata,...e}}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}isEnabled(){return this.adapters.some((e)=>e.isEnabled())}capture(e){let t=this.buildAttributes(e.properties);for(let n of this.adapters)n.emit(e.event,t)}captureRequired(e,t){let n=this.buildAttributes(t);for(let r of this.adapters)r.emitRequired(e,n)}recordCounter(e,t,n,r,o=!1){let i=this.buildAttributes(n);for(let s of this.adapters)s.recordCounter(e,t,i,r,o)}recordHistogram(e,t,n,r,o=!1){let i=this.buildAttributes(n);for(let s of this.adapters)s.recordHistogram(e,t,i,r,o)}recordGauge(e,t,n,r,o=!1){let i=this.buildAttributes(n);for(let s of this.adapters)s.recordGauge(e,t,i,r,o)}async flush(){await Promise.all(this.adapters.map((e)=>e.flush()))}async dispose(){await Promise.all(this.adapters.map((e)=>e.dispose()))}buildAttributes(e){let t=typeof e?.distinct_id==="string"&&e.distinct_id.trim()?e.distinct_id.trim():this.distinctId,n={...this.commonProperties,...this.metadata,...e,...t?{distinct_id:t}:{},device_id:this.deviceId};return Object.fromEntries(Object.entries(n).filter(([,r])=>r!==void 0))}}class aL{distinctId;metadata;commonProperties;constructor(e={}){this.distinctId=e.distinctId,this.metadata={...e.metadata??{}},this.commonProperties={...e.commonProperties??{}}}setDistinctId(e){this.distinctId=e}setMetadata(e){this.metadata={...e}}updateMetadata(e){this.metadata={...this.metadata,...e}}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}isEnabled(){return!1}capture(e){this.resolveProperties(e.properties)}captureRequired(e,t){this.resolveProperties(t)}recordCounter(){}recordHistogram(){}recordGauge(){}async flush(){}async dispose(){}resolveProperties(e){let t=typeof e?.distinct_id==="string"&&e.distinct_id.trim()?e.distinct_id.trim():this.distinctId,n={...this.commonProperties,...this.metadata,...e,...t?{distinct_id:t}:{}};return Object.fromEntries(Object.entries(n).filter(([,r])=>r!==void 0))}}class dL{meterProvider;loggerProvider;tracerProvider;options;constructor(e={}){this.options=e;let t=rQ({[pQ]:e.serviceName??"cline",...e.serviceVersion?{[mQ]:e.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(t),this.loggerProvider=this.createLoggerProvider(t),this.tracerProvider=this.createTracerProvider(t),this.meterProvider)J7.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)Z7.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(e="cline",t){return Q7.getTracer(e,t??this.options.serviceVersion)}createAdapter(e){return new oT({...e,meterProvider:this.meterProvider,loggerProvider:this.loggerProvider})}createTelemetryService(e){let t=this.createAdapter({name:e.name,enabled:this.options.enabled,metadata:e.metadata});return new bf({...e,adapters:[t],distinctId:Au(e.distinctId)})}async forceFlush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.(),this.tracerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.(),this.tracerProvider?.shutdown?.()])}createMeterProvider(e){let t=sT(this.options.metricsExporter);if(t.length===0)return null;let n=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),r=Math.min(30000,Math.floor(n*0.8)),o=t.map((i)=>bQ(i,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:n,timeout:r})).filter((i)=>i!==null);if(o.length===0)return null;return new dQ({resource:e,readers:o})}createTracerProvider(e){let t=sT(this.options.tracesExporter);if(t.length===0)return null;let n=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,r=this.options.otlpTracesHeaders??this.options.otlpHeaders,o=[],i=!1;for(let a of t){let d=wQ(a,{endpoint:n,headers:r,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(d){if(o.push(d),a!=="console")i=!0}}if(o.length===0)return null;let s=new hQ({resource:e,spanProcessors:i?[new X7,...o]:o});if(i)Y7(s);return s}createLoggerProvider(e){let t=sT(this.options.logsExporter);if(t.length===0)return null;let n=t.map((r)=>{let o=yQ(r,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!o)return null;return new oQ(o,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((r)=>r!==null);if(n.length===0)return null;return new sQ({resource:e,processors:n})}}function fQ(e){let t=new dL(e),n=t.createTelemetryService(e),r=()=>{n.captureRequired("telemetry.provider_created",{provider:"opentelemetry",enabled:e.enabled??!0,logsExporter:Array.isArray(e.logsExporter)?e.logsExporter.join(","):e.logsExporter,metricsExporter:Array.isArray(e.metricsExporter)?e.metricsExporter.join(","):e.metricsExporter,tracesExporter:Array.isArray(e.tracesExporter)?e.tracesExporter.join(","):e.tracesExporter,otlpProtocol:e.otlpProtocol,hasOtlpEndpoint:Boolean(e.otlpEndpoint),serviceName:e.serviceName,serviceVersion:e.serviceVersion})};if(!e.deferProviderCreatedEvent)r();return{provider:t,telemetry:n,emitProviderCreated:r}}function lL(e){if(KO())return{telemetry:new aL(e)};if(e.enabled!==!0)return{telemetry:new bf({...e,distinctId:Au(e.distinctId)})};return fQ(e)}function gQ(e){let{telemetry:t,provider:n,emitProviderCreated:r}=lL(e);return{telemetry:t,provider:n,flush:async()=>{let s=n;if(s&&typeof s.forceFlush==="function")try{await s.forceFlush()}catch{}},dispose:async()=>{await Promise.allSettled([t.dispose(),n?.dispose()])},...e.deferProviderCreatedEvent&&r?{emitProviderCreated:r}:{}}}function sT(e){if(!e)return[];return(Array.isArray(e)?e:e.split(",")).map((n)=>n.trim()).filter((n)=>n==="console"||n==="otlp")}function yQ(e,t){if(e==="console")return new iQ;if(!t.endpoint)return null;let n=aT(t.endpoint,"/v1/logs");return new eQ({url:n,headers:t.headers})}function wQ(e,t){if(e==="console")return new uQ(new cQ);if(!t.endpoint)return null;let n=aT(t.endpoint,"/v1/traces");return new lQ(new nQ({url:n,headers:t.headers}))}function bQ(e,t){if(e==="console")return new sL({exporter:new aQ,exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout});if(!t.endpoint)return null;let n=aT(t.endpoint,"/v1/metrics");return new sL({exporter:new tQ({url:n,headers:t.headers}),exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout})}function aT(e,t){let n=new URL(e),r=n.pathname.endsWith("/")?n.pathname.slice(0,-1):n.pathname;return n.pathname=r.endsWith(t)?r:`${r}${t}`,n.toString()}import{createTool as xQ,zodToJsonSchema as _Q}from"@cerebriline/shared";import{z as Zr}from"zod";import{resolve as cL}from"node:path";import{z as Re}from"zod";var uL=Re.enum(["suggestion","follow-up","todo","handoff","idea","reminder"]),vQ=Re.enum(["pending_approval","approved","in_progress","completed","failed","cancelled","expired"]),hL=Re.union([Re.literal(0),Re.literal(1),Re.literal(2),Re.literal(3),Re.literal(4),Re.literal(5)]),kQ=Re.object({provider_id:Re.string().min(1),model_id:Re.string().min(1).optional()}),vf=Re.object({operation:Re.enum(["create","update","list","get"]),task_id:Re.string().min(1).optional(),expected_revision:Re.number().int().positive().optional(),type:uL.optional(),title:Re.string().min(1).optional(),description:Re.string().nullable().optional(),instructions:Re.string().min(1).optional(),scope:Re.enum(["workspace","global"]).optional(),workspace_root:Re.string().min(1).nullable().optional(),cwd:Re.string().min(1).nullable().optional(),resource_paths:Re.array(Re.string().min(1)).optional(),priority:hL.optional(),assignee:Re.string().min(1).nullable().optional(),model_selection:kQ.nullable().optional(),mode:Re.enum(["act","plan","yolo"]).nullable().optional(),system_prompt:Re.string().nullable().optional(),max_iterations:Re.number().int().positive().nullable().optional(),timeout_seconds:Re.number().int().positive().nullable().optional(),available_at:Re.string().datetime().optional(),expires_at:Re.string().datetime().optional(),automation_eligible:Re.boolean().optional(),statuses:Re.array(vQ).optional(),types:Re.array(uL).optional(),priorities:Re.array(hL).optional(),limit:Re.number().int().positive().max(500).optional()}),TQ=new Set(["create","update"]);function dT(e,t,n,r){if(!TQ.has(t.operation))return;Ii(e.telemetry,{ulid:n.sessionId??n.conversationId??n.agentId,tool:`tasks.todo.${t.operation}`,success:r,agentId:n.agentId})}function Pd(e,t){let n=e?.trim();if(!n)throw Error(`${t} is required for this operation`);return n}function pL(e){if(e===void 0||e===null)return e;return{providerId:e.provider_id,modelId:e.model_id}}function fL(e,t){return cL(e)===cL(t)}function mL(e,t){if(!e)throw Error("task does not exist");if(t.workspaceRoot){if(e.scope!=="workspace"||!e.workspaceRoot||!fL(e.workspaceRoot,t.workspaceRoot))throw Error("task is outside this session's workspace scope");return}if(e.scope!=="global")throw Error("task is outside this session's global scope")}function SQ(e,t){let n=t.workspaceRoot?"workspace":"global";if(e.scope&&e.scope!==n)throw Error(`this session can only manage ${n} tasks`);if(e.workspace_root!==void 0){if(!t.workspaceRoot||e.workspace_root===null||!fL(e.workspace_root,t.workspaceRoot))throw Error(`this session can only manage ${n} tasks`)}return n}async function gL(e,t,n){let r=vf.safeParse(t);if(!r.success)return{ok:!1,error:{code:"invalid_task_input",message:r.error.issues[0]?.message??"Invalid task input"}};let o=r.data,i={kind:"agent",id:n.agentId,agentId:n.agentId,sessionId:n.sessionId};try{if(!n.sessionId)throw Error("tasks requires a Hub session");let s=await e.resolveSessionDefaults(n.sessionId);if(!s)throw Error("tasks could not resolve the current session");let a=SQ(o,s);switch(o.operation){case"create":{let d={type:Pd(o.type,"type"),title:Pd(o.title,"title"),description:o.description??void 0,instructions:Pd(o.instructions,"instructions"),scope:a,workspaceRoot:s.workspaceRoot,cwd:a==="workspace"?(o.cwd??s.cwd)?.trim()||void 0:void 0,resourcePaths:o.resource_paths,priority:o.priority,assignee:o.assignee??void 0,modelSelection:pL(o.model_selection)??s.modelSelection,mode:o.mode??void 0,systemPrompt:o.system_prompt??void 0,maxIterations:o.max_iterations??void 0,timeoutSeconds:o.timeout_seconds??void 0,availableAt:o.available_at,expiresAt:Pd(o.expires_at,"expires_at"),automationEligible:o.automation_eligible,createdBy:i,originSessionId:n.sessionId,originTaskId:s.originTaskId},l={ok:!0,operation:o.operation,task:await e.manager.createTask(d)};return dT(e,o,n,!0),l}case"update":{let d=Pd(o.task_id,"task_id");if(mL(await e.manager.getTask(d),s),!o.expected_revision)throw Error("expected_revision is required for update");let l={ok:!0,operation:o.operation,task:await e.manager.updateTask({taskId:d,expectedRevision:o.expected_revision,type:o.type,title:o.title,description:o.description,instructions:o.instructions,scope:a,workspaceRoot:s.workspaceRoot??null,cwd:o.cwd,resourcePaths:o.resource_paths,priority:o.priority,assignee:o.assignee,modelSelection:pL(o.model_selection),mode:o.mode,systemPrompt:o.system_prompt,maxIterations:o.max_iterations,timeoutSeconds:o.timeout_seconds,availableAt:o.available_at,expiresAt:o.expires_at,automationEligible:o.automation_eligible,updatedBy:i})};return dT(e,o,n,!0),l}case"list":{let d={statuses:o.statuses,types:o.types,scope:a,workspaceRoot:s.workspaceRoot,priorities:o.priorities,automationEligible:o.automation_eligible,limit:o.limit};return{ok:!0,operation:o.operation,tasks:await e.manager.listTasks(d)}}case"get":{let d=await e.manager.getTask(Pd(o.task_id,"task_id"));return mL(d,s),{ok:!0,operation:o.operation,task:d}}}}catch(s){return dT(e,o,n,!1),{ok:!1,operation:o.operation,error:{code:"task_operation_failed",message:s instanceof Error?s.message:String(s)}}}}var Ru="tasks",yL='# Tasks\n\nUse the `tasks` tool to manage durable Todo items and explicitly requested scheduled agent work.\n\n- Use `kind: "todo"` for meaningful follow-ups, handoffs, ideas, reminders, and other work that should remain visible after this session. This includes useful work you identify and suggest proactively. Agent-created Todos require user approval; Todos created directly by the user are approved immediately. Todo `available_at` controls availability in the list; it never schedules execution.\n- Use `kind: "scheduled"` only when the user explicitly asks Cline to execute work once at a future time or on a recurrence. One-time schedules require an exact future ISO 8601 `run_at` with an offset or Z. Recurring schedules require a five-field `cron_pattern` and default to the local timezone. Omit `timezone` unless the user explicitly requests a different timezone; never guess EST, UTC, or another zone. When a timezone is requested, use its IANA name (for example, America/New_York) so daylight-saving changes are handled.\n- "Remind me" is ambiguous: ask whether the user wants a reviewed Todo note or an agent to execute work at that time when intent is unclear.\n- Never create both kinds for the same request unless the user explicitly requests both. Check existing items before creating a likely duplicate.\n- Todo instructions and scheduled prompts must be self-contained. Include the goal, constraints, relevant project context, and expected output.\n- Scheduled sessions run in the user\'s schedules home workspace, not this conversation\'s folder. Include absolute paths in the scheduled `prompt` for any project files or repositories the work must touch.\n- Never approve or start a Todo yourself. Only mutate schedules from an interactive user session, and only update, pause, resume, delete, or run one immediately when the user asks.',EQ="# Tasks\n\nUse the `tasks` tool only when the user explicitly asks Cline to execute work once at a future time or on a recurrence. Always pass `kind: \"scheduled\"`.\n\n- One-time schedules require an exact future ISO 8601 `run_at` with an offset or Z. Recurring schedules require a five-field `cron_pattern` and default to the local timezone. Omit `timezone` unless the user explicitly requests a different timezone; never guess EST, UTC, or another zone. When a timezone is requested, use its IANA name (for example, America/New_York) so daylight-saving changes are handled.\n- Never create a schedule proactively. Check existing schedules before creating a likely duplicate.\n- Make the scheduled `prompt` self-contained because it runs in a new unattended session in the user's schedules home workspace, not this conversation's folder. Include the goal, constraints, expected output, and absolute paths for any project files or repositories the work must touch.\n- Only update, pause, resume, delete, or run a schedule immediately when the user asks for that action.",AQ=vf.extend({kind:Zr.literal("todo")}).strict(),wL=Cd.extend({kind:Zr.literal("scheduled")}).strict(),bL=Zr.discriminatedUnion("kind",[AQ,wL]),RQ=Zr.discriminatedUnion("kind",[wL]),vL=["create","update","list","get","pause","resume","delete","run_now"],IQ=Zr.object({...Cd.shape,...vf.shape,kind:Zr.enum(["todo","scheduled"]),operation:Zr.enum(vL)}).strict(),CQ=Zr.object({...Cd.shape,kind:Zr.enum(["scheduled"]),operation:Zr.enum(vL)}).strict();function lT(e){let t=e.todo;return xQ({name:Ru,description:t?'Create and manage reviewed Todo items or explicitly requested scheduled agent work. Use kind "todo" for durable Agenda items that require user or automation approval. Use kind "scheduled" for one-time or recurring autonomous execution. Todo available_at is not an execution timer; schedules use run_at or cron_pattern.':'Create and manage explicitly requested scheduled agent work with kind "scheduled". One-time schedules use a future ISO 8601 run_at; recurring schedules use a five-field cron_pattern.',inputSchema:_Q(t?IQ:CQ),retryable:!1,maxRetries:0,execute:async(n,r)=>{let o=(t?bL:RQ).safeParse(n);if(!o.success)return{ok:!1,kind:typeof n==="object"&&n!==null&&"kind"in n&&(n.kind==="todo"||n.kind==="scheduled")?n.kind:void 0,error:{code:"invalid_tasks_input",message:o.error.issues[0]?.message??"Invalid tasks input"}};if(o.data.kind==="todo"){if(!t)return{ok:!1,kind:"todo",error:{code:"invalid_tasks_input",message:'kind "todo" is not available in this session'}};return{kind:"todo",...await gL(t,o.data,r)}}return{kind:"scheduled",...await eT(e.scheduled,o.data,r)}}})}function cT(e){return{name:"hub-task-guidance",manifest:{capabilities:["rules"]},setup:(t)=>{t.registerRule({id:"hub:task-guidance",content:e?.todoEnabled===!1?EQ:yL,whenToolAvailable:Ru})}}}import{createSessionId as jZ,ensureLoopbackProxyBypass as GL,isHubProtocolCompatible as qZ,resolveClineBuildEnv as zZ,resolveHubCommandTimeoutMs as KZ}from"@cerebriline/shared";import GZ from"ws";var kf="0.0.92";var Oi={name:"@cerebriline/core",description:"Cline Core SDK for Node Runtime",version:kf,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 Tf="session_not_found";class Md 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 Sf(e){return e instanceof Md||typeof e==="object"&&e!==null&&"code"in e&&e.code==="session_not_found"}import{spawn as cZ}from"node:child_process";import{closeSync as uZ,mkdirSync as hZ,openSync as pZ,readFileSync as mZ,unlinkSync as fZ}from"node:fs";import{basename as gZ,dirname as yZ,join as wZ}from"node:path";import{fileURLToPath as bZ}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as vZ,isBunEmbeddedModulePath as kZ,isHubDaemonProcess as UL,resolveClineBuildEnv as BL,withResolvedClineBuildEnv as TZ}from"@cerebriline/shared";import{createHash as PQ,randomBytes as AL}from"node:crypto";import{existsSync as MQ}from"node:fs";import{mkdir as hT,open as TL,readFile as RL,rename as OQ,rm as xf,writeFile as LQ}from"node:fs/promises";import{dirname as IL,join as pT}from"node:path";import{ensureLoopbackProxyBypass as NQ,isHubProtocolCompatible as DQ}from"@cerebriline/shared";import{resolveClineDataDir as Iu,resolveClineDir as qqe}from"@cerebriline/shared/storage";var $Q="CLINE_HUB_DISCOVERY_PATH",FQ="CLINE_HUB_BUILD_ID",UQ="CLINE_HUB_BUILD_EPOCH_MS",BQ=30000,HQ=15000,SL=100;function WQ(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function jQ(e){return PQ("sha256").update(e).digest("hex").slice(0,12)}function qQ(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 CL(){return AL(32).toString("hex")}function xL(e){return new Promise((t)=>setTimeout(t,e))}function zQ(e){return`${e}.lock`}async function KQ(e){try{let t=JSON.parse(await RL(pT(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 uT(e){await xf(e,{recursive:!0,force:!0}).catch(()=>{return})}function eo(){let e=process.env[FQ]?.trim();if(e)return e;return"sdk-v1-4f79a6fdec43d7f0f51ddff8fe8e0bababd3d8fec0e58c3d0763205c6aec2b53".trim()||`source-${String(Oi.version)}`}function mT(){let e=Number(process.env[UQ]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1792771616117)?1792771616117:void 0}function Fs(e,t=eo()){let n=DQ(e);if(!n.compatible)return n;let r=e.buildId?.trim();if(!r)return{compatible:!1,reason:"missing_build"};if(r!==t)return{compatible:!1,reason:"build_mismatch"};return{compatible:!0}}function _L(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0}function EL(e){let t=e?.trim().split(/[-+]/,1)[0];if(!t)return;let n=t.split(".").map((r)=>Number(r));if(n.length===0||n.some((r)=>!Number.isInteger(r)||r<0))return;return n}function GQ(e,t){for(let n=0;n<Math.max(e.length,t.length);n++){let r=e[n]??0,o=t[n]??0;if(r!==o)return r<o?-1:1}return 0}function Cu(e,t){let n=e.buildId?.trim(),r=t.buildId?.trim();if(n&&r&&n===r)return 0;let o=_L(e.buildEpochMs),i=_L(t.buildEpochMs);if(o!==void 0&&i!==void 0&&o!==i)return o<i?-1:1;let s=EL(e.coreVersion),a=EL(t.coreVersion);if(s&&a){let d=GQ(s,a);if(d!==0)return d}if(n&&r&&n!==r)return n<r?-1:1;return 0}function Pu(){return{buildId:eo(),buildEpochMs:mT(),coreVersion:String(Oi.version)}}function Od(e,t){let n=t?.self??Pu(),r=Fs(e,n.buildId??"");if(r.compatible)return!0;if(r.reason!=="build_mismatch"&&r.reason!=="missing_build")return!1;return Cu(n,e)<=0}function Us(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${jQ(e)}`,n=process.env[$Q]?.trim()||pT(Iu(),"locks","hub","owners",`${WQ(t)}.json`);return{ownerId:t,discoveryPath:n}}function Kqe(e=`hub-${Date.now().toString(36)}`){return Us(e)}async function qt(e){try{let t=JSON.parse(await RL(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 _f(e,t,n){await fT(e,async()=>{let r=IL(e);await hT(r,{recursive:!0});let o=`${e}.${process.pid}.${AL(6).toString("hex")}.tmp`,i;try{i=await TL(o,"wx",384),await i.writeFile(`${JSON.stringify(t,null,2)}
|
|
322
322
|
`,{encoding:"utf8"}),await i.sync(),await i.close(),i=void 0,n?.beforePublish?.(),await OQ(o,e);let s;try{s=await TL(r,"r"),await s.sync()}catch{}finally{await s?.close().catch(()=>{return})}}catch(s){throw await i?.close().catch(()=>{return}),await xf(o,{force:!0}).catch(()=>{return}),s}})}async function Wo(e){await fT(e,async()=>{await xf(e,{force:!0}).catch(()=>{return})})}async function PL(e,t){return await fT(e,async()=>{if((await qt(e))?.hubId!==t)return!1;return await xf(e,{force:!0}),!0})}async function ML(e,t,n){let r=zQ(e);await hT(IL(r),{recursive:!0});let o=Date.now()+HQ;while(!0){try{await hT(r,{recursive:!1})}catch(i){if((i instanceof Error&&"code"in i?String(i.code):"")!=="EEXIST")throw i;let a=await KQ(r);if(!a){if(Date.now()>=o){await uT(r);continue}await xL(SL);continue}let d=Date.now()-Date.parse(a.acquiredAt);if(!qQ(a.pid)||d>BQ){await uT(r);continue}if(Date.now()>=o)throw Error(`Timed out waiting for hub ${t} lock ${r}`);await xL(SL);continue}try{return await LQ(pT(r,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
|
|
323
323
|
`,"utf8"),await n()}finally{await uT(r)}}}function fT(e,t){return ML(`${e}.mutation`,"discovery mutation",t)}function Ef(e,t){return ML(e,"startup",t)}async function jo(e,t){NQ();try{let n=await fetch(t?.authToken?VQ(e):OL(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 qo(e,t,n="/hub"){return new URL(`ws://${e}:${t}${n}`).toString()}function OL(e){let t=new URL(e);return t.protocol=t.protocol==="wss:"?"https:":"http:",t.pathname="/health",t.search="",t.toString()}function VQ(e){let t=new URL(OL(e));return t.pathname="/status",t.toString()}function Gqe(e){return MQ(e)}import{CLINE_HUB_DEV_PORT as XQ,CLINE_HUB_PORT as YQ,resolveClineBuildEnv as JQ}from"@cerebriline/shared";var QQ="CLINE_HUB_HOST",ZQ="CLINE_HUB_PORT",eZ="CLINE_HUB_PATHNAME",tZ="127.0.0.1",nZ=YQ,rZ="/hub";function LL(e){return JQ(e)==="development"?XQ:nZ}function oZ(e={}){return(e.env??process.env)[QQ]?.trim()||tZ}function Af(e={}){let n=(e.env??process.env)[ZQ]?.trim();if(!n)return LL(e);let r=Number.parseInt(n,10);if(!Number.isInteger(r)||r<1||r>65535)return LL(e);return r}function iZ(e={}){return(e.env??process.env)[eZ]?.trim()||rZ}function Bs(e={},t={}){return{host:e.host??oZ(t),port:e.port??Af(t),pathname:e.pathname??iZ(t)}}import{join as sZ}from"node:path";var aZ="shared:cline",dZ="CLINE_HUB_DISCOVERY_PATH",lZ="hub-production";function eze(e){let t=Ms(e.trim());return Us(`workspace:${t||e.trim()}`)}function Ar(e=aZ){return Us(`${e}@${eo()}`)}function to(){return{ownerId:lZ,discoveryPath:process.env[dZ]?.trim()||sZ(Iu(),"locks","hub","production.json")}}var NL=15000,SZ=200,DL=3000,xZ=100,_Z=[100,250,500,1000,2000],EZ="--cline-hub-daemon",AZ=3,RZ=60000,wT=new Map,uze={resetRetireAttempts(){wT.clear()},resolveDaemonEntryArgs:WL};function IZ(e,t=Date.now()){let n=wT.get(e);if(!n||t-n.windowStartedAt>RZ)return wT.set(e,{count:1,windowStartedAt:t}),!0;return n.count+=1,n.count<=AZ}function CZ(e){return[...e.host?["--host",e.host]:[],...typeof e.port==="number"?["--port",String(e.port)]:[],...e.pathname?["--pathname",e.pathname]:[]]}function PZ(){try{let e=wZ(Iu(),"logs","hub-daemon.log");return hZ(yZ(e),{recursive:!0}),{fd:pZ(e,"a"),logPath:e}}catch{return}}function HL(){return BL()==="production"?to():Ar()}function Mu(e){return Od(e)}function MZ(e){try{let t=JSON.parse(mZ(`${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 gT(e){try{fZ(`${e}.superseded`)}catch{}}function $L(e,t,n){if(!t||t.url!==n)return e;return{...e,authToken:e.authToken??t.authToken,pid:e.pid??t.pid}}async function Ld(e,t){try{return await jo(e,{authToken:t})}catch{return}}async function FL(e,t){let n=Date.now()+t;while(Date.now()<n){if(!(await Ld(e))?.url)return!0;await new Promise((o)=>setTimeout(o,xZ))}return!1}async function Nd(e,t){if(!IZ(e.url))return!1;await Hs(e.url,e.authToken,"retired by newer install").catch(()=>!1),await vT(e.url,e.authToken).catch(()=>!1);let n=await FL(e.url,DL);if(!n&&e.pid&&OZ(e.pid)){try{process.kill(e.pid,"SIGTERM")}catch{}n=await FL(e.url,DL)}if(n)await Wo(t).catch(()=>{return});return n}function OZ(e){try{return process.kill(e,0),!0}catch(t){return t?.code==="EPERM"}}async function bT(e){try{return(await $d(e.url,e.authToken)).activeSessionCount>0}catch{return!1}}async function yT(e,t){if(Mu(e))return"reusable";let n=await Hs(e.url,e.authToken,"retired by newer install").catch(()=>!1);if(await bT(e)){if(n)await Hs(e.url,e.authToken,"hub retirement deferred",{off:!0}).catch(()=>!1);return"deferred_busy"}let r=await Nd(e,t);if(!r&&n)await Hs(e.url,e.authToken,"hub retirement failed",{off:!0}).catch(()=>!1);return r?"retired":"failed"}async function LZ(e){if(BL()!=="production")return;let t=Ar();if(t.discoveryPath===e.discoveryPath)return;let n=await qt(t.discoveryPath);if(n?.url)await Nd(n,t.discoveryPath);else await Wo(t.discoveryPath).catch(()=>{return})}function NZ(){let e=import.meta.url.endsWith(".ts")?"ts":"js";return bZ(new URL(`./entry.${e}`,import.meta.url))}function WL(e,t){if(kZ(e))return[EZ];return[...t&&e.toLowerCase().endsWith(".ts")?["--conditions=development"]:[],e]}function DZ(e,t){let n=NZ(),r=process.execPath?.trim();if(!r)throw Error("unable to resolve runtime executable for hub daemon");let o=gZ(r).toLowerCase().includes("bun"),i=WL(n,o);return{launcher:r,args:[...i,"--cwd",e,...CZ(t),...t.manageConnectors===!1?["--no-connectors"]:[]],cwd:e,env:{...TZ(process.env),CLINE_NO_INTERACTIVE:"1",[vZ]:"1"}}}function $Z(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 FZ(e,t={}){if(UL())return;let n=DZ(e,t),r=PZ();try{cZ(n.launcher,n.args,{detached:!0,stdio:r?["ignore",r.fd,r.fd]:"ignore",env:n.env,cwd:n.cwd,windowsHide:!0}).unref()}finally{if(r)uZ(r.fd)}}async function UZ(e,t={}){for(let n=0;;n++)try{FZ(e,t);return}catch(r){let o=_Z[n];if(!$Z(r)||o===void 0)throw r;await new Promise((i)=>setTimeout(i,o))}}function hze(e,t={}){if(UL())return;Ou(e,t).catch(()=>{})}async function BZ(e,t,n={}){let r=n.host!==void 0||n.port!==void 0||n.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),o=Bs(n),i=qo(o.host,o.port,o.pathname),s=(m)=>{if(!r)Dd(m.url,m.authToken);else jL(m.url,m.authToken);return m};await LZ(e).catch(()=>{return});let a=await qt(e.discoveryPath),d=a?.url?void 0:MZ(e.discoveryPath),l=!1;if(a?.url){let m=a.authToken;if(!m)l=!0,await Nd(a,e.discoveryPath);else{let f=await Ld(a.url,m);if(f?.url&&Mu(f)&&await ir(f.url,{authToken:m}))return gT(e.discoveryPath),s({url:f.url,authToken:m});if(f?.url){if(await yT({...f,authToken:m},e.discoveryPath)==="deferred_busy"&&await ir(f.url,{authToken:m}))return s({url:f.url,authToken:m})}else await Wo(e.discoveryPath).catch(()=>{return})}}let c=await Ld(i);if(c?.url){let m=$L(c,a??d,i);if(Mu(c)){let g=[c.authToken,a?.authToken,d?.authToken].filter((w)=>typeof w==="string"&&w.trim().length>0);for(let w of g){if(!await ir(c.url,{authToken:w}))continue;let x={hubId:c.hubId??`repaired-${c.port}`,protocolVersion:c.protocolVersion,minClientProtocolVersion:c.minClientProtocolVersion,maxClientProtocolVersion:c.maxClientProtocolVersion,capabilities:c.capabilities,coreVersion:c.coreVersion,buildId:c.buildId,authToken:w,host:c.host,port:c.port,url:c.url,pid:c.pid??a?.pid??d?.pid,startedAt:c.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await _f(e.discoveryPath,x)}catch{}return gT(e.discoveryPath),s({url:c.url,authToken:w})}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.${l?" 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 f=await yT(m,e.discoveryPath);if(f==="deferred_busy"){for(let g of[m.authToken,a?.authToken].filter((y)=>typeof y==="string"&&y.trim().length>0))if(await ir(c.url,{authToken:g}))return s({url:c.url,authToken:g});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(f==="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 UZ(t,{...h,manageConnectors:n.manageConnectors});let p=Date.now()+NL;while(Date.now()<p){let m=await qt(e.discoveryPath);if(m?.url&&m.authToken){let g=await Ld(m.url,m.authToken);if(g?.url&&Mu(g)&&await ir(g.url,{authToken:m.authToken}))return gT(e.discoveryPath),s({url:g.url,authToken:m.authToken})}let f=await Ld(i);if(f?.url&&!Mu(f)){let g=$L(f,m??d,i),y=await yT(g,e.discoveryPath);if(y==="deferred_busy"&&m?.authToken&&await ir(f.url,{authToken:m.authToken}))return s({url:f.url,authToken:m.authToken});if(y==="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((g)=>setTimeout(g,SZ))}throw Error(`Timed out after ${NL}ms waiting for detached hub startup.`)}async function Ou(e,t={}){let n=HL();return await Ef(n.discoveryPath,async()=>BZ(n,e,t))}var HZ=5000,WZ=500;async function pze(e={}){let t=HL(),n=e.workspaceRoot??process.cwd(),r=await qt(t.discoveryPath),o=r?.url?await Ld(r.url,r.authToken):void 0;if(!o?.url)return{outcome:"started",...await Ou(n)};let i={...o,authToken:o.authToken??r?.authToken,pid:o.pid??r?.pid};if(Fs(o).compatible)return{outcome:"already_current",url:o.url,authToken:i.authToken};if(Cu(Pu(),o)<=0)return{outcome:"hub_not_older",url:o.url,authToken:i.authToken};if(!await Hs(i.url,i.authToken,e.reason??"hub upgrade requested").catch(()=>!1))throw Error(`The running Cline Hub at ${i.url} did not accept a drain request, so it was not replaced. It is replaced automatically once idle when a Cline client next starts, or run 'cline doctor fix' to stop it now.`);let a=async()=>{await Hs(i.url,i.authToken,"hub upgrade aborted",{off:!0}).catch(()=>!1)},d=Date.now()+(e.waitForIdleMs??HZ),l;for(;;){try{if(l=(await $d(i.url,i.authToken)).activeSessionCount,l===0)break}catch{}if(Date.now()>=d)break;await new Promise((h)=>setTimeout(h,WZ))}if(l!==0&&e.force!==!0)return await a(),{outcome:"still_busy",url:i.url,authToken:i.authToken,...l!==void 0?{activeSessionCount:l}:{}};if(!await Nd(i,t.discoveryPath))throw await a(),Error(`The running Cline Hub at ${i.url} could not be stopped. Run 'cline doctor fix' to stop stale hub daemons, then try again.`);return{outcome:"replaced",...await Ou(n),activeSessionCount:l??0}}function ET(){return zZ()==="production"?to():Ar()}function VZ(){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 VL(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 VL(e.data);return String(e)}function XZ(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 qL(e){let t=e,n=XZ(t.reason);return new dn("hub_connection_closed",t.code||n?`Hub connection closed (code=${t.code??0}${n?`, reason=${n}`:""})`:TT,{closeCode:t.code,closeReason:n||void 0})}function zL(e,t){if(e instanceof dn)return e;if(e instanceof Error)return new dn("hub_connect_failed",e.message);if(e&&typeof e==="object"&&"error"in e&&e.error instanceof Error)return new dn("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 dn("hub_connect_failed",n);let r=e&&typeof e==="object"&&"type"in e&&typeof e.type==="string"?e.type.trim():"";return new dn("hub_connect_failed",r?`Failed to connect to hub at ${t.toString()} (${r} event before socket open).`:`Failed to connect to hub at ${t.toString()}.`)}var kT="*",Rf=8000,YZ="cline-hub-auth.",AT=new Map,XL=new Set,JZ=3000,QZ=3000,ZZ=100,TT="Hub connection closed",eee=250,tee=5000,KL=0.5;class dn extends Error{code;details;constructor(e,t,n){super(t);this.code=e;this.details=n;this.name="HubTransportError"}}function nee(e){return e instanceof dn}class If extends Error{command;code;constructor(e,t,n){super(n);this.command=e;this.code=t;this.name="HubCommandError"}}function Tze(e,t){return e instanceof If&&e.code==="hub_command_timeout"&&(t===void 0||e.command===t)}function RT(e,t={}){let n=e.searchParams.get("authToken")?.trim();if(e.searchParams.delete("authToken"),n)return n;if(t.skipRegistry)return;let r=Pf(e.toString());return r?AT.get(r):void 0}function ree(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 Pf(e){if(!ree(e))return;let t=new URL(Cf(e));return t.search="",t.hash="",t.toString()}function ST(e){let t=Pf(e);return!!t&&XL.has(t)}function Dd(e,t){let n=Pf(e);if(n){if(XL.add(n),t?.trim())AT.set(n,t)}return e}function jL(e,t){let n=Pf(e);if(n&&t?.trim())AT.set(n,t)}class Ws{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 dn("hub_connection_closed",TT);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()||RT(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,r=this.openSocket(e,t,n),o;this.connectPromise=r.then(async(s)=>{if(o=s,await this.commandOnce("client.register",{clientId:this.clientId,clientType:this.options.clientType??"core",displayName:this.options.displayName??"core",transport:"native",actorKind:"client",capabilities:this.capabilities,metadata:{...this.options.metadata,version:this.options.clientVersion??String(Oi.version),pid:process.pid},workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}},void 0,void 0,!1),n!==this.connectGeneration||this.closedByClient){try{s.close()}catch{}throw this.lastCloseError}this.registered=!0;for(let a of this.subscriptionCounts.keys())this.sendSubscriptionFrame("stream.subscribe",this.subscriptionSessionIdFromKey(a));this.reconnectAttempt=0});let i=this.connectPromise;try{await i}catch(s){if(this.connectPromise===i)this.connectPromise=void 0;if(o&&this.socket===o){this.lastCloseError=zL(s,e),this.registered=!1,this.sawSocketClose=!1,this.socket=void 0;try{o.close()}catch{}}if(!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect();throw s}}async openSocket(e,t,n){let r=this.options.resolveConnectionHeaders,o;if(r){let d;try{o=await Promise.race([Promise.resolve().then(()=>r()),new Promise((l,c)=>{d=setTimeout(()=>{c(new dn("hub_connect_timeout",`Timed out resolving hub connection headers after ${Rf}ms`))},Rf)})])}catch(l){let c=l instanceof dn?l:new dn("hub_connect_failed",l instanceof Error?l.message:String(l));if(n===this.connectGeneration)this.lastCloseError=c;throw c}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 dn("hub_connect_failed","Hub connection headers cannot set Sec-WebSocket-Protocol.");if(n===this.connectGeneration)this.lastCloseError=d;throw d}let i=o?new GZ(e.toString(),{headers:{...o}}):new(VZ())(e.toString(),t?[`${YZ}${t}`]:void 0);this.socket=i;let s=!1,a=new Promise((d,l)=>{let c=!1,u=setTimeout(()=>{if(c)return;c=!0,s=!0;let h=new dn("hub_connect_timeout",`Timed out connecting to hub after ${Rf}ms`);if(this.socket===i)this.lastCloseError=h,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;try{i.close()}catch{}l(h)},Rf);i.addEventListener("open",()=>{if(c)return;c=!0,clearTimeout(u),d()}),i.addEventListener("error",(h)=>{if(c)return;c=!0,clearTimeout(u);let p=zL(h,e);if(this.socket===i)this.lastCloseError=p,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;l(p)}),i.addEventListener("close",(h)=>{if(c)return;c=!0,clearTimeout(u);let p=s?this.lastCloseError:qL(h);if(this.socket===i){if(!s)this.lastCloseError=p,this.sawSocketClose=!0;this.connectPromise=void 0,this.socket=void 0}l(p)})});return i.addEventListener("message",(d)=>{this.handleFrame(JSON.parse(VL(d)))}),i.addEventListener("close",(d)=>{if(this.socket!==i)return;if(!s)this.lastCloseError=qL(d),this.sawSocketClose=!0;this.registered=!1;for(let l of this.pendingReplies.values())l.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,r={listener:e,sessionId:n};return this.listeners.add(r),this.adjustSubscriptionCount(n,1),()=>{if(!this.listeners.delete(r))return;this.adjustSubscriptionCount(n,-1)}}async command(e,t,n,r){let o=0,i=e!=="client.register"&&e!=="client.unregister";while(!0)try{return await this.commandOnce(e,t,n,r)}catch(s){if(!i||o>=1||!await this.recoverLocalHubTransport(s))throw s;o+=1}}async commandOnce(e,t,n,r,o=!0){if(o)await this.connect();r?.beforeDispatch?.();let i=jZ("hubreq_");r?.onDispatch?.(i);let s=KZ(e,r?.timeoutMs),a=new Promise((l,c)=>{let u=s===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(i))return;c(new If(e,"hub_command_timeout",`Hub command ${e} timed out after ${s}ms (hub=${this.currentUrl}, requestId=${i}, clientId=${this.clientId}). Check hub-daemon.log for matching command.start/command.slow entries, or run 'cline doctor fix' to restart the hub.`))},s);this.pendingReplies.set(i,{resolve:(h)=>{if(u)clearTimeout(u);l(h)},reject:(h)=>{if(u)clearTimeout(u);c(h)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:e,requestId:i,clientId:this.clientId,sessionId:n,timeoutMs:s,payload:t}})}catch(l){throw this.pendingReplies.delete(i),l}let d=await a;if(!d.ok){if(d.error?.code===Tf){let l=n??(typeof t?.sessionId==="string"?t.sessionId:void 0);throw new Md(l,d.error.message)}throw new If(e,d.error?.code,d.error?.message??`Hub command ${e} failed`)}return d}async recoverLocalHubTransport(e){if(!ST(this.currentUrl)||!nee(e))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let t=await _T({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(eee*2**this.reconnectAttempt,tee),t=Math.round(e*(1-KL)+Math.random()*e*KL);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(!ST(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let e=await _T({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 dn("hub_connection_closed",TT);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 dn("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),r=(this.subscriptionCounts.get(n)??0)+t;if(r<=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,r),t>0&&r===1&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.subscribe",e)}subscriptionKeyForSessionId(e){return e??kT}subscriptionSessionIdFromKey(e){return e===kT?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 r of[kT,n]){if(!r||!this.subscriptionCounts.has(r))continue;let o=this.lastEventSequenceByKey.get(r)??0;if(t>o)this.lastEventSequenceByKey.set(r,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 Cf(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 ir(e,t){let n=new Ws({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 xT(e,t){let n=Cf(e),r=await jo(n,{authToken:t?.authToken});if(!r)return{status:"unreachable",url:n};if(t?.requireCurrentBuild){let o=eo(),i=Fs(r,o);if(!i.compatible&&!Od(r))return{status:i.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:n}}else if(!qZ(r).compatible)return{status:"protocol_mismatch",url:n};if(t?.verifyConnection===!0&&!await ir(n,{workspaceRoot:t.workspaceRoot,cwd:t.cwd,authToken:t.authToken}))return{status:"unreachable",url:n};return{status:"compatible",url:n}}async function oee(e){let t=Date.now()+QZ;while(Date.now()<t){if(!(await jo(e).catch(()=>{return}))?.url)return!0;await new Promise((r)=>setTimeout(r,ZZ))}return!1}function iee(e,t){try{return Cf(e)===Cf(t)}catch{return!1}}function YL(e){let t=e&&typeof e==="object"&&Array.isArray(e.sessions)?e.sessions:[],n=0,r=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 s of i){let a=s&&typeof s==="object"?s.clientId:void 0;if(typeof a==="string"&&a.trim())r.add(a)}}return{activeSessionCount:n,participantClientCount:r.size}}function Sze(e){return YL(e).activeSessionCount>0}async function $d(e,t,n){let r=new Ws({url:e,authToken:t,clientType:"hub-recovery-check",displayName:"hub recovery check",workspaceRoot:n?.workspaceRoot,cwd:n?.cwd});try{let o=await r.command("session.list",{limit:500},void 0,{timeoutMs:JZ});return YL(o.payload)}finally{await r.dispose().catch(()=>{return})}}async function JL(e,t,n){try{return(await $d(e,t,n)).activeSessionCount===0}catch{return!1}}async function see(e,t){let n=`${e.discoveryPath}.superseded`,r=await qt(n);if(!r?.url||!r.authToken)return;let o=await xT(r.url,{authToken:r.authToken});if(o.status!=="compatible")return;if(await JL(o.url,r.authToken,t))return;return Dd(o.url,r.authToken)}async function aee(e={}){if(e.endpoint?.trim()){let o=await xT(e.endpoint);return o.status==="compatible"?o.url:void 0}let t=ET(),n=await qt(t.discoveryPath);if(!n?.url)return await see(t,e);let r=await xT(n.url,{authToken:n.authToken,requireCurrentBuild:!0});if(r.status==="compatible")return Dd(r.url,n.authToken);if(r.status==="protocol_mismatch")await Wo(t.discoveryPath).catch(()=>{return});return}async function _T(e={}){let t=await aee(e);if(t&&await ir(t,{workspaceRoot:e.workspaceRoot,cwd:e.cwd}))return t;if(e.endpoint?.trim())return;try{return(await Ou(e.workspaceRoot??process.cwd())).url}catch(n){e.onStartupError?.(n);return}}async function Hs(e,t,n,r){GL();let o=new URL(e),i=t?.trim()||RT(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(r?.off)o.searchParams.set("off","1");return(await fetch(o,{method:"POST",headers:i?{authorization:`Bearer ${i}`}:void 0})).ok}async function vT(e,t){GL();let n=new URL(e),r=t?.trim()||RT(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:r?{authorization:`Bearer ${r}`}:void 0})).ok}async function dee(e=ET()){let t=await qt(e.discoveryPath);if(!t?.url)return!1;try{if(await vT(t.url,t.authToken))return!0}catch{}return!1}async function xze(e){if(!ST(e.url))return;let t=ET(),n=await qt(t.discoveryPath);if(!n?.url||!iee(n.url,e.url))return;if(!await JL(n.url,n.authToken,{workspaceRoot:e.workspaceRoot,cwd:e.cwd}))return;if(!await dee())return;if(!await oee(n.url))return;return await Wo(t.discoveryPath).catch(()=>{return}),await _T({workspaceRoot:e.workspaceRoot,cwd:e.cwd})}import{resolveClineBuildEnv as lee}from"@cerebriline/shared";function cee(e,t){if(e instanceof Error)return e;if(e&&typeof e==="object"&&"message"in e&&typeof e.message==="string"&&e.message.trim())return Error(e.message.trim());let n=e&&typeof e==="object"&&"type"in e&&typeof e.type==="string"?e.type.trim():"";return Error(n?`Failed to connect to hub at ${t} (${n} event before socket open).`:`Failed to connect to hub at ${t}.`)}var uee="cline-hub-auth.";function hee(e){return e.host!==void 0||e.port!==void 0||e.pathname!==void 0}function pee(e,t){let n=new URL(e),r=new URL(t);return n.search="",n.hash="",r.search="",r.hash="",n.toString()===r.toString()}function QL(){return lee()==="production"?to():Ar()}async function mee(e){let t=e.searchParams.get("authToken")?.trim();if(e.searchParams.delete("authToken"),t)return t;let n=QL(),r=await qt(n.discoveryPath);if(r?.url&&pee(e.toString(),r.url))return r.authToken;return}async function fee(e={}){let t=Bs(e);if(!hee(e)){let n=QL(),r=await qt(n.discoveryPath);if(r?.url)return r.url}return qo(t.host,t.port,t.pathname)}async function ZL(e){return await new Promise((t,n)=>{(async()=>{let r=new URL(e),o=await mee(r);r.hash="";let i=new WebSocket(r.toString(),o?[`${uee}${o}`]:void 0),s=new Map,a=0;i.addEventListener("open",()=>{t({send(d){let l=d.requestId??`hub-client-${++a}`;return new Promise((c,u)=>{s.set(l,{resolve:c,reject:u});let h={kind:"command",envelope:{...d,requestId:l}};i.send(JSON.stringify(h))})},close(){i.close()}})}),i.addEventListener("message",(d)=>{let l=JSON.parse(String(d.data));if(l.kind==="reply"&&l.envelope.requestId){let c=s.get(l.envelope.requestId);if(c)s.delete(l.envelope.requestId),c.resolve(l.envelope)}}),i.addEventListener("close",()=>{for(let d of s.values())d.reject(Error("Hub connection closed"));s.clear()}),i.addEventListener("error",(d)=>{n(cee(d,e))})})().catch(n)})}async function Cze(e){try{return(await ZL(e)).close(),!0}catch{return!1}}async function Pze(e,t){let n=await fee(e),r=await ZL(n);try{return await r.send({version:t.version??"v1",clientId:t.clientId??"hub-client",...t})}finally{r.close()}}import{existsSync as gee}from"node:fs";import{isHubDaemonProcess as yee,resolveClineBuildEnv as wee}from"@cerebriline/shared";var bee=1e4,vee="CLINE_HUB_BUILD_WATCH_INTERVAL_MS";function kee(){let e=Number(process.env[vee]);return Number.isFinite(e)&&e>0?e:bee}async function Tee(e,t){try{let n=await $d(e.url,t);return{...e,activeSessionCount:n.activeSessionCount,participantClientCount:n.participantClientCount}}catch{return e}}function See(){return wee()==="production"?to():Ar()}function xee(e){try{return gee(`${e}.lock`)}catch{return!1}}async function _ee(){let e=See();if(xee(e.discoveryPath))return;let t=await qt(e.discoveryPath).catch(()=>{return});if(!t?.url)return;let n=await jo(t.url).catch(()=>{return});if(!n?.url)return;let r=eo(),o=Fs(n,r);if(o.compatible)return;let i=(a)=>({url:n.url,reason:a,hubBuildId:n.buildId,hubCoreVersion:n.coreVersion,expectedBuildId:r});if(o.reason==="unsupported_protocol")return i("unsupported_protocol");let s=Pu();if(s.coreVersion&&n.coreVersion&&s.coreVersion===n.coreVersion)return;if(Cu(s,n)>0)return await Tee(i("outdated_hub"),t.authToken);return i("build_mismatch")}function Fze(e){if(yee()||process.env.CLINE_HUB_PORT?.trim())return()=>{};let t=e.intervalMs??kee(),n,r,o=!1,i=setInterval(()=>{if(o)return;o=!0,_ee().then((s)=>{if(!s){n=void 0,r=void 0;return}let a=`${s.reason}:${s.hubBuildId??""}`;if(a===n)return;if(s.reason==="outdated_hub"&&r!==a){r=a;return}r=void 0,n=a,e.onMismatch(s)}).catch(()=>{return}).finally(()=>{o=!1})},t);return i.unref?.(),()=>{clearInterval(i)}}function IT(e){return e?JSON.parse(JSON.stringify(e)):{}}function Mf(e){let t=e?.session&&typeof e.session==="object"?e.session:void 0;if(!t)return;let n=t.metadata&&typeof t.metadata==="object"?IT(t.metadata):void 0;return{sessionId:typeof t.sessionId==="string"?t.sessionId:"",parentSessionId:typeof n?.parentSessionId==="string"?n.parentSessionId:void 0,status:typeof t.status==="string"?t.status:void 0,messagesPath:typeof n?.messagesPath==="string"?n.messagesPath:void 0,metadata:n}}function eN(e,t){return e.error?.message??`hub command failed: ${t}`}function Eee(e){let t=IT(e);if(typeof t.error==="string"&&t.error.trim())return{...t,error:t.error.trim()};let n=t.result&&typeof t.result==="object"?t.result:void 0;if(typeof n?.text==="string"&&n.text.trim())return{...t,error:n.text.trim()};let r=n?.error&&typeof n.error==="object"?n.error:void 0;if(typeof r?.message==="string"&&r.message.trim())return{...t,error:r.message.trim()};return t}function tN(e){let t=e?.sessionId;return typeof t==="string"&&t.trim()?t.trim():void 0}function Aee(e){let t=e?.checkpoint;if(!t||typeof t!=="object"||Array.isArray(t))throw Error("hub checkpoint restore returned no checkpoint");let n=t;if(typeof n.ref!=="string"||typeof n.createdAt!=="number"||typeof n.runCount!=="number")throw Error("hub checkpoint restore returned an invalid checkpoint");return n}function Ree(e){let t=IT(e.payload);if(e.event==="schedule.execution_completed")return{sessionId:e.sessionId?.trim()||tN(t)||"",eventType:"schedule.execution.completed",payload:t};if(e.event==="schedule.execution_failed")return{sessionId:e.sessionId?.trim()||tN(t)||"",eventType:"schedule.execution.failed",payload:t};let n=e.sessionId?.trim();if(!n)return;switch(e.event){case"iteration.started":return{sessionId:n,eventType:"runtime.chat.iteration_start",payload:t};case"iteration.finished":return{sessionId:n,eventType:"runtime.chat.iteration_end",payload:t};case"assistant.delta":return{sessionId:n,eventType:"runtime.chat.text_delta",payload:t};case"assistant.media":return{sessionId:n,eventType:"runtime.chat.media",payload:t};case"usage.updated":return{sessionId:n,eventType:"runtime.chat.usage",payload:t};case"session.notice":return{sessionId:n,eventType:"runtime.chat.notice",payload:t};case"tool.started":return{sessionId:n,eventType:"runtime.chat.tool_call_start",payload:t};case"tool.updated":return{sessionId:n,eventType:"runtime.chat.tool_call_update",payload:t};case"tool.finished":return{sessionId:n,eventType:"runtime.chat.tool_call_end",payload:t};case"approval.requested":return{sessionId:n,eventType:"approval.requested",payload:t};case"run.aborted":return{sessionId:n,eventType:"runtime.chat.aborted",payload:t};case"run.failed":return{sessionId:n,eventType:"runtime.chat.failed",payload:Eee(e.payload)};case"run.completed":return{sessionId:n,eventType:"runtime.chat.completed",payload:t};default:return}}class Iee{client;constructor(e){this.client=new Ws({url:e.address,authToken:e.authToken,clientId:e.clientId,clientType:e.clientType??"hub-session-client",displayName:e.displayName??"hub session client",workspaceRoot:e.workspaceRoot,cwd:e.cwd,metadata:e.metadata})}async connect(){await this.client.connect()}async taskCommand(e,t){return await this.client.connect(),(await this.client.command(e,t)).payload??{}}close(){this.client.close()}async dispose(){await this.client.dispose()}async startRuntimeSession(e){await this.client.connect();let t=await this.client.command("session.create",{workspaceRoot:e.workspaceRoot,cwd:e.cwd,sessionConfig:{providerId:e.provider,modelId:e.model,apiKey:e.apiKey,cwd:e.cwd??e.workspaceRoot,workspaceRoot:e.workspaceRoot,systemPrompt:e.systemPrompt??"",mode:e.mode??"act",rules:e.rules,maxIterations:e.maxIterations,timeoutSeconds:e.timeoutSeconds,enableTools:e.enableTools,enableSpawnAgent:e.enableSpawn!==!1,enableAgentTeams:e.enableTeams===!0,disableMcpSettingsTools:e.disableMcpSettingsTools,agentPluginPaths:e.agentPluginPaths,missionLogIntervalSteps:e.missionStepInterval,missionLogIntervalMs:e.missionTimeIntervalMs},metadata:{source:e.source??"cli",provider:e.provider,model:e.model,enableTools:e.enableTools,enableSpawn:e.enableSpawn,enableTeams:e.enableTeams,prompt:void 0,interactive:e.interactive!==!1},runtimeOptions:{mode:e.mode,systemPrompt:e.systemPrompt,maxIterations:e.maxIterations,timeoutSeconds:e.timeoutSeconds,enableTools:e.enableTools,enableSpawn:e.enableSpawn,enableTeams:e.enableTeams,autoApproveTools:e.autoApproveTools,toolExecutors:e.toolExecutors,configExtensions:e.configExtensions},modelSelection:{provider:e.provider,model:e.model,apiKey:e.apiKey},toolPolicies:e.toolPolicies}),n=Mf(t.payload);if(!n?.sessionId)throw Error("hub session create returned no session id");return{sessionId:n.sessionId,startResult:{sessionId:n.sessionId,manifestPath:"",messagesPath:n.messagesPath??""}}}async sendRuntimeSession(e,t,n){return await this.client.connect(),{result:(await this.client.command("session.send_input",{prompt:t.prompt,mode:t.config.mode,attachments:t.attachments,delivery:t.delivery,timeoutSeconds:t.config.timeoutSeconds},e,n)).payload?.result}}async stopRuntimeSession(e){return await this.client.connect(),await this.client.command("session.detach",{sessionId:e},e),{applied:!0}}async abortRuntimeSession(e){return await this.client.connect(),await this.client.command("run.abort",{sessionId:e},e),{applied:!0}}async updateSession(e){return await this.client.connect(),await this.client.command("session.update",{sessionId:e.sessionId,metadata:e.metadata},e.sessionId),{updated:!0}}async getSession(e){await this.client.connect();let t;try{t=await this.client.command("session.get",void 0,e)}catch(n){if(Sf(n))return;throw n}return Mf(t.payload)}async readMessages(e){let t=e.trim();if(!t)return[];await this.client.connect();let n=await this.client.command("session.messages",{sessionId:t},t);if(!n.ok)throw Error(eN(n,"session.messages"));let r=n.payload?.messages;return Array.isArray(r)?r:[]}async restore(e){let t=e.sessionId.trim();if(!t)throw Error("sessionId is required");let n=e.restore?.messages!==!1;if(n&&!e.config)throw Error("config is required when restore.messages is true");await this.client.connect();let r=e.config,o=await this.client.command("session.restore",{sessionId:t,checkpointRunCount:e.checkpointRunCount,restore:e.restore,...r?{workspaceRoot:r.workspaceRoot,cwd:r.cwd,sessionConfig:{providerId:r.provider,modelId:r.model,apiKey:r.apiKey,cwd:r.cwd??r.workspaceRoot,workspaceRoot:r.workspaceRoot,systemPrompt:r.systemPrompt??"",mode:r.mode??"act",rules:r.rules,maxIterations:r.maxIterations,enableTools:r.enableTools,enableSpawnAgent:r.enableSpawn!==!1,enableAgentTeams:r.enableTeams===!0,disableMcpSettingsTools:r.disableMcpSettingsTools,agentPluginPaths:r.agentPluginPaths,missionLogIntervalSteps:r.missionStepInterval,missionLogIntervalMs:r.missionTimeIntervalMs},metadata:{source:r.source??"cli",provider:r.provider,model:r.model,enableTools:r.enableTools,enableSpawn:r.enableSpawn,enableTeams:r.enableTeams,prompt:void 0,interactive:r.interactive!==!1},runtimeOptions:{mode:r.mode,systemPrompt:r.systemPrompt,maxIterations:r.maxIterations,enableTools:r.enableTools,enableSpawn:r.enableSpawn,enableTeams:r.enableTeams,autoApproveTools:r.autoApproveTools,configExtensions:r.configExtensions},modelSelection:{provider:r.provider,model:r.model,apiKey:r.apiKey},toolPolicies:r.toolPolicies}:{}},t);if(!o.ok)throw Error(eN(o,"session.restore"));let i=Mf(o.payload);if(n&&!i?.sessionId)throw Error("hub checkpoint restore returned no session id");let s=Array.isArray(o.payload?.messages)?o.payload.messages:void 0,a=Aee(o.payload);return{sessionId:i?.sessionId,startResult:i?.sessionId?{sessionId:i.sessionId,manifestPath:"",messagesPath:i.messagesPath??""}:void 0,...s?{messages:s}:{},checkpoint:a}}async listSessions(e){await this.client.connect();let t=await this.client.command("session.list",{limit:e?.limit??200});return(Array.isArray(t.payload?.sessions)?t.payload?.sessions:[]).map((r)=>Mf({session:r})).filter((r)=>Boolean(r?.sessionId))}async searchSessions(e){await this.client.connect();let t=await this.client.command("session.search",e);return Array.isArray(t.payload?.hits)?t.payload.hits:[]}async deleteSession(e,t=!0){return await this.client.connect(),(await this.client.command("session.delete",{sessionId:e,deleteCheckpointRefs:t})).payload?.deleted===!0}async respondToolApproval(e){await this.client.connect(),await this.client.command("approval.respond",{approvalId:e.approvalId,approved:e.approved,payload:e.reason?{reason:e.reason}:void 0,responderClientId:e.responderClientId})}streamEvents(e,t){let n=new Set((e.sessionIds??[]).map((o)=>o.trim()).filter(Boolean)),r=this.client.subscribe((o)=>{let i=Ree(o);if(!i)return;if(n.size>0&&!n.has(i.sessionId))return;t.onEvent?.(i)});return this.client.connect().catch((o)=>{t.onError?.(o instanceof Error?o:Error(String(o)))}),r}streamTeamProgress(e,t){let n=this.client.subscribe((r)=>{if(r.event!=="team.progress"||!r.payload)return;t.onProjection?.(r.payload)});return this.client.connect().catch((r)=>{t.onError?.(r instanceof Error?r:Error(String(r)))}),n}async createSchedule(e){return await this.client.connect(),(await this.client.command("schedule.create",e)).payload?.schedule}async listSchedules(e){await this.client.connect();let t=await this.client.command("schedule.list");return Array.isArray(t.payload?.schedules)?t.payload?.schedules:[]}async getSchedule(e){return await this.client.connect(),(await this.client.command("schedule.get",{scheduleId:e})).payload?.schedule}async updateSchedule(e,t){return await this.client.connect(),(await this.client.command("schedule.update",{scheduleId:e,...t})).payload?.schedule}async pauseSchedule(e){return await this.client.connect(),(await this.client.command("schedule.disable",{scheduleId:e})).payload?.schedule}async resumeSchedule(e){return await this.client.connect(),(await this.client.command("schedule.enable",{scheduleId:e})).payload?.schedule}async deleteSchedule(e){return await this.client.connect(),(await this.client.command("schedule.delete",{scheduleId:e})).payload?.deleted===!0}async triggerScheduleNow(e){return await this.client.connect(),(await this.client.command("schedule.trigger",{scheduleId:e})).payload?.execution}async listScheduleExecutions(e,t){await this.client.connect();let n=await this.client.command("schedule.list_executions",{scheduleId:e,limit:t});return Array.isArray(n.payload?.executions)?n.payload?.executions:[]}async getScheduleStats(){return await this.client.connect(),(await this.client.command("schedule.stats")).payload?.stats}async getActiveScheduledExecutions(){await this.client.connect();let e=await this.client.command("schedule.active");return Array.isArray(e.payload?.executions)?e.payload?.executions:[]}async getUpcomingScheduledRuns(e){await this.client.connect();let t=await this.client.command("schedule.upcoming",{limit:e});return Array.isArray(t.payload?.upcoming)?t.payload?.upcoming:[]}async createTask(e){return(await this.taskCommand("task.create",e)).task}async listTasks(e={}){let t=await this.taskCommand("task.list",e);return Array.isArray(t.tasks)?t.tasks:[]}async getTask(e){return(await this.taskCommand("task.get",{taskId:e})).task}async updateTask(e){return(await this.taskCommand("task.update",e)).task}async approveTask(e,t){return(await this.taskCommand("task.approve",{taskId:e,expectedRevision:t})).task}async cancelTask(e,t,n){return(await this.taskCommand("task.cancel",{taskId:e,reason:n,expectedRevision:t})).task}async runTask(e,t){return await this.taskCommand("task.run",{taskId:e,expectedRevision:t})}async getTaskAutomation(){return(await this.taskCommand("task.automation.get",{})).policy}async setTaskAutomation(e){return(await this.taskCommand("task.automation.set",{policy:e})).policy}}class Cee{client;constructor(e){this.client=new Ws({url:e.address,authToken:e.authToken,clientId:e.clientId,clientType:e.clientType??"hub-ui-client",displayName:e.displayName??"hub ui client"})}async connect(){await this.client.connect()}close(){this.client.close()}async dispose(){await this.client.dispose()}getClientId(){return this.client.getClientId()}async sendNotify(e){await this.client.command("ui.notify",e)}async sendShowWindow(e){await this.client.command("ui.show_window",e??{})}async listClients(){let e=await this.client.command("client.list");return Array.isArray(e.payload?.clients)?e.payload.clients:[]}async listSessions(e=200){let t=await this.client.command("session.list",{limit:e});return Array.isArray(t.payload?.sessions)?t.payload.sessions:[]}async searchSessions(e){let t=await this.client.command("session.search",e);return Array.isArray(t.payload?.hits)?t.payload.hits:[]}async toggleSetting(e){let t=await this.client.command("settings.toggle",e);if(!t.ok)throw Error(t.error?.message??"settings.toggle failed");return t.payload}subscribeUI(e){return this.client.subscribe((t)=>{switch(t.event){case"ui.notify":e.onNotify?.(t.payload);break;case"ui.show_window":e.onShowWindow?.(t.payload);break;case"hub.client.registered":e.onClientRegistered?.(t.payload??{});break;case"hub.client.disconnected":e.onClientDisconnected?.(t.payload??{});break;case"session.created":e.onSessionCreated?.(t.payload??{});break;case"session.updated":e.onSessionUpdated?.(t.payload??{});break;case"session.detached":e.onSessionDetached?.(t.payload??{});break}})}}import{normalizeProviderId as P1e}from"@cerebriline/llms";import{existsSync as BUe,readdirSync as HUe}from"node:fs";import{readFile as WUe}from"node:fs/promises";import{homedir as jUe}from"node:os";import{isAbsolute as mX,join as Ei,resolve as l0}from"node:path";import{onXollamaSideCall as qUe,releasePolykvSwarmsOf as cX}from"@cerebriline/llms";import{applyPromptTemplateToTools as zUe,captureSdkError as Sr,createSessionId as KUe,isLikelyAuthError as GUe,normalizeUserInput as VUe}from"@cerebriline/shared";import{setHomeDirIfUnset as XUe}from"@cerebriline/shared/storage";import{decodeJwtPayload as _te,getClineEnvironmentConfig as SN}from"@cerebriline/shared";import{decodeJwtPayload as $ee,getClineEnvironmentConfig as Fee}from"@cerebriline/shared";import{createHash as Pee}from"node:crypto";var Mee;function jn(e){if(typeof e!=="string"||e.length===0)return"unset";return Pee("sha256").update(e).digest("hex").slice(0,8)}function ct(e){try{Mee?.debug(e)}catch{}}function Oee(){let e;return{promise:new Promise((n)=>{e=n}),resolve:e}}async function js(e){let t=await import("node:http"),n=e.host??"127.0.0.1",r=e.timeoutMs??300000,o=e.successHtml??Lee,i=Oee(),s=!1,a=null,d=null,l=null,c=(p)=>{if(s)return;s=!0,i.resolve(p)},u=()=>{if(a)clearTimeout(a),a=null;let p=l;if(l=null,d)d.close(),d.closeAllConnections?.(),d=null;if(p!==null&&e.onClose)Promise.resolve(e.onClose({host:n,port:p})).catch(()=>{})},h=async()=>(a=setTimeout(()=>{u(),c(null)},r),i.promise);for(let p of e.ports){let m=t.createServer((g,y)=>{try{let w=new URL(g.url||"",`http://${n}:${p}`);if(w.pathname!==e.callbackPath){y.statusCode=404,y.end("Not found");return}let x={url:w,code:w.searchParams.get("code")??void 0,state:w.searchParams.get("state")??void 0,provider:w.searchParams.get("provider")??void 0,error:w.searchParams.get("error")??void 0};if(x.error){y.statusCode=400,y.end(`Authentication failed: ${x.error}`),u(),c(x);return}if(!x.code){y.statusCode=400,y.end("Missing authorization code");return}if(e.expectedState&&x.state!==e.expectedState){y.statusCode=400,y.end("State mismatch");return}y.statusCode=200,y.setHeader("Content-Type","text/html; charset=utf-8"),y.end(o),u(),c(x)}catch{y.statusCode=500,y.end("Internal error")}}),f=await new Promise((g)=>{let y=(w)=>{m.off("error",y),g({bound:!1,error:w})};m.once("error",y),m.listen(p,n,()=>{m.off("error",y),d=m,g({bound:!0})})});if(f.error){if(f.error.code==="EADDRINUSE")continue;throw u(),f.error}if(f.bound){l=p;let g=`http://${n}:${p}${e.callbackPath}`;if(e.onListening)await Promise.resolve(e.onListening({host:n,port:p,callbackUrl:g})).catch(()=>{});return{callbackUrl:g,waitForCallback:h,cancelWait:()=>{u(),c(null)},close:()=>{u(),c(null)}}}}return{callbackUrl:"",waitForCallback:async()=>null,cancelWait:()=>{},close:()=>{}}}var Lee=`<!DOCTYPE html>
|
|
324
324
|
<html lang="en">
|
|
@@ -488,7 +488,7 @@ The tool calls this summary stands for, recorded by the harness rather than writ
|
|
|
488
488
|
|
|
489
489
|
${r}
|
|
490
490
|
|
|
491
|
-
`}]:[]],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 oD(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;Dte(Nte({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 mS,createPolykvClient as hre,engineSessionId as pre,getPolykvSession as mre,hasOpencotiFeature as Go,normalizeProviderId as fre,OPENCOTI_FEATURES as Vo,probeOpencotiProps as gre,readOpencotiKv as PD,setPolykvSession as AD}from"@cerebriline/llms";import{classifyTurnFault as yre,classifyTurnFaultError as wre,describeAdmissionWait as bre,hasPromptEnvironment as vre}from"@cerebriline/shared";import{EMPTY_CONTENT_TEXT as _ne}from"@cerebriline/shared";import{TOOL_RESULT_SERIALIZED_JSON as xne}from"@cerebriline/shared";function qf(e){if(typeof e==="string")return e;if(Array.isArray(e))return e;return JSON.stringify(e)}function iS(e){if(e.serialized)return e.serialized;let t=e.output;return typeof t==="string"||Array.isArray(t)||t===void 0?void 0:xne}function Ene(e){if(e.metadata?.displayOnly===!0)return[];let t=Rne(e.content),n=[],r=e.id??Pne(),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(Ine),createdAt:e.ts??Date.now(),metadata:d(!0),modelInfo:e.modelInfo,metrics:iD(e.metrics)}),i=[]};if(t.length===0)return n.push({id:r,role:e.role,content:[{type:"text",text:_ne}],createdAt:e.ts??Date.now(),metadata:e.metadata,modelInfo:e.modelInfo,metrics:iD(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:[aD(u)],createdAt:e.ts??Date.now(),metadata:d(!1)})}return l(),n}function Vd(e){return e.flatMap(Ene)}function Ane(e){let t=e.content.map(dD).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:Cne(e.metrics)}}function qu(e){return e.map(Ane)}function zf(e){let t=[];for(let n of e){let r=n.content.map(dD).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 Rne(e){if(typeof e==="string")return e.trim().length>0?[{type:"text",text:e}]:[];return[...e]}function Ine(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 aD(e)}}function aD(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 dD(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:qf(e.output),is_error:e.isError,...e.note?{note:e.note}:{},...iS(e)?{serialized:iS(e)}:{}}}}function iD(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 Cne(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 sD=0;function Pne(){return sD+=1,`msg_${Date.now().toString(36)}_${sD.toString(36)}`}import{createGateway as Dne,createHandlerAsync as $ne,hasRegisteredHandler as Fne,isModelRequestCaptureOn as Une,MODEL_COLLECTIONS_BY_PROVIDER_ID as Bne,normalizeProviderId as sS,resolveGatewayProviderRegistrationSync as Hne,toGatewayModelCapabilities as Wne,withModelRequestCapture as jne}from"@cerebriline/llms";import{classifyProviderError as lD}from"@cerebriline/llms";import{toolResultForModel as Mne}from"@cerebriline/shared";function One(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:Mne(a.content,i,{...t?{format:t}:{},...s?{serialized:s}:{}})}})}})}function Lne(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:Nne(e),error:e.error,...e.error?{errorClass:lD(e.error)}:{}}];default:return[]}}function Nne(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 cD(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=One(zf(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 Lne(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:lD(i)}}}}}}}function qne(e){let t=Object.fromEntries(Object.entries(e).filter(([,n])=>n!==void 0));return Object.keys(t).length>0?t:void 0}function zne(e){return e.providerId==="openai-compatible"||e.clientType==="openai-compatible"}var uD;function Kne(){return uD??=`cerebriline-aux-${Math.random().toString(36).slice(2,10)}`,uD}function Gne(e,t){let n={region:e.region,apiLine:e.apiLine,openRouterProviderSorting:e.openRouterProviderSorting,modelCatalog:e.modelCatalog,sampling:e.sampling,polykv:e.polykv};if(zne(e))Object.assign(n,{apiVersion:e.azure?.apiVersion,useIdentity:e.azure?.useIdentity});let r=sS(e.providerId);if(r==="opencoti"||r==="xollama"){let o=e.engineSessionId||t||Kne();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 qne(n)}function Vne(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?Math.floor(e):void 0}function aS(e){let t=e.providerConfig,n=t?.knownModels?t.knownModels:e.knownModels??Bne[e.providerId]?.models??void 0,r=Vne(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 Xne(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:Wne(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 dS(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 Kf(e,t,n,r){let o={...dS(e),knownModels:aS(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=sS(o.providerId);if(Une()&&i!=="ollama"&&i!=="xollama")o.fetch=jne(o.fetch??globalThis.fetch,e.sessionId);if(Fne(sS(o.providerId)))return cD(()=>$ne(o),o.toolResultFormat?{toolResultFormat:o.toolResultFormat}:void 0);let s=Dne({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:Gne(o,e.sessionId),models:o.knownModels?Object.entries(o.knownModels).map(([d,l])=>Xne(d,l)):void 0}],logger:t,telemetry:n??e.telemetry??e.extensionContext?.telemetry}),a=Hne(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 Yne,createPolykvClient as hD,deferPolykvLeadClose as pD,engineSessionId as Xf,getPolykvSession as zu,getPolykvWindowGrant as Jne,hasOpencotiFeature as Qne,normalizeProviderId as Ys,OPENCOTI_FEATURES as Zne,polykvEffectiveWindow as ere,polykvWorkerChargedTo as tre,probeOpencotiProps as mD,readOpencotiKv as nre,releasePolykvLead as rre,setPolykvSession as ore,withXollamaAuth as lS,XOLLAMA_DEFAULT_BASE_URL as cS,xollamaDrivesModel as ire,xollamaEngineFetch as fD,xollamaEngineRoot as gD}from"@cerebriline/llms";import{hasPromptEnvironment as sre}from"@cerebriline/shared";var Yf=0.85;function Ku(e){return e?.providerId!==void 0&&Ys(e.providerId)==="opencoti"&&Boolean(e.baseUrl)&&e.polykv?.enabled!==!1}function Ko(e){return Ku(e)||e?.providerId!==void 0&&Ys(e.providerId)==="xollama"&&e.polykv?.enabled!==!1}async function yD(e){if(!e.modelId||e.polykv?.enabled===!1)return!1;let t=e.baseUrl||cS,n={...e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{},...e.headers??{}};return ire(t,e.modelId,lS(e.fetch??fetch,t,n))}async function Js(e){if(e?.providerId===void 0)return;let t=Ys(e.providerId);if(t==="opencoti")return e.baseUrl?e:void 0;if(t!=="xollama"||!e.modelId)return;if(!await yD(e).catch(()=>!1))return;let n=e.baseUrl||cS,r={...e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{},...e.headers??{}},{headers:o,...i}=e;return{...i,providerId:"opencoti",baseUrl:gD(n,e.modelId),fetch:fD(lS(e.fetch??fetch,n,r))}}async function are(e,t){let n=t.providerConfig;if(!n.modelId)return;let r=n.baseUrl||cS,o={...n.apiKey?{Authorization:`Bearer ${n.apiKey}`}:{},...n.headers??{}},i=hD({baseUrl:gD(r,n.modelId),fetch:fD(lS(n.fetch??fetch,r,o))}),s=async()=>{try{let a=await i.closeSession(Xf(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(pD(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 uS(e){if(e?.providerId!==void 0&&Ys(e.providerId)==="xollama")return yD(e).catch(()=>!1);if(!e||!Ku(e))return!1;return(await mD(e.baseUrl,e.fetch).catch(()=>{return}))?.poolsEnabled===!0}function Xd(e){if(!e.baseUrl)return;return hD({baseUrl:e.baseUrl,...e.fetch?{fetch:e.fetch}:{},...e.headers?{headers:e.headers}:{}})}function dre(e){if(!e.systemPrompt)return;let t=lre(e.tools);return{messages:[{role:"system",content:e.systemPrompt}],...t.length>0?{tools:t}:{}}}function lre(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 cre(e){let t=e.replace(/[ \t]+$/,"");return t.endsWith(`
|
|
491
|
+
`}]:[]],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 oD(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;Dte(Nte({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 mS,createPolykvClient as hre,engineSessionId as pre,getPolykvSession as mre,hasOpencotiFeature as Go,normalizeProviderId as fre,OPENCOTI_FEATURES as Vo,probeOpencotiProps as gre,readOpencotiKv as PD,setPolykvSession as AD}from"@cerebriline/llms";import{classifyTurnFault as yre,classifyTurnFaultError as wre,describeAdmissionWait as bre,hasPromptEnvironment as vre}from"@cerebriline/shared";import{EMPTY_CONTENT_TEXT as _ne}from"@cerebriline/shared";import{TOOL_RESULT_SERIALIZED_JSON as xne}from"@cerebriline/shared";function qf(e){if(typeof e==="string")return e;if(Array.isArray(e))return e;return JSON.stringify(e)}function iS(e){if(e.serialized)return e.serialized;let t=e.output;return typeof t==="string"||Array.isArray(t)||t===void 0?void 0:xne}function Ene(e){if(e.metadata?.displayOnly===!0)return[];let t=Rne(e.content),n=[],r=e.id??Pne(),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(Ine),createdAt:e.ts??Date.now(),metadata:d(!0),modelInfo:e.modelInfo,metrics:iD(e.metrics)}),i=[]};if(t.length===0)return n.push({id:r,role:e.role,content:[{type:"text",text:_ne}],createdAt:e.ts??Date.now(),metadata:e.metadata,modelInfo:e.modelInfo,metrics:iD(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:[aD(u)],createdAt:e.ts??Date.now(),metadata:d(!1)})}return l(),n}function Vd(e){return e.flatMap(Ene)}function Ane(e){let t=e.content.map(dD).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:Cne(e.metrics)}}function qu(e){return e.map(Ane)}function zf(e){let t=[];for(let n of e){let r=n.content.map(dD).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 Rne(e){if(typeof e==="string")return e.trim().length>0?[{type:"text",text:e}]:[];return[...e]}function Ine(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 aD(e)}}function aD(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 dD(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:qf(e.output),is_error:e.isError,...e.note?{note:e.note}:{},...iS(e)?{serialized:iS(e)}:{}}}}function iD(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 Cne(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 sD=0;function Pne(){return sD+=1,`msg_${Date.now().toString(36)}_${sD.toString(36)}`}import{createGateway as Dne,createHandlerAsync as $ne,hasRegisteredHandler as Fne,isModelRequestCaptureOn as Une,MODEL_COLLECTIONS_BY_PROVIDER_ID as Bne,normalizeProviderId as sS,resolveGatewayProviderRegistrationSync as Hne,toGatewayModelCapabilities as Wne,withModelRequestCapture as jne}from"@cerebriline/llms";import{classifyProviderError as lD}from"@cerebriline/llms";import{toolResultForModel as Mne}from"@cerebriline/shared";function One(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:Mne(a.content,i,{...t?{format:t}:{},...s?{serialized:s}:{}})}})}})}function Lne(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:Nne(e),error:e.error,...e.error?{errorClass:lD(e.error)}:{}}];default:return[]}}function Nne(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 cD(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=One(zf(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 Lne(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:lD(i)}}}}}}}function qne(e){let t=Object.fromEntries(Object.entries(e).filter(([,n])=>n!==void 0));return Object.keys(t).length>0?t:void 0}function zne(e){return e.providerId==="openai-compatible"||e.clientType==="openai-compatible"}var uD;function Kne(){return uD??=`cerebriline-aux-${Math.random().toString(36).slice(2,10)}`,uD}function Gne(e,t){let n={region:e.region,apiLine:e.apiLine,openRouterProviderSorting:e.openRouterProviderSorting,modelCatalog:e.modelCatalog,sampling:e.sampling,polykv:e.polykv};if(zne(e))Object.assign(n,{apiVersion:e.azure?.apiVersion,useIdentity:e.azure?.useIdentity});let r=sS(e.providerId);if(r==="ollama"&&t)n.requestCaptureSessionId=t;if(r==="opencoti"||r==="xollama"){let o=e.engineSessionId||t||Kne();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 qne(n)}function Vne(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?Math.floor(e):void 0}function aS(e){let t=e.providerConfig,n=t?.knownModels?t.knownModels:e.knownModels??Bne[e.providerId]?.models??void 0,r=Vne(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 Xne(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:Wne(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 dS(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 Kf(e,t,n,r){let o={...dS(e),knownModels:aS(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=sS(o.providerId);if(Une()&&i!=="ollama"&&i!=="xollama")o.fetch=jne(o.fetch??globalThis.fetch,e.sessionId);if(Fne(sS(o.providerId)))return cD(()=>$ne(o),o.toolResultFormat?{toolResultFormat:o.toolResultFormat}:void 0);let s=Dne({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:Gne(o,e.sessionId),models:o.knownModels?Object.entries(o.knownModels).map(([d,l])=>Xne(d,l)):void 0}],logger:t,telemetry:n??e.telemetry??e.extensionContext?.telemetry}),a=Hne(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 Yne,createPolykvClient as hD,deferPolykvLeadClose as pD,engineSessionId as Xf,getPolykvSession as zu,getPolykvWindowGrant as Jne,hasOpencotiFeature as Qne,normalizeProviderId as Ys,OPENCOTI_FEATURES as Zne,polykvEffectiveWindow as ere,polykvWorkerChargedTo as tre,probeOpencotiProps as mD,readOpencotiKv as nre,releasePolykvLead as rre,setPolykvSession as ore,withXollamaAuth as lS,XOLLAMA_DEFAULT_BASE_URL as cS,xollamaDrivesModel as ire,xollamaEngineFetch as fD,xollamaEngineRoot as gD}from"@cerebriline/llms";import{hasPromptEnvironment as sre}from"@cerebriline/shared";var Yf=0.85;function Ku(e){return e?.providerId!==void 0&&Ys(e.providerId)==="opencoti"&&Boolean(e.baseUrl)&&e.polykv?.enabled!==!1}function Ko(e){return Ku(e)||e?.providerId!==void 0&&Ys(e.providerId)==="xollama"&&e.polykv?.enabled!==!1}async function yD(e){if(!e.modelId||e.polykv?.enabled===!1)return!1;let t=e.baseUrl||cS,n={...e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{},...e.headers??{}};return ire(t,e.modelId,lS(e.fetch??fetch,t,n))}async function Js(e){if(e?.providerId===void 0)return;let t=Ys(e.providerId);if(t==="opencoti")return e.baseUrl?e:void 0;if(t!=="xollama"||!e.modelId)return;if(!await yD(e).catch(()=>!1))return;let n=e.baseUrl||cS,r={...e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{},...e.headers??{}},{headers:o,...i}=e;return{...i,providerId:"opencoti",baseUrl:gD(n,e.modelId),fetch:fD(lS(e.fetch??fetch,n,r))}}async function are(e,t){let n=t.providerConfig;if(!n.modelId)return;let r=n.baseUrl||cS,o={...n.apiKey?{Authorization:`Bearer ${n.apiKey}`}:{},...n.headers??{}},i=hD({baseUrl:gD(r,n.modelId),fetch:fD(lS(n.fetch??fetch,r,o))}),s=async()=>{try{let a=await i.closeSession(Xf(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(pD(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 uS(e){if(e?.providerId!==void 0&&Ys(e.providerId)==="xollama")return yD(e).catch(()=>!1);if(!e||!Ku(e))return!1;return(await mD(e.baseUrl,e.fetch).catch(()=>{return}))?.poolsEnabled===!0}function Xd(e){if(!e.baseUrl)return;return hD({baseUrl:e.baseUrl,...e.fetch?{fetch:e.fetch}:{},...e.headers?{headers:e.headers}:{}})}function dre(e){if(!e.systemPrompt)return;let t=lre(e.tools);return{messages:[{role:"system",content:e.systemPrompt}],...t.length>0?{tools:t}:{}}}function lre(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 cre(e){let t=e.replace(/[ \t]+$/,"");return t.endsWith(`
|
|
492
492
|
`)?t:`${t}
|
|
493
493
|
`}async function wD(e){if(!e.sessionId||!Ku(e.providerConfig)||e.providerConfig.polykvWorker)return;let t=zu(e.sessionId);if(t)return t.poolId;if(sre(e.systemPrompt))return;let n=Xd(e.providerConfig);if(!n)return;try{let r=dre({...e.systemPrompt?{systemPrompt:e.systemPrompt}:{},...e.tools?{tools:e.tools}:{}});if(!r)return;let o=cre(await n.applyTemplate(r));if(o.trim()==="")return;let i=await n.createPool({prompt:o,pin:!0,session_id:e.sessionId});return ore(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 bD=5000,Gf=new Map;function ure(e){if(e===void 0){Gf.clear();return}Gf.delete(e)}async function Yd(e){let t=zu(e.sessionId);if(!t||e.providerConfig.polykv?.enabled===!1)return;let n=await Js(e.providerConfig),r=n?Xd(n):void 0;if(!r)return;let o=e.sessionId??"",i=Gf.get(o);if(i&&i.poolId===t.poolId&&Date.now()-i.at<bD)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 Gf.set(o,{at:Date.now(),poolId:t.poolId,value:s}),s}var Vf=new Map;function vD(){Vf.clear()}async function hS(e){let t=await pS(e);if(!t||!e.sessionId)return;let n=Xf(e.sessionId),r=e.providerConfig.polykvWorker?tre(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 pS(e){if(!e.sessionId)return;let t=await Js(e.providerConfig);if(!t?.baseUrl)return;let n=Vf.get(e.sessionId);if(n&&Date.now()-n.at<bD)return n.value;let r;try{r=await nre(t.baseUrl,t.fetch)}catch(o){e.logger?.debug?.(`[PolyKV] Allocations unavailable: ${o instanceof Error?o.message:String(o)}`),r=void 0}return Vf.set(e.sessionId,{at:Date.now(),value:r}),r}function kD(e,t,n){let r=typeof t==="number"&&t>0&&t<=1?t:Yf,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 TD(e,t,n){if(t===void 0||Ys(t)!=="opencoti"&&Ys(t)!=="xollama")return;let r=ere(Jne(e));if(r===void 0)return;if(typeof n==="number"&&Number.isFinite(n)&&n>0&&r>=n)return;return r}async function SD(e){let t=zu(e.sessionId);if(!e.sessionId||!t||!Ku(e.providerConfig))return;if(t.layout==="borrowed"||e.sessionCellsReleased)return t.poolId;let n=Xd(e.providerConfig);if(!n)return t.poolId;let r=Xf(e.sessionId);try{if((await hS({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 xD(e){if(!e.sessionId)return;let t=e.sessionId,n=zu(t);if(await rre(t).catch(()=>{return}),Yne(t),ure(t),Vf.delete(t),e.providerConfig.providerId!==void 0&&Ys(e.providerConfig.providerId)==="xollama"){await are(t,e);return}let r=Xd(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 mD(e.providerConfig.baseUrl,e.providerConfig.fetch).catch(()=>{return});if(!Qne(o?.features,Zne.sessionClose))return;let i=async()=>{try{let s=await r.closeSession(Xf(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(pD(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 _D(e){if(!e.sessionId||!Ku(e.providerConfig))return;let t=Xd(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=zu(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 ED(e){let t=Xd(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 kre=new Set(["opencoti","ollama","xollama","lmstudio","openai-compatible"]),RD=256,Tre=3,Jf=512,Sre=3,ID=[2000,4000,8000,15000,30000];function MD(e){return Math.ceil(e/RD)*RD}function Di(e){return Math.ceil(Math.max(0,e)/Tre)}function fS(e,t){return MD(Di(e)+Math.max(0,t)+Jf)}class gS extends Error{errorClass;constructor(e,t){super(e);this.errorClass=t;this.name="ContinuationCallError"}}function xre(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 _re=async(e,t)=>{let n=e.providerConfig,r=Kf({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:xre(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=Qf(c,u.usage);break;case"finish":if(u.reason==="error")throw new gS(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 Qf(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 Ere(e){if(!e||e.promptTokens===void 0)return;return e.engine==="ollama"?Math.max(0,e.promptTokens-(e.cachedTokens??0)):e.promptTokens}function yS(e){return{...e?{onUsage:e}:{},prefillTokens:0,unmeasuredCalls:0,calls:0,peakBookedCells:0,criticCacheN:[],siblingCacheN:[],released:[],leaked:[],notes:[]}}function wS(e,t,n,r){if(!e)return;if(e.calls+=1,e.usage=Qf(e.usage,r),r&&e.onUsage)try{e.onUsage(r)}catch{}let o=Ere(t)??n;if(o===void 0){e.unmeasuredCalls+=1;return}e.prefillTokens+=o}var Are=0;function Rre(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 Ire(e){if(e instanceof gS)return yre(e.message,e.errorClass)!==void 0;return wre(e)!==void 0}function Gu(e,t){let n=fre(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(!kre.has(n))return`${n||"this provider"} keeps no prefix a continuation could share`;return}async function OD(e){let t=e.providerConfig,n=Gu(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=KT(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 ${Uf} + summary ${i-Uf} > ${r})`};let s="continuation",a="prompt-cache continuation",d,l=[],c=!1,u,h=await Js(t),p=h!==void 0,m=pre(t.engineSessionId||e.sessionId||"");if(h?.baseUrl&&m){let g=await gre(h.baseUrl,h.fetch).catch(()=>{return});if(l=g?.features??[],c=g?.poolsEnabled===!0,d=hre({baseUrl:h.baseUrl,...h.fetch?{fetch:h.fetch}:{},...h.headers?{headers:h.headers}:{}}),u=(Go(l,Vo.kvStatus)?await PD(h.baseUrl,h.fetch).catch(()=>{return}):void 0)?.allocations.find((x)=>x.sessionId===m),!(t.polykv?.enabled!==!1&&c&&Go(l,Vo.subpools)&&Go(l,Vo.sessionClose)&&Go(l,Vo.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 f=new LD({input:e,path:s,reason:a,wireId:m,opencoti:p,features:l,held:u,prefixPooled:p&&c&&t.polykv?.enabled!==!1&&(Boolean(t.polykvWorker)||mre(e.sessionId)!==void 0||vre(e.systemPrompt)),...d?{client:d}:{}});return await f.start(),{continuation:f,reason:f.reason}}class LD{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??yS(),this.path=e.path,this.reason=e.reason,this.serial=e.input.serial??++Are}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 (${Ni(e)}); prompt-cache continuation`,this.note(this.reason)}}async call(e,t){let n=this.input.model??_re,r=this.input.sleep??Rre;for(let o=0;;o+=1)try{let i=await n(e,this.logger);return wS(this.meter,i.timings,void 0,i.usage),i}catch(i){if(this.input.abortSignal?.aborted)throw i;if(!Ire(i))throw i;if(t.boundedWaits&&o>=Sre)throw i;let s=ID[Math.min(o,ID.length-1)];this.logger?.log(`[compaction] ${e.purpose} queued by the server; retrying in ${s}ms (${bre(Ni(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&&Go(this.state.features,Vo.guaranteedAlloc)){let i=MD(Math.ceil(this.input.requestTokens*1.1)+Di(e.length)+t+Jf);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=Di(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 (${Ni(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 (${Ni(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(Go(this.state.features,Vo.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+Di((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 Js(this.input.providerConfig);if(!t?.baseUrl)return;let r=(await PD(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}
|
|
494
494
|
|
package/dist/index.d.ts
CHANGED
|
@@ -174,6 +174,7 @@ export type { EscalationApproval } from "./runtime/escalation/escalation-session
|
|
|
174
174
|
export { isClineAccountFeatureEnabled } from "./services/feature-flags/cline-account-feature-flags";
|
|
175
175
|
export { applyClineFeaturedModels, type ClineRecommendedModel, type ClineRecommendedModelsData, FALLBACK_CLINE_RECOMMENDED_MODELS, type FetchClineRecommendedModelsOptions, fetchClineRecommendedModels, getCachedClineRecommendedModels, peekClineRecommendedModels, resetClineRecommendedModelsCacheForTests, } from "./services/llms/cline-recommended-models";
|
|
176
176
|
export { createAgentModelFromConfig } from "./services/llms/handler-factory";
|
|
177
|
+
export { applyModelRequestCapture, createModelRequestWriter, type ModelRequestCaptureOptions, modelRequestCaptureDir, } from "./services/llms/model-request-files";
|
|
177
178
|
export { clearLiveModelsCatalogCache, clearPrivateModelsCatalogCache, DEFAULT_MODELS_CATALOG_URL, getLiveModelsCatalog, getProviderConfig, isPrivateModelCatalogProvider, OPENAI_COMPATIBLE_PROVIDERS, resolveProviderConfig, } from "./services/llms/provider-defaults";
|
|
178
179
|
export type { AuthSettings, AwsSettings, AzureSettings, BuiltInProviderId, GcpSettings, ModelCatalogConfig, ModelCatalogSettings, OcaSettings, ProviderCapability, ProviderClient, ProviderConfig, ProviderDefaultsConfig, ProviderId, ProviderProtocol, ProviderSettings, ReasoningSettings, SamplingSettings, SapSettings, ToProviderConfigOptions, } from "./services/llms/provider-settings";
|
|
179
180
|
export { AuthSettingsSchema, AwsSettingsSchema, AzureSettingsSchema, BUILT_IN_PROVIDER, BUILT_IN_PROVIDER_IDS, createProviderConfig, GcpSettingsSchema, isBuiltInProviderId, ModelCatalogSettingsSchema, normalizeProviderId, OcaSettingsSchema, ProviderClientSchema, ProviderIdSchema, ProviderProtocolSchema, ProviderSettingsSchema, parseSettings, ReasoningSettingsSchema, SamplingSettingsSchema, SapSettingsSchema, safeCreateProviderConfig, safeParseSettings, toProviderConfig, } from "./services/llms/provider-settings";
|