@cerebriline/core 4.100.256 → 4.100.257
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cloud/index.js +1 -1
- package/dist/extensions/tools/librarian-tools.d.ts +18 -0
- package/dist/hub/daemon/entry.js +1 -1
- package/dist/hub/index.js +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +629 -629
- package/dist/remote/remote-helper-entry.js +1 -1
- package/dist/remote/remote-helper.js +1 -1
- package/dist/services/retrieval/tar-extract.d.ts +5 -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,Wt(),e,n).changes??0)===1}attachReportPathToRun(e,t){this.db.prepare("UPDATE cron_runs SET report_path = ?, updated_at = ? WHERE run_id = ?").run(t,Wt(),e)}}function gf(e){return e?new Date(e).getTime():void 0}function l7(e){let t=e.metadata?{...e.metadata}:void 0;if(t)delete t.__hubScheduleCreatedBy,delete t.__hubScheduleCwd,delete t.__hubRuntimeOptions;return t}function xu(e){let t=e.metadata;return{scheduleId:e.externalId,name:e.title,cronPattern:e.triggerKind==="one_off"?_u: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:gf(e.nextRunAt),lastRunAt:gf(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:l7(e)}}function c7(e){switch(e){case"done":return"success";case"cancelled":return"aborted";case"running":return"running";case"queued":return"pending";default:return"failed"}}function Vk(e,t){return{executionId:e.runId,scheduleId:t,sessionId:e.sessionId,triggeredAt:new Date(e.scheduledFor??e.createdAt).getTime(),startedAt:gf(e.startedAt),endedAt:gf(e.completedAt),status:c7(e.status),errorMessage:e.error}}class yf{store;materializer;runner;started=!1;disposed=!1;constructor(e){this.store=new Su({dbPath:e.dbPath}),this.materializer=new gu({store:this.store}),this.runner=new wu({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===_u?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 xu(this.store.createHubSchedule({...e,timezone:t}))}getSchedule(e){let t=this.store.getHubSchedule(e);return t?xu(t):void 0}listSchedules(e={}){return this.store.listHubSchedules(e).map((t)=>xu(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=xu(n),s=t.cronPattern??i.cronPattern;if(s.trim()===_u&&typeof t.timezone==="string"&&t.timezone.trim())throw Error("timezone is only supported for recurring schedules");if(this.validateScheduleTiming(s,s.trim()===_u?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?xu(a):void 0}validateScheduleTiming(e,t,n,r){if(e.trim()!==_u){TO(e),zk(t);return}if(t?.trim())throw Error("timezone is only supported for recurring schedules");let o=n?.[d7];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 Vk(n,e)}triggerScheduleNowDetached(e){let t=this.store.enqueueHubScheduleRun(e,"manual");if(!t)return;return this.runner.tick().catch(()=>{return}),Vk(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 Vk(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 Yk,statSync as u7}from"node:fs";import{isAbsolute as OO,relative as h7,sep as LO}from"node:path";import{ONE_TIME_SCHEDULE_CRON_PATTERN as NO,ONE_TIME_SCHEDULE_RUN_AT_METADATA_KEY as DO}from"@cerebriline/shared";import{z as St}from"zod";var p7=St.enum(["create","update","list","get","pause","resume","delete","run_now"]),m7=St.object({provider_id:St.string().min(1),model_id:St.string().min(1).optional()}),Pd=St.object({operation:p7,schedule_id:St.string().min(1).optional(),schedule_type:St.enum(["once","recurring"]).optional(),name:St.string().min(1).optional(),prompt:St.string().min(1).optional(),run_at:St.string().datetime({offset:!0}).optional(),cron_pattern:St.string().min(1).optional(),timezone:St.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:St.boolean().optional(),mode:St.enum(["act","plan","yolo"]).optional(),system_prompt:St.string().nullable().optional(),max_iterations:St.number().int().positive().nullable().optional(),timeout_seconds:St.number().int().positive().nullable().optional(),max_parallel:St.number().int().positive().max(32).optional(),tags:St.array(St.string().min(1)).optional(),model_selection:m7.optional(),limit:St.number().int().positive().max(200).optional()});function Rd(e,t,n,r){if(!$O.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 $O=new Set(["create","update","pause","resume","delete","run_now"]);function Cd(e,t){let n=e?.trim();if(!n)throw Error(`${t} is required for this operation`);return n}function Jk(e,t){try{let n=Yk.native(e);if(!u7(n).isDirectory())throw Error("not a directory");return n}catch{throw Error(`${t} does not resolve to an existing safe path`)}}function f7(e,t){try{return Yk.native(e)===Yk.native(t)}catch{return!1}}function FO(e,t,n){let r=h7(e,t);if(r===".."||r.startsWith(`..${LO}`)||OO(r))throw Error(`${n} is outside the workspace scope`)}function UO(e,t,n){return Jk(OO(t)?t:`${e}${LO}${t}`,n)}function g7(e){let t=Jk(e.workspaceRoot,"workspaceRoot"),n=e.cwd?UO(t,e.cwd,"cwd"):t;return FO(t,n,"cwd"),{...e,workspaceRoot:t,cwd:n}}function Id(e,t){if(!e)throw Error("schedule does not exist");if(!f7(e.workspaceRoot,t.workspaceRoot))throw Error("schedule is outside this session's workspace scope");let n=Jk(e.workspaceRoot,"schedule workspaceRoot");if(e.cwd){let r=UO(n,e.cwd,"schedule cwd");FO(n,r,"schedule cwd")}}function MO(e){if(!e)return;return{providerId:e.provider_id.trim(),modelId:e.model_id?.trim()||void 0}}function Xk(e){if(!e)return;return[...new Set(e.map((t)=>t.trim()).filter(Boolean))]}function BO(e){let t=Date.parse(Cd(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 y7(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:NO,metadata:{[DO]:BO(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:Cd(e.cron_pattern,"cron_pattern"),timezone:e.timezone?.trim()||void 0}}throw Error("schedule_type is required for create")}function w7(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:NO,timezone:null,metadata:{[DO]:BO(e.run_at)}}}if(e.schedule_type==="recurring"||e.cron_pattern)return{cronPattern:Cd(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 Eu(e){return Cd(e.schedule_id,"schedule_id")}async function Qk(e,t,n){let r=Pd.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=g7(i);if($O.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:Cd(o.name,"name"),...y7(o),prompt:Cd(o.prompt,"prompt"),workspaceRoot:s.workspaceRoot,cwd:s.cwd,modelSelection:MO(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:Xk(o.tags)});return e.publish?.("schedule.created",{schedule:a},n.sessionId),Rd(e,o,n,!0),{ok:!0,operation:o.operation,schedule:a}}case"update":{let a=Eu(o);Id(e.schedules.getSchedule(a),s);let d=e.schedules.updateSchedule(a,{scheduleId:a,...w7(o),name:o.name?.trim()||void 0,prompt:o.prompt?.trim()||void 0,modelSelection:MO(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:Xk(o.tags)});if(!d)throw Error("schedule does not exist");return e.publish?.("schedule.updated",{schedule:d},n.sessionId),Rd(e,o,n,!0),{ok:!0,operation:o.operation,schedule:d}}case"list":{let a=e.schedules.listSchedules({enabled:o.enabled,tags:Xk(o.tags),workspaceRoot:s.workspaceRoot,limit:o.limit??50}).filter((d)=>{try{return Id(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(Eu(o));return Id(a,s),{ok:!0,operation:o.operation,schedule:a}}case"pause":case"resume":{let a=Eu(o);Id(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),Rd(e,o,n,!0),{ok:!0,operation:o.operation,schedule:d}}case"delete":{let a=Eu(o);Id(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),Rd(e,o,n,!0),{ok:!0,operation:o.operation,deleted:d}}case"run_now":{let a=Eu(o);Id(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),Rd(e,o,n,!0),{ok:!0,operation:o.operation,execution:d}}}}catch(i){return Rd(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 z7}from"@cerebriline/llms";import{markOtlpTraceRelayProvider as K7}from"@cerebriline/shared";import{metrics as G7,trace as V7}from"@opentelemetry/api";import{logs as X7}from"@opentelemetry/api-logs";import{OTLPLogExporter as Y7}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as J7}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as Q7}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as Z7}from"@opentelemetry/resources";import{BatchLogRecordProcessor as eQ,ConsoleLogRecordExporter as tQ,LoggerProvider as nQ}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as rQ,MeterProvider as oQ,PeriodicExportingMetricReader as oL}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as iQ,ConsoleSpanExporter as sQ,SimpleSpanProcessor as aQ}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as dQ}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as lQ,ATTR_SERVICE_VERSION as cQ}from"@opentelemetry/semantic-conventions";import{mkdirSync as b7,readFileSync as v7,statSync as k7,writeFileSync as T7}from"node:fs";import{dirname as S7}from"node:path";import{CONFIGURABLE_MODEL_TOOL_NAMES as HO}from"@cerebriline/shared";import{resolveGlobalSettingsPath as WO}from"@cerebriline/shared/storage";import{z as Dt}from"zod";var Zk=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}),x7=Dt.enum(["basic","agentic"]).catch("agentic"),_7=Dt.partialRecord(Dt.enum(HO),Dt.object({enabled:Dt.boolean()}).strip()).optional(),E7=Dt.record(Dt.string(),Dt.object({enabled:Dt.boolean()}).strip()).optional().catch(void 0),A7=Dt.enum(["plan","act"]),eT=Dt.object({telemetryOptOut:Dt.boolean().default(!1).catch(!1),autoUpdateEnabled:Dt.boolean().default(!0).catch(!0),compactionStrategy:x7.optional(),compactionEnabled:Dt.boolean().optional().catch(void 0),planActMode:A7.optional().catch(void 0),toolAutoApprove:Dt.boolean().optional().catch(void 0),tuiTheme:Dt.string().optional().catch(void 0),disabledTools:Zk.optional(),tools:_7,disabledPlugins:Zk.optional(),disabledAgentPlugins:Zk.optional(),bundledSkills:E7}).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 wf(){return eT.parse({})}var bf;function R7(){bf=void 0}function I7(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 C7(e){let t;try{t=v7(e,"utf8")}catch{return{value:wf(),loadFailed:!0}}try{let n=eT.safeParse(JSON.parse(t));return n.success?{value:n.data,loadFailed:!1}:{value:wf(),loadFailed:!0}}catch{return{value:wf(),loadFailed:!0}}}function jO(){let e=WO(),t=k7(e,{throwIfNoEntry:!1}),n=t?.mtimeMs??0,r=t?.size??0,o=bf;if(o&&o.path===e&&o.mtimeMs===n&&o.size===r)return o;let i=t?C7(e):{value:wf(),loadFailed:!1},s=I7(i.value);return bf={path:e,mtimeMs:n,size:r,value:s,loadFailed:i.loadFailed},bf}function hn(){return jO().value}function Ds(e,t={}){let n=WO(),r=hn();b7(S7(n),{recursive:!0});let o=eT.parse(e);if(!r.telemetryOptOut&&o.telemetryOptOut)$M(t.telemetry);T7(n,`${JSON.stringify(o,null,2)}
|
|
321
|
-
`,"utf8"),R7()}function qO(){return hn().telemetryOptOut}function $s(e){return new Set(e??hn().disabledTools??[])}function zO(e){return new Set(e??hn().disabledPlugins??[])}function Au(e){return new Set(e??hn().disabledAgentPlugins??[])}function KO(e){return HO.includes(e)}function P7(){let e=jO();return{web_search:{enabled:!e.loadFailed},...e.value.tools}}function tT(e){return P7()[e]?.enabled===!0}function M7(e,t){let n=hn();Ds({...n,tools:{...n.tools,[e]:{enabled:t}}})}function GO(e){if(KO(e)){let o=tT(e);return M7(e,!o),o}let t=hn(),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 O7(e,t){let n=[...new Set(e.map((s)=>s.trim()).filter(Boolean))];if(n.length===0)return;let r=hn(),o=$s(r.disabledTools),i={...r.tools};for(let s of n){if(KO(s)){i[s]={enabled:!t};continue}if(t)o.add(s);else o.delete(s)}Ds({...r,disabledTools:[...o],tools:i})}function VO(e,t){return O7([e],t),t}function XO(e,t){let n=e.trim();if(!n)return;let r=hn(),o=zO(r.disabledPlugins);if(t)o.add(n);else o.delete(n);Ds({...r,disabledPlugins:[...o]})}function YO(e,t){let n=e.trim();if(!n)return;let r=hn(),o=Au(r.disabledAgentPlugins);if(t)o.add(n);else o.delete(n);Ds({...r,disabledAgentPlugins:[...o]})}function JO(e,t){let n=zO(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 QO(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 L7,mkdirSync as N7,readFileSync as D7,writeFileSync as $7}from"node:fs";import{resolve as F7}from"node:path";import{resolveSessionDataDir as U7}from"@cerebriline/shared/storage";import{nanoid as B7}from"nanoid";import*as H7 from"node-machine-id";var W7="machine-id",ZO,eL=!1;function tL(){if(!eL)ZO=nL(),eL=!0;return ZO??rL()}function Ru(e){let t=e?.trim();if(t)return t;let n=nL();if(n)return n;return rL()}function j7(){let e=H7;return e.machineIdSync??e.default?.machineIdSync}function nL(){try{let e=j7();if(!e)return;return e().trim()||void 0}catch{return}}function rL(){let e=U7(),t=F7(e,W7);try{if(L7(t)){let r=D7(t,"utf8").trim();if(r.length>0)return r}}catch{}let n=`cl-${B7()}`;try{N7(e,{recursive:!0}),$7(t,n,"utf8")}catch{}return n}class nT{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(q7(d)){o[l]=d;continue}try{o[l]=JSON.stringify(d)}catch{o[l]=String(d)}}return o}}function q7(e){return typeof e==="string"||typeof e==="number"||typeof e==="boolean"}class rT{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 vf{adapters;metadata;distinctId;deviceId;commonProperties;constructor(e={}){if(this.adapters=[...e.adapters??[]],e.logger)this.adapters.push(new rT({logger:e.logger}));this.metadata={...e.metadata??{}},this.distinctId=e.distinctId,this.deviceId=e.deviceId??tL(),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 iL{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 sL{meterProvider;loggerProvider;tracerProvider;options;constructor(e={}){this.options=e;let t=Z7({[lQ]:e.serviceName??"cline",...e.serviceVersion?{[cQ]:e.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(t),this.loggerProvider=this.createLoggerProvider(t),this.tracerProvider=this.createTracerProvider(t),this.meterProvider)G7.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)X7.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(e="cline",t){return V7.getTracer(e,t??this.options.serviceVersion)}createAdapter(e){return new nT({...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 vf({...e,adapters:[t],distinctId:Ru(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=oT(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)=>fQ(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 oQ({resource:e,readers:o})}createTracerProvider(e){let t=oT(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=mQ(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 dQ({resource:e,spanProcessors:i?[new z7,...o]:o});if(i)K7(s);return s}createLoggerProvider(e){let t=oT(this.options.logsExporter);if(t.length===0)return null;let n=t.map((r)=>{let o=pQ(r,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!o)return null;return new eQ(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 nQ({resource:e,processors:n})}}function uQ(e){let t=new sL(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 aL(e){if(qO())return{telemetry:new iL(e)};if(e.enabled!==!0)return{telemetry:new vf({...e,distinctId:Ru(e.distinctId)})};return uQ(e)}function hQ(e){let{telemetry:t,provider:n,emitProviderCreated:r}=aL(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 oT(e){if(!e)return[];return(Array.isArray(e)?e:e.split(",")).map((n)=>n.trim()).filter((n)=>n==="console"||n==="otlp")}function pQ(e,t){if(e==="console")return new tQ;if(!t.endpoint)return null;let n=iT(t.endpoint,"/v1/logs");return new Y7({url:n,headers:t.headers})}function mQ(e,t){if(e==="console")return new aQ(new sQ);if(!t.endpoint)return null;let n=iT(t.endpoint,"/v1/traces");return new iQ(new Q7({url:n,headers:t.headers}))}function fQ(e,t){if(e==="console")return new oL({exporter:new rQ,exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout});if(!t.endpoint)return null;let n=iT(t.endpoint,"/v1/metrics");return new oL({exporter:new J7({url:n,headers:t.headers}),exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout})}function iT(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 vQ,zodToJsonSchema as kQ}from"@cerebriline/shared";import{z as Zr}from"zod";import{resolve as dL}from"node:path";import{z as Ce}from"zod";var lL=Ce.enum(["suggestion","follow-up","todo","handoff","idea","reminder"]),gQ=Ce.enum(["pending_approval","approved","in_progress","completed","failed","cancelled","expired"]),cL=Ce.union([Ce.literal(0),Ce.literal(1),Ce.literal(2),Ce.literal(3),Ce.literal(4),Ce.literal(5)]),yQ=Ce.object({provider_id:Ce.string().min(1),model_id:Ce.string().min(1).optional()}),kf=Ce.object({operation:Ce.enum(["create","update","list","get"]),task_id:Ce.string().min(1).optional(),expected_revision:Ce.number().int().positive().optional(),type:lL.optional(),title:Ce.string().min(1).optional(),description:Ce.string().nullable().optional(),instructions:Ce.string().min(1).optional(),scope:Ce.enum(["workspace","global"]).optional(),workspace_root:Ce.string().min(1).nullable().optional(),cwd:Ce.string().min(1).nullable().optional(),resource_paths:Ce.array(Ce.string().min(1)).optional(),priority:cL.optional(),assignee:Ce.string().min(1).nullable().optional(),model_selection:yQ.nullable().optional(),mode:Ce.enum(["act","plan","yolo"]).nullable().optional(),system_prompt:Ce.string().nullable().optional(),max_iterations:Ce.number().int().positive().nullable().optional(),timeout_seconds:Ce.number().int().positive().nullable().optional(),available_at:Ce.string().datetime().optional(),expires_at:Ce.string().datetime().optional(),automation_eligible:Ce.boolean().optional(),statuses:Ce.array(gQ).optional(),types:Ce.array(lL).optional(),priorities:Ce.array(cL).optional(),limit:Ce.number().int().positive().max(500).optional()}),wQ=new Set(["create","update"]);function sT(e,t,n,r){if(!wQ.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 Md(e,t){let n=e?.trim();if(!n)throw Error(`${t} is required for this operation`);return n}function uL(e){if(e===void 0||e===null)return e;return{providerId:e.provider_id,modelId:e.model_id}}function pL(e,t){return dL(e)===dL(t)}function hL(e,t){if(!e)throw Error("task does not exist");if(t.workspaceRoot){if(e.scope!=="workspace"||!e.workspaceRoot||!pL(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 bQ(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||!pL(e.workspace_root,t.workspaceRoot))throw Error(`this session can only manage ${n} tasks`)}return n}async function mL(e,t,n){let r=kf.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=bQ(o,s);switch(o.operation){case"create":{let d={type:Md(o.type,"type"),title:Md(o.title,"title"),description:o.description??void 0,instructions:Md(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:uL(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:Md(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 sT(e,o,n,!0),l}case"update":{let d=Md(o.task_id,"task_id");if(hL(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:uL(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 sT(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(Md(o.task_id,"task_id"));return hL(d,s),{ok:!0,operation:o.operation,task:d}}}}catch(s){return sT(e,o,n,!1),{ok:!1,operation:o.operation,error:{code:"task_operation_failed",message:s instanceof Error?s.message:String(s)}}}}var Iu="tasks",fL='# 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.',TQ="# 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.",SQ=kf.extend({kind:Zr.literal("todo")}).strict(),gL=Pd.extend({kind:Zr.literal("scheduled")}).strict(),yL=Zr.discriminatedUnion("kind",[SQ,gL]),xQ=Zr.discriminatedUnion("kind",[gL]),wL=["create","update","list","get","pause","resume","delete","run_now"],_Q=Zr.object({...Pd.shape,...kf.shape,kind:Zr.enum(["todo","scheduled"]),operation:Zr.enum(wL)}).strict(),EQ=Zr.object({...Pd.shape,kind:Zr.enum(["scheduled"]),operation:Zr.enum(wL)}).strict();function aT(e){let t=e.todo;return vQ({name:Iu,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:kQ(t?_Q:EQ),retryable:!1,maxRetries:0,execute:async(n,r)=>{let o=(t?yL:xQ).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 mL(t,o.data,r)}}return{kind:"scheduled",...await Qk(e.scheduled,o.data,r)}}})}function dT(e){return{name:"hub-task-guidance",manifest:{capabilities:["rules"]},setup:(t)=>{t.registerRule({id:"hub:task-guidance",content:e?.todoEnabled===!1?TQ:fL,whenToolAvailable:Iu})}}}import{createSessionId as UZ,ensureLoopbackProxyBypass as zL,isHubProtocolCompatible as BZ,resolveClineBuildEnv as HZ,resolveHubCommandTimeoutMs as WZ}from"@cerebriline/shared";import jZ from"ws";var Tf="0.0.92";var Oi={name:"@cerebriline/core",description:"Cline Core SDK for Node Runtime",version:Tf,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 Sf="session_not_found";class Od 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 xf(e){return e instanceof Od||typeof e==="object"&&e!==null&&"code"in e&&e.code==="session_not_found"}import{spawn as sZ}from"node:child_process";import{closeSync as aZ,mkdirSync as dZ,openSync as lZ,readFileSync as cZ,unlinkSync as uZ}from"node:fs";import{basename as hZ,dirname as pZ,join as mZ}from"node:path";import{fileURLToPath as fZ}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as gZ,isBunEmbeddedModulePath as yZ,isHubDaemonProcess as $L,resolveClineBuildEnv as FL,withResolvedClineBuildEnv as wZ}from"@cerebriline/shared";import{createHash as AQ,randomBytes as _L}from"node:crypto";import{existsSync as RQ}from"node:fs";import{mkdir as cT,open as vL,readFile as EL,rename as IQ,rm as _f,writeFile as CQ}from"node:fs/promises";import{dirname as AL,join as uT}from"node:path";import{ensureLoopbackProxyBypass as PQ,isHubProtocolCompatible as MQ}from"@cerebriline/shared";import{resolveClineDataDir as Cu,resolveClineDir as Mqe}from"@cerebriline/shared/storage";var OQ="CLINE_HUB_DISCOVERY_PATH",LQ="CLINE_HUB_BUILD_ID",NQ="CLINE_HUB_BUILD_EPOCH_MS",DQ=30000,$Q=15000,kL=100;function FQ(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function UQ(e){return AQ("sha256").update(e).digest("hex").slice(0,12)}function BQ(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 RL(){return _L(32).toString("hex")}function TL(e){return new Promise((t)=>setTimeout(t,e))}function HQ(e){return`${e}.lock`}async function WQ(e){try{let t=JSON.parse(await EL(uT(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 lT(e){await _f(e,{recursive:!0,force:!0}).catch(()=>{return})}function eo(){let e=process.env[LQ]?.trim();if(e)return e;return"sdk-v1-23120533a7f345ddbfd34d1a5748b86d6ec8938e212d48c858a97c4f4f491d6a".trim()||`source-${String(Oi.version)}`}function hT(){let e=Number(process.env[NQ]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1792702729766)?1792702729766:void 0}function Fs(e,t=eo()){let n=MQ(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 SL(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0}function xL(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 jQ(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 Pu(e,t){let n=e.buildId?.trim(),r=t.buildId?.trim();if(n&&r&&n===r)return 0;let o=SL(e.buildEpochMs),i=SL(t.buildEpochMs);if(o!==void 0&&i!==void 0&&o!==i)return o<i?-1:1;let s=xL(e.coreVersion),a=xL(t.coreVersion);if(s&&a){let d=jQ(s,a);if(d!==0)return d}if(n&&r&&n!==r)return n<r?-1:1;return 0}function Mu(){return{buildId:eo(),buildEpochMs:hT(),coreVersion:String(Oi.version)}}function Ld(e,t){let n=t?.self??Mu(),r=Fs(e,n.buildId??"");if(r.compatible)return!0;if(r.reason!=="build_mismatch"&&r.reason!=="missing_build")return!1;return Pu(n,e)<=0}function Us(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${UQ(e)}`,n=process.env[OQ]?.trim()||uT(Cu(),"locks","hub","owners",`${FQ(t)}.json`);return{ownerId:t,discoveryPath:n}}function Lqe(e=`hub-${Date.now().toString(36)}`){return Us(e)}async function jt(e){try{let t=JSON.parse(await EL(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 Ef(e,t,n){await pT(e,async()=>{let r=AL(e);await cT(r,{recursive:!0});let o=`${e}.${process.pid}.${_L(6).toString("hex")}.tmp`,i;try{i=await vL(o,"wx",384),await i.writeFile(`${JSON.stringify(t,null,2)}
|
|
321
|
+
`,"utf8"),R7()}function qO(){return hn().telemetryOptOut}function $s(e){return new Set(e??hn().disabledTools??[])}function zO(e){return new Set(e??hn().disabledPlugins??[])}function Au(e){return new Set(e??hn().disabledAgentPlugins??[])}function KO(e){return HO.includes(e)}function P7(){let e=jO();return{web_search:{enabled:!e.loadFailed},...e.value.tools}}function tT(e){return P7()[e]?.enabled===!0}function M7(e,t){let n=hn();Ds({...n,tools:{...n.tools,[e]:{enabled:t}}})}function GO(e){if(KO(e)){let o=tT(e);return M7(e,!o),o}let t=hn(),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 O7(e,t){let n=[...new Set(e.map((s)=>s.trim()).filter(Boolean))];if(n.length===0)return;let r=hn(),o=$s(r.disabledTools),i={...r.tools};for(let s of n){if(KO(s)){i[s]={enabled:!t};continue}if(t)o.add(s);else o.delete(s)}Ds({...r,disabledTools:[...o],tools:i})}function VO(e,t){return O7([e],t),t}function XO(e,t){let n=e.trim();if(!n)return;let r=hn(),o=zO(r.disabledPlugins);if(t)o.add(n);else o.delete(n);Ds({...r,disabledPlugins:[...o]})}function YO(e,t){let n=e.trim();if(!n)return;let r=hn(),o=Au(r.disabledAgentPlugins);if(t)o.add(n);else o.delete(n);Ds({...r,disabledAgentPlugins:[...o]})}function JO(e,t){let n=zO(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 QO(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 L7,mkdirSync as N7,readFileSync as D7,writeFileSync as $7}from"node:fs";import{resolve as F7}from"node:path";import{resolveSessionDataDir as U7}from"@cerebriline/shared/storage";import{nanoid as B7}from"nanoid";import*as H7 from"node-machine-id";var W7="machine-id",ZO,eL=!1;function tL(){if(!eL)ZO=nL(),eL=!0;return ZO??rL()}function Ru(e){let t=e?.trim();if(t)return t;let n=nL();if(n)return n;return rL()}function j7(){let e=H7;return e.machineIdSync??e.default?.machineIdSync}function nL(){try{let e=j7();if(!e)return;return e().trim()||void 0}catch{return}}function rL(){let e=U7(),t=F7(e,W7);try{if(L7(t)){let r=D7(t,"utf8").trim();if(r.length>0)return r}}catch{}let n=`cl-${B7()}`;try{N7(e,{recursive:!0}),$7(t,n,"utf8")}catch{}return n}class nT{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(q7(d)){o[l]=d;continue}try{o[l]=JSON.stringify(d)}catch{o[l]=String(d)}}return o}}function q7(e){return typeof e==="string"||typeof e==="number"||typeof e==="boolean"}class rT{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 vf{adapters;metadata;distinctId;deviceId;commonProperties;constructor(e={}){if(this.adapters=[...e.adapters??[]],e.logger)this.adapters.push(new rT({logger:e.logger}));this.metadata={...e.metadata??{}},this.distinctId=e.distinctId,this.deviceId=e.deviceId??tL(),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 iL{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 sL{meterProvider;loggerProvider;tracerProvider;options;constructor(e={}){this.options=e;let t=Z7({[lQ]:e.serviceName??"cline",...e.serviceVersion?{[cQ]:e.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(t),this.loggerProvider=this.createLoggerProvider(t),this.tracerProvider=this.createTracerProvider(t),this.meterProvider)G7.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)X7.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(e="cline",t){return V7.getTracer(e,t??this.options.serviceVersion)}createAdapter(e){return new nT({...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 vf({...e,adapters:[t],distinctId:Ru(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=oT(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)=>fQ(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 oQ({resource:e,readers:o})}createTracerProvider(e){let t=oT(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=mQ(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 dQ({resource:e,spanProcessors:i?[new z7,...o]:o});if(i)K7(s);return s}createLoggerProvider(e){let t=oT(this.options.logsExporter);if(t.length===0)return null;let n=t.map((r)=>{let o=pQ(r,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!o)return null;return new eQ(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 nQ({resource:e,processors:n})}}function uQ(e){let t=new sL(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 aL(e){if(qO())return{telemetry:new iL(e)};if(e.enabled!==!0)return{telemetry:new vf({...e,distinctId:Ru(e.distinctId)})};return uQ(e)}function hQ(e){let{telemetry:t,provider:n,emitProviderCreated:r}=aL(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 oT(e){if(!e)return[];return(Array.isArray(e)?e:e.split(",")).map((n)=>n.trim()).filter((n)=>n==="console"||n==="otlp")}function pQ(e,t){if(e==="console")return new tQ;if(!t.endpoint)return null;let n=iT(t.endpoint,"/v1/logs");return new Y7({url:n,headers:t.headers})}function mQ(e,t){if(e==="console")return new aQ(new sQ);if(!t.endpoint)return null;let n=iT(t.endpoint,"/v1/traces");return new iQ(new Q7({url:n,headers:t.headers}))}function fQ(e,t){if(e==="console")return new oL({exporter:new rQ,exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout});if(!t.endpoint)return null;let n=iT(t.endpoint,"/v1/metrics");return new oL({exporter:new J7({url:n,headers:t.headers}),exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout})}function iT(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 vQ,zodToJsonSchema as kQ}from"@cerebriline/shared";import{z as Zr}from"zod";import{resolve as dL}from"node:path";import{z as Ce}from"zod";var lL=Ce.enum(["suggestion","follow-up","todo","handoff","idea","reminder"]),gQ=Ce.enum(["pending_approval","approved","in_progress","completed","failed","cancelled","expired"]),cL=Ce.union([Ce.literal(0),Ce.literal(1),Ce.literal(2),Ce.literal(3),Ce.literal(4),Ce.literal(5)]),yQ=Ce.object({provider_id:Ce.string().min(1),model_id:Ce.string().min(1).optional()}),kf=Ce.object({operation:Ce.enum(["create","update","list","get"]),task_id:Ce.string().min(1).optional(),expected_revision:Ce.number().int().positive().optional(),type:lL.optional(),title:Ce.string().min(1).optional(),description:Ce.string().nullable().optional(),instructions:Ce.string().min(1).optional(),scope:Ce.enum(["workspace","global"]).optional(),workspace_root:Ce.string().min(1).nullable().optional(),cwd:Ce.string().min(1).nullable().optional(),resource_paths:Ce.array(Ce.string().min(1)).optional(),priority:cL.optional(),assignee:Ce.string().min(1).nullable().optional(),model_selection:yQ.nullable().optional(),mode:Ce.enum(["act","plan","yolo"]).nullable().optional(),system_prompt:Ce.string().nullable().optional(),max_iterations:Ce.number().int().positive().nullable().optional(),timeout_seconds:Ce.number().int().positive().nullable().optional(),available_at:Ce.string().datetime().optional(),expires_at:Ce.string().datetime().optional(),automation_eligible:Ce.boolean().optional(),statuses:Ce.array(gQ).optional(),types:Ce.array(lL).optional(),priorities:Ce.array(cL).optional(),limit:Ce.number().int().positive().max(500).optional()}),wQ=new Set(["create","update"]);function sT(e,t,n,r){if(!wQ.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 Md(e,t){let n=e?.trim();if(!n)throw Error(`${t} is required for this operation`);return n}function uL(e){if(e===void 0||e===null)return e;return{providerId:e.provider_id,modelId:e.model_id}}function pL(e,t){return dL(e)===dL(t)}function hL(e,t){if(!e)throw Error("task does not exist");if(t.workspaceRoot){if(e.scope!=="workspace"||!e.workspaceRoot||!pL(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 bQ(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||!pL(e.workspace_root,t.workspaceRoot))throw Error(`this session can only manage ${n} tasks`)}return n}async function mL(e,t,n){let r=kf.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=bQ(o,s);switch(o.operation){case"create":{let d={type:Md(o.type,"type"),title:Md(o.title,"title"),description:o.description??void 0,instructions:Md(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:uL(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:Md(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 sT(e,o,n,!0),l}case"update":{let d=Md(o.task_id,"task_id");if(hL(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:uL(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 sT(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(Md(o.task_id,"task_id"));return hL(d,s),{ok:!0,operation:o.operation,task:d}}}}catch(s){return sT(e,o,n,!1),{ok:!1,operation:o.operation,error:{code:"task_operation_failed",message:s instanceof Error?s.message:String(s)}}}}var Iu="tasks",fL='# 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.',TQ="# 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.",SQ=kf.extend({kind:Zr.literal("todo")}).strict(),gL=Pd.extend({kind:Zr.literal("scheduled")}).strict(),yL=Zr.discriminatedUnion("kind",[SQ,gL]),xQ=Zr.discriminatedUnion("kind",[gL]),wL=["create","update","list","get","pause","resume","delete","run_now"],_Q=Zr.object({...Pd.shape,...kf.shape,kind:Zr.enum(["todo","scheduled"]),operation:Zr.enum(wL)}).strict(),EQ=Zr.object({...Pd.shape,kind:Zr.enum(["scheduled"]),operation:Zr.enum(wL)}).strict();function aT(e){let t=e.todo;return vQ({name:Iu,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:kQ(t?_Q:EQ),retryable:!1,maxRetries:0,execute:async(n,r)=>{let o=(t?yL:xQ).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 mL(t,o.data,r)}}return{kind:"scheduled",...await Qk(e.scheduled,o.data,r)}}})}function dT(e){return{name:"hub-task-guidance",manifest:{capabilities:["rules"]},setup:(t)=>{t.registerRule({id:"hub:task-guidance",content:e?.todoEnabled===!1?TQ:fL,whenToolAvailable:Iu})}}}import{createSessionId as UZ,ensureLoopbackProxyBypass as zL,isHubProtocolCompatible as BZ,resolveClineBuildEnv as HZ,resolveHubCommandTimeoutMs as WZ}from"@cerebriline/shared";import jZ from"ws";var Tf="0.0.92";var Oi={name:"@cerebriline/core",description:"Cline Core SDK for Node Runtime",version:Tf,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 Sf="session_not_found";class Od 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 xf(e){return e instanceof Od||typeof e==="object"&&e!==null&&"code"in e&&e.code==="session_not_found"}import{spawn as sZ}from"node:child_process";import{closeSync as aZ,mkdirSync as dZ,openSync as lZ,readFileSync as cZ,unlinkSync as uZ}from"node:fs";import{basename as hZ,dirname as pZ,join as mZ}from"node:path";import{fileURLToPath as fZ}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as gZ,isBunEmbeddedModulePath as yZ,isHubDaemonProcess as $L,resolveClineBuildEnv as FL,withResolvedClineBuildEnv as wZ}from"@cerebriline/shared";import{createHash as AQ,randomBytes as _L}from"node:crypto";import{existsSync as RQ}from"node:fs";import{mkdir as cT,open as vL,readFile as EL,rename as IQ,rm as _f,writeFile as CQ}from"node:fs/promises";import{dirname as AL,join as uT}from"node:path";import{ensureLoopbackProxyBypass as PQ,isHubProtocolCompatible as MQ}from"@cerebriline/shared";import{resolveClineDataDir as Cu,resolveClineDir as Mqe}from"@cerebriline/shared/storage";var OQ="CLINE_HUB_DISCOVERY_PATH",LQ="CLINE_HUB_BUILD_ID",NQ="CLINE_HUB_BUILD_EPOCH_MS",DQ=30000,$Q=15000,kL=100;function FQ(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function UQ(e){return AQ("sha256").update(e).digest("hex").slice(0,12)}function BQ(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 RL(){return _L(32).toString("hex")}function TL(e){return new Promise((t)=>setTimeout(t,e))}function HQ(e){return`${e}.lock`}async function WQ(e){try{let t=JSON.parse(await EL(uT(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 lT(e){await _f(e,{recursive:!0,force:!0}).catch(()=>{return})}function eo(){let e=process.env[LQ]?.trim();if(e)return e;return"sdk-v1-6166d6cf6d2beb7cf553070843db7e6683db113044e66b110ebdef39dac18ba3".trim()||`source-${String(Oi.version)}`}function hT(){let e=Number(process.env[NQ]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1792707017870)?1792707017870:void 0}function Fs(e,t=eo()){let n=MQ(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 SL(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0}function xL(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 jQ(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 Pu(e,t){let n=e.buildId?.trim(),r=t.buildId?.trim();if(n&&r&&n===r)return 0;let o=SL(e.buildEpochMs),i=SL(t.buildEpochMs);if(o!==void 0&&i!==void 0&&o!==i)return o<i?-1:1;let s=xL(e.coreVersion),a=xL(t.coreVersion);if(s&&a){let d=jQ(s,a);if(d!==0)return d}if(n&&r&&n!==r)return n<r?-1:1;return 0}function Mu(){return{buildId:eo(),buildEpochMs:hT(),coreVersion:String(Oi.version)}}function Ld(e,t){let n=t?.self??Mu(),r=Fs(e,n.buildId??"");if(r.compatible)return!0;if(r.reason!=="build_mismatch"&&r.reason!=="missing_build")return!1;return Pu(n,e)<=0}function Us(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${UQ(e)}`,n=process.env[OQ]?.trim()||uT(Cu(),"locks","hub","owners",`${FQ(t)}.json`);return{ownerId:t,discoveryPath:n}}function Lqe(e=`hub-${Date.now().toString(36)}`){return Us(e)}async function jt(e){try{let t=JSON.parse(await EL(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 Ef(e,t,n){await pT(e,async()=>{let r=AL(e);await cT(r,{recursive:!0});let o=`${e}.${process.pid}.${_L(6).toString("hex")}.tmp`,i;try{i=await vL(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 IQ(o,e);let s;try{s=await vL(r,"r"),await s.sync()}catch{}finally{await s?.close().catch(()=>{return})}}catch(s){throw await i?.close().catch(()=>{return}),await _f(o,{force:!0}).catch(()=>{return}),s}})}async function Wo(e){await pT(e,async()=>{await _f(e,{force:!0}).catch(()=>{return})})}async function IL(e,t){return await pT(e,async()=>{if((await jt(e))?.hubId!==t)return!1;return await _f(e,{force:!0}),!0})}async function CL(e,t,n){let r=HQ(e);await cT(AL(r),{recursive:!0});let o=Date.now()+$Q;while(!0){try{await cT(r,{recursive:!1})}catch(i){if((i instanceof Error&&"code"in i?String(i.code):"")!=="EEXIST")throw i;let a=await WQ(r);if(!a){if(Date.now()>=o){await lT(r);continue}await TL(kL);continue}let d=Date.now()-Date.parse(a.acquiredAt);if(!BQ(a.pid)||d>DQ){await lT(r);continue}if(Date.now()>=o)throw Error(`Timed out waiting for hub ${t} lock ${r}`);await TL(kL);continue}try{return await CQ(uT(r,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
|
|
323
323
|
`,"utf8"),await n()}finally{await lT(r)}}}function pT(e,t){return CL(`${e}.mutation`,"discovery mutation",t)}function Af(e,t){return CL(e,"startup",t)}async function jo(e,t){PQ();try{let n=await fetch(t?.authToken?qQ(e):PL(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 PL(e){let t=new URL(e);return t.protocol=t.protocol==="wss:"?"https:":"http:",t.pathname="/health",t.search="",t.toString()}function qQ(e){let t=new URL(PL(e));return t.pathname="/status",t.toString()}function Nqe(e){return RQ(e)}import{CLINE_HUB_DEV_PORT as zQ,CLINE_HUB_PORT as KQ,resolveClineBuildEnv as GQ}from"@cerebriline/shared";var VQ="CLINE_HUB_HOST",XQ="CLINE_HUB_PORT",YQ="CLINE_HUB_PATHNAME",JQ="127.0.0.1",QQ=KQ,ZQ="/hub";function ML(e){return GQ(e)==="development"?zQ:QQ}function eZ(e={}){return(e.env??process.env)[VQ]?.trim()||JQ}function Rf(e={}){let n=(e.env??process.env)[XQ]?.trim();if(!n)return ML(e);let r=Number.parseInt(n,10);if(!Number.isInteger(r)||r<1||r>65535)return ML(e);return r}function tZ(e={}){return(e.env??process.env)[YQ]?.trim()||ZQ}function Bs(e={},t={}){return{host:e.host??eZ(t),port:e.port??Rf(t),pathname:e.pathname??tZ(t)}}import{join as nZ}from"node:path";var rZ="shared:cline",oZ="CLINE_HUB_DISCOVERY_PATH",iZ="hub-production";function Wqe(e){let t=Ms(e.trim());return Us(`workspace:${t||e.trim()}`)}function Ar(e=rZ){return Us(`${e}@${eo()}`)}function to(){return{ownerId:iZ,discoveryPath:process.env[oZ]?.trim()||nZ(Cu(),"locks","hub","production.json")}}var OL=15000,bZ=200,LL=3000,vZ=100,kZ=[100,250,500,1000,2000],TZ="--cline-hub-daemon",SZ=3,xZ=60000,gT=new Map,Zqe={resetRetireAttempts(){gT.clear()},resolveDaemonEntryArgs:BL};function _Z(e,t=Date.now()){let n=gT.get(e);if(!n||t-n.windowStartedAt>xZ)return gT.set(e,{count:1,windowStartedAt:t}),!0;return n.count+=1,n.count<=SZ}function EZ(e){return[...e.host?["--host",e.host]:[],...typeof e.port==="number"?["--port",String(e.port)]:[],...e.pathname?["--pathname",e.pathname]:[]]}function AZ(){try{let e=mZ(Cu(),"logs","hub-daemon.log");return dZ(pZ(e),{recursive:!0}),{fd:lZ(e,"a"),logPath:e}}catch{return}}function UL(){return FL()==="production"?to():Ar()}function Ou(e){return Ld(e)}function RZ(e){try{let t=JSON.parse(cZ(`${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 mT(e){try{uZ(`${e}.superseded`)}catch{}}function NL(e,t,n){if(!t||t.url!==n)return e;return{...e,authToken:e.authToken??t.authToken,pid:e.pid??t.pid}}async function Nd(e,t){try{return await jo(e,{authToken:t})}catch{return}}async function DL(e,t){let n=Date.now()+t;while(Date.now()<n){if(!(await Nd(e))?.url)return!0;await new Promise((o)=>setTimeout(o,vZ))}return!1}async function Dd(e,t){if(!_Z(e.url))return!1;await Hs(e.url,e.authToken,"retired by newer install").catch(()=>!1),await wT(e.url,e.authToken).catch(()=>!1);let n=await DL(e.url,LL);if(!n&&e.pid&&IZ(e.pid)){try{process.kill(e.pid,"SIGTERM")}catch{}n=await DL(e.url,LL)}if(n)await Wo(t).catch(()=>{return});return n}function IZ(e){try{return process.kill(e,0),!0}catch(t){return t?.code==="EPERM"}}async function yT(e){try{return(await Fd(e.url,e.authToken)).activeSessionCount>0}catch{return!1}}async function fT(e,t){if(Ou(e))return"reusable";let n=await Hs(e.url,e.authToken,"retired by newer install").catch(()=>!1);if(await yT(e)){if(n)await Hs(e.url,e.authToken,"hub retirement deferred",{off:!0}).catch(()=>!1);return"deferred_busy"}let r=await Dd(e,t);if(!r&&n)await Hs(e.url,e.authToken,"hub retirement failed",{off:!0}).catch(()=>!1);return r?"retired":"failed"}async function CZ(e){if(FL()!=="production")return;let t=Ar();if(t.discoveryPath===e.discoveryPath)return;let n=await jt(t.discoveryPath);if(n?.url)await Dd(n,t.discoveryPath);else await Wo(t.discoveryPath).catch(()=>{return})}function PZ(){let e=import.meta.url.endsWith(".ts")?"ts":"js";return fZ(new URL(`./entry.${e}`,import.meta.url))}function BL(e,t){if(yZ(e))return[TZ];return[...t&&e.toLowerCase().endsWith(".ts")?["--conditions=development"]:[],e]}function MZ(e,t){let n=PZ(),r=process.execPath?.trim();if(!r)throw Error("unable to resolve runtime executable for hub daemon");let o=hZ(r).toLowerCase().includes("bun"),i=BL(n,o);return{launcher:r,args:[...i,"--cwd",e,...EZ(t),...t.manageConnectors===!1?["--no-connectors"]:[]],cwd:e,env:{...wZ(process.env),CLINE_NO_INTERACTIVE:"1",[gZ]:"1"}}}function OZ(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 LZ(e,t={}){if($L())return;let n=MZ(e,t),r=AZ();try{sZ(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)aZ(r.fd)}}async function NZ(e,t={}){for(let n=0;;n++)try{LZ(e,t);return}catch(r){let o=kZ[n];if(!OZ(r)||o===void 0)throw r;await new Promise((i)=>setTimeout(i,o))}}function eze(e,t={}){if($L())return;Lu(e,t).catch(()=>{})}async function DZ(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)$d(m.url,m.authToken);else HL(m.url,m.authToken);return m};await CZ(e).catch(()=>{return});let a=await jt(e.discoveryPath),d=a?.url?void 0:RZ(e.discoveryPath),l=!1;if(a?.url){let m=a.authToken;if(!m)l=!0,await Dd(a,e.discoveryPath);else{let f=await Nd(a.url,m);if(f?.url&&Ou(f)&&await or(f.url,{authToken:m}))return mT(e.discoveryPath),s({url:f.url,authToken:m});if(f?.url){if(await fT({...f,authToken:m},e.discoveryPath)==="deferred_busy"&&await or(f.url,{authToken:m}))return s({url:f.url,authToken:m})}else await Wo(e.discoveryPath).catch(()=>{return})}}let c=await Nd(i);if(c?.url){let m=NL(c,a??d,i);if(Ou(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 or(c.url,{authToken:w}))continue;let _={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 Ef(e.discoveryPath,_)}catch{}return mT(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 fT(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 or(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 NZ(t,{...h,manageConnectors:n.manageConnectors});let p=Date.now()+OL;while(Date.now()<p){let m=await jt(e.discoveryPath);if(m?.url&&m.authToken){let g=await Nd(m.url,m.authToken);if(g?.url&&Ou(g)&&await or(g.url,{authToken:m.authToken}))return mT(e.discoveryPath),s({url:g.url,authToken:m.authToken})}let f=await Nd(i);if(f?.url&&!Ou(f)){let g=NL(f,m??d,i),y=await fT(g,e.discoveryPath);if(y==="deferred_busy"&&m?.authToken&&await or(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,bZ))}throw Error(`Timed out after ${OL}ms waiting for detached hub startup.`)}async function Lu(e,t={}){let n=UL();return await Af(n.discoveryPath,async()=>DZ(n,e,t))}var $Z=5000,FZ=500;async function tze(e={}){let t=UL(),n=e.workspaceRoot??process.cwd(),r=await jt(t.discoveryPath),o=r?.url?await Nd(r.url,r.authToken):void 0;if(!o?.url)return{outcome:"started",...await Lu(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(Pu(Mu(),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??$Z),l;for(;;){try{if(l=(await Fd(i.url,i.authToken)).activeSessionCount,l===0)break}catch{}if(Date.now()>=d)break;await new Promise((h)=>setTimeout(h,FZ))}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 Dd(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 Lu(n),activeSessionCount:l??0}}function xT(){return HZ()==="production"?to():Ar()}function qZ(){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 KL(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 KL(e.data);return String(e)}function zZ(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 WL(e){let t=e,n=zZ(t.reason);return new on("hub_connection_closed",t.code||n?`Hub connection closed (code=${t.code??0}${n?`, reason=${n}`:""})`:vT,{closeCode:t.code,closeReason:n||void 0})}function jL(e,t){if(e instanceof on)return e;if(e instanceof Error)return new on("hub_connect_failed",e.message);if(e&&typeof e==="object"&&"error"in e&&e.error instanceof Error)return new on("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 on("hub_connect_failed",n);let r=e&&typeof e==="object"&&"type"in e&&typeof e.type==="string"?e.type.trim():"";return new on("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 bT="*",If=8000,KZ="cline-hub-auth.",_T=new Map,GL=new Set,GZ=3000,VZ=3000,XZ=100,vT="Hub connection closed",YZ=250,JZ=5000,qL=0.5;class on extends Error{code;details;constructor(e,t,n){super(t);this.code=e;this.details=n;this.name="HubTransportError"}}function QZ(e){return e instanceof on}class Cf extends Error{command;code;constructor(e,t,n){super(n);this.command=e;this.code=t;this.name="HubCommandError"}}function cze(e,t){return e instanceof Cf&&e.code==="hub_command_timeout"&&(t===void 0||e.command===t)}function ET(e,t={}){let n=e.searchParams.get("authToken")?.trim();if(e.searchParams.delete("authToken"),n)return n;if(t.skipRegistry)return;let r=Mf(e.toString());return r?_T.get(r):void 0}function ZZ(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 Mf(e){if(!ZZ(e))return;let t=new URL(Pf(e));return t.search="",t.hash="",t.toString()}function kT(e){let t=Mf(e);return!!t&&GL.has(t)}function $d(e,t){let n=Mf(e);if(n){if(GL.add(n),t?.trim())_T.set(n,t)}return e}function HL(e,t){let n=Mf(e);if(n&&t?.trim())_T.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 on("hub_connection_closed",vT);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()||ET(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=jL(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 on("hub_connect_timeout",`Timed out resolving hub connection headers after ${If}ms`))},If)})])}catch(l){let c=l instanceof on?l:new on("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 on("hub_connect_failed","Hub connection headers cannot set Sec-WebSocket-Protocol.");if(n===this.connectGeneration)this.lastCloseError=d;throw d}let i=o?new jZ(e.toString(),{headers:{...o}}):new(qZ())(e.toString(),t?[`${KZ}${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 on("hub_connect_timeout",`Timed out connecting to hub after ${If}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)},If);i.addEventListener("open",()=>{if(c)return;c=!0,clearTimeout(u),d()}),i.addEventListener("error",(h)=>{if(c)return;c=!0,clearTimeout(u);let p=jL(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:WL(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(KL(d)))}),i.addEventListener("close",(d)=>{if(this.socket!==i)return;if(!s)this.lastCloseError=WL(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=UZ("hubreq_");r?.onDispatch?.(i);let s=WZ(e,r?.timeoutMs),a=new Promise((l,c)=>{let u=s===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(i))return;c(new Cf(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===Sf){let l=n??(typeof t?.sessionId==="string"?t.sessionId:void 0);throw new Od(l,d.error.message)}throw new Cf(e,d.error?.code,d.error?.message??`Hub command ${e} failed`)}return d}async recoverLocalHubTransport(e){if(!kT(this.currentUrl)||!QZ(e))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let t=await ST({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(YZ*2**this.reconnectAttempt,JZ),t=Math.round(e*(1-qL)+Math.random()*e*qL);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(!kT(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let e=await ST({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 on("hub_connection_closed",vT);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 on("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??bT}subscriptionSessionIdFromKey(e){return e===bT?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[bT,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 Pf(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 or(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 TT(e,t){let n=Pf(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&&!Ld(r))return{status:i.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:n}}else if(!BZ(r).compatible)return{status:"protocol_mismatch",url:n};if(t?.verifyConnection===!0&&!await or(n,{workspaceRoot:t.workspaceRoot,cwd:t.cwd,authToken:t.authToken}))return{status:"unreachable",url:n};return{status:"compatible",url:n}}async function eee(e){let t=Date.now()+VZ;while(Date.now()<t){if(!(await jo(e).catch(()=>{return}))?.url)return!0;await new Promise((r)=>setTimeout(r,XZ))}return!1}function tee(e,t){try{return Pf(e)===Pf(t)}catch{return!1}}function VL(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 uze(e){return VL(e).activeSessionCount>0}async function Fd(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:GZ});return VL(o.payload)}finally{await r.dispose().catch(()=>{return})}}async function XL(e,t,n){try{return(await Fd(e,t,n)).activeSessionCount===0}catch{return!1}}async function nee(e,t){let n=`${e.discoveryPath}.superseded`,r=await jt(n);if(!r?.url||!r.authToken)return;let o=await TT(r.url,{authToken:r.authToken});if(o.status!=="compatible")return;if(await XL(o.url,r.authToken,t))return;return $d(o.url,r.authToken)}async function ree(e={}){if(e.endpoint?.trim()){let o=await TT(e.endpoint);return o.status==="compatible"?o.url:void 0}let t=xT(),n=await jt(t.discoveryPath);if(!n?.url)return await nee(t,e);let r=await TT(n.url,{authToken:n.authToken,requireCurrentBuild:!0});if(r.status==="compatible")return $d(r.url,n.authToken);if(r.status==="protocol_mismatch")await Wo(t.discoveryPath).catch(()=>{return});return}async function ST(e={}){let t=await ree(e);if(t&&await or(t,{workspaceRoot:e.workspaceRoot,cwd:e.cwd}))return t;if(e.endpoint?.trim())return;try{return(await Lu(e.workspaceRoot??process.cwd())).url}catch(n){e.onStartupError?.(n);return}}async function Hs(e,t,n,r){zL();let o=new URL(e),i=t?.trim()||ET(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 wT(e,t){zL();let n=new URL(e),r=t?.trim()||ET(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 oee(e=xT()){let t=await jt(e.discoveryPath);if(!t?.url)return!1;try{if(await wT(t.url,t.authToken))return!0}catch{}return!1}async function hze(e){if(!kT(e.url))return;let t=xT(),n=await jt(t.discoveryPath);if(!n?.url||!tee(n.url,e.url))return;if(!await XL(n.url,n.authToken,{workspaceRoot:e.workspaceRoot,cwd:e.cwd}))return;if(!await oee())return;if(!await eee(n.url))return;return await Wo(t.discoveryPath).catch(()=>{return}),await ST({workspaceRoot:e.workspaceRoot,cwd:e.cwd})}import{resolveClineBuildEnv as iee}from"@cerebriline/shared";function see(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 aee="cline-hub-auth.";function dee(e){return e.host!==void 0||e.port!==void 0||e.pathname!==void 0}function lee(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 YL(){return iee()==="production"?to():Ar()}async function cee(e){let t=e.searchParams.get("authToken")?.trim();if(e.searchParams.delete("authToken"),t)return t;let n=YL(),r=await jt(n.discoveryPath);if(r?.url&&lee(e.toString(),r.url))return r.authToken;return}async function uee(e={}){let t=Bs(e);if(!dee(e)){let n=YL(),r=await jt(n.discoveryPath);if(r?.url)return r.url}return qo(t.host,t.port,t.pathname)}async function JL(e){return await new Promise((t,n)=>{(async()=>{let r=new URL(e),o=await cee(r);r.hash="";let i=new WebSocket(r.toString(),o?[`${aee}${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(see(d,e))})})().catch(n)})}async function wze(e){try{return(await JL(e)).close(),!0}catch{return!1}}async function bze(e,t){let n=await uee(e),r=await JL(n);try{return await r.send({version:t.version??"v1",clientId:t.clientId??"hub-client",...t})}finally{r.close()}}import{existsSync as hee}from"node:fs";import{isHubDaemonProcess as pee,resolveClineBuildEnv as mee}from"@cerebriline/shared";var fee=1e4,gee="CLINE_HUB_BUILD_WATCH_INTERVAL_MS";function yee(){let e=Number(process.env[gee]);return Number.isFinite(e)&&e>0?e:fee}async function wee(e,t){try{let n=await Fd(e.url,t);return{...e,activeSessionCount:n.activeSessionCount,participantClientCount:n.participantClientCount}}catch{return e}}function bee(){return mee()==="production"?to():Ar()}function vee(e){try{return hee(`${e}.lock`)}catch{return!1}}async function kee(){let e=bee();if(vee(e.discoveryPath))return;let t=await jt(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=Mu();if(s.coreVersion&&n.coreVersion&&s.coreVersion===n.coreVersion)return;if(Pu(s,n)>0)return await wee(i("outdated_hub"),t.authToken);return i("build_mismatch")}function Eze(e){if(pee()||process.env.CLINE_HUB_PORT?.trim())return()=>{};let t=e.intervalMs??yee(),n,r,o=!1,i=setInterval(()=>{if(o)return;o=!0,kee().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 AT(e){return e?JSON.parse(JSON.stringify(e)):{}}function Of(e){let t=e?.session&&typeof e.session==="object"?e.session:void 0;if(!t)return;let n=t.metadata&&typeof t.metadata==="object"?AT(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 QL(e,t){return e.error?.message??`hub command failed: ${t}`}function Tee(e){let t=AT(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 ZL(e){let t=e?.sessionId;return typeof t==="string"&&t.trim()?t.trim():void 0}function See(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 xee(e){let t=AT(e.payload);if(e.event==="schedule.execution_completed")return{sessionId:e.sessionId?.trim()||ZL(t)||"",eventType:"schedule.execution.completed",payload:t};if(e.event==="schedule.execution_failed")return{sessionId:e.sessionId?.trim()||ZL(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:Tee(e.payload)};case"run.completed":return{sessionId:n,eventType:"runtime.chat.completed",payload:t};default:return}}class _ee{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=Of(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(xf(n))return;throw n}return Of(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(QL(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(QL(o,"session.restore"));let i=Of(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=See(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)=>Of({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=xee(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 Eee{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 b1e}from"@cerebriline/llms";import{existsSync as RUe,readdirSync as IUe}from"node:fs";import{readFile as CUe}from"node:fs/promises";import{homedir as PUe}from"node:os";import{isAbsolute as cX,join as Ei,resolve as a0}from"node:path";import{onXollamaSideCall as MUe,releasePolykvSwarmsOf as sX}from"@cerebriline/llms";import{applyPromptTemplateToTools as OUe,captureSdkError as Tr,createSessionId as LUe,isLikelyAuthError as NUe,normalizeUserInput as DUe}from"@cerebriline/shared";import{setHomeDirIfUnset as $Ue}from"@cerebriline/shared/storage";import{decodeJwtPayload as kte,getClineEnvironmentConfig as kN}from"@cerebriline/shared";import{decodeJwtPayload as Oee,getClineEnvironmentConfig as Lee}from"@cerebriline/shared";import{createHash as Aee}from"node:crypto";var Ree;function Hn(e){if(typeof e!=="string"||e.length===0)return"unset";return Aee("sha256").update(e).digest("hex").slice(0,8)}function dt(e){try{Ree?.debug(e)}catch{}}function Iee(){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??Cee,i=Iee(),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 _={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(_.error){y.statusCode=400,y.end(`Authentication failed: ${_.error}`),u(),c(_);return}if(!_.code){y.statusCode=400,y.end("Missing authorization code");return}if(e.expectedState&&_.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(_)}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 Cee=`<!DOCTYPE html>
|
|
324
324
|
<html lang="en">
|
package/dist/index.d.ts
CHANGED
|
@@ -144,7 +144,7 @@ export { buildIconPrompt, buildProposalSheet, createGenerateIconTool, GENERATE_I
|
|
|
144
144
|
export { createEditImageTool, EDIT_IMAGE_TOOL_DESCRIPTION, EDIT_IMAGE_TOOL_INPUT_SCHEMA, EDIT_IMAGE_TOOL_NAME, type EditImageToolOptions, parseImagePaths, } from "./extensions/tools/image-edit";
|
|
145
145
|
export { createGenerateImageTool, defaultImagePath, extensionForMediaType, GENERATE_IMAGE_TOOL_DESCRIPTION, GENERATE_IMAGE_TOOL_INPUT_SCHEMA, GENERATE_IMAGE_TOOL_NAME, type GenerateImageToolOptions, type ImageGenerationEndpoint, normalizeBaseUrl, parseSize, readGeneratedImage, resolveInsideWorkspace, selectImageGenerationModels, sniffMediaType, } from "./extensions/tools/image-generation";
|
|
146
146
|
export { applyOptionRanking, appraiseEscalation, boundJevText, createJevTool, describeJevAnswer, describeOptionRanking, detectJevDialect, evaluateJev, JEV_COMPLEXITY_LEVELS, JEV_DEFAULT_BASE_URL, JEV_DEFAULT_FLOOR, JEV_DEFAULT_HIGH_STAKES_FLOOR, JEV_DEFAULT_MODEL, JEV_DEFAULT_TIMEOUT_MS, JEV_DROP_BELOW, JEV_TOOL_DESCRIPTION, JEV_TOOL_INPUT_SCHEMA, JEV_TOOL_NAME, type JevAnswer, type JevDialect, type JevEndpoint, JevError, type JevQuestion, type JevResponse, type JevRoutes, type JevToolOptions, jevConfidence, listJevModels, OLLAMA_JEV_MAX_BODY_BYTES, OLLAMA_JEV_MAX_OPTIONS, type RankedOptions, rankQuestionOptions, readJevToolQuestions, resetJevDialectCache, resolveJevRoutes, } from "./extensions/tools/jev";
|
|
147
|
-
export { createLibrarianTools, LIBRARIAN_TOOL_NAMES, } from "./extensions/tools/librarian-tools";
|
|
147
|
+
export { addBookFromPanel, createLibrarianTools, LIBRARIAN_TOOL_NAMES, LIBRARY_IMPORT_EXTENSIONS, PANEL_IMPORT_PLACE, } from "./extensions/tools/librarian-tools";
|
|
148
148
|
export { cancelLibraryImports, hasActiveLibraryImports, } from "./extensions/tools/library-import-run";
|
|
149
149
|
export { type CreateLibraryToolsOptions, createLibraryTools, isLibrarianEnabled, LIBRARIAN_SKILL_NAME, LIBRARY_TOOL_NAMES, type LibraryScrapeConfig, type LibraryToolName, type LibraryToolsConfig, } from "./extensions/tools/library-tools";
|
|
150
150
|
export { createListFilesTool, createLocalWorkspaceLister, type DirectoryEntry, globToRegExp, isWithin, LIST_FILES_TOOL_DESCRIPTION, LIST_FILES_TOOL_INPUT_SCHEMA, LIST_FILES_TOOL_NAME, type ListFilesToolOptions, normalizeMaxResults, renderDirectory, renderMatches, type WorkspaceLister, } from "./extensions/tools/list-files";
|
|
@@ -192,6 +192,7 @@ export type { LibraryCollection, LibraryDocument, LibraryHit, } from "./services
|
|
|
192
192
|
export { closeSharedMemories, MEMORY_EXPORT_FORMAT, MEMORY_MAX_CHARS, MEMORY_NAME_MAX_CHARS, Memory, type MemoryEndpoints, type MemoryExport, type MemoryInfo, type MemoryItem, normalizeMemoryName, type RecalledMemory, resolveMemoryDirectory, sharedMemory, } from "./services/retrieval/memory";
|
|
193
193
|
export { buildHydeUserPrompt, type CreateMemoryRecallerOptions, clampRecallQuery, createMemoryRecaller, HYDE_SYSTEM_PROMPT, type MemoryQueryExpander, type MemoryRecaller, type MemoryRecallInput, type MemoryRecallResult, } from "./services/retrieval/memory-recall";
|
|
194
194
|
export type { RetrievedHit, RetrieveResult, } from "./services/retrieval/retrieve";
|
|
195
|
+
export { isTarGz } from "./services/retrieval/tar-extract";
|
|
195
196
|
export { SDD_DATABASE, SDD_DIRECTORY, SddEngine, type SddMilestone, type SddNext, type SddRequirement, SddRuleError, type SddSlice, type SddStep, type SddTask, } from "./services/sdd/sdd-engine";
|
|
196
197
|
export { TelemetryService, type TelemetryServiceOptions, } from "./services/telemetry/TelemetryService";
|
|
197
198
|
export { createSessionCompactionState, parseSessionCompactionState, projectSessionCompactionState, type SessionCompactionState, } from "./session/models/session-compaction";
|