@cerebriline/core 4.100.270 → 4.100.271

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/hub/index.js CHANGED
@@ -318,7 +318,7 @@ ${JSON.stringify(r,null,2)}`}startClaimLeaseHeartbeat(e){let t=Math.max(1000,Mat
318
318
  scheduled_for = COALESCE(?, scheduled_for),
319
319
  updated_at = ?
320
320
  WHERE run_id = ? AND claim_token = ?`).run(e.releaseAttempt?1:0,e.error??null,e.scheduledFor??null,t,e.runId,e.claimToken).changes??0)>0}attachSessionIdToRun(e,t,n){return(this.db.prepare("UPDATE cron_runs SET session_id = ?, updated_at = ? WHERE run_id = ? AND claim_token = ? AND status = 'running'").run(t,jt(),e,n).changes??0)===1}attachReportPathToRun(e,t){this.db.prepare("UPDATE cron_runs SET report_path = ?, updated_at = ? WHERE run_id = ?").run(t,jt(),e)}}function kf(e){return e?new Date(e).getTime():void 0}function M7(e){let t=e.metadata?{...e.metadata}:void 0;if(t)delete t.__hubScheduleCreatedBy,delete t.__hubScheduleCwd,delete t.__hubRuntimeOptions;return t}function Au(e){let t=e.metadata;return{scheduleId:e.externalId,name:e.title,cronPattern:e.triggerKind==="one_off"?Ru: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:kf(e.nextRunAt),lastRunAt:kf(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:M7(e)}}function O7(e){switch(e){case"done":return"success";case"cancelled":return"aborted";case"running":return"running";case"queued":return"pending";default:return"failed"}}function Zk(e,t){return{executionId:e.runId,scheduleId:t,sessionId:e.sessionId,triggeredAt:new Date(e.scheduledFor??e.createdAt).getTime(),startedAt:kf(e.startedAt),endedAt:kf(e.completedAt),status:O7(e.status),errorMessage:e.error}}class Tf{store;materializer;runner;started=!1;disposed=!1;constructor(e){this.store=new Eu({dbPath:e.dbPath}),this.materializer=new bu({store:this.store}),this.runner=new ku({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===Ru?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 Au(this.store.createHubSchedule({...e,timezone:t}))}getSchedule(e){let t=this.store.getHubSchedule(e);return t?Au(t):void 0}listSchedules(e={}){return this.store.listHubSchedules(e).map((t)=>Au(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=Au(n),s=t.cronPattern??i.cronPattern;if(s.trim()===Ru&&typeof t.timezone==="string"&&t.timezone.trim())throw Error("timezone is only supported for recurring schedules");if(this.validateScheduleTiming(s,s.trim()===Ru?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?Au(a):void 0}validateScheduleTiming(e,t,n,r){if(e.trim()!==Ru){IO(e),Xk(t);return}if(t?.trim())throw Error("timezone is only supported for recurring schedules");let o=n?.[P7];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 Zk(n,e)}triggerScheduleNowDetached(e){let t=this.store.enqueueHubScheduleRun(e,"manual");if(!t)return;return this.runner.tick().catch(()=>{return}),Zk(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 Zk(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 tT,statSync as L7}from"node:fs";import{isAbsolute as BO,relative as N7,sep as HO}from"node:path";import{ONE_TIME_SCHEDULE_CRON_PATTERN as WO,ONE_TIME_SCHEDULE_RUN_AT_METADATA_KEY as jO}from"@cerebriline/shared";import{z as _t}from"zod";var D7=_t.enum(["create","update","list","get","pause","resume","delete","run_now"]),$7=_t.object({provider_id:_t.string().min(1),model_id:_t.string().min(1).optional()}),Pd=_t.object({operation:D7,schedule_id:_t.string().min(1).optional(),schedule_type:_t.enum(["once","recurring"]).optional(),name:_t.string().min(1).optional(),prompt:_t.string().min(1).optional(),run_at:_t.string().datetime({offset:!0}).optional(),cron_pattern:_t.string().min(1).optional(),timezone:_t.string().min(1).nullable().optional().describe("IANA timezone for recurring schedules. Omit unless the user explicitly requests a timezone; new schedules default to the local timezone. Updates preserve the existing timezone when omitted."),enabled:_t.boolean().optional(),mode:_t.enum(["act","plan","yolo"]).optional(),system_prompt:_t.string().nullable().optional(),max_iterations:_t.number().int().positive().nullable().optional(),timeout_seconds:_t.number().int().positive().nullable().optional(),max_parallel:_t.number().int().positive().max(32).optional(),tags:_t.array(_t.string().min(1)).optional(),model_selection:$7.optional(),limit:_t.number().int().positive().max(200).optional()});function Rd(e,t,n,r){if(!qO.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 qO=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 nT(e,t){try{let n=tT.native(e);if(!L7(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 tT.native(e)===tT.native(t)}catch{return!1}}function zO(e,t,n){let r=N7(e,t);if(r===".."||r.startsWith(`..${HO}`)||BO(r))throw Error(`${n} is outside the workspace scope`)}function KO(e,t,n){return nT(BO(t)?t:`${e}${HO}${t}`,n)}function U7(e){let t=nT(e.workspaceRoot,"workspaceRoot"),n=e.cwd?KO(t,e.cwd,"cwd"):t;return zO(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=nT(e.workspaceRoot,"schedule workspaceRoot");if(e.cwd){let r=KO(n,e.cwd,"schedule cwd");zO(n,r,"schedule cwd")}}function UO(e){if(!e)return;return{providerId:e.provider_id.trim(),modelId:e.model_id?.trim()||void 0}}function eT(e){if(!e)return;return[...new Set(e.map((t)=>t.trim()).filter(Boolean))]}function GO(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 B7(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:WO,metadata:{[jO]:GO(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 H7(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:WO,timezone:null,metadata:{[jO]:GO(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 Iu(e){return Cd(e.schedule_id,"schedule_id")}async function rT(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=U7(i);if(qO.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"),...B7(o),prompt:Cd(o.prompt,"prompt"),workspaceRoot:s.workspaceRoot,cwd:s.cwd,modelSelection:UO(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:eT(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=Iu(o);Id(e.schedules.getSchedule(a),s);let d=e.schedules.updateSchedule(a,{scheduleId:a,...H7(o),name:o.name?.trim()||void 0,prompt:o.prompt?.trim()||void 0,modelSelection:UO(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:eT(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:eT(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(Iu(o));return Id(a,s),{ok:!0,operation:o.operation,schedule:a}}case"pause":case"resume":{let a=Iu(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=Iu(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=Iu(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 mQ}from"@cerebriline/llms";import{markOtlpTraceRelayProvider as fQ}from"@cerebriline/shared";import{metrics as gQ,trace as yQ}from"@opentelemetry/api";import{logs as wQ}from"@opentelemetry/api-logs";import{OTLPLogExporter as bQ}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as vQ}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as kQ}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as TQ}from"@opentelemetry/resources";import{BatchLogRecordProcessor as SQ,ConsoleLogRecordExporter as xQ,LoggerProvider as _Q}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as EQ,MeterProvider as AQ,PeriodicExportingMetricReader as uL}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as RQ,ConsoleSpanExporter as IQ,SimpleSpanProcessor as CQ}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as PQ}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as MQ,ATTR_SERVICE_VERSION as OQ}from"@opentelemetry/semantic-conventions";import{mkdirSync as W7,readFileSync as j7,statSync as q7,writeFileSync as z7}from"node:fs";import{dirname as K7}from"node:path";import{CONFIGURABLE_MODEL_TOOL_NAMES as VO}from"@cerebriline/shared";import{resolveGlobalSettingsPath as YO}from"@cerebriline/shared/storage";import{z as Dt}from"zod";var oT=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}),G7=Dt.enum(["basic","agentic"]).catch("agentic"),V7=Dt.partialRecord(Dt.enum(VO),Dt.object({enabled:Dt.boolean()}).strip()).optional(),Y7=Dt.record(Dt.string(),Dt.object({enabled:Dt.boolean()}).strip()).optional().catch(void 0),X7=Dt.enum(["plan","act"]),iT=Dt.object({telemetryOptOut:Dt.boolean().default(!1).catch(!1),autoUpdateEnabled:Dt.boolean().default(!0).catch(!0),compactionStrategy:G7.optional(),compactionEnabled:Dt.boolean().optional().catch(void 0),planActMode:X7.optional().catch(void 0),toolAutoApprove:Dt.boolean().optional().catch(void 0),tuiTheme:Dt.string().optional().catch(void 0),disabledTools:oT.optional(),tools:V7,disabledPlugins:oT.optional(),disabledAgentPlugins:oT.optional(),bundledSkills:Y7}).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 Sf(){return iT.parse({})}var xf;function J7(){xf=void 0}function Q7(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 Z7(e){let t;try{t=j7(e,"utf8")}catch{return{value:Sf(),loadFailed:!0}}try{let n=iT.safeParse(JSON.parse(t));return n.success?{value:n.data,loadFailed:!1}:{value:Sf(),loadFailed:!0}}catch{return{value:Sf(),loadFailed:!0}}}function XO(){let e=YO(),t=q7(e,{throwIfNoEntry:!1}),n=t?.mtimeMs??0,r=t?.size??0,o=xf;if(o&&o.path===e&&o.mtimeMs===n&&o.size===r)return o;let i=t?Z7(e):{value:Sf(),loadFailed:!1},s=Q7(i.value);return xf={path:e,mtimeMs:n,size:r,value:s,loadFailed:i.loadFailed},xf}function mn(){return XO().value}function Ds(e,t={}){let n=YO(),r=mn();W7(K7(n),{recursive:!0});let o=iT.parse(e);if(!r.telemetryOptOut&&o.telemetryOptOut)qM(t.telemetry);z7(n,`${JSON.stringify(o,null,2)}
321
- `,"utf8"),J7()}function JO(){return mn().telemetryOptOut}function $s(e){return new Set(e??mn().disabledTools??[])}function QO(e){return new Set(e??mn().disabledPlugins??[])}function Cu(e){return new Set(e??mn().disabledAgentPlugins??[])}function ZO(e){return VO.includes(e)}function eQ(){let e=XO();return{web_search:{enabled:!e.loadFailed},...e.value.tools}}function sT(e){return eQ()[e]?.enabled===!0}function tQ(e,t){let n=mn();Ds({...n,tools:{...n.tools,[e]:{enabled:t}}})}function eL(e){if(ZO(e)){let o=sT(e);return tQ(e,!o),o}let t=mn(),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 nQ(e,t){let n=[...new Set(e.map((s)=>s.trim()).filter(Boolean))];if(n.length===0)return;let r=mn(),o=$s(r.disabledTools),i={...r.tools};for(let s of n){if(ZO(s)){i[s]={enabled:!t};continue}if(t)o.add(s);else o.delete(s)}Ds({...r,disabledTools:[...o],tools:i})}function tL(e,t){return nQ([e],t),t}function nL(e,t){let n=e.trim();if(!n)return;let r=mn(),o=QO(r.disabledPlugins);if(t)o.add(n);else o.delete(n);Ds({...r,disabledPlugins:[...o]})}function rL(e,t){let n=e.trim();if(!n)return;let r=mn(),o=Cu(r.disabledAgentPlugins);if(t)o.add(n);else o.delete(n);Ds({...r,disabledAgentPlugins:[...o]})}function oL(e,t){let n=QO(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 iL(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 rQ,mkdirSync as oQ,readFileSync as iQ,writeFileSync as sQ}from"node:fs";import{resolve as aQ}from"node:path";import{resolveSessionDataDir as dQ}from"@cerebriline/shared/storage";import{nanoid as lQ}from"nanoid";import*as cQ from"node-machine-id";var uQ="machine-id",sL,aL=!1;function dL(){if(!aL)sL=lL(),aL=!0;return sL??cL()}function Pu(e){let t=e?.trim();if(t)return t;let n=lL();if(n)return n;return cL()}function hQ(){let e=cQ;return e.machineIdSync??e.default?.machineIdSync}function lL(){try{let e=hQ();if(!e)return;return e().trim()||void 0}catch{return}}function cL(){let e=dQ(),t=aQ(e,uQ);try{if(rQ(t)){let r=iQ(t,"utf8").trim();if(r.length>0)return r}}catch{}let n=`cl-${lQ()}`;try{oQ(e,{recursive:!0}),sQ(t,n,"utf8")}catch{}return n}class aT{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(pQ(d)){o[l]=d;continue}try{o[l]=JSON.stringify(d)}catch{o[l]=String(d)}}return o}}function pQ(e){return typeof e==="string"||typeof e==="number"||typeof e==="boolean"}class dT{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 _f{adapters;metadata;distinctId;deviceId;commonProperties;constructor(e={}){if(this.adapters=[...e.adapters??[]],e.logger)this.adapters.push(new dT({logger:e.logger}));this.metadata={...e.metadata??{}},this.distinctId=e.distinctId,this.deviceId=e.deviceId??dL(),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 hL{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 pL{meterProvider;loggerProvider;tracerProvider;options;constructor(e={}){this.options=e;let t=TQ({[MQ]:e.serviceName??"cline",...e.serviceVersion?{[OQ]:e.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(t),this.loggerProvider=this.createLoggerProvider(t),this.tracerProvider=this.createTracerProvider(t),this.meterProvider)gQ.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)wQ.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(e="cline",t){return yQ.getTracer(e,t??this.options.serviceVersion)}createAdapter(e){return new aT({...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 _f({...e,adapters:[t],distinctId:Pu(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=lT(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 AQ({resource:e,readers:o})}createTracerProvider(e){let t=lT(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=$Q(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 PQ({resource:e,spanProcessors:i?[new mQ,...o]:o});if(i)fQ(s);return s}createLoggerProvider(e){let t=lT(this.options.logsExporter);if(t.length===0)return null;let n=t.map((r)=>{let o=DQ(r,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!o)return null;return new SQ(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 _Q({resource:e,processors:n})}}function LQ(e){let t=new pL(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 mL(e){if(JO())return{telemetry:new hL(e)};if(e.enabled!==!0)return{telemetry:new _f({...e,distinctId:Pu(e.distinctId)})};return LQ(e)}function NQ(e){let{telemetry:t,provider:n,emitProviderCreated:r}=mL(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 lT(e){if(!e)return[];return(Array.isArray(e)?e:e.split(",")).map((n)=>n.trim()).filter((n)=>n==="console"||n==="otlp")}function DQ(e,t){if(e==="console")return new xQ;if(!t.endpoint)return null;let n=cT(t.endpoint,"/v1/logs");return new bQ({url:n,headers:t.headers})}function $Q(e,t){if(e==="console")return new CQ(new IQ);if(!t.endpoint)return null;let n=cT(t.endpoint,"/v1/traces");return new RQ(new kQ({url:n,headers:t.headers}))}function FQ(e,t){if(e==="console")return new uL({exporter:new EQ,exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout});if(!t.endpoint)return null;let n=cT(t.endpoint,"/v1/metrics");return new uL({exporter:new vQ({url:n,headers:t.headers}),exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout})}function cT(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 jQ,zodToJsonSchema as qQ}from"@cerebriline/shared";import{z as Zr}from"zod";import{resolve as fL}from"node:path";import{z as Pe}from"zod";var gL=Pe.enum(["suggestion","follow-up","todo","handoff","idea","reminder"]),UQ=Pe.enum(["pending_approval","approved","in_progress","completed","failed","cancelled","expired"]),yL=Pe.union([Pe.literal(0),Pe.literal(1),Pe.literal(2),Pe.literal(3),Pe.literal(4),Pe.literal(5)]),BQ=Pe.object({provider_id:Pe.string().min(1),model_id:Pe.string().min(1).optional()}),Ef=Pe.object({operation:Pe.enum(["create","update","list","get"]),task_id:Pe.string().min(1).optional(),expected_revision:Pe.number().int().positive().optional(),type:gL.optional(),title:Pe.string().min(1).optional(),description:Pe.string().nullable().optional(),instructions:Pe.string().min(1).optional(),scope:Pe.enum(["workspace","global"]).optional(),workspace_root:Pe.string().min(1).nullable().optional(),cwd:Pe.string().min(1).nullable().optional(),resource_paths:Pe.array(Pe.string().min(1)).optional(),priority:yL.optional(),assignee:Pe.string().min(1).nullable().optional(),model_selection:BQ.nullable().optional(),mode:Pe.enum(["act","plan","yolo"]).nullable().optional(),system_prompt:Pe.string().nullable().optional(),max_iterations:Pe.number().int().positive().nullable().optional(),timeout_seconds:Pe.number().int().positive().nullable().optional(),available_at:Pe.string().datetime().optional(),expires_at:Pe.string().datetime().optional(),automation_eligible:Pe.boolean().optional(),statuses:Pe.array(UQ).optional(),types:Pe.array(gL).optional(),priorities:Pe.array(yL).optional(),limit:Pe.number().int().positive().max(500).optional()}),HQ=new Set(["create","update"]);function uT(e,t,n,r){if(!HQ.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 wL(e){if(e===void 0||e===null)return e;return{providerId:e.provider_id,modelId:e.model_id}}function vL(e,t){return fL(e)===fL(t)}function bL(e,t){if(!e)throw Error("task does not exist");if(t.workspaceRoot){if(e.scope!=="workspace"||!e.workspaceRoot||!vL(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 WQ(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||!vL(e.workspace_root,t.workspaceRoot))throw Error(`this session can only manage ${n} tasks`)}return n}async function kL(e,t,n){let r=Ef.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=WQ(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:wL(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 uT(e,o,n,!0),l}case"update":{let d=Md(o.task_id,"task_id");if(bL(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:wL(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 uT(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 bL(d,s),{ok:!0,operation:o.operation,task:d}}}}catch(s){return uT(e,o,n,!1),{ok:!1,operation:o.operation,error:{code:"task_operation_failed",message:s instanceof Error?s.message:String(s)}}}}var Mu="tasks",TL='# 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.',zQ="# 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.",KQ=Ef.extend({kind:Zr.literal("todo")}).strict(),SL=Pd.extend({kind:Zr.literal("scheduled")}).strict(),xL=Zr.discriminatedUnion("kind",[KQ,SL]),GQ=Zr.discriminatedUnion("kind",[SL]),_L=["create","update","list","get","pause","resume","delete","run_now"],VQ=Zr.object({...Pd.shape,...Ef.shape,kind:Zr.enum(["todo","scheduled"]),operation:Zr.enum(_L)}).strict(),YQ=Zr.object({...Pd.shape,kind:Zr.enum(["scheduled"]),operation:Zr.enum(_L)}).strict();function hT(e){let t=e.todo;return jQ({name:Mu,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:qQ(t?VQ:YQ),retryable:!1,maxRetries:0,execute:async(n,r)=>{let o=(t?xL:GQ).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 kL(t,o.data,r)}}return{kind:"scheduled",...await rT(e.scheduled,o.data,r)}}})}function pT(e){return{name:"hub-task-guidance",manifest:{capabilities:["rules"]},setup:(t)=>{t.registerRule({id:"hub:task-guidance",content:e?.todoEnabled===!1?zQ:TL,whenToolAvailable:Mu})}}}import{createSessionId as dee,ensureLoopbackProxyBypass as QL,isHubProtocolCompatible as lee,resolveClineBuildEnv as cee,resolveHubCommandTimeoutMs as uee}from"@cerebriline/shared";import hee from"ws";var Af="0.0.92";var Oi={name:"@cerebriline/core",description:"Cline Core SDK for Node Runtime",version:Af,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 Rf="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 If(e){return e instanceof Od||typeof e==="object"&&e!==null&&"code"in e&&e.code==="session_not_found"}import{spawn as IZ}from"node:child_process";import{closeSync as CZ,mkdirSync as PZ,openSync as MZ,readFileSync as OZ,unlinkSync as LZ}from"node:fs";import{basename as NZ,dirname as DZ,join as $Z}from"node:path";import{fileURLToPath as FZ}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as UZ,isBunEmbeddedModulePath as BZ,isHubDaemonProcess as qL,resolveClineBuildEnv as zL,withResolvedClineBuildEnv as HZ}from"@cerebriline/shared";import{createHash as XQ,randomBytes as ML}from"node:crypto";import{existsSync as JQ}from"node:fs";import{mkdir as fT,open as AL,readFile as OL,rename as QQ,rm as Cf,writeFile as ZQ}from"node:fs/promises";import{dirname as LL,join as gT}from"node:path";import{ensureLoopbackProxyBypass as eZ,isHubProtocolCompatible as tZ}from"@cerebriline/shared";import{resolveClineDataDir as Ou,resolveClineDir as Ize}from"@cerebriline/shared/storage";var nZ="CLINE_HUB_DISCOVERY_PATH",rZ="CLINE_HUB_BUILD_ID",oZ="CLINE_HUB_BUILD_EPOCH_MS",iZ=30000,sZ=15000,RL=100;function aZ(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function dZ(e){return XQ("sha256").update(e).digest("hex").slice(0,12)}function lZ(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 NL(){return ML(32).toString("hex")}function IL(e){return new Promise((t)=>setTimeout(t,e))}function cZ(e){return`${e}.lock`}async function uZ(e){try{let t=JSON.parse(await OL(gT(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 mT(e){await Cf(e,{recursive:!0,force:!0}).catch(()=>{return})}function eo(){let e=process.env[rZ]?.trim();if(e)return e;return"sdk-v1-6aa38b992abecb978fbe0adeb2619f214d0b892fd13a621ad377843232f7c6cc".trim()||`source-${String(Oi.version)}`}function yT(){let e=Number(process.env[oZ]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1793472309538)?1793472309538:void 0}function Fs(e,t=eo()){let n=tZ(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 CL(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0}function PL(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 hZ(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 Lu(e,t){let n=e.buildId?.trim(),r=t.buildId?.trim();if(n&&r&&n===r)return 0;let o=CL(e.buildEpochMs),i=CL(t.buildEpochMs);if(o!==void 0&&i!==void 0&&o!==i)return o<i?-1:1;let s=PL(e.coreVersion),a=PL(t.coreVersion);if(s&&a){let d=hZ(s,a);if(d!==0)return d}if(n&&r&&n!==r)return n<r?-1:1;return 0}function Nu(){return{buildId:eo(),buildEpochMs:yT(),coreVersion:String(Oi.version)}}function Ld(e,t){let n=t?.self??Nu(),r=Fs(e,n.buildId??"");if(r.compatible)return!0;if(r.reason!=="build_mismatch"&&r.reason!=="missing_build")return!1;return Lu(n,e)<=0}function Us(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${dZ(e)}`,n=process.env[nZ]?.trim()||gT(Ou(),"locks","hub","owners",`${aZ(t)}.json`);return{ownerId:t,discoveryPath:n}}function Pze(e=`hub-${Date.now().toString(36)}`){return Us(e)}async function qt(e){try{let t=JSON.parse(await OL(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 Pf(e,t,n){await wT(e,async()=>{let r=LL(e);await fT(r,{recursive:!0});let o=`${e}.${process.pid}.${ML(6).toString("hex")}.tmp`,i;try{i=await AL(o,"wx",384),await i.writeFile(`${JSON.stringify(t,null,2)}
321
+ `,"utf8"),J7()}function JO(){return mn().telemetryOptOut}function $s(e){return new Set(e??mn().disabledTools??[])}function QO(e){return new Set(e??mn().disabledPlugins??[])}function Cu(e){return new Set(e??mn().disabledAgentPlugins??[])}function ZO(e){return VO.includes(e)}function eQ(){let e=XO();return{web_search:{enabled:!e.loadFailed},...e.value.tools}}function sT(e){return eQ()[e]?.enabled===!0}function tQ(e,t){let n=mn();Ds({...n,tools:{...n.tools,[e]:{enabled:t}}})}function eL(e){if(ZO(e)){let o=sT(e);return tQ(e,!o),o}let t=mn(),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 nQ(e,t){let n=[...new Set(e.map((s)=>s.trim()).filter(Boolean))];if(n.length===0)return;let r=mn(),o=$s(r.disabledTools),i={...r.tools};for(let s of n){if(ZO(s)){i[s]={enabled:!t};continue}if(t)o.add(s);else o.delete(s)}Ds({...r,disabledTools:[...o],tools:i})}function tL(e,t){return nQ([e],t),t}function nL(e,t){let n=e.trim();if(!n)return;let r=mn(),o=QO(r.disabledPlugins);if(t)o.add(n);else o.delete(n);Ds({...r,disabledPlugins:[...o]})}function rL(e,t){let n=e.trim();if(!n)return;let r=mn(),o=Cu(r.disabledAgentPlugins);if(t)o.add(n);else o.delete(n);Ds({...r,disabledAgentPlugins:[...o]})}function oL(e,t){let n=QO(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 iL(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 rQ,mkdirSync as oQ,readFileSync as iQ,writeFileSync as sQ}from"node:fs";import{resolve as aQ}from"node:path";import{resolveSessionDataDir as dQ}from"@cerebriline/shared/storage";import{nanoid as lQ}from"nanoid";import*as cQ from"node-machine-id";var uQ="machine-id",sL,aL=!1;function dL(){if(!aL)sL=lL(),aL=!0;return sL??cL()}function Pu(e){let t=e?.trim();if(t)return t;let n=lL();if(n)return n;return cL()}function hQ(){let e=cQ;return e.machineIdSync??e.default?.machineIdSync}function lL(){try{let e=hQ();if(!e)return;return e().trim()||void 0}catch{return}}function cL(){let e=dQ(),t=aQ(e,uQ);try{if(rQ(t)){let r=iQ(t,"utf8").trim();if(r.length>0)return r}}catch{}let n=`cl-${lQ()}`;try{oQ(e,{recursive:!0}),sQ(t,n,"utf8")}catch{}return n}class aT{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(pQ(d)){o[l]=d;continue}try{o[l]=JSON.stringify(d)}catch{o[l]=String(d)}}return o}}function pQ(e){return typeof e==="string"||typeof e==="number"||typeof e==="boolean"}class dT{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 _f{adapters;metadata;distinctId;deviceId;commonProperties;constructor(e={}){if(this.adapters=[...e.adapters??[]],e.logger)this.adapters.push(new dT({logger:e.logger}));this.metadata={...e.metadata??{}},this.distinctId=e.distinctId,this.deviceId=e.deviceId??dL(),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 hL{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 pL{meterProvider;loggerProvider;tracerProvider;options;constructor(e={}){this.options=e;let t=TQ({[MQ]:e.serviceName??"cline",...e.serviceVersion?{[OQ]:e.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(t),this.loggerProvider=this.createLoggerProvider(t),this.tracerProvider=this.createTracerProvider(t),this.meterProvider)gQ.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)wQ.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(e="cline",t){return yQ.getTracer(e,t??this.options.serviceVersion)}createAdapter(e){return new aT({...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 _f({...e,adapters:[t],distinctId:Pu(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=lT(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 AQ({resource:e,readers:o})}createTracerProvider(e){let t=lT(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=$Q(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 PQ({resource:e,spanProcessors:i?[new mQ,...o]:o});if(i)fQ(s);return s}createLoggerProvider(e){let t=lT(this.options.logsExporter);if(t.length===0)return null;let n=t.map((r)=>{let o=DQ(r,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!o)return null;return new SQ(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 _Q({resource:e,processors:n})}}function LQ(e){let t=new pL(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 mL(e){if(JO())return{telemetry:new hL(e)};if(e.enabled!==!0)return{telemetry:new _f({...e,distinctId:Pu(e.distinctId)})};return LQ(e)}function NQ(e){let{telemetry:t,provider:n,emitProviderCreated:r}=mL(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 lT(e){if(!e)return[];return(Array.isArray(e)?e:e.split(",")).map((n)=>n.trim()).filter((n)=>n==="console"||n==="otlp")}function DQ(e,t){if(e==="console")return new xQ;if(!t.endpoint)return null;let n=cT(t.endpoint,"/v1/logs");return new bQ({url:n,headers:t.headers})}function $Q(e,t){if(e==="console")return new CQ(new IQ);if(!t.endpoint)return null;let n=cT(t.endpoint,"/v1/traces");return new RQ(new kQ({url:n,headers:t.headers}))}function FQ(e,t){if(e==="console")return new uL({exporter:new EQ,exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout});if(!t.endpoint)return null;let n=cT(t.endpoint,"/v1/metrics");return new uL({exporter:new vQ({url:n,headers:t.headers}),exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout})}function cT(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 jQ,zodToJsonSchema as qQ}from"@cerebriline/shared";import{z as Zr}from"zod";import{resolve as fL}from"node:path";import{z as Pe}from"zod";var gL=Pe.enum(["suggestion","follow-up","todo","handoff","idea","reminder"]),UQ=Pe.enum(["pending_approval","approved","in_progress","completed","failed","cancelled","expired"]),yL=Pe.union([Pe.literal(0),Pe.literal(1),Pe.literal(2),Pe.literal(3),Pe.literal(4),Pe.literal(5)]),BQ=Pe.object({provider_id:Pe.string().min(1),model_id:Pe.string().min(1).optional()}),Ef=Pe.object({operation:Pe.enum(["create","update","list","get"]),task_id:Pe.string().min(1).optional(),expected_revision:Pe.number().int().positive().optional(),type:gL.optional(),title:Pe.string().min(1).optional(),description:Pe.string().nullable().optional(),instructions:Pe.string().min(1).optional(),scope:Pe.enum(["workspace","global"]).optional(),workspace_root:Pe.string().min(1).nullable().optional(),cwd:Pe.string().min(1).nullable().optional(),resource_paths:Pe.array(Pe.string().min(1)).optional(),priority:yL.optional(),assignee:Pe.string().min(1).nullable().optional(),model_selection:BQ.nullable().optional(),mode:Pe.enum(["act","plan","yolo"]).nullable().optional(),system_prompt:Pe.string().nullable().optional(),max_iterations:Pe.number().int().positive().nullable().optional(),timeout_seconds:Pe.number().int().positive().nullable().optional(),available_at:Pe.string().datetime().optional(),expires_at:Pe.string().datetime().optional(),automation_eligible:Pe.boolean().optional(),statuses:Pe.array(UQ).optional(),types:Pe.array(gL).optional(),priorities:Pe.array(yL).optional(),limit:Pe.number().int().positive().max(500).optional()}),HQ=new Set(["create","update"]);function uT(e,t,n,r){if(!HQ.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 wL(e){if(e===void 0||e===null)return e;return{providerId:e.provider_id,modelId:e.model_id}}function vL(e,t){return fL(e)===fL(t)}function bL(e,t){if(!e)throw Error("task does not exist");if(t.workspaceRoot){if(e.scope!=="workspace"||!e.workspaceRoot||!vL(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 WQ(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||!vL(e.workspace_root,t.workspaceRoot))throw Error(`this session can only manage ${n} tasks`)}return n}async function kL(e,t,n){let r=Ef.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=WQ(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:wL(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 uT(e,o,n,!0),l}case"update":{let d=Md(o.task_id,"task_id");if(bL(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:wL(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 uT(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 bL(d,s),{ok:!0,operation:o.operation,task:d}}}}catch(s){return uT(e,o,n,!1),{ok:!1,operation:o.operation,error:{code:"task_operation_failed",message:s instanceof Error?s.message:String(s)}}}}var Mu="tasks",TL='# 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.',zQ="# 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.",KQ=Ef.extend({kind:Zr.literal("todo")}).strict(),SL=Pd.extend({kind:Zr.literal("scheduled")}).strict(),xL=Zr.discriminatedUnion("kind",[KQ,SL]),GQ=Zr.discriminatedUnion("kind",[SL]),_L=["create","update","list","get","pause","resume","delete","run_now"],VQ=Zr.object({...Pd.shape,...Ef.shape,kind:Zr.enum(["todo","scheduled"]),operation:Zr.enum(_L)}).strict(),YQ=Zr.object({...Pd.shape,kind:Zr.enum(["scheduled"]),operation:Zr.enum(_L)}).strict();function hT(e){let t=e.todo;return jQ({name:Mu,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:qQ(t?VQ:YQ),retryable:!1,maxRetries:0,execute:async(n,r)=>{let o=(t?xL:GQ).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 kL(t,o.data,r)}}return{kind:"scheduled",...await rT(e.scheduled,o.data,r)}}})}function pT(e){return{name:"hub-task-guidance",manifest:{capabilities:["rules"]},setup:(t)=>{t.registerRule({id:"hub:task-guidance",content:e?.todoEnabled===!1?zQ:TL,whenToolAvailable:Mu})}}}import{createSessionId as dee,ensureLoopbackProxyBypass as QL,isHubProtocolCompatible as lee,resolveClineBuildEnv as cee,resolveHubCommandTimeoutMs as uee}from"@cerebriline/shared";import hee from"ws";var Af="0.0.92";var Oi={name:"@cerebriline/core",description:"Cline Core SDK for Node Runtime",version:Af,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 Rf="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 If(e){return e instanceof Od||typeof e==="object"&&e!==null&&"code"in e&&e.code==="session_not_found"}import{spawn as IZ}from"node:child_process";import{closeSync as CZ,mkdirSync as PZ,openSync as MZ,readFileSync as OZ,unlinkSync as LZ}from"node:fs";import{basename as NZ,dirname as DZ,join as $Z}from"node:path";import{fileURLToPath as FZ}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as UZ,isBunEmbeddedModulePath as BZ,isHubDaemonProcess as qL,resolveClineBuildEnv as zL,withResolvedClineBuildEnv as HZ}from"@cerebriline/shared";import{createHash as XQ,randomBytes as ML}from"node:crypto";import{existsSync as JQ}from"node:fs";import{mkdir as fT,open as AL,readFile as OL,rename as QQ,rm as Cf,writeFile as ZQ}from"node:fs/promises";import{dirname as LL,join as gT}from"node:path";import{ensureLoopbackProxyBypass as eZ,isHubProtocolCompatible as tZ}from"@cerebriline/shared";import{resolveClineDataDir as Ou,resolveClineDir as Ize}from"@cerebriline/shared/storage";var nZ="CLINE_HUB_DISCOVERY_PATH",rZ="CLINE_HUB_BUILD_ID",oZ="CLINE_HUB_BUILD_EPOCH_MS",iZ=30000,sZ=15000,RL=100;function aZ(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function dZ(e){return XQ("sha256").update(e).digest("hex").slice(0,12)}function lZ(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 NL(){return ML(32).toString("hex")}function IL(e){return new Promise((t)=>setTimeout(t,e))}function cZ(e){return`${e}.lock`}async function uZ(e){try{let t=JSON.parse(await OL(gT(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 mT(e){await Cf(e,{recursive:!0,force:!0}).catch(()=>{return})}function eo(){let e=process.env[rZ]?.trim();if(e)return e;return"sdk-v1-ae0398ec8aafc784b621c159c759e7880762e2aea04c797ef2d90837a45894e8".trim()||`source-${String(Oi.version)}`}function yT(){let e=Number(process.env[oZ]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1793518707834)?1793518707834:void 0}function Fs(e,t=eo()){let n=tZ(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 CL(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0}function PL(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 hZ(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 Lu(e,t){let n=e.buildId?.trim(),r=t.buildId?.trim();if(n&&r&&n===r)return 0;let o=CL(e.buildEpochMs),i=CL(t.buildEpochMs);if(o!==void 0&&i!==void 0&&o!==i)return o<i?-1:1;let s=PL(e.coreVersion),a=PL(t.coreVersion);if(s&&a){let d=hZ(s,a);if(d!==0)return d}if(n&&r&&n!==r)return n<r?-1:1;return 0}function Nu(){return{buildId:eo(),buildEpochMs:yT(),coreVersion:String(Oi.version)}}function Ld(e,t){let n=t?.self??Nu(),r=Fs(e,n.buildId??"");if(r.compatible)return!0;if(r.reason!=="build_mismatch"&&r.reason!=="missing_build")return!1;return Lu(n,e)<=0}function Us(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${dZ(e)}`,n=process.env[nZ]?.trim()||gT(Ou(),"locks","hub","owners",`${aZ(t)}.json`);return{ownerId:t,discoveryPath:n}}function Pze(e=`hub-${Date.now().toString(36)}`){return Us(e)}async function qt(e){try{let t=JSON.parse(await OL(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 Pf(e,t,n){await wT(e,async()=>{let r=LL(e);await fT(r,{recursive:!0});let o=`${e}.${process.pid}.${ML(6).toString("hex")}.tmp`,i;try{i=await AL(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 QQ(o,e);let s;try{s=await AL(r,"r"),await s.sync()}catch{}finally{await s?.close().catch(()=>{return})}}catch(s){throw await i?.close().catch(()=>{return}),await Cf(o,{force:!0}).catch(()=>{return}),s}})}async function Wo(e){await wT(e,async()=>{await Cf(e,{force:!0}).catch(()=>{return})})}async function DL(e,t){return await wT(e,async()=>{if((await qt(e))?.hubId!==t)return!1;return await Cf(e,{force:!0}),!0})}async function $L(e,t,n){let r=cZ(e);await fT(LL(r),{recursive:!0});let o=Date.now()+sZ;while(!0){try{await fT(r,{recursive:!1})}catch(i){if((i instanceof Error&&"code"in i?String(i.code):"")!=="EEXIST")throw i;let a=await uZ(r);if(!a){if(Date.now()>=o){await mT(r);continue}await IL(RL);continue}let d=Date.now()-Date.parse(a.acquiredAt);if(!lZ(a.pid)||d>iZ){await mT(r);continue}if(Date.now()>=o)throw Error(`Timed out waiting for hub ${t} lock ${r}`);await IL(RL);continue}try{return await ZQ(gT(r,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
323
323
  `,"utf8"),await n()}finally{await mT(r)}}}function wT(e,t){return $L(`${e}.mutation`,"discovery mutation",t)}function Mf(e,t){return $L(e,"startup",t)}async function jo(e,t){eZ();try{let n=await fetch(t?.authToken?pZ(e):FL(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 FL(e){let t=new URL(e);return t.protocol=t.protocol==="wss:"?"https:":"http:",t.pathname="/health",t.search="",t.toString()}function pZ(e){let t=new URL(FL(e));return t.pathname="/status",t.toString()}function Mze(e){return JQ(e)}import{CLINE_HUB_DEV_PORT as mZ,CLINE_HUB_PORT as fZ,resolveClineBuildEnv as gZ}from"@cerebriline/shared";var yZ="CLINE_HUB_HOST",wZ="CLINE_HUB_PORT",bZ="CLINE_HUB_PATHNAME",vZ="127.0.0.1",kZ=fZ,TZ="/hub";function UL(e){return gZ(e)==="development"?mZ:kZ}function SZ(e={}){return(e.env??process.env)[yZ]?.trim()||vZ}function Of(e={}){let n=(e.env??process.env)[wZ]?.trim();if(!n)return UL(e);let r=Number.parseInt(n,10);if(!Number.isInteger(r)||r<1||r>65535)return UL(e);return r}function xZ(e={}){return(e.env??process.env)[bZ]?.trim()||TZ}function Bs(e={},t={}){return{host:e.host??SZ(t),port:e.port??Of(t),pathname:e.pathname??xZ(t)}}import{join as _Z}from"node:path";var EZ="shared:cline",AZ="CLINE_HUB_DISCOVERY_PATH",RZ="hub-production";function Uze(e){let t=Ms(e.trim());return Us(`workspace:${t||e.trim()}`)}function Er(e=EZ){return Us(`${e}@${eo()}`)}function to(){return{ownerId:RZ,discoveryPath:process.env[AZ]?.trim()||_Z(Ou(),"locks","hub","production.json")}}var BL=15000,WZ=200,HL=3000,jZ=100,qZ=[100,250,500,1000,2000],zZ="--cline-hub-daemon",KZ=3,GZ=60000,kT=new Map,Xze={resetRetireAttempts(){kT.clear()},resolveDaemonEntryArgs:GL};function VZ(e,t=Date.now()){let n=kT.get(e);if(!n||t-n.windowStartedAt>GZ)return kT.set(e,{count:1,windowStartedAt:t}),!0;return n.count+=1,n.count<=KZ}function YZ(e){return[...e.host?["--host",e.host]:[],...typeof e.port==="number"?["--port",String(e.port)]:[],...e.pathname?["--pathname",e.pathname]:[]]}function XZ(){try{let e=$Z(Ou(),"logs","hub-daemon.log");return PZ(DZ(e),{recursive:!0}),{fd:MZ(e,"a"),logPath:e}}catch{return}}function KL(){return zL()==="production"?to():Er()}function Du(e){return Ld(e)}function JZ(e){try{let t=JSON.parse(OZ(`${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 bT(e){try{LZ(`${e}.superseded`)}catch{}}function WL(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 jL(e,t){let n=Date.now()+t;while(Date.now()<n){if(!(await Nd(e))?.url)return!0;await new Promise((o)=>setTimeout(o,jZ))}return!1}async function Dd(e,t){if(!VZ(e.url))return!1;await Hs(e.url,e.authToken,"retired by newer install").catch(()=>!1),await ST(e.url,e.authToken).catch(()=>!1);let n=await jL(e.url,HL);if(!n&&e.pid&&QZ(e.pid)){try{process.kill(e.pid,"SIGTERM")}catch{}n=await jL(e.url,HL)}if(n)await Wo(t).catch(()=>{return});return n}function QZ(e){try{return process.kill(e,0),!0}catch(t){return t?.code==="EPERM"}}async function TT(e){try{return(await Fd(e.url,e.authToken)).activeSessionCount>0}catch{return!1}}async function vT(e,t){if(Du(e))return"reusable";let n=await Hs(e.url,e.authToken,"retired by newer install").catch(()=>!1);if(await TT(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 ZZ(e){if(zL()!=="production")return;let t=Er();if(t.discoveryPath===e.discoveryPath)return;let n=await qt(t.discoveryPath);if(n?.url)await Dd(n,t.discoveryPath);else await Wo(t.discoveryPath).catch(()=>{return})}function eee(){let e=import.meta.url.endsWith(".ts")?"ts":"js";return FZ(new URL(`./entry.${e}`,import.meta.url))}function GL(e,t){if(BZ(e))return[zZ];return[...t&&e.toLowerCase().endsWith(".ts")?["--conditions=development"]:[],e]}function tee(e,t){let n=eee(),r=process.execPath?.trim();if(!r)throw Error("unable to resolve runtime executable for hub daemon");let o=NZ(r).toLowerCase().includes("bun"),i=GL(n,o);return{launcher:r,args:[...i,"--cwd",e,...YZ(t),...t.manageConnectors===!1?["--no-connectors"]:[]],cwd:e,env:{...HZ(process.env),CLINE_NO_INTERACTIVE:"1",[UZ]:"1"}}}function nee(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 ree(e,t={}){if(qL())return;let n=tee(e,t),r=XZ();try{IZ(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)CZ(r.fd)}}async function oee(e,t={}){for(let n=0;;n++)try{ree(e,t);return}catch(r){let o=qZ[n];if(!nee(r)||o===void 0)throw r;await new Promise((i)=>setTimeout(i,o))}}function Jze(e,t={}){if(qL())return;$u(e,t).catch(()=>{})}async function iee(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 VL(m.url,m.authToken);return m};await ZZ(e).catch(()=>{return});let a=await qt(e.discoveryPath),d=a?.url?void 0:JZ(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&&Du(f)&&await nr(f.url,{authToken:m}))return bT(e.discoveryPath),s({url:f.url,authToken:m});if(f?.url){if(await vT({...f,authToken:m},e.discoveryPath)==="deferred_busy"&&await nr(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=WL(c,a??d,i);if(Du(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 nr(c.url,{authToken:w}))continue;let k={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 Pf(e.discoveryPath,k)}catch{}return bT(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 vT(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 nr(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 oee(t,{...h,manageConnectors:n.manageConnectors});let p=Date.now()+BL;while(Date.now()<p){let m=await qt(e.discoveryPath);if(m?.url&&m.authToken){let g=await Nd(m.url,m.authToken);if(g?.url&&Du(g)&&await nr(g.url,{authToken:m.authToken}))return bT(e.discoveryPath),s({url:g.url,authToken:m.authToken})}let f=await Nd(i);if(f?.url&&!Du(f)){let g=WL(f,m??d,i),y=await vT(g,e.discoveryPath);if(y==="deferred_busy"&&m?.authToken&&await nr(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,WZ))}throw Error(`Timed out after ${BL}ms waiting for detached hub startup.`)}async function $u(e,t={}){let n=KL();return await Mf(n.discoveryPath,async()=>iee(n,e,t))}var see=5000,aee=500;async function Qze(e={}){let t=KL(),n=e.workspaceRoot??process.cwd(),r=await qt(t.discoveryPath),o=r?.url?await Nd(r.url,r.authToken):void 0;if(!o?.url)return{outcome:"started",...await $u(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(Lu(Nu(),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??see),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,aee))}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 $u(n),activeSessionCount:l??0}}function IT(){return cee()==="production"?to():Er()}function pee(){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 ZL(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 ZL(e.data);return String(e)}function mee(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 YL(e){let t=e,n=mee(t.reason);return new an("hub_connection_closed",t.code||n?`Hub connection closed (code=${t.code??0}${n?`, reason=${n}`:""})`:_T,{closeCode:t.code,closeReason:n||void 0})}function XL(e,t){if(e instanceof an)return e;if(e instanceof Error)return new an("hub_connect_failed",e.message);if(e&&typeof e==="object"&&"error"in e&&e.error instanceof Error)return new an("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 an("hub_connect_failed",n);let r=e&&typeof e==="object"&&"type"in e&&typeof e.type==="string"?e.type.trim():"";return new an("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 xT="*",Lf=8000,fee="cline-hub-auth.",CT=new Map,eN=new Set,gee=3000,yee=3000,wee=100,_T="Hub connection closed",bee=250,vee=5000,JL=0.5;class an extends Error{code;details;constructor(e,t,n){super(t);this.code=e;this.details=n;this.name="HubTransportError"}}function kee(e){return e instanceof an}class Nf extends Error{command;code;constructor(e,t,n){super(n);this.command=e;this.code=t;this.name="HubCommandError"}}function aKe(e,t){return e instanceof Nf&&e.code==="hub_command_timeout"&&(t===void 0||e.command===t)}function PT(e,t={}){let n=e.searchParams.get("authToken")?.trim();if(e.searchParams.delete("authToken"),n)return n;if(t.skipRegistry)return;let r=$f(e.toString());return r?CT.get(r):void 0}function Tee(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 $f(e){if(!Tee(e))return;let t=new URL(Df(e));return t.search="",t.hash="",t.toString()}function ET(e){let t=$f(e);return!!t&&eN.has(t)}function $d(e,t){let n=$f(e);if(n){if(eN.add(n),t?.trim())CT.set(n,t)}return e}function VL(e,t){let n=$f(e);if(n&&t?.trim())CT.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 an("hub_connection_closed",_T);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()||PT(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=XL(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 an("hub_connect_timeout",`Timed out resolving hub connection headers after ${Lf}ms`))},Lf)})])}catch(l){let c=l instanceof an?l:new an("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 an("hub_connect_failed","Hub connection headers cannot set Sec-WebSocket-Protocol.");if(n===this.connectGeneration)this.lastCloseError=d;throw d}let i=o?new hee(e.toString(),{headers:{...o}}):new(pee())(e.toString(),t?[`${fee}${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 an("hub_connect_timeout",`Timed out connecting to hub after ${Lf}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)},Lf);i.addEventListener("open",()=>{if(c)return;c=!0,clearTimeout(u),d()}),i.addEventListener("error",(h)=>{if(c)return;c=!0,clearTimeout(u);let p=XL(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:YL(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(ZL(d)))}),i.addEventListener("close",(d)=>{if(this.socket!==i)return;if(!s)this.lastCloseError=YL(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=dee("hubreq_");r?.onDispatch?.(i);let s=uee(e,r?.timeoutMs),a=new Promise((l,c)=>{let u=s===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(i))return;c(new Nf(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===Rf){let l=n??(typeof t?.sessionId==="string"?t.sessionId:void 0);throw new Od(l,d.error.message)}throw new Nf(e,d.error?.code,d.error?.message??`Hub command ${e} failed`)}return d}async recoverLocalHubTransport(e){if(!ET(this.currentUrl)||!kee(e))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let t=await RT({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(bee*2**this.reconnectAttempt,vee),t=Math.round(e*(1-JL)+Math.random()*e*JL);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(!ET(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let e=await RT({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 an("hub_connection_closed",_T);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 an("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??xT}subscriptionSessionIdFromKey(e){return e===xT?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[xT,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 Df(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 nr(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 AT(e,t){let n=Df(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(!lee(r).compatible)return{status:"protocol_mismatch",url:n};if(t?.verifyConnection===!0&&!await nr(n,{workspaceRoot:t.workspaceRoot,cwd:t.cwd,authToken:t.authToken}))return{status:"unreachable",url:n};return{status:"compatible",url:n}}async function See(e){let t=Date.now()+yee;while(Date.now()<t){if(!(await jo(e).catch(()=>{return}))?.url)return!0;await new Promise((r)=>setTimeout(r,wee))}return!1}function xee(e,t){try{return Df(e)===Df(t)}catch{return!1}}function tN(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 dKe(e){return tN(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:gee});return tN(o.payload)}finally{await r.dispose().catch(()=>{return})}}async function nN(e,t,n){try{return(await Fd(e,t,n)).activeSessionCount===0}catch{return!1}}async function _ee(e,t){let n=`${e.discoveryPath}.superseded`,r=await qt(n);if(!r?.url||!r.authToken)return;let o=await AT(r.url,{authToken:r.authToken});if(o.status!=="compatible")return;if(await nN(o.url,r.authToken,t))return;return $d(o.url,r.authToken)}async function Eee(e={}){if(e.endpoint?.trim()){let o=await AT(e.endpoint);return o.status==="compatible"?o.url:void 0}let t=IT(),n=await qt(t.discoveryPath);if(!n?.url)return await _ee(t,e);let r=await AT(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 RT(e={}){let t=await Eee(e);if(t&&await nr(t,{workspaceRoot:e.workspaceRoot,cwd:e.cwd}))return t;if(e.endpoint?.trim())return;try{return(await $u(e.workspaceRoot??process.cwd())).url}catch(n){e.onStartupError?.(n);return}}async function Hs(e,t,n,r){QL();let o=new URL(e),i=t?.trim()||PT(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 ST(e,t){QL();let n=new URL(e),r=t?.trim()||PT(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 Aee(e=IT()){let t=await qt(e.discoveryPath);if(!t?.url)return!1;try{if(await ST(t.url,t.authToken))return!0}catch{}return!1}async function lKe(e){if(!ET(e.url))return;let t=IT(),n=await qt(t.discoveryPath);if(!n?.url||!xee(n.url,e.url))return;if(!await nN(n.url,n.authToken,{workspaceRoot:e.workspaceRoot,cwd:e.cwd}))return;if(!await Aee())return;if(!await See(n.url))return;return await Wo(t.discoveryPath).catch(()=>{return}),await RT({workspaceRoot:e.workspaceRoot,cwd:e.cwd})}import{resolveClineBuildEnv as Ree}from"@cerebriline/shared";function Iee(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 Cee="cline-hub-auth.";function Pee(e){return e.host!==void 0||e.port!==void 0||e.pathname!==void 0}function Mee(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 rN(){return Ree()==="production"?to():Er()}async function Oee(e){let t=e.searchParams.get("authToken")?.trim();if(e.searchParams.delete("authToken"),t)return t;let n=rN(),r=await qt(n.discoveryPath);if(r?.url&&Mee(e.toString(),r.url))return r.authToken;return}async function Lee(e={}){let t=Bs(e);if(!Pee(e)){let n=rN(),r=await qt(n.discoveryPath);if(r?.url)return r.url}return qo(t.host,t.port,t.pathname)}async function oN(e){return await new Promise((t,n)=>{(async()=>{let r=new URL(e),o=await Oee(r);r.hash="";let i=new WebSocket(r.toString(),o?[`${Cee}${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(Iee(d,e))})})().catch(n)})}async function fKe(e){try{return(await oN(e)).close(),!0}catch{return!1}}async function gKe(e,t){let n=await Lee(e),r=await oN(n);try{return await r.send({version:t.version??"v1",clientId:t.clientId??"hub-client",...t})}finally{r.close()}}import{existsSync as Nee}from"node:fs";import{isHubDaemonProcess as Dee,resolveClineBuildEnv as $ee}from"@cerebriline/shared";var Fee=1e4,Uee="CLINE_HUB_BUILD_WATCH_INTERVAL_MS";function Bee(){let e=Number(process.env[Uee]);return Number.isFinite(e)&&e>0?e:Fee}async function Hee(e,t){try{let n=await Fd(e.url,t);return{...e,activeSessionCount:n.activeSessionCount,participantClientCount:n.participantClientCount}}catch{return e}}function Wee(){return $ee()==="production"?to():Er()}function jee(e){try{return Nee(`${e}.lock`)}catch{return!1}}async function qee(){let e=Wee();if(jee(e.discoveryPath))return;let t=await qt(e.discoveryPath).catch(()=>{return});if(!t?.url)return;let n=await jo(t.url).catch(()=>{return});if(!n?.url)return;let r=eo(),o=Fs(n,r);if(o.compatible)return;let i=(a)=>({url:n.url,reason:a,hubBuildId:n.buildId,hubCoreVersion:n.coreVersion,expectedBuildId:r});if(o.reason==="unsupported_protocol")return i("unsupported_protocol");let s=Nu();if(s.coreVersion&&n.coreVersion&&s.coreVersion===n.coreVersion)return;if(Lu(s,n)>0)return await Hee(i("outdated_hub"),t.authToken);return i("build_mismatch")}function SKe(e){if(Dee()||process.env.CLINE_HUB_PORT?.trim())return()=>{};let t=e.intervalMs??Bee(),n,r,o=!1,i=setInterval(()=>{if(o)return;o=!0,qee().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 MT(e){return e?JSON.parse(JSON.stringify(e)):{}}function Ff(e){let t=e?.session&&typeof e.session==="object"?e.session:void 0;if(!t)return;let n=t.metadata&&typeof t.metadata==="object"?MT(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 iN(e,t){return e.error?.message??`hub command failed: ${t}`}function zee(e){let t=MT(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 sN(e){let t=e?.sessionId;return typeof t==="string"&&t.trim()?t.trim():void 0}function Kee(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 Gee(e){let t=MT(e.payload);if(e.event==="schedule.execution_completed")return{sessionId:e.sessionId?.trim()||sN(t)||"",eventType:"schedule.execution.completed",payload:t};if(e.event==="schedule.execution_failed")return{sessionId:e.sessionId?.trim()||sN(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:zee(e.payload)};case"run.completed":return{sessionId:n,eventType:"runtime.chat.completed",payload:t};default:return}}class Vee{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=Ff(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(If(n))return;throw n}return Ff(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(iN(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(iN(o,"session.restore"));let i=Ff(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=Kee(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)=>Ff({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=Gee(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 Yee{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 gBe}from"@cerebriline/llms";import{existsSync as T1e,readdirSync as S1e}from"node:fs";import{readFile as x1e}from"node:fs/promises";import{homedir as _1e}from"node:os";import{isAbsolute as OY,join as Ei,resolve as m0}from"node:path";import{onXollamaSideCall as E1e,releasePolykvSwarmsOf as IY}from"@cerebriline/llms";import{applyPromptTemplateToTools as A1e,captureSdkError as vr,createSessionId as R1e,isLikelyAuthError as I1e,normalizeUserInput as C1e}from"@cerebriline/shared";import{setHomeDirIfUnset as P1e}from"@cerebriline/shared/storage";import{decodeJwtPayload as qte,getClineEnvironmentConfig as RN}from"@cerebriline/shared";import{decodeJwtPayload as nte,getClineEnvironmentConfig as rte}from"@cerebriline/shared";import{createHash as Xee}from"node:crypto";var Jee;function Un(e){if(typeof e!=="string"||e.length===0)return"unset";return Xee("sha256").update(e).digest("hex").slice(0,8)}function ct(e){try{Jee?.debug(e)}catch{}}function Qee(){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??Zee,i=Qee(),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 k={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(k.error){y.statusCode=400,y.end(`Authentication failed: ${k.error}`),u(),c(k);return}if(!k.code){y.statusCode=400,y.end("Missing authorization code");return}if(e.expectedState&&k.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(k)}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 Zee=`<!DOCTYPE html>
324
324
  <html lang="en">
@@ -1307,8 +1307,8 @@ To see a version: \`read_files\` with \`revision: "#${d}"\`. To apply it to your
1307
1307
  `,{encoding:"utf8",mode:384}),YPe(r,this.filePath)}catch(o){throw XPe(r,{force:!0}),o}this.cache=void 0;try{k4(this.filePath,384)}catch{}ov(t)}saveProviderSettings(e,t={}){let n=r0e(im.parse(e)),r=this.read(),o=n.provider,i=t.setLastUsed!==!1,s=r.providers[o],a=t.tokenSource??s?.tokenSource??"manual",d={...r,providers:{...r.providers,[o]:{settings:n,updatedAt:e0e(),tokenSource:a}},lastUsedProvider:i?o:r.lastUsedProvider};this.write(d);let l=r.providers.cline?.settings?.auth,c=n.provider==="cline"?n.auth:d.providers.cline?.settings?.auth,u=!!l?.accessToken&&!c?.accessToken;return ct(`providers.save providerId=${o} tokenSource=${a} clineAuthWasPresent=${!!l?.accessToken} clineAuthIsPresent=${!!c?.accessToken} authDropped=${u}`),d}resolveProviderSettings(e,t){let n=e.providers[t]?.settings,o=no(t)?.storageProviderId;if(!o||o===t)return n;let i=e.providers[o]?.settings;if(!i)return n;return im.parse({...i.auth?{auth:i.auth}:{},...i.apiKey?{apiKey:i.apiKey}:{},...i.baseUrl?{baseUrl:i.baseUrl}:{},...n??{},provider:t})}getProviderSettings(e){let t=this.read();return this.resolveProviderSettings(t,e)}getVoiceInputSettings(){return this.read().modes.voiceInput}setVoiceInputSettings(e){let t=this.read();if(e)t.modes.voiceInput=eC.parse(e);else delete t.modes.voiceInput;return this.write(t),t}resolveLastUsedProviderId(e,t){let n=e.lastUsedProvider;if(n===n0e&&t.isClinePassEnabled===!1)return t0e;return n}getLastUsedProviderSettings(e={}){let t=this.read(),n=this.resolveLastUsedProviderId(t,e);if(!n)return;return this.resolveProviderSettings(t,n)}getProviderConfig(e,t){let n=this.getProviderSettings(e);if(!n)return;return Za(n,t)}getLastUsedProviderConfig(e={}){let t=this.getLastUsedProviderSettings(e);if(!t)return;return Za(t,e)}async refreshCatalog(){try{await rv({})}catch{}}}import{createHash as i0e}from"node:crypto";import{resolve as s0e}from"node:path";import{setTimeout as a0e}from"node:timers/promises";import{loadSqliteDb as d0e}from"@cerebriline/shared/db";async function _4(e,t,n){let r=i0e("sha256").update(t).digest("hex"),o=d0e(`${s0e(e)}.oauth-${r}.lock`),i=!1,s=Date.now()+60000;try{o.exec("PRAGMA busy_timeout = 0;");while(!i)try{o.exec("BEGIN EXCLUSIVE;"),i=!0}catch(a){let d=a instanceof Error?a.message:String(a),l=a?.code;if(!(l==="SQLITE_BUSY"||l==="SQLITE_LOCKED"||/SQLITE_BUSY|SQLITE_LOCKED|database is locked/.test(d)))throw a;if(Date.now()>=s)throw Error("Timed out waiting for another process to refresh OAuth credentials.");await a0e(25)}return await n()}finally{try{if(i)o.exec("ROLLBACK;")}finally{o.close?.()}}}function dC(e,t){let n=e?.expiresAt,r=t?.expiresAt;return e?.accessToken===t?.accessToken&&e?.refreshToken===t?.refreshToken&&e?.accountId===t?.accountId&&n===r}class Hc extends Error{providerId;constructor(e){super(`OAuth credentials for provider "${e}" are no longer valid. Re-run authentication for this provider.`);this.name="OAuthReauthRequiredError",this.providerId=e}}class lm{providerSettingsManager;telemetry;refreshInFlight=new Map;constructor(e){this.providerSettingsManager=e?.providerSettingsManager??new Hr,this.telemetry=e?.telemetry}async resolveProviderApiKey(e){let t=no(e.providerId);if(!t)return null;return this.resolveWithSingleFlight(t.providerId,t.storageProviderId,e.forceRefresh)}async resolveWithSingleFlight(e,t,n=!1){let r=this.refreshInFlight.get(t);if(r)return r;let o=this.providerSettingsManager.getProviderSettings(t);if(!o||!WT(e,o))return null;let i=o.auth,s=_4(this.providerSettingsManager.getFilePath(),t,()=>this.resolveProviderApiKeyInternal(e,t,n&&dC(i,this.providerSettingsManager.getProviderSettings(t)?.auth))).finally(()=>{this.refreshInFlight.delete(t)});return this.refreshInFlight.set(t,s),s}async resolveProviderApiKeyInternal(e,t,n){let r=no(e);if(!r)return null;let o=this.providerSettingsManager.getProviderSettings(t);if(!o)return ct(`oauth.resolve providerId=${e} storageProviderId=${t} outcome=no_settings`),null;let i=WT(e,o);if(!i)return ct(`oauth.resolve providerId=${e} storageProviderId=${t} outcome=no_credentials`),null;ct(`oauth.resolve.start providerId=${e} storageProviderId=${t} forceRefresh=${n} accessTokenHash=${Un(i.access)} refreshTokenHash=${Un(i.refresh)}`);let s=await r.refresh({settings:o,credentials:i,forceRefresh:n,telemetry:this.telemetry}),a=this.providerSettingsManager.getProviderSettings(t);if(!dC(o.auth,a?.auth))return null;if(!s)throw ct(`oauth.resolve providerId=${e} outcome=refresh_returned_null`),new Hc(e);let d=jT({manager:this.providerSettingsManager,providerId:e,settings:{...o,...a},credentials:s,setLastUsed:!1,save:!1}),l=!dC(o.auth,d.auth);if(l)ct(`oauth.resolve.refreshed providerId=${e} newAccessTokenHash=${Un(s.access)} newRefreshTokenHash=${Un(s.refresh)} savingToDisk=true`),this.providerSettingsManager.saveProviderSettings(d,{setLastUsed:!1,tokenSource:"oauth"});else ct(`oauth.resolve providerId=${e} outcome=not_refreshed`);return{apiKey:r.getApiKey(d)??s.access,accountId:s.accountId,refreshed:l}}}import{existsSync as l0e,mkdirSync as c0e,readFileSync as u0e,writeFileSync as h0e}from"node:fs";import{dirname as p0e}from"node:path";import{FEATURE_FLAGS as E4,FeatureFlagDefaultValue as lC}from"@cerebriline/shared";var m0e=3600000,f0e=604800000,A4=2;class cC{provider;telemetry;logger;cacheTtlMs;cacheFilePath;persistentCacheMaxAgeMs;context;cache=new Map;cacheInfo={updateTime:0,userId:null};pendingPoll;constructor(e){this.provider=e.provider,this.telemetry=e.telemetry,this.logger=e.logger,this.cacheTtlMs=e.cacheTtlMs??m0e,this.cacheFilePath=e.cacheFilePath,this.persistentCacheMaxAgeMs=e.persistentCacheMaxAgeMs??f0e,this.context={...e.context??{}},this.hydrateFromPersistentCache()}setContext(e){let t=this.cacheInfo.userId!==(e.userId??null);if(this.context={...e},t)this.pendingPoll=void 0,this.cache.clear(),this.cacheInfo={updateTime:0,userId:e.userId??null}}hydrateCache(e){this.cacheInfo={updateTime:e.updateTime,userId:e.userId,flagsPayload:e.flagsPayload},this.rebuildCacheFromSnapshot(e.flagsPayload)}getCacheSnapshot(){return{updateTime:this.cacheInfo.updateTime,userId:this.cacheInfo.userId,flagsPayload:this.cacheInfo.flagsPayload}}async poll(e){let t=e??this.context.userId??null;if(this.pendingPoll?.userId===t)return this.pendingPoll.promise;let n={userId:t,promise:this.pollFlags(t)};this.pendingPoll=n;try{await n.promise}finally{if(this.pendingPoll===n)this.pendingPoll=void 0}}async pollFlags(e){let t=Date.now();if(t-this.cacheInfo.updateTime<this.cacheTtlMs){if(this.cacheInfo.userId===e)return}let n=this.cacheInfo;this.cacheInfo={updateTime:t,userId:e||null};try{let r=await this.provider.getAllFlagsAndPayloads({flagKeys:E4.length>0?E4:void 0,context:{...this.context,userId:e}});if(this.cacheInfo.userId!==e)return;this.cacheInfo.flagsPayload=r,this.rebuildCacheFromSnapshot(r),this.writePersistentCache()}catch(r){if(this.cacheInfo.userId!==e)return;throw this.cacheInfo=n.updateTime?n:{updateTime:0,userId:null},this.logger?.error?.("Error polling SDK feature flags",{error:r}),r}}hydrateFromPersistentCache(){let e=this.readPersistentCache();if(!e)return;if(e.userId&&this.context.userId&&e.userId!==this.context.userId)return;this.hydrateCache(e)}isFeatureFlagPayload(e){if(e===null||typeof e==="string"||typeof e==="number"||typeof e==="boolean")return!0;if(Array.isArray(e))return e.every((t)=>this.isFeatureFlagPayload(t));if(typeof e==="object")return Object.values(e).every((t)=>this.isFeatureFlagPayload(t));return!1}readPayloadRecord(e){if(!e||typeof e!=="object"||Array.isArray(e))return;let t=Object.entries(e).filter(([,r])=>this.isFeatureFlagPayload(r));if(t.length===0)return;let n={};for(let[r,o]of t)n[r]=o;return n}readPersistentCache(){try{if(!this.cacheFilePath||!l0e(this.cacheFilePath))return;let e=JSON.parse(u0e(this.cacheFilePath,"utf8"));if(!e||typeof e!=="object")return;let t=e;if(t.version!==A4||typeof t.updatedAt!=="number"||!Number.isFinite(t.updatedAt)||Date.now()-t.updatedAt>this.persistentCacheMaxAgeMs)return;return{updateTime:t.updatedAt,userId:t.userId??null,flagsPayload:{featureFlags:this.readPayloadRecord(t.flagsPayload?.featureFlags),featureFlagPayloads:this.readPayloadRecord(t.flagsPayload?.featureFlagPayloads)}}}catch(e){this.logger?.error?.("Error reading SDK feature flags cache",{error:e});return}}writePersistentCache(){try{if(!this.cacheFilePath)return;c0e(p0e(this.cacheFilePath),{recursive:!0,mode:448});let e=this.getCacheSnapshot(),t={version:A4,updatedAt:e.updateTime,userId:e.userId,flagsPayload:e.flagsPayload};h0e(this.cacheFilePath,`${JSON.stringify(t,null,2)}
1308
1308
  `,"utf8")}catch(e){this.logger?.error?.("Error writing SDK feature flags cache",{error:e})}}getReturnedFlagKeys(e){return[...new Set([...Object.keys(e?.featureFlags??{}),...Object.keys(e?.featureFlagPayloads??{})])]}rebuildCacheFromSnapshot(e){let t=new Map;for(let n of this.getReturnedFlagKeys(e)){let r=this.getFeatureFlag(n);t.set(n,r??!1)}this.cache=t}getFeatureFlag(e){try{let t=this.cacheInfo.flagsPayload?.featureFlagPayloads?.[e],n=this.cacheInfo.flagsPayload?.featureFlags?.[e],r=t??n??lC[e]??void 0;if(!this.cache.has(e)||this.cache.get(e)!==r)this.telemetry?.capture({event:Ae.FEATURE_FLAGS.FLAG_CALLED,properties:{$feature_flag:e,$feature_flag_response:n}});return r}catch(t){return this.logger?.error?.(`Error checking SDK feature flag ${e}`,{error:t}),lC[e]??!1}}getBooleanFlagEnabled(e){return this.cache.get(e)===!0}getFlagPayload(e){return this.cache.get(e)??lC[e]}getProvider(){return this.provider}get enabled(){return this.provider.enabled}getSettings(){return this.provider.getSettings()}test(e,t){if(process.env.IS_TEST==="true")this.cache.set(e,t)}async dispose(){await this.provider.dispose()}}var Wc;function R4(){return new Hr().getProviderSettings("cline")?.auth?.accountId?.trim()||void 0}async function uC(e){let t=R4(),n=process.env.TELEMETRY_SERVICE_API_KEY;if(!t||!n)return Wc=void 0,!1;if(Wc?.accountId!==t||Wc.apiKey!==n)Wc={accountId:t,apiKey:n,service:new cC({context:{distinctId:t,userId:t},cacheTtlMs:60000,provider:{enabled:!0,getSettings:()=>({enabled:!0}),dispose:async()=>{},async getAllFlagsAndPayloads(o){let{buildClinePostHogClient:i,PostHogFeatureFlagsProvider:s}=await import("@cerebriline/core/services/feature-flags/posthog"),a=new s({client:i(n),config:{}});try{return await a.getAllFlagsAndPayloads(o)}finally{await a.dispose()}}}})};let r=Wc;try{return r.pending??=r.service.poll().finally(()=>{r.pending=void 0}),await r.pending,Wc===r&&R4()===t&&r.service.getCacheSnapshot().flagsPayload?.featureFlags?.[e]===!0}catch{return!1}}import*as Nn from"@cerebriline/llms";import{isTranscriptionModel as hnt,MODEL_TOOL_NAMES as pnt,resolveProviderApiKeyOptional as mnt,resolveProviderLocalCli as fnt}from"@cerebriline/shared";import{buildClineClientHeaders as Btt,GENERATED_CLINE_RECOMMENDED_MODELS as g0e,getGeneratedProviderModels as y0e,VERCEL_OPENROUTER_MODEL_ID_ALIAS_RULES as w0e}from"@cerebriline/llms";import{getClineEnvironmentConfig as Wtt}from"@cerebriline/shared";var ztt=T0e(b0e(g0e)??{recommended:[],free:[],clinePass:[]},y0e());function hC(e){if(!e||typeof e!=="object")return null;let t=e;if(typeof t.id!=="string"||t.id.length===0)return null;return{id:t.id,name:typeof t.name==="string"&&t.name.length>0?t.name:t.id,description:typeof t.description==="string"?t.description:"",tags:Array.isArray(t.tags)?t.tags.filter((n)=>typeof n==="string"):[]}}function b0e(e){if(!e||typeof e!=="object")return null;let t=e,n=Array.isArray(t.recommended)?t.recommended:[],r=Array.isArray(t.free)?t.free:[],o=Array.isArray(t.clinePass)?t.clinePass:[],i=n.map(hC).filter((d)=>d!==null),s=r.map(hC).filter((d)=>d!==null),a=o.map(hC).filter((d)=>d!==null);if(i.length===0&&s.length===0&&a.length===0)return null;return{recommended:i,free:s,clinePass:a}}function pC(e){return e.replace(/\s*\(free\)\s*$/i,"").replace(/:free$/i,"").trim()}function v0e(e){let t=[e];for(let n of w0e)if(e.startsWith(n.canonicalPrefix))t.push(`${n.aliasPrefix}${e.slice(n.canonicalPrefix.length)}`);else if(e.startsWith(n.aliasPrefix))t.push(`${n.canonicalPrefix}${e.slice(n.aliasPrefix.length)}`);return t}function k0e(e,t){for(let o of t)for(let i of v0e(e.id)){let s=o?.[i]?.name?.trim();if(s)return pC(s)}let n=e.name?.trim();if(n&&n!==e.id)return pC(n);let r=e.id.split("/").at(-1)??e.id;return pC(r)}function T0e(e,t){let n=(r,o)=>r.map((i)=>({...i,name:k0e(i,o)}));return{recommended:n(e.recommended,[t?.openrouter]),free:n(e.free,[t?.cline,t?.openrouter]),clinePass:n(e.clinePass,[t?.["cline-pass"]])}}import*as S0e from"@cerebriline/llms";import*as I4 from"@cerebriline/llms";function C4(e){let t=e?.auth?.accessToken?.trim()||e?.apiKey?.trim();return t&&t.length>0?t:void 0}var P4="/api/v1/connectors";var x0e=["COMPOSIO_SEARCH_TOOLS","COMPOSIO_MANAGE_CONNECTIONS","COMPOSIO_WAIT_FOR_CONNECTIONS","COMPOSIO_MULTI_EXECUTE_TOOL"];async function M4(e,t){let n;try{n=await fetch(`${e.baseUrl}/api/v1/connectors/meta-tools/sessions`,{method:"POST",headers:{authorization:`Bearer ${e.token}`},signal:AbortSignal.timeout(5000)})}catch(r){t?.log?.(`composio-tools: meta-tool session request failed: ${r instanceof Error?r.message:String(r)}`);return}if(!n.ok){if(n.status!==404)t?.log?.(`composio-tools: meta-tool session returned HTTP ${n.status}`);return}try{let r=await n.json(),o=r?.data?.sessionId,i=r?.data?.tools;if(typeof o!=="string"||!o||!Array.isArray(i))return;let s=i.filter((l)=>typeof l?.slug==="string"&&l.slug.length>0),a=new Set(s.map((l)=>l.slug)),d=x0e.filter((l)=>!a.has(l));if(d.length>0){t?.log?.(`composio-tools: meta-tool session missing required tools: ${d.join(", ")}`);return}return{sessionId:o,tools:s}}catch{return}}async function O4(e,t,n,r){let o=`${e.baseUrl}/api/v1/connectors/meta-tools/${encodeURIComponent(n)}/execute`,i;try{i=await fetch(o,{method:"POST",headers:{authorization:`Bearer ${e.token}`,"content-type":"application/json"},body:JSON.stringify({sessionId:t,arguments:r&&typeof r==="object"?r:{}})})}catch(d){return{successful:!1,error:`Cline connectors request failed: ${d instanceof Error?d.message:String(d)}`}}let s=await i.text(),a;try{a=s?JSON.parse(s):void 0}catch{a=void 0}if(!i.ok){let d=a!==void 0?JSON.stringify(a).slice(0,600):s.slice(0,600);return{successful:!1,error:`Cline connectors proxy returned HTTP ${i.status} for ${n}${d?`: ${d}`:""}`}}return a??{successful:!0}}var N4=120000;function P0e(e){let t=_0e("sha256").update(e).digest("hex");return R0e(C0e(),"settings","composio",`${t}.json`)}function cm(){return new Hr().getProviderSettings("cline")?.auth?.accountId?.trim()||void 0}function M0e(e){try{let t=P0e(e);if(!E0e(t))return;let n=JSON.parse(A0e(t,"utf8"));return typeof n==="object"&&n!==null?n:void 0}catch{return}}var D4;async function F4(e){let t=new Hr,n;try{D4??=new lm,n=(await D4.resolveProviderApiKey({providerId:"cline"}))?.apiKey??void 0}catch(i){if(i instanceof Hc)return}if(n??=C4(t.getProviderSettings("cline")),!n||cm()!==e)return;return{baseUrl:(t.getProviderSettings("cline")?.baseUrl?.trim()||I0e().apiBaseUrl).replace(/\/+$/,""),token:n}}async function U4(e){if(cm()!==e)return{error:{successful:!1,error:"The Cline account changed. Start a new session to use connector tools."}};if(!await uC($4.CLINE_COMPOSIO_BETA))return{error:{successful:!1,error:"Composio connectors are not enabled for this account."}};let t=await F4(e);if(!t)return{error:{successful:!1,error:"Sign in to your Cline account to use connector tools (no account token available)."}};return{auth:t}}async function O0e(e,t,n){let r=await U4(e);if("error"in r)return r.error;let{auth:o}=r,i=`${o.baseUrl}${P4}/tools/${encodeURIComponent(t.slug)}/execute`,s={arguments:n&&typeof n==="object"?n:{}};if(t.version)s.version=t.version;let a;try{a=await fetch(i,{method:"POST",headers:{authorization:`Bearer ${o.token}`,"content-type":"application/json"},body:JSON.stringify(s)})}catch(c){return{successful:!1,error:`Cline connectors request failed: ${c instanceof Error?c.message:String(c)}`}}let d=await a.text(),l;try{l=d?JSON.parse(d):void 0}catch{l=void 0}if(!a.ok){let c=l!==void 0?JSON.stringify(l).slice(0,600):d.slice(0,600);return{successful:!1,error:`Cline connectors proxy returned HTTP ${a.status} for ${t.slug}${c?`: ${c}`:""}`}}return l??{successful:!0}}async function B4(e){let t=cm();if(!t)return;if(!await uC($4.CLINE_COMPOSIO_BETA))return;if(cm()!==t)return;let n=M0e(t),r=Object.entries(n?.toolkits??{}).filter(([,s])=>s?.connectedAccountId&&(s.tools?.length??0)>0),o=await F4(t),i=o?await M4(o,{log:(s)=>e?.logger?.log?.(s)}):void 0;if(r.length===0&&!i?.tools.length)return;return{name:"composio-tools",manifest:{capabilities:["tools"]},setup(s){if(cm()!==t)return;let a=new Set;for(let[l,c]of r)for(let u of c?.tools??[]){if(!u?.slug)continue;let h=u.slug.toLowerCase().replace(/[^a-z0-9_]/g,"_");if(a.has(h))continue;a.add(h);try{s.registerTool(L4({name:h,resultPolicy:"cache-oversized",description:`${u.description||u.name||u.slug} (${l} account connected via Composio)`,inputSchema:u.input_parameters??{type:"object",properties:{}},timeoutMs:N4,retryable:!1,execute:(p)=>O0e(t,u,p)}))}catch(p){a.delete(h),e?.logger?.log?.(`composio-tools: skipping ${u.slug}: ${p instanceof Error?p.message:String(p)}`)}}let d=i?.sessionId??"";for(let l of i?.tools??[]){let c=l.slug.toLowerCase().replace(/[^a-z0-9_]/g,"_");if(a.has(c))continue;a.add(c);try{s.registerTool(L4({name:c,resultPolicy:"cache-oversized",description:l.description||l.name||l.slug,inputSchema:l.input_parameters??{type:"object",properties:{}},timeoutMs:N4,retryable:!1,execute:async(u)=>{let h=await U4(t);if("error"in h)return h.error;return O4(h.auth,d,l.slug,u)}}))}catch(u){a.delete(c),e?.logger?.log?.(`composio-tools: skipping ${l.slug}: ${u instanceof Error?u.message:String(u)}`)}}e?.logger?.log?.(`composio-tools: registered ${a.size} connector tool(s) for this session`)}}}import{existsSync as pv,readFileSync as kMe,statSync as TMe}from"node:fs";import{basename as SMe,dirname as uv,join as mv,resolve as hv}from"node:path";import{discoverPluginModulePaths as xMe,resolveConfiguredPluginModulePaths as s6,resolvePluginConfigSearchPaths as _Me,SKILLS_CONFIG_DIRECTORY_NAME as EMe}from"@cerebriline/shared/storage";import{resolve as Z0e}from"node:path";import{normalizePluginManifest as eMe}from"@cerebriline/shared";import{existsSync as un,readFileSync as qc}from"node:fs";import{builtinModules as L0e,createRequire as yC}from"node:module";import{dirname as gs,extname as hm,isAbsolute as N0e,resolve as Xe}from"node:path";import{fileURLToPath as W4}from"node:url";import{PLUGIN_FILE_EXTENSIONS as D0e}from"@cerebriline/shared";var j4=gs(W4(import.meta.url)),$0e=yC(import.meta.url),F0e=Xe(j4,"..","..","..","..",".."),mC=H0e(F0e),U0e=["@cerebriline/sdk","@cerebriline/agents","@cerebriline/core","@cerebriline/core/hub","@cerebriline/core/hub/daemon-entry","@cerebriline/core/telemetry","@cerebriline/llms","@cerebriline/llms/browser","@cerebriline/shared","@cerebriline/shared/automation","@cerebriline/shared/browser","@cerebriline/shared/storage","@cerebriline/shared/db","@cerebriline/shared/types"],wC=new Set(L0e.flatMap((e)=>[e,e.replace(/^node:/,"")])),um=new Set(D0e),B0e=["development","node","import","require","default"];function H0e(e){let t={},n={"@cerebriline/sdk":Xe(e,"packages/sdk/src/index.ts"),"@cerebriline/agents":Xe(e,"packages/agents/src/index.ts"),"@cerebriline/core":Xe(e,"packages/core/src/index.ts"),"@cerebriline/llms":Xe(e,"packages/llms/src/index.ts"),"@cerebriline/shared":Xe(e,"packages/shared/src/index.ts"),"@cerebriline/shared/storage":Xe(e,"packages/shared/src/storage/index.ts"),"@cerebriline/shared/db":Xe(e,"packages/shared/src/db/index.ts")};for(let[r,o]of Object.entries(n))if(un(o))t[r]=o;for(let r of["agents","core","llms","shared"]){let o=Xe(e,"packages",r),i=Xe(o,"package.json");if(!un(i))continue;try{let s=JSON.parse(qc(i,"utf8"));if(typeof s.name!=="string"||!s.exports)continue;if(typeof s.exports==="string"){let a=Xe(o,s.exports);if(un(a))t[s.name]=a;continue}if(typeof s.exports!=="object")continue;for(let[a,d]of Object.entries(s.exports)){let l=W0e(o,d);if(!l)continue;let c=a==="."?s.name:`${s.name}/${a.replace(/^\.\//,"")}`;t[c]=l}}catch{}}return t}function W0e(e,t){let n=bC(t);if(!n)return null;let r=q4(e,n);for(let o of r)if(un(o))return o;return null}function bC(e,t=new Set){if(typeof e==="string")return e;if(!e||typeof e!=="object")return null;if(t.has(e))return null;t.add(e);let n=e;for(let r of B0e){let o=bC(n[r],t);if(o)return o}return null}function q4(e,t){let n=t.replace(/^\.\//,""),r=[Xe(e,t)];if(n.startsWith("dist/")){let o=n.replace(/^dist\//,"src/").replace(/\.(mjs|cjs|js)$/,"");return[Xe(e,`${o}.ts`),Xe(e,`${o}.tsx`),Xe(e,`${o}.mts`),Xe(e,`${o}.cts`),...r]}return r}function j0e(e){return Object.fromEntries(Object.entries(e).sort(([t],[n])=>n.length-t.length))}function av(e){return!(e.startsWith(".")||e.startsWith("/")||e.startsWith("file:")||e.startsWith("data:")||e.startsWith("http:")||e.startsWith("https:"))}function jc(e){if(e.startsWith("@")){let[t,n]=e.split("/",3);return n?`${t}/${n}`:e}return e.split("/",1)[0]??e}function q0e(e){let t=jc(e);if(e===t)return".";return`.${e.slice(t.length)}`}function z4(e){return jc(e).startsWith("@cline/")}function fC(e,t){let n=jc(t),r=gs(e);while(!0){let o=Xe(r,"node_modules",n);if(un(o)||un(Xe(o,"package.json")))return!0;let i=Xe(r,"..");if(i===r)return!1;r=i}}function H4(e){return gC(e)!==null}function gC(e){try{return $0e.resolve(e)}catch{}return z0e(e)}function z0e(e){let t=jc(e),n=K4(t);if(!n)return null;let r=Xe(n,"package.json");try{let o=JSON.parse(qc(r,"utf8")),i=q0e(e),s=i==="."&&typeof o.exports==="string"?o.exports:o.exports&&typeof o.exports==="object"&&Object.hasOwn(o.exports,i)?o.exports[i]:void 0,a=bC(s)??(i==="."&&typeof o.main==="string"?o.main:null);if(!a)return null;let d=Xe(n,a),l=[d,...q4(n,a).filter((c)=>c!==d)];for(let c of l)if(un(c))return c;return null}catch{return null}}function K0e(){let e=[j4],t=process.env.CLINE_WRAPPER_PATH?.trim();if(t)e.push(gs(gs(t)));let n=process.execPath?.trim();if(n)e.push(gs(n));return[...new Set(e.map((r)=>Xe(r)))]}function G0e(e,t){let n=e;while(!0){let r=Xe(n,"package.json");if(un(r))try{if(JSON.parse(qc(r,"utf8")).name===t)return n}catch{}let o=Xe(n,"node_modules",t,"package.json");if(un(o))return gs(o);let i=Xe(n,"..");if(i===n)return null;n=i}}function K4(e){for(let t of K0e()){let n=G0e(t,e);if(n)return n}return null}function V0e(e){let n=gs(e);for(let r=0;r<4;r++){let o=Xe(n,"package.json");if(un(o))try{let s=JSON.parse(qc(o,"utf8"));return s!=null&&typeof s==="object"&&"cline"in s}catch{return!1}let i=Xe(n,"..");if(i===n)return!1;n=i}return!1}function G4(e,t){let n=t.startsWith("file:")?W4(t):N0e(t)?t:Xe(gs(e),t);if(un(n)&&um.has(hm(n)))return n;for(let r of um){let o=`${n}${r}`;if(un(o))return o}for(let r of um){let o=Xe(n,`index${r}`);if(un(o))return o}return null}function V4(e){let t=new Set,n=[/\bimport\s+(?:type\s+)?[^"'`]*?\bfrom\s*["'`]([^"'`]+)["'`]/g,/\bexport\s+[^"'`]*?\bfrom\s*["'`]([^"'`]+)["'`]/g,/\bimport\s*\(\s*["'`]([^"'`]+)["'`]\s*\)/g,/\brequire\s*\(\s*["'`]([^"'`]+)["'`]\s*\)/g];for(let r of n)for(let o of e.matchAll(r)){let i=o[1];if(i)t.add(i)}return[...t]}function Y0e(e){return hm(e)!==".ts"}function Y4(e,t,n=new Set){if(n.has(e)||!un(e))return;if(n.add(e),!um.has(hm(e)))return;let r=qc(e,"utf8"),o=Y0e(e);for(let i of V4(r)){if(i.startsWith("node:")||wC.has(i))continue;if(av(i)){if(!o)continue;if(Object.hasOwn(mC,i)||Object.hasOwn(mC,jc(i))||fC(e,i)||z4(i)&&H4(i)||t&&H4(i))continue;throw Error(`Cannot find module '${jc(i)}'`)}let s=G4(e,i);if(s)Y4(s,t,n)}}function X4(e,t=new Set,n=new Set){if(t.has(e)||!un(e))return n;if(t.add(e),!um.has(hm(e)))return n;let r=qc(e,"utf8");for(let o of V4(r)){if(n.add(o),av(o))continue;let i=G4(e,o);if(i)X4(i,t,n)}return n}function X0e(e,t){let n=yC(e),r={},o=X4(e),i=new Set(U0e);for(let[s,a]of Object.entries(mC)){try{n.resolve(s);continue}catch{}r[s]=a}for(let s of o)if(av(s)&&(z4(s)||t))i.add(s);for(let s of i){if(Object.hasOwn(r,s)||fC(e,s))continue;let a=gC(s);if(a)r[s]=a}if(!t)return r;for(let s of o){if(!av(s)||Object.hasOwn(r,s)||fC(e,s)||s.startsWith("node:")||wC.has(s))continue;let a=gC(s);if(a)r[s]=a}return r}function J0e(e){let t=hm(e);return t===".ts"||t===".tsx"||t===".mts"||t===".cts"}var ed;function Q0e(){if(ed!==void 0)return ed;let e=K4("jiti");if(!e)return ed=null,null;let t=Xe(e,"dist","babel.cjs");if(!un(t))return ed=null,null;try{let r=yC(t)(t);ed=typeof r==="function"?r:null}catch{ed=null}return ed}async function J4(e,t={}){let n=!V0e(e);Y4(e,n);let r=X0e(e,n),o=j0e(r),i=await import("jiti"),s=typeof i==="function"?i:typeof i.default==="function"?i.default:void 0;if(!s)throw Error("Unable to load jiti");let a=Object.entries(o).filter(([,u])=>J0e(u)).map(([u])=>u),d=Q0e(),l=d?(u)=>d({...u,interopDefault:!0}):void 0;return await s(e,{alias:o,cache:t.useCache,requireCache:t.useCache,esmResolve:!0,interopDefault:!1,nativeModules:[...wC],transformModules:a,tryNative:!1,...l?{transform:l}:{}}).import(e,{})}function Q4(e,t){if(!e)return!0;if(e.providerIds?.length){if(!t?.providerId||!e.providerIds.includes(t.providerId))return!1}if(e.modelIds?.length){if(!t?.modelId||!e.modelIds.includes(t.modelId))return!1}return!0}function Z4(e){return typeof e==="object"&&e!==null}function vC(e){return Array.isArray(e)&&e.every((t)=>typeof t==="string")}function tMe(e,t){if(!Z4(e.manifest))throw Error(`Invalid plugin module at ${t}: missing required "manifest"`);if(!vC(e.manifest.capabilities))throw Error(`Invalid plugin module at ${t}: manifest.capabilities must be a string array`);if(e.manifest.capabilities.length===0)throw Error(`Invalid plugin module at ${t}: manifest.capabilities cannot be empty`);if(Object.hasOwn(e.manifest,"providerIds")&&!vC(e.manifest.providerIds))throw Error(`Invalid plugin module at ${t}: manifest.providerIds must be a string array when provided`);if(Object.hasOwn(e.manifest,"modelIds")&&!vC(e.manifest.modelIds))throw Error(`Invalid plugin module at ${t}: manifest.modelIds must be a string array when provided`)}function nMe(e,t){if(!Z4(e))throw Error(`Invalid plugin module at ${t}: expected object export`);if(typeof e.name!=="string"||e.name.length===0)throw Error(`Invalid plugin module at ${t}: expected non-empty "name"`);if(!Object.hasOwn(e,"manifest"))throw Error(`Invalid plugin module at ${t}: missing required "manifest"`);tMe(e,t)}async function rMe(e,t={}){let n=Z0e(t.cwd??process.cwd(),e),r=await J4(n,{useCache:t.useCache}),o=t.exportName??"plugin",i=r.default??r[o];nMe(i,n);let s=i,a=s.setup,d=a?(l,c)=>{let u={...t.session,...c.session},h={...c,session:Object.keys(u).length>0?u:void 0,client:t.client??c.client,user:t.user??c.user,workspaceInfo:t.workspaceInfo??c.workspaceInfo,automation:t.automation??c.automation,logger:t.logger??c.logger,telemetry:t.telemetry??c.telemetry};return a(l,h)}:void 0;return{...s,manifest:eMe(s.manifest),setup:d}}async function e6(e,t={}){let n=[],r=[],o=new Map,i=0;for(let a of e)try{let d=await rMe(a,t);if(!Q4(d.manifest,t))continue;let l=o.get(d.name);if(l)r.push({type:"duplicate_plugin_override",pluginName:d.name,pluginPath:a,overriddenPluginPath:l.pluginPath,message:`Plugin "${d.name}" from ${a} overrides ${l.pluginPath}`});o.set(d.name,{plugin:d,pluginPath:a,order:i++})}catch(d){let l=d instanceof Error?d.message:String(d);n.push({pluginPath:a,phase:"load",message:l,stack:d instanceof Error?d.stack:void 0})}let s=[...o.values()].sort((a,d)=>a.order-d.order);return{plugins:s.map((a)=>a.plugin),pluginPaths:s.map((a)=>a.pluginPath),failures:n,warnings:r}}import{existsSync as SC}from"node:fs";import{createRequire as r6}from"node:module";import{dirname as lv,join as zc}from"node:path";import{fileURLToPath as oMe}from"node:url";var iMe="CLINE_PLUGIN_IDLE_TIMEOUT_MS",sMe=1800000;function aMe(e){return{...e,contributions:{tools:e.contributions?.tools??[],commands:e.contributions?.commands??[],rules:e.contributions?.rules??[],messageBuilders:e.contributions?.messageBuilders??[],providers:e.contributions?.providers??[],automationEventTypes:e.contributions?.automationEventTypes??[],mcpServers:e.contributions?.mcpServers??[],shortcuts:e.contributions?.shortcuts??[],flags:e.contributions?.flags??[]}}}function pm(e){return(e instanceof Error?e.message:String(e)).includes("Unknown sandbox plugin id:")}function dMe(){return`@cline/cli-${process.platform==="win32"?"windows":process.platform}-${process.arch}`}function lMe(){let e=process.env.CLINE_WRAPPER_PATH?.trim();if(!e)return;try{let n=r6(e).resolve(`${dMe()}/package.json`),r=zc(lv(n),"extensions","plugin-sandbox-bootstrap.js");return SC(r)?r:void 0}catch{return}}function cMe(){let e=process.execPath?.trim();if(!e)return;let t=zc(lv(lv(e)),"extensions","plugin-sandbox-bootstrap.js");return SC(t)?t:void 0}function uMe(e){let t=e.exists??SC;for(let n of e.siblingCandidates)if(t(n))return{file:n};if(t(e.sourceBootstrapPath))return{sourcePath:e.sourceBootstrapPath};for(let n of e.installedCandidates)if(n&&t(n))return{file:n};return{sourcePath:e.sourceBootstrapPath}}function hMe(){let e=lv(oMe(import.meta.url)),t=r6(import.meta.url),n=uMe({siblingCandidates:[zc(e,"plugin-sandbox-bootstrap.js"),zc(e,"extensions","plugin-sandbox-bootstrap.js"),zc(e,"agents","plugin-sandbox-bootstrap.js")],sourceBootstrapPath:zc(e,"plugin-sandbox-bootstrap.ts"),installedCandidates:[lMe(),cMe()]});if("file"in n)return n;let r=n.sourcePath,o="jiti";try{o=t.resolve("jiti")}catch{}return{script:[`const createJiti = require(${JSON.stringify(o)});`,`const jiti = createJiti(${JSON.stringify(r)}, { cache: false, requireCache: false, esmResolve: true, interopDefault: false });`,`Promise.resolve(jiti.import(${JSON.stringify(r)}, {})).catch((error) => {`," console.error(error);"," process.exitCode = 1;","});"].join(`
1309
1309
  `)}}var kC=hMe();function dv(e,t,n){if(typeof e==="number"&&Number.isInteger(e)&&e>0&&e<=kh)return e;if(n){let r=process.env[n];if(r){let o=Number(r);if(Number.isInteger(o)&&o>0&&o<=kh)return o}}return t}async function cv(e){let t=dv(e.idleTimeoutMs,sMe,iMe),n=new qx({name:"plugin-sandbox",..."file"in kC?{bootstrapFile:kC.file}:{bootstrapScript:kC.script},idleTimeoutMs:t,onEvent:e.onEvent}),r=dv(e.importTimeoutMs,4000,"CLINE_PLUGIN_IMPORT_TIMEOUT_MS"),o=dv(e.hookTimeoutMs,3000),i=dv(e.contributionTimeoutMs,60000),s={pluginPaths:e.pluginPaths,exportName:e.exportName,providerId:e.providerId,modelId:e.modelId,cwd:e.cwd,session:e.session,client:e.client,user:e.user,workspaceInfo:e.workspaceInfo,loggerEnabled:Boolean(e.logger),telemetryEnabled:e.telemetryAvailable===!0},a,d=()=>(a??=n.call("initialize",s,{timeoutMs:r}).finally(()=>{a=void 0}),a),l;try{l=await n.call("initialize",s,{timeoutMs:r})}catch(h){throw await n.shutdown().catch(()=>{}),h}let c=l.plugins.map(aMe);return{extensions:c.map((h)=>{let p={name:h.name,__clinePluginPath:h.pluginPath,manifest:h.manifest,setup:(m)=>{mMe(m,n,h,i,d),fMe(m,n,h,i,d),gMe(m,n,h,i,d),wMe(m,n,h,i,d),yMe(m,h)}};return p.hooks=vMe(n,h,o,d),p}),failures:l.failures,pluginPaths:c.map((h)=>h.pluginPath),shutdown:async()=>{await n.shutdown()},warnings:l.warnings}}function pMe(e){let t=e instanceof Error?e.message:String(e);return/cyclic|circular|bigint/i.test(t)}function TC(e,t=new WeakSet){if(e===null||typeof e!=="object")return typeof e==="function"||typeof e==="symbol"||typeof e==="bigint"?void 0:e;if(t.has(e))return;let n=e;if(typeof n.toJSON==="function")try{return n.toJSON()}catch{return}t.add(e);try{if(Array.isArray(e))return e.map((o)=>TC(o,t)??null);let r={};for(let[o,i]of Object.entries(e)){let s=TC(i,t);if(s!==void 0)r[o]=s}return r}finally{t.delete(e)}}var t6=new Set;function o6(e,t,n){let r=`${e}:${t}`;if(t6.has(r))return;t6.add(r);let o=n instanceof Error?n.message:String(n);console.warn(`[plugin-sandbox] ${e} "${t}" received a payload that is not JSON-serializable (${o}); retrying with non-serializable values dropped. Host-only objects must not be placed on tool contexts or hook payloads.`)}async function i6(e,t,n){try{return await e(t)}catch(r){if(!pMe(r))throw r;return n(r),await e(TC(t))}}function mMe(e,t,n,r,o){for(let i of n.contributions?.tools??[]){let s={name:i.name,description:i.description??"",inputSchema:i.inputSchema??{type:"object",properties:{}},timeoutMs:i.timeoutMs,retryable:i.retryable,execute:async(a,d)=>await i6(async(c)=>{let{input:u,context:h}=c;try{return await t.call("executeTool",{pluginId:n.pluginId,contributionId:i.id,input:u,context:h},{timeoutMs:r})}catch(p){if(!pm(p))throw p;return await o(),await t.call("executeTool",{pluginId:n.pluginId,contributionId:i.id,input:u,context:h},{timeoutMs:r})}},{input:a,context:d},(c)=>o6("tool",i.name,c))};e.registerTool(s)}}function fMe(e,t,n,r,o){for(let i of n.contributions?.commands??[])e.registerCommand({name:i.name,description:i.description,handler:async(s)=>{try{return await t.call("executeCommand",{pluginId:n.pluginId,contributionId:i.id,input:s},{timeoutMs:r})}catch(a){if(!pm(a))throw a;return await o(),await t.call("executeCommand",{pluginId:n.pluginId,contributionId:i.id,input:s},{timeoutMs:r})}}})}function gMe(e,t,n,r,o){for(let i of n.contributions?.rules??[])e.registerRule({id:i.ruleId,source:i.source,content:i.hasContentHandler===!0?async()=>{try{return await t.call("resolveRuleContent",{pluginId:n.pluginId,contributionId:i.id},{timeoutMs:r})}catch(s){if(!pm(s))throw s;return await o(),await t.call("resolveRuleContent",{pluginId:n.pluginId,contributionId:i.id},{timeoutMs:r})}}:i.content??""})}function yMe(e,t){for(let n of t.contributions?.providers??[])e.registerProvider({name:n.name,description:n.description,metadata:n.metadata});for(let n of t.contributions?.automationEventTypes??[])e.registerAutomationEventType({eventType:n.eventType,source:n.source,description:n.description,attributesSchema:n.attributesSchema,payloadSchema:n.payloadSchema,examples:n.examples,metadata:n.metadata});for(let n of t.contributions?.mcpServers??[])e.registerMcpServer(n)}function wMe(e,t,n,r,o){for(let i of n.contributions?.messageBuilders??[])e.registerMessageBuilder({name:i.name,async build(s){try{let a=await t.call("buildMessages",{pluginId:n.pluginId,contributionId:i.id,messages:s},{timeoutMs:r});return n6(a)?a:s}catch(a){if(!pm(a))throw a;await o();let d=await t.call("buildMessages",{pluginId:n.pluginId,contributionId:i.id,messages:s},{timeoutMs:r});return n6(d)?d:s}}})}function n6(e){return Array.isArray(e)&&e.every((t)=>typeof t==="object"&&t!==null&&("role"in t)&&("content"in t))}function bMe(e,t,n,r,o){return async(i)=>await i6(async(a)=>{try{return await e.call("invokeHook",{pluginId:t,hookName:n,payload:a},{timeoutMs:r})}catch(d){if(!pm(d))throw d;return await o(),await e.call("invokeHook",{pluginId:t,hookName:n,payload:a},{timeoutMs:r})}},i,(a)=>o6("hook",n,a))}function vMe(e,t,n,r){let o={};for(let i of t.hooks??[])o[i]=bMe(e,t.pluginId,i,n,r);return Object.keys(o).length>0?o:void 0}import{getPluginDisplayName as urt}from"@cerebriline/shared/storage";var _C="package.json",AMe="package";function EC(e){return _Me(e)}function AC(e){return xMe(e)}function RMe(e){try{return pv(e)&&TMe(e).isDirectory()}catch{return!1}}function fv(e){let t=[],n=new Set;for(let r of e){let o=hv(r);if(n.has(o))continue;n.add(o),t.push(o)}return t}function a6(e){let t=fv(e);return oL(t)}function d6(e){return EC(e).flatMap((t)=>AC(t)).filter((t)=>pv(t))}function IMe(e,t){let n=[];for(let r of e)try{n.push(...s6([r],t))}catch{}return n}function xC(e){return typeof e==="object"&&e!==null}function CMe(e){try{let t=JSON.parse(kMe(mv(e,_C),"utf8"));if(!xC(t)||!xC(t.cline))return[];let n=t.cline.plugins;if(!Array.isArray(n))return[];let r=[];for(let o of n){if(typeof o==="string"){r.push(o);continue}if(!xC(o)||!Array.isArray(o.paths))continue;for(let i of o.paths)if(typeof i==="string")r.push(i)}return r}catch{return[]}}function l6(e,t){let n=hv(t);return CMe(e).some((r)=>hv(e,r)===n)}function PMe(e,t){return SMe(e)===AMe&&pv(mv(uv(e),_C))&&l6(uv(e),t)}function MMe(e){let t=hv(e),n=[],r=uv(t);while(!0){if(PMe(r,t)){n.push(r);break}if(pv(mv(r,_C))){if(l6(r,t))n.push(r);break}let o=uv(r);if(o===r)break;r=o}return fv(n)}function mm(e={}){let t=e.cwd??process.cwd(),n=d6(e.workspacePath),o=[...s6(e.pluginPaths??[],t),...n];return e.includeDisabled?fv(o):a6(o)}function OMe(e={}){let t=e.cwd??process.cwd(),n=d6(e.workspacePath),r=IMe(e.pluginPaths??[],t);return a6([...r,...n])}function Kc(e){let t=[];for(let n of e)for(let r of MMe(n)){let o=mv(r,EMe);if(RMe(o))t.push(o)}return fv(t)}function c6(e={}){return Kc(OMe(e))}async function u6(e={}){let t=mm(e);if(t.length===0)return{extensions:[],failures:[],warnings:[],pluginPaths:[]};if(e.mode==="in_process"){let r=await e6(t,{cwd:e.cwd,exportName:e.exportName,providerId:e.providerId,modelId:e.modelId,session:e.session,client:e.client,user:e.user,workspaceInfo:e.workspaceInfo,automation:e.automation,logger:e.logger,telemetry:e.telemetry});return{extensions:r.plugins,failures:r.failures,pluginPaths:r.pluginPaths,warnings:r.warnings}}let n=await cv({pluginPaths:t,exportName:e.exportName,importTimeoutMs:e.importTimeoutMs,hookTimeoutMs:e.hookTimeoutMs,contributionTimeoutMs:e.contributionTimeoutMs,onEvent:e.onEvent,telemetryAvailable:Boolean(e.telemetry),providerId:e.providerId,modelId:e.modelId,cwd:e.cwd,session:e.session,client:e.client,user:e.user,workspaceInfo:e.workspaceInfo,logger:e.logger});return{extensions:n.extensions??[],shutdown:n.shutdown,failures:n.failures,pluginPaths:n.pluginPaths,warnings:n.warnings}}import{execFile as LMe,spawn as NMe}from"node:child_process";import{createHash as DMe}from"node:crypto";import{mkdir as $Me,readdir as FMe,rm as yv,stat as UMe,writeFile as BMe}from"node:fs/promises";import{join as fm}from"node:path";import{promisify as HMe}from"node:util";import{resolveClineDataDir as WMe}from"@cerebriline/shared/storage";var wv=HMe(LMe),h6="cline checkpoint session=",IC=67108864,jMe=1209600000;function p6(e){return e.includes(h6)}function m6(){return fm(WMe(),"checkpoint-scratch")}function f6(e,t){let n=DMe("sha256").update(`${e}\x00${t}`).digest("hex").slice(0,32);return fm(m6(),n)}async function qMe(){try{let e=m6(),t=Date.now()-jMe,n=await FMe(e,{withFileTypes:!0});await Promise.all(n.map(async(r)=>{if(!r.isDirectory())return;let o=fm(e,r.name);try{if((await UMe(o)).mtimeMs<t)await yv(o,{recursive:!0,force:!0})}catch{}}))}catch{}}function RC(e,t){e?.log(t,{severity:"warn"})}function zMe(e){let t=e?.checkpoint;if(!t||typeof t!=="object"||Array.isArray(t))return;let n=t;if(!n.latest||!Array.isArray(n.history))return;let r=n.latest,o=n.history.filter((i)=>!!i&&typeof i==="object"&&typeof i.ref==="string"&&typeof i.createdAt==="number"&&typeof i.runCount==="number");if(typeof r.ref!=="string"||typeof r.createdAt!=="number"||typeof r.runCount!=="number")return;return{latest:r,history:o}}async function kn(e,t){let n=await wv("git",["-C",e,...t],{windowsHide:!0});return{stdout:n.stdout.trim(),stderr:n.stderr.trim()}}var CC=["-c","core.ignorestat=false","-c","core.splitIndex=false"];async function gv(e,t,n){return(await wv("git",["-C",e,...CC,...n],{windowsHide:!0,maxBuffer:IC,env:{...process.env,GIT_INDEX_FILE:t}})).stdout.trim()}function KMe(e,t,n,r){return new Promise((o,i)=>{let s=NMe("git",["-C",e,...CC,...n],{windowsHide:!0,env:{...process.env,GIT_INDEX_FILE:t},stdio:["pipe","ignore","pipe"]}),a="";s.stderr.on("data",(d)=>{a+=d}),s.on("error",i),s.on("close",(d)=>{if(d===0)o();else i(Error(`git ${n[0]} exited with ${d}: ${a.trim()}`))}),s.stdin.on("error",()=>{}),s.stdin.end(r)})}async function GMe(e,t){let r=(await wv("git",["-C",e,"ls-files","--others","--exclude-standard","-z"],{windowsHide:!0,maxBuffer:IC})).stdout.split("\x00").filter(Boolean);if(r.length===0)return;await $Me(t,{recursive:!0,mode:448});let o=fm(t,"index"),i=fm(t,"pathspec");await BMe(i,`${r.join("\x00")}\x00`);let s=["add","--force","--pathspec-from-file",i,"--pathspec-file-nul"];try{await gv(e,o,s)}catch(h){if(String(h.stderr??"").includes("did not match any files"))throw h;await yv(o,{force:!0}),await yv(`${o}.lock`,{force:!0}),await gv(e,o,s)}let a=await wv("git",["-C",e,...CC,"ls-files","-z"],{windowsHide:!0,maxBuffer:IC,env:{...process.env,GIT_INDEX_FILE:o}}),d=new Set(r.map((h)=>h.endsWith("/")?h.slice(0,-1):h)),l=a.stdout.split("\x00").filter(Boolean).filter((h)=>!d.has(h));if(l.length>0)await KMe(e,o,["update-index","-z","--force-remove","--stdin"],`${l.join("\x00")}\x00`);let c=await gv(e,o,["write-tree"]);if(!c)return;return await gv(e,o,["commit-tree",c,"-m","untracked files on cline checkpoint"])||void 0}async function VMe(e,t,n){let r=(await kn(e,["stash","create",n])).stdout,o=await GMe(e,t);if(r){if(!o)return r;let d=(await kn(e,["rev-parse",`${r}^{tree}`])).stdout,l=(await kn(e,["rev-parse",`${r}^1`])).stdout,c=(await kn(e,["rev-parse",`${r}^2`])).stdout;if(!d||!l||!c)return r;return(await kn(e,["commit-tree",d,"-p",l,"-p",c,"-p",o,"-m",n])).stdout||r}if(!o)return;let i=(await kn(e,["rev-parse","HEAD"])).stdout,s=(await kn(e,["rev-parse","HEAD^{tree}"])).stdout;if(!i||!s)return;let a=(await kn(e,["commit-tree",s,"-p",i,"-m","index on cline checkpoint"])).stdout;if(!a)return;return(await kn(e,["commit-tree",s,"-p",i,"-p",a,"-p",o,"-m",n])).stdout||void 0}async function PC(e,t){if(!e)return;await yv(f6(e,t),{recursive:!0,force:!0}).catch(()=>{return});let n=`refs/cline/checkpoints/${t}/`;try{let{stdout:r}=await kn(e,["for-each-ref","--format=%(refname)",n]),o=r.trim().split(`
1310
- `).filter(Boolean);await Promise.allSettled(o.map((i)=>kn(e,["update-ref","-d",i])))}catch{}}async function g6(e,t,n){if(!e||n.length===0)return;await Promise.allSettled(n.map((r)=>kn(e,["update-ref",`refs/cline/checkpoints/${t}/${r.runCount}`,r.ref])))}function YMe(e,t){let n=e.findIndex((r)=>r.runCount===t.runCount);if(n<0)return[...e,t];return e.map((r,o)=>o===n?t:r)}function y6(e){qMe();let t,n,r=async()=>{if(t===!0)return!0;try{t=(await kn(e.cwd,["rev-parse","--is-inside-work-tree"])).stdout==="true"}catch{t=!1}return t},o=async(i)=>{if(e.createCheckpoint)return await e.createCheckpoint({cwd:e.cwd,sessionId:e.sessionId,runCount:i});if(!await r())return;let s=Date.now(),a=(h)=>{e.telemetry?.capture({event:"checkpoint.snapshot",properties:{sessionId:e.sessionId,runCount:i,outcome:h,durationMs:Date.now()-s}})},d=async(h)=>{try{let m=(await kn(e.cwd,["rev-parse","HEAD"])).stdout.trim();if(!m)return;return{ref:m,createdAt:Date.now(),runCount:i,kind:"commit"}}catch(p){RC(e.logger,`${h}: ${p instanceof Error?p.message:String(p)}`);return}},l=`${h6}${e.sessionId} run=${i}`,c="";try{c=await VMe(e.cwd,f6(e.cwd,e.sessionId),l)??""}catch(h){RC(e.logger,`Checkpoint snapshot failed after ${Date.now()-s}ms: ${h instanceof Error?h.message:String(h)}`);let p=await d("Checkpoint HEAD fallback failed");return a(p?"head_fallback":"skipped"),p}if(!c){let h=await d("Checkpoint HEAD fallback failed");return a(h?"head_clean":"skipped"),h}let u=`refs/cline/checkpoints/${e.sessionId}/${i}`;try{await kn(e.cwd,["update-ref",u,c])}catch(h){RC(e.logger,`Checkpoint store failed: ${h instanceof Error?h.message:String(h)}`),a("skipped");return}return a("stash"),{ref:c,createdAt:Date.now(),runCount:i,kind:"stash"}};return{beforeRun:async({snapshot:i})=>{if(i.parentAgentId==null)n=i.messages.length;return},beforeModel:async({snapshot:i})=>{if(i.parentAgentId!=null||i.iteration!==1)return;let s=i.messages.slice(n??Math.max(0,i.messages.length-1));n=void 0;let a=nh(i.messages);if(a<1)return;let d=await e.readSessionMetadata(),l=zMe(d),c=nh(s)>=1,u=l?.history.some((m)=>m.runCount===a)??!1;if(!c&&u)return;let h=await o(a);if(!h)return;if(l?.latest.ref===h.ref)return;let p=YMe(l?.history??[],h);await e.writeSessionMetadata({...d??{},checkpoint:{latest:h,history:p}});return}}}function Gc(...e){let t,n,r;for(let i of e){if(!i)continue;if(i.toolExecutors)t={...t??{},...i.toolExecutors};if(i.requestToolApproval)n=i.requestToolApproval;if(i.readReceipts)r=i.readReceipts}let o=t&&Object.keys(t).length>0;if(!o&&!n&&!r)return;return{...o?{toolExecutors:t}:{},...n?{requestToolApproval:n}:{},...r?{readReceipts:r}:{}}}import*as wr from"@cerebriline/llms";import{isOllamaNativeProvider as w6,resolveOutputBudgetTokens as XMe}from"@cerebriline/shared";function JMe(e){if(w6(e))return"ollama";return e==="opencoti"||e==="openai-compatible"?"llamacpp":void 0}var td=(e)=>typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0;function b6(e){let t=td(e.configuredNumPredict)??td(e.maxTokensPerTurn)??(e.outputBudget?.mode==="manual"?td(e.outputBudget.maxTokens):void 0);if(t!==void 0)return Math.floor(t);return XMe({mode:e.outputBudget?.mode??"auto",maxTokens:e.outputBudget?.maxTokens,contextWindow:e.contextWindow,modelMaxOutputTokens:td(e.modelMaxOutputTokens)})??wr.resolveDefaultMaxOutputTokens({contextWindow:td(e.contextWindow),maxOutputTokens:td(e.modelMaxOutputTokens)})}async function v6(e){let t=JMe(e.providerId);if(!t||e.thinking===!1||!e.modelId)return;let n=td(e.configuredNumPredict)??e.outputCap;if(t==="llamacpp"){let i=e.configuredThinkBudget?.trim()||e.reasoningEffort?.trim();if(!i)return;let s=wr.resolveLlamaCppThinkBudgetTokens(i,wr.resolveLlamaCppThinkBudgetWindow(e.contextWindow,n));return s===void 0?void 0:{level:i,budgetTokens:s}}let r=wr.resolveOllamaThinking({effort:e.reasoningEffort,sampling:{thinkBudget:e.configuredThinkBudget,reasoningLevel:e.configuredReasoningLevel}}),o={...typeof r.think==="string"?{think:r.think}:{},...r.thinkBudget?{thinkBudget:r.thinkBudget}:{},numPredict:n,numCtx:e.contextWindow};return e.probeOllama?e.probeOllama(e.baseUrl,e.modelId,o):wr.probeOllamaThinkBudget(e.baseUrl,e.modelId,o,e.fetchImpl)}function k6(e){let t=e.configuredMessage?.trim();if(t)return t;return w6(e.providerId)?wr.readDeclaredThinkBudgetMessage(e.baseUrl,e.modelId):void 0}var QMe=/(api[-_]?key|token|secret|password|authorization|credential|cookie)/i,ZMe=new Set(["knownModels","extensionContext","logger","telemetry","hooks","extensions","tools","systemPrompt","providerConfig","workspaceMetadata"]);function Vc(e,t="",n=0){if(e===null||e===void 0)return;if(typeof e==="function"||typeof e==="symbol")return;if(typeof e==="string")return t&&QMe.test(t)&&e?"[set]":e;if(typeof e!=="object")return e;if(n>=6)return;if(Array.isArray(e))return e.map((i)=>Vc(i,t,n+1)).filter((i)=>i!==void 0);let r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==null)return;let o={};for(let[i,s]of Object.entries(e)){if(ZMe.has(i))continue;let a=t==="headers"&&typeof s==="string"&&s?"[set]":Vc(s,i,n+1);if(a!==void 0)o[i]=a}return o}var eOe=new Set(["fetch","headers","knownModels","extensionContext","providerId","modelId"]);function T6(e,t){let n=e,r=t,o=[];for(let i of new Set([...Object.keys(n),...Object.keys(r)])){if(eOe.has(i)||typeof n[i]==="function")continue;if(JSON.stringify(n[i]??null)!==JSON.stringify(r[i]??null))o.push(i)}return o.sort()}function Oo(e){let t=e?.trim();return t?t:void 0}function tOe(e){let t=e.client,n=F3(t)??Oo(e.source),r=Oo(t.version),o=Oo(t.platform)??Oo(t.name),i=Oo(t.platformVersion)??r,s={cline_type:n,extension_version:r,platform:o,platform_version:i};if(e.user?.accountId===void 0)return s;let a=typeof e.user.accountId==="string"?Oo(e.user.accountId):void 0;return{...s,distinct_id:a??Oo(e.user.distinctId),user_id:a,account_id:a,account_email:a?Oo(e.user.email):void 0,organization_id:a?Oo(e.user.organizationId):void 0}}function MC(e,t){let n={},r={},o,i=(s)=>({...t,...r,...n,...s,...o?{distinct_id:o}:{}});return{setDistinctId(s){o=Oo(s)},setMetadata(s){n={...s}},updateMetadata(s){n={...n,...s}},setCommonProperties(s){r={...s}},updateCommonProperties(s){r={...r,...s}},isEnabled:()=>e.isEnabled(),capture:(s)=>e.capture({event:s.event,properties:i(s.properties)}),captureRequired:(s,a)=>e.captureRequired(s,i(a)),recordCounter:(s,a,d,l,c)=>e.recordCounter(s,a,i(d),l,c),recordHistogram:(s,a,d,l,c)=>e.recordHistogram(s,a,i(d),l,c),recordGauge:(s,a,d,l,c)=>e.recordGauge(s,a,i(d),l,c),flush:()=>e.flush(),dispose:async()=>{}}}function S6(e,t){return MC(e,tOe(t))}import{upsertWorkspaceInfo as nOe,WorkspaceManifestSchema as OC}from"@cerebriline/shared";class LC{manifest;listeners=new Set;constructor(e){this.manifest=OC.parse(e??{workspaces:{}})}async addWorkspacePath(e){let t=await zk(e);return this.manifest=nOe(this.manifest,t),this.emit({type:"workspace_added",workspace:t}),t}async switchWorkspace(e){let t=Ms(e),n=this.manifest.workspaces[t];if(n)return this.manifest=OC.parse({...this.manifest,currentWorkspacePath:t}),this.emit({type:"workspace_switched",workspace:n}),n;let r=await this.addWorkspacePath(t);return this.manifest=OC.parse({...this.manifest,currentWorkspacePath:r.rootPath}),this.emit({type:"workspace_switched",workspace:r}),r}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}getCurrentWorkspace(){let e=this.manifest.currentWorkspacePath;if(!e)return;return this.manifest.workspaces[e]}getWorkspace(e){let t=Ms(e);return this.manifest.workspaces[t]}listWorkspaces(){return Object.values(this.manifest.workspaces)}getManifest(){return this.manifest}emit(e){for(let t of this.listeners)t(e)}}import{createHash as rOe}from"node:crypto";var x6=new Set,_6=new Set;function oOe(e,t){return rOe("sha256").update(e).update("\x00").update(t?.trim()??"").digest("hex")}function iOe(e){if(e.vcsTypes&&e.vcsTypes.length>0)return e.vcsTypes;return[e.vcsType==="git"?"git":"none"]}function E6(e){if(!e.telemetry)return;let t=oOe(e.rootPath,e.dedupeScope),n=e.rootCount??1;if(!x6.has(t))x6.add(t),HM(e.telemetry,{root_count:n,vcs_types:iOe(e),init_duration_ms:e.durationMs,feature_flag_enabled:e.featureFlagEnabled??!0,is_remote_workspace:e.isRemoteWorkspace});if(e.initError&&!_6.has(t)){_6.add(t);let r=Error(e.initError.message);r.name=e.initError.errorType||"Error",WM(e.telemetry,r,{fallback_to_single_root:!0,workspace_count:n})}}function vOe(e){return`${e.pluginName??e.pluginPath}: ${e.message}`}function kOe(e,t,n){if(t.length>0)for(let i of t)n?.log(i.message,{severity:"warn"});if(e.length===0)return;let r=e.slice(0,3).map(vOe).join("; "),o=e.length>3?`; and ${e.length-3} more`:"";n?.log(`Some plugins failed to initialize. ${r}${o}. Use --verbose for more details.`,{severity:"warn"});for(let i of e)n?.log(`Plugin initialization failed (${i.phase}) for ${i.pluginPath}`,{severity:"warn",stack:i.stack,pluginPath:i.pluginPath,pluginName:i.pluginName})}function TOe(e,t){for(let n of e){let r=n.componentName?` (${n.componentName})`:"";t?.log(`[agent-plugins] ${n.pluginName??n.pluginPath}${r}: ${n.message}`,{severity:n.level==="warning"?"warn":"error"})}}function SOe(e){let t=e?.["X-CLIENT-TYPE"]?.trim();if(!t)return;let n=e?.["X-CLIENT-VERSION"]?.trim();return{name:t,...n?{version:n}:{}}}function xOe(e,t){let n=typeof e.thinking==="boolean",r=typeof e.reasoningEffort==="string";if(!n&&!r)return t;return{...t??{},...n?{enabled:e.thinking}:{},...r?{effort:e.reasoningEffort}:{}}}function bv(e,t){return fOe(e,t)}function _Oe(e,t,n){if(e.systemPrompt?.trim())return e.systemPrompt;return mOe({ide:"Terminal Shell",workspaceRoot:t.rootPath,workspaceName:t.hint,metadata:n,rules:e.rules,mode:e.mode,providerId:e.providerId,platform:process.platform||"unknown"})}function EOe(e,t){return e.storedProviderSettings==="ignore"?void 0:t.getProviderSettings(e.providerId)}function R6(e,t,n,r,o,i){let s=o||r?.modelCatalog?{...o??{},...r?.modelCatalog??{}}:void 0,a=e.providerConfig?.providerId===e.providerId?e.providerConfig:void 0,d=St(e.contextWindow),l=pOe({providerId:e.providerId,sessionId:t,source:n,defaultSource:Yt.CLI,client:{name:e.extensionContext?.client?.name,version:e.extensionContext?.client?.version,versionHeaderFallback:e.headers?.["X-CLIENT-VERSION"],platform:e.extensionContext?.client?.platform,platformVersion:e.extensionContext?.client?.platformVersion,isMultiRoot:e.extensionContext?.client?.isMultiRoot},coreVersion:Af,openAiCodex:{accountId:a?.accountId??r?.auth?.accountId,accessToken:a?.accessToken??e.apiKey??r?.auth?.accessToken??r?.apiKey,userAgentVersion:process.env.npm_package_version},headers:{stored:r?.headers,config:e.headers,session:a?.headers}}),c={...r??{},provider:e.providerId,model:e.modelId,apiKey:e.apiKey??r?.apiKey,baseUrl:e.baseUrl??r?.baseUrl,headers:void 0,reasoning:xOe(e,r?.reasoning),modelCatalog:s,...d!==void 0?{contextWindow:d}:{}},u={...Za(c),...a??{}};if(l)u.headers=l;if(e.knownModels)u.knownModels=e.knownModels;if(d!==void 0)u.knownModels={...u.knownModels??{},[e.modelId]:{...u.knownModels?.[e.modelId]??{},id:e.modelId,contextWindow:d,maxInputTokens:void 0}};if(e.extensionContext)u.extensionContext=e.extensionContext;let p=e.fetch??u.fetch??i;if(p)u.fetch=p;return u}var St=(e)=>typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0;function AOe(e){return{...e,compaction:{...e.compaction??{},enabled:e.compaction?.enabled??!0},checkpoint:{...e.checkpoint??{},enabled:e.checkpoint?.enabled??!0},taskProgress:{...e.taskProgress??{},enabled:e.taskProgress?.enabled??!0}}}async function ROe(e,t){let n=t.modelId??e.modelId,r=t.fetch??globalThis.fetch;if(e.providerConfig?.providerId===e.providerId&&St(e.providerConfig?.defaultMaxOutputTokens)!==void 0||!n||!vv(e.providerId))return{council:!1};if(await aOe(t.baseUrl,n,r,e.logger).catch(()=>{return}),IOe(t,n,lOe(t.baseUrl,n),e.knownModels?.[n]),e.providerId!=="xollama")return{council:!1};return{council:(await cOe(hOe(e.providerId,t.baseUrl),n,r).catch(()=>{return}))?.council===!0}}function IOe(e,t,n,r){if(!n||n.images===void 0&&n.tools===void 0||Array.isArray(r?.capabilities))return;let o=e.knownModels?.[t],i=new Set(o?.capabilities??[]),s=(a,d)=>{if(d===!0)i.add(a);else if(d===!1)i.delete(a)};if(s("images",n.images),s("tools",n.tools),n.tools===void 0&&i.size>0)i.add("tools");e.knownModels={...e.knownModels??{},[t]:{...o??{},id:t,capabilities:[...i]}}}function COe(e){return e.logger?.log(`${e.modelId} is an xOllama council: it compacts server-side; client compaction is off`,{severity:"info"}),{...e,compaction:{...e.compaction??{},enabled:!1,cappedThinkingEnabled:!1},staleReadRewrites:!1}}function POe(e,t,n,r,o){let i=t.modelId,s=e.knownModels?.[i];if(r===void 0||!o&&!s)return;let d=St(n?.sampling?.numPredict)??St(t.maxTokensPerTurn)??(n?.outputBudget?.mode==="manual"?St(n.outputBudget.maxTokens):void 0)??St(s?.maxTokens)??(vv(t.providerId)?St(e.defaultMaxOutputTokens):void 0);e.knownModels={...e.knownModels??{},[i]:{...s??{},id:i,contextWindow:r,maxInputTokens:St(t.contextWindow)!==void 0?s?.maxInputTokens:Math.min(s?.maxInputTokens??r,r),...d!==void 0?{maxTokens:d}:{}}}}function MOe(e){let{config:t,hostConfig:n,providerConfig:r,stored:o}=e,i=r.knownModels?.[t.modelId],s=o?T6(r,(()=>{let l=R6(n,e.sessionId,e.source,void 0,e.modelCatalogDefaults,e.defaultFetch);return l.defaultMaxOutputTokens=r.defaultMaxOutputTokens,l.thinkingBudgetTokens=r.thinkingBudgetTokens,l})()):[],a=n.providerConfig?.providerId===n.providerId&&St(n.providerConfig?.defaultMaxOutputTokens)!==void 0;if(o&&!a){let l=[["budget.contextWindow",St(t.contextWindow)===void 0?o.contextWindow:void 0],["budget.numPredict",o.sampling?.numPredict],["budget.thinkBudget",o.sampling?.thinkBudget],["budget.outputBudget",o.outputBudget],["budget.reasoningBudgetTokens",o.reasoning?.budgetTokens]];for(let[c,u]of l)if(u!==void 0&&u!==null)s.push(c)}let d=wOe();return{sessionId:e.sessionId,providerId:t.providerId,modelId:t.modelId,...r.baseUrl?{baseUrl:r.baseUrl}:{},contextWindow:St(t.contextWindow)??e.contextWindow??St(i?.contextWindow)??St(r.maxInputTokens),maxOutputTokens:St(r.defaultMaxOutputTokens),thinking:{...typeof r.thinking==="boolean"?{enabled:r.thinking}:{},...r.reasoningEffort?{effort:String(r.reasoningEffort)}:{},...St(r.thinkingBudgetTokens)!==void 0?{budgetTokens:r.thinkingBudgetTokens}:{}},...r.sampling?{sampling:Vc(r.sampling)}:{},reasoningHistory:uOe(t.providerId,{modelId:r.modelId??t.modelId,baseUrl:r.baseUrl,reasoningHistory:r.reasoningHistory,reasoningInline:r.reasoningInline}),provider:Vc(r),session:Vc(t),...t.systemPrompt?{systemPrompt:t.systemPrompt}:{},sources:{storedProviderSettings:t.storedProviderSettings==="ignore"?"ignored":o?"merged":"absent",inheritedFromStoredProfile:s.sort(),dataDir:yOe(),providerSettingsPath:bOe(),globalSettingsPath:d,globalSettingsPresent:sOe(d)}}}async function OOe(e,t,n){if(t.providerConfig?.providerId===t.providerId&&St(t.providerConfig?.defaultMaxOutputTokens)!==void 0)return;let o=t.modelId,i=e.baseUrl,s=e.knownModels?.[o],a=St(t.contextWindow)??St(n?.contextWindow)??(vv(t.providerId)?A6(i,o):void 0)??St(s?.contextWindow),d=n?.sampling,l=b6({configuredNumPredict:d?.numPredict,maxTokensPerTurn:t.maxTokensPerTurn,outputBudget:n?.outputBudget,contextWindow:a,modelMaxOutputTokens:s?.maxTokens});e.defaultMaxOutputTokens=l;let c;try{c=await v6({providerId:t.providerId,modelId:o,baseUrl:i,thinking:e.thinking,reasoningEffort:e.reasoningEffort,configuredThinkBudget:d?.thinkBudget,configuredReasoningLevel:d?.reasoningLevel,configuredNumPredict:d?.numPredict,outputCap:l,contextWindow:a,fetchImpl:e.fetch??fetch})}catch{c=void 0}if(c&&St(n?.reasoning?.budgetTokens)===void 0)e.thinkingBudgetTokens=c.budgetTokens;return t.logger?.log(`Output budget: cap=${l} contextWindow=${a??"unknown"}`+(c?` thinking=${c.budgetTokens} (${c.level})`:""),{severity:"info"}),{contextWindow:a,thinking:c,budgetMessage:k6({providerId:t.providerId,modelId:o,baseUrl:i,configuredMessage:d?.thinkBudgetMessage})}}async function I6(e){let{input:t,sessionId:n,sessionOrigin:r,providerSettingsManager:o,defaultTelemetry:i,defaultLogger:s,defaultCapabilities:a,defaultToolPolicies:d,defaultFetch:l,onPluginEvent:c,onTeamEvent:u,createSubAgentLifecycleCallbacks:h,createSpawnTool:p,createSwarmTool:m,delegatedSandboxes:f,localRuntime:g,readSessionMetadata:y,writeSessionMetadata:w}=e,k=ki(t.config),{modelCatalogDefaults:b,userInstructionService:v,configExtensions:E,onTeamRestored:S,...x}=g??{},T=Object.keys(x).length>0?x:void 0,{workspaceInfo:A,workspaceMetadata:R,gitState:C,durationMs:L,vcsType:N,initError:W}=await vO(k),D=T?.extensionContext,K=D?.client?void 0:SOe(t.config.headers),V=D?.client??K,j=D?.telemetry??T?.telemetry??(i&&V?S6(i,{client:V,source:t.source,user:D?.user}):i),G=j&&r?MC(j,{session_origin:r.mode,session_origin_trigger:r.trigger}):j,z={...D??{},...K?{client:K}:{},workspace:{...A,...D?.workspace??{}},session:{...D?.session??{},sessionId:n},logger:D?.logger??T?.logger??s,telemetry:G};E6({telemetry:z.telemetry,rootPath:A.rootPath,dedupeScope:z.client?.name??t.source,workspaceInfo:A,rootCount:1,vcsType:N,durationMs:L,initError:W,featureFlagEnabled:!0});let M=bv(E,"hooks")?MR({cwd:t.config.cwd,workspacePath:k,rootSessionId:n,logger:T?.logger,workspaceInfo:A,onHookRuntime:(Ze)=>oO(z.telemetry,Ze)}):void 0,X=H3(T?.hooks)?void 0:PR({rootSessionId:n,workspacePath:k,workspaceInfo:A}),oe=Rc([T?.hooks,X]),H;if(bv(E,"plugins"))try{H=await u6({pluginPaths:T?.pluginPaths,workspacePath:k,cwd:t.config.cwd,onEvent:c,providerId:t.config.providerId,modelId:t.config.modelId,workspaceInfo:A,session:z.session,client:z.client,user:z.user,logger:z.logger,telemetry:z.telemetry,automation:z.automation}),kOe(H.failures,H.warnings,T?.logger)}catch(Ze){let pn=Ze instanceof Error?Ze.message:String(Ze);T?.logger?.log?.(`plugin loading failed; continuing without plugins (${pn})`)}let J;if(bv(E,"plugins"))try{J=await om({pluginPaths:t.config.agentPluginPaths,cwd:t.config.cwd,disabledPluginNames:[...Cu()]}),TOe(J.diagnostics,z.logger)}catch(Ze){let pn=Ze instanceof Error?Ze.message:String(Ze);z.logger?.log(`[agent-plugins] Package discovery failed; continuing without Agent Plugins: ${pn}`,{severity:"error"})}let he=await B4({logger:T?.logger}),se=[...M?[M]:[],...he?[he]:[]],re=se.length>0?se:void 0,Ge=LI(re,LI(T?.extensions,iL(H?.extensions))),I=bv(E,"plugins")?Kc(H?.pluginPaths??[]):void 0,_=AOe({...t.config,...T??{},sessionId:n,hooks:oe,extensions:Ge,extensionContext:z,telemetry:z.telemetry,logger:z.logger}),F=EOe(_,o),O=R6(_,n,t.source,F,b,l),ne=(await ROe(_,O)).council?COe(_):_,fe=await OOe(O,ne,F);if(fe)POe(O,ne,F,fe.contextWindow,(St(ne.contextWindow)??St(F?.contextWindow)??(vv(ne.providerId)?A6(O.baseUrl,ne.modelId):void 0))!==void 0);let Ce=Rc([ne.hooks,ne.checkpoint?.enabled===!0?y6({cwd:ne.cwd,sessionId:n,logger:ne.logger,createCheckpoint:ne.checkpoint?.createCheckpoint,telemetry:ne.telemetry,readSessionMetadata:y,writeSessionMetadata:w}):void 0]),We=_Oe(ne,A,R),Se={...ne,providerConfig:O,workspaceMetadata:R,systemPrompt:We,hooks:Ce,...fe?.budgetMessage&&!ne.compaction?.cappedThinkingBudgetMessage?{compaction:{...ne.compaction??{},cappedThinkingBudgetMessage:fe.budgetMessage}}:{},...We?{systemPrompt:gOe(We,{outputCap:O.defaultMaxOutputTokens,contextWindow:fe?.contextWindow??O.maxInputTokens,...fe?.thinking?{thinking:fe.thinking}:O.thinkingBudgetTokens&&O.reasoningEffort?{thinking:{level:O.reasoningEffort,budgetTokens:O.thinkingBudgetTokens}}:{}})}:{}};await dOe(Se.providerId,O.baseUrl,O.modelId??Se.modelId,O.fetch??globalThis.fetch).catch(()=>{return});let Le=MOe({config:Se,hostConfig:ne,providerConfig:O,sessionId:n,source:t.source,stored:F,modelCatalogDefaults:b,defaultFetch:l,contextWindow:fe?.contextWindow});await ne.onConfigResolved?.(Le);let it=t.toolPolicies??ne.toolPolicies??d,dt=Gc(a,t.capabilities),_e=dt?.requestToolApproval,Ue=dt?.toolExecutors,xt=dt?.readReceipts,Qt=h?.(Se),er=new LC({currentWorkspacePath:A.rootPath,workspaces:{[A.rootPath]:A}});return{effectiveInput:t,config:Se,providerConfig:O,resolvedConfig:Le,workspaceMetadata:R,workspaceInfo:A,gitState:C,extensions:Ge,hooks:Ce,toolPolicies:it,requestToolApproval:_e,pluginSandboxShutdown:H?.shutdown,runtimeBuilderInput:{config:Se,hooks:Ce,extensions:Ge,onTeamEvent:u,createSpawnTool:p,createSwarmTool:m,...f?{delegatedSandboxes:f}:{},onTeamRestored:S,onSubAgentEvent:Qt?.onSubAgentEvent,onSubAgentStart:Qt?.onSubAgentStart,onSubAgentEnd:Qt?.onSubAgentEnd,userInstructionService:v,pluginSkillDirectories:I,agentPluginSkills:J?.skills,agentPluginMcpServers:J?.mcpServers,configExtensions:E,toolExecutors:Ue,readReceipts:xt,toolPolicies:it,workspaceManager:er,logger:Se.logger,telemetry:Se.telemetry,requestToolApproval:_e}}}import{RECALLED_MEMORY_TAG as BOe}from"@cerebriline/shared";import{createTool as vit,MAIN_MEMORY as kit,memorySelectionFor as Tit}from"@cerebriline/shared";import{DEFAULT_LIBRARY_SETTINGS as $Oe,DEFAULT_MEMORY_SETTINGS as lit,MAIN_MEMORY as cit,memoryWorkspaceKey as uit}from"@cerebriline/shared";import{resolveClineDataDir as pit}from"@cerebriline/shared/storage";import{DEFAULT_LIBRARY_SETTINGS as Got}from"@cerebriline/shared";import{resolveClineDataDir as Yot}from"@cerebriline/shared/storage";import{DEFAULT_LIBRARY_SETTINGS as fot}from"@cerebriline/shared";var oot=Array.from({length:64},(e,t)=>(Math.imul(t+1,2654435761)|1)>>>0);import{loadSqliteDb as Iot}from"@cerebriline/shared/db";var C6=4000;var git={...$Oe,enabled:!0,chunkSize:C6*2,chunkOverlap:0,markdownHeaders:!1};var Oit=new Set("a about above after again all also am an and any are as at be because been before being below between both but by can could did do does doing down during each few for from further had has have having he her here hers him his how i if in into is it its just me more most my no nor not now of off on once only or other our ours out over own same she should so some such than that the their theirs them then there these they this those through to too under until up very was we were what when where which while who whom why will with would you your yours please thanks every always never use using used want wants need needs like get got make made new one two project projects code file files thing things".split(" "));function P6(e){let t=new Set;for(let n of e){if(!n.includes(`<${BOe}>`))continue;for(let r of n.matchAll(/^\[(m\d+)\] \d{4}-\d{2}-\d{2}, /gm))t.add(r[1])}return[...t]}import{existsSync as kv,mkdirSync as HOe,readdirSync as WOe,rmdirSync as jOe,rmSync as qOe,unlinkSync as zOe}from"node:fs";import{dirname as M6,join as gm}from"node:path";function ft(){return new Date().toISOString()}function ym(e){if(!e||!kv(e))return;try{zOe(e)}catch{}}function KOe(e){let t=Ya(e);if(t)return{rootSessionId:t.rootSessionId,fileStem:`${t.agentId}__${t.teamTaskId}`};let n=Bc(e);if(n)return{rootSessionId:n.rootSessionId,fileStem:n.agentId};return{rootSessionId:e,fileStem:e}}class NC{ensureSessionsDir;constructor(e){this.ensureSessionsDir=e}sessionArtifactsDir(e){return gm(this.ensureSessionsDir(),e)}ensureSessionArtifactsDir(e){let t=this.sessionArtifactsDir(e);if(!kv(t))HOe(t,{recursive:!0});return t}sessionMessagesPath(e){return gm(this.sessionArtifactsDir(e),`${e}.messages.json`)}sessionCompactionPath(e){return gm(this.sessionArtifactsDir(e),`${e}.compaction.json`)}sessionManifestPath(e,t=!1){let n=t?this.ensureSessionArtifactsDir(e):this.sessionArtifactsDir(e);return gm(n,`${e}.json`)}removeSessionDirIfEmpty(e){let t=this.sessionArtifactsDir(e),n=this.ensureSessionsDir();while(t.startsWith(n)&&t!==n){if(!kv(t)){t=M6(t);continue}try{if(WOe(t).length>0)break;jOe(t)}catch{break}t=M6(t)}}removeSessionDir(e){this.removeDir(this.sessionArtifactsDir(e))}removeDir(e){if(!kv(e))return;try{qOe(e,{recursive:!0,force:!0})}catch{}}subagentArtifactPaths(e,t,n){let{rootSessionId:r,fileStem:o}=KOe(e),i=this.sessionArtifactsDir(r);return{messagesPath:gm(i,`${o}.messages.json`)}}}import{nanoid as ust}from"nanoid";import{nanoid as Git}from"nanoid";import{loadSqliteDb as Zit}from"@cerebriline/shared/db";import{nanoid as tst}from"nanoid";function L6(e){let t=e?.importedFrom;if(typeof t!=="object"||t===null||Array.isArray(t))return;let n=t;if(typeof n.tool!=="string"||typeof n.sourceSessionId!=="string")return;return{tool:n.tool,sourceSessionId:n.sourceSessionId,sourcePath:typeof n.sourcePath==="string"?n.sourcePath:"",importedAt:typeof n.importedAt==="string"?n.importedAt:""}}import{resolveDocumentsExtensionPath as GOe}from"@cerebriline/shared/storage";function N6(e,t,n,r,o){if(n)KM(e.telemetry,{ulid:t,provider:e.providerId,model:e.modelId,...o});else zM(e.telemetry,{ulid:t,provider:e.providerId,model:e.modelId,...o});VOe(e.telemetry,{workspacePath:r})}function VOe(e,t){let n=GOe("Hooks"),r=Cp(t.workspacePath),o=new Map,i=n.replace(/\\/g,"/");for(let s of r){let a=s.hookEventName??"unknown",d=o.get(a)??{global:0,workspace:0},l=s.path.replace(/\\/g,"/");if(l===i||l.startsWith(`${i}/`))d.global+=1;else d.workspace+=1;o.set(a,d)}for(let[s,a]of o.entries())iO(e,s,a.global,a.workspace)}function D6(e,t){for(let n of t.mentions)nO(e,n,t.matchedFiles.includes(n)?1:0,"file",!t.matchedFiles.includes(n));for(let n of t.matchedFiles)eO(e,"file",n.length);for(let n of t.ignoredMentions)tO(e,"file","not_found",n)}function YOe(e){return e?JSON.parse(JSON.stringify(e)):void 0}function XOe(e){return e?JSON.parse(JSON.stringify(e)):void 0}function JOe(e){let t=e?.checkpoint&&typeof e.checkpoint==="object"&&!Array.isArray(e.checkpoint)?e.checkpoint:void 0,r=(Array.isArray(t?.history)?t.history:[]).filter((s)=>!!s&&typeof s==="object"&&!Array.isArray(s)).flatMap((s)=>{let a=typeof s.ref==="string"?s.ref.trim():"",d=Number(s.createdAt),l=Number(s.runCount);if(!a||!Number.isFinite(d)||!Number.isInteger(l))return[];return[{ref:a,createdAt:d,runCount:l,...s.kind==="stash"||s.kind==="commit"?{kind:s.kind}:{}}]}),o=r.at(-1),i=e?.checkpointEnabled===!0?!0:void 0;if(!i&&r.length===0)return;return{...i?{enabled:i}:{},...o?{latest:o}:{},history:r}}function nd(e){let{session:t}=e,n=YOe(t.metadata);return{version:1,sessionId:t.sessionId,source:t.source,status:t.status,createdAt:t.startedAt,updatedAt:t.updatedAt,endedAt:t.endedAt??null,exitCode:t.exitCode??null,interactive:t.interactive,workspace:{cwd:t.cwd,root:t.workspaceRoot},model:{providerId:t.provider,modelId:t.model},capabilities:{enableTools:t.enableTools,enableSpawn:t.enableSpawn,enableTeams:t.enableTeams},lineage:{...t.parentSessionId?{parentSessionId:t.parentSessionId}:{},...t.parentAgentId?{parentAgentId:t.parentAgentId}:{},...t.agentId?{agentId:t.agentId}:{},...t.conversationId?{conversationId:t.conversationId}:{},isSubagent:t.isSubagent},...t.teamName?{team:{name:t.teamName}}:{},...t.prompt?{prompt:t.prompt}:{},...n?{metadata:n}:{},...t.messagesPath?{artifacts:{messagesPath:t.messagesPath}}:{},...e.messages?{messages:XOe(e.messages)}:{},...e.usage?{usage:{...e.usage}}:{},...e.aggregateUsage?{aggregateUsage:{...e.aggregateUsage}}:{},...(()=>{let r=JOe(n);return r?{checkpoint:r}:{}})()}}import{execFile as QOe}from"node:child_process";import{randomUUID as ZOe}from"node:crypto";import{promisify as eLe}from"node:util";var ot=eLe(QOe);async function $6(e,t){try{return(await ot("git",["-C",e,"rev-parse","--verify","--quiet",t],{windowsHide:!0})).stdout.trim()||void 0}catch{return}}async function F6(e){if((await ot("git",["-C",e,"rev-parse","--is-inside-work-tree"],{windowsHide:!0})).stdout.trim()!=="true")throw Error(`${e} is not a git repository`);let n=(await ot("git",["-C",e,"rev-parse","--verify","HEAD"],{windowsHide:!0})).stdout.trim(),r=await $6(e,"refs/stash"),o=ZOe(),i=`refs/cline/restore-transactions/${o}`;await ot("git",["-C",e,"stash","push","--include-untracked","--message",`cline restore transaction ${o}`],{windowsHide:!0});let s=await $6(e,"refs/stash"),a=s!==void 0&&s!==r;if(a)try{await ot("git",["-C",e,"update-ref",i,s],{windowsHide:!0}),await ot("git",["-C",e,"stash","drop","stash@{0}"],{windowsHide:!0})}catch(l){try{await ot("git",["-C",e,"reset","--hard",n],{windowsHide:!0}),await ot("git",["-C",e,"clean","-fd"],{windowsHide:!0}),await ot("git",["-C",e,"stash","apply","--index",s],{windowsHide:!0})}catch(c){throw AggregateError([l,c],"Workspace snapshot and rollback both failed")}throw l}let d=!1;return{async commit(){if(d)return;if(d=!0,!a)return;await ot("git",["-C",e,"update-ref","-d",i],{windowsHide:!0}).catch(()=>{return})},async rollback(){if(d)return;if(await ot("git",["-C",e,"reset","--hard",n],{windowsHide:!0}),await ot("git",["-C",e,"clean","-fd"],{windowsHide:!0}),a)await ot("git",["-C",e,"stash","apply","--index",i],{windowsHide:!0}),await ot("git",["-C",e,"update-ref","-d",i],{windowsHide:!0});d=!0}}}function U6(e){let t=e?.metadata?.checkpoint&&typeof e.metadata.checkpoint==="object"&&!Array.isArray(e.metadata.checkpoint)?e.metadata.checkpoint:void 0;return(Array.isArray(t?.history)?t.history:[]).filter((r)=>!!r&&typeof r==="object"&&!Array.isArray(r)).flatMap((r)=>{let o=String(r.ref??"").trim(),i=Number(r.createdAt??0),s=Number(r.runCount??0);if(o.length===0||!Number.isFinite(i)||!Number.isInteger(s)||s<1)return[];let a=r.kind==="stash"||r.kind==="commit"?r.kind:void 0;return[{ref:o,createdAt:i,runCount:s,...a?{kind:a}:{}}]})}function B6(e,t){let n=U6(e).filter((o)=>o.runCount<=t),r=n.at(-1);return r?{latest:r,history:n}:void 0}function tLe(e,t){return e.reduce((n,r)=>{if(r.runCount>t)return n;if(!n||r.runCount>n.runCount)return r;return n},void 0)}function H6(e,t){let n=0;for(let r=0;r<e.length;r+=1){let o=e[r];if(!o)continue;let i=tl(o);if(i<1)continue;let s=n+1;if(n+=i,n===t)return{index:r,span:i};if(n>t)throw Error(`Run ${t} is folded into a compacted message spanning runs ${s}-${n}`)}throw Error(`Could not find user message for run ${t}`)}function nLe(e,t){let{index:n}=H6(e,t);return e.slice(0,n+1)}function W6(e,t){let{index:n,span:r}=H6(e,t);if(r!==1)throw Error(`Cannot fork before run ${t} because it is folded into a compacted message`);return e.slice(0,n)}function j6(e){let t=e.checkpointRunCount;if(!Number.isInteger(t)||t<1)throw Error("checkpointRunCount must be a positive integer");let n=tLe(U6(e.session),t);if(!n)throw Error(`No checkpoint found at or before run ${t} in session ${e.session.sessionId}`);let r=(e.cwd?.trim()||e.session.cwd||e.session.workspaceRoot).trim();if(!r)throw Error("cwd or workspaceRoot is required to restore a checkpoint");return{checkpoint:n,cwd:r,...e.restoreMessages!==!1?{messages:nLe(e.messages??[],t)}:{}}}async function rLe(e,t){if(t.kind)return t.kind;let n=await ot("git",["-C",e,"show","-s","--format=%P%x00%B",t.ref],{windowsHide:!0}),r=n.stdout.indexOf("\x00"),o=r<0?[]:n.stdout.slice(0,r).trim().split(/\s+/).filter(Boolean),i=r<0?"":n.stdout.slice(r+1);return o.length>=2&&p6(i)?"stash":"commit"}async function oLe(e,t){try{return await ot("git",["-C",e,"cat-file","-e",`${t}^3^{commit}`],{windowsHide:!0}),!0}catch{return!1}}async function iLe(e,t,n){try{let r=await ot("git",["-C",e,"rev-list","--count",`${t}..${n}`],{windowsHide:!0}),o=Number(r.stdout.trim());return Number.isFinite(o)?o:void 0}catch{return}}async function q6(e,t){if((await ot("git",["-C",e,"rev-parse","--is-inside-work-tree"],{windowsHide:!0})).stdout.trim()!=="true")throw Error(`${e} is not a git repository`);await ot("git",["-C",e,"cat-file","-e",`${t.ref}^{commit}`],{windowsHide:!0});let r=await rLe(e,t),o=r==="commit"?t.ref:`${t.ref}^1`,i=(await ot("git",["-C",e,"rev-parse","--verify",`${o}^{commit}`],{windowsHide:!0})).stdout.trim(),s=(await ot("git",["-C",e,"rev-parse","--verify","HEAD"],{windowsHide:!0})).stdout.trim();if(s!==i){let d=await iLe(e,i,s),l=d&&d>0?`${d} commit${d===1?" was":"s were"} added to the current branch after this checkpoint and would be removed by the restore`:"the current branch is no longer on the commit this checkpoint was created from (e.g. after a rebase or branch switch)";throw Error(`Cannot restore the workspace: ${l}. Restore the chat only, or move the branch back to ${i.slice(0,12)} manually (e.g. with git reset) before restoring the workspace.`)}if(r==="stash")await ot("git",["-C",e,"cat-file","-e",`${t.ref}^2^{commit}`],{windowsHide:!0});let a=await oLe(e,t.ref);if(await ot("git",["-C",e,"update-ref","-m","cline: checkpoint restore","HEAD",i,s],{windowsHide:!0}),await ot("git",["-C",e,"reset","--hard"],{windowsHide:!0}),a)await ot("git",["-C",e,"clean","-fd"],{windowsHide:!0});if(r==="commit")return;await ot("git",["-C",e,"stash","apply",t.ref],{windowsHide:!0})}class Wr extends Error{code;constructor(e,t){super(t);this.code=e;this.name="SessionVersioningError"}}function sLe(e){let t=e.sessionId.trim();if(!t)throw new Wr("invalid_restore","sessionId is required");if(!e.restoreMessages&&!e.restoreWorkspace)throw new Wr("invalid_restore","restore.messages or restore.workspace must be true");if(e.restoreMessages&&e.requiresStart)throw new Wr("invalid_restore","start is required when restore.messages is true");if(!Number.isInteger(e.checkpointRunCount)||e.checkpointRunCount<1)throw new Wr("invalid_restore","checkpointRunCount must be a positive integer");return t}class wm{async restoreCheckpoint(e){let t=e.restore?.messages!==!1,n=e.restore?.workspace!==!1,r=Date.now(),o,i=(k,b)=>{e.telemetry?.capture({event:"checkpoint.restore",properties:{sessionId:e.sessionId,checkpointRunCount:e.checkpointRunCount,restoreWorkspace:n,restoreMessages:t,checkpointKind:o?.kind??"unknown",outcome:k,durationMs:Date.now()-r,...b}})},s,a,d;try{let k=sLe({sessionId:e.sessionId,restoreMessages:t,restoreWorkspace:n,requiresStart:e.start===void 0,checkpointRunCount:e.checkpointRunCount}),b=await e.getSession(k);if(!b)throw new Wr("session_not_found",`Session ${k} not found`);if(s=b,a=t?await e.readMessages(k):void 0,t&&a?.length===0)throw new Wr("session_messages_not_found",`No messages found for session ${k}`);d=j6({session:s,messages:a,checkpointRunCount:e.checkpointRunCount,cwd:e.cwd,restoreMessages:t}),o=d.checkpoint}catch(k){throw i("failed",{phase:"plan"}),k}let l=nd({session:s,messages:a}),c,u=[],h,p;if(t){let{startSession:k,getStartedSessionId:b,cleanupStartedSession:v}=e;if(!e.start||!k||!b||!v)throw new Wr("invalid_restore","startSession, getStartedSessionId, and cleanupStartedSession are required when restore.messages is true");p={startSession:k,getStartedSessionId:b,cleanupStartedSession:v},c=B6(s,e.checkpointRunCount),u=e.restore?.omitCheckpointMessageFromSession?W6(a??[],e.checkpointRunCount):d.messages??[];let E={sourceSession:s,sourceMessages:a,sourceSnapshot:l,plan:d,restoredCheckpointMetadata:c,initialMessages:u,restoreMessages:t,restoreWorkspace:n,checkpointRunCount:e.checkpointRunCount};h=e.buildStartInput?await e.buildStartInput(E,e.start):e.start}let m=e.applyWorkspaceCheckpoint??q6,f=e.beginWorkspaceRestoreTransaction??(e.applyWorkspaceCheckpoint?void 0:F6),g=n&&f?await f(d.cwd):void 0,y=!1,w;try{if(n)await m(d.cwd,d.checkpoint);if(!p)return await g?.commit(),y=!0,i("success"),{checkpoint:d.checkpoint,sourceSnapshot:l};let k=await p.startSession(h);w={result:k,cleanup:p.cleanupStartedSession};let b=p.getStartedSessionId(k);if(!b)throw new Wr("invalid_restore","Restored session did not return a session id");await(e.retainCheckpointRefs??g6)(d.cwd,b,c?.history??[]);let v=e.readRestoredSession?await e.readRestoredSession(b):void 0,E=v?nd({session:v,messages:u}):void 0;return await g?.commit(),y=!0,i("success"),{sessionId:b,startResult:k,messages:d.messages,checkpoint:d.checkpoint,sourceSnapshot:l,...E?{restoredSnapshot:E}:{}}}catch(k){let b=[];if(w)try{await w.cleanup(w.result)}catch(v){b.push(v)}if(g&&!y)try{await g.rollback()}catch(v){b.push(v)}if(i("failed",{workspaceRolledBack:!!g&&!y,recovered:b.length===0}),b.length>0)throw AggregateError([k,...b],"Checkpoint restore failed and recovery did not complete");throw k}}}import{appendFileSync as aLe}from"node:fs";import{join as dLe}from"node:path";import{resolveRootSessionId as z6}from"@cerebriline/shared";import{ensureHookLogDir as lLe}from"@cerebriline/shared/storage";import{z as DC}from"zod";var cLe=DC.looseObject({task:DC.string().optional(),systemPrompt:DC.string().optional()});class Tv{adapter;manifestStore;toPersistedMessages;heartbeatLogIntervalMs;teamTaskSessionsByAgent=new Map;teamTaskLastHeartbeatBySession=new Map;teamTaskLastProgressLineBySession=new Map;constructor(e,t,n,r){this.adapter=e;this.manifestStore=t;this.toPersistedMessages=n;this.heartbeatLogIntervalMs=r}teamTaskQueueKey(e,t){return`${e}::${t}`}activeTeamTaskSessionId(e,t){return this.teamTaskSessionsByAgent.get(this.teamTaskQueueKey(e,t))?.at(-1)}buildSubsessionRow(e,t){let n=yi(e.metadata);return{sessionId:t.sessionId,source:e.source,pid:e.pid,startedAt:t.startedAt,endedAt:null,exitCode:null,status:"running",statusLock:0,interactive:!1,provider:e.provider,model:e.model,cwd:e.cwd,workspaceRoot:e.workspaceRoot,teamName:e.teamName??null,enableTools:e.enableTools,enableSpawn:e.enableSpawn,enableTeams:e.enableTeams,parentSessionId:t.parentSessionId,parentAgentId:t.parentAgentId,agentId:t.agentId,conversationId:t.conversationId??null,isSubagent:!0,prompt:t.prompt,metadata:Jp({metadata:Yn(void 0,{mode:t.mode,version:n?.version}),prompt:t.prompt}),hookPath:"",messagesPath:t.messagesPath,updatedAt:t.startedAt}}async queueSpawnRequest(e){if(e.hookName!=="tool_call"||e.parent_agent_id!==null)return;if(e.tool_call?.name!=="spawn_agent")return;let t=z6(e.sessionContext);if(!t)return;let n=cLe.safeParse(e.tool_call.input);await this.adapter.enqueueSpawnRequest({rootSessionId:t,parentAgentId:e.agent_id,task:n.success?n.data.task:void 0,systemPrompt:n.success?n.data.systemPrompt:void 0})}async upsertSubagentSession(e){let t=e.rootSessionId;if(!t)return;let n=await this.adapter.getSession(t);if(!n)return;let r=MI(t,e.agentId),o=await this.adapter.getSession(r),i=ft(),s=this.manifestStore.artifacts.subagentArtifactPaths(r,e.agentId,this.activeTeamTaskSessionId(t,e.parentAgentId)),a=e.prompt??o?.prompt??void 0;if(!a)a=await this.adapter.claimSpawnRequest(t,e.parentAgentId)??`Subagent run by ${e.parentAgentId}`;if(!o){let d=this.buildSubsessionRow(n,{sessionId:r,mode:"subagent",parentSessionId:t,parentAgentId:e.parentAgentId,agentId:e.agentId,conversationId:e.conversationId,prompt:a,startedAt:i,...s});return await this.adapter.upsertSession(d),this.manifestStore.initializeMessagesFile(d,s.messagesPath,i),r}return await this.adapter.updateSession({sessionId:r,setRunning:!0,parentSessionId:t,parentAgentId:e.parentAgentId,agentId:e.agentId,conversationId:e.conversationId,prompt:o.prompt??a??null,metadata:Jp({metadata:Yn(o.metadata,{mode:"subagent",version:yi(n.metadata)?.version}),prompt:o.prompt??a??null}),expectedStatusLock:o.statusLock}),r}async upsertSubagentSessionFromHook(e){if(!e.parent_agent_id)return;let t=z6(e.sessionContext);if(!t)return;if(e.hookName==="session_shutdown"){let n=MI(t,e.agent_id);return await this.adapter.getSession(n)?n:void 0}return await this.upsertSubagentSession({agentId:e.agent_id,parentAgentId:e.parent_agent_id,conversationId:e.taskId,rootSessionId:t})}async applySubagentStatus(e,t){await this.applySubagentStatusBySessionId(e,B3(t))}async applySubagentStatusBySessionId(e,t){let n=await this.adapter.getSession(e);if(!n)return;let r=Vt(t)?null:ft(),o=Vt(t)?null:t==="failed"?1:0;await this.adapter.updateSession({sessionId:e,status:t,endedAt:r,exitCode:o,expectedStatusLock:n.statusLock})}async applyStatusToRunningChildSessions(e,t){if(!e)return;let n=await this.adapter.listSessions({limit:2000,parentSessionId:e,status:"running"});for(let r of n)await this.applySubagentStatusBySessionId(r.sessionId,t)}async onTeamTaskStart(e,t,n){let r=await this.adapter.getSession(e);if(!r)return;let o=U3(e,t),i=ft(),{messagesPath:s}=this.manifestStore.artifacts.subagentArtifactPaths(o,t),a=this.buildSubsessionRow(r,{sessionId:o,mode:"team",parentSessionId:e,parentAgentId:"lead",agentId:t,prompt:n||`Team task for ${t}`,startedAt:i,messagesPath:s});await this.adapter.upsertSession(a),this.manifestStore.initializeMessagesFile(a,s,i);let d=this.teamTaskQueueKey(e,t),l=this.teamTaskSessionsByAgent.get(d)??[];l.push(o),this.teamTaskSessionsByAgent.set(d,l)}async onTeamTaskEnd(e,t,n,r,o,i){let s=this.teamTaskQueueKey(e,t),a=this.teamTaskSessionsByAgent.get(s);if(!a||a.length===0)return;let d=a.shift();if(a.length===0)this.teamTaskSessionsByAgent.delete(s);if(!d)return;let l=o?.messages??i,c=this.toPersistedMessages(l,o,i);if(c)await this.manifestStore.persistSessionMessages(d,c);await this.applySubagentStatusBySessionId(d,n),this.teamTaskLastHeartbeatBySession.delete(d),this.teamTaskLastProgressLineBySession.delete(d)}async onTeamTaskProgress(e,t,n,r){let o=this.teamTaskQueueKey(e,t),i=this.teamTaskSessionsByAgent.get(o)?.[0];if(!i)return;let s=n.trim();if(!s)return;let a=r?.kind??"progress";if(a==="heartbeat"){let l=Date.now(),c=this.teamTaskLastHeartbeatBySession.get(i)??0;if(l-c<this.heartbeatLogIntervalMs)return;this.teamTaskLastHeartbeatBySession.set(i,l)}let d=a==="heartbeat"?"[progress] heartbeat":a==="text"?`[progress] text: ${s}`:`[progress] ${s}`;if(this.teamTaskLastProgressLineBySession.get(i)===d)return;this.teamTaskLastProgressLineBySession.set(i,d)}async handleSubAgentStart(e,t){let n=await this.upsertSubagentSession({agentId:t.subAgentId,parentAgentId:t.parentAgentId,conversationId:t.conversationId,prompt:t.input.task,rootSessionId:e});if(!n)return;await this.applySubagentStatusBySessionId(n,"running")}async handleSubAgentEnd(e,t){let n=await this.upsertSubagentSession({agentId:t.subAgentId,parentAgentId:t.parentAgentId,conversationId:t.conversationId,prompt:t.input.task,rootSessionId:e});if(!n)return;let r=this.toPersistedMessages(t.agentResult?.messages,t.agentResult?.usage?t.agentResult:void 0);if(r)await this.manifestStore.persistSessionMessages(n,r);if(t.error||t.agentResult?.finishReason==="error"){await this.applySubagentStatusBySessionId(n,"failed");return}let o=t.result?.finishReason??t.agentResult?.finishReason??"completed";await this.applySubagentStatusBySessionId(n,o==="aborted"?"cancelled":"completed")}appendSubagentHookAudit(e){let n=(process.env.CLINE_HOOKS_LOG_PATH?.trim()||void 0)??dLe(lLe(),"hooks.jsonl");aLe(n,`${JSON.stringify({ts:ft(),...e})}
1311
- `,"utf8")}}import{formatUserInputBlock as $Le}from"@cerebriline/shared";import{probeServerHealth as uLe,serverRoot as hLe}from"@cerebriline/llms";function pLe(e,t,n){if(typeof n!=="number"||!Number.isFinite(n))return e;let r=e.providerConfig??t;return{...e,providerConfig:{...r??{},agentWindow:{sharePercent:n}}}}var K6="polykv-lead",G6="Model (PolyKV)",V6="primary",mLe=new Set(["opencoti","xollama"]);function $C(e){let t=(e.agentNodes??[]).filter((r)=>!r.polykvLead);if(e.polykvAgentsPriorityZero!==!0||!mLe.has(e.providerId.trim().toLowerCase()))return[...t];let n=t.length>0?t:[{id:V6,priority:sc+1,capacity:typeof e.overflowCapacity==="number"&&e.overflowCapacity>0?e.overflowCapacity:Number.POSITIVE_INFINITY,pacedAdmission:!0,label:"Node1",connection:{}}];return[{id:K6,priority:sc,capacity:wA,label:G6,connection:{thinking:void 0,reasoningEffort:void 0,thinkingBudgetTokens:void 0,maxTokensPerTurn:void 0,temperature:void 0,...e.lead,providerId:e.providerId,modelId:e.modelId},polykvLead:!0},...n]}function FC(e){if(e.nodes.length===0)return;let t=TA(e.nodes.map((i)=>vp({id:i.id,priority:i.polykvLead?sc:Math.max(i.priority,sc+1),capacity:i.capacity,...i.pacedAdmission?{pacedAdmission:!0}:{}})),{probe:async(i)=>{let s=(n.get(i)??e.base).getConnectionConfig(),a=hLe(s.baseUrl);return a?await uLe(a,{...s.headers?{headers:s.headers}:{}}):!1}}),n=new Map;for(let i of e.nodes){let s=e.base.getRuntimeConfig(),a=pLe(i.connection,s.providerConfig,i.windowShare);n.set(i.id,pi({...s,...a,...i.polykvLead&&s.sessionId?{polykvLeadOwner:s.sessionId}:{}},Object.keys(a)))}let r=new Map(e.nodes.flatMap((i)=>i.label?[[i.id,i.label]]:[])),o=(i)=>{let s=n.get(i.nodeId)??e.base,a=r.get(i.nodeId);return{nodeId:i.nodeId,...a?{nodeLabel:a}:{},configProvider:s,run:async(d)=>await d(),release:()=>i.release(),admitted:()=>i.admitted(),refused:(d)=>i.refused(d),markUnreachable:(d)=>t.markUnreachable(i.nodeId,d)}};return{place:async(i,s)=>o(await t.acquire(i,s)),base:e.base,occupancy:()=>t.occupancy(),hasRoomElsewhere:(i)=>t.hasRoomElsewhere(i),get waiting(){return t.waiting},describe:()=>{let i=new Map(t.nodeStates().map((s)=>[s.nodeId,s]));return e.nodes.map((s)=>{let a=(n.get(s.id)??e.base).getConnectionConfig(),d=i.get(s.id);return{nodeId:s.id,...s.label?{label:s.label}:{},priority:s.priority,providerId:a.providerId,modelId:a.modelId,...a.baseUrl?{baseUrl:a.baseUrl}:{},...a.providerConfig?{providerConfig:a.providerConfig}:{},capacity:d?.capacity??s.capacity,running:d?.running??0,...d?.downUntil?{downUntil:d.downUntil}:{},...d?.heldUntil?{heldUntil:d.heldUntil}:{}}})}}}import{existsSync as fLe,readdirSync as gLe,readFileSync as yLe}from"node:fs";import{basename as Y6,extname as wLe,join as bLe}from"node:path";import{stripUtf8Bom as vLe}from"@cerebriline/shared";import{resolveAgentConfigSearchPaths as kLe}from"@cerebriline/shared/storage";import J6 from"yaml";import{z as Tn}from"zod";var Q6=Tn.object({name:Tn.string().trim().min(1),description:Tn.string().trim().min(1),tools:Tn.union([Tn.string(),Tn.array(Tn.string())]).optional(),skills:Tn.union([Tn.string(),Tn.array(Tn.string())]).optional(),providerId:Tn.string().trim().min(1).optional(),modelId:Tn.string().trim().min(1).optional(),profile:Tn.string().trim().min(1).optional(),maxIterations:Tn.number().int().positive().optional()});function TLe(e){e=vLe(e);let t=e.match(/^(---)[^\S\r\n]*(?:\r?\n|$)/);if(!t)throw Error("Missing YAML frontmatter block in agent config file.");let n=t[0].length,r=/^---[^\S\r\n]*(?:\r?\n|$)/gm;r.lastIndex=n;let o,i=Array.from(e.matchAll(r)).filter((s)=>s.index>=n);for(let s of i){let a=s.index,d=e.slice(n,a);try{let l=J6.parse(d);if(!l||typeof l!=="object"||Array.isArray(l))continue;Q6.parse(l);let c=e.slice(a+s[0].length);o={frontmatter:d,body:c}}catch{}}if(o)return o;throw Error("Missing closing YAML frontmatter delimiter in agent config file.")}function X6(e){if(e===void 0)return;let t=Array.isArray(e)?e:e.split(",");return Array.from(new Set(t.map((n)=>n.trim()).filter((n)=>n.length>0)))}function SLe(e){return e.trim().toLowerCase()}function xLe(e){let t=wLe(e).toLowerCase();return t===".md"||t===".markdown"||t===".yml"||t===".yaml"}function Z6(e,t={}){let{frontmatter:n,body:r}=TLe(e),o=J6.parse(n);if(!o||typeof o!=="object"||Array.isArray(o))throw Error("Agent config frontmatter must be a YAML mapping.");let i=Q6.parse(o),s=r.trim();if(!s)throw Error("Missing system prompt body in agent config file.");return{name:i.name,description:i.description,tools:X6(i.tools),skills:X6(i.skills),providerId:i.providerId,modelId:i.modelId,profile:i.profile,maxIterations:i.maxIterations,systemPrompt:s,path:t.path}}function UC(e){let t=e.searchPaths??kLe(e.workspaceRoot),n=new Map,r=[];for(let i of t.filter(Boolean)){if(!fLe(i))continue;let s;try{s=gLe(i,{withFileTypes:!0})}catch(a){r.push({path:i,error:a instanceof Error?a:Error(String(a))});continue}for(let a of s){if(!a.isFile()||!xLe(a.name))continue;let d=bLe(i,a.name);try{let l=yLe(d,"utf8"),c=Z6(l,{path:d}),u=SLe(c.name);if(!n.has(u))n.set(u,c)}catch(l){r.push({path:d,error:l instanceof Error?l:Error(String(l))})}}}return{configs:Array.from(n.values()).sort((i,s)=>(i.path?Y6(i.path):i.name).localeCompare(s.path?Y6(s.path):s.name)),errors:r,searchPaths:t.filter(Boolean)}}import{TeamMessageType as Oe}from"@cerebriline/shared";function Ti(e){let t=e.type;switch(t){case Oe.AgentEvent:return!1;case Oe.RunProgress:return t8(e);case Oe.TaskStart:case Oe.TaskEnd:case Oe.TeammateSpawned:case Oe.TeammateShutdown:case Oe.TeamTaskUpdated:case Oe.TeamMessage:case Oe.TeamMissionLog:case Oe.RunQueued:case Oe.RunStarted:case Oe.RunCompleted:case Oe.RunFailed:case Oe.RunCancelled:case Oe.RunInterrupted:case Oe.OutcomeCreated:case Oe.OutcomeFragmentAttached:case Oe.OutcomeFragmentReviewed:case Oe.OutcomeFinalized:case Oe.TeamCleaned:return!0;default:return Boolean(t)}}function WC(e){switch(e.type){case Oe.TeammateSpawned:case Oe.TeammateShutdown:case Oe.RunCompleted:case Oe.RunFailed:case Oe.RunCancelled:case Oe.RunInterrupted:case Oe.TeamCleaned:return!0;case Oe.RunProgress:return t8(e);default:return!1}}function t8(e){return e.type===Oe.RunProgress&&e.run.status==="queued"}var HC=Number.POSITIVE_INFINITY;function e8(e){return typeof e==="object"&&e!==null}function Sv(e,t=0){return typeof e==="number"&&Number.isFinite(e)?e:t}function BC(e){return typeof e==="number"&&Number.isFinite(e)?e:void 0}function _Le(e){return e.length>HC?`${e.slice(0,HC-3)}...`:e}function Lo(e){if(!e8(e))return;let t=e8(e.usage)?e.usage:{},n=e.finishReason;return{text:_Le(typeof e.text==="string"?e.text:""),iterations:Sv(e.iterations),finishReason:typeof n==="string"?n:"completed",durationMs:Sv(e.durationMs),usage:{inputTokens:Sv(t.inputTokens),outputTokens:Sv(t.outputTokens),cacheReadTokens:BC(t.cacheReadTokens),cacheWriteTokens:BC(t.cacheWriteTokens),totalCost:BC(t.totalCost)}}}function ELe(e){if(e.result===void 0)return e;return{...e,result:Lo(e.result)}}function ys(e){switch(e.type){case Oe.TaskEnd:{let{messages:t,result:n,error:r,...o}=e;return{...o,result:Lo(n),error:r?{message:r.message}:void 0}}case Oe.RunQueued:case Oe.RunStarted:case Oe.RunCompleted:case Oe.RunFailed:case Oe.RunCancelled:case Oe.RunInterrupted:return{...e,run:ELe(e.run)};default:return e}}function No(){return new Date().toISOString()}function n8(e,t){if(t<=0)return 0;return Math.round(e/t*100)}function ALe(e,t){let n=new Set;for(let o of t)if(o.status==="reviewed")n.add(`${o.outcomeId}:${o.section}`);let r=new Set;for(let o of e){if(o.status==="finalized")continue;for(let i of o.requiredSections)if(!n.has(`${o.id}:${i}`))r.add(`${o.id}:${i}`)}return[...r].sort((o,i)=>o.localeCompare(i))}function jC(e,t){let n={idle:0,running:0,stopped:0},r={pending:0,in_progress:0,blocked:0,completed:0},o={queued:0,running:0,completed:0,failed:0,cancelled:0,interrupted:0},i={draft:0,in_review:0,finalized:0},s={draft:0,reviewed:0,rejected:0},a=0,d=0;for(let g of t.members)if(n[g.status]+=1,g.role==="lead")a+=1;else d+=1;let l=[],c=[],u=t.tasks.filter((g)=>g.status==="completed").length,h=new Map(t.tasks.map((g)=>[g.id,g]));for(let g of t.tasks){if(r[g.status]+=1,g.status==="blocked"){l.push(g.id);continue}if(g.status!=="pending")continue;if(g.dependsOn.every((w)=>h.get(w)?.status==="completed"))c.push(g.id)}let p=[],m,f=0;for(let g of t.runs){if(o[g.status]+=1,g.status==="queued"||g.status==="running")p.push(g.id);let y=g.startedAt.getTime();if(y>=f)f=y,m=g.id}for(let g of t.outcomes)i[g.status]+=1;for(let g of t.outcomeFragments)s[g.status]+=1;return{teamName:e,updatedAt:No(),members:{total:t.members.length,byStatus:n,leadCount:a,teammateCount:d},tasks:{total:t.tasks.length,byStatus:r,blockedTaskIds:l,readyTaskIds:c,completionPct:n8(u,t.tasks.length)},runs:{total:t.runs.length,byStatus:o,activeRunIds:p,latestRunId:m},outcomes:{total:t.outcomes.length,byStatus:i,finalizedPct:n8(i.finalized,t.outcomes.length),missingRequiredSections:ALe(t.outcomes,t.outcomeFragments)},fragments:{total:t.outcomeFragments.length,byStatus:s}}}function qC(e){let{event:t}=e;switch(t.type){case"team_task_updated":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No(),taskId:t.task.id,agentId:t.task.assignee??t.task.createdBy};case"run_queued":case"run_started":case"run_completed":case"run_failed":case"run_cancelled":case"run_interrupted":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No(),runId:t.run.id,taskId:t.run.taskId,agentId:t.run.agentId,message:t.run.error};case"run_progress":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No(),runId:t.run.id,taskId:t.run.taskId,agentId:t.run.agentId,message:t.message};case"outcome_created":case"outcome_finalized":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No(),outcomeId:t.outcome.id};case"outcome_fragment_attached":case"outcome_fragment_reviewed":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No(),outcomeId:t.fragment.outcomeId,fragmentId:t.fragment.id,agentId:t.fragment.sourceAgentId};case"team_message":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No(),taskId:t.message.taskId,agentId:t.message.fromAgentId,message:t.message.subject};case"team_mission_log":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No(),taskId:t.entry.taskId,agentId:t.entry.agentId,message:t.entry.summary};case"teammate_spawned":case"teammate_shutdown":case"task_start":case"task_end":case"agent_event":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No(),agentId:t.agentId}}return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No()}}import{clearPolykvGrantedWindow as r8,releasePolykvAgent as zC}from"@cerebriline/llms";import{sanitizeFileName as RLe,TeamMessageType as xe}from"@cerebriline/shared";import{nanoid as ILe}from"nanoid";import{TeamMessageType as wat}from"@cerebriline/shared";function xv(){return{reset:!1,tasks:new Set,mailbox:new Set,missionLog:new Set,runs:new Set,outcomes:new Set,outcomeFragments:new Set}}function vm(e){if(typeof DOMException<"u"&&e instanceof DOMException&&e.name==="AbortError")return!0;if(!(e instanceof Error))return!1;return e.name==="AbortError"||e.message.toLowerCase().includes("aborted")}function KC(e){let t=Error(e);return t.name="AbortError",t}function CLe(e){return`[The lead requeued you${e?` (${e})`:""}: your engine session was given back and booked again. Your work so far is above. Carry on with your task from where you stopped.]`}function GC(e){return`Teammate "${e}" was shut down and takes no more tasks. To give it work, spawn it again with team_spawn_teammate under the same agentId.`}function o8(e,t){return e?.abortRequested===!0||e?.status==="stopped"&&vm(t)}function PLe(e){if(e.finishReason==="aborted")return"cancelled";if(e.finishReason==="error"||e.finishReason==="max_iterations")return"failed";return"completed"}var MLe=600000,i8="recovered_queued";function OLe(e){return`This is an automatic recovery of interrupted team run ${e.id}. The previous process stopped before completion. Continue the task safely, inspect the current workspace state before making changes, and avoid duplicating completed work.
1310
+ `).filter(Boolean);await Promise.allSettled(o.map((i)=>kn(e,["update-ref","-d",i])))}catch{}}async function g6(e,t,n){if(!e||n.length===0)return;await Promise.allSettled(n.map((r)=>kn(e,["update-ref",`refs/cline/checkpoints/${t}/${r.runCount}`,r.ref])))}function YMe(e,t){let n=e.findIndex((r)=>r.runCount===t.runCount);if(n<0)return[...e,t];return e.map((r,o)=>o===n?t:r)}function y6(e){qMe();let t,n,r=async()=>{if(t===!0)return!0;try{t=(await kn(e.cwd,["rev-parse","--is-inside-work-tree"])).stdout==="true"}catch{t=!1}return t},o=async(i)=>{if(e.createCheckpoint)return await e.createCheckpoint({cwd:e.cwd,sessionId:e.sessionId,runCount:i});if(!await r())return;let s=Date.now(),a=(h)=>{e.telemetry?.capture({event:"checkpoint.snapshot",properties:{sessionId:e.sessionId,runCount:i,outcome:h,durationMs:Date.now()-s}})},d=async(h)=>{try{let m=(await kn(e.cwd,["rev-parse","HEAD"])).stdout.trim();if(!m)return;return{ref:m,createdAt:Date.now(),runCount:i,kind:"commit"}}catch(p){RC(e.logger,`${h}: ${p instanceof Error?p.message:String(p)}`);return}},l=`${h6}${e.sessionId} run=${i}`,c="";try{c=await VMe(e.cwd,f6(e.cwd,e.sessionId),l)??""}catch(h){RC(e.logger,`Checkpoint snapshot failed after ${Date.now()-s}ms: ${h instanceof Error?h.message:String(h)}`);let p=await d("Checkpoint HEAD fallback failed");return a(p?"head_fallback":"skipped"),p}if(!c){let h=await d("Checkpoint HEAD fallback failed");return a(h?"head_clean":"skipped"),h}let u=`refs/cline/checkpoints/${e.sessionId}/${i}`;try{await kn(e.cwd,["update-ref",u,c])}catch(h){RC(e.logger,`Checkpoint store failed: ${h instanceof Error?h.message:String(h)}`),a("skipped");return}return a("stash"),{ref:c,createdAt:Date.now(),runCount:i,kind:"stash"}};return{beforeRun:async({snapshot:i})=>{if(i.parentAgentId==null)n=i.messages.length;return},beforeModel:async({snapshot:i})=>{if(i.parentAgentId!=null||i.iteration!==1)return;let s=i.messages.slice(n??Math.max(0,i.messages.length-1));n=void 0;let a=nh(i.messages);if(a<1)return;let d=await e.readSessionMetadata(),l=zMe(d),c=nh(s)>=1,u=l?.history.some((m)=>m.runCount===a)??!1;if(!c&&u)return;let h=await o(a);if(!h)return;if(l?.latest.ref===h.ref)return;let p=YMe(l?.history??[],h);await e.writeSessionMetadata({...d??{},checkpoint:{latest:h,history:p}});return}}}function Gc(...e){let t,n,r;for(let i of e){if(!i)continue;if(i.toolExecutors)t={...t??{},...i.toolExecutors};if(i.requestToolApproval)n=i.requestToolApproval;if(i.readReceipts)r=i.readReceipts}let o=t&&Object.keys(t).length>0;if(!o&&!n&&!r)return;return{...o?{toolExecutors:t}:{},...n?{requestToolApproval:n}:{},...r?{readReceipts:r}:{}}}import*as wr from"@cerebriline/llms";import{isOllamaNativeProvider as w6,resolveOutputBudgetTokens as XMe}from"@cerebriline/shared";function JMe(e){if(w6(e))return"ollama";return e==="opencoti"||e==="openai-compatible"?"llamacpp":void 0}var td=(e)=>typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0;function b6(e){let t=td(e.configuredNumPredict)??td(e.maxTokensPerTurn)??(e.outputBudget?.mode==="manual"?td(e.outputBudget.maxTokens):void 0);if(t!==void 0)return Math.floor(t);return XMe({mode:e.outputBudget?.mode??"auto",maxTokens:e.outputBudget?.maxTokens,contextWindow:e.contextWindow,modelMaxOutputTokens:td(e.modelMaxOutputTokens)})??wr.resolveDefaultMaxOutputTokens({contextWindow:td(e.contextWindow),maxOutputTokens:td(e.modelMaxOutputTokens)})}async function v6(e){let t=JMe(e.providerId);if(!t||e.thinking===!1||!e.modelId)return;let n=td(e.configuredNumPredict)??e.outputCap;if(t==="llamacpp"){let i=e.configuredThinkBudget?.trim()||e.reasoningEffort?.trim();if(!i)return;let s=wr.resolveLlamaCppThinkBudgetTokens(i,wr.resolveLlamaCppThinkBudgetWindow(e.contextWindow,n));return s===void 0?void 0:{level:i,budgetTokens:s}}let r=wr.resolveOllamaThinking({effort:e.reasoningEffort,sampling:{thinkBudget:e.configuredThinkBudget,reasoningLevel:e.configuredReasoningLevel}}),o={...typeof r.think==="string"?{think:r.think}:{},...r.thinkBudget?{thinkBudget:r.thinkBudget}:{},numPredict:n,numCtx:e.contextWindow};return e.probeOllama?e.probeOllama(e.baseUrl,e.modelId,o):wr.probeOllamaThinkBudget(e.baseUrl,e.modelId,o,e.fetchImpl)}function k6(e){let t=e.configuredMessage?.trim();if(t)return t;return w6(e.providerId)?wr.readDeclaredThinkBudgetMessage(e.baseUrl,e.modelId):void 0}var QMe=/(api[-_]?key|token|secret|password|authorization|credential|cookie)/i,ZMe=new Set(["knownModels","extensionContext","logger","telemetry","hooks","extensions","tools","systemPrompt","providerConfig","workspaceMetadata"]);function Vc(e,t="",n=0){if(e===null||e===void 0)return;if(typeof e==="function"||typeof e==="symbol")return;if(typeof e==="string")return t&&QMe.test(t)&&e?"[set]":e;if(typeof e!=="object")return e;if(n>=6)return;if(Array.isArray(e))return e.map((i)=>Vc(i,t,n+1)).filter((i)=>i!==void 0);let r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==null)return;let o={};for(let[i,s]of Object.entries(e)){if(ZMe.has(i))continue;let a=t==="headers"&&typeof s==="string"&&s?"[set]":Vc(s,i,n+1);if(a!==void 0)o[i]=a}return o}var eOe=new Set(["fetch","headers","knownModels","extensionContext","providerId","modelId"]);function T6(e,t){let n=e,r=t,o=[];for(let i of new Set([...Object.keys(n),...Object.keys(r)])){if(eOe.has(i)||typeof n[i]==="function")continue;if(JSON.stringify(n[i]??null)!==JSON.stringify(r[i]??null))o.push(i)}return o.sort()}function Oo(e){let t=e?.trim();return t?t:void 0}function tOe(e){let t=e.client,n=F3(t)??Oo(e.source),r=Oo(t.version),o=Oo(t.platform)??Oo(t.name),i=Oo(t.platformVersion)??r,s={cline_type:n,extension_version:r,platform:o,platform_version:i};if(e.user?.accountId===void 0)return s;let a=typeof e.user.accountId==="string"?Oo(e.user.accountId):void 0;return{...s,distinct_id:a??Oo(e.user.distinctId),user_id:a,account_id:a,account_email:a?Oo(e.user.email):void 0,organization_id:a?Oo(e.user.organizationId):void 0}}function MC(e,t){let n={},r={},o,i=(s)=>({...t,...r,...n,...s,...o?{distinct_id:o}:{}});return{setDistinctId(s){o=Oo(s)},setMetadata(s){n={...s}},updateMetadata(s){n={...n,...s}},setCommonProperties(s){r={...s}},updateCommonProperties(s){r={...r,...s}},isEnabled:()=>e.isEnabled(),capture:(s)=>e.capture({event:s.event,properties:i(s.properties)}),captureRequired:(s,a)=>e.captureRequired(s,i(a)),recordCounter:(s,a,d,l,c)=>e.recordCounter(s,a,i(d),l,c),recordHistogram:(s,a,d,l,c)=>e.recordHistogram(s,a,i(d),l,c),recordGauge:(s,a,d,l,c)=>e.recordGauge(s,a,i(d),l,c),flush:()=>e.flush(),dispose:async()=>{}}}function S6(e,t){return MC(e,tOe(t))}import{upsertWorkspaceInfo as nOe,WorkspaceManifestSchema as OC}from"@cerebriline/shared";class LC{manifest;listeners=new Set;constructor(e){this.manifest=OC.parse(e??{workspaces:{}})}async addWorkspacePath(e){let t=await zk(e);return this.manifest=nOe(this.manifest,t),this.emit({type:"workspace_added",workspace:t}),t}async switchWorkspace(e){let t=Ms(e),n=this.manifest.workspaces[t];if(n)return this.manifest=OC.parse({...this.manifest,currentWorkspacePath:t}),this.emit({type:"workspace_switched",workspace:n}),n;let r=await this.addWorkspacePath(t);return this.manifest=OC.parse({...this.manifest,currentWorkspacePath:r.rootPath}),this.emit({type:"workspace_switched",workspace:r}),r}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}getCurrentWorkspace(){let e=this.manifest.currentWorkspacePath;if(!e)return;return this.manifest.workspaces[e]}getWorkspace(e){let t=Ms(e);return this.manifest.workspaces[t]}listWorkspaces(){return Object.values(this.manifest.workspaces)}getManifest(){return this.manifest}emit(e){for(let t of this.listeners)t(e)}}import{createHash as rOe}from"node:crypto";var x6=new Set,_6=new Set;function oOe(e,t){return rOe("sha256").update(e).update("\x00").update(t?.trim()??"").digest("hex")}function iOe(e){if(e.vcsTypes&&e.vcsTypes.length>0)return e.vcsTypes;return[e.vcsType==="git"?"git":"none"]}function E6(e){if(!e.telemetry)return;let t=oOe(e.rootPath,e.dedupeScope),n=e.rootCount??1;if(!x6.has(t))x6.add(t),HM(e.telemetry,{root_count:n,vcs_types:iOe(e),init_duration_ms:e.durationMs,feature_flag_enabled:e.featureFlagEnabled??!0,is_remote_workspace:e.isRemoteWorkspace});if(e.initError&&!_6.has(t)){_6.add(t);let r=Error(e.initError.message);r.name=e.initError.errorType||"Error",WM(e.telemetry,r,{fallback_to_single_root:!0,workspace_count:n})}}function vOe(e){return`${e.pluginName??e.pluginPath}: ${e.message}`}function kOe(e,t,n){if(t.length>0)for(let i of t)n?.log(i.message,{severity:"warn"});if(e.length===0)return;let r=e.slice(0,3).map(vOe).join("; "),o=e.length>3?`; and ${e.length-3} more`:"";n?.log(`Some plugins failed to initialize. ${r}${o}. Use --verbose for more details.`,{severity:"warn"});for(let i of e)n?.log(`Plugin initialization failed (${i.phase}) for ${i.pluginPath}`,{severity:"warn",stack:i.stack,pluginPath:i.pluginPath,pluginName:i.pluginName})}function TOe(e,t){for(let n of e){let r=n.componentName?` (${n.componentName})`:"";t?.log(`[agent-plugins] ${n.pluginName??n.pluginPath}${r}: ${n.message}`,{severity:n.level==="warning"?"warn":"error"})}}function SOe(e){let t=e?.["X-CLIENT-TYPE"]?.trim();if(!t)return;let n=e?.["X-CLIENT-VERSION"]?.trim();return{name:t,...n?{version:n}:{}}}function xOe(e,t){let n=typeof e.thinking==="boolean",r=typeof e.reasoningEffort==="string";if(!n&&!r)return t;return{...t??{},...n?{enabled:e.thinking}:{},...r?{effort:e.reasoningEffort}:{}}}function bv(e,t){return fOe(e,t)}function _Oe(e,t,n){if(e.systemPrompt?.trim())return e.systemPrompt;return mOe({ide:"Terminal Shell",workspaceRoot:t.rootPath,workspaceName:t.hint,metadata:n,rules:e.rules,mode:e.mode,providerId:e.providerId,platform:process.platform||"unknown"})}function EOe(e,t){return e.storedProviderSettings==="ignore"?void 0:t.getProviderSettings(e.providerId)}function R6(e,t,n,r,o,i){let s=o||r?.modelCatalog?{...o??{},...r?.modelCatalog??{}}:void 0,a=e.providerConfig?.providerId===e.providerId?e.providerConfig:void 0,d=St(e.contextWindow),l=pOe({providerId:e.providerId,sessionId:t,source:n,defaultSource:Yt.CLI,client:{name:e.extensionContext?.client?.name,version:e.extensionContext?.client?.version,versionHeaderFallback:e.headers?.["X-CLIENT-VERSION"],platform:e.extensionContext?.client?.platform,platformVersion:e.extensionContext?.client?.platformVersion,isMultiRoot:e.extensionContext?.client?.isMultiRoot},coreVersion:Af,openAiCodex:{accountId:a?.accountId??r?.auth?.accountId,accessToken:a?.accessToken??e.apiKey??r?.auth?.accessToken??r?.apiKey,userAgentVersion:process.env.npm_package_version},headers:{stored:r?.headers,config:e.headers,session:a?.headers}}),c={...r??{},provider:e.providerId,model:e.modelId,apiKey:e.apiKey??r?.apiKey,baseUrl:e.baseUrl??r?.baseUrl,headers:void 0,reasoning:xOe(e,r?.reasoning),modelCatalog:s,...d!==void 0?{contextWindow:d}:{}},u={...Za(c),...a??{}};if(l)u.headers=l;if(e.knownModels)u.knownModels=e.knownModels;if(d!==void 0)u.knownModels={...u.knownModels??{},[e.modelId]:{...u.knownModels?.[e.modelId]??{},id:e.modelId,contextWindow:d,maxInputTokens:void 0}};if(e.extensionContext)u.extensionContext=e.extensionContext;let p=e.fetch??u.fetch??i;if(p)u.fetch=p;return u}var St=(e)=>typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0;function AOe(e){return{...e,compaction:{...e.compaction??{},enabled:e.compaction?.enabled??!0},checkpoint:{...e.checkpoint??{},enabled:e.checkpoint?.enabled??!0},taskProgress:{...e.taskProgress??{},enabled:e.taskProgress?.enabled??!0}}}async function ROe(e,t){let n=t.modelId??e.modelId,r=t.fetch??globalThis.fetch;if(e.providerConfig?.providerId===e.providerId&&St(e.providerConfig?.defaultMaxOutputTokens)!==void 0||!n||!vv(e.providerId))return{council:!1};if(await aOe(t.baseUrl,n,r,e.logger).catch(()=>{return}),IOe(t,n,lOe(t.baseUrl,n),e.knownModels?.[n]),e.providerId!=="xollama")return{council:!1};return{council:(await cOe(hOe(e.providerId,t.baseUrl),n,r).catch(()=>{return}))?.council===!0}}function IOe(e,t,n,r){if(!n||n.images===void 0&&n.tools===void 0||Array.isArray(r?.capabilities))return;let o=e.knownModels?.[t],i=new Set(o?.capabilities??[]),s=(a,d)=>{if(d===!0)i.add(a);else if(d===!1)i.delete(a)};if(s("images",n.images),s("tools",n.tools),n.tools===void 0&&i.size>0)i.add("tools");e.knownModels={...e.knownModels??{},[t]:{...o??{},id:t,capabilities:[...i]}}}function COe(e){return e.logger?.log(`${e.modelId} is an xOllama council: it compacts server-side; client compaction is off`,{severity:"info"}),{...e,compaction:{...e.compaction??{},enabled:!1,cappedThinkingEnabled:!1},staleReadRewrites:!1}}function POe(e,t,n,r,o){let i=t.modelId,s=e.knownModels?.[i];if(r===void 0||!o&&!s)return;let d=St(n?.sampling?.numPredict)??St(t.maxTokensPerTurn)??(n?.outputBudget?.mode==="manual"?St(n.outputBudget.maxTokens):void 0)??St(s?.maxTokens)??(vv(t.providerId)?St(e.defaultMaxOutputTokens):void 0);e.knownModels={...e.knownModels??{},[i]:{...s??{},id:i,contextWindow:r,maxInputTokens:St(t.contextWindow)!==void 0?s?.maxInputTokens:Math.min(s?.maxInputTokens??r,r),...d!==void 0?{maxTokens:d}:{}}}}function MOe(e){let{config:t,hostConfig:n,providerConfig:r,stored:o}=e,i=r.knownModels?.[t.modelId],s=o?T6(r,(()=>{let l=R6(n,e.sessionId,e.source,void 0,e.modelCatalogDefaults,e.defaultFetch);return l.defaultMaxOutputTokens=r.defaultMaxOutputTokens,l.thinkingBudgetTokens=r.thinkingBudgetTokens,l})()):[],a=n.providerConfig?.providerId===n.providerId&&St(n.providerConfig?.defaultMaxOutputTokens)!==void 0;if(o&&!a){let l=[["budget.contextWindow",St(t.contextWindow)===void 0?o.contextWindow:void 0],["budget.numPredict",o.sampling?.numPredict],["budget.thinkBudget",o.sampling?.thinkBudget],["budget.outputBudget",o.outputBudget],["budget.reasoningBudgetTokens",o.reasoning?.budgetTokens]];for(let[c,u]of l)if(u!==void 0&&u!==null)s.push(c)}let d=wOe();return{sessionId:e.sessionId,providerId:t.providerId,modelId:t.modelId,...r.baseUrl?{baseUrl:r.baseUrl}:{},contextWindow:St(t.contextWindow)??e.contextWindow??St(i?.contextWindow)??St(r.maxInputTokens),maxOutputTokens:St(r.defaultMaxOutputTokens),thinking:{...typeof r.thinking==="boolean"?{enabled:r.thinking}:{},...r.reasoningEffort?{effort:String(r.reasoningEffort)}:{},...St(r.thinkingBudgetTokens)!==void 0?{budgetTokens:r.thinkingBudgetTokens}:{}},...r.sampling?{sampling:Vc(r.sampling)}:{},reasoningHistory:uOe(t.providerId,{modelId:r.modelId??t.modelId,baseUrl:r.baseUrl,reasoningHistory:r.reasoningHistory,reasoningInline:r.reasoningInline}),provider:Vc(r),session:Vc(t),...t.systemPrompt?{systemPrompt:t.systemPrompt}:{},sources:{storedProviderSettings:t.storedProviderSettings==="ignore"?"ignored":o?"merged":"absent",inheritedFromStoredProfile:s.sort(),dataDir:yOe(),providerSettingsPath:bOe(),globalSettingsPath:d,globalSettingsPresent:sOe(d)}}}async function OOe(e,t,n){if(t.providerConfig?.providerId===t.providerId&&St(t.providerConfig?.defaultMaxOutputTokens)!==void 0)return;let o=t.modelId,i=e.baseUrl,s=e.knownModels?.[o],a=St(t.contextWindow)??St(n?.contextWindow)??(vv(t.providerId)?A6(i,o):void 0)??St(s?.contextWindow),d=n?.sampling,l=b6({configuredNumPredict:d?.numPredict,maxTokensPerTurn:t.maxTokensPerTurn,outputBudget:n?.outputBudget,contextWindow:a,modelMaxOutputTokens:s?.maxTokens});e.defaultMaxOutputTokens=l;let c;try{c=await v6({providerId:t.providerId,modelId:o,baseUrl:i,thinking:e.thinking,reasoningEffort:e.reasoningEffort,configuredThinkBudget:d?.thinkBudget,configuredReasoningLevel:d?.reasoningLevel,configuredNumPredict:d?.numPredict,outputCap:l,contextWindow:a,fetchImpl:e.fetch??fetch})}catch{c=void 0}if(c&&St(n?.reasoning?.budgetTokens)===void 0)e.thinkingBudgetTokens=c.budgetTokens;return t.logger?.log(`Output budget: cap=${l} contextWindow=${a??"unknown"}`+(c?` thinking=${c.budgetTokens} (${c.level})`:""),{severity:"info"}),{contextWindow:a,thinking:c,budgetMessage:k6({providerId:t.providerId,modelId:o,baseUrl:i,configuredMessage:d?.thinkBudgetMessage})}}async function I6(e){let{input:t,sessionId:n,sessionOrigin:r,providerSettingsManager:o,defaultTelemetry:i,defaultLogger:s,defaultCapabilities:a,defaultToolPolicies:d,defaultFetch:l,onPluginEvent:c,onTeamEvent:u,createSubAgentLifecycleCallbacks:h,createSpawnTool:p,createSwarmTool:m,delegatedSandboxes:f,localRuntime:g,readSessionMetadata:y,writeSessionMetadata:w}=e,k=ki(t.config),{modelCatalogDefaults:b,userInstructionService:v,configExtensions:E,onTeamRestored:S,...x}=g??{},T=Object.keys(x).length>0?x:void 0,{workspaceInfo:A,workspaceMetadata:R,gitState:C,durationMs:L,vcsType:N,initError:W}=await vO(k),D=T?.extensionContext,K=D?.client?void 0:SOe(t.config.headers),V=D?.client??K,j=D?.telemetry??T?.telemetry??(i&&V?S6(i,{client:V,source:t.source,user:D?.user}):i),G=j&&r?MC(j,{session_origin:r.mode,session_origin_trigger:r.trigger}):j,z={...D??{},...K?{client:K}:{},workspace:{...A,...D?.workspace??{}},session:{...D?.session??{},sessionId:n},logger:D?.logger??T?.logger??s,telemetry:G};E6({telemetry:z.telemetry,rootPath:A.rootPath,dedupeScope:z.client?.name??t.source,workspaceInfo:A,rootCount:1,vcsType:N,durationMs:L,initError:W,featureFlagEnabled:!0});let M=bv(E,"hooks")?MR({cwd:t.config.cwd,workspacePath:k,rootSessionId:n,logger:T?.logger,workspaceInfo:A,onHookRuntime:(Ze)=>oO(z.telemetry,Ze)}):void 0,X=H3(T?.hooks)?void 0:PR({rootSessionId:n,workspacePath:k,workspaceInfo:A}),oe=Rc([T?.hooks,X]),H;if(bv(E,"plugins"))try{H=await u6({pluginPaths:T?.pluginPaths,workspacePath:k,cwd:t.config.cwd,onEvent:c,providerId:t.config.providerId,modelId:t.config.modelId,workspaceInfo:A,session:z.session,client:z.client,user:z.user,logger:z.logger,telemetry:z.telemetry,automation:z.automation}),kOe(H.failures,H.warnings,T?.logger)}catch(Ze){let pn=Ze instanceof Error?Ze.message:String(Ze);T?.logger?.log?.(`plugin loading failed; continuing without plugins (${pn})`)}let J;if(bv(E,"plugins"))try{J=await om({pluginPaths:t.config.agentPluginPaths,cwd:t.config.cwd,disabledPluginNames:[...Cu()]}),TOe(J.diagnostics,z.logger)}catch(Ze){let pn=Ze instanceof Error?Ze.message:String(Ze);z.logger?.log(`[agent-plugins] Package discovery failed; continuing without Agent Plugins: ${pn}`,{severity:"error"})}let he=await B4({logger:T?.logger}),se=[...M?[M]:[],...he?[he]:[]],re=se.length>0?se:void 0,Ge=LI(re,LI(T?.extensions,iL(H?.extensions))),I=bv(E,"plugins")?Kc(H?.pluginPaths??[]):void 0,_=AOe({...t.config,...T??{},sessionId:n,hooks:oe,extensions:Ge,extensionContext:z,telemetry:z.telemetry,logger:z.logger}),F=EOe(_,o),O=R6(_,n,t.source,F,b,l),ne=(await ROe(_,O)).council?COe(_):_,fe=await OOe(O,ne,F);if(fe)POe(O,ne,F,fe.contextWindow,(St(ne.contextWindow)??St(F?.contextWindow)??(vv(ne.providerId)?A6(O.baseUrl,ne.modelId):void 0))!==void 0);let Ce=Rc([ne.hooks,ne.checkpoint?.enabled===!0?y6({cwd:ne.cwd,sessionId:n,logger:ne.logger,createCheckpoint:ne.checkpoint?.createCheckpoint,telemetry:ne.telemetry,readSessionMetadata:y,writeSessionMetadata:w}):void 0]),We=_Oe(ne,A,R),Se={...ne,providerConfig:O,workspaceMetadata:R,systemPrompt:We,hooks:Ce,...fe?.budgetMessage&&!ne.compaction?.cappedThinkingBudgetMessage?{compaction:{...ne.compaction??{},cappedThinkingBudgetMessage:fe.budgetMessage}}:{},...We?{systemPrompt:gOe(We,{outputCap:O.defaultMaxOutputTokens,contextWindow:fe?.contextWindow??O.maxInputTokens,...fe?.thinking?{thinking:fe.thinking}:O.thinkingBudgetTokens&&O.reasoningEffort?{thinking:{level:O.reasoningEffort,budgetTokens:O.thinkingBudgetTokens}}:{}})}:{}};await dOe(Se.providerId,O.baseUrl,O.modelId??Se.modelId,O.fetch??globalThis.fetch).catch(()=>{return});let Le=MOe({config:Se,hostConfig:ne,providerConfig:O,sessionId:n,source:t.source,stored:F,modelCatalogDefaults:b,defaultFetch:l,contextWindow:fe?.contextWindow});await ne.onConfigResolved?.(Le);let it=t.toolPolicies??ne.toolPolicies??d,dt=Gc(a,t.capabilities),_e=dt?.requestToolApproval,Ue=dt?.toolExecutors,xt=dt?.readReceipts,Qt=h?.(Se),er=new LC({currentWorkspacePath:A.rootPath,workspaces:{[A.rootPath]:A}});return{effectiveInput:t,config:Se,providerConfig:O,resolvedConfig:Le,workspaceMetadata:R,workspaceInfo:A,gitState:C,extensions:Ge,hooks:Ce,toolPolicies:it,requestToolApproval:_e,pluginSandboxShutdown:H?.shutdown,runtimeBuilderInput:{config:Se,hooks:Ce,extensions:Ge,onTeamEvent:u,createSpawnTool:p,createSwarmTool:m,...f?{delegatedSandboxes:f}:{},onTeamRestored:S,onSubAgentEvent:Qt?.onSubAgentEvent,onSubAgentStart:Qt?.onSubAgentStart,onSubAgentEnd:Qt?.onSubAgentEnd,userInstructionService:v,pluginSkillDirectories:I,agentPluginSkills:J?.skills,agentPluginMcpServers:J?.mcpServers,configExtensions:E,toolExecutors:Ue,readReceipts:xt,toolPolicies:it,workspaceManager:er,logger:Se.logger,telemetry:Se.telemetry,requestToolApproval:_e}}}import{RECALLED_MEMORY_TAG as BOe}from"@cerebriline/shared";import{createTool as Sit,MAIN_MEMORY as xit,memorySelectionFor as _it}from"@cerebriline/shared";import{DEFAULT_LIBRARY_SETTINGS as $Oe,DEFAULT_MEMORY_SETTINGS as hit,MAIN_MEMORY as pit,memoryWorkspaceKey as mit}from"@cerebriline/shared";import{resolveClineDataDir as git}from"@cerebriline/shared/storage";import{DEFAULT_LIBRARY_SETTINGS as Xot}from"@cerebriline/shared";import{resolveClineDataDir as Qot}from"@cerebriline/shared/storage";import{DEFAULT_LIBRARY_SETTINGS as fot}from"@cerebriline/shared";var oot=Array.from({length:64},(e,t)=>(Math.imul(t+1,2654435761)|1)>>>0);import{loadSqliteDb as Mot}from"@cerebriline/shared/db";var C6=4000;var bit={...$Oe,enabled:!0,chunkSize:C6*2,chunkOverlap:0,markdownHeaders:!1};var Dit=new Set("a about above after again all also am an and any are as at be because been before being below between both but by can could did do does doing down during each few for from further had has have having he her here hers him his how i if in into is it its just me more most my no nor not now of off on once only or other our ours out over own same she should so some such than that the their theirs them then there these they this those through to too under until up very was we were what when where which while who whom why will with would you your yours please thanks every always never use using used want wants need needs like get got make made new one two project projects code file files thing things".split(" "));function P6(e){let t=new Set;for(let n of e){if(!n.includes(`<${BOe}>`))continue;for(let r of n.matchAll(/^\[(m\d+)\] \d{4}-\d{2}-\d{2}, /gm))t.add(r[1])}return[...t]}import{existsSync as kv,mkdirSync as HOe,readdirSync as WOe,rmdirSync as jOe,rmSync as qOe,unlinkSync as zOe}from"node:fs";import{dirname as M6,join as gm}from"node:path";function ft(){return new Date().toISOString()}function ym(e){if(!e||!kv(e))return;try{zOe(e)}catch{}}function KOe(e){let t=Ya(e);if(t)return{rootSessionId:t.rootSessionId,fileStem:`${t.agentId}__${t.teamTaskId}`};let n=Bc(e);if(n)return{rootSessionId:n.rootSessionId,fileStem:n.agentId};return{rootSessionId:e,fileStem:e}}class NC{ensureSessionsDir;constructor(e){this.ensureSessionsDir=e}sessionArtifactsDir(e){return gm(this.ensureSessionsDir(),e)}ensureSessionArtifactsDir(e){let t=this.sessionArtifactsDir(e);if(!kv(t))HOe(t,{recursive:!0});return t}sessionMessagesPath(e){return gm(this.sessionArtifactsDir(e),`${e}.messages.json`)}sessionCompactionPath(e){return gm(this.sessionArtifactsDir(e),`${e}.compaction.json`)}sessionManifestPath(e,t=!1){let n=t?this.ensureSessionArtifactsDir(e):this.sessionArtifactsDir(e);return gm(n,`${e}.json`)}removeSessionDirIfEmpty(e){let t=this.sessionArtifactsDir(e),n=this.ensureSessionsDir();while(t.startsWith(n)&&t!==n){if(!kv(t)){t=M6(t);continue}try{if(WOe(t).length>0)break;jOe(t)}catch{break}t=M6(t)}}removeSessionDir(e){this.removeDir(this.sessionArtifactsDir(e))}removeDir(e){if(!kv(e))return;try{qOe(e,{recursive:!0,force:!0})}catch{}}subagentArtifactPaths(e,t,n){let{rootSessionId:r,fileStem:o}=KOe(e),i=this.sessionArtifactsDir(r);return{messagesPath:gm(i,`${o}.messages.json`)}}}import{nanoid as mst}from"nanoid";import{nanoid as Xit}from"nanoid";import{loadSqliteDb as nst}from"@cerebriline/shared/db";import{nanoid as ost}from"nanoid";function L6(e){let t=e?.importedFrom;if(typeof t!=="object"||t===null||Array.isArray(t))return;let n=t;if(typeof n.tool!=="string"||typeof n.sourceSessionId!=="string")return;return{tool:n.tool,sourceSessionId:n.sourceSessionId,sourcePath:typeof n.sourcePath==="string"?n.sourcePath:"",importedAt:typeof n.importedAt==="string"?n.importedAt:""}}import{resolveDocumentsExtensionPath as GOe}from"@cerebriline/shared/storage";function N6(e,t,n,r,o){if(n)KM(e.telemetry,{ulid:t,provider:e.providerId,model:e.modelId,...o});else zM(e.telemetry,{ulid:t,provider:e.providerId,model:e.modelId,...o});VOe(e.telemetry,{workspacePath:r})}function VOe(e,t){let n=GOe("Hooks"),r=Cp(t.workspacePath),o=new Map,i=n.replace(/\\/g,"/");for(let s of r){let a=s.hookEventName??"unknown",d=o.get(a)??{global:0,workspace:0},l=s.path.replace(/\\/g,"/");if(l===i||l.startsWith(`${i}/`))d.global+=1;else d.workspace+=1;o.set(a,d)}for(let[s,a]of o.entries())iO(e,s,a.global,a.workspace)}function D6(e,t){for(let n of t.mentions)nO(e,n,t.matchedFiles.includes(n)?1:0,"file",!t.matchedFiles.includes(n));for(let n of t.matchedFiles)eO(e,"file",n.length);for(let n of t.ignoredMentions)tO(e,"file","not_found",n)}function YOe(e){return e?JSON.parse(JSON.stringify(e)):void 0}function XOe(e){return e?JSON.parse(JSON.stringify(e)):void 0}function JOe(e){let t=e?.checkpoint&&typeof e.checkpoint==="object"&&!Array.isArray(e.checkpoint)?e.checkpoint:void 0,r=(Array.isArray(t?.history)?t.history:[]).filter((s)=>!!s&&typeof s==="object"&&!Array.isArray(s)).flatMap((s)=>{let a=typeof s.ref==="string"?s.ref.trim():"",d=Number(s.createdAt),l=Number(s.runCount);if(!a||!Number.isFinite(d)||!Number.isInteger(l))return[];return[{ref:a,createdAt:d,runCount:l,...s.kind==="stash"||s.kind==="commit"?{kind:s.kind}:{}}]}),o=r.at(-1),i=e?.checkpointEnabled===!0?!0:void 0;if(!i&&r.length===0)return;return{...i?{enabled:i}:{},...o?{latest:o}:{},history:r}}function nd(e){let{session:t}=e,n=YOe(t.metadata);return{version:1,sessionId:t.sessionId,source:t.source,status:t.status,createdAt:t.startedAt,updatedAt:t.updatedAt,endedAt:t.endedAt??null,exitCode:t.exitCode??null,interactive:t.interactive,workspace:{cwd:t.cwd,root:t.workspaceRoot},model:{providerId:t.provider,modelId:t.model},capabilities:{enableTools:t.enableTools,enableSpawn:t.enableSpawn,enableTeams:t.enableTeams},lineage:{...t.parentSessionId?{parentSessionId:t.parentSessionId}:{},...t.parentAgentId?{parentAgentId:t.parentAgentId}:{},...t.agentId?{agentId:t.agentId}:{},...t.conversationId?{conversationId:t.conversationId}:{},isSubagent:t.isSubagent},...t.teamName?{team:{name:t.teamName}}:{},...t.prompt?{prompt:t.prompt}:{},...n?{metadata:n}:{},...t.messagesPath?{artifacts:{messagesPath:t.messagesPath}}:{},...e.messages?{messages:XOe(e.messages)}:{},...e.usage?{usage:{...e.usage}}:{},...e.aggregateUsage?{aggregateUsage:{...e.aggregateUsage}}:{},...(()=>{let r=JOe(n);return r?{checkpoint:r}:{}})()}}import{execFile as QOe}from"node:child_process";import{randomUUID as ZOe}from"node:crypto";import{promisify as eLe}from"node:util";var ot=eLe(QOe);async function $6(e,t){try{return(await ot("git",["-C",e,"rev-parse","--verify","--quiet",t],{windowsHide:!0})).stdout.trim()||void 0}catch{return}}async function F6(e){if((await ot("git",["-C",e,"rev-parse","--is-inside-work-tree"],{windowsHide:!0})).stdout.trim()!=="true")throw Error(`${e} is not a git repository`);let n=(await ot("git",["-C",e,"rev-parse","--verify","HEAD"],{windowsHide:!0})).stdout.trim(),r=await $6(e,"refs/stash"),o=ZOe(),i=`refs/cline/restore-transactions/${o}`;await ot("git",["-C",e,"stash","push","--include-untracked","--message",`cline restore transaction ${o}`],{windowsHide:!0});let s=await $6(e,"refs/stash"),a=s!==void 0&&s!==r;if(a)try{await ot("git",["-C",e,"update-ref",i,s],{windowsHide:!0}),await ot("git",["-C",e,"stash","drop","stash@{0}"],{windowsHide:!0})}catch(l){try{await ot("git",["-C",e,"reset","--hard",n],{windowsHide:!0}),await ot("git",["-C",e,"clean","-fd"],{windowsHide:!0}),await ot("git",["-C",e,"stash","apply","--index",s],{windowsHide:!0})}catch(c){throw AggregateError([l,c],"Workspace snapshot and rollback both failed")}throw l}let d=!1;return{async commit(){if(d)return;if(d=!0,!a)return;await ot("git",["-C",e,"update-ref","-d",i],{windowsHide:!0}).catch(()=>{return})},async rollback(){if(d)return;if(await ot("git",["-C",e,"reset","--hard",n],{windowsHide:!0}),await ot("git",["-C",e,"clean","-fd"],{windowsHide:!0}),a)await ot("git",["-C",e,"stash","apply","--index",i],{windowsHide:!0}),await ot("git",["-C",e,"update-ref","-d",i],{windowsHide:!0});d=!0}}}function U6(e){let t=e?.metadata?.checkpoint&&typeof e.metadata.checkpoint==="object"&&!Array.isArray(e.metadata.checkpoint)?e.metadata.checkpoint:void 0;return(Array.isArray(t?.history)?t.history:[]).filter((r)=>!!r&&typeof r==="object"&&!Array.isArray(r)).flatMap((r)=>{let o=String(r.ref??"").trim(),i=Number(r.createdAt??0),s=Number(r.runCount??0);if(o.length===0||!Number.isFinite(i)||!Number.isInteger(s)||s<1)return[];let a=r.kind==="stash"||r.kind==="commit"?r.kind:void 0;return[{ref:o,createdAt:i,runCount:s,...a?{kind:a}:{}}]})}function B6(e,t){let n=U6(e).filter((o)=>o.runCount<=t),r=n.at(-1);return r?{latest:r,history:n}:void 0}function tLe(e,t){return e.reduce((n,r)=>{if(r.runCount>t)return n;if(!n||r.runCount>n.runCount)return r;return n},void 0)}function H6(e,t){let n=0;for(let r=0;r<e.length;r+=1){let o=e[r];if(!o)continue;let i=tl(o);if(i<1)continue;let s=n+1;if(n+=i,n===t)return{index:r,span:i};if(n>t)throw Error(`Run ${t} is folded into a compacted message spanning runs ${s}-${n}`)}throw Error(`Could not find user message for run ${t}`)}function nLe(e,t){let{index:n}=H6(e,t);return e.slice(0,n+1)}function W6(e,t){let{index:n,span:r}=H6(e,t);if(r!==1)throw Error(`Cannot fork before run ${t} because it is folded into a compacted message`);return e.slice(0,n)}function j6(e){let t=e.checkpointRunCount;if(!Number.isInteger(t)||t<1)throw Error("checkpointRunCount must be a positive integer");let n=tLe(U6(e.session),t);if(!n)throw Error(`No checkpoint found at or before run ${t} in session ${e.session.sessionId}`);let r=(e.cwd?.trim()||e.session.cwd||e.session.workspaceRoot).trim();if(!r)throw Error("cwd or workspaceRoot is required to restore a checkpoint");return{checkpoint:n,cwd:r,...e.restoreMessages!==!1?{messages:nLe(e.messages??[],t)}:{}}}async function rLe(e,t){if(t.kind)return t.kind;let n=await ot("git",["-C",e,"show","-s","--format=%P%x00%B",t.ref],{windowsHide:!0}),r=n.stdout.indexOf("\x00"),o=r<0?[]:n.stdout.slice(0,r).trim().split(/\s+/).filter(Boolean),i=r<0?"":n.stdout.slice(r+1);return o.length>=2&&p6(i)?"stash":"commit"}async function oLe(e,t){try{return await ot("git",["-C",e,"cat-file","-e",`${t}^3^{commit}`],{windowsHide:!0}),!0}catch{return!1}}async function iLe(e,t,n){try{let r=await ot("git",["-C",e,"rev-list","--count",`${t}..${n}`],{windowsHide:!0}),o=Number(r.stdout.trim());return Number.isFinite(o)?o:void 0}catch{return}}async function q6(e,t){if((await ot("git",["-C",e,"rev-parse","--is-inside-work-tree"],{windowsHide:!0})).stdout.trim()!=="true")throw Error(`${e} is not a git repository`);await ot("git",["-C",e,"cat-file","-e",`${t.ref}^{commit}`],{windowsHide:!0});let r=await rLe(e,t),o=r==="commit"?t.ref:`${t.ref}^1`,i=(await ot("git",["-C",e,"rev-parse","--verify",`${o}^{commit}`],{windowsHide:!0})).stdout.trim(),s=(await ot("git",["-C",e,"rev-parse","--verify","HEAD"],{windowsHide:!0})).stdout.trim();if(s!==i){let d=await iLe(e,i,s),l=d&&d>0?`${d} commit${d===1?" was":"s were"} added to the current branch after this checkpoint and would be removed by the restore`:"the current branch is no longer on the commit this checkpoint was created from (e.g. after a rebase or branch switch)";throw Error(`Cannot restore the workspace: ${l}. Restore the chat only, or move the branch back to ${i.slice(0,12)} manually (e.g. with git reset) before restoring the workspace.`)}if(r==="stash")await ot("git",["-C",e,"cat-file","-e",`${t.ref}^2^{commit}`],{windowsHide:!0});let a=await oLe(e,t.ref);if(await ot("git",["-C",e,"update-ref","-m","cline: checkpoint restore","HEAD",i,s],{windowsHide:!0}),await ot("git",["-C",e,"reset","--hard"],{windowsHide:!0}),a)await ot("git",["-C",e,"clean","-fd"],{windowsHide:!0});if(r==="commit")return;await ot("git",["-C",e,"stash","apply",t.ref],{windowsHide:!0})}class Wr extends Error{code;constructor(e,t){super(t);this.code=e;this.name="SessionVersioningError"}}function sLe(e){let t=e.sessionId.trim();if(!t)throw new Wr("invalid_restore","sessionId is required");if(!e.restoreMessages&&!e.restoreWorkspace)throw new Wr("invalid_restore","restore.messages or restore.workspace must be true");if(e.restoreMessages&&e.requiresStart)throw new Wr("invalid_restore","start is required when restore.messages is true");if(!Number.isInteger(e.checkpointRunCount)||e.checkpointRunCount<1)throw new Wr("invalid_restore","checkpointRunCount must be a positive integer");return t}class wm{async restoreCheckpoint(e){let t=e.restore?.messages!==!1,n=e.restore?.workspace!==!1,r=Date.now(),o,i=(k,b)=>{e.telemetry?.capture({event:"checkpoint.restore",properties:{sessionId:e.sessionId,checkpointRunCount:e.checkpointRunCount,restoreWorkspace:n,restoreMessages:t,checkpointKind:o?.kind??"unknown",outcome:k,durationMs:Date.now()-r,...b}})},s,a,d;try{let k=sLe({sessionId:e.sessionId,restoreMessages:t,restoreWorkspace:n,requiresStart:e.start===void 0,checkpointRunCount:e.checkpointRunCount}),b=await e.getSession(k);if(!b)throw new Wr("session_not_found",`Session ${k} not found`);if(s=b,a=t?await e.readMessages(k):void 0,t&&a?.length===0)throw new Wr("session_messages_not_found",`No messages found for session ${k}`);d=j6({session:s,messages:a,checkpointRunCount:e.checkpointRunCount,cwd:e.cwd,restoreMessages:t}),o=d.checkpoint}catch(k){throw i("failed",{phase:"plan"}),k}let l=nd({session:s,messages:a}),c,u=[],h,p;if(t){let{startSession:k,getStartedSessionId:b,cleanupStartedSession:v}=e;if(!e.start||!k||!b||!v)throw new Wr("invalid_restore","startSession, getStartedSessionId, and cleanupStartedSession are required when restore.messages is true");p={startSession:k,getStartedSessionId:b,cleanupStartedSession:v},c=B6(s,e.checkpointRunCount),u=e.restore?.omitCheckpointMessageFromSession?W6(a??[],e.checkpointRunCount):d.messages??[];let E={sourceSession:s,sourceMessages:a,sourceSnapshot:l,plan:d,restoredCheckpointMetadata:c,initialMessages:u,restoreMessages:t,restoreWorkspace:n,checkpointRunCount:e.checkpointRunCount};h=e.buildStartInput?await e.buildStartInput(E,e.start):e.start}let m=e.applyWorkspaceCheckpoint??q6,f=e.beginWorkspaceRestoreTransaction??(e.applyWorkspaceCheckpoint?void 0:F6),g=n&&f?await f(d.cwd):void 0,y=!1,w;try{if(n)await m(d.cwd,d.checkpoint);if(!p)return await g?.commit(),y=!0,i("success"),{checkpoint:d.checkpoint,sourceSnapshot:l};let k=await p.startSession(h);w={result:k,cleanup:p.cleanupStartedSession};let b=p.getStartedSessionId(k);if(!b)throw new Wr("invalid_restore","Restored session did not return a session id");await(e.retainCheckpointRefs??g6)(d.cwd,b,c?.history??[]);let v=e.readRestoredSession?await e.readRestoredSession(b):void 0,E=v?nd({session:v,messages:u}):void 0;return await g?.commit(),y=!0,i("success"),{sessionId:b,startResult:k,messages:d.messages,checkpoint:d.checkpoint,sourceSnapshot:l,...E?{restoredSnapshot:E}:{}}}catch(k){let b=[];if(w)try{await w.cleanup(w.result)}catch(v){b.push(v)}if(g&&!y)try{await g.rollback()}catch(v){b.push(v)}if(i("failed",{workspaceRolledBack:!!g&&!y,recovered:b.length===0}),b.length>0)throw AggregateError([k,...b],"Checkpoint restore failed and recovery did not complete");throw k}}}import{appendFileSync as aLe}from"node:fs";import{join as dLe}from"node:path";import{resolveRootSessionId as z6}from"@cerebriline/shared";import{ensureHookLogDir as lLe}from"@cerebriline/shared/storage";import{z as DC}from"zod";var cLe=DC.looseObject({task:DC.string().optional(),systemPrompt:DC.string().optional()});class Tv{adapter;manifestStore;toPersistedMessages;heartbeatLogIntervalMs;teamTaskSessionsByAgent=new Map;teamTaskLastHeartbeatBySession=new Map;teamTaskLastProgressLineBySession=new Map;constructor(e,t,n,r){this.adapter=e;this.manifestStore=t;this.toPersistedMessages=n;this.heartbeatLogIntervalMs=r}teamTaskQueueKey(e,t){return`${e}::${t}`}activeTeamTaskSessionId(e,t){return this.teamTaskSessionsByAgent.get(this.teamTaskQueueKey(e,t))?.at(-1)}buildSubsessionRow(e,t){let n=yi(e.metadata);return{sessionId:t.sessionId,source:e.source,pid:e.pid,startedAt:t.startedAt,endedAt:null,exitCode:null,status:"running",statusLock:0,interactive:!1,provider:e.provider,model:e.model,cwd:e.cwd,workspaceRoot:e.workspaceRoot,teamName:e.teamName??null,enableTools:e.enableTools,enableSpawn:e.enableSpawn,enableTeams:e.enableTeams,parentSessionId:t.parentSessionId,parentAgentId:t.parentAgentId,agentId:t.agentId,conversationId:t.conversationId??null,isSubagent:!0,prompt:t.prompt,metadata:Jp({metadata:Yn(void 0,{mode:t.mode,version:n?.version}),prompt:t.prompt}),hookPath:"",messagesPath:t.messagesPath,updatedAt:t.startedAt}}async queueSpawnRequest(e){if(e.hookName!=="tool_call"||e.parent_agent_id!==null)return;if(e.tool_call?.name!=="spawn_agent")return;let t=z6(e.sessionContext);if(!t)return;let n=cLe.safeParse(e.tool_call.input);await this.adapter.enqueueSpawnRequest({rootSessionId:t,parentAgentId:e.agent_id,task:n.success?n.data.task:void 0,systemPrompt:n.success?n.data.systemPrompt:void 0})}async upsertSubagentSession(e){let t=e.rootSessionId;if(!t)return;let n=await this.adapter.getSession(t);if(!n)return;let r=MI(t,e.agentId),o=await this.adapter.getSession(r),i=ft(),s=this.manifestStore.artifacts.subagentArtifactPaths(r,e.agentId,this.activeTeamTaskSessionId(t,e.parentAgentId)),a=e.prompt??o?.prompt??void 0;if(!a)a=await this.adapter.claimSpawnRequest(t,e.parentAgentId)??`Subagent run by ${e.parentAgentId}`;if(!o){let d=this.buildSubsessionRow(n,{sessionId:r,mode:"subagent",parentSessionId:t,parentAgentId:e.parentAgentId,agentId:e.agentId,conversationId:e.conversationId,prompt:a,startedAt:i,...s});return await this.adapter.upsertSession(d),this.manifestStore.initializeMessagesFile(d,s.messagesPath,i),r}return await this.adapter.updateSession({sessionId:r,setRunning:!0,parentSessionId:t,parentAgentId:e.parentAgentId,agentId:e.agentId,conversationId:e.conversationId,prompt:o.prompt??a??null,metadata:Jp({metadata:Yn(o.metadata,{mode:"subagent",version:yi(n.metadata)?.version}),prompt:o.prompt??a??null}),expectedStatusLock:o.statusLock}),r}async upsertSubagentSessionFromHook(e){if(!e.parent_agent_id)return;let t=z6(e.sessionContext);if(!t)return;if(e.hookName==="session_shutdown"){let n=MI(t,e.agent_id);return await this.adapter.getSession(n)?n:void 0}return await this.upsertSubagentSession({agentId:e.agent_id,parentAgentId:e.parent_agent_id,conversationId:e.taskId,rootSessionId:t})}async applySubagentStatus(e,t){await this.applySubagentStatusBySessionId(e,B3(t))}async applySubagentStatusBySessionId(e,t){let n=await this.adapter.getSession(e);if(!n)return;let r=Vt(t)?null:ft(),o=Vt(t)?null:t==="failed"?1:0;await this.adapter.updateSession({sessionId:e,status:t,endedAt:r,exitCode:o,expectedStatusLock:n.statusLock})}async applyStatusToRunningChildSessions(e,t){if(!e)return;let n=await this.adapter.listSessions({limit:2000,parentSessionId:e,status:"running"});for(let r of n)await this.applySubagentStatusBySessionId(r.sessionId,t)}async onTeamTaskStart(e,t,n){let r=await this.adapter.getSession(e);if(!r)return;let o=U3(e,t),i=ft(),{messagesPath:s}=this.manifestStore.artifacts.subagentArtifactPaths(o,t),a=this.buildSubsessionRow(r,{sessionId:o,mode:"team",parentSessionId:e,parentAgentId:"lead",agentId:t,prompt:n||`Team task for ${t}`,startedAt:i,messagesPath:s});await this.adapter.upsertSession(a),this.manifestStore.initializeMessagesFile(a,s,i);let d=this.teamTaskQueueKey(e,t),l=this.teamTaskSessionsByAgent.get(d)??[];l.push(o),this.teamTaskSessionsByAgent.set(d,l)}async onTeamTaskEnd(e,t,n,r,o,i){let s=this.teamTaskQueueKey(e,t),a=this.teamTaskSessionsByAgent.get(s);if(!a||a.length===0)return;let d=a.shift();if(a.length===0)this.teamTaskSessionsByAgent.delete(s);if(!d)return;let l=o?.messages??i,c=this.toPersistedMessages(l,o,i);if(c)await this.manifestStore.persistSessionMessages(d,c);await this.applySubagentStatusBySessionId(d,n),this.teamTaskLastHeartbeatBySession.delete(d),this.teamTaskLastProgressLineBySession.delete(d)}async onTeamTaskProgress(e,t,n,r){let o=this.teamTaskQueueKey(e,t),i=this.teamTaskSessionsByAgent.get(o)?.[0];if(!i)return;let s=n.trim();if(!s)return;let a=r?.kind??"progress";if(a==="heartbeat"){let l=Date.now(),c=this.teamTaskLastHeartbeatBySession.get(i)??0;if(l-c<this.heartbeatLogIntervalMs)return;this.teamTaskLastHeartbeatBySession.set(i,l)}let d=a==="heartbeat"?"[progress] heartbeat":a==="text"?`[progress] text: ${s}`:`[progress] ${s}`;if(this.teamTaskLastProgressLineBySession.get(i)===d)return;this.teamTaskLastProgressLineBySession.set(i,d)}async handleSubAgentStart(e,t){let n=await this.upsertSubagentSession({agentId:t.subAgentId,parentAgentId:t.parentAgentId,conversationId:t.conversationId,prompt:t.input.task,rootSessionId:e});if(!n)return;await this.applySubagentStatusBySessionId(n,"running")}async handleSubAgentEnd(e,t){let n=await this.upsertSubagentSession({agentId:t.subAgentId,parentAgentId:t.parentAgentId,conversationId:t.conversationId,prompt:t.input.task,rootSessionId:e});if(!n)return;let r=this.toPersistedMessages(t.agentResult?.messages,t.agentResult?.usage?t.agentResult:void 0);if(r)await this.manifestStore.persistSessionMessages(n,r);if(t.error||t.agentResult?.finishReason==="error"){await this.applySubagentStatusBySessionId(n,"failed");return}let o=t.result?.finishReason??t.agentResult?.finishReason??"completed";await this.applySubagentStatusBySessionId(n,o==="aborted"?"cancelled":"completed")}appendSubagentHookAudit(e){let n=(process.env.CLINE_HOOKS_LOG_PATH?.trim()||void 0)??dLe(lLe(),"hooks.jsonl");aLe(n,`${JSON.stringify({ts:ft(),...e})}
1311
+ `,"utf8")}}import{formatUserInputBlock as $Le}from"@cerebriline/shared";import{probeServerHealth as uLe,serverRoot as hLe}from"@cerebriline/llms";function pLe(e,t,n){if(typeof n!=="number"||!Number.isFinite(n))return e;let r=e.providerConfig??t;return{...e,providerConfig:{...r??{},agentWindow:{sharePercent:n}}}}var K6="polykv-lead",G6="Model (PolyKV)",V6="primary",mLe=new Set(["opencoti","xollama"]);function $C(e){let t=(e.agentNodes??[]).filter((r)=>!r.polykvLead);if(e.polykvAgentsPriorityZero!==!0||!mLe.has(e.providerId.trim().toLowerCase()))return[...t];let n=t.length>0?t:[{id:V6,priority:sc+1,capacity:typeof e.overflowCapacity==="number"&&e.overflowCapacity>0?e.overflowCapacity:Number.POSITIVE_INFINITY,pacedAdmission:!0,label:"Node1",connection:{}}];return[{id:K6,priority:sc,capacity:wA,label:G6,connection:{thinking:void 0,reasoningEffort:void 0,thinkingBudgetTokens:void 0,maxTokensPerTurn:void 0,temperature:void 0,...e.lead,providerId:e.providerId,modelId:e.modelId},polykvLead:!0},...n]}function FC(e){if(e.nodes.length===0)return;let t=TA(e.nodes.map((i)=>vp({id:i.id,priority:i.polykvLead?sc:Math.max(i.priority,sc+1),capacity:i.capacity,...i.pacedAdmission?{pacedAdmission:!0}:{}})),{probe:async(i)=>{let s=(n.get(i)??e.base).getConnectionConfig(),a=hLe(s.baseUrl);return a?await uLe(a,{...s.headers?{headers:s.headers}:{}}):!1}}),n=new Map;for(let i of e.nodes){let s=e.base.getRuntimeConfig(),a=pLe(i.connection,s.providerConfig,i.windowShare);n.set(i.id,pi({...s,...a,...i.polykvLead&&s.sessionId?{polykvLeadOwner:s.sessionId}:{}},Object.keys(a)))}let r=new Map(e.nodes.flatMap((i)=>i.label?[[i.id,i.label]]:[])),o=(i)=>{let s=n.get(i.nodeId)??e.base,a=r.get(i.nodeId);return{nodeId:i.nodeId,...a?{nodeLabel:a}:{},configProvider:s,run:async(d)=>await d(),release:()=>i.release(),admitted:()=>i.admitted(),refused:(d)=>i.refused(d),markUnreachable:(d)=>t.markUnreachable(i.nodeId,d)}};return{place:async(i,s)=>o(await t.acquire(i,s)),base:e.base,occupancy:()=>t.occupancy(),hasRoomElsewhere:(i)=>t.hasRoomElsewhere(i),get waiting(){return t.waiting},describe:()=>{let i=new Map(t.nodeStates().map((s)=>[s.nodeId,s]));return e.nodes.map((s)=>{let a=(n.get(s.id)??e.base).getConnectionConfig(),d=i.get(s.id);return{nodeId:s.id,...s.label?{label:s.label}:{},priority:s.priority,providerId:a.providerId,modelId:a.modelId,...a.baseUrl?{baseUrl:a.baseUrl}:{},...a.providerConfig?{providerConfig:a.providerConfig}:{},capacity:d?.capacity??s.capacity,running:d?.running??0,...d?.downUntil?{downUntil:d.downUntil}:{},...d?.heldUntil?{heldUntil:d.heldUntil}:{}}})}}}import{existsSync as fLe,readdirSync as gLe,readFileSync as yLe}from"node:fs";import{basename as Y6,extname as wLe,join as bLe}from"node:path";import{stripUtf8Bom as vLe}from"@cerebriline/shared";import{resolveAgentConfigSearchPaths as kLe}from"@cerebriline/shared/storage";import J6 from"yaml";import{z as Tn}from"zod";var Q6=Tn.object({name:Tn.string().trim().min(1),description:Tn.string().trim().min(1),tools:Tn.union([Tn.string(),Tn.array(Tn.string())]).optional(),skills:Tn.union([Tn.string(),Tn.array(Tn.string())]).optional(),providerId:Tn.string().trim().min(1).optional(),modelId:Tn.string().trim().min(1).optional(),profile:Tn.string().trim().min(1).optional(),maxIterations:Tn.number().int().positive().optional()});function TLe(e){e=vLe(e);let t=e.match(/^(---)[^\S\r\n]*(?:\r?\n|$)/);if(!t)throw Error("Missing YAML frontmatter block in agent config file.");let n=t[0].length,r=/^---[^\S\r\n]*(?:\r?\n|$)/gm;r.lastIndex=n;let o,i=Array.from(e.matchAll(r)).filter((s)=>s.index>=n);for(let s of i){let a=s.index,d=e.slice(n,a);try{let l=J6.parse(d);if(!l||typeof l!=="object"||Array.isArray(l))continue;Q6.parse(l);let c=e.slice(a+s[0].length);o={frontmatter:d,body:c}}catch{}}if(o)return o;throw Error("Missing closing YAML frontmatter delimiter in agent config file.")}function X6(e){if(e===void 0)return;let t=Array.isArray(e)?e:e.split(",");return Array.from(new Set(t.map((n)=>n.trim()).filter((n)=>n.length>0)))}function SLe(e){return e.trim().toLowerCase()}function xLe(e){let t=wLe(e).toLowerCase();return t===".md"||t===".markdown"||t===".yml"||t===".yaml"}function Z6(e,t={}){let{frontmatter:n,body:r}=TLe(e),o=J6.parse(n);if(!o||typeof o!=="object"||Array.isArray(o))throw Error("Agent config frontmatter must be a YAML mapping.");let i=Q6.parse(o),s=r.trim();if(!s)throw Error("Missing system prompt body in agent config file.");return{name:i.name,description:i.description,tools:X6(i.tools),skills:X6(i.skills),providerId:i.providerId,modelId:i.modelId,profile:i.profile,maxIterations:i.maxIterations,systemPrompt:s,path:t.path}}function UC(e){let t=e.searchPaths??kLe(e.workspaceRoot),n=new Map,r=[];for(let i of t.filter(Boolean)){if(!fLe(i))continue;let s;try{s=gLe(i,{withFileTypes:!0})}catch(a){r.push({path:i,error:a instanceof Error?a:Error(String(a))});continue}for(let a of s){if(!a.isFile()||!xLe(a.name))continue;let d=bLe(i,a.name);try{let l=yLe(d,"utf8"),c=Z6(l,{path:d}),u=SLe(c.name);if(!n.has(u))n.set(u,c)}catch(l){r.push({path:d,error:l instanceof Error?l:Error(String(l))})}}}return{configs:Array.from(n.values()).sort((i,s)=>(i.path?Y6(i.path):i.name).localeCompare(s.path?Y6(s.path):s.name)),errors:r,searchPaths:t.filter(Boolean)}}import{TeamMessageType as Oe}from"@cerebriline/shared";function Ti(e){let t=e.type;switch(t){case Oe.AgentEvent:return!1;case Oe.RunProgress:return t8(e);case Oe.TaskStart:case Oe.TaskEnd:case Oe.TeammateSpawned:case Oe.TeammateShutdown:case Oe.TeamTaskUpdated:case Oe.TeamMessage:case Oe.TeamMissionLog:case Oe.RunQueued:case Oe.RunStarted:case Oe.RunCompleted:case Oe.RunFailed:case Oe.RunCancelled:case Oe.RunInterrupted:case Oe.OutcomeCreated:case Oe.OutcomeFragmentAttached:case Oe.OutcomeFragmentReviewed:case Oe.OutcomeFinalized:case Oe.TeamCleaned:return!0;default:return Boolean(t)}}function WC(e){switch(e.type){case Oe.TeammateSpawned:case Oe.TeammateShutdown:case Oe.RunCompleted:case Oe.RunFailed:case Oe.RunCancelled:case Oe.RunInterrupted:case Oe.TeamCleaned:return!0;case Oe.RunProgress:return t8(e);default:return!1}}function t8(e){return e.type===Oe.RunProgress&&e.run.status==="queued"}var HC=Number.POSITIVE_INFINITY;function e8(e){return typeof e==="object"&&e!==null}function Sv(e,t=0){return typeof e==="number"&&Number.isFinite(e)?e:t}function BC(e){return typeof e==="number"&&Number.isFinite(e)?e:void 0}function _Le(e){return e.length>HC?`${e.slice(0,HC-3)}...`:e}function Lo(e){if(!e8(e))return;let t=e8(e.usage)?e.usage:{},n=e.finishReason;return{text:_Le(typeof e.text==="string"?e.text:""),iterations:Sv(e.iterations),finishReason:typeof n==="string"?n:"completed",durationMs:Sv(e.durationMs),usage:{inputTokens:Sv(t.inputTokens),outputTokens:Sv(t.outputTokens),cacheReadTokens:BC(t.cacheReadTokens),cacheWriteTokens:BC(t.cacheWriteTokens),totalCost:BC(t.totalCost)}}}function ELe(e){if(e.result===void 0)return e;return{...e,result:Lo(e.result)}}function ys(e){switch(e.type){case Oe.TaskEnd:{let{messages:t,result:n,error:r,...o}=e;return{...o,result:Lo(n),error:r?{message:r.message}:void 0}}case Oe.RunQueued:case Oe.RunStarted:case Oe.RunCompleted:case Oe.RunFailed:case Oe.RunCancelled:case Oe.RunInterrupted:return{...e,run:ELe(e.run)};default:return e}}function No(){return new Date().toISOString()}function n8(e,t){if(t<=0)return 0;return Math.round(e/t*100)}function ALe(e,t){let n=new Set;for(let o of t)if(o.status==="reviewed")n.add(`${o.outcomeId}:${o.section}`);let r=new Set;for(let o of e){if(o.status==="finalized")continue;for(let i of o.requiredSections)if(!n.has(`${o.id}:${i}`))r.add(`${o.id}:${i}`)}return[...r].sort((o,i)=>o.localeCompare(i))}function jC(e,t){let n={idle:0,running:0,stopped:0},r={pending:0,in_progress:0,blocked:0,completed:0},o={queued:0,running:0,completed:0,failed:0,cancelled:0,interrupted:0},i={draft:0,in_review:0,finalized:0},s={draft:0,reviewed:0,rejected:0},a=0,d=0;for(let g of t.members)if(n[g.status]+=1,g.role==="lead")a+=1;else d+=1;let l=[],c=[],u=t.tasks.filter((g)=>g.status==="completed").length,h=new Map(t.tasks.map((g)=>[g.id,g]));for(let g of t.tasks){if(r[g.status]+=1,g.status==="blocked"){l.push(g.id);continue}if(g.status!=="pending")continue;if(g.dependsOn.every((w)=>h.get(w)?.status==="completed"))c.push(g.id)}let p=[],m,f=0;for(let g of t.runs){if(o[g.status]+=1,g.status==="queued"||g.status==="running")p.push(g.id);let y=g.startedAt.getTime();if(y>=f)f=y,m=g.id}for(let g of t.outcomes)i[g.status]+=1;for(let g of t.outcomeFragments)s[g.status]+=1;return{teamName:e,updatedAt:No(),members:{total:t.members.length,byStatus:n,leadCount:a,teammateCount:d},tasks:{total:t.tasks.length,byStatus:r,blockedTaskIds:l,readyTaskIds:c,completionPct:n8(u,t.tasks.length)},runs:{total:t.runs.length,byStatus:o,activeRunIds:p,latestRunId:m},outcomes:{total:t.outcomes.length,byStatus:i,finalizedPct:n8(i.finalized,t.outcomes.length),missingRequiredSections:ALe(t.outcomes,t.outcomeFragments)},fragments:{total:t.outcomeFragments.length,byStatus:s}}}function qC(e){let{event:t}=e;switch(t.type){case"team_task_updated":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No(),taskId:t.task.id,agentId:t.task.assignee??t.task.createdBy};case"run_queued":case"run_started":case"run_completed":case"run_failed":case"run_cancelled":case"run_interrupted":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No(),runId:t.run.id,taskId:t.run.taskId,agentId:t.run.agentId,message:t.run.error};case"run_progress":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No(),runId:t.run.id,taskId:t.run.taskId,agentId:t.run.agentId,message:t.message};case"outcome_created":case"outcome_finalized":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No(),outcomeId:t.outcome.id};case"outcome_fragment_attached":case"outcome_fragment_reviewed":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No(),outcomeId:t.fragment.outcomeId,fragmentId:t.fragment.id,agentId:t.fragment.sourceAgentId};case"team_message":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No(),taskId:t.message.taskId,agentId:t.message.fromAgentId,message:t.message.subject};case"team_mission_log":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No(),taskId:t.entry.taskId,agentId:t.entry.agentId,message:t.entry.summary};case"teammate_spawned":case"teammate_shutdown":case"task_start":case"task_end":case"agent_event":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No(),agentId:t.agentId}}return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:No()}}import{clearPolykvGrantedWindow as r8,releasePolykvAgent as zC}from"@cerebriline/llms";import{sanitizeFileName as RLe,TeamMessageType as xe}from"@cerebriline/shared";import{nanoid as ILe}from"nanoid";import{TeamMessageType as kat}from"@cerebriline/shared";function xv(){return{reset:!1,tasks:new Set,mailbox:new Set,missionLog:new Set,runs:new Set,outcomes:new Set,outcomeFragments:new Set}}function vm(e){if(typeof DOMException<"u"&&e instanceof DOMException&&e.name==="AbortError")return!0;if(!(e instanceof Error))return!1;return e.name==="AbortError"||e.message.toLowerCase().includes("aborted")}function KC(e){let t=Error(e);return t.name="AbortError",t}function CLe(e){return`[The lead requeued you${e?` (${e})`:""}: your engine session was given back and booked again. Your work so far is above. Carry on with your task from where you stopped.]`}function GC(e){return`Teammate "${e}" was shut down and takes no more tasks. To give it work, spawn it again with team_spawn_teammate under the same agentId.`}function o8(e,t){return e?.abortRequested===!0||e?.status==="stopped"&&vm(t)}function PLe(e){if(e.finishReason==="aborted")return"cancelled";if(e.finishReason==="error"||e.finishReason==="max_iterations")return"failed";return"completed"}var MLe=600000,i8="recovered_queued";function OLe(e){return`This is an automatic recovery of interrupted team run ${e.id}. The previous process stopped before completion. Continue the task safely, inspect the current workspace state before making changes, and avoid duplicating completed work.
1312
1312
 
1313
1313
  ${e.message}`}class _v{teamId;teamName;sessionId;onTeamEvent;onStateDirty;members=new Map;tasks=new Map;missionLog=[];mailbox=[];missionStepCounter=0;taskCounter=0;messageCounter=0;missionCounter=0;runCounter=0;outcomeCounter=0;outcomeFragmentCounter=0;runs=new Map;dirty=xv();runQueue=[];queuedRunDispatchTimer;outcomes=new Map;outcomeFragments=new Map;missionLogIntervalSteps;missionLogIntervalMs;maxConcurrentRuns;teammateWorkspaces;acceptTeammateConnectionUpdates;constructor(e){this.teamName=e.teamName,this.sessionId=e.sessionId?.trim()||void 0,this.teammateWorkspaces=e.teammateWorkspaces,this.acceptTeammateConnectionUpdates=e.acceptTeammateConnectionUpdates,this.teamId=`t_${RLe(ILe(10))}`,this.onTeamEvent=e.onTeamEvent,this.onStateDirty=e.onStateDirty,this.missionLogIntervalSteps=Math.max(1,e.missionLogIntervalSteps??3),this.missionLogIntervalMs=Math.max(1000,e.missionLogIntervalMs??120000),this.maxConcurrentRuns=Math.max(1,e.maxConcurrentRuns??2);let t=e.leadAgentId??"lead";this.members.set(t,{agentId:t,role:"lead",status:"idle",runningCount:0,lastMissionStep:0,lastMissionAt:Date.now()})}getTeamId(){return this.teamId}getTeamName(){return this.teamName}getMemberRole(e){return this.members.get(e)?.role}getMemberIds(){return Array.from(this.members.keys())}getTeammateIds(){return Array.from(this.members.values()).filter((e)=>e.role==="teammate").map((e)=>e.agentId)}getTask(e){return this.tasks.get(e)}listTasks(){return Array.from(this.tasks.values())}listTaskItems(e){return Array.from(this.tasks.values()).map((t)=>{let n=this.getUnresolvedDependencies(t);return{...t,blockedBy:n,isReady:t.status==="pending"&&!t.assignee&&n.length===0}}).filter((t)=>{if(e?.status&&t.status!==e.status)return!1;if(e?.assignee&&t.assignee!==e.assignee)return!1;return!0})}listMissionLog(e){if(!e||e<=0)return[...this.missionLog];return this.missionLog.slice(Math.max(0,this.missionLog.length-e))}listMailbox(e,t){let n=t?.unreadOnly??!0,r=t?.markRead??!0,o=t?.limit,i=this.mailbox.filter((a)=>a.toAgentId===e&&(!n||!a.readAt)),s=typeof o==="number"&&o>0?i.slice(Math.max(0,i.length-o)):i;if(r){let a=new Date,d=!1;for(let l of s)if(!l.readAt)l.readAt=a,this.dirty.mailbox.add(l.id),d=!0;if(d)this.notifyStateDirty()}return s.map((a)=>({...a}))}getSnapshot(){let e={pending:0,in_progress:0,blocked:0,completed:0};for(let n of this.tasks.values())e[n.status]++;let t={draft:0,in_review:0,finalized:0};for(let n of this.outcomes.values())t[n.status]++;return{teamId:this.teamId,teamName:this.teamName,members:Array.from(this.members.values()).map((n)=>({agentId:n.agentId,role:n.role,description:n.description,status:n.status})),taskCounts:e,unreadMessages:this.mailbox.filter((n)=>!n.readAt).length,missionLogEntries:this.missionLog.length,activeRuns:Array.from(this.runs.values()).filter((n)=>n.status==="running").length,queuedRuns:Array.from(this.runs.values()).filter((n)=>n.status==="queued").length,outcomeCounts:t}}exportState(){return{teamId:this.teamId,teamName:this.teamName,members:Array.from(this.members.values()).map((e)=>({agentId:e.agentId,role:e.role,description:e.description,status:e.status,...LLe(e),...e.role==="teammate"&&e.sampling?{sampling:e.sampling}:{},...e.control?.id?{cancelId:e.control.id}:{}})),tasks:Array.from(this.tasks.values()).map((e)=>({...e})),mailbox:this.mailbox.map((e)=>({...e})),missionLog:this.missionLog.map((e)=>({...e})),runs:Array.from(this.runs.values()).map((e)=>({...e,...e.result?{result:{...e.result,messages:[],toolCalls:[]}}:{},...e.status==="running"?bm(this.members.get(e.agentId)):{}})),outcomes:Array.from(this.outcomes.values()).map((e)=>({...e})),outcomeFragments:Array.from(this.outcomeFragments.values()).map((e)=>({...e}))}}hydrateState(e){this.clearQueuedRunDispatchTimer(),this.dirty=xv(),this.tasks.clear();for(let n of e.tasks)this.tasks.set(n.id,{...n});this.mailbox.length=0,this.mailbox.push(...e.mailbox.map((n)=>({...n}))),this.missionLog.length=0,this.missionLog.push(...e.missionLog.map((n)=>({...n}))),this.runs.clear();for(let n of e.runs??[])this.runs.set(n.id,{...n,result:Lo(n.result)});this.runQueue.length=0,this.runQueue.push(...Array.from(this.runs.values()).filter((n)=>n.status==="queued").map((n)=>n.id)),this.outcomes.clear();for(let n of e.outcomes??[])this.outcomes.set(n.id,{...n});this.outcomeFragments.clear();for(let n of e.outcomeFragments??[])this.outcomeFragments.set(n.id,{...n});let t=Array.from(this.members.values()).filter((n)=>n.role==="lead");this.members.clear();for(let n of t)this.members.set(n.agentId,{...n,status:"idle",runningCount:0,lastMissionStep:this.missionStepCounter,lastMissionAt:Date.now()});for(let n of e.members){if(n.role!=="teammate")continue;this.members.set(n.agentId,{agentId:n.agentId,role:"teammate",description:n.description,status:"stopped",...n.activity?{activity:n.activity}:{},...n.taskActivity?{taskActivity:n.taskActivity}:{},...n.sampling?{sampling:n.sampling}:{},agent:void 0,runningCount:0,lastMissionStep:this.missionStepCounter,lastMissionAt:Date.now()})}this.taskCounter=Math.max(this.taskCounter,Yc(e.tasks.map((n)=>n.id),"task_")),this.messageCounter=Math.max(this.messageCounter,Yc(e.mailbox.map((n)=>n.id),"msg_")),this.missionCounter=Math.max(this.missionCounter,Yc(e.missionLog.map((n)=>n.id),"log_")),this.runCounter=Math.max(this.runCounter,Yc((e.runs??[]).map((n)=>n.id),"run_")),this.outcomeCounter=Math.max(this.outcomeCounter,Yc((e.outcomes??[]).map((n)=>n.id),"out_")),this.outcomeFragmentCounter=Math.max(this.outcomeFragmentCounter,Yc((e.outcomeFragments??[]).map((n)=>n.id),"frag_"))}isTeammateActive(e){let t=this.members.get(e);return!!t&&t.role==="teammate"&&!!t.agent&&t.status!=="stopped"}requireTaskableTeammate(e){let t=this.members.get(e);if(!t||t.role!=="teammate"||!t.agent)throw Error(`Teammate "${e}" was not found`);if(t.status==="stopped")throw Error(GC(e));return t}assertCanSpawnTeammate(e){let t=this.members.get(e);if(t&&t.role!=="teammate")throw Error(`Team member "${e}" already exists and is not a teammate`);if(t&&t.runningCount>0)throw Error(`Teammate "${e}" is currently running and cannot be respawned`)}spawnTeammate({agentId:e,config:t,sampling:n}){this.assertCanSpawnTeammate(e);let r=this.members.get(e);if(r&&r.engineSessionId!==t.engineSessionId)this.releaseEngineSession(r);let o={...t,apiTimeoutMs:MLe,consumePendingUserMessage:()=>{let a=this.members.get(e),d=a?.control?.takeMessage();if(d!==void 0)return d;if(!a||!a.pendingSteerMessage)return;let l=a.pendingSteerMessage;return a.pendingSteerMessage=void 0,l},onEvent:(a)=>{t.onEvent?.(a);let d=this.members.get(e),l=d?.activityCounter?.observe(a)===!0,c=d?.currentTaskCounter?.observe(a)===!0;this.emitEvent({type:xe.AgentEvent,agentId:e,event:a,...l||c?{activityChanged:!0}:{}}),this.trackMeaningfulEvent(e,a)}},i=new Wa(o);if(o.onEvent)i.subscribeEvents(o.onEvent);let s={agentId:e,role:"teammate",description:t.role,status:"idle",agent:i,runningCount:0,lastMissionStep:0,lastMissionAt:Date.now(),...t.engineSessionId?{engineSessionId:t.engineSessionId}:{},...n?{sampling:n}:{},activityCounter:db(r?.activityCounter?.snapshot()??r?.activity),...r?.taskActivity||r?.currentTaskCounter?{taskActivity:r.currentTaskCounter?.snapshot()??r.taskActivity}:{}};return this.members.set(e,s),this.emitEvent({type:xe.TeammateSpawned,agentId:e,role:t.role,teammate:{rolePrompt:t.systemPrompt,modelId:t.modelId,maxIterations:t.maxIterations,...n?.temperature!==void 0?{temperature:n.temperature}:{},...n?.seed!==void 0?{seed:n.seed}:{},...n?.seedRandom?{seedRandom:!0}:{},...n?.temperatureBase!==void 0?{temperatureBase:n.temperatureBase}:{},...n?.temperatureRange!==void 0?{temperatureRange:n.temperatureRange}:{},runtimeAgentId:i.getAgentId(),conversationId:i.getConversationId(),parentAgentId:null}}),{agentId:s.agentId,role:s.role,description:s.description,status:s.status}}shutdownTeammate(e,t){let n=this.members.get(e);if(!n||n.role!=="teammate")throw Error(`Teammate "${e}" was not found`);let r=`Teammate "${e}" was shut down${t?` (${t})`:""}`;for(let o of this.runs.values())if(o.agentId===e&&(o.status==="queued"||o.status==="running"))this.cancelRun(o.id,r);if(this.abortTeammateRun(e,r),n.status="stopped",n.runningCount<=0)this.releaseWorkspace(e),this.releaseEngineSession(n);this.emitEvent({type:xe.TeammateShutdown,agentId:e,reason:t})}releaseWorkspace(e){this.teammateWorkspaces?.release(e).catch(()=>{})}releaseEngineSession(e){let t=e.engineSessionId;if(!t)return;e.engineSessionId=void 0,zC(t).catch(()=>{return})}releaseEngineSessionBetweenTasks(e){let t=e.engineSessionId;if(!t)return;e.pendingEngineRelease=zC(t).catch(()=>{return})}async rebookEngineSession(e,t){let n=e.engineSessionId;if(n){if(await zC(n).catch(()=>{return}),t)r8(n)}if(e.status==="stopped")throw KC(GC(e.agentId))}async runTeammateSegment(e,t,n,r){let o=n.signal,i=()=>{let s=n.id?pt.stoppedBy(n.id):void 0,a=n.id!==void 0&&pt.wrappingUp(n.id);if(s&&!e.abortRequested&&!a)e.abortRequested=!0,e.abortReason=s==="lead"?"Stopped by the lead.":"Stopped by the user.";try{t.abort(o?.reason)}catch(d){if(!vm(d))throw d}};if(o?.aborted)throw i(),KC(e.abortReason??"The teammate's task was stopped.");o?.addEventListener("abort",i,{once:!0});try{if(n.track(t),"carry"in r){if(r.carry.wrapUp){e.wrappedUpBy=r.carry.wrapUp;let s=t.getMaxIterations();t.setMaxIterations(1);try{let a=await t.continue(HA(r.carry.wrapUp)),d=a.text?.trim();return d?{...a,text:`${WA(r.carry.wrapUp)}
1314
1314
 
@@ -1518,7 +1518,7 @@ When the expert delivers, you have the pen back and the task is yours again.`;fu
1518
1518
 
1519
1519
  The expert has the pen until it delivers. Changing a file now would land on top of work in progress, and the expert would go on editing the version it thinks is there. Read, grep, run the check, read the revisions the notes name — all of that is open to you. If what you were about to change cannot wait, message the expert and say so.`}var CDe=`
1520
1520
 
1521
- [You are standing down while the expert works. Check that this did not change a file — if it did, say so to the expert now, because it is editing from what it believes is on disk.]`;function yV(e,t){return e.map((n)=>{let r=ADe.includes(n.name),o=RDe.includes(n.name);if(!r&&!o)return n;let i=n;return{...n,execute:async(s,a)=>{if(!t.engaged)return i.execute?.(s,a);if(r)return IDe(n.name);let d=await i.execute?.(s,a);return typeof d==="string"?d+CDe:d}}})}var Xlt=[le.READ_FILES,le.SEARCH_CODEBASE,le.GREP,le.AWK,$r];import{createTool as PDe}from"@cerebriline/shared";var MDe="wait_for_expert",ODe=`Wait for the expert, and be told what it has been doing.
1521
+ [You are standing down while the expert works. Check that this did not change a file — if it did, say so to the expert now, because it is editing from what it believes is on disk.]`;function yV(e,t){return e.map((n)=>{let r=ADe.includes(n.name),o=RDe.includes(n.name);if(!r&&!o)return n;let i=n;return{...n,execute:async(s,a)=>{if(!t.engaged)return i.execute?.(s,a);if(r)return IDe(n.name);let d=await i.execute?.(s,a);return typeof d==="string"?d+CDe:d}}})}var Zlt=[le.READ_FILES,le.SEARCH_CODEBASE,le.GREP,le.AWK,$r];import{createTool as PDe}from"@cerebriline/shared";var MDe="wait_for_expert",ODe=`Wait for the expert, and be told what it has been doing.
1522
1522
 
1523
1523
  While the expert works you are standing down from changes, and this is how you follow it. The call returns when there is something for you: a batch of notes covering everything the expert has done since you last looked, or its delivery once it is finished. It costs you one turn each time, which is why the notes arrive in batches rather than one per action.
1524
1524
 
@@ -1564,7 +1564,7 @@ ${e.splice(0,e.length).join(`
1564
1564
 
1565
1565
  `).trimEnd()}
1566
1566
  `}function IV(){let e=ws(),t,n=0;return{source:{get pending(){return t},get transaction(){return n},get log(){return e}},open(o,i){e=ws(),t=o,n=i},revisions(o){return e.revisions(o)},tracked(){return e.tracked()},heads(){let o=new Map;for(let i of e.tracked()){let s=e.revisions(i),a=s[s.length-1];if(a)o.set(i,a.index)}return o},purge(){e.reset(),e=ws(),t=void 0,n=0}}}function CV(e,t){let n,r=()=>({subAgentId:e.getAgentId(),conversationId:e.getConversationId(),parentAgentId:"lead",input:{name:"expert",task:n??""}}),o=async(i)=>{try{await i()}catch{}};return{async run(i){if(n===void 0)n=i,await o(()=>t.start(r()));try{let s=await e.run(i);return await o(()=>t.end({...r(),agentResult:s})),s}catch(s){throw await o(()=>t.end({...r(),agentResult:{messages:e.getMessages()},error:s instanceof Error?s:Error(String(s))})),s}},...e.shutdown?{shutdown:(i)=>e.shutdown?.(i)}:{},...e.abort?{abort:(i)=>e.abort?.(i)}:{}}}function jDe(e){return[`${e.guard} was about to end this run.${e.diagnosis?` ${e.diagnosis}`:""}`,"",`Instead you get one turn, and one thing to do with it: call \`${Lr}\` and hand this to the expert. Write the brief properly — what you were trying, what you ruled out, and what a correct result looks like — because that is all it gets. You have ${e.remaining} escalation${e.remaining===1?"":"s"} left.`,"","If this turn goes anywhere else, the run ends at the end of it. That is not a threat, it is the guard that was already firing: nothing here has been taken off the table, it has only been held open for one turn."].join(`
1567
- `)}function qDe(e){return`${e} ended this run. It stood down for one turn so the task could be handed to the expert, and that turn was spent on something else.`}function PV(e){let t=!1,n,r="",o=0;return{get spent(){return t},decide(i){if(t)return;let s=e.remaining();if(s<=0)return;return t=!0,n=o,r=i.guard,e.logger?.log?.(`[Escalation] ${i.guard} stood down for one turn; the expert can be handed the task.`),{action:"continue",guidance:jDe({guard:i.guard,...i.diagnosis?{diagnosis:i.diagnosis}:{},remaining:s})}},observe(i){switch(i.type){case"iteration_start":o=i.iteration;return;case"content_start":if(i.contentType==="tool"&&i.toolName===Lr)n=void 0;return;case"iteration_end":{if(n===void 0||i.iteration<=n)return;let s=r;n=void 0,e.stop(qDe(s));return}default:return}}}}import{tmpdir as PUe}from"node:os";import{join as MUe}from"node:path";import{DEFAULT_MAX_NO_TOOL_CALL_NUDGES as OUe,setToolIntentGuardEnabled as LUe}from"@cerebriline/agents";import{supportsModelTool as hY}from"@cerebriline/llms";import{hasRuntimeConfigExtension as NUe,resolveMcpTimeoutSeconds as DUe}from"@cerebriline/shared";import{nanoid as $Ue}from"nanoid";import{isPromptTemplateCompactionId as _ct,splitFrontmatter as Ect,validatePromptTemplate as Act}from"@cerebriline/shared";import Ict from"yaml";import{existsSync as pP}from"node:fs";import{dirname as fP,isAbsolute as zDe,join as $v,relative as KDe,resolve as MV}from"node:path";import{fileURLToPath as GDe}from"node:url";var gP="bundled-skills";function VDe(){try{return fP(GDe(import.meta.url))}catch{return"."}}var mP;function Fv(e=VDe()){if(mP?.from===e)return mP.directory;let t,n=[$v(e,gP),$v(fP(process.execPath),gP)].find((r)=>pP(r));if(n)t=n;else{let r=e;for(let o=0;o<7;o++){let i=$v(r,"assets","skills");if(pP(i)&&pP($v(r,"package.json"))){t=i;break}let s=fP(r);if(s===r)break;r=s}}return mP={from:e,directory:t},t}function yP(e,t=Fv()){if(!t)return!1;let n=KDe(MV(t),MV(e));return n!==""&&!n.startsWith("..")&&!zDe(n)}function OV(e){return e.trim().toLowerCase()}function LV(e,t){return mn().bundledSkills?.[OV(e)]?.enabled??t}function Uv(e,t){let n=mn();Ds({...n,bundledSkills:{...n.bundledSkills,[OV(e)]:{enabled:t}}})}import{PROMPT_TEMPLATE_COMPACTION_IDS as Hct}from"@cerebriline/shared";import{applyPromptTemplateToTools as Vct}from"@cerebriline/shared";import{DEFAULT_PROMPT_TEMPLATE_NAME as iut,PROMPT_TEMPLATE_DEFAULT_MARKER as sut,promptTemplateMatchBlocks as aut,resolvePromptTemplate as dut}from"@cerebriline/shared";import{primeDeclaredNumCtx as fut,readDeclaredFamily as gut}from"@cerebriline/llms";import{isOllamaNativeProvider as wut,renderPromptTemplate as but}from"@cerebriline/shared";import{createTool as Cut}from"@cerebriline/shared";import{createTool as _ut}from"@cerebriline/shared";import{createTool as nht}from"@cerebriline/shared";import{createTool as Nut}from"@cerebriline/shared";import{createTool as Hut}from"@cerebriline/shared";import{createTool as uht}from"@cerebriline/shared";import{createTool as ght}from"@cerebriline/shared";import{createTool as bht}from"@cerebriline/shared";import{createHash as n$e}from"node:crypto";import{watch as r$e}from"node:fs";import{readdir as o$e,readFile as i$e}from"node:fs/promises";import{isAbsolute as s$e,join as a$e,relative as d$e,resolve as FV}from"node:path";function l$e(e){return n$e("sha1").update(e).digest("hex")}function HV(e){return Boolean(e&&typeof e==="object"&&"code"in e)}function UV(e){return HV(e)&&e.code==="ENOENT"}function BV(e){return HV(e)&&(e.code==="EACCES"||e.code==="EPERM")}class Hv{definitions;debounceMs;emitParseErrors;listeners=new Set;recordsByType=new Map;watchersByDirectory=new Map;baseTypesByDirectory=new Map;watchedTypesByDirectory=new Map;discoveredDirectoriesByType=new Map;unwatchedRoots=new Set;definitionsByType=new Map;pendingTypes=new Set;flushTimer;refreshQueue=Promise.resolve();started=!1;constructor(e,t){if(e.length===0)throw Error("UnifiedConfigFileWatcher requires at least one definition.");this.definitions=e,this.debounceMs=t?.debounceMs??75,this.emitParseErrors=t?.emitParseErrors??!1;for(let n of e){if(this.definitionsByType.has(n.type))throw Error(`Duplicate unified config definition type '${n.type}'.`);this.definitionsByType.set(n.type,n),this.recordsByType.set(n.type,new Map),this.discoveredDirectoriesByType.set(n.type,new Set);for(let r of n.unwatchedDirectories??[])this.unwatchedRoots.add(FV(r));for(let r of n.directories){let o=this.baseTypesByDirectory.get(r);if(o)o.add(n.type);else this.baseTypesByDirectory.set(r,new Set([n.type]))}}}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}async start(){if(this.started)return;this.started=!0,await this.refreshAll(),this.startDirectoryWatchers()}stop(){if(this.started=!1,this.flushTimer)clearTimeout(this.flushTimer),this.flushTimer=void 0;this.pendingTypes.clear();for(let e of this.watchersByDirectory.values())e.close();this.watchersByDirectory.clear(),this.watchedTypesByDirectory=new Map}async refreshAll(){await this.enqueueRefresh(async()=>{for(let e of this.definitions)await this.refreshTypeInternal(e)})}async refreshType(e){let t=this.definitionsByType.get(e);if(!t)throw Error(`Unknown unified config type '${e}'.`);await this.enqueueRefresh(async()=>{await this.refreshTypeInternal(t)})}getSnapshot(e){let t=this.recordsByType.get(e);return new Map([...t?.entries()??[]].map(([n,r])=>[n,{...r}]))}getAllSnapshots(){let e=new Map;for(let[t,n]of this.recordsByType.entries())e.set(t,new Map([...n.entries()].map(([r,o])=>[r,{...o}])));return e}emit(e){for(let t of this.listeners)t(e)}enqueueRefresh(e){return this.refreshQueue=this.refreshQueue.then(e,e),this.refreshQueue}startDirectoryWatchers(){this.syncDirectoryWatchers()}syncDirectoryWatchers(){let e=this.buildDesiredTypesByDirectory();for(let[t,n]of this.watchersByDirectory.entries()){if(e.has(t))continue;n.close(),this.watchersByDirectory.delete(t)}this.watchedTypesByDirectory=e;for(let t of e.keys()){if(this.watchersByDirectory.has(t))continue;try{let n=r$e(t,()=>{let r=this.watchedTypesByDirectory.get(t);if(!r)return;for(let o of r)this.pendingTypes.add(o);this.scheduleFlush()});this.watchersByDirectory.set(t,n),n.on("error",(r)=>{let o=this.watchedTypesByDirectory.get(t);if(!o)return;for(let i of o)this.emit({kind:"error",type:i,error:r,filePath:t})})}catch(n){if(!UV(n)&&!BV(n)){let r=e.get(t);if(!r)continue;for(let o of r)this.emit({kind:"error",type:o,error:n,filePath:t})}}}}scheduleFlush(){if(this.flushTimer)clearTimeout(this.flushTimer);this.flushTimer=setTimeout(()=>{this.flushTimer=void 0;let e=[...this.pendingTypes];this.pendingTypes.clear(),this.enqueueRefresh(async()=>{for(let t of e){let n=this.definitionsByType.get(t);if(!n)continue;await this.refreshTypeInternal(n)}})},this.debounceMs)}async refreshTypeInternal(e){let{records:t,discoveredDirectories:n}=await this.loadDefinition(e),r=this.recordsByType.get(e.type)??new Map;for(let[o,i]of r.entries()){if(t.has(o))continue;this.emit({kind:"remove",type:e.type,id:o,filePath:i.filePath})}for(let[o,i]of t.entries()){let s=r.get(o);if(s&&s.filePath===i.filePath&&s.fingerprint===i.fingerprint)continue;this.emit({kind:"upsert",record:{type:i.type,id:o,item:i.item,filePath:i.filePath}})}if(this.recordsByType.set(e.type,t),this.discoveredDirectoriesByType.set(e.type,n),this.started)this.syncDirectoryWatchers()}async loadDefinition(e){let t=new Map,n=new Set;for(let r of e.directories){n.add(r);let o=e.discoverFiles?await e.discoverFiles(r):await this.readDirectoryFileCandidates(r);for(let i of o){let{fileName:s,filePath:a}=i;if(n.add(i.directoryPath),e.includeFile&&!e.includeFile(s,a))continue;try{let d=await i$e(a,"utf8"),l={type:e.type,directoryPath:i.directoryPath,fileName:s,filePath:a,content:d},c=e.parseFile(l),u=e.resolveId(c,l).trim();if(!u)continue;t.set(u,{type:e.type,id:u,item:c,filePath:a,fingerprint:l$e(d)})}catch(d){if(this.emitParseErrors)this.emit({kind:"error",type:e.type,error:d,filePath:a})}}}return{records:t,discoveredDirectories:n}}isUnwatched(e){if(this.unwatchedRoots.size===0)return!1;let t=FV(e);for(let n of this.unwatchedRoots){let r=d$e(n,t);if(r===""||!r.startsWith("..")&&!s$e(r))return!0}return!1}buildDesiredTypesByDirectory(){let e=new Map;for(let[t,n]of this.baseTypesByDirectory.entries()){if(this.isUnwatched(t))continue;e.set(t,new Set(n))}for(let[t,n]of this.discoveredDirectoriesByType.entries())for(let r of n){if(this.isUnwatched(r))continue;let o=e.get(r);if(o)o.add(t);else e.set(r,new Set([t]))}return e}async readDirectoryFileCandidates(e){try{return(await o$e(e,{withFileTypes:!0})).filter((n)=>n.isFile()).map((n)=>({directoryPath:e,fileName:n.name,filePath:a$e(e,n.name)})).sort((n,r)=>n.fileName.localeCompare(r.fileName))}catch(t){if(UV(t)||BV(t))return[];throw t}}}import{readdir as kP,readFile as c$e,realpath as vP,stat as Om}from"node:fs/promises";import{basename as _i,dirname as u$e,extname as Wv,isAbsolute as h$e,join as Jn,relative as p$e,resolve as xi}from"node:path";import{stripUtf8Bom as m$e}from"@cerebriline/shared";import{AGENTS_RULES_FILE_NAME as WV,RULES_CONFIG_DIRECTORY_NAME as f$e,resolveGlobalAgentsRulesPath as g$e,resolveRulesConfigSearchPaths as y$e,resolveSkillsConfigSearchPaths as w$e,resolveWorkflowsConfigSearchPaths as b$e,SKILLS_CONFIG_DIRECTORY_NAME as qV,WORKFLOWS_CONFIG_DIRECTORY_NAME as zV}from"@cerebriline/shared/storage";import v$e from"yaml";var Pm="SKILL.md",k$e="managed.json",T$e=new Set([".md",".markdown",".txt"]);function Mm(e){return e.trim().toLowerCase()}function id(e){let t=e;return t?.code==="ENOENT"||t?.code==="ENOTDIR"||t?.code==="EACCES"||t?.code==="EPERM"||t?.code==="ELOOP"}function jv(e){return T$e.has(Wv(e).toLowerCase())}function KV(e){let t=[],n=new Set;for(let r of e){let o=xi(r);if(n.has(o))continue;n.add(o),t.push(r)}return t}function GV(e){if(e?.directories||e?.bundledSkillsDirectory===!1)return;return e?.bundledSkillsDirectory??Fv()}function S$e(e){let t=e.disabled!==!0,n={...e,bundled:!0};return Object.defineProperty(n,"disabled",{enumerable:!0,get:()=>LV(e.name,t)?void 0:!0}),n}function x$e(e){let t=[...e?.directories??JV(e?.workspacePath)],n=GV(e);if(n)t.unshift(n);if(e?.pluginSkillDirectories)t.push(...e.pluginSkillDirectories);else if(e?.includePluginSkills)t.push(...c6({pluginPaths:e.pluginPaths,workspacePath:e.workspacePath,cwd:e.cwd??e.workspacePath}));if(e?.agentPluginSkills)t.push(...e.agentPluginSkills.map((r)=>r.directoryPath));return KV(t)}function jV(e,t){let n=p$e(e,t);return n===""||!n.startsWith("..")&&!h$e(n)}async function _$e(e){try{let[t,n,r]=await Promise.all([vP(e.pluginRoot),vP(e.directoryPath),vP(e.filePath)]);if(t!==xi(e.pluginRoot)||!jV(t,n)||!jV(t,r)||!(await Om(n)).isDirectory()||!(await Om(r)).isFile())return[];return[{directoryPath:e.directoryPath,fileName:Pm,filePath:r}]}catch(t){if(id(t))return[];throw t}}async function TP(e){try{let t=await kP(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let o=Jn(e,r.name),i=Jn(o,k$e);try{let s=await c$e(i,"utf8"),a=JSON.parse(s);if(a&&typeof a==="object")n.push(o)}catch(s){if(id(s))continue;if(s?.name==="SyntaxError")continue;throw s}}return n.sort((r,o)=>r.localeCompare(o))}catch(t){if(id(t))return[];throw t}}function SP(e){let t=m$e(e),n=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/,r=t.match(n);if(!r)return{data:{},body:t,hadFrontmatter:!1};let[,o,i]=r;try{let s=v$e.parse(o);return{data:s&&typeof s==="object"&&!Array.isArray(s)?s:{},body:i,hadFrontmatter:!0}}catch(s){let a=s instanceof Error?s.message:String(s);return{data:{},body:t,hadFrontmatter:!0,parseError:a}}}function qv(e,t,n){if(e===void 0||e===null){if(n)throw Error(`Missing required frontmatter field '${t}'.`);return}if(typeof e!=="string")throw Error(`Frontmatter field '${t}' must be a string.`);let r=e.trim();if(!r&&n)throw Error(`Frontmatter field '${t}' cannot be empty.`);return r||void 0}function ou(e,t){if(e===void 0||e===null)return;if(typeof e!=="boolean")throw Error(`Frontmatter field '${t}' must be a boolean.`);return e}function E$e(e,t){if(_i(e.filePath).toLowerCase()!==WV.toLowerCase())return _i(e.filePath,Wv(e.filePath));if(t&&xi(e.filePath)===xi(t,WV))return"Workspace AGENTS.md";if(xi(e.filePath)===xi(g$e()))return"Global AGENTS.md";return _i(e.filePath,Wv(e.filePath))}function VV(e,t){let{data:n,body:r,parseError:o}=SP(e);if(o)throw Error(`Failed to parse YAML frontmatter: ${o}`);let i=r.trim();if(!i)throw Error("Missing instructions body in skill file.");let a=qv(n.name,"name",!1)??t.trim();if(!a)throw Error("Missing skill name.");return{name:a,description:qv(n.description,"description",!1),disabled:ou(n.disabled,"disabled")??(ou(n.enabled,"enabled")===!1?!0:void 0),instructions:i,frontmatter:n}}function YV(e,t){let{data:n,body:r,parseError:o}=SP(e);if(o)throw Error(`Failed to parse YAML frontmatter: ${o}`);let i=r.trim();if(!i)throw Error("Missing instructions body in rule file.");let s=qv(n.name,"name",!1)??t.trim();if(!s)throw Error("Missing rule name.");return{name:s,disabled:ou(n.disabled,"disabled")??(ou(n.enabled,"enabled")===!1?!0:void 0),instructions:i,frontmatter:n}}function XV(e,t){let{data:n,body:r,parseError:o}=SP(e);if(o)throw Error(`Failed to parse YAML frontmatter: ${o}`);let i=r.trim();if(!i)throw Error("Missing instructions body in workflow file.");let s=qv(n.name,"name",!1)??t.trim();if(!s)throw Error("Missing workflow name.");return{name:s,disabled:ou(n.disabled,"disabled")??(ou(n.enabled,"enabled")===!1?!0:void 0),instructions:i,frontmatter:n}}function JV(e){return w$e(e)}function QV(e){return y$e(e)}function ZV(e){return b$e(e)}async function e5(e){if(_i(e)===".cline"){let t=await TP(e);return(await Promise.all(t.map((r)=>e5(Jn(r,qV))))).flat()}try{let t=await kP(e,{withFileTypes:!0}),n=[];for(let r of t){if(r.isFile()&&r.name===Pm){n.push({directoryPath:e,fileName:r.name,filePath:Jn(e,r.name)});continue}let o=Jn(e,r.name);if(r.isDirectory()||r.isSymbolicLink()&&await Om(o).then((s)=>s.isDirectory()).catch((s)=>{if(id(s))return!1;throw s}))n.push({directoryPath:o,fileName:Pm,filePath:Jn(o,Pm)})}return n}catch(t){if(id(t))return[];throw t}}async function zv(e){if(_i(e)===".cline"){let t=await TP(e);return(await Promise.all(t.map((r)=>zv(Jn(r,"rules.md"))))).flat()}try{if((await Om(e)).isFile())return[{directoryPath:u$e(e),fileName:_i(e),filePath:e}]}catch(t){if(!id(t))throw t}try{let n=(await kP(e,{withFileTypes:!0})).filter((o)=>o.isFile()&&jv(o.name)).map((o)=>({directoryPath:e,fileName:o.name,filePath:Jn(e,o.name)})),r=Jn(e,"AGENTS.md");try{if((await Om(r)).isFile()){if(!n.some((s)=>s.fileName==="AGENTS.md"))n.push({directoryPath:e,fileName:"AGENTS.md",filePath:r})}}catch{}return n}catch(t){if(id(t))return[];throw t}}async function A$e(e){if(_i(e)===".cline"){let t=await TP(e);return(await Promise.all(t.map((r)=>zv(Jn(r,zV))))).flat()}return zv(e)}function t5(e){let t=x$e(e),n=GV(e),r=new Map((e?.agentPluginSkills??[]).map((i)=>[xi(i.directoryPath),i])),o=e?.workspacePath?Jn(e.workspacePath,".cline"):void 0;return{type:"skill",directories:o?KV([...t,o]):t,...n?{unwatchedDirectories:[n]}:{},discoverFiles:(i)=>{let s=r.get(xi(i));return s?_$e(s):e5(i)},includeFile:(i)=>i===Pm,parseFile:(i)=>{let s=r.get(xi(i.directoryPath));if(!s){let d=VV(i.content,_i(i.directoryPath));if(!yP(i.filePath,n))return d;return S$e(d)}let a=em(i.content,s.metadata.name);return{name:a.metadata.name,description:a.metadata.description,instructions:a.instructions,frontmatter:a.frontmatter,source:{type:"agent-plugin",pluginName:s.pluginName,pluginRoot:s.pluginRoot,skillRoot:s.directoryPath,filePath:s.filePath}}},resolveId:(i)=>i.source?.type==="agent-plugin"?`${Mm(i.source.pluginName)}:${Mm(i.name)}`:Mm(i.name)}}function n5(e){let t=e?.directories??QV(e?.workspacePath),n=e?.workspacePath?Jn(e.workspacePath,".cline"):void 0;return{type:"rule",directories:n?[...t,n]:t,discoverFiles:zv,includeFile:(r,o)=>r===".clinerules"||jv(r)||jv(o),parseFile:(r)=>YV(r.content,E$e(r,e?.workspacePath)),resolveId:(r)=>Mm(r.name)}}function r5(e){let t=e?.directories??ZV(e?.workspacePath),n=e?.workspacePath?Jn(e.workspacePath,".cline"):void 0;return{type:"workflow",directories:n?[...t,n]:t,discoverFiles:A$e,includeFile:(r)=>jv(r),parseFile:(r)=>XV(r.content,_i(r.filePath,Wv(r.filePath))),resolveId:(r)=>Mm(r.name)}}function o5(e){let t=[t5(e?.skills),n5(e?.rules),r5(e?.workflows)];return new Hv(t,{debounceMs:e?.debounceMs,emitParseErrors:e?.emitParseErrors})}import{createHash as R$e}from"node:crypto";import{truncateSplit as i5}from"@cerebriline/shared";function ks(e){return e.trim().toLowerCase().replace(/\s+/g,"-").replace(/[^\p{L}\p{N}_.:@-]+/gu,"-").replace(/-+/g,"-").replace(/^-/,"").replace(/-$/,"")}function I$e(e){let t=ks(e).replace(/[^a-z0-9_-]+/g,"-").replace(/^-/,"").replace(/-$/,""),n=R$e("sha256").update(e).digest("hex").slice(0,12);return`${t||"command"}-${n}`}function C$e(e,t){if(e.description?.trim())return i5(e.description,".");if(t==="workflow")return;return i5(e.instructions,".")}function P$e(e){return e.disabled!==!0}function M$e(e,t){if(t!=="skill"||!("source"in e)||e.source?.type!=="agent-plugin")return e.instructions;return`<skill-root>${e.source.skillRoot.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}</skill-root>
1567
+ `)}function qDe(e){return`${e} ended this run. It stood down for one turn so the task could be handed to the expert, and that turn was spent on something else.`}function PV(e){let t=!1,n,r="",o=0;return{get spent(){return t},decide(i){if(t)return;let s=e.remaining();if(s<=0)return;return t=!0,n=o,r=i.guard,e.logger?.log?.(`[Escalation] ${i.guard} stood down for one turn; the expert can be handed the task.`),{action:"continue",guidance:jDe({guard:i.guard,...i.diagnosis?{diagnosis:i.diagnosis}:{},remaining:s})}},observe(i){switch(i.type){case"iteration_start":o=i.iteration;return;case"content_start":if(i.contentType==="tool"&&i.toolName===Lr)n=void 0;return;case"iteration_end":{if(n===void 0||i.iteration<=n)return;let s=r;n=void 0,e.stop(qDe(s));return}default:return}}}}import{tmpdir as PUe}from"node:os";import{join as MUe}from"node:path";import{DEFAULT_MAX_NO_TOOL_CALL_NUDGES as OUe,setToolIntentGuardEnabled as LUe}from"@cerebriline/agents";import{supportsModelTool as hY}from"@cerebriline/llms";import{hasRuntimeConfigExtension as NUe,resolveMcpTimeoutSeconds as DUe}from"@cerebriline/shared";import{nanoid as $Ue}from"nanoid";import{isPromptTemplateCompactionId as Rct,splitFrontmatter as Ict,validatePromptTemplate as Cct}from"@cerebriline/shared";import Mct from"yaml";import{existsSync as pP}from"node:fs";import{dirname as fP,isAbsolute as zDe,join as $v,relative as KDe,resolve as MV}from"node:path";import{fileURLToPath as GDe}from"node:url";var gP="bundled-skills";function VDe(){try{return fP(GDe(import.meta.url))}catch{return"."}}var mP;function Fv(e=VDe()){if(mP?.from===e)return mP.directory;let t,n=[$v(e,gP),$v(fP(process.execPath),gP)].find((r)=>pP(r));if(n)t=n;else{let r=e;for(let o=0;o<7;o++){let i=$v(r,"assets","skills");if(pP(i)&&pP($v(r,"package.json"))){t=i;break}let s=fP(r);if(s===r)break;r=s}}return mP={from:e,directory:t},t}function yP(e,t=Fv()){if(!t)return!1;let n=KDe(MV(t),MV(e));return n!==""&&!n.startsWith("..")&&!zDe(n)}function OV(e){return e.trim().toLowerCase()}function LV(e,t){return mn().bundledSkills?.[OV(e)]?.enabled??t}function Uv(e,t){let n=mn();Ds({...n,bundledSkills:{...n.bundledSkills,[OV(e)]:{enabled:t}}})}import{PROMPT_TEMPLATE_COMPACTION_IDS as qct}from"@cerebriline/shared";import{applyPromptTemplateToTools as Jct}from"@cerebriline/shared";import{DEFAULT_PROMPT_TEMPLATE_NAME as dut,PROMPT_TEMPLATE_DEFAULT_MARKER as lut,promptTemplateMatchBlocks as cut,resolvePromptTemplate as uut}from"@cerebriline/shared";import{primeDeclaredNumCtx as wut,readDeclaredFamily as but}from"@cerebriline/llms";import{isOllamaNativeProvider as kut,renderPromptTemplate as Tut}from"@cerebriline/shared";import{createTool as Mut}from"@cerebriline/shared";import{createTool as Aut}from"@cerebriline/shared";import{createTool as oht}from"@cerebriline/shared";import{createTool as $ut}from"@cerebriline/shared";import{createTool as jut}from"@cerebriline/shared";import{createTool as pht}from"@cerebriline/shared";import{createTool as wht}from"@cerebriline/shared";import{createTool as kht}from"@cerebriline/shared";import{createHash as n$e}from"node:crypto";import{watch as r$e}from"node:fs";import{readdir as o$e,readFile as i$e}from"node:fs/promises";import{isAbsolute as s$e,join as a$e,relative as d$e,resolve as FV}from"node:path";function l$e(e){return n$e("sha1").update(e).digest("hex")}function HV(e){return Boolean(e&&typeof e==="object"&&"code"in e)}function UV(e){return HV(e)&&e.code==="ENOENT"}function BV(e){return HV(e)&&(e.code==="EACCES"||e.code==="EPERM")}class Hv{definitions;debounceMs;emitParseErrors;listeners=new Set;recordsByType=new Map;watchersByDirectory=new Map;baseTypesByDirectory=new Map;watchedTypesByDirectory=new Map;discoveredDirectoriesByType=new Map;unwatchedRoots=new Set;definitionsByType=new Map;pendingTypes=new Set;flushTimer;refreshQueue=Promise.resolve();started=!1;constructor(e,t){if(e.length===0)throw Error("UnifiedConfigFileWatcher requires at least one definition.");this.definitions=e,this.debounceMs=t?.debounceMs??75,this.emitParseErrors=t?.emitParseErrors??!1;for(let n of e){if(this.definitionsByType.has(n.type))throw Error(`Duplicate unified config definition type '${n.type}'.`);this.definitionsByType.set(n.type,n),this.recordsByType.set(n.type,new Map),this.discoveredDirectoriesByType.set(n.type,new Set);for(let r of n.unwatchedDirectories??[])this.unwatchedRoots.add(FV(r));for(let r of n.directories){let o=this.baseTypesByDirectory.get(r);if(o)o.add(n.type);else this.baseTypesByDirectory.set(r,new Set([n.type]))}}}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}async start(){if(this.started)return;this.started=!0,await this.refreshAll(),this.startDirectoryWatchers()}stop(){if(this.started=!1,this.flushTimer)clearTimeout(this.flushTimer),this.flushTimer=void 0;this.pendingTypes.clear();for(let e of this.watchersByDirectory.values())e.close();this.watchersByDirectory.clear(),this.watchedTypesByDirectory=new Map}async refreshAll(){await this.enqueueRefresh(async()=>{for(let e of this.definitions)await this.refreshTypeInternal(e)})}async refreshType(e){let t=this.definitionsByType.get(e);if(!t)throw Error(`Unknown unified config type '${e}'.`);await this.enqueueRefresh(async()=>{await this.refreshTypeInternal(t)})}getSnapshot(e){let t=this.recordsByType.get(e);return new Map([...t?.entries()??[]].map(([n,r])=>[n,{...r}]))}getAllSnapshots(){let e=new Map;for(let[t,n]of this.recordsByType.entries())e.set(t,new Map([...n.entries()].map(([r,o])=>[r,{...o}])));return e}emit(e){for(let t of this.listeners)t(e)}enqueueRefresh(e){return this.refreshQueue=this.refreshQueue.then(e,e),this.refreshQueue}startDirectoryWatchers(){this.syncDirectoryWatchers()}syncDirectoryWatchers(){let e=this.buildDesiredTypesByDirectory();for(let[t,n]of this.watchersByDirectory.entries()){if(e.has(t))continue;n.close(),this.watchersByDirectory.delete(t)}this.watchedTypesByDirectory=e;for(let t of e.keys()){if(this.watchersByDirectory.has(t))continue;try{let n=r$e(t,()=>{let r=this.watchedTypesByDirectory.get(t);if(!r)return;for(let o of r)this.pendingTypes.add(o);this.scheduleFlush()});this.watchersByDirectory.set(t,n),n.on("error",(r)=>{let o=this.watchedTypesByDirectory.get(t);if(!o)return;for(let i of o)this.emit({kind:"error",type:i,error:r,filePath:t})})}catch(n){if(!UV(n)&&!BV(n)){let r=e.get(t);if(!r)continue;for(let o of r)this.emit({kind:"error",type:o,error:n,filePath:t})}}}}scheduleFlush(){if(this.flushTimer)clearTimeout(this.flushTimer);this.flushTimer=setTimeout(()=>{this.flushTimer=void 0;let e=[...this.pendingTypes];this.pendingTypes.clear(),this.enqueueRefresh(async()=>{for(let t of e){let n=this.definitionsByType.get(t);if(!n)continue;await this.refreshTypeInternal(n)}})},this.debounceMs)}async refreshTypeInternal(e){let{records:t,discoveredDirectories:n}=await this.loadDefinition(e),r=this.recordsByType.get(e.type)??new Map;for(let[o,i]of r.entries()){if(t.has(o))continue;this.emit({kind:"remove",type:e.type,id:o,filePath:i.filePath})}for(let[o,i]of t.entries()){let s=r.get(o);if(s&&s.filePath===i.filePath&&s.fingerprint===i.fingerprint)continue;this.emit({kind:"upsert",record:{type:i.type,id:o,item:i.item,filePath:i.filePath}})}if(this.recordsByType.set(e.type,t),this.discoveredDirectoriesByType.set(e.type,n),this.started)this.syncDirectoryWatchers()}async loadDefinition(e){let t=new Map,n=new Set;for(let r of e.directories){n.add(r);let o=e.discoverFiles?await e.discoverFiles(r):await this.readDirectoryFileCandidates(r);for(let i of o){let{fileName:s,filePath:a}=i;if(n.add(i.directoryPath),e.includeFile&&!e.includeFile(s,a))continue;try{let d=await i$e(a,"utf8"),l={type:e.type,directoryPath:i.directoryPath,fileName:s,filePath:a,content:d},c=e.parseFile(l),u=e.resolveId(c,l).trim();if(!u)continue;t.set(u,{type:e.type,id:u,item:c,filePath:a,fingerprint:l$e(d)})}catch(d){if(this.emitParseErrors)this.emit({kind:"error",type:e.type,error:d,filePath:a})}}}return{records:t,discoveredDirectories:n}}isUnwatched(e){if(this.unwatchedRoots.size===0)return!1;let t=FV(e);for(let n of this.unwatchedRoots){let r=d$e(n,t);if(r===""||!r.startsWith("..")&&!s$e(r))return!0}return!1}buildDesiredTypesByDirectory(){let e=new Map;for(let[t,n]of this.baseTypesByDirectory.entries()){if(this.isUnwatched(t))continue;e.set(t,new Set(n))}for(let[t,n]of this.discoveredDirectoriesByType.entries())for(let r of n){if(this.isUnwatched(r))continue;let o=e.get(r);if(o)o.add(t);else e.set(r,new Set([t]))}return e}async readDirectoryFileCandidates(e){try{return(await o$e(e,{withFileTypes:!0})).filter((n)=>n.isFile()).map((n)=>({directoryPath:e,fileName:n.name,filePath:a$e(e,n.name)})).sort((n,r)=>n.fileName.localeCompare(r.fileName))}catch(t){if(UV(t)||BV(t))return[];throw t}}}import{readdir as kP,readFile as c$e,realpath as vP,stat as Om}from"node:fs/promises";import{basename as _i,dirname as u$e,extname as Wv,isAbsolute as h$e,join as Jn,relative as p$e,resolve as xi}from"node:path";import{stripUtf8Bom as m$e}from"@cerebriline/shared";import{AGENTS_RULES_FILE_NAME as WV,RULES_CONFIG_DIRECTORY_NAME as f$e,resolveGlobalAgentsRulesPath as g$e,resolveRulesConfigSearchPaths as y$e,resolveSkillsConfigSearchPaths as w$e,resolveWorkflowsConfigSearchPaths as b$e,SKILLS_CONFIG_DIRECTORY_NAME as qV,WORKFLOWS_CONFIG_DIRECTORY_NAME as zV}from"@cerebriline/shared/storage";import v$e from"yaml";var Pm="SKILL.md",k$e="managed.json",T$e=new Set([".md",".markdown",".txt"]);function Mm(e){return e.trim().toLowerCase()}function id(e){let t=e;return t?.code==="ENOENT"||t?.code==="ENOTDIR"||t?.code==="EACCES"||t?.code==="EPERM"||t?.code==="ELOOP"}function jv(e){return T$e.has(Wv(e).toLowerCase())}function KV(e){let t=[],n=new Set;for(let r of e){let o=xi(r);if(n.has(o))continue;n.add(o),t.push(r)}return t}function GV(e){if(e?.directories||e?.bundledSkillsDirectory===!1)return;return e?.bundledSkillsDirectory??Fv()}function S$e(e){let t=e.disabled!==!0,n={...e,bundled:!0};return Object.defineProperty(n,"disabled",{enumerable:!0,get:()=>LV(e.name,t)?void 0:!0}),n}function x$e(e){let t=[...e?.directories??JV(e?.workspacePath)],n=GV(e);if(n)t.unshift(n);if(e?.pluginSkillDirectories)t.push(...e.pluginSkillDirectories);else if(e?.includePluginSkills)t.push(...c6({pluginPaths:e.pluginPaths,workspacePath:e.workspacePath,cwd:e.cwd??e.workspacePath}));if(e?.agentPluginSkills)t.push(...e.agentPluginSkills.map((r)=>r.directoryPath));return KV(t)}function jV(e,t){let n=p$e(e,t);return n===""||!n.startsWith("..")&&!h$e(n)}async function _$e(e){try{let[t,n,r]=await Promise.all([vP(e.pluginRoot),vP(e.directoryPath),vP(e.filePath)]);if(t!==xi(e.pluginRoot)||!jV(t,n)||!jV(t,r)||!(await Om(n)).isDirectory()||!(await Om(r)).isFile())return[];return[{directoryPath:e.directoryPath,fileName:Pm,filePath:r}]}catch(t){if(id(t))return[];throw t}}async function TP(e){try{let t=await kP(e,{withFileTypes:!0}),n=[];for(let r of t){if(!r.isDirectory())continue;let o=Jn(e,r.name),i=Jn(o,k$e);try{let s=await c$e(i,"utf8"),a=JSON.parse(s);if(a&&typeof a==="object")n.push(o)}catch(s){if(id(s))continue;if(s?.name==="SyntaxError")continue;throw s}}return n.sort((r,o)=>r.localeCompare(o))}catch(t){if(id(t))return[];throw t}}function SP(e){let t=m$e(e),n=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/,r=t.match(n);if(!r)return{data:{},body:t,hadFrontmatter:!1};let[,o,i]=r;try{let s=v$e.parse(o);return{data:s&&typeof s==="object"&&!Array.isArray(s)?s:{},body:i,hadFrontmatter:!0}}catch(s){let a=s instanceof Error?s.message:String(s);return{data:{},body:t,hadFrontmatter:!0,parseError:a}}}function qv(e,t,n){if(e===void 0||e===null){if(n)throw Error(`Missing required frontmatter field '${t}'.`);return}if(typeof e!=="string")throw Error(`Frontmatter field '${t}' must be a string.`);let r=e.trim();if(!r&&n)throw Error(`Frontmatter field '${t}' cannot be empty.`);return r||void 0}function ou(e,t){if(e===void 0||e===null)return;if(typeof e!=="boolean")throw Error(`Frontmatter field '${t}' must be a boolean.`);return e}function E$e(e,t){if(_i(e.filePath).toLowerCase()!==WV.toLowerCase())return _i(e.filePath,Wv(e.filePath));if(t&&xi(e.filePath)===xi(t,WV))return"Workspace AGENTS.md";if(xi(e.filePath)===xi(g$e()))return"Global AGENTS.md";return _i(e.filePath,Wv(e.filePath))}function VV(e,t){let{data:n,body:r,parseError:o}=SP(e);if(o)throw Error(`Failed to parse YAML frontmatter: ${o}`);let i=r.trim();if(!i)throw Error("Missing instructions body in skill file.");let a=qv(n.name,"name",!1)??t.trim();if(!a)throw Error("Missing skill name.");return{name:a,description:qv(n.description,"description",!1),disabled:ou(n.disabled,"disabled")??(ou(n.enabled,"enabled")===!1?!0:void 0),instructions:i,frontmatter:n}}function YV(e,t){let{data:n,body:r,parseError:o}=SP(e);if(o)throw Error(`Failed to parse YAML frontmatter: ${o}`);let i=r.trim();if(!i)throw Error("Missing instructions body in rule file.");let s=qv(n.name,"name",!1)??t.trim();if(!s)throw Error("Missing rule name.");return{name:s,disabled:ou(n.disabled,"disabled")??(ou(n.enabled,"enabled")===!1?!0:void 0),instructions:i,frontmatter:n}}function XV(e,t){let{data:n,body:r,parseError:o}=SP(e);if(o)throw Error(`Failed to parse YAML frontmatter: ${o}`);let i=r.trim();if(!i)throw Error("Missing instructions body in workflow file.");let s=qv(n.name,"name",!1)??t.trim();if(!s)throw Error("Missing workflow name.");return{name:s,disabled:ou(n.disabled,"disabled")??(ou(n.enabled,"enabled")===!1?!0:void 0),instructions:i,frontmatter:n}}function JV(e){return w$e(e)}function QV(e){return y$e(e)}function ZV(e){return b$e(e)}async function e5(e){if(_i(e)===".cline"){let t=await TP(e);return(await Promise.all(t.map((r)=>e5(Jn(r,qV))))).flat()}try{let t=await kP(e,{withFileTypes:!0}),n=[];for(let r of t){if(r.isFile()&&r.name===Pm){n.push({directoryPath:e,fileName:r.name,filePath:Jn(e,r.name)});continue}let o=Jn(e,r.name);if(r.isDirectory()||r.isSymbolicLink()&&await Om(o).then((s)=>s.isDirectory()).catch((s)=>{if(id(s))return!1;throw s}))n.push({directoryPath:o,fileName:Pm,filePath:Jn(o,Pm)})}return n}catch(t){if(id(t))return[];throw t}}async function zv(e){if(_i(e)===".cline"){let t=await TP(e);return(await Promise.all(t.map((r)=>zv(Jn(r,"rules.md"))))).flat()}try{if((await Om(e)).isFile())return[{directoryPath:u$e(e),fileName:_i(e),filePath:e}]}catch(t){if(!id(t))throw t}try{let n=(await kP(e,{withFileTypes:!0})).filter((o)=>o.isFile()&&jv(o.name)).map((o)=>({directoryPath:e,fileName:o.name,filePath:Jn(e,o.name)})),r=Jn(e,"AGENTS.md");try{if((await Om(r)).isFile()){if(!n.some((s)=>s.fileName==="AGENTS.md"))n.push({directoryPath:e,fileName:"AGENTS.md",filePath:r})}}catch{}return n}catch(t){if(id(t))return[];throw t}}async function A$e(e){if(_i(e)===".cline"){let t=await TP(e);return(await Promise.all(t.map((r)=>zv(Jn(r,zV))))).flat()}return zv(e)}function t5(e){let t=x$e(e),n=GV(e),r=new Map((e?.agentPluginSkills??[]).map((i)=>[xi(i.directoryPath),i])),o=e?.workspacePath?Jn(e.workspacePath,".cline"):void 0;return{type:"skill",directories:o?KV([...t,o]):t,...n?{unwatchedDirectories:[n]}:{},discoverFiles:(i)=>{let s=r.get(xi(i));return s?_$e(s):e5(i)},includeFile:(i)=>i===Pm,parseFile:(i)=>{let s=r.get(xi(i.directoryPath));if(!s){let d=VV(i.content,_i(i.directoryPath));if(!yP(i.filePath,n))return d;return S$e(d)}let a=em(i.content,s.metadata.name);return{name:a.metadata.name,description:a.metadata.description,instructions:a.instructions,frontmatter:a.frontmatter,source:{type:"agent-plugin",pluginName:s.pluginName,pluginRoot:s.pluginRoot,skillRoot:s.directoryPath,filePath:s.filePath}}},resolveId:(i)=>i.source?.type==="agent-plugin"?`${Mm(i.source.pluginName)}:${Mm(i.name)}`:Mm(i.name)}}function n5(e){let t=e?.directories??QV(e?.workspacePath),n=e?.workspacePath?Jn(e.workspacePath,".cline"):void 0;return{type:"rule",directories:n?[...t,n]:t,discoverFiles:zv,includeFile:(r,o)=>r===".clinerules"||jv(r)||jv(o),parseFile:(r)=>YV(r.content,E$e(r,e?.workspacePath)),resolveId:(r)=>Mm(r.name)}}function r5(e){let t=e?.directories??ZV(e?.workspacePath),n=e?.workspacePath?Jn(e.workspacePath,".cline"):void 0;return{type:"workflow",directories:n?[...t,n]:t,discoverFiles:A$e,includeFile:(r)=>jv(r),parseFile:(r)=>XV(r.content,_i(r.filePath,Wv(r.filePath))),resolveId:(r)=>Mm(r.name)}}function o5(e){let t=[t5(e?.skills),n5(e?.rules),r5(e?.workflows)];return new Hv(t,{debounceMs:e?.debounceMs,emitParseErrors:e?.emitParseErrors})}import{createHash as R$e}from"node:crypto";import{truncateSplit as i5}from"@cerebriline/shared";function ks(e){return e.trim().toLowerCase().replace(/\s+/g,"-").replace(/[^\p{L}\p{N}_.:@-]+/gu,"-").replace(/-+/g,"-").replace(/^-/,"").replace(/-$/,"")}function I$e(e){let t=ks(e).replace(/[^a-z0-9_-]+/g,"-").replace(/^-/,"").replace(/-$/,""),n=R$e("sha256").update(e).digest("hex").slice(0,12);return`${t||"command"}-${n}`}function C$e(e,t){if(e.description?.trim())return i5(e.description,".");if(t==="workflow")return;return i5(e.instructions,".")}function P$e(e){return e.disabled!==!0}function M$e(e,t){if(t!=="skill"||!("source"in e)||e.source?.type!=="agent-plugin")return e.instructions;return`<skill-root>${e.source.skillRoot.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}</skill-root>
1568
1568
  ${e.instructions}`}function s5(e,t){return[...e.getSnapshot(t).entries()].map(([n,r])=>({id:n,record:r})).filter(({record:n})=>P$e(n.item)).map(({id:n,record:r})=>({id:n,name:ks(r.item.name)||`${t}-${I$e(n)}`,instructions:M$e(r.item,t),description:C$e(r.item,t),kind:t})).sort((n,r)=>n.name.localeCompare(r.name)||n.id.localeCompare(r.id))}function Lm(e){let t=new Map;for(let n of[...s5(e,"skill"),...s5(e,"workflow")])if(!t.has(n.name))t.set(n.name,n);return[...t.values()].sort((n,r)=>n.name.localeCompare(r.name))}function a5(e,t,n){if(!e.startsWith("/")||e.length<2)return e;let r=e.match(/^\/(\S+)/);if(!r)return e;let o=r[1],i=ks(o);if(!i)return e;let s=o.length+1,a=e.slice(s),d=Lm(t).find((l)=>l.name===i);if(!d)return e;if(d.kind==="skill"&&n?.expandSkillCommands===!1)return e;return`${d.instructions}${a}`}function O$e(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function xP(e,t){let n=t?.trim(),r=n?`
1569
1569
  <command-args>${n}</command-args>`:"",o=e.source?.type==="agent-plugin"?`
1570
1570
  <skill-root>${O$e(e.source.skillRoot)}</skill-root>`:"",i=e.description?.trim()?`Description: ${e.description.trim()}
@@ -1576,7 +1576,7 @@ ${i}${e.instructions}
1576
1576
 
1577
1577
  ${s}`:o.instructions}})}}}function Gv(e){return e.trim().replace(/^\/+/,"").toLowerCase()}function l5(e,t){let n=e.map((i)=>i.createSkillsExecutor?.(t)).filter((i)=>i!==void 0),r=()=>n.flatMap((i)=>(i.configuredSkills??[]).map((s)=>({metadata:s,executor:i}))),o=async(i,s,a)=>{let d=Gv(i);if(!d)return"Missing skill name.";let l=r(),c=l.filter(({metadata:m})=>Gv(m.id)===d),u=c.length>0?c:l.filter(({metadata:m})=>{let f=Gv(m.id);return Gv(m.name)===d||f.endsWith(`:${d}`)}),h=u.filter(({metadata:m})=>!m.disabled);if(h.length===1)return h[0].executor(h[0].metadata.id,s,a);if(h.length>1)return`Skill "${i}" is ambiguous. Use one of: ${h.map(({metadata:m})=>m.id).join(", ")}`;if(u.length>0)return`Skill "${i}" is configured but disabled.`;let p=l.filter(({metadata:m})=>!m.disabled).map(({metadata:m})=>m.id).sort((m,f)=>m.localeCompare(f));return p.length>0?`Skill "${i}" not found. Available skills: ${p.join(", ")}`:"No skills are currently available."};return Object.defineProperty(o,"configuredSkills",{get:()=>r().map(({metadata:i})=>i),enumerable:!0,configurable:!1}),o}function EP(e){if(e.length===0)throw Error("At least one user instruction service is required.");if(e.length===1)return e[0];let t=(r)=>{let o=new Map;for(let i of e)for(let s of i.listRecords(r))if(!o.has(s.id))o.set(s.id,s);return[...o.values()]},n=()=>{let r=new Map;for(let o of e)for(let i of o.listRuntimeCommands()){let s=ks(i.name);if(s&&!r.has(s))r.set(s,i)}return[...r.values()].sort((o,i)=>o.name.localeCompare(i.name))};return{start:async()=>{await Promise.all(e.map((r)=>r.start()))},stop:()=>{for(let r of e)r.stop()},refreshType:async(r)=>{await Promise.all(e.map((o)=>o.refreshType(r)))},listRecords:t,listRuntimeCommands:n,resolveRuntimeSlashCommand:(r,o)=>{for(let i of e){let s=i.resolveRuntimeSlashCommand(r,o);if(s!==r)return s}return r},hasConfiguredSkills:(r)=>e.some((o)=>o.hasConfiguredSkills(r)),createSkillsExecutor:(r)=>l5(e,r),createExtension:(r)=>({name:"cline-combined-user-instructions",manifest:{capabilities:[r.includeRules?"rules":void 0,r.registerSkillsTool?"tools":void 0,r.includeSkills||r.includeWorkflows?"commands":void 0].filter((o)=>Boolean(o))},setup(o){if(r.includeRules)o.registerRule({id:"cline-combined-user-instructions:rules",source:"combined-user-instructions",content:()=>pf(t("rule"))});if(r.registerSkillsTool)o.registerTool(Xo(l5(e,r.allowedSkillNames)));for(let i of n().filter((s)=>s.kind==="skill"&&r.includeSkills||s.kind==="workflow"&&r.includeWorkflows))o.registerCommand({name:i.name,description:i.description,handler:(s)=>{let a=s.trim();return a?`${i.instructions}
1578
1578
 
1579
- ${a}`:i.instructions}})}})}}class c5{watcher;ready;stopped=!1;constructor(e){this.watcher=o5(e)}start(){if(!this.ready)this.stopped=!1,this.ready=this.watcher.start();return this.ready}stop(){if(this.stopped)return;this.stopped=!0,this.watcher.stop(),this.ready=void 0}async refreshType(e){await this.start(),await this.watcher.refreshType(e)}listRecords(e){return[...this.watcher.getSnapshot(e).entries()].map(([t,n])=>({type:e,id:t,filePath:n.filePath,item:n.item}))}listRuntimeCommands(){return Lm(this.watcher)}resolveRuntimeSlashCommand(e,t){return a5(e,this.watcher,t)}hasConfiguredSkills(e){return Nm(this.watcher,e).some((t)=>!t.disabled)}createSkillsExecutor(e){return _P(this.watcher,(this.ready??Promise.resolve()).catch(()=>{}),e)}createExtension(e){return d5({...e,watcher:this.watcher,watcherReady:(this.ready??Promise.resolve()).catch(()=>{})})}}function iu(e){return new c5(e)}import{spawn as PFe}from"node:child_process";import{mkdir as MFe}from"node:fs/promises";import{StringDecoder as F5}from"node:string_decoder";import{formatMcpTimeoutErrorMessage as OFe,isMcpTimeoutConfigured as U5}from"@cerebriline/shared";import{Client as LFe}from"@modelcontextprotocol/sdk/client/index.js";import{randomUUID as kFe}from"node:crypto";import{UnauthorizedError as M5}from"@modelcontextprotocol/sdk/client/auth.js";import{Client as kmt}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as TFe,SseError as SFe}from"@modelcontextprotocol/sdk/client/sse.js";import{StreamableHTTPClientTransport as xFe}from"@modelcontextprotocol/sdk/client/streamableHttp.js";UP();import{formatMcpTimeoutErrorMessage as wFe,resolveMcpTimeoutSeconds as bFe}from"@cerebriline/shared";import{ErrorCode as vFe,McpError as C5}from"@modelcontextprotocol/sdk/types.js";function Jv(e){return bFe(e)*1000}function Bm(e,t,n){if(!(e instanceof C5)||e.code!==vFe.RequestTimeout)return e;return new C5(e.code,wFe(t,n),e.data)}var _Fe=new Set([301,302,303,307,308]),P5=20,EFe=new Set(["authorization","cookie","proxy-authorization"]),AFe=new Set(["mcp-protocol-version","mcp-session-id"]);function RFe(e){if(!e.headers||!e.restrictConfiguredHeadersToOrigin)return e.headers;let t=Object.entries(e.headers).filter(([n])=>{let r=n.toLowerCase();if(AFe.has(r))return!1;return r!=="authorization"||!e.oauthProvider});return t.length>0?Object.fromEntries(t):void 0}function IFe(e){let t=new URL(e.endpointUrl).origin,n=new Set(Object.keys(e.configuredHeaders).map((i)=>i.toLowerCase())),r=e.baseFetch??globalThis.fetch,o=(i)=>{let s=[];i.forEach((a,d)=>{let l=d.toLowerCase();if(n.has(l)||EFe.has(l))s.push(d)});for(let a of s)i.delete(a)};return async(i,s)=>{let a=i instanceof Request?new Request(i,s):new Request(String(i),s),d=new URL(a.url),l=a.method,c=l==="GET"||l==="HEAD"?void 0:await a.clone().arrayBuffer(),u=new Headers(a.headers);if(d.origin!==t)o(u);for(let h=0;;h+=1){let p=await r(d,{method:l,headers:u,body:c,redirect:"manual",signal:a.signal});if(!_Fe.has(p.status))return p;if(h>=P5)throw await p.body?.cancel().catch(()=>{return}),Error(`MCP endpoint exceeded ${P5} redirects.`);let m=p.headers.get("location");if(!m)return p;let f=new URL(m,d);if(await p.body?.cancel().catch(()=>{return}),f.origin!==t)o(u);if(p.status===303&&l!=="GET"&&l!=="HEAD"||(p.status===301||p.status===302)&&l==="POST")l="GET",c=void 0,u.delete("content-length"),u.delete("content-type");d=f}}}function CFe(e){return{client_name:"Cerebriline",redirect_uris:[e],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none"}}function BP(e){return e?{client_id:e.clientId,...e.clientSecret?{client_secret:e.clientSecret}:{}}:void 0}function Qv(e,t){return e?.client_id===t?.client_id&&e?.client_secret===t?.client_secret}function Hm(e,t,n){if(!Qv(t.clientInformation,n))throw new su(e)}function HP(e){let t={};try{t=DP(e.serverName,{filePath:e.settingsPath})??{}}catch{t={}}let n,r,o=()=>e.clientInformation??t.clientInformation,i=e.clientInformation?{clientId:e.clientInformation.client_id,...e.clientInformation.client_secret?{clientSecret:e.clientInformation.client_secret}:{}}:null,s=async(d)=>{try{t=await $P(e.serverName,d,{filePath:e.settingsPath,expectedOAuthClient:i})}catch(l){if(e.settingsPath||l instanceof su)throw l;t=$m(d(t))??{}}};return{provider:{get redirectUrl(){return t.redirectUrl??e.redirectUrl},get clientMetadata(){return CFe(t.redirectUrl??e.redirectUrl)},state:()=>(r=kFe(),r),clientInformation:o,saveClientInformation:async(d)=>{let l=t.clientInformation;await s((c)=>{Hm(e.serverName,c,l);let u=!Qv(c.clientInformation,d);return{...c,clientInformation:d,...u?{tokens:void 0,lastAuthenticatedAt:void 0}:{},redirectUrl:e.redirectUrl,lastError:void 0}})},tokens:()=>o()?.client_id&&Qv(t.clientInformation,o())?t.tokens:void 0,saveTokens:async(d)=>{let l=Date.now(),c=o();if(!c?.client_id)throw Error("Cannot save MCP OAuth tokens without a client ID.");await s((u)=>{if(u.clientInformation||!e.clientInformation)Hm(e.serverName,u,c);return{...u,tokens:d,clientInformation:c,redirectUrl:e.redirectUrl,lastError:void 0,lastAuthenticatedAt:l}})},redirectToAuthorization:async(d)=>{n=d.toString(),await e.onAuthorizationUrl?.(n)},saveCodeVerifier:async(d)=>{let l=o();await s((c)=>(Hm(e.serverName,c,l),{...c,codeVerifier:d,redirectUrl:e.redirectUrl}))},codeVerifier:()=>{if(!t.codeVerifier)throw Error(`Missing OAuth code verifier for MCP server "${e.serverName}".`);return t.codeVerifier},invalidateCredentials:async(d)=>{let l=t.clientInformation;await s((c)=>{if(Hm(e.serverName,c,l),d==="all")return{lastError:c.lastError,redirectUrl:c.redirectUrl};return{...c,...d==="client"?{clientInformation:void 0}:{},...d==="tokens"?{tokens:void 0,lastAuthenticatedAt:void 0}:{},...d==="verifier"?{codeVerifier:void 0}:{},...d==="discovery"?{discoveryState:void 0}:{}}})},saveDiscoveryState:async(d)=>{let l=t.clientInformation;await s((c)=>(Hm(e.serverName,c,l),{...c,discoveryState:d}))},discoveryState:()=>t.discoveryState},getLastAuthorizationUrl:()=>n,getLastOAuthState:()=>r,resetInteractiveState:async()=>{await s((d)=>{let l=e.clientInformation,c=l!==void 0&&!Qv(d.clientInformation,l);return{...d,...l?{clientInformation:l}:{},...c?{tokens:void 0,lastAuthenticatedAt:void 0}:{},codeVerifier:void 0,discoveryState:void 0,lastError:void 0,redirectUrl:e.redirectUrl}})},markError:async(d)=>{await s((l)=>({...l,lastError:d}))},markConnectionError:async(d)=>{await s((l)=>({...l,lastError:d,authorizationRequired:void 0}))},markAuthorizationRequired:async(d)=>{await s((l)=>({...l,lastError:d,authorizationRequired:!0}))},clearError:async()=>{await s((d)=>({...d,lastError:void 0,authorizationRequired:void 0}))}}}function O5(e){let t=e.registration.transport;if(t.type==="stdio")throw Error(`MCP server "${e.registration.name}" uses stdio transport and does not support OAuth browser flow.`);let n=RFe({headers:t.headers,oauthProvider:e.oauthProvider,restrictConfiguredHeadersToOrigin:e.restrictConfiguredHeadersToOrigin}),r=n?{headers:n}:void 0,o=e.restrictConfiguredHeadersToOrigin&&n?IFe({endpointUrl:t.url,configuredHeaders:n,baseFetch:e.fetch}):e.fetch,i=e.oauthProvider?o:async(s,a)=>{let d=await(o??globalThis.fetch)(s,a);if(d.status===401)throw await d.body?.cancel().catch(()=>{return}),new M5("MCP server requires authorization");return d};if(t.type==="sse")return new TFe(new URL(t.url),{authProvider:e.oauthProvider,requestInit:r,eventSourceInit:{fetch:(s,a)=>(o??globalThis.fetch)(s,a)},fetch:i});return new xFe(new URL(t.url),{authProvider:e.oauthProvider,requestInit:r,fetch:i})}function WP(e){return e instanceof M5||e instanceof SFe&&e.code===401}var NFe="2024-11-05",B5=1e4,DFe=1e4,L5="http://127.0.0.1:1456/mcp/oauth/callback",N5=250,jP=2000;function sd(e){return e instanceof Error?e.message:String(e)}async function Zv(e,t){return new Promise((n)=>{let r=!1,o=(s)=>{if(r)return;r=!0,clearTimeout(i),n(s)},i=setTimeout(()=>o(!1),t);i.unref(),e.then(()=>o(!0),()=>o(!0))})}function $Fe(e,t,n){let r=sd(t),o=sd(n);if(r===o)return t instanceof Error?t:Error(r);return Error(`MCP server "${e}" failed to initialize. Newline-delimited attempt: ${r} Content-Length framed attempt: ${o}`)}function D5(e){return Buffer.from(`${JSON.stringify(e)}
1579
+ ${a}`:i.instructions}})}})}}class c5{watcher;ready;stopped=!1;constructor(e){this.watcher=o5(e)}start(){if(!this.ready)this.stopped=!1,this.ready=this.watcher.start();return this.ready}stop(){if(this.stopped)return;this.stopped=!0,this.watcher.stop(),this.ready=void 0}async refreshType(e){await this.start(),await this.watcher.refreshType(e)}listRecords(e){return[...this.watcher.getSnapshot(e).entries()].map(([t,n])=>({type:e,id:t,filePath:n.filePath,item:n.item}))}listRuntimeCommands(){return Lm(this.watcher)}resolveRuntimeSlashCommand(e,t){return a5(e,this.watcher,t)}hasConfiguredSkills(e){return Nm(this.watcher,e).some((t)=>!t.disabled)}createSkillsExecutor(e){return _P(this.watcher,(this.ready??Promise.resolve()).catch(()=>{}),e)}createExtension(e){return d5({...e,watcher:this.watcher,watcherReady:(this.ready??Promise.resolve()).catch(()=>{})})}}function iu(e){return new c5(e)}import{spawn as PFe}from"node:child_process";import{mkdir as MFe}from"node:fs/promises";import{StringDecoder as F5}from"node:string_decoder";import{formatMcpTimeoutErrorMessage as OFe,isMcpTimeoutConfigured as U5}from"@cerebriline/shared";import{Client as LFe}from"@modelcontextprotocol/sdk/client/index.js";import{randomUUID as kFe}from"node:crypto";import{UnauthorizedError as M5}from"@modelcontextprotocol/sdk/client/auth.js";import{Client as Smt}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as TFe,SseError as SFe}from"@modelcontextprotocol/sdk/client/sse.js";import{StreamableHTTPClientTransport as xFe}from"@modelcontextprotocol/sdk/client/streamableHttp.js";UP();import{formatMcpTimeoutErrorMessage as wFe,resolveMcpTimeoutSeconds as bFe}from"@cerebriline/shared";import{ErrorCode as vFe,McpError as C5}from"@modelcontextprotocol/sdk/types.js";function Jv(e){return bFe(e)*1000}function Bm(e,t,n){if(!(e instanceof C5)||e.code!==vFe.RequestTimeout)return e;return new C5(e.code,wFe(t,n),e.data)}var _Fe=new Set([301,302,303,307,308]),P5=20,EFe=new Set(["authorization","cookie","proxy-authorization"]),AFe=new Set(["mcp-protocol-version","mcp-session-id"]);function RFe(e){if(!e.headers||!e.restrictConfiguredHeadersToOrigin)return e.headers;let t=Object.entries(e.headers).filter(([n])=>{let r=n.toLowerCase();if(AFe.has(r))return!1;return r!=="authorization"||!e.oauthProvider});return t.length>0?Object.fromEntries(t):void 0}function IFe(e){let t=new URL(e.endpointUrl).origin,n=new Set(Object.keys(e.configuredHeaders).map((i)=>i.toLowerCase())),r=e.baseFetch??globalThis.fetch,o=(i)=>{let s=[];i.forEach((a,d)=>{let l=d.toLowerCase();if(n.has(l)||EFe.has(l))s.push(d)});for(let a of s)i.delete(a)};return async(i,s)=>{let a=i instanceof Request?new Request(i,s):new Request(String(i),s),d=new URL(a.url),l=a.method,c=l==="GET"||l==="HEAD"?void 0:await a.clone().arrayBuffer(),u=new Headers(a.headers);if(d.origin!==t)o(u);for(let h=0;;h+=1){let p=await r(d,{method:l,headers:u,body:c,redirect:"manual",signal:a.signal});if(!_Fe.has(p.status))return p;if(h>=P5)throw await p.body?.cancel().catch(()=>{return}),Error(`MCP endpoint exceeded ${P5} redirects.`);let m=p.headers.get("location");if(!m)return p;let f=new URL(m,d);if(await p.body?.cancel().catch(()=>{return}),f.origin!==t)o(u);if(p.status===303&&l!=="GET"&&l!=="HEAD"||(p.status===301||p.status===302)&&l==="POST")l="GET",c=void 0,u.delete("content-length"),u.delete("content-type");d=f}}}function CFe(e){return{client_name:"Cerebriline",redirect_uris:[e],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none"}}function BP(e){return e?{client_id:e.clientId,...e.clientSecret?{client_secret:e.clientSecret}:{}}:void 0}function Qv(e,t){return e?.client_id===t?.client_id&&e?.client_secret===t?.client_secret}function Hm(e,t,n){if(!Qv(t.clientInformation,n))throw new su(e)}function HP(e){let t={};try{t=DP(e.serverName,{filePath:e.settingsPath})??{}}catch{t={}}let n,r,o=()=>e.clientInformation??t.clientInformation,i=e.clientInformation?{clientId:e.clientInformation.client_id,...e.clientInformation.client_secret?{clientSecret:e.clientInformation.client_secret}:{}}:null,s=async(d)=>{try{t=await $P(e.serverName,d,{filePath:e.settingsPath,expectedOAuthClient:i})}catch(l){if(e.settingsPath||l instanceof su)throw l;t=$m(d(t))??{}}};return{provider:{get redirectUrl(){return t.redirectUrl??e.redirectUrl},get clientMetadata(){return CFe(t.redirectUrl??e.redirectUrl)},state:()=>(r=kFe(),r),clientInformation:o,saveClientInformation:async(d)=>{let l=t.clientInformation;await s((c)=>{Hm(e.serverName,c,l);let u=!Qv(c.clientInformation,d);return{...c,clientInformation:d,...u?{tokens:void 0,lastAuthenticatedAt:void 0}:{},redirectUrl:e.redirectUrl,lastError:void 0}})},tokens:()=>o()?.client_id&&Qv(t.clientInformation,o())?t.tokens:void 0,saveTokens:async(d)=>{let l=Date.now(),c=o();if(!c?.client_id)throw Error("Cannot save MCP OAuth tokens without a client ID.");await s((u)=>{if(u.clientInformation||!e.clientInformation)Hm(e.serverName,u,c);return{...u,tokens:d,clientInformation:c,redirectUrl:e.redirectUrl,lastError:void 0,lastAuthenticatedAt:l}})},redirectToAuthorization:async(d)=>{n=d.toString(),await e.onAuthorizationUrl?.(n)},saveCodeVerifier:async(d)=>{let l=o();await s((c)=>(Hm(e.serverName,c,l),{...c,codeVerifier:d,redirectUrl:e.redirectUrl}))},codeVerifier:()=>{if(!t.codeVerifier)throw Error(`Missing OAuth code verifier for MCP server "${e.serverName}".`);return t.codeVerifier},invalidateCredentials:async(d)=>{let l=t.clientInformation;await s((c)=>{if(Hm(e.serverName,c,l),d==="all")return{lastError:c.lastError,redirectUrl:c.redirectUrl};return{...c,...d==="client"?{clientInformation:void 0}:{},...d==="tokens"?{tokens:void 0,lastAuthenticatedAt:void 0}:{},...d==="verifier"?{codeVerifier:void 0}:{},...d==="discovery"?{discoveryState:void 0}:{}}})},saveDiscoveryState:async(d)=>{let l=t.clientInformation;await s((c)=>(Hm(e.serverName,c,l),{...c,discoveryState:d}))},discoveryState:()=>t.discoveryState},getLastAuthorizationUrl:()=>n,getLastOAuthState:()=>r,resetInteractiveState:async()=>{await s((d)=>{let l=e.clientInformation,c=l!==void 0&&!Qv(d.clientInformation,l);return{...d,...l?{clientInformation:l}:{},...c?{tokens:void 0,lastAuthenticatedAt:void 0}:{},codeVerifier:void 0,discoveryState:void 0,lastError:void 0,redirectUrl:e.redirectUrl}})},markError:async(d)=>{await s((l)=>({...l,lastError:d}))},markConnectionError:async(d)=>{await s((l)=>({...l,lastError:d,authorizationRequired:void 0}))},markAuthorizationRequired:async(d)=>{await s((l)=>({...l,lastError:d,authorizationRequired:!0}))},clearError:async()=>{await s((d)=>({...d,lastError:void 0,authorizationRequired:void 0}))}}}function O5(e){let t=e.registration.transport;if(t.type==="stdio")throw Error(`MCP server "${e.registration.name}" uses stdio transport and does not support OAuth browser flow.`);let n=RFe({headers:t.headers,oauthProvider:e.oauthProvider,restrictConfiguredHeadersToOrigin:e.restrictConfiguredHeadersToOrigin}),r=n?{headers:n}:void 0,o=e.restrictConfiguredHeadersToOrigin&&n?IFe({endpointUrl:t.url,configuredHeaders:n,baseFetch:e.fetch}):e.fetch,i=e.oauthProvider?o:async(s,a)=>{let d=await(o??globalThis.fetch)(s,a);if(d.status===401)throw await d.body?.cancel().catch(()=>{return}),new M5("MCP server requires authorization");return d};if(t.type==="sse")return new TFe(new URL(t.url),{authProvider:e.oauthProvider,requestInit:r,eventSourceInit:{fetch:(s,a)=>(o??globalThis.fetch)(s,a)},fetch:i});return new xFe(new URL(t.url),{authProvider:e.oauthProvider,requestInit:r,fetch:i})}function WP(e){return e instanceof M5||e instanceof SFe&&e.code===401}var NFe="2024-11-05",B5=1e4,DFe=1e4,L5="http://127.0.0.1:1456/mcp/oauth/callback",N5=250,jP=2000;function sd(e){return e instanceof Error?e.message:String(e)}async function Zv(e,t){return new Promise((n)=>{let r=!1,o=(s)=>{if(r)return;r=!0,clearTimeout(i),n(s)},i=setTimeout(()=>o(!1),t);i.unref(),e.then(()=>o(!0),()=>o(!0))})}function $Fe(e,t,n){let r=sd(t),o=sd(n);if(r===o)return t instanceof Error?t:Error(r);return Error(`MCP server "${e}" failed to initialize. Newline-delimited attempt: ${r} Content-Length framed attempt: ${o}`)}function D5(e){return Buffer.from(`${JSON.stringify(e)}
1580
1580
  `,"utf8")}function $5(e){let t=Buffer.from(JSON.stringify(e),"utf8");return Buffer.concat([Buffer.from(`Content-Length: ${t.byteLength}\r
1581
1581
  \r
1582
1582
  `,"utf8"),t])}class qP{buffer="";decoder=new F5("utf8");push(e){this.buffer+=this.decoder.write(e);let t=[];while(!0){let n=this.buffer.indexOf(`\r
@@ -1584,7 +1584,7 @@ ${a}`:i.instructions}})}})}}class c5{watcher;ready;stopped=!1;constructor(e){thi
1584
1584
  `);if(n<0)break;let o=this.buffer.slice(0,n).match(/(?:^|\r\n)Content-Length:\s*(\d+)(?:\r\n|$)/i);if(!o)throw Error("Invalid MCP stdio frame: missing Content-Length header.");let i=Number.parseInt(o[1],10),s=n+4,a=s+i;if(this.buffer.length<a)break;t.push(this.buffer.slice(s,a)),this.buffer=this.buffer.slice(a)}return t}}class zP{buffer="";decoder=new F5("utf8");push(e){this.buffer+=this.decoder.write(e);let t=[];while(!0){let n=this.buffer.indexOf(`
1585
1585
  `);if(n<0)break;let r=this.buffer.slice(0,n).trim();if(this.buffer=this.buffer.slice(n+1),r.length>0)t.push(r)}return t}}class H5{registration;process;processClose;nextRequestId=1;pending=new Map;framedParser=new qP;newlineParser=new zP;stderrBuffer="";stdinFailure;stdinFailureTimer;connected=!1;protocolMode="newline";requestTimeoutMs;connectAttemptTimeoutMs;constructor(e){this.registration=e,this.requestTimeoutMs=Jv(e.timeoutSeconds),this.connectAttemptTimeoutMs=U5(e.timeoutSeconds)?this.requestTimeoutMs:B5}async connect(){if(this.connected)return;if(this.registration.transport.type!=="stdio")throw Error(`Unsupported MCP transport for "${this.registration.name}": ${this.registration.transport.type}`);let e={protocolVersion:NFe,capabilities:{},clientInfo:{name:"@cerebriline/core",version:"0.0.0"}};await this.ensureAgentPluginDataDirectory(),this.spawnProcess("newline");try{await this.request("initialize",e,this.connectAttemptTimeoutMs)}catch(t){await this.disconnect().catch(()=>{}),this.spawnProcess("framed");try{await this.request("initialize",e,this.connectAttemptTimeoutMs)}catch(n){throw await this.disconnect().catch(()=>{}),$Fe(this.registration.name,t,n)}}this.notify("notifications/initialized"),this.connected=!0}async ensureAgentPluginDataDirectory(){if(this.registration.metadata?.source!=="agent-plugin")return;let e=this.registration.metadata.pluginDataPath;if(typeof e!=="string"||e.length===0)return;await MFe(e,{recursive:!0})}async disconnect(){let e=this.process,t=this.processClose;if(this.connected=!1,this.process=void 0,this.processClose=void 0,this.clearStdinFailureTimer(),this.failAllPending(Error(`Disconnected from MCP server "${this.registration.name}".`)),!t)return;if(!e){if(!await Zv(t,jP))throw Error(`MCP process for "${this.registration.name}" did not close during disconnect.`);return}if(!e.stdin.destroyed)e.stdin.end();if(await Zv(t,N5))return;if(e.kill(),await Zv(t,jP))return;if(e.kill("SIGKILL"),!await Zv(t,jP))throw Error(`MCP process for "${this.registration.name}" did not exit during disconnect.`)}async listTools(){return((await this.request("tools/list")).tools??[]).filter((t)=>typeof t?.name==="string"&&typeof t.inputSchema==="object"&&t.inputSchema!==null).map((t)=>({name:t.name,description:t.description,inputSchema:t.inputSchema,...t.annotations?.readOnlyHint===!0?{readOnlyHint:!0}:{}}))}async callTool(e){return this.request("tools/call",{name:e.name,arguments:e.arguments??{}},void 0,e.context?.signal)}spawnProcess(e){let t=this.registration.transport;if(t.type!=="stdio")throw Error(`Unsupported MCP transport for "${this.registration.name}": ${t.type}`);this.framedParser=new qP,this.newlineParser=new zP,this.stderrBuffer="",this.stdinFailure=void 0,this.clearStdinFailureTimer(),this.protocolMode=e;let n=process.platform==="win32"?{windowsHide:!0,shell:!0}:{},r=PFe(t.command,t.args??[],{cwd:t.cwd,env:{...process.env,...t.env??{}},stdio:["pipe","pipe","pipe"],...n});this.process=r,this.processClose=new Promise((o)=>{r.once("close",()=>o())}),r.stdout.on("data",(o)=>this.handleStdout(o)),r.stderr.on("data",(o)=>{if(this.process!==r)return;if(this.stderrBuffer+=o.toString("utf8"),this.stderrBuffer.length>16384)this.stderrBuffer=this.stderrBuffer.slice(-16384)}),r.once("error",(o)=>{if(this.process!==r)return;this.failAllPending(Error(`MCP process error: ${sd(o)}`))}),r.stdin.on("error",(o)=>{if(this.process!==r)return;if(this.stdinFailure??=sd(o),this.stdinFailureTimer!==void 0)return;this.stdinFailureTimer=setTimeout(()=>{if(this.stdinFailureTimer=void 0,this.process!==r)return;this.failAllPending(Error(`MCP server "${this.registration.name}" stopped reading its input before the request was fully delivered (${this.stdinFailure}) and did not exit.`)),this.disconnect().catch(()=>{})},N5),this.stdinFailureTimer.unref()}),r.once("exit",(o,i)=>{if(this.process!==r)return;this.connected=!1,this.process=void 0,this.clearStdinFailureTimer();let s=this.stderrBuffer.trim()?` stderr: ${this.stderrBuffer.trim()}`:"";this.failAllPending(Error(`MCP process exited for "${this.registration.name}" (code=${o??"null"}, signal=${i??"null"}).${s}${this.describeStdinFailure()}`))})}handleStdout(e){try{let t=this.protocolMode==="framed"?this.framedParser.push(e):this.newlineParser.push(e);for(let n of t){let r=JSON.parse(n);if(typeof r.id!=="number")continue;let o=this.takePending(r.id);if(!o)continue;if(r.error){let i=r.error.message||`MCP request failed with code ${r.error.code??"unknown"}`;o.reject(Error(i));continue}o.resolve(r.result)}}catch(t){this.handleProtocolFailure(t)}}handleProtocolFailure(e){let t=this.process;if(!t)return;this.connected=!1,this.process=void 0;let n=this.stderrBuffer.trim()?` stderr: ${this.stderrBuffer.trim()}`:"";this.failAllPending(Error(`Invalid MCP response from "${this.registration.name}": ${sd(e)}.${n}`)),t.kill()}async request(e,t,n=this.requestTimeoutMs,r){let o=this.process;if(!o?.stdin.writable)throw Error(`MCP server "${this.registration.name}" is not connected.`);let i=this.nextRequestId++,s={jsonrpc:"2.0",id:i,method:e,...t?{params:t}:{}},a=new Promise((d,l)=>{let c=setTimeout(()=>{this.takePending(i),l(this.createTimeoutError(e,n))},n),u=r?()=>{let h=this.takePending(i);if(!h)return;let p=r.reason instanceof Error?r.reason:Object.assign(Error(`MCP request aborted for "${this.registration.name}" (${e}).`),{name:"AbortError"});h.reject(p)}:void 0;if(this.pending.set(i,{resolve:d,reject:l,timeout:c,signal:r,onAbort:u}),r&&u){if(r.addEventListener("abort",u,{once:!0}),r.aborted)u()}});if(!this.pending.has(i))return a;try{o.stdin.write(this.protocolMode==="framed"?$5(s):D5(s))}catch(d){let l=this.takePending(i);if(l)l.reject(d instanceof Error?d:Error(String(d)))}return a}createTimeoutError(e,t){return Error(OFe(this.registration.name,t,e)+this.describeStdinFailure())}clearStdinFailureTimer(){if(this.stdinFailureTimer!==void 0)clearTimeout(this.stdinFailureTimer),this.stdinFailureTimer=void 0}describeStdinFailure(){return this.stdinFailure===void 0?"":` The server stopped reading its input before the request was fully delivered (${this.stdinFailure}).`}notify(e,t){let n=this.process;if(!n?.stdin.writable)return;let r={jsonrpc:"2.0",method:e,...t?{params:t}:{}};n.stdin.write(this.protocolMode==="framed"?$5(r):D5(r))}failAllPending(e){for(let t of[...this.pending.keys()]){let n=this.takePending(t);if(!n)continue;n.reject(e)}}takePending(e){let t=this.pending.get(e);if(!t)return;if(this.pending.delete(e),clearTimeout(t.timeout),t.signal&&t.onAbort)t.signal.removeEventListener("abort",t.onAbort);return t}}class W5{registration;options;client;authContext;requestTimeoutMs;connectAttemptTimeoutMs;constructor(e,t){this.registration=e;this.options=t;this.requestTimeoutMs=Jv(e.timeoutSeconds),this.connectAttemptTimeoutMs=U5(e.timeoutSeconds)?this.requestTimeoutMs:DFe}async connect(){if(this.client)return;if(this.registration.transport.type==="stdio")throw Error(`Unsupported MCP transport for "${this.registration.name}": ${this.registration.transport.type}`);let e=HP({settingsPath:this.options.settingsPath,serverName:this.registration.name,redirectUrl:this.registration.oauth?.redirectUrl??L5,clientInformation:BP(this.registration.oauthClient)});this.authContext=e;let t=await e.provider.tokens()?e.provider:void 0,n;try{n=new LFe({name:this.options.clientName?.trim()||"@cerebriline/core",version:this.options.clientVersion?.trim()||"0.0.0"});let r=O5({registration:this.registration,oauthProvider:t,fetch:this.options.fetch,restrictConfiguredHeadersToOrigin:this.options.restrictConfiguredHeadersToOrigin});await n.connect(r,{timeout:this.connectAttemptTimeoutMs}),await e.clearError(),this.client=n}catch(r){await n?.close().catch(()=>{});let o=Bm(r,this.registration.name,this.connectAttemptTimeoutMs),i=WP(r),s=i?this.formatUnauthorizedMessage(e.getLastAuthorizationUrl()):sd(o);if(i&&!this.hasStaticAuthorizationHeader())await e.markAuthorizationRequired(s);else await e.markConnectionError(s);throw Error(s)}}async disconnect(){let e=this.client;this.client=void 0,await e?.close()}async listTools(){let e=await this.ensureConnectedClient();try{return(await e.listTools(void 0,{timeout:this.requestTimeoutMs})).tools.map((n)=>({name:n.name,description:n.description,inputSchema:n.inputSchema&&typeof n.inputSchema==="object"&&!Array.isArray(n.inputSchema)?n.inputSchema:{},...n.annotations?.readOnlyHint===!0?{readOnlyHint:!0}:{}}))}catch(t){return await this.handleOperationError(t)}}async callTool(e){let t=await this.ensureConnectedClient();try{return await t.callTool({name:e.name,arguments:e.arguments??{}},void 0,{timeout:this.requestTimeoutMs,signal:e.context?.signal})}catch(n){return await this.handleOperationError(n)}}async ensureConnectedClient(){if(!this.client)await this.connect();if(!this.client)throw Error(`MCP server "${this.registration.name}" is not connected.`);return this.client}formatUnauthorizedMessage(e){if(this.hasStaticAuthorizationHeader())return`MCP server "${this.registration.name}" rejected its configured Authorization header. Update or remove that header before connecting with OAuth.`;let t=`MCP server "${this.registration.name}" requires OAuth authorization.`;if(!e)return`${t} Run authorizeMcpServerOAuth for this server.`;return`${t} Run authorizeMcpServerOAuth for this server and complete this URL: ${e}`}hasStaticAuthorizationHeader(){let e=this.registration.transport;if(e.type==="stdio")return!1;return Object.keys(e.headers??{}).some((t)=>t.toLowerCase()==="authorization")}async handleOperationError(e){let t=this.authContext??HP({settingsPath:this.options.settingsPath,serverName:this.registration.name,redirectUrl:this.registration.oauth?.redirectUrl??L5,clientInformation:BP(this.registration.oauthClient)}),n=Bm(e,this.registration.name,this.requestTimeoutMs),r=WP(e),o=r?this.formatUnauthorizedMessage(t.getLastAuthorizationUrl()):sd(n);if(r&&!this.hasStaticAuthorizationHeader())await t.markAuthorizationRequired(o);else await t.markConnectionError(o);throw Error(o)}}function ek(e={}){return(t)=>t.transport.type==="stdio"?new H5(t):new W5(t,e)}UP();import{isMcpTimeoutConfigured as j5,resolveMcpTimeoutSeconds as q5}from"@cerebriline/shared";var FFe=5000;function br(){return Date.now()}function UFe(e){return e.map((t)=>({name:t.name,description:t.description,inputSchema:t.inputSchema,...t.readOnlyHint?{readOnlyHint:!0}:{}}))}class tk{toolsCacheTtlMs;clientFactory;servers=new Map;operationLocks=new Map;constructor(e){this.clientFactory=e.clientFactory,this.toolsCacheTtlMs=e.toolsCacheTtlMs??FFe}async registerServer(e){await this.runExclusive(e.name,async()=>{let t=this.servers.get(e.name);if(!t){this.servers.set(e.name,{registration:{...e},status:"disconnected",updatedAt:br()});return}let n=JSON.stringify(t.registration.transport)!==JSON.stringify(e.transport),r=j5(t.registration.timeoutSeconds)!==j5(e.timeoutSeconds)||q5(t.registration.timeoutSeconds)!==q5(e.timeoutSeconds);if(t.registration={...e},t.updatedAt=br(),n||r)await this.disconnectState(t),t.client=void 0,t.toolCache=void 0,t.toolCacheUpdatedAt=void 0})}async unregisterServer(e){await this.runExclusive(e,async()=>{let t=this.requireServer(e);await this.disconnectState(t),this.servers.delete(e)})}async connectServer(e){await this.runExclusive(e,async()=>{let t=this.requireServer(e);await this.connectState(t)})}async disconnectServer(e){await this.runExclusive(e,async()=>{let t=this.requireServer(e);await this.disconnectState(t)})}async setServerDisabled(e,t){await this.runExclusive(e,async()=>{let n=this.requireServer(e);if(n.registration={...n.registration,disabled:t},n.updatedAt=br(),t)await this.disconnectState(n)})}listServers(){return[...this.servers.values()].map((e)=>({name:e.registration.name,status:e.status,disabled:e.registration.disabled===!0,lastError:e.lastError,toolCount:e.toolCache?.length??0,updatedAt:e.updatedAt,metadata:e.registration.metadata})).sort((e,t)=>e.name.localeCompare(t.name))}async listTools(e){let t=this.requireServer(e),n=t.toolCacheUpdatedAt??0;if(t.toolCache&&br()-n<=this.toolsCacheTtlMs)return t.toolCache;return this.refreshTools(e)}async refreshTools(e){return this.runExclusive(e,async()=>{let t=this.requireServer(e),r=await(await this.ensureConnectedClient(t)).listTools(),o=UFe(r);return t.toolCache=o,t.toolCacheUpdatedAt=br(),t.updatedAt=br(),o})}async callTool(e){return this.runExclusive(e.serverName,async()=>{let t=this.requireServer(e.serverName),n=await this.ensureConnectedClient(t);return t.updatedAt=br(),n.callTool({name:e.toolName,arguments:e.arguments,context:e.context})})}async dispose(){let e=[...this.servers.keys()],t=[];for(let n of e)try{await this.unregisterServer(n)}catch(r){t.push(r)}if(t.length>0)throw AggregateError(t,"MCP manager dispose failed")}async ensureConnectedClient(e){if(await this.connectState(e),!e.client)throw Error(`MCP server "${e.registration.name}" does not have an initialized client.`);return e.client}async connectState(e){if(e.registration.disabled)throw Error(`MCP server "${e.registration.name}" is disabled and cannot be connected.`);if(e.status==="connected"&&e.client)return;e.status="connecting",e.updatedAt=br();let t=e.client;try{t??=await this.clientFactory(e.registration),e.client=t,await t.connect(),e.status="connected",e.lastError=void 0,e.updatedAt=br()}catch(n){throw await t?.disconnect().catch(()=>{}),e.status="disconnected",e.lastError=n instanceof Error?n.message:String(n),e.updatedAt=br(),n}}async disconnectState(e){if(!e.client){e.status="disconnected",e.updatedAt=br();return}try{await e.client.disconnect()}finally{e.status="disconnected",e.updatedAt=br()}}requireServer(e){let t=this.servers.get(e);if(!t)throw Error(`Unknown MCP server: ${e}`);return t}async runExclusive(e,t){let n=this.operationLocks.get(e)??Promise.resolve(),r,o=new Promise((s)=>{r=s}),i=n.catch(()=>{return}).then(()=>o);this.operationLocks.set(e,i),await n.catch(()=>{return});try{return await t()}finally{if(r?.(),this.operationLocks.get(e)===i)this.operationLocks.delete(e)}}}import{createHash as BFe}from"node:crypto";var z5=64,HFe=/[^a-zA-Z0-9_-]+/g,K5=8,WFe=1,jFe="mcp_tool";function qFe(e){return BFe("sha1").update(e).digest("hex").slice(0,K5)}function zFe(e){return e.replace(HFe,"_")}var nk=({serverName:e,toolName:t})=>{let n=`${e}__${t}`,r=zFe(n);if(r===n&&n.length<=z5)return n;let o=qFe(n),i=z5-WFe-K5;return`${r.slice(0,i)||jFe}_${o}`};import{createTool as KFe}from"@cerebriline/shared";function GFe(e,t){let n=t.description?.trim(),r=`From the "${e}" MCP server.`;return n?`${n}
1586
1586
 
1587
- ${r}`:`Execute MCP tool "${t.name}". ${r}`}async function KP(e){let t=await e.provider.listTools(e.serverName),n=e.nameTransform??nk;return t.map((r)=>{let o=n({serverName:e.serverName,toolName:r.name});return KFe({name:o,resultPolicy:"cache-oversized",description:GFe(e.serverName,r),inputSchema:r.inputSchema,source:"mcp",readOnly:r.readOnlyHint===!0,timeoutMs:e.timeoutMs,retryable:e.retryable,maxRetries:e.maxRetries,execute:async(i,s)=>e.provider.callTool({serverName:e.serverName,toolName:r.name,arguments:i&&typeof i==="object"&&!Array.isArray(i)?i:void 0,context:s})})})}import{isCodeIndexWorkspace as xft}from"@cerebriline/shared";import{DEFAULT_LIBRARY_SETTINGS as fft}from"@cerebriline/shared";import{resolveClineDataDir as yft}from"@cerebriline/shared/storage";function rk(e,t){if(!e)return;if(!t)return e;return{available:(n)=>e.available(n),search:(n,r,o)=>e.search(n,r,o,{readFile:async(i)=>(await t.read(i)).toString("utf8")})}}function ok(e){if(!e)return;return{canAdmit:e.can_admit!==!1,headroomSessions:typeof e.headroom_sessions==="number"?e.headroom_sessions:-1,reason:e.reason??""}}var VFe=2000;function YFe(e,t){return new Promise((n)=>{if(e<=0||t?.aborted){n();return}let r=()=>{clearTimeout(o),n()},o=setTimeout(()=>{t?.removeEventListener("abort",r),n()},e);t?.addEventListener("abort",r,{once:!0})})}function G5(e){let t=Math.max(0,e.holdRetryMs??VFe),n=e.sleep??YFe,r=e.logger,o,i=!0,s="",a=0,d=[],l=()=>{d.shift()?.()},c=async(u)=>{let h,p=new Promise((f)=>{if(h=f,h)d.push(h)});await Promise.race([p,n(t,u)]);let m=h?d.indexOf(h):-1;if(m>=0)d.splice(m,1)};return{acquire:async(u)=>{for(;;){if(u?.aborted)throw Error("Admission wait cancelled");if(o===void 0){i=!1;let h;try{h=await e.capacity()}catch(p){r?.log?.("PolyKV capacity could not be read; admitting without it",{severity:"warn",error:p instanceof Error?p.message:String(p)}),h=void 0}if(h===void 0)o=Number.POSITIVE_INFINITY,s="capacity unavailable; not holding";else if(!h.canAdmit){s=h.reason,r?.log?.("PolyKV is holding the round",{severity:"info",reason:h.reason,headroomSessions:h.headroomSessions}),await c(u);continue}else s=h.reason,o=h.headroomSessions<0?Number.POSITIVE_INFINITY:Math.max(1,h.headroomSessions)}if(o>0)return o-=1,a+=1,{reason:s};o=void 0,await c(u)}},canAdmitMore:async()=>{if(o!==void 0&&o>0)return!0;if(!i)return!1;i=!1;let u;try{u=await e.capacity()}catch{return o=Number.POSITIVE_INFINITY,!0}if(u===void 0)return o=Number.POSITIVE_INFINITY,s="capacity unavailable; not holding",!0;if(!u.canAdmit)return s=u.reason,o=void 0,!1;return s=u.reason,o=u.headroomSessions<0?Number.POSITIVE_INFINITY:Math.max(1,u.headroomSessions),o>0},tryAcquire:async()=>{if(o!==void 0&&o>0)return o-=1,a+=1,{reason:s};if(!i)return;i=!1;let u;try{u=await e.capacity()}catch(h){r?.log?.("PolyKV capacity could not be read; admitting without it",{severity:"warn",error:h instanceof Error?h.message:String(h)}),u=void 0}if(u===void 0)o=Number.POSITIVE_INFINITY,s="capacity unavailable; not holding";else if(!u.canAdmit){s=u.reason,o=void 0;return}else s=u.reason,o=u.headroomSessions<0?Number.POSITIVE_INFINITY:Math.max(1,u.headroomSessions);if(o>0)return o-=1,a+=1,{reason:s};o=void 0;return},release:()=>{if(a>0)a-=1;i=!0,l()}}}import{access as oUe}from"node:fs/promises";import{createTool as iUe,validateWithZod as sUe,zodToJsonSchema as aUe}from"@cerebriline/shared";import{resolveAgentConfigSearchPaths as dUe}from"@cerebriline/shared/storage";import{z as Dn}from"zod";import{mkdir as XFe,writeFile as JFe}from"node:fs/promises";import{basename as QFe,dirname as ZFe,join as eUe,resolve as V5}from"node:path";import{agentFileName as tUe,renderAgentFile as nUe,validateAgentFields as rUe}from"@cerebriline/shared";async function Y5(e){rUe(e.agent);let t=eUe(e.directory,tUe(e.agent.name));if(ZFe(V5(t))!==V5(e.directory))throw Error(`"${e.agent.name}" is not a usable agent name.`);let n=await e.fileExists(t);if(n&&!e.overwrite)throw Error(`An agent already exists at ${QFe(t)}. Pass overwrite to replace it, or choose another name.`);return await XFe(e.directory,{recursive:!0}),await JFe(t,nUe(e.agent),"utf-8"),{path:t,overwritten:n}}var X5=Dn.object({name:Dn.string().trim().min(1).describe("Short identifier for the agent, e.g. 'network-troubleshooting'. Becomes the file name and the name the lead model refers to it by."),description:Dn.string().trim().min(1).describe("One line saying what this agent is for. This is the only thing read when choosing which agent to hand work to, so say when to use it, not just what it is."),systemPrompt:Dn.string().trim().min(1).describe("The agent's own system prompt: who it is, how it works, what it must not do. Written to the body of the file."),scope:Dn.enum(["workspace","global"]).optional().describe("'workspace' writes to .cline/agents in this project (default); 'global' writes to the Cline data directory so every project sees it."),profile:Dn.string().trim().optional().describe("A saved API configuration profile the agent runs on, by name. Use this to run an agent on a different model from the session's."),providerId:Dn.string().trim().optional(),modelId:Dn.string().trim().optional(),tools:Dn.array(Dn.string()).optional().describe("Restrict the agent to these tools. Omit to give it the session's toolset."),skills:Dn.array(Dn.string()).optional().describe("Restrict the agent to these skills, by name. Omit to give it all of them."),maxIterations:Dn.number().int().positive().optional(),overwrite:Dn.boolean().optional().describe("Replace an agent of the same name. Without this, an existing agent is left alone and an error says so.")});async function lUe(e){try{return await oUe(e),!0}catch{return!1}}function J5(e){return iUe({name:"create_agent",description:"Create a Cline agent the user can delegate work to. Agents are markdown files with YAML frontmatter; each one becomes a subagent_<name> tool and can run on its own model. Use this when the user asks for an agent, a specialist, or a helper for a kind of task.",inputSchema:aUe(X5),execute:async(n)=>{let r=sUe(X5,n),o=r.scope??"workspace",i=dUe(e.workspaceRoot),s=e.workspaceRoot&&i.length>1?i[0]:void 0,a=i[i.length-1],d=o==="global"?a:s;if(!d)throw Error("There is no workspace open, so a workspace agent has nowhere to go. Use scope 'global' instead.");let l={name:r.name,description:r.description,systemPrompt:r.systemPrompt,profile:r.profile,providerId:r.providerId,modelId:r.modelId,tools:r.tools,skills:r.skills,maxIterations:r.maxIterations},c=await Y5({directory:d,agent:l,overwrite:r.overwrite,fileExists:lUe});return{path:c.path,name:r.name.trim(),scope:o,overwritten:c.overwritten,note:"Agent files are loaded when a session starts, so this agent becomes available in the next session rather than this one."}},timeoutMs:15000,retryable:!1})}import{validateWithZod as cUe,zodToJsonSchema as uUe}from"@cerebriline/shared";var hUe=new Set(["check_file","ask_lsp","list_files"]),Q5="ask_question";function pUe(e,t){let n=["This agent stopped to ask a question instead of finishing its task. Nothing was asked of the user.","",`Question: ${e.trim()}`];if(t.length>0)n.push("Options:",...t.map((r)=>`- ${r}`));return n.push("","Answer it by running the agent again with the answer in its task, answer it yourself if you can, or ask the user with `ask_question` if only they know."),n.join(`
1587
+ ${r}`:`Execute MCP tool "${t.name}". ${r}`}async function KP(e){let t=await e.provider.listTools(e.serverName),n=e.nameTransform??nk;return t.map((r)=>{let o=n({serverName:e.serverName,toolName:r.name});return KFe({name:o,resultPolicy:"cache-oversized",description:GFe(e.serverName,r),inputSchema:r.inputSchema,source:"mcp",readOnly:r.readOnlyHint===!0,timeoutMs:e.timeoutMs,retryable:e.retryable,maxRetries:e.maxRetries,execute:async(i,s)=>e.provider.callTool({serverName:e.serverName,toolName:r.name,arguments:i&&typeof i==="object"&&!Array.isArray(i)?i:void 0,context:s})})})}import{isCodeIndexWorkspace as Eft}from"@cerebriline/shared";import{DEFAULT_LIBRARY_SETTINGS as yft}from"@cerebriline/shared";import{resolveClineDataDir as bft}from"@cerebriline/shared/storage";function rk(e,t){if(!e)return;if(!t)return e;return{available:(n)=>e.available(n),search:(n,r,o)=>e.search(n,r,o,{readFile:async(i)=>(await t.read(i)).toString("utf8")})}}function ok(e){if(!e)return;return{canAdmit:e.can_admit!==!1,headroomSessions:typeof e.headroom_sessions==="number"?e.headroom_sessions:-1,reason:e.reason??""}}var VFe=2000;function YFe(e,t){return new Promise((n)=>{if(e<=0||t?.aborted){n();return}let r=()=>{clearTimeout(o),n()},o=setTimeout(()=>{t?.removeEventListener("abort",r),n()},e);t?.addEventListener("abort",r,{once:!0})})}function G5(e){let t=Math.max(0,e.holdRetryMs??VFe),n=e.sleep??YFe,r=e.logger,o,i=!0,s="",a=0,d=[],l=()=>{d.shift()?.()},c=async(u)=>{let h,p=new Promise((f)=>{if(h=f,h)d.push(h)});await Promise.race([p,n(t,u)]);let m=h?d.indexOf(h):-1;if(m>=0)d.splice(m,1)};return{acquire:async(u)=>{for(;;){if(u?.aborted)throw Error("Admission wait cancelled");if(o===void 0){i=!1;let h;try{h=await e.capacity()}catch(p){r?.log?.("PolyKV capacity could not be read; admitting without it",{severity:"warn",error:p instanceof Error?p.message:String(p)}),h=void 0}if(h===void 0)o=Number.POSITIVE_INFINITY,s="capacity unavailable; not holding";else if(!h.canAdmit){s=h.reason,r?.log?.("PolyKV is holding the round",{severity:"info",reason:h.reason,headroomSessions:h.headroomSessions}),await c(u);continue}else s=h.reason,o=h.headroomSessions<0?Number.POSITIVE_INFINITY:Math.max(1,h.headroomSessions)}if(o>0)return o-=1,a+=1,{reason:s};o=void 0,await c(u)}},canAdmitMore:async()=>{if(o!==void 0&&o>0)return!0;if(!i)return!1;i=!1;let u;try{u=await e.capacity()}catch{return o=Number.POSITIVE_INFINITY,!0}if(u===void 0)return o=Number.POSITIVE_INFINITY,s="capacity unavailable; not holding",!0;if(!u.canAdmit)return s=u.reason,o=void 0,!1;return s=u.reason,o=u.headroomSessions<0?Number.POSITIVE_INFINITY:Math.max(1,u.headroomSessions),o>0},tryAcquire:async()=>{if(o!==void 0&&o>0)return o-=1,a+=1,{reason:s};if(!i)return;i=!1;let u;try{u=await e.capacity()}catch(h){r?.log?.("PolyKV capacity could not be read; admitting without it",{severity:"warn",error:h instanceof Error?h.message:String(h)}),u=void 0}if(u===void 0)o=Number.POSITIVE_INFINITY,s="capacity unavailable; not holding";else if(!u.canAdmit){s=u.reason,o=void 0;return}else s=u.reason,o=u.headroomSessions<0?Number.POSITIVE_INFINITY:Math.max(1,u.headroomSessions);if(o>0)return o-=1,a+=1,{reason:s};o=void 0;return},release:()=>{if(a>0)a-=1;i=!0,l()}}}import{access as oUe}from"node:fs/promises";import{createTool as iUe,validateWithZod as sUe,zodToJsonSchema as aUe}from"@cerebriline/shared";import{resolveAgentConfigSearchPaths as dUe}from"@cerebriline/shared/storage";import{z as Dn}from"zod";import{mkdir as XFe,writeFile as JFe}from"node:fs/promises";import{basename as QFe,dirname as ZFe,join as eUe,resolve as V5}from"node:path";import{agentFileName as tUe,renderAgentFile as nUe,validateAgentFields as rUe}from"@cerebriline/shared";async function Y5(e){rUe(e.agent);let t=eUe(e.directory,tUe(e.agent.name));if(ZFe(V5(t))!==V5(e.directory))throw Error(`"${e.agent.name}" is not a usable agent name.`);let n=await e.fileExists(t);if(n&&!e.overwrite)throw Error(`An agent already exists at ${QFe(t)}. Pass overwrite to replace it, or choose another name.`);return await XFe(e.directory,{recursive:!0}),await JFe(t,nUe(e.agent),"utf-8"),{path:t,overwritten:n}}var X5=Dn.object({name:Dn.string().trim().min(1).describe("Short identifier for the agent, e.g. 'network-troubleshooting'. Becomes the file name and the name the lead model refers to it by."),description:Dn.string().trim().min(1).describe("One line saying what this agent is for. This is the only thing read when choosing which agent to hand work to, so say when to use it, not just what it is."),systemPrompt:Dn.string().trim().min(1).describe("The agent's own system prompt: who it is, how it works, what it must not do. Written to the body of the file."),scope:Dn.enum(["workspace","global"]).optional().describe("'workspace' writes to .cline/agents in this project (default); 'global' writes to the Cline data directory so every project sees it."),profile:Dn.string().trim().optional().describe("A saved API configuration profile the agent runs on, by name. Use this to run an agent on a different model from the session's."),providerId:Dn.string().trim().optional(),modelId:Dn.string().trim().optional(),tools:Dn.array(Dn.string()).optional().describe("Restrict the agent to these tools. Omit to give it the session's toolset."),skills:Dn.array(Dn.string()).optional().describe("Restrict the agent to these skills, by name. Omit to give it all of them."),maxIterations:Dn.number().int().positive().optional(),overwrite:Dn.boolean().optional().describe("Replace an agent of the same name. Without this, an existing agent is left alone and an error says so.")});async function lUe(e){try{return await oUe(e),!0}catch{return!1}}function J5(e){return iUe({name:"create_agent",description:"Create a Cline agent the user can delegate work to. Agents are markdown files with YAML frontmatter; each one becomes a subagent_<name> tool and can run on its own model. Use this when the user asks for an agent, a specialist, or a helper for a kind of task.",inputSchema:aUe(X5),execute:async(n)=>{let r=sUe(X5,n),o=r.scope??"workspace",i=dUe(e.workspaceRoot),s=e.workspaceRoot&&i.length>1?i[0]:void 0,a=i[i.length-1],d=o==="global"?a:s;if(!d)throw Error("There is no workspace open, so a workspace agent has nowhere to go. Use scope 'global' instead.");let l={name:r.name,description:r.description,systemPrompt:r.systemPrompt,profile:r.profile,providerId:r.providerId,modelId:r.modelId,tools:r.tools,skills:r.skills,maxIterations:r.maxIterations},c=await Y5({directory:d,agent:l,overwrite:r.overwrite,fileExists:lUe});return{path:c.path,name:r.name.trim(),scope:o,overwritten:c.overwritten,note:"Agent files are loaded when a session starts, so this agent becomes available in the next session rather than this one."}},timeoutMs:15000,retryable:!1})}import{validateWithZod as cUe,zodToJsonSchema as uUe}from"@cerebriline/shared";var hUe=new Set(["check_file","ask_lsp","list_files"]),Q5="ask_question";function pUe(e,t){let n=["This agent stopped to ask a question instead of finishing its task. Nothing was asked of the user.","",`Question: ${e.trim()}`];if(t.length>0)n.push("Options:",...t.map((r)=>`- ${r}`));return n.push("","Answer it by running the agent again with the answer in its task, answer it yourself if you can, or ask the user with `ask_question` if only they know."),n.join(`
1588
1588
  `)}function mUe(){return{name:Q5,description:"Ask the agent that started you a question, when you cannot finish the task without an answer. This ends your run: your question, with 2-5 options, is your report, and the lead decides what happens next -- it may run you again with the answer. Ask only what you cannot find out with your tools. Output: none you will see; the call is the last thing you do.",inputSchema:uUe(ia),lifecycle:{completesRun:!0},retryable:!1,maxRetries:0,execute:async(e)=>{let t=cUe(ia,e);return pUe(t.question,t.options)}}}function Wm(e,t){let n=(t??[]).filter((i)=>hUe.has(i.name)),r=new Set(n.map((i)=>i.name));return[...e.filter((i)=>!r.has(i.name)),...n].map((i)=>i.name===Q5?mUe():i)}import{appendFileSync as xUe,existsSync as lu,mkdirSync as oY,readdirSync as _Ue,readFileSync as VP,renameSync as iY,statSync as EUe,writeFileSync as sY}from"node:fs";import{join as YP}from"node:path";import{resolveTeamDataDir as AUe}from"@cerebriline/shared/storage";import{existsSync as fUe,mkdirSync as gUe}from"node:fs";import{join as yUe}from"node:path";import{safeJsonParse as rY}from"@cerebriline/shared";import{loadSqliteDb as wUe,nowIso as au}from"@cerebriline/shared/db";import{resolveDbDataDir as bUe}from"@cerebriline/shared/storage";function vUe(){return bUe()}function kUe(e){let t=rY(e);if(!Array.isArray(t))return[];let n=[];for(let r of t){if(!r||typeof r!=="object")continue;let o=r,{agentId:i,rolePrompt:s}=o;if(typeof i!=="string"||!i.trim())continue;if(typeof s!=="string"||!s.trim())continue;let a={agentId:i.trim(),rolePrompt:s};if(typeof o.modelId==="string"&&o.modelId.trim())a.modelId=o.modelId.trim();if(typeof o.maxIterations==="number"&&Number.isFinite(o.maxIterations))a.maxIterations=Math.max(1,Math.floor(o.maxIterations));if(typeof o.temperature==="number"&&Number.isFinite(o.temperature)&&o.temperature>=0)a.temperature=o.temperature;if(typeof o.seed==="number"&&Number.isInteger(o.seed))a.seed=o.seed;if(o.seedRandom===!0)a.seedRandom=!0;if(typeof o.temperatureBase==="number"&&Number.isFinite(o.temperatureBase)&&o.temperatureBase>=0)a.temperatureBase=o.temperatureBase;if(typeof o.temperatureRange==="number"&&Number.isFinite(o.temperatureRange)&&o.temperatureRange>=0&&o.temperatureRange<=100)a.temperatureRange=o.temperatureRange;n.push(a)}return n}var Z5=ps,GP=2000,TUe=2592000000,eY=["agent_event","run_progress"],tY=2,SUe=["team_tasks","team_runs","team_outcomes","team_outcome_fragments","team_mailbox","team_mission_log"];function du(e){if(e===void 0||e===null)return null;let t=e instanceof Date?e:new Date(e);return Number.isNaN(t.getTime())?null:t.toISOString()}function jm(e,t){if(typeof e!=="string"||e.length===0)return t;return rY(e)??t}var qm=(e)=>typeof e==="string"?e:"";function nY(e){return{teamId:e.teamId,teamName:e.teamName,reset:!0,members:e.members,tasks:e.tasks,mailbox:e.mailbox,missionLog:e.missionLog,runs:e.runs,outcomes:e.outcomes,outcomeFragments:e.outcomeFragments}}class ik{teamDirPath;db;retentionPerTeam;retentionMs;constructor(e={}){this.teamDirPath=e.teamDir??vUe(),this.retentionPerTeam=e.eventRetentionPerTeam??GP,this.retentionMs=e.eventRetentionMs??TUe}init(){this.getRawDb()}close(){this.db?.close?.(),this.db=void 0}ensureTeamDir(){if(!fUe(this.teamDirPath))gUe(this.teamDirPath,{recursive:!0});return this.teamDirPath}dbPath(){return yUe(this.ensureTeamDir(),"teams.db")}getRawDb(){if(this.db)return this.db;let e=wUe(this.dbPath());return this.ensureSchema(e),this.db=e,e}ensureSchema(e){if(e.exec("PRAGMA journal_mode = WAL;"),e.exec("PRAGMA busy_timeout = 5000;"),e.exec(`
1589
1589
  CREATE TABLE IF NOT EXISTS team_store_schema_version (
1590
1590
  lock INTEGER PRIMARY KEY CHECK (lock = 1),
@@ -1758,7 +1758,7 @@ ${r}`:`Execute MCP tool "${t.name}". ${r}`}async function KP(e){let t=await e.pr
1758
1758
  `).filter(Boolean),r=[],o=0;for(let s=n.length-1;s>=0&&r.length<GP;s--){let a=n[s];if(o+=Buffer.byteLength(a,"utf8")+1,o>aY/2&&r.length>0)break;r.push(a)}r.reverse();let i=`${e}.tmp`;sY(i,`${r.join(`
1759
1759
  `)}
1760
1760
  `,"utf8"),iY(i,e)}persistRuntime(e,t,n){this.ensureTeamSubdir(e);let r={version:1,updatedAt:dY(),teamState:{...t,runs:t.runs.map((s)=>({...s,result:Lo(s.result)}))},teammates:n},o=this.statePath(e),i=`${o}.tmp`;sY(i,`${JSON.stringify(r,null,2)}
1761
- `,"utf8"),iY(i,o)}markInProgressRunsInterrupted(e,t){let n=this.readEnvelope(e);if(!n?.teamState?.runs?.length)return[];let r=n.teamState.runs.filter((i)=>i.status==="queued"||i.status==="running").map((i)=>i.id);if(r.length===0)return[];let o=new Date;return n.teamState={...n.teamState,runs:n.teamState.runs.map((i)=>i.status==="queued"||i.status==="running"?{...i,status:"interrupted",error:t,endedAt:o}:i)},this.persistRuntime(e,n.teamState,n.teammates),r}ensureTeamDir(){if(!lu(this.teamDirPath))oY(this.teamDirPath,{recursive:!0});return this.teamDirPath}ensureTeamSubdir(e){let t=YP(this.ensureTeamDir(),wn(e));if(!lu(t))oY(t,{recursive:!0});return t}statePath(e){return YP(this.ensureTeamDir(),wn(e),"state.json")}historyPath(e){return YP(this.ensureTeamDir(),wn(e),"task-history.jsonl")}readEnvelope(e){let t=this.statePath(e);if(!lu(t))return;try{let n=JSON.parse(VP(t,"utf8"));if(n?.version===1&&n.teamState)return n}catch{}return}}function lY(e={}){try{let t=new ik(e);return t.init(),t}catch{let t=new sk({teamDir:e.teamDir});return t.init(),t}}import{chmodSync as RUe,existsSync as XP}from"node:fs";import{join as JP}from"node:path";function ak(e){if(!e)return;if(process.platform==="win32"){let t=JP(e,"cerebriline-sandbox.exe"),n=JP(e,"hook.dll");if(!XP(t)||!XP(n))return;return{launcher:t,hook:n,platforms:["win32"]}}if(process.platform==="linux")return cY(e,"","linux");if(process.platform==="darwin")return cY(e,"darwin-","darwin");return}function cY(e,t,n){let r={x64:"x64",arm64:"arm64"}[process.arch],i=(r?[`cerebriline-sandbox-${t}${r}`,"cerebriline-sandbox"]:["cerebriline-sandbox"]).map((s)=>JP(e,s)).find(XP);if(!i)return;try{RUe(i,493)}catch{}return{launcher:i,hook:i,platforms:[n]}}var IUe=300,CUe=60000,uY=5000;class QP{opts;pendingEvents=[];teammatesDirty=!1;timer;lastFlushAt=0;disposed=!1;constructor(e){this.opts={batchMs:IUe,telemetryFlushMs:CUe,now:Date.now,...e}}onEvent(e){if(this.disposed)return;if(!Ti(e)){if(this.opts.now()-this.lastFlushAt>=this.opts.telemetryFlushMs)this.schedule();return}if(this.pendingEvents.push({type:e.type,payload:ys(e)}),WC(e)){this.flush();return}this.schedule()}markTeammatesDirty(){this.teammatesDirty=!0}markStateDirty(){if(this.disposed)return;this.schedule()}flush(){this.clearTimer();let e=this.opts.source();if(!e)return;if(!e.hasPendingStateDelta()&&this.pendingEvents.length===0&&!this.teammatesDirty)return;let n=this.pendingEvents,r=this.teammatesDirty;this.pendingEvents=[],this.teammatesDirty=!1;let o=e.drainStateDelta();try{this.opts.store.persistBatch(this.opts.teamKey,{events:n,delta:o,teammates:this.opts.teammates(),getFullState:()=>e.exportState()}),this.lastFlushAt=this.opts.now()}catch(i){e.requeueStateDelta(o);let s=n.concat(this.pendingEvents);if(this.pendingEvents=s.length>uY?s.slice(-uY):s,this.teammatesDirty=this.teammatesDirty||r,!this.disposed)this.schedule();try{this.opts.onError?.(i)}catch{}}}dispose(){if(this.disposed)return;this.disposed=!0,this.flush()}schedule(){if(this.timer)return;this.timer=setTimeout(()=>{this.timer=void 0,this.flush()},this.opts.batchMs),this.timer.unref?.()}clearTimer(){if(this.timer)clearTimeout(this.timer),this.timer=void 0}}function dk(e,t){return NUe(e,t)}function pY(e,t){let n=t?.["*"]??{},r=t?.[e]??{};return{...n,...r}.enabled!==!1}function FUe(e,t){return e.filter((n)=>pY(n.name,t))}function ck(e,t){return Mi(FUe(e,t))}function UUe(e){if(e?.readLimitEnabled===!1)return Number.POSITIVE_INFINITY;let t=e?.readLimitChars;return typeof t==="number"&&Number.isFinite(t)&&t>0?Math.floor(t):void 0}function BUe(e,t){if(!t?.length)return e;let n={...e??{}};for(let r of t){let o=r.trim();if(!o)continue;n[o]={...n[o]??{},enabled:!1}}return n}var HUe={apply_diff:"editor",attempt_completion:"submit_and_exit",bash:"run_commands",execute_command:"run_commands",list_code_definition_names:"search_codebase",list_files:"run_commands",read_file:"read_files",replace_in_file:"editor",search_files:"search_codebase",use_skill:"skills",write_to_file:"editor"};function WUe(e){let t=e.trim().toLowerCase();return HUe[t]??t}function jUe(e,t){if(t.tools===void 0)return e;let n=new Set(t.tools.map(WUe));if(t.skills!==void 0)n.add("skills");return e.filter((r)=>n.has(r.name))}function qUe(){return`team-${$Ue(5)}`}function uk(e,t,n,r,o,i,s,a,d,l,c,u,h,p,m,f){let g=So[xo({mode:n})],y=Nw(t,r,n,o??Lw);return ck(qp({cwd:e,telemetry:d,qaCredentials:l,executorOptions:p?.workspace?{...p.workspace.executorOptions,...m?{extractDocument:m}:{},...h!==void 0?{fileRead:{maxReadChars:h}}:{}}:{bash:{executionController:c,...f?{wrapSpawn:f}:{}},...u?{receipts:u}:{},...m?{extractDocument:m}:{},...h!==void 0?{fileRead:{maxReadChars:h}}:{}},...g,enableSkills:!!s,...y,enableExtractDocument:g.enableExtractDocument===!0&&pY(le.EXTRACT_DOCUMENT,i),...p&&!p.workspace?.allowCommands?{enableBash:!1}:{},executors:{...s?{skills:s}:{},...p?.workspace?a?.semanticSearch?{semanticSearch:rk(a.semanticSearch,p.workspace.executorOptions.overlay)}:{}:a??{}}}),i)}function zUe(e){return uk(e.cwd,e.providerId,e.mode,e.modelId,e.toolRoutingRules,e.toolPolicies,KUe,e.toolExecutors).some((t)=>t.name==="skills")}var KUe=async()=>"";async function GUe(e){let t=Gr(),n=e.includeSettings&&Fm({filePath:t});if(!n&&!e.agentPluginServers?.length)return{tools:[]};let r=ek({settingsPath:t}),o=ek({restrictConfiguredHeadersToOrigin:!0}),i=new tk({clientFactory:(u)=>u.metadata?.source==="agent-plugin"?o(u):r(u)}),s=[];if(n)try{s=await FP(i,{filePath:t})}catch(u){let h=u instanceof Error?u.message:String(u);e.logger?.log(`[mcp] Failed to load MCP settings, skipping settings-backed MCP tools: ${h}`)}let a=new Set(s.map((u)=>u.name));for(let u of e.agentPluginServers??[]){let h=u.registration;if(a.has(h.name)){e.logger?.log(`[agent-plugins] MCP server '${h.name}' conflicts with an existing server and was skipped.`,{severity:"error"});continue}try{await i.registerServer(h),s.push(h),a.add(h.name)}catch(p){let m=p instanceof Error?p.message:String(p);e.logger?.log(`[agent-plugins] Failed to register MCP server '${h.name}', skipping: ${m}`,{severity:"error"})}}if(s.length===0)return await i.dispose().catch(()=>{}),{tools:[]};let d=s.filter((u)=>u.disabled!==!0),l=await Promise.allSettled(d.map((u)=>KP({serverName:u.name,provider:i,timeoutMs:DUe(u.timeoutSeconds)*1000}))),c=[];for(let[u,h]of l.entries())if(h.status==="fulfilled")c.push(...h.value);else{let p=h.reason instanceof Error?h.reason.message:String(h.reason);e.logger?.log(`[mcp] Failed to load tools from MCP server "${d[u].name}", skipping: ${p}`)}return{tools:c,shutdown:async()=>{await i.dispose()}}}function lk(e){return`configured:${e}`}function ZP(e){return`teammate:${e}`}function VUe(e){return{handBack:(t)=>e().handBack(ZP(t),t),release:async(t)=>{await e().close(ZP(t),t)}}}function YUe(e,t){if(!e)return;try{e.cancelOutstandingWork(`${e0}${t}`)}catch{}for(let n of e.getTeammateIds())try{e.shutdownTeammate(n,`${e0}${t}`)}catch{}}var e0="runtime_shutdown:";function XUe(e){if(e===void 0)return!1;if(e.startsWith(e0))return!0;switch(e){case"session_stop":case"session_complete":case"session_error":case"session_manager_dispose":case"cli_run_shutdown":case"cli_interactive_shutdown":case"cli_interactive_startup_cancelled":case"provider_change":case"acp_shutdown":case"hub_server_stop":case"vscode_webview_dispose":return!0;default:return!1}}function Ts(e){return $C({providerId:e.providerId,modelId:e.modelId,agentNodes:(e.agentNodes??[]).map((t)=>({...t,connection:t.connection})),polykvAgentsPriorityZero:e.polykvAgentsPriorityZero,overflowCapacity:e.maxConcurrentAgents,lead:{apiKey:e.apiKey,baseUrl:e.baseUrl,headers:e.headers,providerConfig:e.providerConfig,knownModels:e.knownModels,thinking:e.thinking,reasoningEffort:e.reasoningEffort,thinkingBudgetTokens:e.thinkingBudgetTokens,maxTokensPerTurn:e.maxTokensPerTurn,maxToolResultChars:e.maxToolResultChars,staleReadRewrites:e.staleReadRewrites,toolResultFormat:e.toolResultFormat,temperature:e.temperature}})}function JUe(e){let t=new Set(e.offered),n=["spawn_agent","spawn_swarm"].filter((d)=>!t.has(d));if(n.length===0)return{};let r;if(!e.subagentsEnabled)r="sub-agents are switched off in this session's settings.";else if(e.serialised)r=`${e.multipleNodes?"every configured node serves 1 request at a time":"this endpoint serves 1 request at a time"}, so a spawned agent would run after you rather than beside you.`;else return{};let o=e.offered.filter((d)=>d.startsWith("subagent_")),i=o.length>0?`Do the work yourself, or hand one job at a time to a configured agent: ${o.join(", ")}.`:"Do the work yourself.",s=e.subagentsEnabled?`Only the user can change this, by raising the profile's parallel sessions${e.multipleNodes?" or a node's capacity":""}.`:"Only the user can change this, in the settings.",a={};for(let d of n)a[d]=`${r} ${i} Do not call ${d} again in this session; it will be refused the same way. ${s}`;return a}function QUe(e){let t=So[xo({mode:e.mode})];return{sessionId:e.sessionId||"",mode:e.mode==="plan"?"plan":e.mode==="yolo"?"yolo":"act",enableTools:e.enableTools!==!1,enableSpawnAgent:e.enableSpawnAgent??t.enableSpawnAgent??!0,enableAgentTeams:ms({maxConcurrentAgents:e.maxConcurrentAgents,nodes:Ts(e)})&&e.enableAgentTeams===!0,disableMcpSettingsTools:e.disableMcpSettingsTools===!0,yolo:e.yolo===!0,missionLogIntervalSteps:typeof e.missionLogIntervalSteps==="number"&&Number.isFinite(e.missionLogIntervalSteps)?e.missionLogIntervalSteps:3,missionLogIntervalMs:typeof e.missionLogIntervalMs==="number"&&Number.isFinite(e.missionLogIntervalMs)?e.missionLogIntervalMs:120000}}class t0{teamRuntimeEntries=new Map;async build(e){let{config:t,hooks:n,extensions:r,logger:o,telemetry:i,createSpawnTool:s,createSwarmTool:a,onTeamRestored:d,userInstructionService:l,configExtensions:c,toolExecutors:u}=e,h=e.onTeamEvent??(()=>{}),p=QUe(t),m=[];if(p.enableTools&&p.mode!=="yolo"&&sT("web_search")&&hY({providerId:t.providerId,modelId:t.modelId},"web_search"))m.push({name:"web_search"});if(p.enableTools&&hY({providerId:t.providerId,modelId:t.modelId},"image_generation"))m.push({name:"image_generation",outputFormat:"png"});let f=t.workspaceRoot??t.cwd,g=BUe(e.toolPolicies??t.toolPolicies,t.enableExtractDocument===!0?t.providerConfig?.tools?.disabled:[...t.providerConfig?.tools?.disabled??[],le.EXTRACT_DOCUMENT]),y=UUe(t.providerConfig?.tools),w=$s(),k=[],b=t.teamName?.trim()||qUe(),v=t.sessionId?.trim()||b,E=p.enableSpawnAgent?UC({workspaceRoot:f}):{configs:[],errors:[],searchPaths:[]},S=E.configs.some((Y)=>Y.skills!==void 0),x=dk(c,"rules"),T=dk(c,"skills"),A=T||S,R=dk(c,"workflows"),C=dk(c,"plugins"),L=x||T||R,N=!1,W=[],D=l,K;for(let Y of E.errors)(o??t.logger)?.log?.(`[agents] Failed to load agent config at ${Y.path}: ${Y.error.message}`);if(p.enableSpawnAgent){(o??t.logger)?.log?.(E.configs.length>0?`[agents] ${E.configs.length} configured agent(s): ${E.configs.map((Q)=>Q.name).join(", ")}`:`[agents] No configured agents found. Looked in: ${E.searchPaths.join(", ")||"(no search path)"}`);let Y=E.configs.filter((Q)=>Q.profile!==void 0&&t.resolveProfileConnection?.(Q.profile)===void 0);for(let Q of Y){let ee=t.listProfileNames?.()??[];(o??t.logger)?.log?.(`[agents] "${Q.name}" names the API configuration profile "${Q.profile}", which no longer exists, and will fail when called. `+(ee.length>0?`Available profiles: ${ee.join(", ")}.`:"This host has no saved profiles."),{severity:"warn"})}}if(!D&&(L||S))D=iu({skills:A?{workspacePath:f,includePluginSkills:C,pluginSkillDirectories:C?e.pluginSkillDirectories:void 0,pluginPaths:t.pluginPaths,cwd:t.cwd,agentPluginSkills:C?e.agentPluginSkills:void 0}:{workspacePath:f},rules:{workspacePath:t.cwd},workflows:{workspacePath:t.cwd}}),W.push(D);else if(D&&C&&e.agentPluginSkills?.length&&(L||S)){let Y=iu({skills:{directories:[],agentPluginSkills:e.agentPluginSkills},rules:{directories:[]},workflows:{directories:[]}});W.push(Y),D=EP([D,Y])}if(D)await D.start().catch(()=>{});let V=p.enableTools&&T&&Boolean(D)&&D?.hasConfiguredSkills(t.skills)===!0&&zUe({cwd:t.cwd,providerId:t.providerId,mode:p.mode,modelId:t.modelId,toolRoutingRules:t.toolRoutingRules,toolPolicies:g,toolExecutors:u}),B=D&&L?D.createExtension({includeRules:x,includeSkills:T,includeWorkflows:R,registerSkillsTool:V,allowedSkillNames:t.skills}):void 0,j=p.mode==="plan"&&p.enableTools?dx({telemetry:i??t.telemetry}):void 0,G=[B,j].filter((Y)=>Y!==void 0),z=G.length>0?[...r??t.extensions??[],...G]:r??t.extensions;if(p.enableTools){k.push(...uk(t.cwd,t.providerId,p.mode,t.modelId,t.toolRoutingRules,g,void 0,u,i??t.telemetry,t.qaCredentials,e.runCommandExecutionController,e.readReceipts,y,void 0,_a(t),E3({enabled:t.leadSandboxConfine===!0,workspaceRoot:t.workspaceRoot??t.cwd,binaries:ak(t.sandboxBinariesDir),tempRoot:MUe(PUe(),"cerebriline-sandbox-tmp")})));let Y=C?e.agentPluginMcpServers:void 0;if(!p.disableMcpSettingsTools||Y?.length){let Q=await GUe({logger:t.logger,includeSettings:!p.disableMcpSettingsTools,agentPluginServers:Y});k.push(...Q.tools),K=Q.shutdown}}let M,X=p.enableAgentTeams?lY():void 0,oe=X?.loadRuntime(v),H=oe?.state,J=oe?.teammates??[],he=new Map(J.map((Y)=>[Y.agentId,Y])),se=X?new QP({teamKey:v,store:X,source:()=>M,teammates:()=>Array.from(he.values()),onError:(Y)=>(o??t.logger)?.log?.(`[team] failed to persist team state: ${Y instanceof Error?Y.message:String(Y)}`)}):void 0,re=t.sessionId||b,Ge,I=[],_=!1,F=t.delegatedAgentConnection,O=Fr({providerId:F?.providerId??t.providerId,baseUrl:F?.baseUrl??t.baseUrl}),ue=t.providerConfig,ne=ue&&Ko(ue)?G5({capacity:async()=>ok(await Jd({sessionId:t.sessionId,providerConfig:ue,logger:o??t.logger})),...o??t.logger?{logger:o??t.logger}:{}}):void 0,fe=kI(t.maxConcurrentAgents,vI(t.agentSlotLimits),ne?(Y)=>Y===O?ne:void 0:void 0,ue&&Ko(ue)?(Y)=>Y===O?()=>pS(ue):void 0:void 0),Ce=F?{...F}:{},We=Ts(t).map((Y)=>({...Y,connection:Y.connection})),Se=pi({providerId:t.providerId,modelId:t.modelId,distinctId:e.distinctId,sessionId:t.sessionId,cwd:t.cwd,apiKey:t.apiKey??"",baseUrl:t.baseUrl,headers:t.headers,providerConfig:t.providerConfig,knownModels:t.knownModels,thinking:t.thinking,reasoningEffort:t.reasoningEffort,thinkingBudgetTokens:t.thinkingBudgetTokens,maxTokensPerTurn:t.maxTokensPerTurn,maxToolResultChars:t.maxToolResultChars,staleReadRewrites:t.staleReadRewrites,toolResultFormat:t.toolResultFormat,temperature:t.temperature,maxIterations:t.maxIterations,...t.compaction?.cappedThinkingBudgetMessage?{thinkingBudgetMessage:t.compaction.cappedThinkingBudgetMessage}:{},hooks:n,extensions:z,logger:o??t.logger,telemetry:e.telemetry??t.telemetry,workspaceMetadata:t.workspaceMetadata,createPrepareTurn:e.createDelegatedPrepareTurn,condenseDiscardedReasoning:e.condenseDiscardedReasoning,onLoopCut:e.onDelegatedLoopCut,slotGate:fe.for(Fr({providerId:Ce.providerId??t.providerId,baseUrl:Ce.baseUrl??t.baseUrl})),slotGates:fe,...Ce},Object.keys(Ce)),Le=FC({nodes:We,base:Se});if(Le)Se.setNodePlacement?.(Le),(o??t.logger)?.log(`[Agents] ${We.length} agent node(s): ${We.map((Y)=>`${Y.id} p${Y.priority} x${Number.isFinite(Y.capacity)?Y.capacity:"uncapped"} ${Y.connection.providerId??t.providerId}/${Y.connection.modelId??t.modelId}`).join(", ")}`);if(F)(o??t.logger)?.log(`[Agents] Delegated agents run on provider=${F.providerId} model=${F.modelId}, not the session's`);let it=!ms({maxConcurrentAgents:t.maxConcurrentAgents,nodes:Ts(t)});if(!ms({maxConcurrentAgents:t.maxConcurrentAgents,nodes:Ts(t)})&&(t.enableSpawnAgent!==!1||t.enableAgentTeams!==!1))(o??t.logger)?.log(`[Agents] spawn_agent and the team tools are withheld: ${(t.agentNodes?.length??0)>1?"every configured node serves 1 request at a time":"this endpoint serves 1 request at a time"}, so a delegated agent would run after the agent that spawned it rather than beside it. Raise the profile's parallel sessions${(t.agentNodes?.length??0)>1?" or a node's capacity":""} to offer them.`);let dt=[],_e=new Map;if(p.enableSpawnAgent){if(k.push(...ck([J5({workspaceRoot:f})],g)),E.configs.length>0)dt=ck(EI({configProvider:Se,agents:E.configs,...t.sessionId?{sessionId:t.sessionId}:{},logger:o??t.logger,resolveProviderConnection:t.resolveProviderConnection,resolveProfileConnection:t.resolveProfileConnection,listProfileNames:t.listProfileNames,createSubAgentTools:async(Y,Q,ee)=>{if(!p.enableTools)return[];let be=e.delegatedSandboxes?.(),ge=ee.toolCallId?lk(ee.toolCallId):void 0,Ee=be&&ge?await be.open(ge):void 0;if(ge&&Ee)_e.set(ge,Y.name);return jUe(Wm(uk(t.cwd,Y.providerId??t.providerId,p.mode,Y.modelId??t.modelId,t.toolRoutingRules,g,Y.skills!==void 0&&D?.createSkillsExecutor?D.createSkillsExecutor(Y.skills):void 0,u,i??t.telemetry,t.qaCredentials,e.runCommandExecutionController,e.readReceipts,y,{workspace:Ee},_a(t)),t.extraTools),Y)},hookErrorMode:t.hookErrorMode,toolPolicies:g,requestToolApproval:e.requestToolApproval,commandSandboxFor:(Y)=>Y?Vb(e.delegatedSandboxes?.(),lk(Y)):void 0,onSubAgentEvent:e.onSubAgentEvent,onSubAgentStart:e.onSubAgentStart,onSubAgentEnd:async(Y)=>{let Q=Y.toolCallId?lk(Y.toolCallId):void 0,ee=e.delegatedSandboxes?.();if(Q&&ee?.has(Q)){let be=_e.get(Q)??"agent";_e.delete(Q);let ge=await ee.close(Q,be);if(Y.result&&typeof Y.result.text==="string")Y.result.text+=Va(Y.result.text,Y.result.finishReason,be,ge)}await e.onSubAgentEnd?.(Y)},onSubAgentSettled:async(Y)=>{if(!Y.toolCallId)return;let Q=lk(Y.toolCallId);_e.delete(Q),await e.delegatedSandboxes?.().close(Q,Y.name)}}),g),k.push(...dt)}if(!this.teamRuntimeEntries.has(re))this.teamRuntimeEntries.set(re,{delegatedAgentConfigProvider:Se});let Ue=()=>{if(!p.enableAgentTeams)return;let Y=this.teamRuntimeEntries.get(re)??{delegatedAgentConfigProvider:Se};if(this.teamRuntimeEntries.set(re,Y),M=Y.runtime,!M){if(M=new _v({teamName:b,leadAgentId:t.sessionId||"lead",sessionId:t.sessionId,maxConcurrentRuns:t.maxConcurrentAgents===0?Number.POSITIVE_INFINITY:t.maxConcurrentAgents,missionLogIntervalSteps:p.missionLogIntervalSteps,missionLogIntervalMs:p.missionLogIntervalMs,acceptTeammateConnectionUpdates:(Q)=>Se.acceptedConnectionUpdates?.(Q)??Q,...e.delegatedSandboxes?{teammateWorkspaces:VUe(e.delegatedSandboxes)}:{},onStateDirty:()=>se?.markStateDirty(),onTeamEvent:(Q)=>{if(h(Q),se){if(Q.type==="teammate_spawned"&&Q.teammate?.rolePrompt){let ee={agentId:Q.agentId,rolePrompt:Q.teammate.rolePrompt,modelId:Q.teammate.modelId,maxIterations:Q.teammate.maxIterations,...Q.teammate.temperature!==void 0?{temperature:Q.teammate.temperature}:{},...Q.teammate.seed!==void 0?{seed:Q.teammate.seed}:{},...Q.teammate.seedRandom?{seedRandom:!0}:{},...Q.teammate.temperatureBase!==void 0?{temperatureBase:Q.teammate.temperatureBase}:{},...Q.teammate.temperatureRange!==void 0?{temperatureRange:Q.teammate.temperatureRange}:{}};he.set(ee.agentId,ee),se.markTeammatesDirty()}if(Q.type==="teammate_shutdown"&&!XUe(Q.reason))he.delete(Q.agentId),se.markTeammatesDirty();if(Q.type==="team_cleaned")he.clear(),se.markTeammatesDirty();se.onEvent(Q)}}}),H)M.hydrateState(H),_=!0;Y.runtime=M}if(!N){if(!M)return;N=!0;let Q=aI({runtime:M,leadAgentId:t.sessionId||"lead",restoredFromPersistence:Boolean(H),restoredTeammates:J,includeLeadSpawnTool:!0,includeLeadManagementTools:!0,onLeadToolsUnlocked:(ee)=>{I=ee,Ge?.addTools(ee)},createBaseTools:p.enableTools?(ee)=>uk(t.cwd,t.providerId,p.mode,t.modelId,t.toolRoutingRules,g,void 0,u,i??t.telemetry,t.qaCredentials,e.runCommandExecutionController,e.readReceipts,y,{workspace:e.delegatedSandboxes?.().openSync(ZP(ee))},_a(t)):void 0,teammateConfigProvider:Se});if(_)M.recoverActiveRuns("runtime_recovered");if(Q.restoredFromPersistence)d?.();k.push(...Q.tools)}return M};if(p.enableSpawnAgent&&s&&ms({maxConcurrentAgents:t.maxConcurrentAgents,nodes:Ts(t)})){let Y=[t.providerConfig,t.delegatedAgentConnection?.providerConfig,...Ts(t).map((Ee)=>Ee.connection.providerConfig)].filter((Ee)=>Ee?.polykv?.swarm===!0),Q;if(a&&Y.length>0){if((await Promise.all(Y.map((vt)=>pS(vt).catch(()=>!1)))).some(Boolean))Q=a()}let ee=new Map(dt.map((Ee)=>[fi(Ee.name),Ee])),be=new Map(E.configs.map((Ee)=>[fi(Ee.name),Ee])),ge=s({...Q?{swarm:Q}:{},...p.enableAgentTeams?{teammates:!0}:{},...ee.size>0?{configuredAgents:()=>ee,configuredAgentConfigs:()=>be}:{}});k.push({...ge,execute:async(Ee,vt)=>(Ue(),ge.execute(Ee,vt))}),k.push(bp())}if(p.enableAgentTeams){if(Ue(),!k.some((Y)=>Y.name===_o))k.push(bp())}let xt=dt.length>0||k.some((Y)=>Y.name==="spawn_agent");if(t.sessionId&&xt)k.push(...gb({sessionId:t.sessionId}));else if(t.sessionId&&p.enableAgentTeams)k.push(...gb({sessionId:t.sessionId}).filter((Y)=>Rz.has(Y.name)));if(t.sessionId&&(p.enableAgentTeams||xt))k.push(lR({sessionId:t.sessionId,configProvider:()=>this.teamRuntimeEntries.get(re)?.delegatedAgentConfigProvider??Se,teammates:()=>{let Y=this.teamRuntimeEntries.get(re)?.runtime?.exportState();return Y?{members:Y.members,runs:Y.runs}:void 0}}));let Qt=ck(k,g),er=Qt.some((Y)=>Y.name==="submit_and_exit"&&Y.lifecycle?.completesRun===!0),Ze=p.enableAgentTeams?()=>{let Y=this.teamRuntimeEntries.get(re)?.runtime;if(!Y)return;let Q=Y.listTasks(),ee=Q.some((Ee)=>Ee.status==="in_progress"||Ee.status==="pending"),be=Y.listRuns({}),ge=be.some((Ee)=>Ee.status==="running"||Ee.status==="queued");if(ee||ge){let Ee=Q.filter((kt)=>kt.status==="in_progress"||kt.status==="pending").map((kt)=>`${kt.id} (${kt.status}): ${kt.title}`).join(", "),vt=be.filter((kt)=>kt.status==="running"||kt.status==="queued").map((kt)=>`${kt.id} (${kt.status})`).join(", "),Nt=[];if(Ee)Nt.push(`Unfinished tasks: ${Ee}`);if(vt)Nt.push(`Active runs: ${vt}`);return`[SYSTEM] You still have team obligations. ${Nt.join(". ")}. Use team_run_task to delegate work, or team_task with action=complete to mark tasks done, or team_await_runs to wait for active runs. Do NOT stop until all tasks are completed.`}return}:void 0,pn=t.sessionId&&xt?tz(t.sessionId):void 0,Jr=Ze&&pn?()=>Ze()??pn():Ze??pn;LUe(t.toolIntentGuard!==!1);let Sr={...er?{requireCompletionTool:!0}:{},...Jr?{completionGuard:Jr}:{},maxNoToolCallNudges:OUe,...t.strongNudges===!1?{strongNudges:!1}:{}},xr=JUe({offered:Qt.map((Y)=>Y.name),subagentsEnabled:p.enableSpawnAgent,serialised:it,multipleNodes:(t.agentNodes?.length??0)>1});return{tools:Qt,modelTools:m,...Object.keys(xr).length>0?{unavailableToolReasons:xr}:{},configuredAgents:E.configs,logger:o??t.logger,telemetry:i??t.telemetry,teamRuntime:M,teamRestoredFromPersistence:Boolean(H),delegatedAgentConfigProvider:this.teamRuntimeEntries.get(re)?.delegatedAgentConfigProvider??Se,extensions:z,completionPolicy:Sr,registerLeadAgent:(Y)=>{if(Ge=Y,I.length>0)Y.addTools(Mi(I,[...w]))},shutdown:async(Y)=>{YUe(M,Y),se?.dispose(),X?.close(),this.teamRuntimeEntries.delete(re),await K?.();for(let Q of W)Q.stop()}}}}import{normalizeUserInput as ZUe}from"@cerebriline/shared";import{nanoid as e1e}from"nanoid";class fY{list(e){return e?Qn(e):[]}update(e,t){if(!e)return{sessionId:t.sessionId,prompts:[],updated:!1};let n=t.promptId.trim(),r=e.pendingPrompts.findIndex((d)=>d.id===n);if(r<0)return{sessionId:t.sessionId,prompts:Qn(e),updated:!1};let o=e.pendingPrompts[r];if(!o)return{sessionId:t.sessionId,prompts:Qn(e),updated:!1};let i=t.prompt===void 0?o.prompt:ZUe(t.prompt).trim();if(!i)throw Error("prompt cannot be empty");let s=t.delivery??o.delivery,a={...o,prompt:i,mode:t.mode??o.mode,delivery:s};return e.pendingPrompts.splice(r,1),n1e(e,a,r,o.delivery),{sessionId:t.sessionId,prompts:Qn(e),prompt:hk(a),updated:!0}}delete(e,t){if(!e)return{sessionId:t.sessionId,prompts:[],removed:!1};let n=t.promptId.trim(),r=e.pendingPrompts.findIndex((i)=>i.id===n);if(r<0)return{sessionId:t.sessionId,prompts:Qn(e),removed:!1};let[o]=e.pendingPrompts.splice(r,1);return{sessionId:t.sessionId,prompts:Qn(e),prompt:o?hk(o):void 0,removed:!0}}enqueue(e,t){let{prompt:n,mode:r,delivery:o,userImages:i,userFiles:s,origin:a,noteKind:d,refresh:l}=t;if(a==="harness"&&d){let u=e.pendingPrompts.find((h)=>h.origin==="harness"&&h.noteKind===d);if(u)return u.prompt=d==="recap"?wq(u.prompt,n):n,u.refresh=l,Qn(e)}let c=e.pendingPrompts.findIndex((u)=>u.prompt===n);if(c>=0){let[u]=e.pendingPrompts.splice(c,1),h={...u,prompt:n,mode:r??u.mode,userImages:i??u.userImages,userFiles:s??u.userFiles};if(o==="steer"||u.delivery==="steer")e.pendingPrompts.unshift({...h,delivery:"steer"});else e.pendingPrompts.push(h)}else{let u={id:`pending_${Date.now()}_${e1e(5)}`,prompt:n,mode:r,delivery:o,userImages:i,userFiles:s,...a==="harness"?{origin:a}:{},...a==="harness"&&d?{noteKind:d}:{},...a==="harness"&&l?{refresh:l}:{}};if(o==="steer")e.pendingPrompts.unshift(u);else e.pendingPrompts.push(u)}return Qn(e)}consumeSteer(e){for(;;){let t=e.pendingPrompts.findIndex((r)=>r.delivery==="steer");if(t<0)return{prompts:Qn(e)};let[n]=e.pendingPrompts.splice(t,1);if(n&&mY(n))return{entry:n,prompts:Qn(e)}}}shiftNext(e){for(;;){let t=e.pendingPrompts.shift();if(!t||mY(t))return{entry:t,prompts:Qn(e)}}}requeueFront(e,t){return e.pendingPrompts.unshift(t),Qn(e)}clear(e){return e.pendingPrompts.length=0,[]}dropHarnessNotes(e){let t=e.pendingPrompts.length,n=e.pendingPrompts.filter((r)=>r.origin!=="harness");return e.pendingPrompts.length=0,e.pendingPrompts.push(...n),t-n.length}}class n0{deps;service=new fY;constructor(e){this.deps=e}list(e){return this.service.list(this.deps.getSession(e))}steerFirst(e){let t=this.deps.getSession(e),n=t?.pendingPrompts[0];if(!n||n.delivery==="steer")return{sessionId:e,prompts:this.service.list(t),updated:!1};return this.update({sessionId:e,promptId:n.id,delivery:"steer"})}update(e){let t=this.deps.getSession(e.sessionId);if(!t)return{sessionId:e.sessionId,prompts:[],updated:!1};let n=this.service.update(t,e);if(this.emitPrompts(t),n.updated&&n.prompt?.delivery==="steer"&&!t.aborting)t.agent.notifyPendingUserMessage();return this.scheduleDrain(e.sessionId,t),n}delete(e){let t=this.deps.getSession(e.sessionId);if(!t)return{sessionId:e.sessionId,prompts:[],removed:!1};let n=this.service.delete(t,e);return this.emitPrompts(t),this.scheduleDrain(e.sessionId,t),n}enqueue(e,t){let n=this.deps.getSession(e);if(!n)return;if(this.service.enqueue(n,t),this.emitPrompts(n),t.delivery==="steer"&&!n.aborting)n.agent.notifyPendingUserMessage();this.scheduleDrain(e,n)}consumeSteer(e){let t=this.deps.getSession(e);if(!t)return;let n=t.pendingPrompts.length,{entry:r}=this.service.consumeSteer(t);if(!r){if(t.pendingPrompts.length!==n)this.emitPrompts(t);return}return this.emitPrompts(t),this.emitSubmitted(t,r),r}discardQueue(e){if(e.pendingPrompts.length===0)return;this.service.clear(e),this.emitPrompts(e)}dropHarnessNotes(e){if(this.service.dropHarnessNotes(e)>0)this.emitPrompts(e)}emitPrompts(e){this.deps.emit({type:"pending_prompts",payload:{sessionId:e.sessionId,prompts:Qn(e)}})}scheduleDrain(e,t){if(t.pendingPrompts.length===0||t.aborting||t.drainingPendingPrompts||!t.agent.canStartRun())return;queueMicrotask(()=>{this.drain(e)})}async drain(e){let t=this.deps.getSession(e);if(!t)return;if(t.aborting||t.drainingPendingPrompts)return;if(!t.agent.canStartRun())return;let n=t.pendingPrompts.length,{entry:r}=this.service.shiftNext(t);if(!r){if(t.pendingPrompts.length!==n)this.emitPrompts(t);return}this.emitPrompts(t),this.emitSubmitted(t,r),t.drainingPendingPrompts=!0;let o=!0;try{let i=await this.deps.send({sessionId:e,prompt:r.prompt,...r.mode?{mode:r.mode}:{},userImages:r.userImages,userFiles:r.userFiles});if(t1e(i))o=!1}catch{o=!1,this.service.requeueFront(t,r),this.emitPrompts(t)}finally{if(t.drainingPendingPrompts=!1,o&&t.pendingPrompts.length>0&&t.status!=="failed"&&t.status!=="cancelled")queueMicrotask(()=>{this.drain(e)})}}emitSubmitted(e,t){let n=hk(t);this.deps.emit({type:"pending_prompt_submitted",payload:{sessionId:e.sessionId,id:n.id,prompt:n.prompt,delivery:n.delivery,attachmentCount:n.attachmentCount,userImages:n.userImages,userFiles:n.userFiles,...n.origin?{origin:n.origin}:{}}})}}function mY(e){if(!e.refresh)return!0;let t;try{t=e.refresh()}catch{return!0}if(t===void 0||t.trim()==="")return!1;return e.prompt=t,!0}function t1e(e){return typeof e==="object"&&e!==null&&"finishReason"in e&&e.finishReason==="error"}function hk(e){return{id:e.id,prompt:e.prompt,delivery:e.delivery,attachmentCount:(e.userImages?.length??0)+(e.userFiles?.length??0),userImages:e.userImages,userFiles:e.userFiles,...e.origin==="harness"?{origin:e.origin}:{}}}function Qn(e){return e.pendingPrompts.map(hk)}function n1e(e,t,n,r){if(t.delivery==="steer")e.pendingPrompts.unshift(t);else if(r==="steer")e.pendingPrompts.push(t);else e.pendingPrompts.splice(n,0,t)}import{formatDisplayUserInput as tyt,normalizeUserInput as nyt}from"@cerebriline/shared";import{resolveSessionDataDir as oyt}from"@cerebriline/shared/storage";import{existsSync as r0}from"node:fs";import{readFile as r1e}from"node:fs/promises";import{join as o1e}from"node:path";class o0{listeners=new Set;subscribe(e,t){let n={listener:e,sessionId:t?.sessionId?.trim()||void 0};return this.listeners.add(n),()=>{this.listeners.delete(n)}}emit(e){let t=e.payload.sessionId?.trim();for(let n of this.listeners){if(n.sessionId&&n.sessionId!==t)continue;n.listener(e)}}get size(){return this.listeners.size}}function gY(e,t,n){let r=e?.trim();if(r&&r0(r))return r;let o=n?.trim();if(o){let i=o1e(o,t,`${t}.messages.json`);if(r0(i))return i}return r||void 0}async function cu(e){let t=e?.trim();if(!t||!r0(t))return[];try{let n=(await r1e(t,"utf8")).trim();if(!n)return[];let r=JSON.parse(n);if(Array.isArray(r))return r;if(r&&typeof r==="object"&&!Array.isArray(r)){let o=r.messages;if(Array.isArray(o))return o}return[]}catch{return[]}}function i0(e){return e?{...e}:void 0}async function yY(e,t){if(!(e.hookName==="tool_call"||!!e.parent_agent_id))return;await t.queueSpawnRequest(e);let r=await t.upsertSubagentSessionFromHook(e);if(!r)return;await t.appendSubagentHookAudit(r,e),await t.applySubagentStatus(r,e)}function wY(e){let t=Ya(e.session_id)?.rootSessionId??Bc(e.session_id)?.rootSessionId;return{sessionId:e.session_id,source:e.source,pid:e.pid,startedAt:e.started_at,endedAt:e.ended_at??null,exitCode:e.exit_code??null,status:e.status,interactive:e.interactive,provider:e.provider,model:e.model,cwd:e.cwd,workspaceRoot:e.workspace_root,teamName:e.team_name,enableTools:e.enable_tools,enableSpawn:e.enable_spawn,enableTeams:e.enable_teams,isSubagent:t!==void 0,...t!==void 0?{parentSessionId:t}:{},prompt:e.prompt,metadata:e.metadata,messagesPath:e.messages_path,updatedAt:e.ended_at??e.started_at}}class pk{deps;constructor(e){this.deps=e}lastKnownIdentityBySession=new Map;static MAX_IDENTITY_SNAPSHOTS=512;dispatchAgentEvent(e,t,n){let r=this.deps.getSession(e),o={sessionId:e,config:t,liveSession:r,usageBySession:this.deps.usageBySession,aggregateUsageBySession:this.deps.aggregateUsageBySession,persistMessages:this.deps.persistMessages,emit:this.deps.emit},i=UI(n);if(!!r&&(!i.agentId||i.agentId===s0(r.agent))){let a={agentId:s0(r.agent),conversationId:r.agent.getConversationId(),...r?.runtime.teamRuntime?{teamRole:"lead"}:{}};this.rememberSessionIdentity(e,a),ev(o,n,{...a,isPrimaryAgentEvent:!0});return}ev(o,n,{...r?{}:this.lastKnownIdentityBySession.get(e),isPrimaryAgentEvent:!1})}rememberSessionIdentity(e,t){if(this.lastKnownIdentityBySession.delete(e),this.lastKnownIdentityBySession.set(e,t),this.lastKnownIdentityBySession.size>pk.MAX_IDENTITY_SNAPSHOTS){let n=this.lastKnownIdentityBySession.keys().next().value;if(n!==void 0)this.lastKnownIdentityBySession.delete(n)}}async handleTeamEvent(e,t){let n=this.deps.getSession(e);if(n){if(YC(n,t),t.type==="agent_event"){let r={sessionId:e,config:n.config,liveSession:n,usageBySession:this.deps.usageBySession,aggregateUsageBySession:this.deps.aggregateUsageBySession,persistMessages:this.deps.persistMessages,emit:this.deps.emit};ev(r,t.event,{agentId:t.agentId,teamRole:"teammate",teamAgentId:t.agentId,isPrimaryAgentEvent:!1})}if(t.type==="teammate_spawned"){let r=vi({agentId:t.teammate.runtimeAgentId??t.agentId,conversationId:t.teammate.conversationId,parentAgentId:t.teammate.parentAgentId,createdByAgentId:s0(n.agent),teamId:n.runtime.teamRuntime?.getTeamId(),teamName:n.runtime.teamRuntime?.getTeamName(),teamRole:"teammate",teamAgentId:t.agentId});if(r)_d(n.config.telemetry,{ulid:e,modelId:t.teammate.modelId??n.config.modelId,provider:n.config.providerId,...r})}}if(await XC(e,t,this.deps.invokeBackendOptional),n&&(t.type!=="agent_event"||t.activityChanged===!0))JC(n,e,t,this.deps.emit)}async handlePluginEvent(e,t,n,r){if(t.name==="plugin_log"){this.handlePluginLog(e,t.payload);return}if(t.name==="plugin_telemetry"){this.handlePluginTelemetry(e,t.payload,r);return}if(t.name==="automation_event"){let l=this.deps.getSession(e)?.config.extensionContext?.automation??n;if(!l)return;let c=t.payload&&typeof t.payload==="object"?t.payload:void 0;if(!c)return;await l.ingestEvent(c);return}if(t.name!=="steer_message"&&t.name!=="queue_message"&&t.name!=="pending_prompt")return;let o=t.payload&&typeof t.payload==="object"?t.payload:void 0,i=typeof o?.sessionId==="string"&&o.sessionId.trim().length>0?o.sessionId.trim():e,s=typeof o?.prompt==="string"?o.prompt.trim():"";if(!s)return;let a=t.name==="steer_message"?"steer":t.name==="queue_message"?"queue":o?.delivery==="steer"?"steer":"queue";this.deps.enqueuePendingPrompt(i,{prompt:s,delivery:a})}handlePluginTelemetry(e,t,n){let o=this.deps.getSession(e)?.config.telemetry??n;if(!o||!t||typeof t!=="object")return;let i=t,s=typeof i.pluginName==="string"&&i.pluginName?i.pluginName:"unknown";if(i.kind==="event"){let a=typeof i.event==="string"?i.event.trim():"";if(!a)return;let d={...i.properties&&typeof i.properties==="object"?i.properties:{},plugin_name:s,session_id:e};if(i.required===!0)o.captureRequired(`plugin.${a}`,d);else o.capture({event:`plugin.${a}`,properties:d});return}if(i.kind==="metric"){let a=typeof i.name==="string"?i.name.trim():"",d=typeof i.value==="number"?i.value:NaN;if(!a||Number.isNaN(d))return;let l={...i.attributes&&typeof i.attributes==="object"?i.attributes:{},plugin_name:s},c=typeof i.description==="string"?i.description:void 0,u=i.required===!0,h=`plugin.${a}`;if(i.metric==="counter")o.recordCounter(h,d,l,c,u);else if(i.metric==="histogram")o.recordHistogram(h,d,l,c,u);else if(i.metric==="gauge")o.recordGauge(h,d,l,c,u)}}handlePluginLog(e,t,n){let r=this.deps.getSession(e),o=n??r?.config.extensionContext?.logger??r?.config.logger;if(!o||!t||typeof t!=="object")return;let i=t,s=typeof i.message==="string"?i.message:"";if(!s)return;let a=i.metadata&&typeof i.metadata==="object"?{...i.metadata}:{};if(a.sessionId??=e,typeof i.pluginName==="string"&&i.pluginName)a.pluginName=i.pluginName;if(i.level==="debug"){o.debug(s,a);return}if(i.level==="error"){if(o.error)o.error(s,a);else o.log(s,{...a,severity:"error"});return}o.log(s,a)}}function s0(e){return e.getAgentId()}function a0(e){return{sessionId:e.sessionId,source:e.source,pid:process.pid,startedAt:e.startedAt,endedAt:e.endedAt??null,exitCode:e.exitCode??null,status:e.status,interactive:e.interactive,provider:e.config.providerId,model:e.config.modelId,cwd:e.config.cwd,workspaceRoot:ki(e.config),teamName:e.config.teamName?.trim()||void 0,enableTools:e.config.enableTools,enableSpawn:e.config.enableSpawnAgent,enableTeams:e.config.enableAgentTeams,parentSessionId:typeof e.sessionMetadata?.parentSessionId==="string"?e.sessionMetadata.parentSessionId:void 0,parentAgentId:typeof e.sessionMetadata?.parentAgentId==="string"?e.sessionMetadata.parentAgentId:void 0,agentId:typeof e.sessionMetadata?.agentId==="string"?e.sessionMetadata.agentId:void 0,conversationId:typeof e.sessionMetadata?.conversationId==="string"?e.sessionMetadata.conversationId:void 0,isSubagent:typeof e.sessionMetadata?.isSubagent==="boolean"?e.sessionMetadata.isSubagent:!1,prompt:e.pendingPrompt,metadata:e.sessionMetadata,messagesPath:e.artifacts?.messagesPath,updatedAt:e.updatedAt??e.endedAt??e.startedAt}}function d0(e,t){let n=e[t];return typeof n==="function"?n:null}async function bY(e,t,...n){let r=d0(e,t);if(!r)throw Error(`session service method not available: ${t}`);return Promise.resolve(r.apply(e,n))}async function vY(e,t,...n){let r=d0(e,t);if(!r)return;await Promise.resolve(r.apply(e,n))}async function kY(e,t,...n){let r=d0(e,t);if(!r)return;return await Promise.resolve(r.apply(e,n))}import{clearPolykvSession as mk,releasePolykvAgent as l0,setPolykvSession as i1e}from"@cerebriline/llms";function SY(e,t,n){let r=n?{extractDocument:n}:{};if(!e)return{executors:t,enableBash:!1,...n?{executorOptions:r}:{}};let o=rk(t?.semanticSearch,e.executorOptions.overlay);return{executorOptions:{...e.executorOptions,...r},...o?{executors:{semanticSearch:o}}:{},...e.allowCommands?{}:{enableBash:!1}}}function fk(e,t,n){return{onSubAgentEvent:(r)=>e.onAgentEvent(n,t,r),onSubAgentStart:(r)=>{let o=e.getSession(n)?.runtime.teamRuntime;e.subAgentStarts.set(r.subAgentId,{startedAt:Date.now(),rootSessionId:n});let i=vi({agentId:r.subAgentId,conversationId:r.conversationId,parentAgentId:r.parentAgentId,teamId:o?.getTeamId(),teamName:o?.getTeamName(),createdByAgentId:r.parentAgentId});if(i)_d(t.telemetry,{ulid:n,modelId:t.modelId,provider:t.providerId,...i});jk(t.telemetry,{event:"started",ulid:n,durationMs:0,parentId:r.parentAgentId,agentId:r.subAgentId,...i}),e.invokeBackendOptional("handleSubAgentStart",n,r)},onSubAgentEnd:async(r)=>{let o=e.getSession(n)?.runtime.teamRuntime,i=e.subAgentStarts.get(r.subAgentId),s=i?Date.now()-i.startedAt:0,a=r.result?.text?r.result.text.split(`
1761
+ `,"utf8"),iY(i,o)}markInProgressRunsInterrupted(e,t){let n=this.readEnvelope(e);if(!n?.teamState?.runs?.length)return[];let r=n.teamState.runs.filter((i)=>i.status==="queued"||i.status==="running").map((i)=>i.id);if(r.length===0)return[];let o=new Date;return n.teamState={...n.teamState,runs:n.teamState.runs.map((i)=>i.status==="queued"||i.status==="running"?{...i,status:"interrupted",error:t,endedAt:o}:i)},this.persistRuntime(e,n.teamState,n.teammates),r}ensureTeamDir(){if(!lu(this.teamDirPath))oY(this.teamDirPath,{recursive:!0});return this.teamDirPath}ensureTeamSubdir(e){let t=YP(this.ensureTeamDir(),wn(e));if(!lu(t))oY(t,{recursive:!0});return t}statePath(e){return YP(this.ensureTeamDir(),wn(e),"state.json")}historyPath(e){return YP(this.ensureTeamDir(),wn(e),"task-history.jsonl")}readEnvelope(e){let t=this.statePath(e);if(!lu(t))return;try{let n=JSON.parse(VP(t,"utf8"));if(n?.version===1&&n.teamState)return n}catch{}return}}function lY(e={}){try{let t=new ik(e);return t.init(),t}catch{let t=new sk({teamDir:e.teamDir});return t.init(),t}}import{chmodSync as RUe,existsSync as XP}from"node:fs";import{join as JP}from"node:path";function ak(e){if(!e)return;if(process.platform==="win32"){let t=JP(e,"cerebriline-sandbox.exe"),n=JP(e,"hook.dll");if(!XP(t)||!XP(n))return;return{launcher:t,hook:n,platforms:["win32"]}}if(process.platform==="linux")return cY(e,"","linux");if(process.platform==="darwin")return cY(e,"darwin-","darwin");return}function cY(e,t,n){let r={x64:"x64",arm64:"arm64"}[process.arch],i=(r?[`cerebriline-sandbox-${t}${r}`,"cerebriline-sandbox"]:["cerebriline-sandbox"]).map((s)=>JP(e,s)).find(XP);if(!i)return;try{RUe(i,493)}catch{}return{launcher:i,hook:i,platforms:[n]}}var IUe=300,CUe=60000,uY=5000;class QP{opts;pendingEvents=[];teammatesDirty=!1;timer;lastFlushAt=0;disposed=!1;constructor(e){this.opts={batchMs:IUe,telemetryFlushMs:CUe,now:Date.now,...e}}onEvent(e){if(this.disposed)return;if(!Ti(e)){if(this.opts.now()-this.lastFlushAt>=this.opts.telemetryFlushMs)this.schedule();return}if(this.pendingEvents.push({type:e.type,payload:ys(e)}),WC(e)){this.flush();return}this.schedule()}markTeammatesDirty(){this.teammatesDirty=!0}markStateDirty(){if(this.disposed)return;this.schedule()}flush(){this.clearTimer();let e=this.opts.source();if(!e)return;if(!e.hasPendingStateDelta()&&this.pendingEvents.length===0&&!this.teammatesDirty)return;let n=this.pendingEvents,r=this.teammatesDirty;this.pendingEvents=[],this.teammatesDirty=!1;let o=e.drainStateDelta();try{this.opts.store.persistBatch(this.opts.teamKey,{events:n,delta:o,teammates:this.opts.teammates(),getFullState:()=>e.exportState()}),this.lastFlushAt=this.opts.now()}catch(i){e.requeueStateDelta(o);let s=n.concat(this.pendingEvents);if(this.pendingEvents=s.length>uY?s.slice(-uY):s,this.teammatesDirty=this.teammatesDirty||r,!this.disposed)this.schedule();try{this.opts.onError?.(i)}catch{}}}dispose(){if(this.disposed)return;this.disposed=!0,this.flush()}schedule(){if(this.timer)return;this.timer=setTimeout(()=>{this.timer=void 0,this.flush()},this.opts.batchMs),this.timer.unref?.()}clearTimer(){if(this.timer)clearTimeout(this.timer),this.timer=void 0}}function dk(e,t){return NUe(e,t)}function pY(e,t){let n=t?.["*"]??{},r=t?.[e]??{};return{...n,...r}.enabled!==!1}function FUe(e,t){return e.filter((n)=>pY(n.name,t))}function ck(e,t){return Mi(FUe(e,t))}function UUe(e){if(e?.readLimitEnabled===!1)return Number.POSITIVE_INFINITY;let t=e?.readLimitChars;return typeof t==="number"&&Number.isFinite(t)&&t>0?Math.floor(t):void 0}function BUe(e,t){if(!t?.length)return e;let n={...e??{}};for(let r of t){let o=r.trim();if(!o)continue;n[o]={...n[o]??{},enabled:!1}}return n}var HUe={apply_diff:"editor",attempt_completion:"submit_and_exit",bash:"run_commands",execute_command:"run_commands",list_code_definition_names:"search_codebase",list_files:"run_commands",read_file:"read_files",replace_in_file:"editor",search_files:"search_codebase",use_skill:"skills",write_to_file:"editor"};function WUe(e){let t=e.trim().toLowerCase();return HUe[t]??t}function jUe(e,t){if(t.tools===void 0)return e;let n=new Set(t.tools.map(WUe));if(t.skills!==void 0)n.add("skills");return e.filter((r)=>n.has(r.name))}function qUe(){return`team-${$Ue(5)}`}function uk(e,t,n,r,o,i,s,a,d,l,c,u,h,p,m,f){let g=So[xo({mode:n})],y=Nw(t,r,n,o??Lw);return ck(qp({cwd:e,telemetry:d,qaCredentials:l,executorOptions:p?.workspace?{...p.workspace.executorOptions,...m?{extractDocument:m}:{},...h!==void 0?{fileRead:{maxReadChars:h}}:{}}:{bash:{executionController:c,...f?{wrapSpawn:f}:{}},...u?{receipts:u}:{},...m?{extractDocument:m}:{},...h!==void 0?{fileRead:{maxReadChars:h}}:{}},...g,enableSkills:!!s,...y,enableExtractDocument:g.enableExtractDocument===!0&&pY(le.EXTRACT_DOCUMENT,i),...p&&!p.workspace?.allowCommands?{enableBash:!1}:{},executors:{...s?{skills:s}:{},...p?.workspace?a?.semanticSearch?{semanticSearch:rk(a.semanticSearch,p.workspace.executorOptions.overlay)}:{}:a??{}}}),i)}function zUe(e){return uk(e.cwd,e.providerId,e.mode,e.modelId,e.toolRoutingRules,e.toolPolicies,KUe,e.toolExecutors).some((t)=>t.name==="skills")}var KUe=async()=>"";async function GUe(e){let t=Gr(),n=e.includeSettings&&Fm({filePath:t});if(!n&&!e.agentPluginServers?.length)return{tools:[]};let r=ek({settingsPath:t}),o=ek({restrictConfiguredHeadersToOrigin:!0}),i=new tk({clientFactory:(u)=>u.metadata?.source==="agent-plugin"?o(u):r(u)}),s=[];if(n)try{s=await FP(i,{filePath:t})}catch(u){let h=u instanceof Error?u.message:String(u);e.logger?.log(`[mcp] Failed to load MCP settings, skipping settings-backed MCP tools: ${h}`)}let a=new Set(s.map((u)=>u.name));for(let u of e.agentPluginServers??[]){let h=u.registration;if(a.has(h.name)){e.logger?.log(`[agent-plugins] MCP server '${h.name}' conflicts with an existing server and was skipped.`,{severity:"error"});continue}try{await i.registerServer(h),s.push(h),a.add(h.name)}catch(p){let m=p instanceof Error?p.message:String(p);e.logger?.log(`[agent-plugins] Failed to register MCP server '${h.name}', skipping: ${m}`,{severity:"error"})}}if(s.length===0)return await i.dispose().catch(()=>{}),{tools:[]};let d=s.filter((u)=>u.disabled!==!0),l=await Promise.allSettled(d.map((u)=>KP({serverName:u.name,provider:i,timeoutMs:DUe(u.timeoutSeconds)*1000}))),c=[];for(let[u,h]of l.entries())if(h.status==="fulfilled")c.push(...h.value);else{let p=h.reason instanceof Error?h.reason.message:String(h.reason);e.logger?.log(`[mcp] Failed to load tools from MCP server "${d[u].name}", skipping: ${p}`)}return{tools:c,shutdown:async()=>{await i.dispose()}}}function lk(e){return`configured:${e}`}function ZP(e){return`teammate:${e}`}function VUe(e){return{handBack:(t)=>e().handBack(ZP(t),t),release:async(t)=>{await e().close(ZP(t),t)}}}function YUe(e,t){if(!e)return;try{e.cancelOutstandingWork(`${e0}${t}`)}catch{}for(let n of e.getTeammateIds())try{e.shutdownTeammate(n,`${e0}${t}`)}catch{}}var e0="runtime_shutdown:";function XUe(e){if(e===void 0)return!1;if(e.startsWith(e0))return!0;switch(e){case"session_stop":case"session_complete":case"session_error":case"session_manager_dispose":case"cli_run_shutdown":case"cli_interactive_shutdown":case"cli_interactive_startup_cancelled":case"provider_change":case"acp_shutdown":case"hub_server_stop":case"vscode_webview_dispose":return!0;default:return!1}}function Ts(e){return $C({providerId:e.providerId,modelId:e.modelId,agentNodes:(e.agentNodes??[]).map((t)=>({...t,connection:t.connection})),polykvAgentsPriorityZero:e.polykvAgentsPriorityZero,overflowCapacity:e.maxConcurrentAgents,lead:{apiKey:e.apiKey,baseUrl:e.baseUrl,headers:e.headers,providerConfig:e.providerConfig,knownModels:e.knownModels,thinking:e.thinking,reasoningEffort:e.reasoningEffort,thinkingBudgetTokens:e.thinkingBudgetTokens,maxTokensPerTurn:e.maxTokensPerTurn,maxToolResultChars:e.maxToolResultChars,staleReadRewrites:e.staleReadRewrites,toolResultFormat:e.toolResultFormat,temperature:e.temperature}})}function JUe(e){let t=new Set(e.offered),n=["spawn_agent","spawn_swarm"].filter((d)=>!t.has(d));if(n.length===0)return{};let r;if(!e.subagentsEnabled)r="sub-agents are switched off in this session's settings.";else if(e.serialised)r=`${e.multipleNodes?"every configured node serves 1 request at a time":"this endpoint serves 1 request at a time"}, so a spawned agent would run after you rather than beside you.`;else return{};let o=e.offered.filter((d)=>d.startsWith("subagent_")),i=o.length>0?`Do the work yourself, or hand one job at a time to a configured agent: ${o.join(", ")}.`:"Do the work yourself.",s=e.subagentsEnabled?`Only the user can change this, by raising the profile's parallel sessions${e.multipleNodes?" or a node's capacity":""}.`:"Only the user can change this, in the settings.",a={};for(let d of n)a[d]=`${r} ${i} Do not call ${d} again in this session; it will be refused the same way. ${s}`;return a}function QUe(e){let t=So[xo({mode:e.mode})];return{sessionId:e.sessionId||"",mode:e.mode==="plan"?"plan":e.mode==="yolo"?"yolo":"act",enableTools:e.enableTools!==!1,enableSpawnAgent:e.enableSpawnAgent??t.enableSpawnAgent??!0,enableAgentTeams:ms({maxConcurrentAgents:e.maxConcurrentAgents,nodes:Ts(e)})&&e.enableAgentTeams===!0,disableMcpSettingsTools:e.disableMcpSettingsTools===!0,yolo:e.yolo===!0,missionLogIntervalSteps:typeof e.missionLogIntervalSteps==="number"&&Number.isFinite(e.missionLogIntervalSteps)?e.missionLogIntervalSteps:3,missionLogIntervalMs:typeof e.missionLogIntervalMs==="number"&&Number.isFinite(e.missionLogIntervalMs)?e.missionLogIntervalMs:120000}}class t0{teamRuntimeEntries=new Map;async build(e){let{config:t,hooks:n,extensions:r,logger:o,telemetry:i,createSpawnTool:s,createSwarmTool:a,onTeamRestored:d,userInstructionService:l,configExtensions:c,toolExecutors:u}=e,h=e.onTeamEvent??(()=>{}),p=QUe(t),m=[];if(p.enableTools&&p.mode!=="yolo"&&sT("web_search")&&hY({providerId:t.providerId,modelId:t.modelId},"web_search"))m.push({name:"web_search"});if(p.enableTools&&hY({providerId:t.providerId,modelId:t.modelId},"image_generation"))m.push({name:"image_generation",outputFormat:"png"});let f=t.workspaceRoot??t.cwd,g=BUe(e.toolPolicies??t.toolPolicies,t.enableExtractDocument===!0?t.providerConfig?.tools?.disabled:[...t.providerConfig?.tools?.disabled??[],le.EXTRACT_DOCUMENT]),y=UUe(t.providerConfig?.tools),w=$s(),k=[],b=t.teamName?.trim()||qUe(),v=t.sessionId?.trim()||b,E=p.enableSpawnAgent?UC({workspaceRoot:f}):{configs:[],errors:[],searchPaths:[]},S=E.configs.some((Y)=>Y.skills!==void 0),x=dk(c,"rules"),T=dk(c,"skills"),A=T||S,R=dk(c,"workflows"),C=dk(c,"plugins"),L=x||T||R,N=!1,W=[],D=l,K;for(let Y of E.errors)(o??t.logger)?.log?.(`[agents] Failed to load agent config at ${Y.path}: ${Y.error.message}`);if(p.enableSpawnAgent){(o??t.logger)?.log?.(E.configs.length>0?`[agents] ${E.configs.length} configured agent(s): ${E.configs.map((Q)=>Q.name).join(", ")}`:`[agents] No configured agents found. Looked in: ${E.searchPaths.join(", ")||"(no search path)"}`);let Y=E.configs.filter((Q)=>Q.profile!==void 0&&t.resolveProfileConnection?.(Q.profile)===void 0);for(let Q of Y){let ee=t.listProfileNames?.()??[];(o??t.logger)?.log?.(`[agents] "${Q.name}" names the API configuration profile "${Q.profile}", which no longer exists, and will fail when called. `+(ee.length>0?`Available profiles: ${ee.join(", ")}.`:"This host has no saved profiles."),{severity:"warn"})}}if(!D&&(L||S))D=iu({skills:A?{workspacePath:f,includePluginSkills:C,pluginSkillDirectories:C?e.pluginSkillDirectories:void 0,pluginPaths:t.pluginPaths,cwd:t.cwd,agentPluginSkills:C?e.agentPluginSkills:void 0}:{workspacePath:f},rules:{workspacePath:t.cwd},workflows:{workspacePath:t.cwd}}),W.push(D);else if(D&&C&&e.agentPluginSkills?.length&&(L||S)){let Y=iu({skills:{directories:[],agentPluginSkills:e.agentPluginSkills},rules:{directories:[]},workflows:{directories:[]}});W.push(Y),D=EP([D,Y])}if(D)await D.start().catch(()=>{});let V=p.enableTools&&T&&Boolean(D)&&D?.hasConfiguredSkills(t.skills)===!0&&zUe({cwd:t.cwd,providerId:t.providerId,mode:p.mode,modelId:t.modelId,toolRoutingRules:t.toolRoutingRules,toolPolicies:g,toolExecutors:u}),B=D&&L?D.createExtension({includeRules:x,includeSkills:T,includeWorkflows:R,registerSkillsTool:V,allowedSkillNames:t.skills}):void 0,j=p.mode==="plan"&&p.enableTools?dx({telemetry:i??t.telemetry}):void 0,G=[B,j].filter((Y)=>Y!==void 0),z=G.length>0?[...r??t.extensions??[],...G]:r??t.extensions;if(p.enableTools){k.push(...uk(t.cwd,t.providerId,p.mode,t.modelId,t.toolRoutingRules,g,void 0,u,i??t.telemetry,t.qaCredentials,e.runCommandExecutionController,e.readReceipts,y,void 0,_a(t),E3({enabled:t.leadSandboxConfine===!0,workspaceRoot:t.workspaceRoot??t.cwd,binaries:ak(t.sandboxBinariesDir),tempRoot:MUe(PUe(),"cerebriline-sandbox-tmp")})));let Y=C?e.agentPluginMcpServers:void 0;if(!p.disableMcpSettingsTools||Y?.length){let Q=await GUe({logger:t.logger,includeSettings:!p.disableMcpSettingsTools,agentPluginServers:Y});k.push(...Q.tools),K=Q.shutdown}}let M,X=p.enableAgentTeams?lY():void 0,oe=X?.loadRuntime(v),H=oe?.state,J=oe?.teammates??[],he=new Map(J.map((Y)=>[Y.agentId,Y])),se=X?new QP({teamKey:v,store:X,source:()=>M,teammates:()=>Array.from(he.values()),onError:(Y)=>(o??t.logger)?.log?.(`[team] failed to persist team state: ${Y instanceof Error?Y.message:String(Y)}`)}):void 0,re=t.sessionId||b,Ge,I=[],_=!1,F=t.delegatedAgentConnection,O=Fr({providerId:F?.providerId??t.providerId,baseUrl:F?.baseUrl??t.baseUrl}),ue=t.providerConfig,ne=ue&&Ko(ue)?G5({capacity:async()=>ok(await Jd({sessionId:t.sessionId,providerConfig:ue,logger:o??t.logger})),...o??t.logger?{logger:o??t.logger}:{}}):void 0,fe=kI(t.maxConcurrentAgents,vI(t.agentSlotLimits),ne?(Y)=>Y===O?ne:void 0:void 0,ue&&Ko(ue)?(Y)=>Y===O?()=>pS(ue):void 0:void 0),Ce=F?{...F}:{},We=Ts(t).map((Y)=>({...Y,connection:Y.connection})),Se=pi({providerId:t.providerId,modelId:t.modelId,distinctId:e.distinctId,sessionId:t.sessionId,cwd:t.cwd,apiKey:t.apiKey??"",baseUrl:t.baseUrl,headers:t.headers,providerConfig:t.providerConfig,knownModels:t.knownModels,thinking:t.thinking,reasoningEffort:t.reasoningEffort,thinkingBudgetTokens:t.thinkingBudgetTokens,maxTokensPerTurn:t.maxTokensPerTurn,maxToolResultChars:t.maxToolResultChars,staleReadRewrites:t.staleReadRewrites,toolResultFormat:t.toolResultFormat,temperature:t.temperature,maxIterations:t.maxIterations,...t.compaction?.cappedThinkingBudgetMessage?{thinkingBudgetMessage:t.compaction.cappedThinkingBudgetMessage}:{},hooks:n,extensions:z,logger:o??t.logger,telemetry:e.telemetry??t.telemetry,workspaceMetadata:t.workspaceMetadata,createPrepareTurn:e.createDelegatedPrepareTurn,condenseDiscardedReasoning:e.condenseDiscardedReasoning,onLoopCut:e.onDelegatedLoopCut,slotGate:fe.for(Fr({providerId:Ce.providerId??t.providerId,baseUrl:Ce.baseUrl??t.baseUrl})),slotGates:fe,...Ce},Object.keys(Ce)),Le=FC({nodes:We,base:Se});if(Le)Se.setNodePlacement?.(Le),(o??t.logger)?.log(`[Agents] ${We.length} agent node(s): ${We.map((Y)=>`${Y.id} p${Y.priority} x${Number.isFinite(Y.capacity)?Y.capacity:"uncapped"} ${Y.connection.providerId??t.providerId}/${Y.connection.modelId??t.modelId}`).join(", ")}`);if(F)(o??t.logger)?.log(`[Agents] Delegated agents run on provider=${F.providerId} model=${F.modelId}, not the session's`);let it=!ms({maxConcurrentAgents:t.maxConcurrentAgents,nodes:Ts(t)});if(!ms({maxConcurrentAgents:t.maxConcurrentAgents,nodes:Ts(t)})&&(t.enableSpawnAgent!==!1||t.enableAgentTeams!==!1))(o??t.logger)?.log(`[Agents] spawn_agent and the team tools are withheld: ${(t.agentNodes?.length??0)>1?"every configured node serves 1 request at a time":"this endpoint serves 1 request at a time"}, so a delegated agent would run after the agent that spawned it rather than beside it. Raise the profile's parallel sessions${(t.agentNodes?.length??0)>1?" or a node's capacity":""} to offer them.`);let dt=[],_e=new Map;if(p.enableSpawnAgent){if(k.push(...ck([J5({workspaceRoot:f})],g)),E.configs.length>0)dt=ck(EI({configProvider:Se,agents:E.configs,...t.sessionId?{sessionId:t.sessionId}:{},logger:o??t.logger,resolveProviderConnection:t.resolveProviderConnection,resolveProfileConnection:t.resolveProfileConnection,listProfileNames:t.listProfileNames,createSubAgentTools:async(Y,Q,ee)=>{if(!p.enableTools)return[];let be=e.delegatedSandboxes?.(),ge=ee.toolCallId?lk(ee.toolCallId):void 0,Ee=be&&ge?await be.open(ge):void 0;if(ge&&Ee)_e.set(ge,Y.name);return jUe(Wm(uk(t.cwd,Y.providerId??t.providerId,p.mode,Y.modelId??t.modelId,t.toolRoutingRules,g,Y.skills!==void 0&&D?.createSkillsExecutor?D.createSkillsExecutor(Y.skills):void 0,u,i??t.telemetry,t.qaCredentials,e.runCommandExecutionController,e.readReceipts,y,{workspace:Ee},_a(t)),t.extraTools),Y)},hookErrorMode:t.hookErrorMode,toolPolicies:g,requestToolApproval:e.requestToolApproval,commandSandboxFor:(Y)=>Y?Vb(e.delegatedSandboxes?.(),lk(Y)):void 0,onSubAgentEvent:e.onSubAgentEvent,onSubAgentStart:e.onSubAgentStart,onSubAgentEnd:async(Y)=>{let Q=Y.toolCallId?lk(Y.toolCallId):void 0,ee=e.delegatedSandboxes?.();if(Q&&ee?.has(Q)){let be=_e.get(Q)??"agent";_e.delete(Q);let ge=await ee.close(Q,be);if(Y.result&&typeof Y.result.text==="string")Y.result.text+=Va(Y.result.text,Y.result.finishReason,be,ge)}await e.onSubAgentEnd?.(Y)},onSubAgentSettled:async(Y)=>{if(!Y.toolCallId)return;let Q=lk(Y.toolCallId);_e.delete(Q),await e.delegatedSandboxes?.().close(Q,Y.name)}}),g),k.push(...dt)}if(!this.teamRuntimeEntries.has(re))this.teamRuntimeEntries.set(re,{delegatedAgentConfigProvider:Se});let Ue=()=>{if(!p.enableAgentTeams)return;let Y=this.teamRuntimeEntries.get(re)??{delegatedAgentConfigProvider:Se};if(this.teamRuntimeEntries.set(re,Y),M=Y.runtime,!M){if(M=new _v({teamName:b,leadAgentId:t.sessionId||"lead",sessionId:t.sessionId,maxConcurrentRuns:t.maxConcurrentAgents===0?Number.POSITIVE_INFINITY:t.maxConcurrentAgents,missionLogIntervalSteps:p.missionLogIntervalSteps,missionLogIntervalMs:p.missionLogIntervalMs,acceptTeammateConnectionUpdates:(Q)=>Se.acceptedConnectionUpdates?.(Q)??Q,...e.delegatedSandboxes?{teammateWorkspaces:VUe(e.delegatedSandboxes)}:{},onStateDirty:()=>se?.markStateDirty(),onTeamEvent:(Q)=>{if(h(Q),se){if(Q.type==="teammate_spawned"&&Q.teammate?.rolePrompt){let ee={agentId:Q.agentId,rolePrompt:Q.teammate.rolePrompt,modelId:Q.teammate.modelId,maxIterations:Q.teammate.maxIterations,...Q.teammate.temperature!==void 0?{temperature:Q.teammate.temperature}:{},...Q.teammate.seed!==void 0?{seed:Q.teammate.seed}:{},...Q.teammate.seedRandom?{seedRandom:!0}:{},...Q.teammate.temperatureBase!==void 0?{temperatureBase:Q.teammate.temperatureBase}:{},...Q.teammate.temperatureRange!==void 0?{temperatureRange:Q.teammate.temperatureRange}:{}};he.set(ee.agentId,ee),se.markTeammatesDirty()}if(Q.type==="teammate_shutdown"&&!XUe(Q.reason))he.delete(Q.agentId),se.markTeammatesDirty();if(Q.type==="team_cleaned")he.clear(),se.markTeammatesDirty();se.onEvent(Q)}}}),H)M.hydrateState(H),_=!0;Y.runtime=M}if(!N){if(!M)return;N=!0;let Q=aI({runtime:M,leadAgentId:t.sessionId||"lead",restoredFromPersistence:Boolean(H),restoredTeammates:J,includeLeadSpawnTool:!0,includeLeadManagementTools:!0,onLeadToolsUnlocked:(ee)=>{I=ee,Ge?.addTools(ee)},createBaseTools:p.enableTools?(ee)=>uk(t.cwd,t.providerId,p.mode,t.modelId,t.toolRoutingRules,g,void 0,u,i??t.telemetry,t.qaCredentials,e.runCommandExecutionController,e.readReceipts,y,{workspace:e.delegatedSandboxes?.().openSync(ZP(ee))},_a(t)):void 0,teammateConfigProvider:Se});if(_)M.recoverActiveRuns("runtime_recovered");if(Q.restoredFromPersistence)d?.();k.push(...Q.tools)}return M};if(p.enableSpawnAgent&&s&&ms({maxConcurrentAgents:t.maxConcurrentAgents,nodes:Ts(t)})){let Y=[t.providerConfig,t.delegatedAgentConnection?.providerConfig,...Ts(t).map((Ee)=>Ee.connection.providerConfig)].filter((Ee)=>Ee?.polykv?.swarm===!0),Q;if(a&&Y.length>0){if((await Promise.all(Y.map((vt)=>pS(vt).catch(()=>!1)))).some(Boolean))Q=a()}let ee=new Map(dt.map((Ee)=>[fi(Ee.name),Ee])),be=new Map(E.configs.map((Ee)=>[fi(Ee.name),Ee])),ge=s({...Q?{swarm:Q}:{},...p.enableAgentTeams?{teammates:!0}:{},...ee.size>0?{configuredAgents:()=>ee,configuredAgentConfigs:()=>be}:{}});k.push({...ge,execute:async(Ee,vt)=>(Ue(),ge.execute(Ee,vt))}),k.push(bp())}if(p.enableAgentTeams){if(Ue(),!k.some((Y)=>Y.name===_o))k.push(bp())}let xt=dt.length>0||k.some((Y)=>Y.name==="spawn_agent");if(t.sessionId&&xt)k.push(...gb({sessionId:t.sessionId}));else if(t.sessionId&&p.enableAgentTeams)k.push(...gb({sessionId:t.sessionId}).filter((Y)=>Rz.has(Y.name)));if(t.sessionId&&(p.enableAgentTeams||xt))k.push(lR({sessionId:t.sessionId,configProvider:()=>this.teamRuntimeEntries.get(re)?.delegatedAgentConfigProvider??Se,teammates:()=>{let Y=this.teamRuntimeEntries.get(re)?.runtime?.exportState();return Y?{members:Y.members,runs:Y.runs}:void 0}}));let Qt=ck(k,g),er=Qt.some((Y)=>Y.name==="submit_and_exit"&&Y.lifecycle?.completesRun===!0),Ze=p.enableAgentTeams?()=>{let Y=this.teamRuntimeEntries.get(re)?.runtime;if(!Y)return;let Q=Y.listTasks(),ee=Q.some((Ee)=>Ee.status==="in_progress"||Ee.status==="pending"),be=Y.listRuns({}),ge=be.some((Ee)=>Ee.status==="running"||Ee.status==="queued");if(ee||ge){let Ee=Q.filter((kt)=>kt.status==="in_progress"||kt.status==="pending").map((kt)=>`${kt.id} (${kt.status}): ${kt.title}`).join(", "),vt=be.filter((kt)=>kt.status==="running"||kt.status==="queued").map((kt)=>`${kt.id} (${kt.status})`).join(", "),Nt=[];if(Ee)Nt.push(`Unfinished tasks: ${Ee}`);if(vt)Nt.push(`Active runs: ${vt}`);return`[SYSTEM] You still have team obligations. ${Nt.join(". ")}. Use team_run_task to delegate work, or team_task with action=complete to mark tasks done, or team_await_runs to wait for active runs. Do NOT stop until all tasks are completed.`}return}:void 0,pn=t.sessionId&&xt?tz(t.sessionId):void 0,Jr=Ze&&pn?()=>Ze()??pn():Ze??pn;LUe(t.toolIntentGuard!==!1);let Sr={...er?{requireCompletionTool:!0}:{},...Jr?{completionGuard:Jr}:{},maxNoToolCallNudges:OUe,...t.strongNudges===!1?{strongNudges:!1}:{}},xr=JUe({offered:Qt.map((Y)=>Y.name),subagentsEnabled:p.enableSpawnAgent,serialised:it,multipleNodes:(t.agentNodes?.length??0)>1});return{tools:Qt,modelTools:m,...Object.keys(xr).length>0?{unavailableToolReasons:xr}:{},configuredAgents:E.configs,logger:o??t.logger,telemetry:i??t.telemetry,teamRuntime:M,teamRestoredFromPersistence:Boolean(H),delegatedAgentConfigProvider:this.teamRuntimeEntries.get(re)?.delegatedAgentConfigProvider??Se,extensions:z,completionPolicy:Sr,registerLeadAgent:(Y)=>{if(Ge=Y,I.length>0)Y.addTools(Mi(I,[...w]))},shutdown:async(Y)=>{YUe(M,Y),se?.dispose(),X?.close(),this.teamRuntimeEntries.delete(re),await K?.();for(let Q of W)Q.stop()}}}}import{normalizeUserInput as ZUe}from"@cerebriline/shared";import{nanoid as e1e}from"nanoid";class fY{list(e){return e?Qn(e):[]}update(e,t){if(!e)return{sessionId:t.sessionId,prompts:[],updated:!1};let n=t.promptId.trim(),r=e.pendingPrompts.findIndex((d)=>d.id===n);if(r<0)return{sessionId:t.sessionId,prompts:Qn(e),updated:!1};let o=e.pendingPrompts[r];if(!o)return{sessionId:t.sessionId,prompts:Qn(e),updated:!1};let i=t.prompt===void 0?o.prompt:ZUe(t.prompt).trim();if(!i)throw Error("prompt cannot be empty");let s=t.delivery??o.delivery,a={...o,prompt:i,mode:t.mode??o.mode,delivery:s};return e.pendingPrompts.splice(r,1),n1e(e,a,r,o.delivery),{sessionId:t.sessionId,prompts:Qn(e),prompt:hk(a),updated:!0}}delete(e,t){if(!e)return{sessionId:t.sessionId,prompts:[],removed:!1};let n=t.promptId.trim(),r=e.pendingPrompts.findIndex((i)=>i.id===n);if(r<0)return{sessionId:t.sessionId,prompts:Qn(e),removed:!1};let[o]=e.pendingPrompts.splice(r,1);return{sessionId:t.sessionId,prompts:Qn(e),prompt:o?hk(o):void 0,removed:!0}}enqueue(e,t){let{prompt:n,mode:r,delivery:o,userImages:i,userFiles:s,origin:a,noteKind:d,refresh:l}=t;if(a==="harness"&&d){let u=e.pendingPrompts.find((h)=>h.origin==="harness"&&h.noteKind===d);if(u)return u.prompt=d==="recap"?wq(u.prompt,n):n,u.refresh=l,Qn(e)}let c=e.pendingPrompts.findIndex((u)=>u.prompt===n);if(c>=0){let[u]=e.pendingPrompts.splice(c,1),h={...u,prompt:n,mode:r??u.mode,userImages:i??u.userImages,userFiles:s??u.userFiles};if(o==="steer"||u.delivery==="steer")e.pendingPrompts.unshift({...h,delivery:"steer"});else e.pendingPrompts.push(h)}else{let u={id:`pending_${Date.now()}_${e1e(5)}`,prompt:n,mode:r,delivery:o,userImages:i,userFiles:s,...a==="harness"?{origin:a}:{},...a==="harness"&&d?{noteKind:d}:{},...a==="harness"&&l?{refresh:l}:{}};if(o==="steer")e.pendingPrompts.unshift(u);else e.pendingPrompts.push(u)}return Qn(e)}consumeSteer(e){for(;;){let t=e.pendingPrompts.findIndex((r)=>r.delivery==="steer");if(t<0)return{prompts:Qn(e)};let[n]=e.pendingPrompts.splice(t,1);if(n&&mY(n))return{entry:n,prompts:Qn(e)}}}shiftNext(e){for(;;){let t=e.pendingPrompts.shift();if(!t||mY(t))return{entry:t,prompts:Qn(e)}}}requeueFront(e,t){return e.pendingPrompts.unshift(t),Qn(e)}clear(e){return e.pendingPrompts.length=0,[]}dropHarnessNotes(e){let t=e.pendingPrompts.length,n=e.pendingPrompts.filter((r)=>r.origin!=="harness");return e.pendingPrompts.length=0,e.pendingPrompts.push(...n),t-n.length}}class n0{deps;service=new fY;constructor(e){this.deps=e}list(e){return this.service.list(this.deps.getSession(e))}steerFirst(e){let t=this.deps.getSession(e),n=t?.pendingPrompts[0];if(!n||n.delivery==="steer")return{sessionId:e,prompts:this.service.list(t),updated:!1};return this.update({sessionId:e,promptId:n.id,delivery:"steer"})}update(e){let t=this.deps.getSession(e.sessionId);if(!t)return{sessionId:e.sessionId,prompts:[],updated:!1};let n=this.service.update(t,e);if(this.emitPrompts(t),n.updated&&n.prompt?.delivery==="steer"&&!t.aborting)t.agent.notifyPendingUserMessage();return this.scheduleDrain(e.sessionId,t),n}delete(e){let t=this.deps.getSession(e.sessionId);if(!t)return{sessionId:e.sessionId,prompts:[],removed:!1};let n=this.service.delete(t,e);return this.emitPrompts(t),this.scheduleDrain(e.sessionId,t),n}enqueue(e,t){let n=this.deps.getSession(e);if(!n)return;if(this.service.enqueue(n,t),this.emitPrompts(n),t.delivery==="steer"&&!n.aborting)n.agent.notifyPendingUserMessage();this.scheduleDrain(e,n)}consumeSteer(e){let t=this.deps.getSession(e);if(!t)return;let n=t.pendingPrompts.length,{entry:r}=this.service.consumeSteer(t);if(!r){if(t.pendingPrompts.length!==n)this.emitPrompts(t);return}return this.emitPrompts(t),this.emitSubmitted(t,r),r}discardQueue(e){if(e.pendingPrompts.length===0)return;this.service.clear(e),this.emitPrompts(e)}dropHarnessNotes(e){if(this.service.dropHarnessNotes(e)>0)this.emitPrompts(e)}emitPrompts(e){this.deps.emit({type:"pending_prompts",payload:{sessionId:e.sessionId,prompts:Qn(e)}})}scheduleDrain(e,t){if(t.pendingPrompts.length===0||t.aborting||t.drainingPendingPrompts||!t.agent.canStartRun())return;queueMicrotask(()=>{this.drain(e)})}async drain(e){let t=this.deps.getSession(e);if(!t)return;if(t.aborting||t.drainingPendingPrompts)return;if(!t.agent.canStartRun())return;let n=t.pendingPrompts.length,{entry:r}=this.service.shiftNext(t);if(!r){if(t.pendingPrompts.length!==n)this.emitPrompts(t);return}this.emitPrompts(t),this.emitSubmitted(t,r),t.drainingPendingPrompts=!0;let o=!0;try{let i=await this.deps.send({sessionId:e,prompt:r.prompt,...r.mode?{mode:r.mode}:{},userImages:r.userImages,userFiles:r.userFiles});if(t1e(i))o=!1}catch{o=!1,this.service.requeueFront(t,r),this.emitPrompts(t)}finally{if(t.drainingPendingPrompts=!1,o&&t.pendingPrompts.length>0&&t.status!=="failed"&&t.status!=="cancelled")queueMicrotask(()=>{this.drain(e)})}}emitSubmitted(e,t){let n=hk(t);this.deps.emit({type:"pending_prompt_submitted",payload:{sessionId:e.sessionId,id:n.id,prompt:n.prompt,delivery:n.delivery,attachmentCount:n.attachmentCount,userImages:n.userImages,userFiles:n.userFiles,...n.origin?{origin:n.origin}:{}}})}}function mY(e){if(!e.refresh)return!0;let t;try{t=e.refresh()}catch{return!0}if(t===void 0||t.trim()==="")return!1;return e.prompt=t,!0}function t1e(e){return typeof e==="object"&&e!==null&&"finishReason"in e&&e.finishReason==="error"}function hk(e){return{id:e.id,prompt:e.prompt,delivery:e.delivery,attachmentCount:(e.userImages?.length??0)+(e.userFiles?.length??0),userImages:e.userImages,userFiles:e.userFiles,...e.origin==="harness"?{origin:e.origin}:{}}}function Qn(e){return e.pendingPrompts.map(hk)}function n1e(e,t,n,r){if(t.delivery==="steer")e.pendingPrompts.unshift(t);else if(r==="steer")e.pendingPrompts.push(t);else e.pendingPrompts.splice(n,0,t)}import{formatDisplayUserInput as ryt,normalizeUserInput as oyt}from"@cerebriline/shared";import{resolveSessionDataDir as syt}from"@cerebriline/shared/storage";import{existsSync as r0}from"node:fs";import{readFile as r1e}from"node:fs/promises";import{join as o1e}from"node:path";class o0{listeners=new Set;subscribe(e,t){let n={listener:e,sessionId:t?.sessionId?.trim()||void 0};return this.listeners.add(n),()=>{this.listeners.delete(n)}}emit(e){let t=e.payload.sessionId?.trim();for(let n of this.listeners){if(n.sessionId&&n.sessionId!==t)continue;n.listener(e)}}get size(){return this.listeners.size}}function gY(e,t,n){let r=e?.trim();if(r&&r0(r))return r;let o=n?.trim();if(o){let i=o1e(o,t,`${t}.messages.json`);if(r0(i))return i}return r||void 0}async function cu(e){let t=e?.trim();if(!t||!r0(t))return[];try{let n=(await r1e(t,"utf8")).trim();if(!n)return[];let r=JSON.parse(n);if(Array.isArray(r))return r;if(r&&typeof r==="object"&&!Array.isArray(r)){let o=r.messages;if(Array.isArray(o))return o}return[]}catch{return[]}}function i0(e){return e?{...e}:void 0}async function yY(e,t){if(!(e.hookName==="tool_call"||!!e.parent_agent_id))return;await t.queueSpawnRequest(e);let r=await t.upsertSubagentSessionFromHook(e);if(!r)return;await t.appendSubagentHookAudit(r,e),await t.applySubagentStatus(r,e)}function wY(e){let t=Ya(e.session_id)?.rootSessionId??Bc(e.session_id)?.rootSessionId;return{sessionId:e.session_id,source:e.source,pid:e.pid,startedAt:e.started_at,endedAt:e.ended_at??null,exitCode:e.exit_code??null,status:e.status,interactive:e.interactive,provider:e.provider,model:e.model,cwd:e.cwd,workspaceRoot:e.workspace_root,teamName:e.team_name,enableTools:e.enable_tools,enableSpawn:e.enable_spawn,enableTeams:e.enable_teams,isSubagent:t!==void 0,...t!==void 0?{parentSessionId:t}:{},prompt:e.prompt,metadata:e.metadata,messagesPath:e.messages_path,updatedAt:e.ended_at??e.started_at}}class pk{deps;constructor(e){this.deps=e}lastKnownIdentityBySession=new Map;static MAX_IDENTITY_SNAPSHOTS=512;dispatchAgentEvent(e,t,n){let r=this.deps.getSession(e),o={sessionId:e,config:t,liveSession:r,usageBySession:this.deps.usageBySession,aggregateUsageBySession:this.deps.aggregateUsageBySession,persistMessages:this.deps.persistMessages,emit:this.deps.emit},i=UI(n);if(!!r&&(!i.agentId||i.agentId===s0(r.agent))){let a={agentId:s0(r.agent),conversationId:r.agent.getConversationId(),...r?.runtime.teamRuntime?{teamRole:"lead"}:{}};this.rememberSessionIdentity(e,a),ev(o,n,{...a,isPrimaryAgentEvent:!0});return}ev(o,n,{...r?{}:this.lastKnownIdentityBySession.get(e),isPrimaryAgentEvent:!1})}rememberSessionIdentity(e,t){if(this.lastKnownIdentityBySession.delete(e),this.lastKnownIdentityBySession.set(e,t),this.lastKnownIdentityBySession.size>pk.MAX_IDENTITY_SNAPSHOTS){let n=this.lastKnownIdentityBySession.keys().next().value;if(n!==void 0)this.lastKnownIdentityBySession.delete(n)}}async handleTeamEvent(e,t){let n=this.deps.getSession(e);if(n){if(YC(n,t),t.type==="agent_event"){let r={sessionId:e,config:n.config,liveSession:n,usageBySession:this.deps.usageBySession,aggregateUsageBySession:this.deps.aggregateUsageBySession,persistMessages:this.deps.persistMessages,emit:this.deps.emit};ev(r,t.event,{agentId:t.agentId,teamRole:"teammate",teamAgentId:t.agentId,isPrimaryAgentEvent:!1})}if(t.type==="teammate_spawned"){let r=vi({agentId:t.teammate.runtimeAgentId??t.agentId,conversationId:t.teammate.conversationId,parentAgentId:t.teammate.parentAgentId,createdByAgentId:s0(n.agent),teamId:n.runtime.teamRuntime?.getTeamId(),teamName:n.runtime.teamRuntime?.getTeamName(),teamRole:"teammate",teamAgentId:t.agentId});if(r)_d(n.config.telemetry,{ulid:e,modelId:t.teammate.modelId??n.config.modelId,provider:n.config.providerId,...r})}}if(await XC(e,t,this.deps.invokeBackendOptional),n&&(t.type!=="agent_event"||t.activityChanged===!0))JC(n,e,t,this.deps.emit)}async handlePluginEvent(e,t,n,r){if(t.name==="plugin_log"){this.handlePluginLog(e,t.payload);return}if(t.name==="plugin_telemetry"){this.handlePluginTelemetry(e,t.payload,r);return}if(t.name==="automation_event"){let l=this.deps.getSession(e)?.config.extensionContext?.automation??n;if(!l)return;let c=t.payload&&typeof t.payload==="object"?t.payload:void 0;if(!c)return;await l.ingestEvent(c);return}if(t.name!=="steer_message"&&t.name!=="queue_message"&&t.name!=="pending_prompt")return;let o=t.payload&&typeof t.payload==="object"?t.payload:void 0,i=typeof o?.sessionId==="string"&&o.sessionId.trim().length>0?o.sessionId.trim():e,s=typeof o?.prompt==="string"?o.prompt.trim():"";if(!s)return;let a=t.name==="steer_message"?"steer":t.name==="queue_message"?"queue":o?.delivery==="steer"?"steer":"queue";this.deps.enqueuePendingPrompt(i,{prompt:s,delivery:a})}handlePluginTelemetry(e,t,n){let o=this.deps.getSession(e)?.config.telemetry??n;if(!o||!t||typeof t!=="object")return;let i=t,s=typeof i.pluginName==="string"&&i.pluginName?i.pluginName:"unknown";if(i.kind==="event"){let a=typeof i.event==="string"?i.event.trim():"";if(!a)return;let d={...i.properties&&typeof i.properties==="object"?i.properties:{},plugin_name:s,session_id:e};if(i.required===!0)o.captureRequired(`plugin.${a}`,d);else o.capture({event:`plugin.${a}`,properties:d});return}if(i.kind==="metric"){let a=typeof i.name==="string"?i.name.trim():"",d=typeof i.value==="number"?i.value:NaN;if(!a||Number.isNaN(d))return;let l={...i.attributes&&typeof i.attributes==="object"?i.attributes:{},plugin_name:s},c=typeof i.description==="string"?i.description:void 0,u=i.required===!0,h=`plugin.${a}`;if(i.metric==="counter")o.recordCounter(h,d,l,c,u);else if(i.metric==="histogram")o.recordHistogram(h,d,l,c,u);else if(i.metric==="gauge")o.recordGauge(h,d,l,c,u)}}handlePluginLog(e,t,n){let r=this.deps.getSession(e),o=n??r?.config.extensionContext?.logger??r?.config.logger;if(!o||!t||typeof t!=="object")return;let i=t,s=typeof i.message==="string"?i.message:"";if(!s)return;let a=i.metadata&&typeof i.metadata==="object"?{...i.metadata}:{};if(a.sessionId??=e,typeof i.pluginName==="string"&&i.pluginName)a.pluginName=i.pluginName;if(i.level==="debug"){o.debug(s,a);return}if(i.level==="error"){if(o.error)o.error(s,a);else o.log(s,{...a,severity:"error"});return}o.log(s,a)}}function s0(e){return e.getAgentId()}function a0(e){return{sessionId:e.sessionId,source:e.source,pid:process.pid,startedAt:e.startedAt,endedAt:e.endedAt??null,exitCode:e.exitCode??null,status:e.status,interactive:e.interactive,provider:e.config.providerId,model:e.config.modelId,cwd:e.config.cwd,workspaceRoot:ki(e.config),teamName:e.config.teamName?.trim()||void 0,enableTools:e.config.enableTools,enableSpawn:e.config.enableSpawnAgent,enableTeams:e.config.enableAgentTeams,parentSessionId:typeof e.sessionMetadata?.parentSessionId==="string"?e.sessionMetadata.parentSessionId:void 0,parentAgentId:typeof e.sessionMetadata?.parentAgentId==="string"?e.sessionMetadata.parentAgentId:void 0,agentId:typeof e.sessionMetadata?.agentId==="string"?e.sessionMetadata.agentId:void 0,conversationId:typeof e.sessionMetadata?.conversationId==="string"?e.sessionMetadata.conversationId:void 0,isSubagent:typeof e.sessionMetadata?.isSubagent==="boolean"?e.sessionMetadata.isSubagent:!1,prompt:e.pendingPrompt,metadata:e.sessionMetadata,messagesPath:e.artifacts?.messagesPath,updatedAt:e.updatedAt??e.endedAt??e.startedAt}}function d0(e,t){let n=e[t];return typeof n==="function"?n:null}async function bY(e,t,...n){let r=d0(e,t);if(!r)throw Error(`session service method not available: ${t}`);return Promise.resolve(r.apply(e,n))}async function vY(e,t,...n){let r=d0(e,t);if(!r)return;await Promise.resolve(r.apply(e,n))}async function kY(e,t,...n){let r=d0(e,t);if(!r)return;return await Promise.resolve(r.apply(e,n))}import{clearPolykvSession as mk,releasePolykvAgent as l0,setPolykvSession as i1e}from"@cerebriline/llms";function SY(e,t,n){let r=n?{extractDocument:n}:{};if(!e)return{executors:t,enableBash:!1,...n?{executorOptions:r}:{}};let o=rk(t?.semanticSearch,e.executorOptions.overlay);return{executorOptions:{...e.executorOptions,...r},...o?{executors:{semanticSearch:o}}:{},...e.allowCommands?{}:{enableBash:!1}}}function fk(e,t,n){return{onSubAgentEvent:(r)=>e.onAgentEvent(n,t,r),onSubAgentStart:(r)=>{let o=e.getSession(n)?.runtime.teamRuntime;e.subAgentStarts.set(r.subAgentId,{startedAt:Date.now(),rootSessionId:n});let i=vi({agentId:r.subAgentId,conversationId:r.conversationId,parentAgentId:r.parentAgentId,teamId:o?.getTeamId(),teamName:o?.getTeamName(),createdByAgentId:r.parentAgentId});if(i)_d(t.telemetry,{ulid:n,modelId:t.modelId,provider:t.providerId,...i});jk(t.telemetry,{event:"started",ulid:n,durationMs:0,parentId:r.parentAgentId,agentId:r.subAgentId,...i}),e.invokeBackendOptional("handleSubAgentStart",n,r)},onSubAgentEnd:async(r)=>{let o=e.getSession(n)?.runtime.teamRuntime,i=e.subAgentStarts.get(r.subAgentId),s=i?Date.now()-i.startedAt:0,a=r.result?.text?r.result.text.split(`
1762
1762
  `).length:0;if(jk(t.telemetry,{event:"ended",ulid:n,durationMs:s,outputLines:a,errorMessage:r.error?String(r.error):void 0,agentId:r.subAgentId,parentId:r.parentAgentId,...vi({agentId:r.subAgentId,conversationId:r.conversationId,parentAgentId:r.parentAgentId,teamId:o?.getTeamId(),teamName:o?.getTeamName(),createdByAgentId:r.parentAgentId})}),e.subAgentStarts.delete(r.subAgentId),r.toolCallId&&e.sandboxes?.has(r.toolCallId)){let d=r.input.name??"agent",l=await e.sandboxes.close(r.toolCallId,d);s1e(r,d,l)}e.invokeBackendOptional("handleSubAgentEnd",n,r)},onSubAgentSettled:async(r)=>{if(r.toolCallId)await e.sandboxes?.close(r.toolCallId,r.name)}}}function s1e(e,t,n){if(!e.result||typeof e.result.text!=="string")return;e.result.text+=Va(e.result.text,e.result.finishReason,t,n)}function c0(e,t,n,r,o){let i=fk(e,t,n),s=async(a,d)=>{let l=d?.toolCallId,c=e.sandboxes&&l&&t.enableTools?await e.sandboxes.open(l):void 0,u=t.enableTools?Wm(qp({cwd:t.cwd,telemetry:t.telemetry,...So[xo({mode:t.mode})],enableExtractDocument:t.enableExtractDocument===!0&&So[xo({mode:t.mode})].enableExtractDocument,...SY(c,r,_a(t))}),t.extraTools):[];if(t.enableSpawnAgent)u.push(c0(e,t,n,r));return Mi(u)};return Mc({...o?{sessionId:n}:{},...o?.swarm?{swarm:o.swarm}:{},...o?.teammates?{teammates:!0}:{},...o?.configuredAgents?{configuredAgents:o.configuredAgents}:{},...o?.configuredAgentConfigs?{configuredAgentConfigs:o.configuredAgentConfigs}:{},configProvider:{getRuntimeConfig:()=>e.getSession(n)?.runtime.delegatedAgentConfigProvider?.getRuntimeConfig()??{providerId:t.providerId,modelId:t.modelId,cwd:t.cwd,apiKey:t.apiKey,baseUrl:t.baseUrl,headers:t.headers,providerConfig:t.providerConfig,knownModels:t.knownModels,thinking:t.thinking,maxIterations:t.maxIterations,hooks:t.hooks,extensions:t.extensions,logger:t.logger,telemetry:t.telemetry},getConnectionConfig:()=>e.getSession(n)?.runtime.delegatedAgentConfigProvider?.getConnectionConfig()??{providerId:t.providerId,modelId:t.modelId,apiKey:t.apiKey,baseUrl:t.baseUrl,headers:t.headers,providerConfig:t.providerConfig,knownModels:t.knownModels,thinking:t.thinking},updateConnectionDefaults:()=>{}},createSubAgentTools:s,commandSandboxFor:(a)=>Vb(e.sandboxes,a),...i})}function a1e(e,t){if(e&&typeof e==="object")e.handback=t}function TY(e,t){let n=t&&typeof t==="object"?t.handback:void 0;if(n)e?.handedBack("reducer",n)}function xY(e,t,n,r){let o=fk(e,t,n),i={providerId:t.providerId,...t.baseUrl!==void 0?{baseUrl:t.baseUrl}:{},...t.headers!==void 0?{headers:t.headers}:{},...t.providerConfig?.polykv!==void 0?{polykv:t.providerConfig.polykv}:{}},s=()=>e.getSession(n)?.runtime.delegatedAgentConfigProvider??{getRuntimeConfig:()=>({providerId:t.providerId,modelId:t.modelId,cwd:t.cwd,apiKey:t.apiKey,baseUrl:t.baseUrl,headers:t.headers,providerConfig:t.providerConfig,knownModels:t.knownModels,thinking:t.thinking,maxIterations:t.maxIterations,hooks:t.hooks,extensions:t.extensions,logger:t.logger,telemetry:t.telemetry}),getConnectionConfig:()=>({providerId:t.providerId,modelId:t.modelId,apiKey:t.apiKey,baseUrl:t.baseUrl,headers:t.headers,providerConfig:t.providerConfig,knownModels:t.knownModels,thinking:t.thinking}),updateConnectionDefaults:()=>{}},a=(u,h)=>({...u,getRuntimeConfig:()=>({...u.getRuntimeConfig(),sessionId:h})}),d,l=(u,h)=>u.providerId===h.providerId&&u.baseUrl===h.baseUrl,c=async(u)=>{let h=u.control,p=()=>h?.signal??u.signal,m=s(),f=`${n}:swarm:${u.name}:${Date.now().toString(36)}`,g=`${f}:${Math.random().toString(36).slice(2,8)}`,y=e.sandboxes&&t.enableTools?await e.sandboxes.open(g):void 0,w=t.enableTools?Mi(Wm(qp({cwd:t.cwd,telemetry:t.telemetry,...So[xo({mode:t.mode})],enableExtractDocument:t.enableExtractDocument===!0&&So[xo({mode:t.mode})].enableExtractDocument,...SY(y,r,_a(t))}),t.extraTools)).filter((B)=>u.tools===void 0||u.tools.includes(B.name)):[],k=Da(u.emitUpdate,(B)=>o.onSubAgentEvent?.(B),Date.now,{onCompaction:Tc(`swarm worker ${u.name}`,t.logger),...h?.id?{outputId:h.id}:{}}),b=fc(hc({sessionId:n,name:u.name,...t.logger?.log?{logger:{log:(B)=>t.logger?.log?.(B)}}:{}}),u.emitUpdate,h),v=kc(f,u.emitUpdate,t.logger,(B)=>b.waiting(uc(B))),E=u.maxIterations??t.maxIterations,S=u.check?PI(y):void 0,x=u.check?`${u.task}
1763
1763
 
1764
1764
  ${es(u.check,S!==void 0)}`:u.task,T=is(),A,R,C=Nr(u.sampling),L,N=async(B,j,G,z,M)=>{let X=l(m.getRuntimeConfig(),B.getRuntimeConfig());mk(f);let oe=Boolean(u.poolId&&X),H=B.getConnectionConfig();gc(u.emitUpdate,{providerId:H.providerId,modelId:H.modelId,knownModels:H.knownModels,maxIterations:t.maxIterations});let J=!oe&&Ko({providerId:H.providerId,baseUrl:H.baseUrl,polykv:H.providerConfig?.polykv}),he=await Up({instructions:u.systemPrompt,task:rs(x,h?.instructions),pooled:J,cwd:B.getRuntimeConfig().cwd});if(await hs(C,H),oe&&u.poolId)i1e(f,{poolId:u.poolId,prefixTokens:0,layout:"borrowed"});let se=TR({...kR(E),...t.compaction?.cappedThinkingBudgetMessage?{thinkingBudgetMessage:t.compaction.cappedThinkingBudgetMessage}:{},onTransition:(_,F)=>t.logger?.log?.(`[swarm] ${u.name}: worker ${_} (${F})`)}),re=u.check?ts({check:u.check,cwd:e.sandboxes?.workspaceRoot??t.cwd,...S?{wrapSpawn:S}:{}}):void 0,Ge=mi({kind:"subagent",struggle:se,...re?{check:re}:{},...u.takeMessage||h?{consumePendingUserMessage:async()=>(h?.takeMessage??u.takeMessage)?.()}:{},prompt:he.systemPrompt,engineSessionId:f,...J?{polykvWorker:{group:n,layers:he.layers}}:{},pinnedHead:he.pinnedHead,configProvider:a(B,f),...C?{sampling:C,onSampling:(_)=>{L=_,yc(u.emitUpdate,_)}}:{},tools:w,maxIterations:E,parentAgentId:n,...p()?{abortSignal:p()}:{},onEvent:(_)=>{if(Sc(_))j(),b.progressed();k.observe(_)},recoverTurnFault:G??mr({label:`swarm worker ${u.name}`,onWaiting:b.waiting,baseUrl:()=>H.baseUrl,headers:()=>H.headers,...p()?{signal:p()}:{},...u.emitUpdate?{emitUpdate:u.emitUpdate}:{},...t.logger?.log?{logger:{log:(_)=>t.logger?.log?.(_)}}:{}})});R=Ge.getAgentId?.(),h?.track(Ge);let I=await ss({agent:Ge,start:async()=>{if(z&&z.messages.length>0)return Ge.restore(z.messages),await Ge.continue(Bp(z.reason));return he.pinnedHead.length>0?await Ge.runWithHead(he.pinnedHead,he.task):await Ge.run(he.task)},name:u.name,supervisor:se,...E!==void 0?{maxIterations:E}:{},sessionId:n,...h?.id?{cancelId:h.id}:{},...p()?{signal:p()}:{},...u.emitUpdate?{emitUpdate:u.emitUpdate}:{},...re?{check:re}:{},releaseEngineSession:async()=>{mk(f),await l0(f)},lifetime:T,resumeThrough:_c({...M&&m.getRuntimeConfig().nodePlacement?{placement:m.getRuntimeConfig().nodePlacement,nodeId:M}:{},...!M&&m.getRuntimeConfig().slotGate?{slotGate:m.getRuntimeConfig().slotGate}:{},signal:p})});return A=I,I.result},W=(B)=>({...B,...R?{agentId:R}:{},...A?.maxIterations!==void 0?{maxIterations:A.maxIterations}:{},...A?.stopReason?{stopReason:A.stopReason}:{},...A?.state?{state:A.state}:{},...A?.oracle?{oracle:A.oracle}:{}}),D,K,V=(B)=>h?h.continuable(B,async(j)=>{mk(f),await vc(u.emitUpdate,f,j.reason)}):B(void 0);try{let B=m.getRuntimeConfig().nodePlacement;if(B){let z=await V((M)=>xc({placement:B,...p()?{signal:p()}:{},...u.emitUpdate?{emitUpdate:u.emitUpdate}:{},...t.logger?{logger:t.logger}:{},label:`swarm worker ${u.name}`,onWaiting:b.waiting,...h?{relocate:(X,oe)=>h.requeue({reason:oe,avoidNodeId:X})}:{},...M?{requeued:M.avoidNodeId?{avoidNodeId:M.avoidNodeId}:{}}:{},run:(X,oe,H)=>N(X.configProvider,oe,H,M,X.nodeId),beforeRetry:async()=>{await l0(f)}}));return D=W({...z.result,placed:z.placed,...L?{sampling:L}:{}}),D}let j=m.getRuntimeConfig().slotGate,G=(z,M)=>VC(()=>N(m,M,void 0,z),{onRetry:(X,oe)=>t.logger?.log?.(`[PolyKV] ${u.name} refused: the session's window is full; waiting ${oe/1000}s for a worker to finish (attempt ${X})`)});if(D=W(await V((z)=>{let M=(X)=>(u.emitUpdate?.({queued:!1}),G(z,X));return j?j.run(M):M(()=>{})})),L)D={...D,sampling:L};return D}catch(B){throw K=B,B}finally{await T.end(async()=>{if(y){let j=await e.sandboxes?.close(g,u.name).catch(()=>[]);a1e(D??K,j??[])}mk(f),v(),b.dispose();let B=await l0(f).catch(()=>{return});wc(t.logger?.log?(j)=>t.logger?.log?.(j):void 0,B,"[PolyKV]")})}};return Hp({sessionId:n,pools:{snapshot:async()=>{let u=await CD({sessionId:n,providerConfig:i,logger:t.logger});if(!u)return;return{poolId:u.poolId,release:u.borrowed?async()=>{return}:()=>PD({poolId:u.poolId,providerConfig:i,logger:t.logger})}},headroom:async()=>ok(await Jd({sessionId:n,providerConfig:i,logger:t.logger}))?.headroomSessions,admit:async()=>{let u=s().getRuntimeConfig();if(u.nodePlacement)return u.nodePlacement.waiting===0;let h=u.slotGate;return h?await h.canAdmitMore():!0}},reduce:async(u,h)=>{if(!d)return;let p;try{p=await c({name:"reducer",systemPrompt:iI,task:u.map(Pb).join(`
@@ -1850,7 +1850,7 @@ ${d}`:d,t.mode??e.config.mode),c=this.resolveAbsoluteFilePaths(e.config.cwd,t.us
1850
1850
  provider, model, cwd, workspace_root, team_name, enable_tools, enable_spawn, enable_teams,
1851
1851
  parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent, prompt,
1852
1852
  metadata_json, transcript_path, hook_path, messages_path, updated_at
1853
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[e.sessionId,e.source,e.pid,e.startedAt,null,null,"running",0,e.interactive?1:0,e.provider,e.model,e.cwd,e.workspaceRoot,e.teamName??null,e.enableTools?1:0,e.enableSpawn?1:0,e.enableTeams?1:0,null,null,null,null,0,e.prompt??null,e.metadata?JSON.stringify(e.metadata):null,"","",e.messagesPath,ft()])}}function yBe(e){return{text:e.text,usage:e.usage,inputTokens:e.usage.inputTokens,outputTokens:e.usage.outputTokens,iterations:e.iterations,finishReason:e.finishReason,toolCalls:e.toolCalls.map((t)=>({name:t.name,input:t.input,output:t.output,error:t.error,durationMs:t.durationMs}))}}function wBe(e){return e.mode==="plan"?"plan":e.mode==="yolo"?"yolo":"act"}function Avt(e={}){let t=async(r)=>r,n=new Km({sessionService:new Xm(new Ym),capabilities:{toolExecutors:{submit:t}},fetch:e.fetch,telemetry:e.telemetry});return{async startSession(r,o){let i=(r.cwd?.trim()||r.workspaceRoot).trim(),s=await n.startSession({source:Yt.CORE,mode:"automation",sessionMetadata:Yn(o?.sessionMetadata,{mode:"automation",trigger:r.source}),interactive:!1,config:{providerId:gBe(r.provider),modelId:r.model,apiKey:r.apiKey?.trim()||void 0,cwd:i,workspaceRoot:r.workspaceRoot,systemPrompt:r.systemPrompt??"",mode:wBe(r),maxIterations:r.maxIterations,enableTools:r.enableTools!==!1,enableSpawnAgent:r.enableSpawn!==!1,enableAgentTeams:r.enableTeams!==!1,disableMcpSettingsTools:r.disableMcpSettingsTools,agentPluginPaths:r.agentPluginPaths,missionLogIntervalSteps:r.missionStepInterval,missionLogIntervalMs:r.missionTimeIntervalMs},toolPolicies:r.toolPolicies??{"*":{autoApprove:r.autoApproveTools!==!1}},localRuntime:{configExtensions:r.configExtensions}});return{sessionId:s.sessionId,startResult:{sessionId:s.sessionId,manifestPath:s.manifestPath,messagesPath:s.messagesPath}}},async sendSession(r,o){let i=await n.runTurn({sessionId:r,prompt:o.prompt,userImages:o.attachments?.userImages,userFiles:o.attachments?.userFiles?.map((s)=>s.content)});if(!i)throw Error("local hub schedule runtime returned no turn result");return{result:yBe(i)}},async abortSession(r){return await n.abort(r,Error("hub schedule abort")),{applied:!0}},async stopSession(r){return await n.stopSession(r),{applied:!0}}}}import{resolveClineBuildEnv as l9}from"@cerebriline/shared";function bBe(e){if(typeof e==="string")return e.trim()||void 0;if(!Array.isArray(e))return;return e.map((n)=>{if(n&&typeof n==="object"&&"type"in n&&n.type==="text"&&"text"in n&&typeof n.text==="string")return n.text.trim();return""}).filter(Boolean).join(`
1853
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[e.sessionId,e.source,e.pid,e.startedAt,null,null,"running",0,e.interactive?1:0,e.provider,e.model,e.cwd,e.workspaceRoot,e.teamName??null,e.enableTools?1:0,e.enableSpawn?1:0,e.enableTeams?1:0,null,null,null,null,0,e.prompt??null,e.metadata?JSON.stringify(e.metadata):null,"","",e.messagesPath,ft()])}}function yBe(e){return{text:e.text,usage:e.usage,inputTokens:e.usage.inputTokens,outputTokens:e.usage.outputTokens,iterations:e.iterations,finishReason:e.finishReason,toolCalls:e.toolCalls.map((t)=>({name:t.name,input:t.input,output:t.output,error:t.error,durationMs:t.durationMs}))}}function wBe(e){return e.mode==="plan"?"plan":e.mode==="yolo"?"yolo":"act"}function Ivt(e={}){let t=async(r)=>r,n=new Km({sessionService:new Xm(new Ym),capabilities:{toolExecutors:{submit:t}},fetch:e.fetch,telemetry:e.telemetry});return{async startSession(r,o){let i=(r.cwd?.trim()||r.workspaceRoot).trim(),s=await n.startSession({source:Yt.CORE,mode:"automation",sessionMetadata:Yn(o?.sessionMetadata,{mode:"automation",trigger:r.source}),interactive:!1,config:{providerId:gBe(r.provider),modelId:r.model,apiKey:r.apiKey?.trim()||void 0,cwd:i,workspaceRoot:r.workspaceRoot,systemPrompt:r.systemPrompt??"",mode:wBe(r),maxIterations:r.maxIterations,enableTools:r.enableTools!==!1,enableSpawnAgent:r.enableSpawn!==!1,enableAgentTeams:r.enableTeams!==!1,disableMcpSettingsTools:r.disableMcpSettingsTools,agentPluginPaths:r.agentPluginPaths,missionLogIntervalSteps:r.missionStepInterval,missionLogIntervalMs:r.missionTimeIntervalMs},toolPolicies:r.toolPolicies??{"*":{autoApprove:r.autoApproveTools!==!1}},localRuntime:{configExtensions:r.configExtensions}});return{sessionId:s.sessionId,startResult:{sessionId:s.sessionId,manifestPath:s.manifestPath,messagesPath:s.messagesPath}}},async sendSession(r,o){let i=await n.runTurn({sessionId:r,prompt:o.prompt,userImages:o.attachments?.userImages,userFiles:o.attachments?.userFiles?.map((s)=>s.content)});if(!i)throw Error("local hub schedule runtime returned no turn result");return{result:yBe(i)}},async abortSession(r){return await n.abort(r,Error("hub schedule abort")),{applied:!0}},async stopSession(r){return await n.stopSession(r),{applied:!0}}}}import{resolveClineBuildEnv as l9}from"@cerebriline/shared";function bBe(e){if(typeof e==="string")return e.trim()||void 0;if(!Array.isArray(e))return;return e.map((n)=>{if(n&&typeof n==="object"&&"type"in n&&n.type==="text"&&"text"in n&&typeof n.text==="string")return n.text.trim();return""}).filter(Boolean).join(`
1854
1854
  `).trim()||void 0}var WY=120,v0="...";function k0(e){let t=e.trim();if(!t)return"";if(Buffer.byteLength(t,"utf8")<=WY)return t;let n=WY-Buffer.byteLength(v0,"utf8");if(n<=0)return v0;let r="";for(let o of t){if(Buffer.byteLength(r+o,"utf8")>n)break;r+=o}return`${r}${v0}`}async function jY(e){let t=e?.sessionId?.trim()||"unknown",n=typeof e?.metadata?.messagesPath==="string"?e.metadata.messagesPath:void 0,o=[...await cu(n)].reverse().find((d)=>d.role==="assistant"),i=o?bBe(o.content):void 0,s=e?.workspaceRoot?.trim()||"workspace",a=typeof e?.metadata?.prompt==="string"?e.metadata.prompt.trim():s;return{title:`Task completed (${t})`,body:k0(i&&i.length>0?i:a.length>0?a:s),severity:"info"}}import{resolve as qje}from"node:path";import{CLINE_DEFAULT_MODEL_ID as zje,captureSdkError as Ck,createSessionId as gM,HUB_CLIENT_TOOL_APPROVAL_CAPABILITY as Kje}from"@cerebriline/shared";import{isChatWorkspacePath as Gje}from"@cerebriline/shared/storage";function Jm(e){return!!e&&typeof e==="object"&&!Array.isArray(e)}function T0(e){let t=e?.trim();return t?t:void 0}function vBe(e,t){let n=e?.trim();if(!n)return t;let r=Date.parse(n);if(!Number.isFinite(r))return t;return new Date(r).toISOString()}function qY(e,t){return new Date(new Date(e).getTime()+Math.max(0,Math.floor(t))*1000).toISOString()}function zY(e,t){return new Date(new Date(e).getTime()-Math.max(0,Math.floor(t))*1000).toISOString()}function kBe(e,t){if(!e)return t;return new Date(e).getTime()>=new Date(t).getTime()?e:t}function TBe(e,t){let n=e.eventId.trim(),r=e.eventType.trim(),o=e.source.trim(),i=T0(e.subject),s=T0(e.dedupeKey)??`${r}:${o}:${i??n}`;return{eventId:n,eventType:r,source:o,subject:i,occurredAt:vBe(e.occurredAt,t),workspaceRoot:T0(e.workspaceRoot),payload:Jm(e.payload)?e.payload:void 0,attributes:Jm(e.attributes)?e.attributes:void 0,dedupeKey:s}}function S0(e,t){if(!t)return;let n=t.split("."),r=e;for(let o of n){if(!Jm(r))return;r=r[o]}return r}function SBe(e,t){if(e.attributes&&Object.hasOwn(e.attributes,t))return e.attributes[t];if(e.payload&&Object.hasOwn(e.payload,t))return e.payload[t];let n={eventId:e.eventId,eventType:e.eventType,source:e.source,subject:e.subject,occurredAt:e.occurredAt,workspaceRoot:e.workspaceRoot,dedupeKey:e.dedupeKey,attributes:e.attributes,payload:e.payload},r=S0(n,t);if(r!==void 0)return r;if(e.attributes){let o=S0(e.attributes,t);if(o!==void 0)return o}if(e.payload)return S0(e.payload,t);return}function wk(e,t){if(Array.isArray(t))return t.some((n)=>wk(e,n));if(Array.isArray(e))return e.some((n)=>wk(n,t));if(Jm(t)){if(!Jm(e))return!1;return Object.entries(t).every(([n,r])=>wk(e[n],r))}return Object.is(e,t)}function xBe(e,t){if(!t||Object.keys(t).length===0)return!0;return Object.entries(t).every(([n,r])=>wk(SBe(e,n),r))}class x0{store;nowFn;logger;constructor(e){this.store=e.store,this.nowFn=e.now??(()=>Date.now()),this.logger=e.logger}ingestEvent(e){let t=new Date(this.nowFn()).toISOString(),n=TBe(e,t);try{let r=this.store.eventTransaction(()=>this.materializeEvent(n,t));return this.logger?.debug(r.duplicate?"cron.event.duplicate":"cron.event.processed",{eventId:r.event.eventId,eventType:r.event.eventType,source:r.event.source,status:r.event.processingStatus,matchedSpecCount:r.event.matchedSpecCount,queuedRunCount:r.event.queuedRunCount}),r}catch(r){throw this.logger?.error?.("cron.event.failed",{eventId:n.eventId,eventType:n.eventType,error:r}),r}}materializeEvent(e,t){let n=this.store.insertEventLog(e,{receivedAtIso:t});if(!n.created)return{event:n.record,duplicate:!0,matchedSpecs:[],queuedRuns:[],suppressions:[{reason:"duplicate_event",dedupeKey:n.record.dedupeKey}]};let r=this.store.listEventSpecsForType(e.eventType),o=[],i=[],s=[];for(let l of r){if(!xBe(e,l.filters)){o.push({specId:l.specId,externalId:l.externalId,reason:"filter_mismatch",dedupeKey:e.dedupeKey});continue}i.push(l);let c=this.materializeForSpec(l,e,n.record.receivedAt);if(c.run)s.push(c.run);else o.push({specId:l.specId,externalId:l.externalId,reason:c.reason,dedupeKey:e.dedupeKey})}let a=i.length===0?"unmatched":s.length>0?"queued":"suppressed";return this.store.updateEventLogProcessing(n.record.eventId,{status:a,matchedSpecCount:i.length,queuedRunCount:s.length,suppressedCount:o.filter((l)=>l.reason!=="filter_mismatch").length}),{event:this.store.getEventLog(n.record.eventId)??n.record,duplicate:!1,matchedSpecs:i,queuedRuns:s,suppressions:o}}materializeForSpec(e,t,n){let r=t.dedupeKey??t.eventId,o=e.debounceSeconds??0;if(o>0){let d=this.store.findQueuedEventRunForDedupe({specId:e.specId,dedupeKey:r});if(d){let l=kBe(d.scheduledFor,qY(n,o)),c=this.store.updateQueuedEventRunForDebounce({runId:d.runId,triggerEventId:t.eventId,scheduledFor:l});if(c)return{run:c,reason:"dedupe_window"}}}let i=e.dedupeWindowSeconds??0;if(i>0&&this.store.hasRecentEventRunForDedupe({specId:e.specId,dedupeKey:r,sinceIso:zY(n,i)}))return{reason:"dedupe_window"};let s=e.cooldownSeconds??0;if(s>0&&this.store.hasRecentEventRunForSpec({specId:e.specId,sinceIso:zY(n,s)}))return{reason:"cooldown"};return{run:this.store.enqueueRun({specId:e.specId,specRevision:e.revision,triggerKind:"event",triggerEventId:t.eventId,scheduledFor:o>0?qY(n,o):n}),reason:"dedupe_window"}}}import{existsSync as HBe,readdirSync as WBe,readFileSync as jBe,statSync as qBe}from"node:fs";import{relative as zBe}from"node:path";import{resolveCronSpecsDir as KBe}from"@cerebriline/shared/storage";import{createHash as _Be}from"node:crypto";import{stripUtf8Bom as EBe}from"@cerebriline/shared";import ABe from"yaml";function RBe(e){let t=e.replace(/\\/g,"/");if(t.startsWith("events/")&&t.endsWith(".event.md"))return"event";if(t.endsWith(".cron.md"))return"schedule";return"one_off"}function IBe(e){let t=EBe(e).replace(/\r\n/g,`
1855
1855
  `);if(!t.startsWith(`---
1856
1856
  `))return{frontmatter:void 0,body:e};let n=t.slice(4),r=n.indexOf(`
@@ -2054,7 +2054,7 @@ ${e.instructions.trim()}
2054
2054
  max_starts_per_hour = excluded.max_starts_per_hour,
2055
2055
  enabled_by_json = excluded.enabled_by_json,
2056
2056
  enabled_at = excluded.enabled_at,
2057
- updated_at = excluded.updated_at`).run(t,e.mode,e.applyToAgentCreated?1:0,n,r,o,e.enabledBy?JSON.stringify(e.enabledBy):null,OX(e.enabledAt,"enabledAt")??null,i),this.getAutomationPolicy(t)}}var hd={kind:"system",id:"file_reconciler"},ud={kind:"system",id:"task_manager"},DX={kind:"automation_policy",id:"global"},ef=new Set(["completed","failed","cancelled","interrupted"]),wWe=30000,bWe=250;function Bo(){return new Date().toISOString()}function $X(e){return typeof e==="string"&&e.trim()?e.trim():void 0}function FX(e){let t=Date.parse(e);if(!Number.isFinite(t))throw Error("expiresAt must be a valid ISO-8601 timestamp");if(t<=Date.now())throw Error("expiresAt must be in the future")}function UX(e,t){let n=gWe(e,t);return n!==""&&!n.startsWith("..")&&!n.startsWith("/")}function tf(e){if(!e||!Q0(e))return!1;try{return mWe(e).isDirectory()}catch{return!1}}function X0(e,t){return JSON.stringify({type:e.type,title:e.title,description:e.description,instructions:e.instructions,scope:e.scope,workspaceRoot:e.workspaceRoot,cwd:e.cwd,resourcePaths:e.resourcePaths,priority:e.priority,assignee:e.assignee,modelSelection:e.modelSelection,mode:e.mode,systemPrompt:e.systemPrompt,maxIterations:e.maxIterations,timeoutSeconds:e.timeoutSeconds,availableAt:e.availableAt??t.availableAt,expiresAt:e.expiresAt,automationEligible:e.automationEligible})}function J0(e){return JSON.stringify({type:e.type,title:e.title,description:e.description,instructions:e.instructions,scope:e.scope,workspaceRoot:e.workspaceRoot,cwd:e.cwd,resourcePaths:e.resourcePaths,priority:e.priority,assignee:e.assignee,modelSelection:e.modelSelection,mode:e.mode,systemPrompt:e.systemPrompt,maxIterations:e.maxIterations,timeoutSeconds:e.timeoutSeconds,availableAt:e.availableAt,expiresAt:e.expiresAt,automationEligible:e.automationEligible})}function vWe(e,t){return{taskId:t.taskId,expectedRevision:t.revision,type:e.type,title:e.title,description:e.description??null,instructions:e.instructions,scope:e.scope,workspaceRoot:e.workspaceRoot??null,cwd:e.cwd??null,resourcePaths:e.resourcePaths,priority:e.priority,assignee:e.assignee??null,modelSelection:e.modelSelection??null,mode:e.mode??null,systemPrompt:e.systemPrompt??null,maxIterations:e.maxIterations??null,timeoutSeconds:e.timeoutSeconds??null,availableAt:e.availableAt??t.availableAt,expiresAt:e.expiresAt,automationEligible:e.automationEligible,updatedBy:hd}}function kWe(e,t){return{...e,type:t.type??e.type,title:t.title??e.title,description:t.description===null?void 0:t.description??e.description,instructions:t.instructions??e.instructions,scope:t.scope??e.scope,workspaceRoot:t.workspaceRoot===null?void 0:t.workspaceRoot??e.workspaceRoot,cwd:t.cwd===null?void 0:t.cwd??e.cwd,resourcePaths:t.resourcePaths??e.resourcePaths,priority:t.priority??e.priority,assignee:t.assignee===null?void 0:t.assignee??e.assignee,modelSelection:t.modelSelection===null?void 0:t.modelSelection??e.modelSelection,mode:t.mode===null?void 0:t.mode??e.mode,systemPrompt:t.systemPrompt===null?void 0:t.systemPrompt??e.systemPrompt,maxIterations:t.maxIterations===null?void 0:t.maxIterations??e.maxIterations,timeoutSeconds:t.timeoutSeconds===null?void 0:t.timeoutSeconds??e.timeoutSeconds,availableAt:t.availableAt??e.availableAt,expiresAt:t.expiresAt??e.expiresAt,automationEligible:t.automationEligible??e.automationEligible}}class Z0{runtime;store;ownsStore;globalSpecsDir;watcherDebounceMs;watchFiles;logger;publishEvent;scopes=new Map;activeRuns=new Map;backgroundRuns=new Set;maintenanceTimer;queuedAutomationScopes=new Set;automationEnabled;automationPumping=!1;automationPolicyGeneration=0;started=!1;disposed=!1;constructor(e){this.runtime=e.runtime,this.ownsStore=!e.store,this.store=e.store??new Y0({dbPath:e.dbPath}),this.globalSpecsDir=e.globalSpecsDir,this.watcherDebounceMs=Math.max(0,e.watcherDebounceMs??bWe),this.watchFiles=e.watchFiles!==!1,this.automationEnabled=e.automationEnabled!==!1,this.logger=e.logger??yWe,this.publishEvent=e.publish??(()=>{})}async start(){if(this.disposed)throw Error("AgendaTaskManager disposed");if(this.started)return;this.started=!0,this.recoverInterruptedRuns(),await this.reconcileSourceForProjection("global",void 0,"startup");for(let e of this.store.listWorkspaceRoots())if(tf(e))await this.reconcileSourceForProjection("workspace",e,"startup");this.expireTasks(),this.maintenanceTimer=setInterval(()=>{this.expireTasks(),this.queueAutomation()},wWe),this.maintenanceTimer.unref?.(),this.queueAutomation()}async dispose(){if(this.disposed)return;if(this.disposed=!0,this.maintenanceTimer)clearInterval(this.maintenanceTimer);for(let e of this.scopes.values()){if(e.timer)clearTimeout(e.timer);e.watcher?.close()}this.scopes.clear();for(let e of this.activeRuns.values())if(e.sessionId)await this.runtime.abortSession(e.sessionId,"Hub task manager stopped").catch(()=>{});await Promise.allSettled(this.backgroundRuns);for(let[e,t]of this.activeRuns)this.store.updateRun(t.runId,{status:"interrupted",completedAt:Bo(),error:"Hub task manager stopped before the run completed."}),this.store.updateTaskState(e,{status:"failed",currentRunId:null,error:"Hub task manager stopped before the run completed.",updatedBy:ud});if(this.activeRuns.clear(),this.ownsStore)this.store.close()}async createTask(e){this.assertUsable(),FX(e.expiresAt);let t=Ss(e),n={...e,...t},r=$X(n.taskId)??NX("task_");if(await this.reconcileScope(n.scope,n.workspaceRoot),this.store.getTask(r))throw Error(`task ${r} already exists`);let o=this.ensureScope(n.scope,n.workspaceRoot),i=o.resolveWritePath(r,n.specPath);if(Q0(i)||this.store.getTaskBySpecPath(i))throw Error(`task spec already exists: ${i}`);let s=this.store.createTask({...n,taskId:r,specPath:i});try{o.writeSpec({...n,taskId:r},{specPath:i,createOnly:!0})}catch(a){throw this.store.deleteTask(r),a}return this.publish("task.created",s),this.expireTask(s),this.queueAutomation(),this.requireTask(r)}async listTasks(e={}){if(this.assertUsable(),!e.scope||e.scope==="global")await this.reconcileSourceForProjection("global",void 0,"list");if(e.workspaceRoot){if(tf(e.workspaceRoot))await this.reconcileSourceForProjection("workspace",e.workspaceRoot,"list")}else if(e.scope!=="global"){for(let t of this.store.listWorkspaceRoots())if(tf(t))await this.reconcileSourceForProjection("workspace",t,"list")}return this.expireTasks(),this.store.listTasks(e)}async getTask(e){this.assertUsable();let t=this.store.getTask(e.trim());if(t?.scope==="workspace"&&tf(t.workspaceRoot))await this.reconcileSourceForProjection("workspace",t.workspaceRoot,"read");else if(t?.scope==="global")await this.reconcileSourceForProjection("global",void 0,"read");let n=this.store.getTask(e.trim());if(n)this.expireTask(n);return this.store.getTask(e.trim())}async updateTask(e){this.assertUsable();let t=this.requireTask(e.taskId);if(e.updatedBy.id!==hd.id)await this.reconcileSourceForProjection(t.scope,t.workspaceRoot,"update");let n=this.requireTask(e.taskId);if(n.revision!==e.expectedRevision)this.store.updateTask(e);if(n.status==="in_progress")throw Error("an in-progress task cannot be edited");if(n.status==="completed"||n.status==="cancelled"||n.status==="expired")throw Error(`task ${n.taskId} cannot be edited from ${n.status}; create a new task instead`);let r=kWe(n,e);FX(r.expiresAt);let o=Ss(r),i={...r,...o},s={...e,scope:i.scope,workspaceRoot:i.workspaceRoot??null,cwd:i.cwd??null,resourcePaths:i.resourcePaths},a=this.ensureScope(i.scope,i.workspaceRoot),d=n.specPath!==void 0&&UX(a.specsDir,n.specPath);if(!d)await this.reconcileFileStore(a);let l=a.resolveWritePath(n.taskId,d?n.specPath:void 0);if(l!==n.specPath&&(Q0(l)||this.store.getTaskBySpecPath(l)))throw Error(`task spec already exists: ${l}`);let c;if(d&&n.specPath){let f=a.readSpec(n.specPath);if(!f.ok)throw Error(`task spec is invalid: ${f.error}`);if(e.updatedBy.id!==hd.id&&X0(f.spec,n)!==J0(n))throw Error(`task spec changed outside the manager; reconcile task ${n.taskId} and retry`);c=f.contentHash}let u,h;try{u=a.writeSpec(i,{specPath:l,expectedContentHash:c,createOnly:!d}),h=this.store.updateTask(s)}catch(f){try{if(u&&d&&n.specPath)a.writeSpec(n,{specPath:n.specPath,expectedContentHash:u.contentHash});else if(u)a.deleteSpec(l,{expectedContentHash:u.contentHash})}catch(g){this.logError("agenda task update rollback failed",g,{taskId:n.taskId,specPath:l})}throw f}if(!h||!u)throw Error(`unknown task: ${e.taskId}`);let p=this.store.updateTaskState(h.taskId,{status:"pending_approval",approvedRevision:null,currentRunId:null,specPath:u.specPath,error:null,completedAt:null,archivedAt:null,updatedBy:e.updatedBy},h.revision);if(n.specPath&&n.specPath!==u.specPath)this.fileStoreForTask(n).deleteSpec(n.specPath);let m=p??this.requireTask(e.taskId);return this.publish("task.updated",m),this.expireTask(m),this.queueAutomation(),this.requireTask(e.taskId)}async approveTask(e,t,n){this.assertUsable();let r=await this.refreshAndVerifyTaskIntent(e);if(this.assertRevision(r,n),this.isExpired(r))throw this.expireTask(r),Error(`task ${e} has expired`);if(r.status==="approved"&&r.approvedRevision===r.revision)return r;if(r.status!=="pending_approval"&&r.status!=="failed")throw Error(`task ${e} cannot be approved from ${r.status}`);let o=this.store.updateTaskState(e,{status:"approved",approvedRevision:r.revision,error:null,updatedBy:t},r.revision);if(!o)throw Error(`unknown task: ${e}`);return this.publish("task.updated",o),this.queueAutomation(),o}async cancelTask(e,t,n,r){this.assertUsable();let o=this.requireTask(e);if(this.assertRevision(o,n),o.status==="cancelled")return o;if(o.status==="completed"||o.status==="expired")throw Error(`task ${e} cannot be cancelled from ${o.status}`);let i=o.currentRunId?this.store.getRun(o.currentRunId):void 0,s=r?.trim()||"Agenda task cancelled";if(i&&!ef.has(i.status))this.store.updateRun(i.runId,{status:"cancelled",completedAt:Bo(),error:r?.trim()||void 0});this.activeRuns.delete(e);let a=this.store.updateTaskState(e,{status:"cancelled",approvedRevision:null,currentRunId:null,error:r?.trim()||null,updatedBy:t},o.revision);if(!a)throw Error(`unknown task: ${e}`);if(this.publish("task.updated",a,i),i?.sessionId)try{await this.runtime.abortSession(i.sessionId,s)}catch(d){this.logError("agenda task session abort failed",d,{taskId:e,runId:i.runId,sessionId:i.sessionId})}return a}async runTask(e,t,n,r){this.assertUsable();let o=await this.refreshAndVerifyTaskIntent(e);if(this.assertRevision(o,n),this.isExpired(o))throw this.expireTask(o),Error(`task ${e} has expired`);if(Date.parse(o.availableAt)>Date.now())throw Error(`task ${e} is not available yet`);if(o.status!=="approved"&&o.status!=="failed")throw Error(`task ${e} must be approved before it can run`);if(o.approvedRevision!==o.revision)throw Error(`task ${e} approval is stale`);if(this.activeRuns.has(e)||o.currentRunId)throw Error(`task ${e} already has an active run`);let i=this.store.createRun({taskId:e,taskRevision:o.revision,requestedByClientId:r}),s=this.store.updateTaskState(e,{currentRunId:i.runId,lastRunId:i.runId,error:null,completedAt:null,updatedBy:t},o.revision);if(!s)throw Error(`unknown task: ${e}`);this.activeRuns.set(e,{runId:i.runId}),this.publish("task.updated",s,i);try{let a=await this.runtime.startSession(s,i,r,{unattended:t.kind==="automation_policy"&&this.store.getAutomationPolicy(s.scope==="workspace"&&s.workspaceRoot?s.workspaceRoot:"global").mode==="unattended"}),d=this.store.getRun(i.runId),l=this.store.getTask(e);if(!d||ef.has(d.status)||l?.status!==o.status||l.currentRunId!==i.runId){if(d&&!ef.has(d.status))this.store.updateRun(i.runId,{status:"cancelled",sessionId:a.sessionId,completedAt:Bo(),error:"Task changed or was cancelled while its session was starting."});else if(d)this.store.updateRun(i.runId,{sessionId:a.sessionId});throw this.activeRuns.delete(e),await this.runtime.abortSession(a.sessionId,"Agenda task was cancelled while its session was starting").catch((u)=>this.logError("cancelled agenda task session abort failed",u,{taskId:e,runId:i.runId,sessionId:a.sessionId})),Error(`task ${e} changed or was cancelled while starting`)}i=this.store.updateRun(i.runId,{status:"running",sessionId:a.sessionId,startedAt:Bo()})??i,s=this.store.updateTaskState(e,{status:"in_progress",lastSessionId:a.sessionId,updatedBy:t})??s,this.activeRuns.set(e,{runId:i.runId,sessionId:a.sessionId}),this.publish("task.run.started",s,i);let c=this.finishRun(s,i,a.sessionId);return this.backgroundRuns.add(c),c.finally(()=>this.backgroundRuns.delete(c)),{task:s,run:i}}catch(a){throw await this.finishRunFailure(s,i,a),a}}async getAutomationPolicy(e="global"){return this.assertUsable(),this.store.getAutomationPolicy(e)}async setAutomationPolicy(e,t){this.assertUsable();let n=Bo(),r=this.store.setAutomationPolicy({...e,enabledBy:e.mode==="manual"?void 0:t,enabledAt:e.mode==="manual"?void 0:n});return this.automationPolicyGeneration+=1,this.publishEvent("task.automation.updated",{policy:r}),this.queueAutomation(r.scopeKey),r}notifyAutomationReadinessChanged(){if(!this.disposed)this.queueAutomation()}async finishRun(e,t,n){try{let r=await this.runtime.runSession(n,e,t),o=this.store.getRun(t.runId);if(!o||ef.has(o.status))return;if(r.status==="completed"){let i=Bo(),s=this.store.updateRun(t.runId,{status:"completed",completedAt:i,resultSummary:r.summary,error:null})??o,a=this.store.updateTaskState(e.taskId,{status:"completed",currentRunId:null,error:null,completedAt:i,updatedBy:ud})??this.requireTask(e.taskId);this.publish("task.run.completed",a,s)}else if(r.status==="cancelled")await this.cancelTask(e.taskId,ud,e.revision,r.error||"Task session was cancelled");else await this.finishRunFailure(e,t,Error(r.error||r.summary||"Task session failed"))}catch(r){await this.finishRunFailure(e,t,r)}finally{this.activeRuns.delete(e.taskId);let r=this.store.getTask(e.taskId);(r?.scope==="workspace"&&r.workspaceRoot?this.reconcileScope("workspace",r.workspaceRoot):this.reconcileScope("global")).catch((i)=>this.logError("post-run agenda task reconciliation failed",i,{taskId:e.taskId})),this.queueAutomation()}}async finishRunFailure(e,t,n){let r=this.store.getRun(t.runId);if(!r||ef.has(r.status))return;let o=n instanceof Error?n.message:String(n),i=this.store.updateRun(t.runId,{status:"failed",completedAt:Bo(),error:o})??r,s=this.store.getTask(e.taskId);if(!s||s.status==="cancelled")return;if(s.currentRunId!==t.runId){this.activeRuns.delete(e.taskId),this.publish("task.run.failed",s,i);return}let a=this.store.updateTaskState(e.taskId,{status:"failed",currentRunId:null,error:o,updatedBy:ud})??s;this.activeRuns.delete(e.taskId),this.publish("task.run.failed",a,i)}ensureScope(e,t){let n=$X(t);if(e==="workspace"&&!n)throw Error("workspaceRoot is required for workspace task scope");if(e==="workspace"&&!tf(n))throw Error("workspaceRoot must be an existing directory");let r=e==="global"?"global":`workspace:${n}`,o=this.scopes.get(r);if(o)return o.store;let i=new G0({scope:e,workspaceRoot:n,taskSpecsDir:e==="global"?this.globalSpecsDir:void 0}),s={store:i},a=!0;try{i.ensureSpecsDir();let d=this.watchFiles?this.resolveWatchRoot(i.specsDir):void 0;if(d!==void 0)s.watcher=fWe(d,(l,c)=>{if(!c||!String(c).endsWith(".task.md"))return;if(s.timer)clearTimeout(s.timer);s.timer=setTimeout(()=>{s.timer=void 0,this.reconcileFileStore(i).catch((u)=>this.logError("agenda task watcher reconciliation failed",u,{specsDir:i.specsDir}))},this.watcherDebounceMs)}),s.watcher.on("error",(l)=>this.logError("agenda task watcher failed",l,{specsDir:i.specsDir}))}catch(d){a=!1,this.logError("agenda task source could not be attached",d,{specsDir:i.specsDir})}if(a)this.scopes.set(r,s);return i}async reconcileScope(e,t){let n=this.ensureScope(e,t);await this.reconcileFileStore(n)}async reconcileSourceForProjection(e,t,n){try{await this.reconcileScope(e,t)}catch(r){this.logError(`agenda task source ${n} reconciliation failed`,r,{scope:e,...t?{workspaceRoot:t}:{}})}}async reconcileFileStore(e){if(this.disposed)return;let t=new Set;for(let r of e.listSpecs()){if(t.add(r.specPath),!r.ok){this.logger.log("agenda task spec is invalid",{severity:"warn",specPath:r.specPath,error:r.error});continue}try{let o=r.spec;if(!o.taskId)o=e.writeSpec({...o,taskId:NX("task_")},{specPath:o.specPath,expectedContentHash:o.contentHash});let i=this.store.getTaskBySpecPath(o.specPath);if(i&&o.taskId&&o.taskId!==i.taskId)this.logger.log("agenda task id is immutable for an existing spec",{severity:"warn",taskId:i.taskId,requestedTaskId:o.taskId,specPath:o.specPath}),o=e.writeSpec({...o,taskId:i.taskId},{specPath:o.specPath,expectedContentHash:o.contentHash});let s=o.taskId?this.store.getTask(o.taskId):void 0,a=i??s;if(s?.specPath&&s.specPath!==o.specPath){this.logger.log("agenda task id is already owned by another spec",{severity:"warn",taskId:o.taskId,specPath:o.specPath});continue}if(!a){let d=this.store.createTask(TX(o,hd));this.publish("task.created",d),this.expireTask(d);continue}if(a.archivedAt){let d=a.status==="cancelled"&&a.error==="Task spec was deleted.",l=this.store.updateTaskState(a.taskId,{status:d?"pending_approval":a.status,approvedRevision:d?null:a.approvedRevision,archivedAt:null,error:d?null:a.error,updatedBy:hd});if(l)a=l,this.publish("task.updated",l)}if(X0(o,a)===J0(a))continue;if(a.status==="in_progress"){this.logger.log("agenda task edit deferred until its run completes",{severity:"warn",taskId:a.taskId});continue}if(a.status==="completed"||a.status==="cancelled"||a.status==="expired"){this.logger.log("terminal agenda task edits are not applied",{severity:"warn",taskId:a.taskId,status:a.status}),e.writeSpec(a,{specPath:o.specPath,expectedContentHash:o.contentHash});continue}await this.updateTask(vWe(o,a))}catch(o){this.logError("agenda task spec reconciliation failed",o,{specPath:r.spec.specPath})}}let n=this.store.listTasks({scope:e.scope,workspaceRoot:e.workspaceRoot,includeArchived:!0,limit:1000});for(let r of n){if(!r.specPath||!UX(e.specsDir,r.specPath)||t.has(r.specPath)||r.archivedAt)continue;if(r.status==="in_progress")await this.cancelTask(r.taskId,hd,r.revision,"Task spec was deleted.");let o=this.store.updateTaskState(r.taskId,{status:r.status==="completed"||r.status==="expired"?r.status:"cancelled",approvedRevision:null,currentRunId:null,error:r.status==="cancelled"?r.error??null:"Task spec was deleted.",archivedAt:Bo(),updatedBy:hd});if(o)this.publish("task.deleted",o)}this.queueAutomation()}expireTasks(){for(let e of this.store.listTasks({limit:1000}))this.expireTask(e)}expireTask(e){if(!this.isExpired(e))return;if(e.currentRunId||e.status==="in_progress"||e.status==="completed"||e.status==="cancelled"||e.status==="expired")return;let t=this.store.updateTaskState(e.taskId,{status:"expired",approvedRevision:null,currentRunId:null,error:"Task expired before it was started.",updatedBy:ud});if(t)this.publish("task.updated",t)}isExpired(e){return Date.parse(e.expiresAt)<=Date.now()}recoverInterruptedRuns(){let e=Bo();for(let t of this.store.listRuns({status:["starting","running"],limit:1000})){this.store.updateRun(t.runId,{status:"interrupted",completedAt:e,error:"Hub restarted while this task was running."});let n=this.store.getTask(t.taskId);if(!n||n.currentRunId!==t.runId)continue;if(n.status==="completed"||n.status==="cancelled"||n.status==="expired"){this.store.updateTaskState(n.taskId,{currentRunId:null});continue}if(t.status==="starting"&&n.approvedRevision===t.taskRevision&&n.revision===t.taskRevision&&!this.isExpired(n)){this.store.updateTaskState(n.taskId,{status:"approved",currentRunId:null,error:"Hub restarted before this task session was linked.",updatedBy:ud});continue}this.store.updateTaskState(n.taskId,{status:t.status==="starting"?"pending_approval":"failed",approvedRevision:t.status==="starting"?null:n.approvedRevision,currentRunId:null,error:"Hub restarted while this task was running.",updatedBy:ud})}}queueAutomation(e){if(this.disposed||!this.automationEnabled)return;if(e)this.queuedAutomationScopes.add(e);else for(let t of this.store.listAutomationPolicies())this.queuedAutomationScopes.add(t.scopeKey);if(this.automationPumping)return;queueMicrotask(()=>{this.pumpAutomation().catch((t)=>this.logError("agenda task automation pump failed",t,{}))})}async pumpAutomation(){if(this.disposed||this.automationPumping)return;this.automationPumping=!0;let e=this.automationPolicyGeneration;try{while(this.queuedAutomationScopes.size>0){let t=this.queuedAutomationScopes.values().next().value;if(!t)break;this.queuedAutomationScopes.delete(t);let n=this.store.getAutomationPolicy(t);if(n.mode==="manual")continue;this.expireTasks();let r=this.store.listRuns({limit:1000}).filter((s)=>Date.parse(s.claimedAt)>=Date.now()-3600000).length,o=Math.min(Math.max(0,n.maxConcurrentRuns-this.activeRuns.size),Math.max(0,n.maxStartsPerHour-r));if(o<=0)continue;let i=this.store.listTasks({statuses:["pending_approval","approved"],...t==="global"?{}:{scope:"workspace",workspaceRoot:t},automationEligible:!0,availableBefore:Bo(),limit:1000});for(let s of i){if(o<=0)break;if(e!==this.automationPolicyGeneration)return;try{let a=s;if(a.status==="pending_approval"){if(!this.canAutomaticallyApprove(a,n))continue;a=await this.approveTask(a.taskId,DX,a.revision)}if(e!==this.automationPolicyGeneration)return;if(n.mode==="auto_start"&&this.runtime.isInteractiveClientAvailable?.()!==!0)continue;await this.runTask(a.taskId,DX,a.revision),o-=1}catch(a){this.logError("agenda task automation start failed",a,{taskId:s.taskId})}}}}finally{if(this.automationPumping=!1,this.queuedAutomationScopes.size>0)this.queueAutomation()}}canAutomaticallyApprove(e,t){let n=[e.createdBy,e.updatedBy];if(n.some((r)=>r.kind==="system"&&r.id==="file_reconciler"))return!1;if(!t.applyToAgentCreated&&n.some((r)=>r.kind==="agent"))return!1;return this.taskChainDepth(e)<=t.maxChainDepth}taskChainDepth(e){let t=0,n=e,r=new Set([e.taskId]);while(n.originTaskId){if(r.has(n.originTaskId))return Number.POSITIVE_INFINITY;r.add(n.originTaskId);let o=this.store.getTask(n.originTaskId);if(!o)break;t+=1,n=o}return t}fileStoreForTask(e){return this.ensureScope(e.scope,e.workspaceRoot)}async refreshAndVerifyTaskIntent(e){let t=this.requireTask(e);await this.reconcileScope(t.scope,t.workspaceRoot);let n=this.requireTask(e);if(n.archivedAt)throw Error(`task ${e} no longer has an active task spec`);if(!n.specPath)throw Error(`task ${e} has no canonical task spec`);let r;try{r=this.fileStoreForTask(n).readSpec(n.specPath)}catch(o){throw Error(`task ${e} task spec is unavailable: ${o instanceof Error?o.message:String(o)}`)}if(!r.ok)throw Error(`task ${e} task spec is invalid: ${r.error}`);if(r.spec.taskId!==n.taskId||X0(r.spec,n)!==J0(n))throw Error(`task ${e} task spec does not match revision ${n.revision}`);return n}requireTask(e){let t=e.trim();if(!t)throw Error("taskId is required");let n=this.store.getTask(t);if(!n)throw Error(`unknown task: ${t}`);return n}assertRevision(e,t){if(e.revision!==t)throw Error(`task ${e.taskId} is at revision ${e.revision}; the requested revision is stale`)}publish(e,t,n){this.publishEvent(e,{task:t,...n?{run:n}:{}},n?.sessionId??t.lastSessionId)}resolveWatchRoot(e){try{return pWe.native(e)}catch(t){this.logError("agenda task watcher disabled: specs dir could not be resolved",t,{specsDir:e});return}}logError(e,t,n){if(this.logger.error)this.logger.error(e,{...n,error:t});else this.logger.log(e,{...n,error:t,severity:"error"})}assertUsable(){if(this.disposed)throw Error("AgendaTaskManager disposed")}}import{createSessionId as _We}from"@cerebriline/shared";import{createSessionId as xWe}from"@cerebriline/shared";function TWe(e){switch(e){case"idle":return"idle";case"pending":return"pending";case"completed":return"completed";case"failed":return"failed";case"cancelled":return"aborted";default:return"running"}}function SWe(e){let t=e.metadata&&typeof e.metadata==="object"?JSON.parse(JSON.stringify(e.metadata)):{};if(e.parentSessionId?.trim())t.parentSessionId=e.parentSessionId;if(e.parentAgentId?.trim())t.parentAgentId=e.parentAgentId;if(e.agentId?.trim())t.agentId=e.agentId;if(e.conversationId?.trim())t.conversationId=e.conversationId;if(e.messagesPath?.trim())t.messagesPath=e.messagesPath;if(e.prompt?.trim())t.prompt=e.prompt;if(e.provider?.trim())t.provider=e.provider;if(e.model?.trim())t.model=e.model;if(e.source?.trim())t.source=e.source;if(typeof e.pid==="number")t.pid=e.pid;return Object.keys(t).length>0?t:void 0}function xk(e,t,n,r){return{sessionId:e.sessionId,workspaceRoot:e.workspaceRoot,cwd:e.cwd,createdAt:Date.parse(e.startedAt),updatedAt:Date.parse(e.updatedAt),createdByClientId:t?.createdByClientId??"hub",status:TWe(e.status),participants:t?[...t.participants.values()]:[],metadata:SWe(e),runtimeOptions:{enableTools:e.enableTools,enableSpawn:e.enableSpawn,enableTeams:e.enableTeams,mode:typeof e.metadata?.mode==="string"?e.metadata.mode:void 0,systemPrompt:typeof e.metadata?.systemPrompt==="string"?e.metadata.systemPrompt:void 0},runtimeSession:e.agentId?{agentId:e.agentId,team:e.teamName?{teamId:e.teamName}:void 0}:void 0,...n?{usage:{...n}}:{},...r?{aggregateUsage:{...r}}:{}}}function ie(e,t){return{version:e.version,requestId:e.requestId,ok:!0,...t!==void 0?{payload:t}:{}}}function pe(e,t,n){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:t,message:n}}}function Ho(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:void 0}function Rt(e){if(typeof e.payload?.sessionId==="string")return e.payload.sessionId.trim();return e.sessionId?.trim()??""}function Xr(e,t,n){return{version:"v1",event:e,eventId:xWe("hevt_"),sessionId:n,timestamp:Date.now(),payload:t}}async function Sn(e,t){let n=await e.sessionHost.getSession(t);if(!n)return;let r=await e.sessionHost.getAccumulatedUsage?.(t);return xk(n,e.sessionState.get(t),r?.usage,r?.aggregateUsage)}async function $n(e,t){let n=await e.sessionHost.getSession(t);if(!n)return;let r=await e.sessionHost.getAccumulatedUsage?.(t);return nd({session:n,usage:r?.usage,aggregateUsage:r?.aggregateUsage})}function eM(e,t,n,r,o={}){let i=e.sessionState.get(t);if(i){if(o.interactive!==void 0)i.interactive=o.interactive;if(r==="creator"&&!i.createdByClientId)i.createdByClientId=n;if(!i.participants.has(n))i.participants.set(n,{clientId:n,attachedAt:Date.now(),role:r});return i}let s={createdByClientId:n,interactive:o.interactive??!0,participants:new Map([[n,{clientId:n,attachedAt:Date.now(),role:r}]])};return e.sessionState.set(t,s),s}function BX(e,t,n,r,o={}){let i=e.sessionState.get(t);if(i){if(o.interactive!==void 0)i.interactive=o.interactive;if(!i.participants.has(n))i.participants.set(n,{clientId:n,attachedAt:Date.now(),role:r});return i}let s={interactive:o.interactive??!0,participants:new Map([[n,{clientId:n,attachedAt:Date.now(),role:r}]])};return e.sessionState.set(t,s),s}async function _k(e,t){let n=_We("approval_"),r=t.sessionId;if(e.sessionState.get(r)?.interactive===!1)return{approved:!1,reason:"Tool approval requires an interactive session, but this session is non-interactive."};let i;try{i=await e.sessionHost.getSession(r)}catch{i=void 0}let s=typeof i?.metadata?.agendaTaskId==="string"?i.metadata.agendaTaskId:void 0;return await new Promise((a)=>{let d=e.buildEvent("approval.requested",{approvalId:n,sessionId:t.sessionId,agentId:t.agentId,conversationId:t.conversationId,iteration:t.iteration,toolCallId:t.toolCallId,toolName:t.toolName,inputJson:JSON.stringify(t.input??null),policy:t.policy,agendaTaskId:s},r);e.pendingApprovals.set(n,{sessionId:r,resolve:a,requestedEvent:d}),e.publish(d)})}function HX(e,t){let n=[];for(let r of e.pendingApprovals.values()){if(!r.requestedEvent)continue;if(t&&r.sessionId!==t)continue;n.push(r.requestedEvent)}return n}function tM(e,t,n){let r=e.pendingApprovals.get(t);if(!r)return;return e.pendingApprovals.delete(t),r.resolve(n),{sessionId:r.sessionId}}function nM(e,t,n){let r=0;for(let[o,i]of[...e.pendingApprovals.entries()]){if(!t({approvalId:o,sessionId:i.sessionId}))continue;e.pendingApprovals.delete(o),i.resolve({approved:!1,reason:n}),e.publish(e.buildEvent("approval.resolved",{approvalId:o,approved:!1,cancelled:!0,reason:n},i.sessionId)),r+=1}return r}async function WX(e,t){let n=typeof t.payload?.approvalId==="string"?t.payload.approvalId.trim():"";if(!e.pendingApprovals.get(n))return pe(t,"approval_not_found",`Unknown approval: ${n}`);let o=typeof t.payload?.reason==="string"?t.payload.reason:t.payload?.payload&&typeof t.payload.payload==="object"&&!Array.isArray(t.payload.payload)&&typeof t.payload.payload.reason==="string"?t.payload.payload.reason:void 0,i=t.payload?.approved===!0,s=tM(e,n,{approved:i,reason:o});if(!s)return pe(t,"approval_not_found",`Unknown approval: ${n}`);return e.publish(e.buildEvent("approval.resolved",{approvalId:n,approved:i,reason:o},s.sessionId)),ie(t,{approvalId:n,approved:i})}import{createSessionId as RWe}from"@cerebriline/shared";function EWe(e){if(e instanceof Error)return{name:e.name,message:e.message,stack:e.stack};if(e===void 0)return;return e}var jX={debug:10,info:20,warn:30,error:40,silent:50};function AWe(){let e=process.env.CLINE_HUB_LOG_LEVEL?.trim().toLowerCase();if(e==="debug"||e==="info"||e==="warn"||e==="error"||e==="silent")return e;return process.env.VITEST?"error":"info"}function ke(e,t,n={}){if(jX[e]<jX[AWe()])return;let r=JSON.stringify({ts:new Date().toISOString(),level:e,component:"hub",message:t,...Object.fromEntries(Object.entries(n).map(([o,i])=>[o,EWe(i)]).filter(([,o])=>o!==void 0))});if(e==="error"||e==="warn"){console.error(`[hub] ${r}`);return}console.log(`[hub] ${r}`)}function pd(e,t){let n=t instanceof Error?t.stack||t.message:String(t);ke("error",e,{error:n})}async function qX(e,t,n,r,o,i){let s=RWe("capreq_"),a=performance.now();return ke("info","capability.request.start",{requestId:s,sessionId:t,capabilityName:n,targetClientId:o}),await new Promise((d,l)=>{e.pendingCapabilityRequests.set(s,{sessionId:t,targetClientId:o,capabilityName:n,onProgress:i,resolve:(c)=>{if(ke(c.ok?"info":"warn","capability.request.end",{requestId:s,sessionId:t,capabilityName:n,targetClientId:o,ok:c.ok,error:c.error,durationMs:Math.round(performance.now()-a)}),!c.ok){l(Error(c.error||`Capability ${n} was rejected by ${o}.`));return}d(c.payload)}}),e.publish(e.buildEvent("capability.requested",{requestId:s,targetClientId:o,capabilityName:n,payload:r},t)),ke("info","capability.request.published",{requestId:s,sessionId:t,capabilityName:n,targetClientId:o})})}function zX(e,t){let n=typeof t.payload?.requestId==="string"?t.payload.requestId.trim():"",r=e.pendingCapabilityRequests.get(n);if(!r)return ie(t,{requestId:n,ignored:!0});if((t.clientId?.trim()||"")!==r.targetClientId)return pe(t,"capability_wrong_client",`Capability request ${n} is owned by ${r.targetClientId}`);if(t.sessionId?.trim()&&t.sessionId.trim()!==r.sessionId)return pe(t,"capability_wrong_session",`Capability request ${n} belongs to session ${r.sessionId}`);let i=t.payload?.payload&&typeof t.payload.payload==="object"&&!Array.isArray(t.payload.payload)?t.payload.payload:{};return r.onProgress?.(i),ie(t,{requestId:n})}function _s(e,t,n){let r=0;for(let[o,i]of[...e.pendingCapabilityRequests.entries()]){if(!t({requestId:o,...i}))continue;e.pendingCapabilityRequests.delete(o),ke("warn","capability.request.cancelled",{requestId:o,sessionId:i.sessionId,capabilityName:i.capabilityName,targetClientId:i.targetClientId,reason:n}),i.resolve({ok:!1,error:n}),e.publish(e.buildEvent("capability.resolved",{requestId:o,capabilityName:i.capabilityName,targetClientId:i.targetClientId,ok:!1,cancelled:!0,error:n},i.sessionId)),r+=1}return r}async function KX(e,t){let n=typeof t.payload?.sessionId==="string"?t.payload.sessionId.trim():t.sessionId?.trim()||"",r=typeof t.payload?.capabilityName==="string"?t.payload.capabilityName.trim():"",o=typeof t.payload?.targetClientId==="string"?t.payload.targetClientId.trim():"";if(!n||!r||!o)return pe(t,"invalid_capability_request","capability.request requires sessionId, capabilityName, and targetClientId");try{let i=t.payload?.payload&&typeof t.payload.payload==="object"&&!Array.isArray(t.payload.payload)?t.payload.payload:{},s=await e.requestCapability(n,r,i,o);return ie(t,s)}catch(i){return pe(t,"capability_request_failed",i instanceof Error?i.message:String(i))}}function GX(e,t){let n=typeof t.payload?.requestId==="string"?t.payload.requestId.trim():"",r=e.pendingCapabilityRequests.get(n);if(!r)return ie(t,{requestId:n,ignored:!0});let o=t.clientId?.trim()||"";if(o!==r.targetClientId)return pe(t,"capability_wrong_client",`Capability request ${n} is owned by ${r.targetClientId}`);if(t.sessionId?.trim()&&t.sessionId.trim()!==r.sessionId)return pe(t,"capability_wrong_session",`Capability request ${n} belongs to session ${r.sessionId}`);e.pendingCapabilityRequests.delete(n);let i=t.payload?.payload&&typeof t.payload.payload==="object"&&!Array.isArray(t.payload.payload)?t.payload.payload:void 0,s=typeof t.payload?.error==="string"?t.payload.error:void 0,a=t.payload?.ok===!0;return ke(a?"info":"warn","capability.respond",{requestId:n,sessionId:r.sessionId,capabilityName:r.capabilityName,targetClientId:r.targetClientId,respondedByClientId:o,ok:a,error:s}),r.resolve({ok:a,payload:i,error:s}),e.publish(e.buildEvent("capability.resolved",{requestId:n,capabilityName:r.capabilityName,targetClientId:r.targetClientId,respondedByClientId:o,ok:a,payload:i,error:s},r.sessionId)),ie(t,{requestId:n,ok:a})}import{createSessionId as IWe}from"@cerebriline/shared";function VX(e,t){let n=t.payload,r=n?.clientId?.trim()||t.clientId?.trim()||IWe("client_");return e.clients.set(r,{clientId:r,clientType:n?.clientType??"unknown",displayName:n?.displayName,actorKind:n?.actorKind??"client",connectedAt:Date.now(),lastSeenAt:Date.now(),transport:n?.transport??"native",capabilities:n?.capabilities??[],metadata:n?.metadata,workspaceContext:n?.workspaceContext}),e.publish(e.buildEvent("hub.client.registered",{clientId:r,clientType:n?.clientType??"unknown",displayName:n?.displayName,metadata:n?.metadata,connectedAt:Date.now()})),ie(t,{clientId:r})}function YX(e,t){let n=t.clientId?.trim(),r=n?e.clients.get(n):void 0;if(!n||!r)return pe(t,"client_not_found","Client is not registered with this hub.");let o=Ho(t.payload?.metadata);if(r.lastSeenAt=Date.now(),o)r.metadata=JSON.parse(JSON.stringify(o));if(Array.isArray(t.payload?.capabilities))r.capabilities=t.payload.capabilities.flatMap((i)=>{if(!i||typeof i!=="object"||Array.isArray(i))return[];let s=i;if(typeof s.name!=="string"||!s.name.trim())return[];return[{name:s.name.trim(),...typeof s.description==="string"?{description:s.description}:{},...Array.isArray(s.scopes)&&s.scopes.every((a)=>typeof a==="string")?{scopes:s.scopes}:{}}]});return ie(t)}function XX(e,t,n){let r=t.clientId?.trim();if(r)e.clients.delete(r),n(r),e.publish(e.buildEvent("hub.client.disconnected",{clientId:r}));return ie(t)}function JX(e,t){return ie(t,{clients:[...e.clients.values()]})}import{buildConnectorConnectArgs as UWe,CONNECTOR_PLATFORMS as BWe,connectorChannelsFromPlatforms as HWe,listConnectorCatalog as WWe,mergeConnectorConnectArgs as jWe,shouldIncludeConnectorField as qWe}from"@cerebriline/shared";import{withConnectorStore as oM}from"@cerebriline/shared/db";import{existsSync as CWe,readdirSync as PWe,readFileSync as MWe}from"node:fs";import{join as QX}from"node:path";import{listConnectorCatalog as OWe}from"@cerebriline/shared";import{resolveConnectorDataDir as LWe}from"@cerebriline/shared/storage";var ZX={startedAt:(e)=>typeof e.startedAt==="string"?e.startedAt:void 0,port:(e)=>typeof e.port==="number"?e.port:void 0,baseUrl:(e)=>typeof e.baseUrl==="string"?e.baseUrl:void 0,connectionMode:(e)=>typeof e.connectionMode==="string"?e.connectionMode:void 0,userName:(e)=>typeof e.userName==="string"?e.userName:void 0,botUsername:(e)=>typeof e.botUsername==="string"?e.botUsername:void 0,applicationId:(e)=>typeof e.applicationId==="string"?e.applicationId:void 0,phoneNumberId:(e)=>typeof e.phoneNumberId==="string"?e.phoneNumberId:void 0},NWe={discord:{required:["userName","applicationId"],optional:["startedAt","port","baseUrl"]},telegram:{required:["botUsername"],optional:["startedAt"]},gchat:{required:["userName"],optional:["startedAt","port","baseUrl"]},linear:{required:["userName"],optional:["startedAt","port","baseUrl"]},slack:{required:["userName"],optional:["startedAt","connectionMode","port","baseUrl"]},whatsapp:{required:["userName"],optional:["startedAt","phoneNumberId","port","baseUrl"]}};function DWe(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch{return!1}}function $We(e,t){let n;try{let d=JSON.parse(MWe(t,"utf8"));if(!d||typeof d!=="object"||Array.isArray(d))return;n=d}catch{return}let r=typeof n.pid==="number"?n.pid:void 0,o=typeof n.hubUrl==="string"?n.hubUrl:typeof n.rpcAddress==="string"?n.rpcAddress:void 0;if(!r||!o||!DWe(r))return;let i=NWe[e];if(!i)return;let s={};for(let d of i.required){let l=ZX[d](n);if(!l||typeof l==="string"&&!l.trim())return;s[d]=l}for(let d of i.optional){let l=ZX[d](n);if(l!==void 0)s[d]=l}let a=e==="telegram"?s.botUsername:e==="discord"?s.applicationId:e==="whatsapp"&&typeof n.instanceKey==="string"?n.instanceKey:s.userName;if(!a)return;return{id:`${e}:${a}`,type:e,instanceId:a,pid:r,hubUrl:o,...s}}function rM(){let e=[];for(let{name:t}of OWe()){let n=QX(LWe(),t);if(!CWe(n))continue;for(let r of PWe(n)){if(!r.endsWith(".json")||r.endsWith(".threads.json"))continue;let o=$We(t,QX(n,r));if(o)e.push(o)}}return e.sort((t,n)=>{if(t.type!==n.type)return t.type.localeCompare(n.type);let r=t.botUsername??t.userName??"",o=n.botUsername??n.userName??"";return r.localeCompare(o)})}import{CLINE_CONNECTOR_SUPERVISED_ENV as XTt,readConnectorCliLaunchSpec as JTt}from"@cerebriline/shared";import{ensureParentDir as ZTt,resolveConnectorLogPath as eSt}from"@cerebriline/shared/storage";import{withConnectorStore as BTt}from"@cerebriline/shared/db";import{CLINE_CONNECTOR_STARTING_INSTANCE_ENV as jTt,CLINE_RUN_AS_HUB_DAEMON_ENV as qTt}from"@cerebriline/shared";var FWe;function eJ(){return FWe}function md(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function Ek(e){return typeof e==="string"?e.trim():void 0}function tJ(e){if(!md(e))return{};let t={};for(let[n,r]of Object.entries(e))if(typeof r==="string")t[n]=r.trim();return t}function zWe(){return oM((e)=>e.listConfigs()).map((e)=>({id:e.channel,type:e.type,configuredAt:e.configuredAt,updatedAt:e.updatedAt})).sort((e,t)=>e.type.localeCompare(t.type))}function iM(){return{available:HWe(),active:rM(),configured:zWe()}}function KWe(e,t){if(e.required&&!t[e.flag]?.trim())throw Error(`${e.label} is required`)}function GWe(e,t){let n={};for(let o of e.fields)n[o.flag]=t[o.flag]??o.initialValue??"";let r={};for(let o of e.fields){if(!qWe(o,n))continue;KWe(o,n),r[o.flag]=n[o.flag]}return r}function VWe(e){if(!md(e))throw Error("connector.configure payload must be an object.");let t=Ek(e.channel);if(!t)throw Error("channel is required");let n=BWe.find((u)=>u.id===t);if(!n)throw Error(`unknown connector channel: ${t}`);if(!new Set(WWe().map((u)=>u.name)).has(n.id))throw Error(`connector channel is not available: ${t}`);let o=tJ(e.values),i=GWe(n,o),s=md(e.security)?e.security:{},a=s.enabled===!0,d=tJ(s.values);if(a&&n.security)for(let u of n.security.fields){let h=d[u.key];if(!h)throw Error(u.requiredMessage);let p=u.validate?.(h);if(p)throw Error(p)}let l=a?{enabled:!0,values:d}:{enabled:!1,values:{}},c=UWe(n,i,l);return oM((u)=>u.upsertConfig({channel:t,type:t,values:i,security:l,updateConnectArgs:(h)=>jWe(n,h.connection.connectArgs,c,{replaceSecurityArgs:h.config?.security?.enabled===!0||l.enabled})})),iM()}function YWe(e){if(!md(e))throw Error("connector.delete_config payload must be an object.");let t=Ek(e.channel);if(!t)throw Error("channel is required");return oM((n)=>n.deleteConfig(t)),iM()}function XWe(e){return Array.isArray(e)?e.filter((t)=>typeof t==="string"):[]}function sM(){let e=eJ();if(!e)throw Error("connector supervision is unavailable in this hub; start connectors with the CLI instead");return e}function nJ(e){if(!md(e))throw Error("payload must be an object.");let t=Ek(e.channel);if(!t)throw Error("channel is required");let n=Ek(e.instanceId);if(!n)throw Error("instanceId is required");return{channel:t,instanceId:n}}async function JWe(e){let{channel:t,instanceId:n}=nJ(e),r=md(e)?e:{};return await sM().start({channel:t,instanceId:n,args:XWe(r.args),restart:r.restart===!0})}async function QWe(e){let{channel:t,instanceId:n}=nJ(e),r=md(e)?e:{};return{stopped:await sM().stop({channel:t,instanceId:n,disableAutostart:r.disableAutostart!==!1}),channel:t,instanceId:n}}function ZWe(e){return e==="connector.configure"||e==="connector.delete_config"||e==="connector.start"||e==="connector.stop"}function nf(e,t,n){if(!ZWe(t.command))return;Ii(e.telemetry,{ulid:t.sessionId??t.requestId??"hub",tool:t.command,success:n})}async function rJ(e,t){try{if(t.command==="connector.channels")return ie(t,iM());if(t.command==="connector.configure"){let n=VWe(t.payload);return nf(e,t,!0),ie(t,n)}if(t.command==="connector.delete_config"){let n=YWe(t.payload);return nf(e,t,!0),ie(t,n)}if(t.command==="connector.start"){let n=await JWe(t.payload);return nf(e,t,!0),ie(t,n)}if(t.command==="connector.stop"){let n=await QWe(t.payload);return nf(e,t,!0),ie(t,n)}if(t.command==="connector.supervised")return ie(t,{supervised:sM().list()});return pe(t,"unsupported_connector_command",`unsupported connector command: ${t.command}`)}catch(n){return nf(e,t,!1),pe(t,"connector_command_failed",n instanceof Error?n.message:String(n))}}var eje=30000;function tje(e){if(e==="aborted")return"run.aborted";if(e==="error"||e==="failed")return"run.failed";return"run.completed"}function nje(e){if(e.finishReason!=="error")return;return e.text.trim()||void 0}function rje(e,t){let n=e.activeRpcTurnCountBySession;n.set(t,(n.get(t)??0)+1);let r=!1;return()=>{if(r)return;r=!0;let o=(n.get(t)??1)-1;if(o<=0)n.delete(t);else n.set(t,o)}}function oJ(e,t,n){let r=n instanceof Error&&n.message.trim()?n.message:`Unknown session: ${t}`;return pe(e,Rf,r)}function oje(e){return e?e:void 0}function ije(e){let t=typeof e.timeoutMs==="number"?e.timeoutMs:typeof e.timeout_ms==="number"?e.timeout_ms:void 0;if(t&&Number.isFinite(t)&&t>0)return Math.floor(t);let n=typeof e.timeoutSeconds==="number"?e.timeoutSeconds:typeof e.timeout_seconds==="number"?e.timeout_seconds:void 0;if(n&&Number.isFinite(n)&&n>0)return Math.floor(n*1000);return}async function sje(e,t,n,r){let o=performance.now(),i=!1,s={command:t.command,requestId:t.requestId,clientId:t.clientId,sessionId:n.sessionId,timeoutMs:r},a=setInterval(()=>{if(i)return;let c=Math.round(performance.now()-o);ke("warn","run.heartbeat",{...s,elapsedMs:c}),e.publish(e.buildEvent("run.heartbeat",{requestId:t.requestId,elapsedMs:c,...r?{timeoutMs:r}:{}},n.sessionId))},eje),d=e.sessionHost.runTurn(n);d.then((c)=>{if(!i)return;ke("warn","run.late_end",{...s,elapsedMs:Math.round(performance.now()-o),finishReason:c?.finishReason})},(c)=>{if(!i)return;ke("error","run.late_error",{...s,elapsedMs:Math.round(performance.now()-o),error:c})});let l;try{if(!r)return await d;return await Promise.race([d,new Promise((c,u)=>{l=setTimeout(()=>{let h=`Hub run ${t.command} timed out after ${r}ms.`;i=!0,clearInterval(a),u(Error(h)),ke("error","run.timeout",{...s,elapsedMs:Math.round(performance.now()-o)}),nM(e,(p)=>p.sessionId===n.sessionId,h),_s(e,(p)=>p.sessionId===n.sessionId,h),e.sessionHost.abort(n.sessionId,h).catch((p)=>{ke("error","run.timeout_abort_failed",{...s,error:p})})},r)})])}finally{if(i=!0,clearInterval(a),l)clearTimeout(l)}}async function rf(e,t){let n=Rt(t),r=t.payload&&typeof t.payload==="object"?t.payload:{},o=typeof r.prompt==="string"?r.prompt:typeof r.input==="string"?r.input:"",i=r.attachments&&typeof r.attachments==="object"&&!Array.isArray(r.attachments)?r.attachments:void 0,s=Array.isArray(i?.userImages)?i.userImages.filter((p)=>typeof p==="string"&&p.trim().length>0):void 0,a=Array.isArray(i?.userFiles)?i.userFiles.filter((p)=>typeof p==="string"&&p.trim().length>0):void 0;if(!o.trim()&&!s?.length&&!a?.length)return pe(t,"invalid_session_input","session input requires a prompt or attachment");if(!await e.sessionHost.getSession(n))return oJ(t,n);e.publish(e.buildEvent("run.started",{...t.requestId?{requestId:t.requestId}:{},...t.clientId?{clientId:t.clientId}:{}},n));let l=ije(r);e.suppressNextTerminalEventBySession.set(n,"run.start.reply");let c=rje(e,n),u;try{try{u=await sje(e,t,{sessionId:n,prompt:o,mode:oje(r.mode),delivery:r.delivery==="queue"||r.delivery==="steer"?r.delivery:void 0,userImages:s,userFiles:a,timeoutMs:l},l)}catch(p){if(e.suppressNextTerminalEventBySession.get(n)==="run.start.reply")e.suppressNextTerminalEventBySession.delete(n);if(If(p))return oJ(t,n,p);throw e.publish(e.buildEvent("run.failed",{reason:"error",error:p instanceof Error?p.message:String(p)},n)),p}if(u){let p=await $n(e,n),m=nje(u);if(e.publish(e.buildEvent(tje(u.finishReason),{reason:u.finishReason,...m?{error:m}:{},result:u,...p?{snapshot:p}:{}},n)),e.suppressNextTerminalEventBySession.get(n)==="run.start.reply")e.suppressNextTerminalEventBySession.delete(n)}else e.suppressNextTerminalEventBySession.delete(n)}finally{c()}let h=await $n(e,n);return ie(t,u||h?{...u?{result:u}:{},...h?{snapshot:h}:{}}:void 0)}async function iJ(e,t){let n=Rt(t),r=typeof t.payload?.reason==="string"?t.payload.reason:"Run was aborted before pending approval or capability request was resolved.";nM(e,(o)=>o.sessionId===n,r);try{await e.sessionHost.abort(n,t.payload?.reason)}catch(o){ke("warn","run.abort_failed",{command:t.command,requestId:t.requestId,clientId:t.clientId,sessionId:n,error:o})}finally{_s(e,(o)=>o.sessionId===n,r)}return ie(t,{applied:!0})}async function sJ(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_id","run.proceed_while_running requires a sessionId");if(typeof e.sessionHost.proceedWhileRunning!=="function")return pe(t,"unsupported_command","This runtime does not support proceeding while commands are running.");let r=typeof t.payload?.toolCallId==="string"&&t.payload.toolCallId.trim().length>0?t.payload.toolCallId.trim():void 0,o=await e.sessionHost.proceedWhileRunning(n,r);return ie(t,{detachedCount:o})}async function aJ(e,t){let n=ER(t.payload?.payload);if(!n)return pe(t,"invalid_hook_payload","session.hook requires a valid hook event payload");return await e.sessionHost.dispatchHookEvent(n),ie(t,{applied:!0})}import{join as aje}from"node:path";import{createSessionId as dje}from"@cerebriline/shared";import{loadSqliteDb as lje}from"@cerebriline/shared/db";import{resolveDbDataDir as cje}from"@cerebriline/shared/storage";var uje=32,hje=604800000;class Ak extends Error{retryable=!0;constructor(e,t,n){super(`Session ${e} queue is full (${t} pending runs, limit ${n}); retry later.`);this.name="HubRunAdmissionRejectedError"}}function pje(e){let t=e?.replace(/[^a-zA-Z0-9_-]/g,"-");return aje(cje(),t?`hub-runs-${t}.db`:"hub-runs.db")}class aM{db;maxPendingPerSession;closed=!1;constructor(e={}){this.db=lje(e.dbPath??pje(e.ownerId)),this.maxPendingPerSession=e.maxPendingPerSession??uje,this.db.exec("PRAGMA journal_mode = WAL;"),this.db.exec("PRAGMA busy_timeout = 5000;"),this.db.exec(`
2057
+ updated_at = excluded.updated_at`).run(t,e.mode,e.applyToAgentCreated?1:0,n,r,o,e.enabledBy?JSON.stringify(e.enabledBy):null,OX(e.enabledAt,"enabledAt")??null,i),this.getAutomationPolicy(t)}}var hd={kind:"system",id:"file_reconciler"},ud={kind:"system",id:"task_manager"},DX={kind:"automation_policy",id:"global"},ef=new Set(["completed","failed","cancelled","interrupted"]),wWe=30000,bWe=250;function Bo(){return new Date().toISOString()}function $X(e){return typeof e==="string"&&e.trim()?e.trim():void 0}function FX(e){let t=Date.parse(e);if(!Number.isFinite(t))throw Error("expiresAt must be a valid ISO-8601 timestamp");if(t<=Date.now())throw Error("expiresAt must be in the future")}function UX(e,t){let n=gWe(e,t);return n!==""&&!n.startsWith("..")&&!n.startsWith("/")}function tf(e){if(!e||!Q0(e))return!1;try{return mWe(e).isDirectory()}catch{return!1}}function X0(e,t){return JSON.stringify({type:e.type,title:e.title,description:e.description,instructions:e.instructions,scope:e.scope,workspaceRoot:e.workspaceRoot,cwd:e.cwd,resourcePaths:e.resourcePaths,priority:e.priority,assignee:e.assignee,modelSelection:e.modelSelection,mode:e.mode,systemPrompt:e.systemPrompt,maxIterations:e.maxIterations,timeoutSeconds:e.timeoutSeconds,availableAt:e.availableAt??t.availableAt,expiresAt:e.expiresAt,automationEligible:e.automationEligible})}function J0(e){return JSON.stringify({type:e.type,title:e.title,description:e.description,instructions:e.instructions,scope:e.scope,workspaceRoot:e.workspaceRoot,cwd:e.cwd,resourcePaths:e.resourcePaths,priority:e.priority,assignee:e.assignee,modelSelection:e.modelSelection,mode:e.mode,systemPrompt:e.systemPrompt,maxIterations:e.maxIterations,timeoutSeconds:e.timeoutSeconds,availableAt:e.availableAt,expiresAt:e.expiresAt,automationEligible:e.automationEligible})}function vWe(e,t){return{taskId:t.taskId,expectedRevision:t.revision,type:e.type,title:e.title,description:e.description??null,instructions:e.instructions,scope:e.scope,workspaceRoot:e.workspaceRoot??null,cwd:e.cwd??null,resourcePaths:e.resourcePaths,priority:e.priority,assignee:e.assignee??null,modelSelection:e.modelSelection??null,mode:e.mode??null,systemPrompt:e.systemPrompt??null,maxIterations:e.maxIterations??null,timeoutSeconds:e.timeoutSeconds??null,availableAt:e.availableAt??t.availableAt,expiresAt:e.expiresAt,automationEligible:e.automationEligible,updatedBy:hd}}function kWe(e,t){return{...e,type:t.type??e.type,title:t.title??e.title,description:t.description===null?void 0:t.description??e.description,instructions:t.instructions??e.instructions,scope:t.scope??e.scope,workspaceRoot:t.workspaceRoot===null?void 0:t.workspaceRoot??e.workspaceRoot,cwd:t.cwd===null?void 0:t.cwd??e.cwd,resourcePaths:t.resourcePaths??e.resourcePaths,priority:t.priority??e.priority,assignee:t.assignee===null?void 0:t.assignee??e.assignee,modelSelection:t.modelSelection===null?void 0:t.modelSelection??e.modelSelection,mode:t.mode===null?void 0:t.mode??e.mode,systemPrompt:t.systemPrompt===null?void 0:t.systemPrompt??e.systemPrompt,maxIterations:t.maxIterations===null?void 0:t.maxIterations??e.maxIterations,timeoutSeconds:t.timeoutSeconds===null?void 0:t.timeoutSeconds??e.timeoutSeconds,availableAt:t.availableAt??e.availableAt,expiresAt:t.expiresAt??e.expiresAt,automationEligible:t.automationEligible??e.automationEligible}}class Z0{runtime;store;ownsStore;globalSpecsDir;watcherDebounceMs;watchFiles;logger;publishEvent;scopes=new Map;activeRuns=new Map;backgroundRuns=new Set;maintenanceTimer;queuedAutomationScopes=new Set;automationEnabled;automationPumping=!1;automationPolicyGeneration=0;started=!1;disposed=!1;constructor(e){this.runtime=e.runtime,this.ownsStore=!e.store,this.store=e.store??new Y0({dbPath:e.dbPath}),this.globalSpecsDir=e.globalSpecsDir,this.watcherDebounceMs=Math.max(0,e.watcherDebounceMs??bWe),this.watchFiles=e.watchFiles!==!1,this.automationEnabled=e.automationEnabled!==!1,this.logger=e.logger??yWe,this.publishEvent=e.publish??(()=>{})}async start(){if(this.disposed)throw Error("AgendaTaskManager disposed");if(this.started)return;this.started=!0,this.recoverInterruptedRuns(),await this.reconcileSourceForProjection("global",void 0,"startup");for(let e of this.store.listWorkspaceRoots())if(tf(e))await this.reconcileSourceForProjection("workspace",e,"startup");this.expireTasks(),this.maintenanceTimer=setInterval(()=>{this.expireTasks(),this.queueAutomation()},wWe),this.maintenanceTimer.unref?.(),this.queueAutomation()}async dispose(){if(this.disposed)return;if(this.disposed=!0,this.maintenanceTimer)clearInterval(this.maintenanceTimer);for(let e of this.scopes.values()){if(e.timer)clearTimeout(e.timer);e.watcher?.close()}this.scopes.clear();for(let e of this.activeRuns.values())if(e.sessionId)await this.runtime.abortSession(e.sessionId,"Hub task manager stopped").catch(()=>{});await Promise.allSettled(this.backgroundRuns);for(let[e,t]of this.activeRuns)this.store.updateRun(t.runId,{status:"interrupted",completedAt:Bo(),error:"Hub task manager stopped before the run completed."}),this.store.updateTaskState(e,{status:"failed",currentRunId:null,error:"Hub task manager stopped before the run completed.",updatedBy:ud});if(this.activeRuns.clear(),this.ownsStore)this.store.close()}async createTask(e){this.assertUsable(),FX(e.expiresAt);let t=Ss(e),n={...e,...t},r=$X(n.taskId)??NX("task_");if(await this.reconcileScope(n.scope,n.workspaceRoot),this.store.getTask(r))throw Error(`task ${r} already exists`);let o=this.ensureScope(n.scope,n.workspaceRoot),i=o.resolveWritePath(r,n.specPath);if(Q0(i)||this.store.getTaskBySpecPath(i))throw Error(`task spec already exists: ${i}`);let s=this.store.createTask({...n,taskId:r,specPath:i});try{o.writeSpec({...n,taskId:r},{specPath:i,createOnly:!0})}catch(a){throw this.store.deleteTask(r),a}return this.publish("task.created",s),this.expireTask(s),this.queueAutomation(),this.requireTask(r)}async listTasks(e={}){if(this.assertUsable(),!e.scope||e.scope==="global")await this.reconcileSourceForProjection("global",void 0,"list");if(e.workspaceRoot){if(tf(e.workspaceRoot))await this.reconcileSourceForProjection("workspace",e.workspaceRoot,"list")}else if(e.scope!=="global"){for(let t of this.store.listWorkspaceRoots())if(tf(t))await this.reconcileSourceForProjection("workspace",t,"list")}return this.expireTasks(),this.store.listTasks(e)}async getTask(e){this.assertUsable();let t=this.store.getTask(e.trim());if(t?.scope==="workspace"&&tf(t.workspaceRoot))await this.reconcileSourceForProjection("workspace",t.workspaceRoot,"read");else if(t?.scope==="global")await this.reconcileSourceForProjection("global",void 0,"read");let n=this.store.getTask(e.trim());if(n)this.expireTask(n);return this.store.getTask(e.trim())}async updateTask(e){this.assertUsable();let t=this.requireTask(e.taskId);if(e.updatedBy.id!==hd.id)await this.reconcileSourceForProjection(t.scope,t.workspaceRoot,"update");let n=this.requireTask(e.taskId);if(n.revision!==e.expectedRevision)this.store.updateTask(e);if(n.status==="in_progress")throw Error("an in-progress task cannot be edited");if(n.status==="completed"||n.status==="cancelled"||n.status==="expired")throw Error(`task ${n.taskId} cannot be edited from ${n.status}; create a new task instead`);let r=kWe(n,e);FX(r.expiresAt);let o=Ss(r),i={...r,...o},s={...e,scope:i.scope,workspaceRoot:i.workspaceRoot??null,cwd:i.cwd??null,resourcePaths:i.resourcePaths},a=this.ensureScope(i.scope,i.workspaceRoot),d=n.specPath!==void 0&&UX(a.specsDir,n.specPath);if(!d)await this.reconcileFileStore(a);let l=a.resolveWritePath(n.taskId,d?n.specPath:void 0);if(l!==n.specPath&&(Q0(l)||this.store.getTaskBySpecPath(l)))throw Error(`task spec already exists: ${l}`);let c;if(d&&n.specPath){let f=a.readSpec(n.specPath);if(!f.ok)throw Error(`task spec is invalid: ${f.error}`);if(e.updatedBy.id!==hd.id&&X0(f.spec,n)!==J0(n))throw Error(`task spec changed outside the manager; reconcile task ${n.taskId} and retry`);c=f.contentHash}let u,h;try{u=a.writeSpec(i,{specPath:l,expectedContentHash:c,createOnly:!d}),h=this.store.updateTask(s)}catch(f){try{if(u&&d&&n.specPath)a.writeSpec(n,{specPath:n.specPath,expectedContentHash:u.contentHash});else if(u)a.deleteSpec(l,{expectedContentHash:u.contentHash})}catch(g){this.logError("agenda task update rollback failed",g,{taskId:n.taskId,specPath:l})}throw f}if(!h||!u)throw Error(`unknown task: ${e.taskId}`);let p=this.store.updateTaskState(h.taskId,{status:"pending_approval",approvedRevision:null,currentRunId:null,specPath:u.specPath,error:null,completedAt:null,archivedAt:null,updatedBy:e.updatedBy},h.revision);if(n.specPath&&n.specPath!==u.specPath)this.fileStoreForTask(n).deleteSpec(n.specPath);let m=p??this.requireTask(e.taskId);return this.publish("task.updated",m),this.expireTask(m),this.queueAutomation(),this.requireTask(e.taskId)}async approveTask(e,t,n){this.assertUsable();let r=await this.refreshAndVerifyTaskIntent(e);if(this.assertRevision(r,n),this.isExpired(r))throw this.expireTask(r),Error(`task ${e} has expired`);if(r.status==="approved"&&r.approvedRevision===r.revision)return r;if(r.status!=="pending_approval"&&r.status!=="failed")throw Error(`task ${e} cannot be approved from ${r.status}`);let o=this.store.updateTaskState(e,{status:"approved",approvedRevision:r.revision,error:null,updatedBy:t},r.revision);if(!o)throw Error(`unknown task: ${e}`);return this.publish("task.updated",o),this.queueAutomation(),o}async cancelTask(e,t,n,r){this.assertUsable();let o=this.requireTask(e);if(this.assertRevision(o,n),o.status==="cancelled")return o;if(o.status==="completed"||o.status==="expired")throw Error(`task ${e} cannot be cancelled from ${o.status}`);let i=o.currentRunId?this.store.getRun(o.currentRunId):void 0,s=r?.trim()||"Agenda task cancelled";if(i&&!ef.has(i.status))this.store.updateRun(i.runId,{status:"cancelled",completedAt:Bo(),error:r?.trim()||void 0});this.activeRuns.delete(e);let a=this.store.updateTaskState(e,{status:"cancelled",approvedRevision:null,currentRunId:null,error:r?.trim()||null,updatedBy:t},o.revision);if(!a)throw Error(`unknown task: ${e}`);if(this.publish("task.updated",a,i),i?.sessionId)try{await this.runtime.abortSession(i.sessionId,s)}catch(d){this.logError("agenda task session abort failed",d,{taskId:e,runId:i.runId,sessionId:i.sessionId})}return a}async runTask(e,t,n,r){this.assertUsable();let o=await this.refreshAndVerifyTaskIntent(e);if(this.assertRevision(o,n),this.isExpired(o))throw this.expireTask(o),Error(`task ${e} has expired`);if(Date.parse(o.availableAt)>Date.now())throw Error(`task ${e} is not available yet`);if(o.status!=="approved"&&o.status!=="failed")throw Error(`task ${e} must be approved before it can run`);if(o.approvedRevision!==o.revision)throw Error(`task ${e} approval is stale`);if(this.activeRuns.has(e)||o.currentRunId)throw Error(`task ${e} already has an active run`);let i=this.store.createRun({taskId:e,taskRevision:o.revision,requestedByClientId:r}),s=this.store.updateTaskState(e,{currentRunId:i.runId,lastRunId:i.runId,error:null,completedAt:null,updatedBy:t},o.revision);if(!s)throw Error(`unknown task: ${e}`);this.activeRuns.set(e,{runId:i.runId}),this.publish("task.updated",s,i);try{let a=await this.runtime.startSession(s,i,r,{unattended:t.kind==="automation_policy"&&this.store.getAutomationPolicy(s.scope==="workspace"&&s.workspaceRoot?s.workspaceRoot:"global").mode==="unattended"}),d=this.store.getRun(i.runId),l=this.store.getTask(e);if(!d||ef.has(d.status)||l?.status!==o.status||l.currentRunId!==i.runId){if(d&&!ef.has(d.status))this.store.updateRun(i.runId,{status:"cancelled",sessionId:a.sessionId,completedAt:Bo(),error:"Task changed or was cancelled while its session was starting."});else if(d)this.store.updateRun(i.runId,{sessionId:a.sessionId});throw this.activeRuns.delete(e),await this.runtime.abortSession(a.sessionId,"Agenda task was cancelled while its session was starting").catch((u)=>this.logError("cancelled agenda task session abort failed",u,{taskId:e,runId:i.runId,sessionId:a.sessionId})),Error(`task ${e} changed or was cancelled while starting`)}i=this.store.updateRun(i.runId,{status:"running",sessionId:a.sessionId,startedAt:Bo()})??i,s=this.store.updateTaskState(e,{status:"in_progress",lastSessionId:a.sessionId,updatedBy:t})??s,this.activeRuns.set(e,{runId:i.runId,sessionId:a.sessionId}),this.publish("task.run.started",s,i);let c=this.finishRun(s,i,a.sessionId);return this.backgroundRuns.add(c),c.finally(()=>this.backgroundRuns.delete(c)),{task:s,run:i}}catch(a){throw await this.finishRunFailure(s,i,a),a}}async getAutomationPolicy(e="global"){return this.assertUsable(),this.store.getAutomationPolicy(e)}async setAutomationPolicy(e,t){this.assertUsable();let n=Bo(),r=this.store.setAutomationPolicy({...e,enabledBy:e.mode==="manual"?void 0:t,enabledAt:e.mode==="manual"?void 0:n});return this.automationPolicyGeneration+=1,this.publishEvent("task.automation.updated",{policy:r}),this.queueAutomation(r.scopeKey),r}notifyAutomationReadinessChanged(){if(!this.disposed)this.queueAutomation()}async finishRun(e,t,n){try{let r=await this.runtime.runSession(n,e,t),o=this.store.getRun(t.runId);if(!o||ef.has(o.status))return;if(r.status==="completed"){let i=Bo(),s=this.store.updateRun(t.runId,{status:"completed",completedAt:i,resultSummary:r.summary,error:null})??o,a=this.store.updateTaskState(e.taskId,{status:"completed",currentRunId:null,error:null,completedAt:i,updatedBy:ud})??this.requireTask(e.taskId);this.publish("task.run.completed",a,s)}else if(r.status==="cancelled")await this.cancelTask(e.taskId,ud,e.revision,r.error||"Task session was cancelled");else await this.finishRunFailure(e,t,Error(r.error||r.summary||"Task session failed"))}catch(r){await this.finishRunFailure(e,t,r)}finally{this.activeRuns.delete(e.taskId);let r=this.store.getTask(e.taskId);(r?.scope==="workspace"&&r.workspaceRoot?this.reconcileScope("workspace",r.workspaceRoot):this.reconcileScope("global")).catch((i)=>this.logError("post-run agenda task reconciliation failed",i,{taskId:e.taskId})),this.queueAutomation()}}async finishRunFailure(e,t,n){let r=this.store.getRun(t.runId);if(!r||ef.has(r.status))return;let o=n instanceof Error?n.message:String(n),i=this.store.updateRun(t.runId,{status:"failed",completedAt:Bo(),error:o})??r,s=this.store.getTask(e.taskId);if(!s||s.status==="cancelled")return;if(s.currentRunId!==t.runId){this.activeRuns.delete(e.taskId),this.publish("task.run.failed",s,i);return}let a=this.store.updateTaskState(e.taskId,{status:"failed",currentRunId:null,error:o,updatedBy:ud})??s;this.activeRuns.delete(e.taskId),this.publish("task.run.failed",a,i)}ensureScope(e,t){let n=$X(t);if(e==="workspace"&&!n)throw Error("workspaceRoot is required for workspace task scope");if(e==="workspace"&&!tf(n))throw Error("workspaceRoot must be an existing directory");let r=e==="global"?"global":`workspace:${n}`,o=this.scopes.get(r);if(o)return o.store;let i=new G0({scope:e,workspaceRoot:n,taskSpecsDir:e==="global"?this.globalSpecsDir:void 0}),s={store:i},a=!0;try{i.ensureSpecsDir();let d=this.watchFiles?this.resolveWatchRoot(i.specsDir):void 0;if(d!==void 0)s.watcher=fWe(d,(l,c)=>{if(!c||!String(c).endsWith(".task.md"))return;if(s.timer)clearTimeout(s.timer);s.timer=setTimeout(()=>{s.timer=void 0,this.reconcileFileStore(i).catch((u)=>this.logError("agenda task watcher reconciliation failed",u,{specsDir:i.specsDir}))},this.watcherDebounceMs)}),s.watcher.on("error",(l)=>this.logError("agenda task watcher failed",l,{specsDir:i.specsDir}))}catch(d){a=!1,this.logError("agenda task source could not be attached",d,{specsDir:i.specsDir})}if(a)this.scopes.set(r,s);return i}async reconcileScope(e,t){let n=this.ensureScope(e,t);await this.reconcileFileStore(n)}async reconcileSourceForProjection(e,t,n){try{await this.reconcileScope(e,t)}catch(r){this.logError(`agenda task source ${n} reconciliation failed`,r,{scope:e,...t?{workspaceRoot:t}:{}})}}async reconcileFileStore(e){if(this.disposed)return;let t=new Set;for(let r of e.listSpecs()){if(t.add(r.specPath),!r.ok){this.logger.log("agenda task spec is invalid",{severity:"warn",specPath:r.specPath,error:r.error});continue}try{let o=r.spec;if(!o.taskId)o=e.writeSpec({...o,taskId:NX("task_")},{specPath:o.specPath,expectedContentHash:o.contentHash});let i=this.store.getTaskBySpecPath(o.specPath);if(i&&o.taskId&&o.taskId!==i.taskId)this.logger.log("agenda task id is immutable for an existing spec",{severity:"warn",taskId:i.taskId,requestedTaskId:o.taskId,specPath:o.specPath}),o=e.writeSpec({...o,taskId:i.taskId},{specPath:o.specPath,expectedContentHash:o.contentHash});let s=o.taskId?this.store.getTask(o.taskId):void 0,a=i??s;if(s?.specPath&&s.specPath!==o.specPath){this.logger.log("agenda task id is already owned by another spec",{severity:"warn",taskId:o.taskId,specPath:o.specPath});continue}if(!a){let d=this.store.createTask(TX(o,hd));this.publish("task.created",d),this.expireTask(d);continue}if(a.archivedAt){let d=a.status==="cancelled"&&a.error==="Task spec was deleted.",l=this.store.updateTaskState(a.taskId,{status:d?"pending_approval":a.status,approvedRevision:d?null:a.approvedRevision,archivedAt:null,error:d?null:a.error,updatedBy:hd});if(l)a=l,this.publish("task.updated",l)}if(X0(o,a)===J0(a))continue;if(a.status==="in_progress"){this.logger.log("agenda task edit deferred until its run completes",{severity:"warn",taskId:a.taskId});continue}if(a.status==="completed"||a.status==="cancelled"||a.status==="expired"){this.logger.log("terminal agenda task edits are not applied",{severity:"warn",taskId:a.taskId,status:a.status}),e.writeSpec(a,{specPath:o.specPath,expectedContentHash:o.contentHash});continue}await this.updateTask(vWe(o,a))}catch(o){this.logError("agenda task spec reconciliation failed",o,{specPath:r.spec.specPath})}}let n=this.store.listTasks({scope:e.scope,workspaceRoot:e.workspaceRoot,includeArchived:!0,limit:1000});for(let r of n){if(!r.specPath||!UX(e.specsDir,r.specPath)||t.has(r.specPath)||r.archivedAt)continue;if(r.status==="in_progress")await this.cancelTask(r.taskId,hd,r.revision,"Task spec was deleted.");let o=this.store.updateTaskState(r.taskId,{status:r.status==="completed"||r.status==="expired"?r.status:"cancelled",approvedRevision:null,currentRunId:null,error:r.status==="cancelled"?r.error??null:"Task spec was deleted.",archivedAt:Bo(),updatedBy:hd});if(o)this.publish("task.deleted",o)}this.queueAutomation()}expireTasks(){for(let e of this.store.listTasks({limit:1000}))this.expireTask(e)}expireTask(e){if(!this.isExpired(e))return;if(e.currentRunId||e.status==="in_progress"||e.status==="completed"||e.status==="cancelled"||e.status==="expired")return;let t=this.store.updateTaskState(e.taskId,{status:"expired",approvedRevision:null,currentRunId:null,error:"Task expired before it was started.",updatedBy:ud});if(t)this.publish("task.updated",t)}isExpired(e){return Date.parse(e.expiresAt)<=Date.now()}recoverInterruptedRuns(){let e=Bo();for(let t of this.store.listRuns({status:["starting","running"],limit:1000})){this.store.updateRun(t.runId,{status:"interrupted",completedAt:e,error:"Hub restarted while this task was running."});let n=this.store.getTask(t.taskId);if(!n||n.currentRunId!==t.runId)continue;if(n.status==="completed"||n.status==="cancelled"||n.status==="expired"){this.store.updateTaskState(n.taskId,{currentRunId:null});continue}if(t.status==="starting"&&n.approvedRevision===t.taskRevision&&n.revision===t.taskRevision&&!this.isExpired(n)){this.store.updateTaskState(n.taskId,{status:"approved",currentRunId:null,error:"Hub restarted before this task session was linked.",updatedBy:ud});continue}this.store.updateTaskState(n.taskId,{status:t.status==="starting"?"pending_approval":"failed",approvedRevision:t.status==="starting"?null:n.approvedRevision,currentRunId:null,error:"Hub restarted while this task was running.",updatedBy:ud})}}queueAutomation(e){if(this.disposed||!this.automationEnabled)return;if(e)this.queuedAutomationScopes.add(e);else for(let t of this.store.listAutomationPolicies())this.queuedAutomationScopes.add(t.scopeKey);if(this.automationPumping)return;queueMicrotask(()=>{this.pumpAutomation().catch((t)=>this.logError("agenda task automation pump failed",t,{}))})}async pumpAutomation(){if(this.disposed||this.automationPumping)return;this.automationPumping=!0;let e=this.automationPolicyGeneration;try{while(this.queuedAutomationScopes.size>0){let t=this.queuedAutomationScopes.values().next().value;if(!t)break;this.queuedAutomationScopes.delete(t);let n=this.store.getAutomationPolicy(t);if(n.mode==="manual")continue;this.expireTasks();let r=this.store.listRuns({limit:1000}).filter((s)=>Date.parse(s.claimedAt)>=Date.now()-3600000).length,o=Math.min(Math.max(0,n.maxConcurrentRuns-this.activeRuns.size),Math.max(0,n.maxStartsPerHour-r));if(o<=0)continue;let i=this.store.listTasks({statuses:["pending_approval","approved"],...t==="global"?{}:{scope:"workspace",workspaceRoot:t},automationEligible:!0,availableBefore:Bo(),limit:1000});for(let s of i){if(o<=0)break;if(e!==this.automationPolicyGeneration)return;try{let a=s;if(a.status==="pending_approval"){if(!this.canAutomaticallyApprove(a,n))continue;a=await this.approveTask(a.taskId,DX,a.revision)}if(e!==this.automationPolicyGeneration)return;if(n.mode==="auto_start"&&this.runtime.isInteractiveClientAvailable?.()!==!0)continue;await this.runTask(a.taskId,DX,a.revision),o-=1}catch(a){this.logError("agenda task automation start failed",a,{taskId:s.taskId})}}}}finally{if(this.automationPumping=!1,this.queuedAutomationScopes.size>0)this.queueAutomation()}}canAutomaticallyApprove(e,t){let n=[e.createdBy,e.updatedBy];if(n.some((r)=>r.kind==="system"&&r.id==="file_reconciler"))return!1;if(!t.applyToAgentCreated&&n.some((r)=>r.kind==="agent"))return!1;return this.taskChainDepth(e)<=t.maxChainDepth}taskChainDepth(e){let t=0,n=e,r=new Set([e.taskId]);while(n.originTaskId){if(r.has(n.originTaskId))return Number.POSITIVE_INFINITY;r.add(n.originTaskId);let o=this.store.getTask(n.originTaskId);if(!o)break;t+=1,n=o}return t}fileStoreForTask(e){return this.ensureScope(e.scope,e.workspaceRoot)}async refreshAndVerifyTaskIntent(e){let t=this.requireTask(e);await this.reconcileScope(t.scope,t.workspaceRoot);let n=this.requireTask(e);if(n.archivedAt)throw Error(`task ${e} no longer has an active task spec`);if(!n.specPath)throw Error(`task ${e} has no canonical task spec`);let r;try{r=this.fileStoreForTask(n).readSpec(n.specPath)}catch(o){throw Error(`task ${e} task spec is unavailable: ${o instanceof Error?o.message:String(o)}`)}if(!r.ok)throw Error(`task ${e} task spec is invalid: ${r.error}`);if(r.spec.taskId!==n.taskId||X0(r.spec,n)!==J0(n))throw Error(`task ${e} task spec does not match revision ${n.revision}`);return n}requireTask(e){let t=e.trim();if(!t)throw Error("taskId is required");let n=this.store.getTask(t);if(!n)throw Error(`unknown task: ${t}`);return n}assertRevision(e,t){if(e.revision!==t)throw Error(`task ${e.taskId} is at revision ${e.revision}; the requested revision is stale`)}publish(e,t,n){this.publishEvent(e,{task:t,...n?{run:n}:{}},n?.sessionId??t.lastSessionId)}resolveWatchRoot(e){try{return pWe.native(e)}catch(t){this.logError("agenda task watcher disabled: specs dir could not be resolved",t,{specsDir:e});return}}logError(e,t,n){if(this.logger.error)this.logger.error(e,{...n,error:t});else this.logger.log(e,{...n,error:t,severity:"error"})}assertUsable(){if(this.disposed)throw Error("AgendaTaskManager disposed")}}import{createSessionId as _We}from"@cerebriline/shared";import{createSessionId as xWe}from"@cerebriline/shared";function TWe(e){switch(e){case"idle":return"idle";case"pending":return"pending";case"completed":return"completed";case"failed":return"failed";case"cancelled":return"aborted";default:return"running"}}function SWe(e){let t=e.metadata&&typeof e.metadata==="object"?JSON.parse(JSON.stringify(e.metadata)):{};if(e.parentSessionId?.trim())t.parentSessionId=e.parentSessionId;if(e.parentAgentId?.trim())t.parentAgentId=e.parentAgentId;if(e.agentId?.trim())t.agentId=e.agentId;if(e.conversationId?.trim())t.conversationId=e.conversationId;if(e.messagesPath?.trim())t.messagesPath=e.messagesPath;if(e.prompt?.trim())t.prompt=e.prompt;if(e.provider?.trim())t.provider=e.provider;if(e.model?.trim())t.model=e.model;if(e.source?.trim())t.source=e.source;if(typeof e.pid==="number")t.pid=e.pid;return Object.keys(t).length>0?t:void 0}function xk(e,t,n,r){return{sessionId:e.sessionId,workspaceRoot:e.workspaceRoot,cwd:e.cwd,createdAt:Date.parse(e.startedAt),updatedAt:Date.parse(e.updatedAt),createdByClientId:t?.createdByClientId??"hub",status:TWe(e.status),participants:t?[...t.participants.values()]:[],metadata:SWe(e),runtimeOptions:{enableTools:e.enableTools,enableSpawn:e.enableSpawn,enableTeams:e.enableTeams,mode:typeof e.metadata?.mode==="string"?e.metadata.mode:void 0,systemPrompt:typeof e.metadata?.systemPrompt==="string"?e.metadata.systemPrompt:void 0},runtimeSession:e.agentId?{agentId:e.agentId,team:e.teamName?{teamId:e.teamName}:void 0}:void 0,...n?{usage:{...n}}:{},...r?{aggregateUsage:{...r}}:{}}}function ie(e,t){return{version:e.version,requestId:e.requestId,ok:!0,...t!==void 0?{payload:t}:{}}}function pe(e,t,n){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:t,message:n}}}function Ho(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:void 0}function Rt(e){if(typeof e.payload?.sessionId==="string")return e.payload.sessionId.trim();return e.sessionId?.trim()??""}function Xr(e,t,n){return{version:"v1",event:e,eventId:xWe("hevt_"),sessionId:n,timestamp:Date.now(),payload:t}}async function Sn(e,t){let n=await e.sessionHost.getSession(t);if(!n)return;let r=await e.sessionHost.getAccumulatedUsage?.(t);return xk(n,e.sessionState.get(t),r?.usage,r?.aggregateUsage)}async function $n(e,t){let n=await e.sessionHost.getSession(t);if(!n)return;let r=await e.sessionHost.getAccumulatedUsage?.(t);return nd({session:n,usage:r?.usage,aggregateUsage:r?.aggregateUsage})}function eM(e,t,n,r,o={}){let i=e.sessionState.get(t);if(i){if(o.interactive!==void 0)i.interactive=o.interactive;if(r==="creator"&&!i.createdByClientId)i.createdByClientId=n;if(!i.participants.has(n))i.participants.set(n,{clientId:n,attachedAt:Date.now(),role:r});return i}let s={createdByClientId:n,interactive:o.interactive??!0,participants:new Map([[n,{clientId:n,attachedAt:Date.now(),role:r}]])};return e.sessionState.set(t,s),s}function BX(e,t,n,r,o={}){let i=e.sessionState.get(t);if(i){if(o.interactive!==void 0)i.interactive=o.interactive;if(!i.participants.has(n))i.participants.set(n,{clientId:n,attachedAt:Date.now(),role:r});return i}let s={interactive:o.interactive??!0,participants:new Map([[n,{clientId:n,attachedAt:Date.now(),role:r}]])};return e.sessionState.set(t,s),s}async function _k(e,t){let n=_We("approval_"),r=t.sessionId;if(e.sessionState.get(r)?.interactive===!1)return{approved:!1,reason:"Tool approval requires an interactive session, but this session is non-interactive."};let i;try{i=await e.sessionHost.getSession(r)}catch{i=void 0}let s=typeof i?.metadata?.agendaTaskId==="string"?i.metadata.agendaTaskId:void 0;return await new Promise((a)=>{let d=e.buildEvent("approval.requested",{approvalId:n,sessionId:t.sessionId,agentId:t.agentId,conversationId:t.conversationId,iteration:t.iteration,toolCallId:t.toolCallId,toolName:t.toolName,inputJson:JSON.stringify(t.input??null),policy:t.policy,agendaTaskId:s},r);e.pendingApprovals.set(n,{sessionId:r,resolve:a,requestedEvent:d}),e.publish(d)})}function HX(e,t){let n=[];for(let r of e.pendingApprovals.values()){if(!r.requestedEvent)continue;if(t&&r.sessionId!==t)continue;n.push(r.requestedEvent)}return n}function tM(e,t,n){let r=e.pendingApprovals.get(t);if(!r)return;return e.pendingApprovals.delete(t),r.resolve(n),{sessionId:r.sessionId}}function nM(e,t,n){let r=0;for(let[o,i]of[...e.pendingApprovals.entries()]){if(!t({approvalId:o,sessionId:i.sessionId}))continue;e.pendingApprovals.delete(o),i.resolve({approved:!1,reason:n}),e.publish(e.buildEvent("approval.resolved",{approvalId:o,approved:!1,cancelled:!0,reason:n},i.sessionId)),r+=1}return r}async function WX(e,t){let n=typeof t.payload?.approvalId==="string"?t.payload.approvalId.trim():"";if(!e.pendingApprovals.get(n))return pe(t,"approval_not_found",`Unknown approval: ${n}`);let o=typeof t.payload?.reason==="string"?t.payload.reason:t.payload?.payload&&typeof t.payload.payload==="object"&&!Array.isArray(t.payload.payload)&&typeof t.payload.payload.reason==="string"?t.payload.payload.reason:void 0,i=t.payload?.approved===!0,s=tM(e,n,{approved:i,reason:o});if(!s)return pe(t,"approval_not_found",`Unknown approval: ${n}`);return e.publish(e.buildEvent("approval.resolved",{approvalId:n,approved:i,reason:o},s.sessionId)),ie(t,{approvalId:n,approved:i})}import{createSessionId as RWe}from"@cerebriline/shared";function EWe(e){if(e instanceof Error)return{name:e.name,message:e.message,stack:e.stack};if(e===void 0)return;return e}var jX={debug:10,info:20,warn:30,error:40,silent:50};function AWe(){let e=process.env.CLINE_HUB_LOG_LEVEL?.trim().toLowerCase();if(e==="debug"||e==="info"||e==="warn"||e==="error"||e==="silent")return e;return process.env.VITEST?"error":"info"}function ke(e,t,n={}){if(jX[e]<jX[AWe()])return;let r=JSON.stringify({ts:new Date().toISOString(),level:e,component:"hub",message:t,...Object.fromEntries(Object.entries(n).map(([o,i])=>[o,EWe(i)]).filter(([,o])=>o!==void 0))});if(e==="error"||e==="warn"){console.error(`[hub] ${r}`);return}console.log(`[hub] ${r}`)}function pd(e,t){let n=t instanceof Error?t.stack||t.message:String(t);ke("error",e,{error:n})}async function qX(e,t,n,r,o,i){let s=RWe("capreq_"),a=performance.now();return ke("info","capability.request.start",{requestId:s,sessionId:t,capabilityName:n,targetClientId:o}),await new Promise((d,l)=>{e.pendingCapabilityRequests.set(s,{sessionId:t,targetClientId:o,capabilityName:n,onProgress:i,resolve:(c)=>{if(ke(c.ok?"info":"warn","capability.request.end",{requestId:s,sessionId:t,capabilityName:n,targetClientId:o,ok:c.ok,error:c.error,durationMs:Math.round(performance.now()-a)}),!c.ok){l(Error(c.error||`Capability ${n} was rejected by ${o}.`));return}d(c.payload)}}),e.publish(e.buildEvent("capability.requested",{requestId:s,targetClientId:o,capabilityName:n,payload:r},t)),ke("info","capability.request.published",{requestId:s,sessionId:t,capabilityName:n,targetClientId:o})})}function zX(e,t){let n=typeof t.payload?.requestId==="string"?t.payload.requestId.trim():"",r=e.pendingCapabilityRequests.get(n);if(!r)return ie(t,{requestId:n,ignored:!0});if((t.clientId?.trim()||"")!==r.targetClientId)return pe(t,"capability_wrong_client",`Capability request ${n} is owned by ${r.targetClientId}`);if(t.sessionId?.trim()&&t.sessionId.trim()!==r.sessionId)return pe(t,"capability_wrong_session",`Capability request ${n} belongs to session ${r.sessionId}`);let i=t.payload?.payload&&typeof t.payload.payload==="object"&&!Array.isArray(t.payload.payload)?t.payload.payload:{};return r.onProgress?.(i),ie(t,{requestId:n})}function _s(e,t,n){let r=0;for(let[o,i]of[...e.pendingCapabilityRequests.entries()]){if(!t({requestId:o,...i}))continue;e.pendingCapabilityRequests.delete(o),ke("warn","capability.request.cancelled",{requestId:o,sessionId:i.sessionId,capabilityName:i.capabilityName,targetClientId:i.targetClientId,reason:n}),i.resolve({ok:!1,error:n}),e.publish(e.buildEvent("capability.resolved",{requestId:o,capabilityName:i.capabilityName,targetClientId:i.targetClientId,ok:!1,cancelled:!0,error:n},i.sessionId)),r+=1}return r}async function KX(e,t){let n=typeof t.payload?.sessionId==="string"?t.payload.sessionId.trim():t.sessionId?.trim()||"",r=typeof t.payload?.capabilityName==="string"?t.payload.capabilityName.trim():"",o=typeof t.payload?.targetClientId==="string"?t.payload.targetClientId.trim():"";if(!n||!r||!o)return pe(t,"invalid_capability_request","capability.request requires sessionId, capabilityName, and targetClientId");try{let i=t.payload?.payload&&typeof t.payload.payload==="object"&&!Array.isArray(t.payload.payload)?t.payload.payload:{},s=await e.requestCapability(n,r,i,o);return ie(t,s)}catch(i){return pe(t,"capability_request_failed",i instanceof Error?i.message:String(i))}}function GX(e,t){let n=typeof t.payload?.requestId==="string"?t.payload.requestId.trim():"",r=e.pendingCapabilityRequests.get(n);if(!r)return ie(t,{requestId:n,ignored:!0});let o=t.clientId?.trim()||"";if(o!==r.targetClientId)return pe(t,"capability_wrong_client",`Capability request ${n} is owned by ${r.targetClientId}`);if(t.sessionId?.trim()&&t.sessionId.trim()!==r.sessionId)return pe(t,"capability_wrong_session",`Capability request ${n} belongs to session ${r.sessionId}`);e.pendingCapabilityRequests.delete(n);let i=t.payload?.payload&&typeof t.payload.payload==="object"&&!Array.isArray(t.payload.payload)?t.payload.payload:void 0,s=typeof t.payload?.error==="string"?t.payload.error:void 0,a=t.payload?.ok===!0;return ke(a?"info":"warn","capability.respond",{requestId:n,sessionId:r.sessionId,capabilityName:r.capabilityName,targetClientId:r.targetClientId,respondedByClientId:o,ok:a,error:s}),r.resolve({ok:a,payload:i,error:s}),e.publish(e.buildEvent("capability.resolved",{requestId:n,capabilityName:r.capabilityName,targetClientId:r.targetClientId,respondedByClientId:o,ok:a,payload:i,error:s},r.sessionId)),ie(t,{requestId:n,ok:a})}import{createSessionId as IWe}from"@cerebriline/shared";function VX(e,t){let n=t.payload,r=n?.clientId?.trim()||t.clientId?.trim()||IWe("client_");return e.clients.set(r,{clientId:r,clientType:n?.clientType??"unknown",displayName:n?.displayName,actorKind:n?.actorKind??"client",connectedAt:Date.now(),lastSeenAt:Date.now(),transport:n?.transport??"native",capabilities:n?.capabilities??[],metadata:n?.metadata,workspaceContext:n?.workspaceContext}),e.publish(e.buildEvent("hub.client.registered",{clientId:r,clientType:n?.clientType??"unknown",displayName:n?.displayName,metadata:n?.metadata,connectedAt:Date.now()})),ie(t,{clientId:r})}function YX(e,t){let n=t.clientId?.trim(),r=n?e.clients.get(n):void 0;if(!n||!r)return pe(t,"client_not_found","Client is not registered with this hub.");let o=Ho(t.payload?.metadata);if(r.lastSeenAt=Date.now(),o)r.metadata=JSON.parse(JSON.stringify(o));if(Array.isArray(t.payload?.capabilities))r.capabilities=t.payload.capabilities.flatMap((i)=>{if(!i||typeof i!=="object"||Array.isArray(i))return[];let s=i;if(typeof s.name!=="string"||!s.name.trim())return[];return[{name:s.name.trim(),...typeof s.description==="string"?{description:s.description}:{},...Array.isArray(s.scopes)&&s.scopes.every((a)=>typeof a==="string")?{scopes:s.scopes}:{}}]});return ie(t)}function XX(e,t,n){let r=t.clientId?.trim();if(r)e.clients.delete(r),n(r),e.publish(e.buildEvent("hub.client.disconnected",{clientId:r}));return ie(t)}function JX(e,t){return ie(t,{clients:[...e.clients.values()]})}import{buildConnectorConnectArgs as UWe,CONNECTOR_PLATFORMS as BWe,connectorChannelsFromPlatforms as HWe,listConnectorCatalog as WWe,mergeConnectorConnectArgs as jWe,shouldIncludeConnectorField as qWe}from"@cerebriline/shared";import{withConnectorStore as oM}from"@cerebriline/shared/db";import{existsSync as CWe,readdirSync as PWe,readFileSync as MWe}from"node:fs";import{join as QX}from"node:path";import{listConnectorCatalog as OWe}from"@cerebriline/shared";import{resolveConnectorDataDir as LWe}from"@cerebriline/shared/storage";var ZX={startedAt:(e)=>typeof e.startedAt==="string"?e.startedAt:void 0,port:(e)=>typeof e.port==="number"?e.port:void 0,baseUrl:(e)=>typeof e.baseUrl==="string"?e.baseUrl:void 0,connectionMode:(e)=>typeof e.connectionMode==="string"?e.connectionMode:void 0,userName:(e)=>typeof e.userName==="string"?e.userName:void 0,botUsername:(e)=>typeof e.botUsername==="string"?e.botUsername:void 0,applicationId:(e)=>typeof e.applicationId==="string"?e.applicationId:void 0,phoneNumberId:(e)=>typeof e.phoneNumberId==="string"?e.phoneNumberId:void 0},NWe={discord:{required:["userName","applicationId"],optional:["startedAt","port","baseUrl"]},telegram:{required:["botUsername"],optional:["startedAt"]},gchat:{required:["userName"],optional:["startedAt","port","baseUrl"]},linear:{required:["userName"],optional:["startedAt","port","baseUrl"]},slack:{required:["userName"],optional:["startedAt","connectionMode","port","baseUrl"]},whatsapp:{required:["userName"],optional:["startedAt","phoneNumberId","port","baseUrl"]}};function DWe(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch{return!1}}function $We(e,t){let n;try{let d=JSON.parse(MWe(t,"utf8"));if(!d||typeof d!=="object"||Array.isArray(d))return;n=d}catch{return}let r=typeof n.pid==="number"?n.pid:void 0,o=typeof n.hubUrl==="string"?n.hubUrl:typeof n.rpcAddress==="string"?n.rpcAddress:void 0;if(!r||!o||!DWe(r))return;let i=NWe[e];if(!i)return;let s={};for(let d of i.required){let l=ZX[d](n);if(!l||typeof l==="string"&&!l.trim())return;s[d]=l}for(let d of i.optional){let l=ZX[d](n);if(l!==void 0)s[d]=l}let a=e==="telegram"?s.botUsername:e==="discord"?s.applicationId:e==="whatsapp"&&typeof n.instanceKey==="string"?n.instanceKey:s.userName;if(!a)return;return{id:`${e}:${a}`,type:e,instanceId:a,pid:r,hubUrl:o,...s}}function rM(){let e=[];for(let{name:t}of OWe()){let n=QX(LWe(),t);if(!CWe(n))continue;for(let r of PWe(n)){if(!r.endsWith(".json")||r.endsWith(".threads.json"))continue;let o=$We(t,QX(n,r));if(o)e.push(o)}}return e.sort((t,n)=>{if(t.type!==n.type)return t.type.localeCompare(n.type);let r=t.botUsername??t.userName??"",o=n.botUsername??n.userName??"";return r.localeCompare(o)})}import{CLINE_CONNECTOR_SUPERVISED_ENV as QTt,readConnectorCliLaunchSpec as ZTt}from"@cerebriline/shared";import{ensureParentDir as tSt,resolveConnectorLogPath as nSt}from"@cerebriline/shared/storage";import{withConnectorStore as WTt}from"@cerebriline/shared/db";import{CLINE_CONNECTOR_STARTING_INSTANCE_ENV as zTt,CLINE_RUN_AS_HUB_DAEMON_ENV as KTt}from"@cerebriline/shared";var FWe;function eJ(){return FWe}function md(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function Ek(e){return typeof e==="string"?e.trim():void 0}function tJ(e){if(!md(e))return{};let t={};for(let[n,r]of Object.entries(e))if(typeof r==="string")t[n]=r.trim();return t}function zWe(){return oM((e)=>e.listConfigs()).map((e)=>({id:e.channel,type:e.type,configuredAt:e.configuredAt,updatedAt:e.updatedAt})).sort((e,t)=>e.type.localeCompare(t.type))}function iM(){return{available:HWe(),active:rM(),configured:zWe()}}function KWe(e,t){if(e.required&&!t[e.flag]?.trim())throw Error(`${e.label} is required`)}function GWe(e,t){let n={};for(let o of e.fields)n[o.flag]=t[o.flag]??o.initialValue??"";let r={};for(let o of e.fields){if(!qWe(o,n))continue;KWe(o,n),r[o.flag]=n[o.flag]}return r}function VWe(e){if(!md(e))throw Error("connector.configure payload must be an object.");let t=Ek(e.channel);if(!t)throw Error("channel is required");let n=BWe.find((u)=>u.id===t);if(!n)throw Error(`unknown connector channel: ${t}`);if(!new Set(WWe().map((u)=>u.name)).has(n.id))throw Error(`connector channel is not available: ${t}`);let o=tJ(e.values),i=GWe(n,o),s=md(e.security)?e.security:{},a=s.enabled===!0,d=tJ(s.values);if(a&&n.security)for(let u of n.security.fields){let h=d[u.key];if(!h)throw Error(u.requiredMessage);let p=u.validate?.(h);if(p)throw Error(p)}let l=a?{enabled:!0,values:d}:{enabled:!1,values:{}},c=UWe(n,i,l);return oM((u)=>u.upsertConfig({channel:t,type:t,values:i,security:l,updateConnectArgs:(h)=>jWe(n,h.connection.connectArgs,c,{replaceSecurityArgs:h.config?.security?.enabled===!0||l.enabled})})),iM()}function YWe(e){if(!md(e))throw Error("connector.delete_config payload must be an object.");let t=Ek(e.channel);if(!t)throw Error("channel is required");return oM((n)=>n.deleteConfig(t)),iM()}function XWe(e){return Array.isArray(e)?e.filter((t)=>typeof t==="string"):[]}function sM(){let e=eJ();if(!e)throw Error("connector supervision is unavailable in this hub; start connectors with the CLI instead");return e}function nJ(e){if(!md(e))throw Error("payload must be an object.");let t=Ek(e.channel);if(!t)throw Error("channel is required");let n=Ek(e.instanceId);if(!n)throw Error("instanceId is required");return{channel:t,instanceId:n}}async function JWe(e){let{channel:t,instanceId:n}=nJ(e),r=md(e)?e:{};return await sM().start({channel:t,instanceId:n,args:XWe(r.args),restart:r.restart===!0})}async function QWe(e){let{channel:t,instanceId:n}=nJ(e),r=md(e)?e:{};return{stopped:await sM().stop({channel:t,instanceId:n,disableAutostart:r.disableAutostart!==!1}),channel:t,instanceId:n}}function ZWe(e){return e==="connector.configure"||e==="connector.delete_config"||e==="connector.start"||e==="connector.stop"}function nf(e,t,n){if(!ZWe(t.command))return;Ii(e.telemetry,{ulid:t.sessionId??t.requestId??"hub",tool:t.command,success:n})}async function rJ(e,t){try{if(t.command==="connector.channels")return ie(t,iM());if(t.command==="connector.configure"){let n=VWe(t.payload);return nf(e,t,!0),ie(t,n)}if(t.command==="connector.delete_config"){let n=YWe(t.payload);return nf(e,t,!0),ie(t,n)}if(t.command==="connector.start"){let n=await JWe(t.payload);return nf(e,t,!0),ie(t,n)}if(t.command==="connector.stop"){let n=await QWe(t.payload);return nf(e,t,!0),ie(t,n)}if(t.command==="connector.supervised")return ie(t,{supervised:sM().list()});return pe(t,"unsupported_connector_command",`unsupported connector command: ${t.command}`)}catch(n){return nf(e,t,!1),pe(t,"connector_command_failed",n instanceof Error?n.message:String(n))}}var eje=30000;function tje(e){if(e==="aborted")return"run.aborted";if(e==="error"||e==="failed")return"run.failed";return"run.completed"}function nje(e){if(e.finishReason!=="error")return;return e.text.trim()||void 0}function rje(e,t){let n=e.activeRpcTurnCountBySession;n.set(t,(n.get(t)??0)+1);let r=!1;return()=>{if(r)return;r=!0;let o=(n.get(t)??1)-1;if(o<=0)n.delete(t);else n.set(t,o)}}function oJ(e,t,n){let r=n instanceof Error&&n.message.trim()?n.message:`Unknown session: ${t}`;return pe(e,Rf,r)}function oje(e){return e?e:void 0}function ije(e){let t=typeof e.timeoutMs==="number"?e.timeoutMs:typeof e.timeout_ms==="number"?e.timeout_ms:void 0;if(t&&Number.isFinite(t)&&t>0)return Math.floor(t);let n=typeof e.timeoutSeconds==="number"?e.timeoutSeconds:typeof e.timeout_seconds==="number"?e.timeout_seconds:void 0;if(n&&Number.isFinite(n)&&n>0)return Math.floor(n*1000);return}async function sje(e,t,n,r){let o=performance.now(),i=!1,s={command:t.command,requestId:t.requestId,clientId:t.clientId,sessionId:n.sessionId,timeoutMs:r},a=setInterval(()=>{if(i)return;let c=Math.round(performance.now()-o);ke("warn","run.heartbeat",{...s,elapsedMs:c}),e.publish(e.buildEvent("run.heartbeat",{requestId:t.requestId,elapsedMs:c,...r?{timeoutMs:r}:{}},n.sessionId))},eje),d=e.sessionHost.runTurn(n);d.then((c)=>{if(!i)return;ke("warn","run.late_end",{...s,elapsedMs:Math.round(performance.now()-o),finishReason:c?.finishReason})},(c)=>{if(!i)return;ke("error","run.late_error",{...s,elapsedMs:Math.round(performance.now()-o),error:c})});let l;try{if(!r)return await d;return await Promise.race([d,new Promise((c,u)=>{l=setTimeout(()=>{let h=`Hub run ${t.command} timed out after ${r}ms.`;i=!0,clearInterval(a),u(Error(h)),ke("error","run.timeout",{...s,elapsedMs:Math.round(performance.now()-o)}),nM(e,(p)=>p.sessionId===n.sessionId,h),_s(e,(p)=>p.sessionId===n.sessionId,h),e.sessionHost.abort(n.sessionId,h).catch((p)=>{ke("error","run.timeout_abort_failed",{...s,error:p})})},r)})])}finally{if(i=!0,clearInterval(a),l)clearTimeout(l)}}async function rf(e,t){let n=Rt(t),r=t.payload&&typeof t.payload==="object"?t.payload:{},o=typeof r.prompt==="string"?r.prompt:typeof r.input==="string"?r.input:"",i=r.attachments&&typeof r.attachments==="object"&&!Array.isArray(r.attachments)?r.attachments:void 0,s=Array.isArray(i?.userImages)?i.userImages.filter((p)=>typeof p==="string"&&p.trim().length>0):void 0,a=Array.isArray(i?.userFiles)?i.userFiles.filter((p)=>typeof p==="string"&&p.trim().length>0):void 0;if(!o.trim()&&!s?.length&&!a?.length)return pe(t,"invalid_session_input","session input requires a prompt or attachment");if(!await e.sessionHost.getSession(n))return oJ(t,n);e.publish(e.buildEvent("run.started",{...t.requestId?{requestId:t.requestId}:{},...t.clientId?{clientId:t.clientId}:{}},n));let l=ije(r);e.suppressNextTerminalEventBySession.set(n,"run.start.reply");let c=rje(e,n),u;try{try{u=await sje(e,t,{sessionId:n,prompt:o,mode:oje(r.mode),delivery:r.delivery==="queue"||r.delivery==="steer"?r.delivery:void 0,userImages:s,userFiles:a,timeoutMs:l},l)}catch(p){if(e.suppressNextTerminalEventBySession.get(n)==="run.start.reply")e.suppressNextTerminalEventBySession.delete(n);if(If(p))return oJ(t,n,p);throw e.publish(e.buildEvent("run.failed",{reason:"error",error:p instanceof Error?p.message:String(p)},n)),p}if(u){let p=await $n(e,n),m=nje(u);if(e.publish(e.buildEvent(tje(u.finishReason),{reason:u.finishReason,...m?{error:m}:{},result:u,...p?{snapshot:p}:{}},n)),e.suppressNextTerminalEventBySession.get(n)==="run.start.reply")e.suppressNextTerminalEventBySession.delete(n)}else e.suppressNextTerminalEventBySession.delete(n)}finally{c()}let h=await $n(e,n);return ie(t,u||h?{...u?{result:u}:{},...h?{snapshot:h}:{}}:void 0)}async function iJ(e,t){let n=Rt(t),r=typeof t.payload?.reason==="string"?t.payload.reason:"Run was aborted before pending approval or capability request was resolved.";nM(e,(o)=>o.sessionId===n,r);try{await e.sessionHost.abort(n,t.payload?.reason)}catch(o){ke("warn","run.abort_failed",{command:t.command,requestId:t.requestId,clientId:t.clientId,sessionId:n,error:o})}finally{_s(e,(o)=>o.sessionId===n,r)}return ie(t,{applied:!0})}async function sJ(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_id","run.proceed_while_running requires a sessionId");if(typeof e.sessionHost.proceedWhileRunning!=="function")return pe(t,"unsupported_command","This runtime does not support proceeding while commands are running.");let r=typeof t.payload?.toolCallId==="string"&&t.payload.toolCallId.trim().length>0?t.payload.toolCallId.trim():void 0,o=await e.sessionHost.proceedWhileRunning(n,r);return ie(t,{detachedCount:o})}async function aJ(e,t){let n=ER(t.payload?.payload);if(!n)return pe(t,"invalid_hook_payload","session.hook requires a valid hook event payload");return await e.sessionHost.dispatchHookEvent(n),ie(t,{applied:!0})}import{join as aje}from"node:path";import{createSessionId as dje}from"@cerebriline/shared";import{loadSqliteDb as lje}from"@cerebriline/shared/db";import{resolveDbDataDir as cje}from"@cerebriline/shared/storage";var uje=32,hje=604800000;class Ak extends Error{retryable=!0;constructor(e,t,n){super(`Session ${e} queue is full (${t} pending runs, limit ${n}); retry later.`);this.name="HubRunAdmissionRejectedError"}}function pje(e){let t=e?.replace(/[^a-zA-Z0-9_-]/g,"-");return aje(cje(),t?`hub-runs-${t}.db`:"hub-runs.db")}class aM{db;maxPendingPerSession;closed=!1;constructor(e={}){this.db=lje(e.dbPath??pje(e.ownerId)),this.maxPendingPerSession=e.maxPendingPerSession??uje,this.db.exec("PRAGMA journal_mode = WAL;"),this.db.exec("PRAGMA busy_timeout = 5000;"),this.db.exec(`
2058
2058
  CREATE TABLE IF NOT EXISTS hub_runs (
2059
2059
  accepted_seq INTEGER PRIMARY KEY AUTOINCREMENT,
2060
2060
  run_id TEXT NOT NULL UNIQUE,
@@ -2078,7 +2078,7 @@ ${e.instructions.trim()}
2078
2078
  ${t.length?`WHERE ${t.join(" AND ")}`:""}
2079
2079
  ORDER BY accepted_seq DESC LIMIT ?;`).all(...n).map(of)}recoverOnStartup(){let e=this.db.prepare("SELECT * FROM hub_runs WHERE state = 'running' ORDER BY accepted_seq;").all().map(of);this.db.prepare(`UPDATE hub_runs SET state = 'interrupted', ended_at = ?,
2080
2080
  error = 'Hub daemon exited before the run finished.'
2081
- WHERE state = 'running';`).run(Date.now());let t=this.db.prepare("SELECT * FROM hub_runs WHERE state = 'queued' ORDER BY accepted_seq;").all().map(of);return this.db.prepare("DELETE FROM hub_runs WHERE ended_at IS NOT NULL AND ended_at < ?;").run(Date.now()-hje),{interrupted:e.map((n)=>({...n,state:"interrupted"})),requeued:t}}close(){if(this.closed)return;this.closed=!0,this.db.close?.()}}function of(e){let t={};try{let n=JSON.parse(String(e.input_json));if(n&&typeof n==="object"&&!Array.isArray(n))t=n}catch{}return{runId:String(e.run_id),sessionId:String(e.session_id),state:String(e.state),input:t,clientId:typeof e.client_id==="string"?e.client_id:void 0,acceptedAt:Number(e.accepted_at),startedAt:e.started_at===null?void 0:Number(e.started_at),endedAt:e.ended_at===null?void 0:Number(e.ended_at),error:typeof e.error==="string"?e.error:void 0}}var mje="hub_draining",fje=new Set(["session.create","session.restore","session.fork","run.start","session.send_input","run.enqueue"]);function dJ(e){return fje.has(e)}function lJ(e){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:mje,message:"Hub is draining and refuses new mutating work; retry once a hub is serving again.",details:{retryable:!0}}}}class dM{ctx;queue;activeSessions=new Set;constructor(e,t){this.ctx=e;this.queue=t}pump(e){if(this.activeSessions.has(e))return;this.activeSessions.add(e),this.drainSession(e).catch((t)=>{ke("error","run.queue.pump_failed",{sessionId:e,error:t})}).finally(()=>{if(this.activeSessions.delete(e),this.queue.nextQueued(e))this.pump(e)})}async drainSession(e){for(;;){let t=this.queue.nextQueued(e);if(!t)return;this.queue.markRunning(t.runId),await this.execute(t)}}async execute(e){let t={version:"v1",command:"run.start",requestId:e.runId,clientId:e.clientId,sessionId:e.sessionId,payload:{...e.input,sessionId:e.sessionId}};try{let n=await rf(this.ctx,t);if(n.ok){let r=n.payload?.result?.finishReason;this.queue.markTerminal(e.runId,r==="aborted"?"aborted":r==="error"||r==="failed"?"failed":"completed",r==="error"?"Run finished with an error.":void 0)}else this.queue.markTerminal(e.runId,"failed",n.error?.message??"Run failed.")}catch(n){this.queue.markTerminal(e.runId,"failed",n instanceof Error?n.message:String(n))}}}function cJ(e,t,n,r){let o=Rt(t);if(!o)return pe(t,"invalid_session_id","run.enqueue requires a sessionId");let i=t.payload&&typeof t.payload==="object"?t.payload:{};if(!(typeof i.prompt==="string"?i.prompt:typeof i.input==="string"?i.input:"").trim())return pe(t,"invalid_session_input","run.enqueue requires a prompt string");let a;try{a=n.admit(o,i,t.clientId?.trim()||void 0)}catch(d){if(d instanceof Ak)return{version:t.version,requestId:t.requestId,ok:!1,error:{code:"run_admission_rejected",message:d.message,details:{retryable:!0}}};throw d}return e.publish(e.buildEvent("run.enqueued",{runId:a.runId,acceptedAt:a.acceptedAt,queuePosition:a.queuePosition,...t.clientId?{clientId:t.clientId}:{}},o)),r.pump(o),ie(t,{...a})}function uJ(e,t){let n=Rt(e)||void 0,r=typeof e.payload?.limit==="number"&&Number.isFinite(e.payload.limit)&&e.payload.limit>0?Math.floor(e.payload.limit):void 0;return ie(e,{runs:t.list({sessionId:n,limit:r}).map((o)=>({runId:o.runId,sessionId:o.sessionId,state:o.state,acceptedAt:o.acceptedAt,startedAt:o.startedAt,endedAt:o.endedAt,error:o.error}))})}async function hJ(e,t){switch(t.type){case"chunk":return;case"agent_event":await gje(e,t);return;case"hook":if(t.payload.hookEventName==="tool_call")e.publish(e.buildEvent("tool.started",{toolName:t.payload.toolName},t.payload.sessionId));else if(t.payload.hookEventName==="tool_result")e.publish(e.buildEvent("tool.finished",{toolName:t.payload.toolName},t.payload.sessionId));return;case"team_progress":{let n={type:"team_progress_projection",version:1,sessionId:t.payload.sessionId,summary:t.payload.summary,lastEvent:t.payload.lifecycle};e.publish(e.buildEvent("team.progress",n,t.payload.sessionId));return}case"pending_prompts":e.publish(e.buildEvent("session.pending_prompts",{sessionId:t.payload.sessionId,prompts:t.payload.prompts},t.payload.sessionId));return;case"pending_prompt_submitted":{let n={id:t.payload.id,prompt:t.payload.prompt,delivery:t.payload.delivery,attachmentCount:t.payload.attachmentCount,userImages:t.payload.userImages,userFiles:t.payload.userFiles,...t.payload.origin?{origin:t.payload.origin}:{}};e.publish(e.buildEvent("session.pending_prompt_submitted",{sessionId:t.payload.sessionId,prompt:n},t.payload.sessionId));return}case"session_snapshot":e.publish(e.buildEvent("session.updated",{sessionId:t.payload.sessionId,snapshot:t.payload.snapshot},t.payload.sessionId));return;case"status":{let[n,r]=await Promise.all([Sn(e,t.payload.sessionId),$n(e,t.payload.sessionId)]);if(n)e.publish(e.buildEvent("session.updated",{session:n,...r?{snapshot:r}:{}},t.payload.sessionId));return}case"ended":await wje(e,t);return;default:return}}async function gje(e,t){let{sessionId:n,event:r}=t.payload;if(r.type==="iteration_start"){e.publish(e.buildEvent("iteration.started",{iteration:r.iteration},n));return}if(r.type==="iteration_end"){e.publish(e.buildEvent("iteration.finished",{iteration:r.iteration,hadToolCalls:r.hadToolCalls,toolCallCount:r.toolCallCount},n));return}if(r.type==="content_start"){if(r.contentType==="text"&&typeof r.text==="string"&&r.text.length>0){e.publish(e.buildEvent("assistant.delta",{text:r.text},n));return}if(r.contentType==="reasoning"){if(r.redacted&&!r.reasoning){e.publish(e.buildEvent("reasoning.delta",{text:"",redacted:!0},n));return}if(typeof r.reasoning==="string"&&r.reasoning.length>0)e.publish(e.buildEvent("reasoning.delta",{text:r.reasoning,redacted:r.redacted===!0},n));return}if(r.contentType==="tool"){e.publish(e.buildEvent("tool.started",{toolCallId:r.toolCallId,toolName:r.toolName,input:r.input},n));return}}if(r.type==="content_update"&&r.contentType==="tool"){e.publish(e.buildEvent("tool.updated",{toolCallId:r.toolCallId,toolName:r.toolName,update:r.update},n));return}if(r.type==="content_end"){switch(r.contentType){case"text":e.publish(e.buildEvent("assistant.finished",{text:r.text},n));break;case"media":if(r.media)e.publish(e.buildEvent("assistant.media",{media:r.media},n));break;case"reasoning":e.publish(e.buildEvent("reasoning.finished",{reasoning:r.reasoning},n));break;case"tool":e.publish(e.buildEvent("tool.finished",{toolCallId:r.toolCallId,toolName:r.toolName,output:r.output,error:r.error},n));break}return}if(r.type==="notice"){e.publish(e.buildEvent("session.notice",{sessionId:n,message:r.message,noticeType:r.noticeType,...r.displayRole?{displayRole:r.displayRole}:{},...r.reason?{reason:r.reason}:{},...r.metadata?{metadata:r.metadata}:{},agent:{kind:t.payload.teamRole==="teammate"?"teammate":r.parentAgentId?"subagent":"lead",agentId:r.agentId,conversationId:r.conversationId,parentAgentId:r.parentAgentId,teamAgentId:t.payload.teamAgentId,teamRole:t.payload.teamRole}},n));return}if(r.type==="usage"){let o;try{o=await e.sessionHost.getAccumulatedUsage?.(n)}catch{o=void 0}e.publish(e.buildEvent("usage.updated",{sessionId:n,delta:{inputTokens:r.inputTokens,outputTokens:r.outputTokens,cacheReadTokens:r.cacheReadTokens??0,cacheWriteTokens:r.cacheWriteTokens??0,reasoningTokenCount:r.reasoningTokenCount,totalCost:r.cost??0,...r.reasoningTokens!==void 0?{reasoningTokens:r.reasoningTokens}:{},...r.timings?{timings:r.timings}:{},...r.outputSplit?{outputSplit:r.outputSplit}:{},...r.auxiliary?{auxiliary:!0}:{}},totals:{inputTokens:r.totalInputTokens,outputTokens:r.totalOutputTokens,cacheReadTokens:r.totalCacheReadTokens??0,cacheWriteTokens:r.totalCacheWriteTokens??0,totalCost:r.totalCost??0},usage:o?.usage,aggregateUsage:o?.aggregateUsage,agent:{kind:t.payload.teamRole==="teammate"?"teammate":r.parentAgentId?"subagent":"lead",agentId:r.agentId,conversationId:r.conversationId,parentAgentId:r.parentAgentId,teamAgentId:t.payload.teamAgentId,teamRole:t.payload.teamRole}},n));return}if(r.type==="done"){e.publish(e.buildEvent("agent.done",{reason:r.reason,text:r.text,iterations:r.iterations,usage:r.usage},n));return}if(r.type==="error")await yje(e,t)}async function yje(e,t){let{sessionId:n,event:r}=t.payload;if(r.type!=="error"||r.recoverable)return;if(r.parentAgentId||t.payload.teamRole==="teammate")return;if((e.activeRpcTurnCountBySession.get(n)??0)>0)return;let o=r.error instanceof Error?r.error.message:String(r.error),i=await $n(e,n);e.publish(e.buildEvent("run.failed",{reason:"error",...o?{error:o,text:o}:{},...i?{snapshot:i}:{}},n))}async function wje(e,t){let n=e.suppressNextTerminalEventBySession.get(t.payload.sessionId),r=n===t.payload.reason||n==="run.start.reply";if(r)e.suppressNextTerminalEventBySession.delete(t.payload.sessionId);let[o,i]=await Promise.all([Sn(e,t.payload.sessionId),$n(e,t.payload.sessionId)]);if(t.payload.reason==="completed"){let s=await jY(o);e.publish(e.buildEvent("ui.notify",s,t.payload.sessionId))}if(r)return;e.publish(e.buildEvent(t.payload.reason==="aborted"?"run.aborted":t.payload.reason==="error"||t.payload.reason==="failed"?"run.failed":"run.completed",{reason:t.payload.reason,...i?{snapshot:i}:{}},t.payload.sessionId))}import{createSessionId as wJ,parseRuntimeConfigExtensions as bJ,ReasoningEffortSchema as Ije}from"@cerebriline/shared";import{HUB_CHECKPOINT_CAPABILITY as HSt,HUB_COMPACTION_CAPABILITY as WSt,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as jSt,HUB_HOOK_CAPABILITY_PREFIX as qSt,HUB_MISTAKE_LIMIT_CAPABILITY as zSt,HUB_REASONING_LOOP_LIMIT_CAPABILITY as KSt,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as GSt,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as VSt,isHubToolExecutorName as bje}from"@cerebriline/shared";import{HUB_CHECKPOINT_CAPABILITY as txt,HUB_COMPACTION_CAPABILITY as nxt,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as rxt,HUB_HOOK_CAPABILITY_PREFIX as oxt,HUB_MISTAKE_LIMIT_CAPABILITY as ixt,HUB_REASONING_LOOP_LIMIT_CAPABILITY as sxt,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as axt,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as dxt}from"@cerebriline/shared";var vje=["beforeRun","afterRun","beforeModel","afterModel","beforeTool","afterTool","onEvent"];function fd(e){return e&&typeof e==="object"&&!Array.isArray(e)?JSON.parse(JSON.stringify(e)):void 0}function kje(e,t){let n=typeof e.name==="string"?e.name.trim():"",r=typeof e.description==="string"?e.description:"",o=typeof e.capabilityName==="string"?e.capabilityName.trim():"",i=fd(e.inputSchema);if(!n||!r||!i||!o||t.has(o))return;return t.add(o),{kind:"tool",capabilityName:o,name:n,description:r,inputSchema:i,...fd(e.lifecycle)?{lifecycle:fd(e.lifecycle)}:{}}}function cM(e){if(!Array.isArray(e))return[];let t=[],n=new Set;for(let r of e){if(!r||typeof r!=="object"||Array.isArray(r))continue;let o=r,i=o.kind,s=typeof o.capabilityName==="string"?o.capabilityName.trim():"";if(!s||n.has(s))continue;if(i==="tool"){let a=kje(o,n);if(a)t.push(a);continue}if(i==="toolExecutor"){let a=o.executor;if(!bje(a))continue;n.add(s),t.push({kind:"toolExecutor",capabilityName:s,executor:a});continue}if(i==="hook"){let a=typeof o.name==="string"?o.name.trim():"";if(!a)continue;n.add(s),t.push({kind:"hook",capabilityName:s,name:a});continue}if(i==="compaction"){n.add(s),t.push({kind:"compaction",capabilityName:s,...fd(o.config)?{config:fd(o.config)}:{}});continue}if(i==="checkpoint"){n.add(s),t.push({kind:"checkpoint",capabilityName:s,...fd(o.config)?{config:fd(o.config)}:{}});continue}if(i==="mistakeLimit"){n.add(s),t.push({kind:"mistakeLimit",capabilityName:s});continue}if(i==="reasoningLoopLimit"){n.add(s),t.push({kind:"reasoningLoopLimit",capabilityName:s});continue}if(i==="userInstructionService")n.add(s),t.push({kind:"userInstructionService",capabilityName:s})}return t}function mJ(e){let t=e.metadata?{...e.metadata}:void 0;return{sessionId:e.sessionId,agentId:e.agentId,conversationId:e.conversationId,runId:e.runId,iteration:e.iteration,toolCallId:e.toolCallId,metadata:t&&Object.keys(t).length>0?t:void 0}}function fJ(e){return Object.hasOwn(e,"update")?e.update:e}function sf(e){return e.trim().replace(/^\/+/,"").toLowerCase()}function Tje(e){let t=(e??[]).map(sf).filter(Boolean);return t.length>0?new Set(t):void 0}function Sje(e,t,n){if(!n)return!0;let r=sf(e),o=sf(t),i=r.includes(":")?r.split(":").at(-1)??r:r,s=o.includes(":")?o.split(":").at(-1)??o:o;return n.has(r)||n.has(o)||n.has(i)||n.has(s)}function lM(e,t){let n=Tje(t);return e.records.skill.map((r)=>({id:r.id,name:r.item.name,description:"description"in r.item&&typeof r.item.description==="string"?r.item.description:void 0,disabled:r.item.disabled===!0,skill:r.item})).filter((r)=>Sje(r.id,r.name,n))}function pJ(e,t){let n=async(r,o)=>{let i=sf(r),a=lM(e,t).filter((l)=>l.id===i||sf(l.name)===i||l.id.endsWith(`:${i}`)).filter((l)=>!l.disabled);if(a.length!==1)return a.length>1?`Skill "${r}" is ambiguous. Use one of: ${a.map((l)=>l.id).join(", ")}`:`Skill "${r}" not found.`;let d=a[0].skill;return xP(d,o)};return Object.defineProperty(n,"configuredSkills",{get:()=>lM(e,t).map(({skill:r,...o})=>o),enumerable:!0}),n}function xje(e,t,n,r){let o={records:{skill:[],rule:[],workflow:[]},runtimeCommands:[]},i=async()=>{let s=await r(e,n.capabilityName,{},t);if(s?.snapshot)o=s.snapshot};return{start:i,stop:()=>{},refreshType:async()=>{await i()},listRecords:(s)=>[...o.records[s]],listRuntimeCommands:()=>[...o.runtimeCommands],resolveRuntimeSlashCommand:(s,a)=>{if(!s.startsWith("/")||s.length<2)return s;let l=s.match(/^\/(\S+)/)?.[1];if(!l)return s;let c=ks(l),u=o.runtimeCommands.find((h)=>ks(h.name)===c);if(!u)return s;if(u.kind==="skill"&&a?.expandSkillCommands===!1)return s;return`${u.instructions}${s.slice(l.length+1)}`},hasConfiguredSkills:(s)=>lM(o,s).some((a)=>!a.disabled),createSkillsExecutor:(s)=>pJ(o,s),createExtension:(s)=>({name:"cline-hub-user-instructions",manifest:{capabilities:[s.includeRules?"rules":void 0,s.registerSkillsTool?"tools":void 0,s.includeSkills||s.includeWorkflows?"commands":void 0].filter((a)=>Boolean(a))},setup(a){if(s.includeRules)a.registerRule({id:"cline-hub-user-instructions:rules",source:"hub-user-instructions",content:()=>pf(o.records.rule)});if(s.registerSkillsTool)a.registerTool(Xo(pJ(o,s.allowedSkillNames)));for(let d of o.runtimeCommands.filter((l)=>l.kind==="skill"&&s.includeSkills||l.kind==="workflow"&&s.includeWorkflows))a.registerCommand({name:d.name,description:d.description,handler:(l)=>{let c=l.trim();return c?`${d.instructions}
2081
+ WHERE state = 'running';`).run(Date.now());let t=this.db.prepare("SELECT * FROM hub_runs WHERE state = 'queued' ORDER BY accepted_seq;").all().map(of);return this.db.prepare("DELETE FROM hub_runs WHERE ended_at IS NOT NULL AND ended_at < ?;").run(Date.now()-hje),{interrupted:e.map((n)=>({...n,state:"interrupted"})),requeued:t}}close(){if(this.closed)return;this.closed=!0,this.db.close?.()}}function of(e){let t={};try{let n=JSON.parse(String(e.input_json));if(n&&typeof n==="object"&&!Array.isArray(n))t=n}catch{}return{runId:String(e.run_id),sessionId:String(e.session_id),state:String(e.state),input:t,clientId:typeof e.client_id==="string"?e.client_id:void 0,acceptedAt:Number(e.accepted_at),startedAt:e.started_at===null?void 0:Number(e.started_at),endedAt:e.ended_at===null?void 0:Number(e.ended_at),error:typeof e.error==="string"?e.error:void 0}}var mje="hub_draining",fje=new Set(["session.create","session.restore","session.fork","run.start","session.send_input","run.enqueue"]);function dJ(e){return fje.has(e)}function lJ(e){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:mje,message:"Hub is draining and refuses new mutating work; retry once a hub is serving again.",details:{retryable:!0}}}}class dM{ctx;queue;activeSessions=new Set;constructor(e,t){this.ctx=e;this.queue=t}pump(e){if(this.activeSessions.has(e))return;this.activeSessions.add(e),this.drainSession(e).catch((t)=>{ke("error","run.queue.pump_failed",{sessionId:e,error:t})}).finally(()=>{if(this.activeSessions.delete(e),this.queue.nextQueued(e))this.pump(e)})}async drainSession(e){for(;;){let t=this.queue.nextQueued(e);if(!t)return;this.queue.markRunning(t.runId),await this.execute(t)}}async execute(e){let t={version:"v1",command:"run.start",requestId:e.runId,clientId:e.clientId,sessionId:e.sessionId,payload:{...e.input,sessionId:e.sessionId}};try{let n=await rf(this.ctx,t);if(n.ok){let r=n.payload?.result?.finishReason;this.queue.markTerminal(e.runId,r==="aborted"?"aborted":r==="error"||r==="failed"?"failed":"completed",r==="error"?"Run finished with an error.":void 0)}else this.queue.markTerminal(e.runId,"failed",n.error?.message??"Run failed.")}catch(n){this.queue.markTerminal(e.runId,"failed",n instanceof Error?n.message:String(n))}}}function cJ(e,t,n,r){let o=Rt(t);if(!o)return pe(t,"invalid_session_id","run.enqueue requires a sessionId");let i=t.payload&&typeof t.payload==="object"?t.payload:{};if(!(typeof i.prompt==="string"?i.prompt:typeof i.input==="string"?i.input:"").trim())return pe(t,"invalid_session_input","run.enqueue requires a prompt string");let a;try{a=n.admit(o,i,t.clientId?.trim()||void 0)}catch(d){if(d instanceof Ak)return{version:t.version,requestId:t.requestId,ok:!1,error:{code:"run_admission_rejected",message:d.message,details:{retryable:!0}}};throw d}return e.publish(e.buildEvent("run.enqueued",{runId:a.runId,acceptedAt:a.acceptedAt,queuePosition:a.queuePosition,...t.clientId?{clientId:t.clientId}:{}},o)),r.pump(o),ie(t,{...a})}function uJ(e,t){let n=Rt(e)||void 0,r=typeof e.payload?.limit==="number"&&Number.isFinite(e.payload.limit)&&e.payload.limit>0?Math.floor(e.payload.limit):void 0;return ie(e,{runs:t.list({sessionId:n,limit:r}).map((o)=>({runId:o.runId,sessionId:o.sessionId,state:o.state,acceptedAt:o.acceptedAt,startedAt:o.startedAt,endedAt:o.endedAt,error:o.error}))})}async function hJ(e,t){switch(t.type){case"chunk":return;case"agent_event":await gje(e,t);return;case"hook":if(t.payload.hookEventName==="tool_call")e.publish(e.buildEvent("tool.started",{toolName:t.payload.toolName},t.payload.sessionId));else if(t.payload.hookEventName==="tool_result")e.publish(e.buildEvent("tool.finished",{toolName:t.payload.toolName},t.payload.sessionId));return;case"team_progress":{let n={type:"team_progress_projection",version:1,sessionId:t.payload.sessionId,summary:t.payload.summary,lastEvent:t.payload.lifecycle};e.publish(e.buildEvent("team.progress",n,t.payload.sessionId));return}case"pending_prompts":e.publish(e.buildEvent("session.pending_prompts",{sessionId:t.payload.sessionId,prompts:t.payload.prompts},t.payload.sessionId));return;case"pending_prompt_submitted":{let n={id:t.payload.id,prompt:t.payload.prompt,delivery:t.payload.delivery,attachmentCount:t.payload.attachmentCount,userImages:t.payload.userImages,userFiles:t.payload.userFiles,...t.payload.origin?{origin:t.payload.origin}:{}};e.publish(e.buildEvent("session.pending_prompt_submitted",{sessionId:t.payload.sessionId,prompt:n},t.payload.sessionId));return}case"session_snapshot":e.publish(e.buildEvent("session.updated",{sessionId:t.payload.sessionId,snapshot:t.payload.snapshot},t.payload.sessionId));return;case"status":{let[n,r]=await Promise.all([Sn(e,t.payload.sessionId),$n(e,t.payload.sessionId)]);if(n)e.publish(e.buildEvent("session.updated",{session:n,...r?{snapshot:r}:{}},t.payload.sessionId));return}case"ended":await wje(e,t);return;default:return}}async function gje(e,t){let{sessionId:n,event:r}=t.payload;if(r.type==="iteration_start"){e.publish(e.buildEvent("iteration.started",{iteration:r.iteration},n));return}if(r.type==="iteration_end"){e.publish(e.buildEvent("iteration.finished",{iteration:r.iteration,hadToolCalls:r.hadToolCalls,toolCallCount:r.toolCallCount},n));return}if(r.type==="content_start"){if(r.contentType==="text"&&typeof r.text==="string"&&r.text.length>0){e.publish(e.buildEvent("assistant.delta",{text:r.text},n));return}if(r.contentType==="reasoning"){if(r.redacted&&!r.reasoning){e.publish(e.buildEvent("reasoning.delta",{text:"",redacted:!0},n));return}if(typeof r.reasoning==="string"&&r.reasoning.length>0)e.publish(e.buildEvent("reasoning.delta",{text:r.reasoning,redacted:r.redacted===!0},n));return}if(r.contentType==="tool"){e.publish(e.buildEvent("tool.started",{toolCallId:r.toolCallId,toolName:r.toolName,input:r.input},n));return}}if(r.type==="content_update"&&r.contentType==="tool"){e.publish(e.buildEvent("tool.updated",{toolCallId:r.toolCallId,toolName:r.toolName,update:r.update},n));return}if(r.type==="content_end"){switch(r.contentType){case"text":e.publish(e.buildEvent("assistant.finished",{text:r.text},n));break;case"media":if(r.media)e.publish(e.buildEvent("assistant.media",{media:r.media},n));break;case"reasoning":e.publish(e.buildEvent("reasoning.finished",{reasoning:r.reasoning},n));break;case"tool":e.publish(e.buildEvent("tool.finished",{toolCallId:r.toolCallId,toolName:r.toolName,output:r.output,error:r.error},n));break}return}if(r.type==="notice"){e.publish(e.buildEvent("session.notice",{sessionId:n,message:r.message,noticeType:r.noticeType,...r.displayRole?{displayRole:r.displayRole}:{},...r.reason?{reason:r.reason}:{},...r.metadata?{metadata:r.metadata}:{},agent:{kind:t.payload.teamRole==="teammate"?"teammate":r.parentAgentId?"subagent":"lead",agentId:r.agentId,conversationId:r.conversationId,parentAgentId:r.parentAgentId,teamAgentId:t.payload.teamAgentId,teamRole:t.payload.teamRole}},n));return}if(r.type==="usage"){let o;try{o=await e.sessionHost.getAccumulatedUsage?.(n)}catch{o=void 0}e.publish(e.buildEvent("usage.updated",{sessionId:n,delta:{inputTokens:r.inputTokens,outputTokens:r.outputTokens,cacheReadTokens:r.cacheReadTokens??0,cacheWriteTokens:r.cacheWriteTokens??0,reasoningTokenCount:r.reasoningTokenCount,totalCost:r.cost??0,...r.reasoningTokens!==void 0?{reasoningTokens:r.reasoningTokens}:{},...r.timings?{timings:r.timings}:{},...r.outputSplit?{outputSplit:r.outputSplit}:{},...r.auxiliary?{auxiliary:!0}:{}},totals:{inputTokens:r.totalInputTokens,outputTokens:r.totalOutputTokens,cacheReadTokens:r.totalCacheReadTokens??0,cacheWriteTokens:r.totalCacheWriteTokens??0,totalCost:r.totalCost??0},usage:o?.usage,aggregateUsage:o?.aggregateUsage,agent:{kind:t.payload.teamRole==="teammate"?"teammate":r.parentAgentId?"subagent":"lead",agentId:r.agentId,conversationId:r.conversationId,parentAgentId:r.parentAgentId,teamAgentId:t.payload.teamAgentId,teamRole:t.payload.teamRole}},n));return}if(r.type==="done"){e.publish(e.buildEvent("agent.done",{reason:r.reason,text:r.text,iterations:r.iterations,usage:r.usage},n));return}if(r.type==="error")await yje(e,t)}async function yje(e,t){let{sessionId:n,event:r}=t.payload;if(r.type!=="error"||r.recoverable)return;if(r.parentAgentId||t.payload.teamRole==="teammate")return;if((e.activeRpcTurnCountBySession.get(n)??0)>0)return;let o=r.error instanceof Error?r.error.message:String(r.error),i=await $n(e,n);e.publish(e.buildEvent("run.failed",{reason:"error",...o?{error:o,text:o}:{},...i?{snapshot:i}:{}},n))}async function wje(e,t){let n=e.suppressNextTerminalEventBySession.get(t.payload.sessionId),r=n===t.payload.reason||n==="run.start.reply";if(r)e.suppressNextTerminalEventBySession.delete(t.payload.sessionId);let[o,i]=await Promise.all([Sn(e,t.payload.sessionId),$n(e,t.payload.sessionId)]);if(t.payload.reason==="completed"){let s=await jY(o);e.publish(e.buildEvent("ui.notify",s,t.payload.sessionId))}if(r)return;e.publish(e.buildEvent(t.payload.reason==="aborted"?"run.aborted":t.payload.reason==="error"||t.payload.reason==="failed"?"run.failed":"run.completed",{reason:t.payload.reason,...i?{snapshot:i}:{}},t.payload.sessionId))}import{createSessionId as wJ,parseRuntimeConfigExtensions as bJ,ReasoningEffortSchema as Ije}from"@cerebriline/shared";import{HUB_CHECKPOINT_CAPABILITY as jSt,HUB_COMPACTION_CAPABILITY as qSt,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as zSt,HUB_HOOK_CAPABILITY_PREFIX as KSt,HUB_MISTAKE_LIMIT_CAPABILITY as GSt,HUB_REASONING_LOOP_LIMIT_CAPABILITY as VSt,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as YSt,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as XSt,isHubToolExecutorName as bje}from"@cerebriline/shared";import{HUB_CHECKPOINT_CAPABILITY as rxt,HUB_COMPACTION_CAPABILITY as oxt,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as ixt,HUB_HOOK_CAPABILITY_PREFIX as sxt,HUB_MISTAKE_LIMIT_CAPABILITY as axt,HUB_REASONING_LOOP_LIMIT_CAPABILITY as dxt,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as lxt,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as cxt}from"@cerebriline/shared";var vje=["beforeRun","afterRun","beforeModel","afterModel","beforeTool","afterTool","onEvent"];function fd(e){return e&&typeof e==="object"&&!Array.isArray(e)?JSON.parse(JSON.stringify(e)):void 0}function kje(e,t){let n=typeof e.name==="string"?e.name.trim():"",r=typeof e.description==="string"?e.description:"",o=typeof e.capabilityName==="string"?e.capabilityName.trim():"",i=fd(e.inputSchema);if(!n||!r||!i||!o||t.has(o))return;return t.add(o),{kind:"tool",capabilityName:o,name:n,description:r,inputSchema:i,...fd(e.lifecycle)?{lifecycle:fd(e.lifecycle)}:{}}}function cM(e){if(!Array.isArray(e))return[];let t=[],n=new Set;for(let r of e){if(!r||typeof r!=="object"||Array.isArray(r))continue;let o=r,i=o.kind,s=typeof o.capabilityName==="string"?o.capabilityName.trim():"";if(!s||n.has(s))continue;if(i==="tool"){let a=kje(o,n);if(a)t.push(a);continue}if(i==="toolExecutor"){let a=o.executor;if(!bje(a))continue;n.add(s),t.push({kind:"toolExecutor",capabilityName:s,executor:a});continue}if(i==="hook"){let a=typeof o.name==="string"?o.name.trim():"";if(!a)continue;n.add(s),t.push({kind:"hook",capabilityName:s,name:a});continue}if(i==="compaction"){n.add(s),t.push({kind:"compaction",capabilityName:s,...fd(o.config)?{config:fd(o.config)}:{}});continue}if(i==="checkpoint"){n.add(s),t.push({kind:"checkpoint",capabilityName:s,...fd(o.config)?{config:fd(o.config)}:{}});continue}if(i==="mistakeLimit"){n.add(s),t.push({kind:"mistakeLimit",capabilityName:s});continue}if(i==="reasoningLoopLimit"){n.add(s),t.push({kind:"reasoningLoopLimit",capabilityName:s});continue}if(i==="userInstructionService")n.add(s),t.push({kind:"userInstructionService",capabilityName:s})}return t}function mJ(e){let t=e.metadata?{...e.metadata}:void 0;return{sessionId:e.sessionId,agentId:e.agentId,conversationId:e.conversationId,runId:e.runId,iteration:e.iteration,toolCallId:e.toolCallId,metadata:t&&Object.keys(t).length>0?t:void 0}}function fJ(e){return Object.hasOwn(e,"update")?e.update:e}function sf(e){return e.trim().replace(/^\/+/,"").toLowerCase()}function Tje(e){let t=(e??[]).map(sf).filter(Boolean);return t.length>0?new Set(t):void 0}function Sje(e,t,n){if(!n)return!0;let r=sf(e),o=sf(t),i=r.includes(":")?r.split(":").at(-1)??r:r,s=o.includes(":")?o.split(":").at(-1)??o:o;return n.has(r)||n.has(o)||n.has(i)||n.has(s)}function lM(e,t){let n=Tje(t);return e.records.skill.map((r)=>({id:r.id,name:r.item.name,description:"description"in r.item&&typeof r.item.description==="string"?r.item.description:void 0,disabled:r.item.disabled===!0,skill:r.item})).filter((r)=>Sje(r.id,r.name,n))}function pJ(e,t){let n=async(r,o)=>{let i=sf(r),a=lM(e,t).filter((l)=>l.id===i||sf(l.name)===i||l.id.endsWith(`:${i}`)).filter((l)=>!l.disabled);if(a.length!==1)return a.length>1?`Skill "${r}" is ambiguous. Use one of: ${a.map((l)=>l.id).join(", ")}`:`Skill "${r}" not found.`;let d=a[0].skill;return xP(d,o)};return Object.defineProperty(n,"configuredSkills",{get:()=>lM(e,t).map(({skill:r,...o})=>o),enumerable:!0}),n}function xje(e,t,n,r){let o={records:{skill:[],rule:[],workflow:[]},runtimeCommands:[]},i=async()=>{let s=await r(e,n.capabilityName,{},t);if(s?.snapshot)o=s.snapshot};return{start:i,stop:()=>{},refreshType:async()=>{await i()},listRecords:(s)=>[...o.records[s]],listRuntimeCommands:()=>[...o.runtimeCommands],resolveRuntimeSlashCommand:(s,a)=>{if(!s.startsWith("/")||s.length<2)return s;let l=s.match(/^\/(\S+)/)?.[1];if(!l)return s;let c=ks(l),u=o.runtimeCommands.find((h)=>ks(h.name)===c);if(!u)return s;if(u.kind==="skill"&&a?.expandSkillCommands===!1)return s;return`${u.instructions}${s.slice(l.length+1)}`},hasConfiguredSkills:(s)=>lM(o,s).some((a)=>!a.disabled),createSkillsExecutor:(s)=>pJ(o,s),createExtension:(s)=>({name:"cline-hub-user-instructions",manifest:{capabilities:[s.includeRules?"rules":void 0,s.registerSkillsTool?"tools":void 0,s.includeSkills||s.includeWorkflows?"commands":void 0].filter((a)=>Boolean(a))},setup(a){if(s.includeRules)a.registerRule({id:"cline-hub-user-instructions:rules",source:"hub-user-instructions",content:()=>pf(o.records.rule)});if(s.registerSkillsTool)a.registerTool(Xo(pJ(o,s.allowedSkillNames)));for(let d of o.runtimeCommands.filter((l)=>l.kind==="skill"&&s.includeSkills||l.kind==="workflow"&&s.includeWorkflows))a.registerCommand({name:d.name,description:d.description,handler:(l)=>{let c=l.trim();return c?`${d.instructions}
2082
2082
 
2083
2083
  ${c}`:d.instructions}})}})}}function _je(e,t,n,r){let o=n.map((i)=>[i.executor,async(...s)=>{let a=s.at(-1),d=s.slice(0,-1);return(await r(e,i.capabilityName,{executor:i.executor,args:d,context:mJ(a)},t,a.emitUpdate?(c)=>{a.emitUpdate?.(fJ(c))}:void 0))?.result}]);return o.length>0?Object.fromEntries(o):void 0}function Eje(e,t,n,r){if(n.length===0)return;return n.map((o)=>({name:o.name,description:o.description,inputSchema:o.inputSchema,lifecycle:o.lifecycle,async execute(i,s){return(await r(e,o.capabilityName,{toolName:o.name,input:i,context:mJ(s)},t,s.emitUpdate?(d)=>{s.emitUpdate?.(fJ(d))}:void 0))?.result}}))}var Aje=new Set(["assistant-text-delta","assistant-reasoning-delta","tool-updated"]);function Rje(e,t,n,r){let o=new Map(n.map((s)=>[s.name,s])),i={};for(let s of vje){let a=o.get(s);if(!a)continue;i[s]=async(d)=>{if(s==="onEvent"&&Aje.has(d.type))return;return(await r(e,a.capabilityName,{context:d},t))?.control}}return Object.keys(i).length>0?i:void 0}function uM(e){let t=e.contributions.filter((l)=>l.kind==="toolExecutor"),n=e.contributions.filter((l)=>l.kind==="tool"),r=e.contributions.filter((l)=>l.kind==="hook"),o=e.contributions.find((l)=>l.kind==="compaction"),i=e.contributions.find((l)=>l.kind==="checkpoint"),s=e.contributions.find((l)=>l.kind==="mistakeLimit"),a=e.contributions.find((l)=>l.kind==="reasoningLoopLimit"),d=e.contributions.find((l)=>l.kind==="userInstructionService");return{hasClientContributions:e.contributions.length>0,toolExecutors:_je(e.sessionId,e.targetClientId,t,e.requestCapability),localRuntime:{...r.length>0?{hooks:Rje(e.sessionId,e.targetClientId,r,e.requestCapability)}:{},...n.length>0?{extraTools:Eje(e.sessionId,e.targetClientId,n,e.requestCapability)}:{},...o?{compaction:{...e.sessionConfig?.compaction??{},...o.config,compact:async(l)=>(await e.requestCapability(e.sessionId,o.capabilityName,{context:l},e.targetClientId))?.result}}:{},...i?{checkpoint:{...e.sessionConfig?.checkpoint??{},...i.config,createCheckpoint:async(l)=>(await e.requestCapability(e.sessionId,i.capabilityName,{context:l},e.targetClientId))?.result}}:{},...s?{onConsecutiveMistakeLimitReached:async(l)=>(await e.requestCapability(e.sessionId,s.capabilityName,{context:l},e.targetClientId))?.result}:{},...a?{onReasoningLoopLimitReached:async(l)=>(await e.requestCapability(e.sessionId,a.capabilityName,{context:l},e.targetClientId))?.result}:{},...d?{userInstructionService:xje(e.sessionId,e.targetClientId,d,e.requestCapability)}:{}}}}var gJ="hubCapabilityOwnerClientId";function gd(e,t){let n=e?.[t];return typeof n==="string"&&n.trim()?n.trim():void 0}function vJ(e){let t=Ho(e),n=typeof t?.name==="string"?t.name.trim():"";if(!n)return;let r=gd(t,"version"),o=gd(t,"platform"),i=gd(t,"platformVersion");return{name:n,...r?{version:r}:{},...o?{platform:o}:{},...i?{platformVersion:i}:{},...typeof t?.isMultiRoot==="boolean"?{isMultiRoot:t.isMultiRoot}:{}}}function kJ(e){let t=Ho(e),n=gd(t,"distinctId"),o=t?.accountId===null?null:gd(t,"accountId"),i=gd(t,"email"),s=gd(t,"organizationId");if(!n&&o===void 0&&!i&&!s)return;return{...n?{distinctId:n}:{},...o!==void 0?{accountId:o}:{},...i?{email:i}:{},...s?{organizationId:s}:{}}}async function TJ(e,t){let n=await e.sessionHost.deleteSession(t);e.sessionState.delete(t);try{e.sessionSearch.removeSession(t)}catch(r){ke("warn","session search eviction failed",{error:r,sessionId:t})}return n}function SJ(e,t,n){let r=dI(n);return e.filter((o)=>(t!=="yolo"||o.name!==Mu)&&lI(o.name,r))}function Rk(e){return typeof e==="string"&&e.trim().length>0?e.trim():void 0}function Cje(e){if(e===null)return null;let t=Ije.safeParse(e);return t.success?t.data:void 0}function Pje(e){let t=Ho(e)??{},n={},r=Rk(t.providerId);if(r)n.providerId=r;let o=Rk(t.modelId);if(o)n.modelId=o;let i=Rk(t.apiKey);if(i!==void 0)n.apiKey=i;let s=Rk(t.baseUrl);if(s!==void 0)n.baseUrl=s;if(t.headers&&typeof t.headers==="object")n.headers=t.headers;if(t.providerConfig&&typeof t.providerConfig==="object")n.providerConfig=t.providerConfig;if(Object.hasOwn(t,"thinking")){if(typeof t.thinking==="boolean"||t.thinking===null)n.thinking=t.thinking}if(Object.hasOwn(t,"reasoningEffort")){let a=Cje(t.reasoningEffort);if(a!==void 0)n.reasoningEffort=a}if(Object.hasOwn(t,"thinkingBudgetTokens")){if(typeof t.thinkingBudgetTokens==="number"&&Number.isFinite(t.thinkingBudgetTokens)&&t.thinkingBudgetTokens>0)n.thinkingBudgetTokens=Math.trunc(t.thinkingBudgetTokens);else if(t.thinkingBudgetTokens===null)n.thinkingBudgetTokens=null}return Ic(n)}function Mje(e,t){return e.sessionState.get(t)?.createdByClientId}function yJ(e){return typeof e==="string"||e===null?e:void 0}function Oje(e){if(!e||!("autoApproveTools"in e)&&!(gJ in e))return e;let t={...e};return delete t[gJ],delete t.autoApproveTools,t}function xJ(e,t){let n=Ho(e),r=Ho(n?.["*"]);if(typeof r?.autoApprove==="boolean")return r.autoApprove;return t.autoApproveTools===!0}function _J(e){let t=Mje(e.ctx,e.sessionId);if(!t)return pe(e.envelope,"session_wrong_client",`Session ${e.sessionId} has no owner`);if(t!==e.clientId)return pe(e.envelope,"session_wrong_client",`Session ${e.sessionId} is owned by ${t}`);return}async function hM(e,t,n){let r=performance.now(),o={command:t.command,requestId:t.requestId,clientId:t.clientId,sessionId:t.sessionId};ke("info","session.create.begin",o);let i=t.payload&&typeof t.payload==="object"?t.payload:{},s=i.metadata&&typeof i.metadata==="object"?JSON.parse(JSON.stringify(i.metadata)):{},a=i.sessionConfig&&typeof i.sessionConfig==="object"?JSON.parse(JSON.stringify(i.sessionConfig)):void 0,d=i.runtimeOptions&&typeof i.runtimeOptions==="object"?i.runtimeOptions:{},l=vJ(d.clientContext),c=kJ(d.userContext),u=el(i.initialCompactionState);if(typeof a?.mode==="string")s.mode=a.mode;else if(typeof d.mode==="string")s.mode=d.mode;if(typeof a?.systemPrompt==="string")s.systemPrompt=a.systemPrompt;else if(typeof d.systemPrompt==="string")s.systemPrompt=d.systemPrompt;if((a?.checkpoint?.enabled??d.checkpointEnabled)!==!1)s.checkpointEnabled=!0;s.autoApproveTools=xJ(i.toolPolicies,d);let h=i.modelSelection&&typeof i.modelSelection==="object"?i.modelSelection:{},p=typeof i.workspaceRoot==="string"&&i.workspaceRoot.trim()?i.workspaceRoot.trim():typeof i.cwd==="string"&&i.cwd.trim()?i.cwd.trim():void 0,m=t.clientId?.trim()||"hub-client",f=cM(d.clientContributions);ke("info","session.create.contributions_parsed",{...o,clientId:m,workspaceRoot:p,cwd:typeof i.cwd==="string"?i.cwd:void 0,contributionCount:f.length});let y=(typeof a?.sessionId==="string"?a.sessionId.trim():"")||wJ(),w=bJ(d.configExtensions);ke("info","session.create.runtime_build.begin",{...o,sessionId:y,configExtensionCount:w?.length??0});let k=uM({sessionId:y,targetClientId:m,contributions:f,sessionConfig:a,requestCapability:e.requestCapability});ke("info","session.create.start_session.begin",{...o,sessionId:y,provider:a?.providerId??(typeof h.provider==="string"?h.provider:typeof s.provider==="string"?s.provider:"hub"),model:a?.modelId??(typeof h.model==="string"?h.model:typeof s.model==="string"?s.model:"hub")});let b=a?.mode??(d.mode==="plan"||d.mode==="yolo"?d.mode:"act"),v=await e.sessionHost.startSession({source:typeof s.source==="string"?s.source:void 0,interactive:s.interactive!==!1,sessionMetadata:Object.keys(s).length>0?s:void 0,initialMessages:Array.isArray(i.initialMessages)?i.initialMessages:void 0,initialCompactionState:u,localRuntime:{modelCatalogDefaults:{loadLatestOnInit:!0,loadPrivateOnAuth:!0},configExtensions:w,...k.localRuntime,...l||c?{extensionContext:{...k.localRuntime.extensionContext,...l?{client:l}:{},...c?{user:c}:{}}}:{},extensions:[...e.sessionExtensions??[],...k.localRuntime.extensions??[]],extraTools:SJ([...e.sessionTools??[],...k.localRuntime.extraTools??[]],b,typeof s.source==="string"?s.source:void 0)},capabilities:{toolExecutors:k.toolExecutors,requestToolApproval:n},config:{...a??{},sessionId:y,providerId:a?.providerId??(typeof h.provider==="string"?h.provider:typeof s.provider==="string"?s.provider:"hub"),modelId:a?.modelId??(typeof h.model==="string"?h.model:typeof s.model==="string"?s.model:"hub"),apiKey:a?.apiKey??(typeof h.apiKey==="string"?h.apiKey:void 0),cwd:a?.cwd??(typeof i.cwd==="string"&&i.cwd.trim()?i.cwd.trim():p),workspaceRoot:a?.workspaceRoot??p,systemPrompt:a?.systemPrompt??(typeof d.systemPrompt==="string"?d.systemPrompt:""),mode:b,maxIterations:a?.maxIterations??(typeof d.maxIterations==="number"?d.maxIterations:void 0),enableTools:a?.enableTools??d.enableTools!==!1,enableSpawnAgent:a?.enableSpawnAgent??d.enableSpawn!==!1,enableAgentTeams:a?.enableAgentTeams??d.enableTeams===!0,checkpoint:a?.checkpoint??{enabled:d.checkpointEnabled!==!1},teamName:a?.teamName??(typeof s.teamName==="string"?s.teamName:void 0)},toolPolicies:i.toolPolicies&&typeof i.toolPolicies==="object"&&!Array.isArray(i.toolPolicies)?JSON.parse(JSON.stringify(i.toolPolicies)):d.autoApproveTools===!0?{"*":{autoApprove:!0}}:void 0});ke("info","session.create.start_session.end",{...o,sessionId:v.sessionId,elapsedMs:Math.round(performance.now()-r),hasImmediateResult:!!v.result}),eM(e,v.sessionId,m,"creator",{interactive:s.interactive!==!1}),ke("info","session.create.read_records.begin",{...o,sessionId:v.sessionId});let[E,S]=await Promise.all([Sn(e,v.sessionId),$n(e,v.sessionId)]);if(ke("info","session.create.read_records.end",{...o,sessionId:v.sessionId,hasSession:!!E,hasSnapshot:!!S,elapsedMs:Math.round(performance.now()-r)}),E)e.publish(e.buildEvent("session.created",{session:E,...S?{snapshot:S}:{}},v.sessionId));return ke("info","session.create.reply",{...o,sessionId:v.sessionId,elapsedMs:Math.round(performance.now()-r)}),ie(t,{session:E,...S?{snapshot:S}:{}})}async function EJ(e,t,n){let r=t.payload&&typeof t.payload==="object"?t.payload:{},o=typeof r.sessionId==="string"?r.sessionId.trim():t.sessionId?.trim()||"",i=r.checkpointRunCount;if(!o)return pe(t,"invalid_restore","session.restore requires a session id");let s=r.restore&&typeof r.restore==="object"?r.restore:{},a=s.messages!==!1;if(typeof i!=="number")return pe(t,"invalid_restore","checkpointRunCount must be a positive integer");try{let d=r.sessionConfig&&typeof r.sessionConfig==="object"?JSON.parse(JSON.stringify(r.sessionConfig)):void 0;if(a&&!d)return pe(t,"invalid_restore","sessionConfig is required when restore.messages is true");let l=r.runtimeOptions&&typeof r.runtimeOptions==="object"?r.runtimeOptions:{},c=vJ(l.clientContext),u=kJ(l.userContext),h=el(r.initialCompactionState),p=r.metadata&&typeof r.metadata==="object"?JSON.parse(JSON.stringify(r.metadata)):{};if(typeof d?.mode==="string")p.mode=d.mode;else if(typeof l.mode==="string")p.mode=l.mode;if(typeof d?.systemPrompt==="string")p.systemPrompt=d.systemPrompt;else if(typeof l.systemPrompt==="string")p.systemPrompt=l.systemPrompt;if((d?.checkpoint?.enabled??l.checkpointEnabled)!==!1)p.checkpointEnabled=!0;p.autoApproveTools=xJ(r.toolPolicies,l);let m=r.modelSelection&&typeof r.modelSelection==="object"?r.modelSelection:{},f=t.clientId?.trim()||"hub-client",g=cM(l.clientContributions),w=(typeof d?.sessionId==="string"?d.sessionId.trim():"")||wJ(),k=bJ(l.configExtensions),b=uM({sessionId:w,targetClientId:f,contributions:g,sessionConfig:d,requestCapability:e.requestCapability}),E=await new wm().restoreCheckpoint({sessionId:o,checkpointRunCount:i,telemetry:e.telemetry,restore:{messages:s.messages,workspace:s.workspace,omitCheckpointMessageFromSession:s.omitCheckpointMessageFromSession===!0},start:d,cwd:typeof d?.cwd==="string"&&d.cwd.trim()||typeof d?.workspaceRoot==="string"&&d.workspaceRoot.trim()||void 0,getSession:(A)=>e.sessionHost.getSession(A),readMessages:(A)=>e.sessionHost.readSessionMessages(A),buildStartInput:(A)=>{if(A.restoredCheckpointMetadata)p.checkpoint=A.restoredCheckpointMetadata;let R=typeof r.workspaceRoot==="string"&&r.workspaceRoot.trim()?r.workspaceRoot.trim():typeof r.cwd==="string"&&r.cwd.trim()?r.cwd.trim():A.sourceSession.workspaceRoot||A.sourceSession.cwd,C=d?.mode??(l.mode==="plan"||l.mode==="yolo"?l.mode:"act");return{source:typeof p.source==="string"?p.source:void 0,interactive:p.interactive!==!1,sessionMetadata:{...p,restoredFromSessionId:o,restoredCheckpointRunCount:i},initialMessages:A.initialMessages,initialCompactionState:h,localRuntime:{modelCatalogDefaults:{loadLatestOnInit:!0,loadPrivateOnAuth:!0},configExtensions:k,...b.localRuntime,...c||u?{extensionContext:{...b.localRuntime.extensionContext,...c?{client:c}:{},...u?{user:u}:{}}}:{},extensions:[...e.sessionExtensions??[],...b.localRuntime.extensions??[]],extraTools:SJ([...e.sessionTools??[],...b.localRuntime.extraTools??[]],C,typeof p.source==="string"?p.source:void 0)},capabilities:{toolExecutors:b.toolExecutors,requestToolApproval:n},config:{...d??{},sessionId:w,providerId:d?.providerId??(typeof m.provider==="string"?m.provider:A.sourceSession.provider),modelId:d?.modelId??(typeof m.model==="string"?m.model:A.sourceSession.model),apiKey:d?.apiKey??(typeof m.apiKey==="string"?m.apiKey:""),cwd:d?.cwd??A.plan.cwd,workspaceRoot:d?.workspaceRoot??R,systemPrompt:d?.systemPrompt??(typeof l.systemPrompt==="string"?l.systemPrompt:""),mode:C,maxIterations:d?.maxIterations??(typeof l.maxIterations==="number"?l.maxIterations:void 0),enableTools:d?.enableTools??l.enableTools!==!1,enableSpawnAgent:d?.enableSpawnAgent??l.enableSpawn!==!1,enableAgentTeams:d?.enableAgentTeams??l.enableTeams===!0,checkpoint:d?.checkpoint??{enabled:l.checkpointEnabled!==!1},teamName:d?.teamName??(typeof p.teamName==="string"?p.teamName:void 0)},toolPolicies:r.toolPolicies&&typeof r.toolPolicies==="object"&&!Array.isArray(r.toolPolicies)?JSON.parse(JSON.stringify(r.toolPolicies)):l.autoApproveTools===!0?{"*":{autoApprove:!0}}:void 0}},startSession:(A)=>e.sessionHost.startSession(A),getStartedSessionId:(A)=>A.sessionId,cleanupStartedSession:async(A)=>{if(!await TJ(e,A.sessionId))throw Error(`Failed to clean up restored session ${A.sessionId}`)},readRestoredSession:(A)=>e.sessionHost.getSession(A)});if(!a)return ie(t,{checkpoint:E.checkpoint});let S=E.startResult;if(!S)return pe(t,"restore_failed","Checkpoint restore did not start a session");eM(e,S.sessionId,f,"creator",{interactive:p.interactive!==!1});let[x,T]=await Promise.all([Sn(e,S.sessionId),$n(e,S.sessionId)]);if(x)e.publish(e.buildEvent("session.created",{session:x,...T?{snapshot:T}:{}},S.sessionId));return ie(t,{session:x,...T?{snapshot:T}:{},messages:E.messages??[],checkpoint:E.checkpoint})}catch(d){if(d instanceof Wr)return pe(t,d.code,d.code==="session_not_found"?`Unknown session: ${o}`:d.message);return pe(t,"restore_failed",d instanceof Error?d.message:String(d))}}async function AJ(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_attach","session.attach requires a session id");let r=await Sn(e,n);if(!r)return pe(t,"session_not_found",`Unknown session: ${n}`);BX(e,n,t.clientId?.trim()||"hub-client","participant");let o=await Sn(e,n);return e.publish(e.buildEvent("session.attached",{session:o??r},n)),ie(t,{session:o??r})}async function RJ(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_detach","session.detach requires a session id");let r=t.clientId?.trim()||"hub-client",o=e.sessionState.get(n);if(o){if(o.participants.delete(r),o.createdByClientId===r)o.createdByClientId=void 0;if(o.participants.size===0)e.sessionState.delete(n)}_s(e,(a)=>a.sessionId===n&&a.targetClientId===r,`Capability owner client ${r} detached before request was resolved.`);let[i,s]=await Promise.all([Sn(e,n),$n(e,n)]);return e.publish(e.buildEvent("session.detached",i?{session:i,...s?{snapshot:s}:{},clientId:r}:{clientId:r},n)),ie(t)}async function IJ(e,t){let n=Rt(t),r=t.payload?.includeSnapshot===!0,[o,i]=await Promise.all([Sn(e,n),r?$n(e,n):Promise.resolve(void 0)]);return o?ie(t,{session:o,...i?{snapshot:i}:{}}):pe(t,"session_not_found",`Unknown session: ${n}`)}async function CJ(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_id","session.messages requires a session id");if(!await Sn(e,n))return pe(t,"session_not_found",`Unknown session: ${n}`);let o=await e.sessionHost.readSessionMessages(n);return ie(t,{sessionId:n,messages:o})}async function PJ(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_id","session.compaction.get requires a session id");if(!await Sn(e,n))return pe(t,"session_not_found",`Unknown session: ${n}`);let o=t.clientId?.trim()||"hub-client",i=_J({sessionId:n,ctx:e,clientId:o,envelope:t});if(i)return i;let s=await e.sessionHost.readSessionCompactionState(n);return ie(t,{sessionId:n,state:s})}async function MJ(e,t){let n=typeof t.payload?.limit==="number"?t.payload.limit:200,o=(await e.sessionHost.listSessions(n,{rootOnly:t.payload?.rootOnly===!0})).map((i)=>xk(i,e.sessionState.get(i.sessionId)));return ie(t,{sessions:o})}async function OJ(e,t){let n=t.payload??{};if(typeof n.query!=="string"||!n.query.trim())return pe(t,"invalid_search_query","session.search requires a non-empty query");return ie(t,{hits:e.sessionSearch.search({query:n.query,limit:n.limit,workspaceRoot:n.workspaceRoot})})}async function LJ(e,t){let n=Rt(t),r=Oje(Ho(t.payload?.metadata)),o=yJ(t.payload?.prompt),i=yJ(t.payload?.title),s=await e.sessionHost.updateSession(n,{metadata:r,...o!==void 0?{prompt:o}:{},...i!==void 0?{title:i}:{}}),[a,d]=await Promise.all([Sn(e,n),$n(e,n)]);if(a)e.publish(e.buildEvent("session.updated",{session:a,...d?{snapshot:d}:{}},n));return{version:t.version,requestId:t.requestId,ok:s.updated,payload:{updated:s.updated,session:a,...d?{snapshot:d}:{}}}}async function NJ(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_update_connection","session.update_connection requires a session id");let r=e.sessionHost.updateSessionConnection;if(!r)return pe(t,"unsupported_session_update_connection","runtime host does not support session connection updates");let o=Ho(t.payload),i=Pje(o?.updates);return await r.call(e.sessionHost,n,i),ie(t,{sessionId:n,updated:!0})}async function DJ(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_id","session.compaction.update requires a session id");let r=t.clientId?.trim()||"hub-client",o=await Sn(e,n);if(!o)return pe(t,"session_not_found",`Unknown session: ${n}`);let i=_J({sessionId:n,ctx:e,clientId:r,envelope:t});if(i)return i;let s=t.payload&&typeof t.payload==="object"?t.payload:{},a=el(s.state);if(!a)return pe(t,"invalid_compaction_state","session.compaction.update requires a valid compaction state");let d=await e.sessionHost.updateSessionCompactionState(n,a),[l,c]=d.updated?await Promise.all([Sn(e,n),$n(e,n)]):[o,void 0];if(d.updated)e.publish(e.buildEvent("session.updated",{session:l??o,...c?{snapshot:c}:{}},n));return{version:t.version,requestId:t.requestId,ok:!0,payload:{updated:d.updated,session:l??o,...c?{snapshot:c}:{}}}}async function $J(e,t){let n=Rt(t),r=await TJ(e,n);return ie(t,{deleted:r})}async function FJ(e,t){let n=Rt(t),r=e.sessionHost.pendingPrompts;if(!r)return pe(t,"pending_prompts_unavailable","Pending prompt service is not available.");let o=await r.list({sessionId:n});return ie(t,{sessionId:n,prompts:o})}async function UJ(e,t){let n=Rt(t),r=e.sessionHost.pendingPrompts;if(!r)return pe(t,"pending_prompts_unavailable","Pending prompt service is not available.");let o=await r.steerFirst({sessionId:n});return ie(t,o)}async function BJ(e,t){let n=Rt(t),r=typeof t.payload?.promptId==="string"?t.payload.promptId.trim():"",o=typeof t.payload?.prompt==="string"?t.payload.prompt:void 0,i=t.payload?.delivery==="queue"||t.payload?.delivery==="steer"?t.payload.delivery:void 0,s=e.sessionHost.pendingPrompts;if(!s)return pe(t,"pending_prompts_unavailable","Pending prompt service is not available.");let a=await s.update({sessionId:n,promptId:r,prompt:o,delivery:i});return ie(t,a)}async function HJ(e,t){let n=Rt(t),r=typeof t.payload?.promptId==="string"?t.payload.promptId.trim():"",o=e.sessionHost.pendingPrompts;if(!o)return pe(t,"pending_prompts_unavailable","Pending prompt service is not available.");let i=await o.delete({sessionId:n,promptId:r});return ie(t,i)}import{join as Lje}from"node:path";import{loadSqliteDb as Nje}from"@cerebriline/shared/db";import{resolveDbDataDir as Dje}from"@cerebriline/shared/storage";var $je=604800000,Fje=200000,Uje=67108864,Bje=16777216;function Hje(e){let t=e?.replace(/[^a-zA-Z0-9_-]/g,"-");return Lje(Dje(),t?`hub-events-${t}.db`:"hub-events.db")}class pM{db;retentionMs;maxRows;maxTotalBytes;appendedBytesSincePrune=0;closed=!1;constructor(e={}){this.db=Nje(e.dbPath??Hje(e.ownerId)),this.retentionMs=e.retentionMs??$je,this.maxRows=e.maxRows??Fje,this.maxTotalBytes=e.maxTotalBytes??Uje,this.db.exec("PRAGMA journal_mode = WAL;"),this.db.exec("PRAGMA synchronous = NORMAL;"),this.db.exec("PRAGMA busy_timeout = 5000;"),this.db.exec(`
2084
2084
  CREATE TABLE IF NOT EXISTS hub_events (
@@ -2116,7 +2116,7 @@ Title: ${t.title}
2116
2116
  Type: ${t.type}
2117
2117
  Priority: P${t.priority}${o}
2118
2118
 
2119
- ${t.instructions}${r}`,s=await rf(this.ctx,{version:"v1",command:"run.start",requestId:gM("task_run_"),clientId:n.requestedByClientId??"agenda-task-manager",sessionId:e,payload:{sessionId:e,input:i,mode:t.mode??"act",timeoutSeconds:t.timeoutSeconds}});if(!s.ok)return{status:"failed",error:s.error?.message??"task session run failed"};let a=s.payload?.result,d=typeof a?.finishReason==="string"?a.finishReason:void 0,l=typeof a?.text==="string"&&a.text.trim()?a.text.trim():void 0;if(d==="completed")return{status:"completed",summary:l};if(d==="aborted")return{status:"cancelled",summary:l};return{status:"failed",summary:l,error:l??(d?`Task session ended with ${d}`:"Task session did not return a completion result")}}getCronService(){return this.cronService}getHubId(){return this.hubId}async start(){if(this.sessionSearch.start(),await this.tasks.start(),await this.schedules.start(),this.cronService)try{await this.cronService.start()}catch(e){console.error("[hub] cron service start failed",e)}this.startEventLog(),this.startRunQueue()}startEventLog(){if(this.options.eventLog===!1||this.eventLog)return;try{let e=new pM({ownerId:this.options.owner?.ownerId,...this.options.eventLog??{}});e.prune(),this.eventLog=e,this.eventLogPruneTimer=setInterval(()=>{try{e.prune()}catch{}},3600000),this.eventLogPruneTimer.unref?.()}catch(e){ke("error","event_log.start_failed",{error:e})}}startRunQueue(){if(this.options.runQueue===!1||this.runQueue)return;try{this.runQueue=new aM({ownerId:this.options.owner?.ownerId,...this.options.runQueue??{}}),this.runExecutor=new dM(this.ctx,this.runQueue);let e=this.runQueue.recoverOnStartup();for(let n of e.interrupted)this.publish(Xr("run.interrupted",{runId:n.runId,error:n.error,reason:"hub_restart"},n.sessionId));let t=new Set(e.requeued.map((n)=>n.sessionId));for(let n of t)this.runExecutor.pump(n);if(e.interrupted.length>0||e.requeued.length>0)ke("info","run.queue.recovered",{interrupted:e.interrupted.length,requeued:e.requeued.length})}catch(e){ke("error","run.queue.start_failed",{error:e})}}async stop(){if(this.eventLogPruneTimer)clearInterval(this.eventLogPruneTimer),this.eventLogPruneTimer=void 0;for(let e of this.pendingApprovals.keys())tM(this.ctx,e,{approved:!1,reason:"Hub shutting down before approval was resolved."});if(_s(this.ctx,()=>!0,"Hub shutting down before capability request was resolved."),await this.sessionSearch.dispose(),await this.tasks.dispose(),await this.sessionHost.dispose("hub_server_stop"),await this.schedules.dispose(),this.cronService)try{await this.cronService.dispose()}catch(e){console.error("[hub] cron service stop failed",e)}this.eventLog?.close(),this.eventLog=void 0,this.runQueue?.close(),this.runQueue=void 0,this.runExecutor=void 0}async handleCommand(e,t){try{let n=e.clientId?.trim(),r=t===void 0?this.options.workspaceRoot?.trim()&&n?{clientId:n,workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.workspaceRoot}}:void 0:t??void 0,o=await this.dispatchCommand(e,r);return this.captureFailedReply(e,o),o}catch(n){throw Ck(this.options.telemetry,{component:"core",operation:"hub.command",error:n,severity:"error",handled:!1,context:this.commandTelemetryContext(e)}),n}}async dispatchCommand(e,t){if(this.draining&&dJ(e.command))return lJ(e);if(qJ(e.command))return await this.taskCommands.handleCommand(e,t);switch(e.command){case"client.register":{let n=VX(this.ctx,e);return this.tasks.notifyAutomationReadinessChanged(),n}case"client.update":{let n=YX(this.ctx,e);return this.tasks.notifyAutomationReadinessChanged(),n}case"client.unregister":{let n=XX(this.ctx,e,(r)=>{this.listeners.delete(r),this.detachClientFromSessions(r)});return this.tasks.notifyAutomationReadinessChanged(),n}case"client.list":return JX(this.ctx,e);case"session.create":return await hM(this.ctx,e,(n)=>_k(this.ctx,n));case"session.restore":return await EJ(this.ctx,e,(n)=>_k(this.ctx,n));case"session.attach":return await AJ(this.ctx,e);case"session.detach":return await RJ(this.ctx,e);case"session.get":return await IJ(this.ctx,e);case"session.messages":return await CJ(this.ctx,e);case"session.compaction.get":return await PJ(this.ctx,e);case"session.list":return await MJ(this.ctx,e);case"session.search":return await OJ(this.ctx,e);case"session.update":return await LJ(this.ctx,e);case"session.update_connection":return await NJ(this.ctx,e);case"session.compaction.update":return await DJ(this.ctx,e);case"session.pending_prompts":return await FJ(this.ctx,e);case"session.steer_first_pending_prompt":return await UJ(this.ctx,e);case"session.update_pending_prompt":return await BJ(this.ctx,e);case"session.remove_pending_prompt":return await HJ(this.ctx,e);case"session.delete":return await $J(this.ctx,e);case"session.hook":return await aJ(this.ctx,e);case"run.start":case"session.send_input":return await rf(this.ctx,e);case"run.enqueue":{if(!this.runQueue||!this.runExecutor)return{version:e.version,requestId:e.requestId,ok:!1,error:{code:"run_queue_unavailable",message:"This hub has no durable run queue; use run.start instead."}};return cJ(this.ctx,e,this.runQueue,this.runExecutor)}case"run.list":{if(!this.runQueue)return ie(e,{runs:[]});return uJ(e,this.runQueue)}case"hub.drain":return this.handleHubDrain(e);case"hub.status":return this.handleHubStatus(e);case"run.abort":return await iJ(this.ctx,e);case"run.proceed_while_running":return await sJ(this.ctx,e);case"capability.request":return await KX(this.ctx,e);case"approval.respond":return await WX(this.ctx,e);case"capability.respond":return GX(this.ctx,e);case"capability.progress":return zX(this.ctx,e);case"ui.notify":return this.publish(Xr("ui.notify",e.payload??{})),ie(e);case"ui.show_window":return this.publish(Xr("ui.show_window",e.payload??{})),ie(e);case"settings.list":return await this.handleSettingsList(e);case"settings.toggle":return await this.handleSettingsToggle(e);case"connector.channels":case"connector.configure":case"connector.delete_config":case"connector.start":case"connector.stop":case"connector.supervised":return await rJ(this.ctx,e);case"settings.get":case"settings.patch":return{version:e.version,requestId:e.requestId,ok:!1,error:{code:"not_implemented",message:`${e.command} is not implemented yet.`}};default:{let n=await this.scheduleCommands.handleCommand(e,t);if(n.ok){let r=WJ(e.command);if(r)this.publish(Xr(r,n.payload))}return n}}}captureFailedReply(e,t){if(t.ok||!t.error||!Jje(t.error.code))return;Ck(this.options.telemetry,{component:"core",operation:"hub.command_reply",error:Error(t.error.message),severity:t.error.code==="session_not_found"?"warn":"error",handled:!0,context:{...this.commandTelemetryContext(e),errorCode:t.error.code}})}commandTelemetryContext(e){return{command:e.command,requestId:e.requestId,clientId:e.clientId,sessionId:typeof e.payload?.sessionId==="string"?e.payload.sessionId:e.sessionId}}async handleSettingsList(e){try{let t=await this.settings.list(KJ(e.payload));return{version:e.version,requestId:e.requestId,ok:!0,payload:{snapshot:t}}}catch(t){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:"settings_list_failed",message:t instanceof Error?t.message:String(t)}}}}async handleSettingsToggle(e){try{let t=await this.settings.toggle(Xje(e.payload));return this.publish(Xr("settings.changed",{types:t.changedTypes,snapshot:t.snapshot})),{version:e.version,requestId:e.requestId,ok:!0,payload:{snapshot:t.snapshot,changedTypes:t.changedTypes}}}catch(t){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:"settings_toggle_failed",message:t instanceof Error?t.message:String(t)}}}}handleHubDrain(e){let t=e.payload?.draining!==!1,n=typeof e.payload?.reason==="string"?e.payload.reason:void 0;if(this.draining!==t)this.draining=t,this.publish(Xr("hub.drain_changed",{draining:this.draining,...n?{reason:n}:{}})),ke("info","hub.drain_changed",{draining:this.draining,reason:n});return ie(e,this.describeStatus())}handleHubStatus(e){return ie(e,this.describeStatus())}describeStatus(){let e=0;for(let t of this.activeRpcTurnCountBySession.values())e+=t;return{hubId:this.hubId,draining:this.draining,activeRpcTurns:e,pendingRuns:this.runQueue?.countPending()??0,eventLog:this.eventLog?{lastSequence:this.eventLog.lastSequence()}:void 0,idle:e===0&&(this.runQueue?.countPending()??0)===0}}isDraining(){return this.draining}replayEventsAfter(e,t){if(!this.eventLog)return[];return this.eventLog.listAfter(e,{sessionId:t.sessionId},t.limit)}lastEventSequence(){return this.eventLog?.lastSequence()??0}subscribe(e,t,n){let r=this.listeners.get(e)??new Set,o={sessionId:n?.sessionId,listener:t};r.add(o),this.listeners.set(e,r);let i=HX(this.ctx,n?.sessionId);if(i.length>0)queueMicrotask(()=>{if(!this.listeners.get(e)?.has(o))return;for(let a of i)try{o.listener(a)}catch(d){pd("listener threw while re-issuing pending approval",d)}});return()=>{let s=this.listeners.get(e);if(!s)return;if(s.delete(o),s.size===0)this.listeners.delete(e)}}detachClientFromSessions(e){for(let[t,n]of this.sessionState.entries()){if(n.participants.delete(e),n.createdByClientId===e)n.createdByClientId=void 0;if(n.participants.size===0)this.sessionState.delete(t)}_s(this.ctx,(t)=>t.targetClientId===e,`Capability owner client ${e} disconnected before request was resolved.`)}publish(e){if(this.eventLog)try{e=this.eventLog.append(e)}catch(t){pd(`event log append failed for ${e.event}`,t)}for(let t of this.listeners.values())for(let n of t){if(n.sessionId&&n.sessionId!==e.sessionId)continue;try{n.listener(e)}catch(r){pd(`listener threw while publishing ${e.event}`,r),Ck(this.options.telemetry,{component:"core",operation:"hub.publish",error:r,severity:"warn",handled:!0,context:{event:e.event,sessionId:e.sessionId}})}}}}function Jje(e){return e==="session_not_found"||e==="session_messages_not_found"||e==="hub_command_timeout"||e.endsWith("_failed")}import{timingSafeEqual as p2e}from"node:crypto";import m2e from"node:http";import f2e from"node:net";import{URL as lf}from"node:url";import{CURRENT_HUB_PROTOCOL_VERSION as TM,HUB_CAPABILITIES as g2e,MAX_CLIENT_HUB_PROTOCOL_VERSION as JJ,MIN_CLIENT_HUB_PROTOCOL_VERSION as QJ}from"@cerebriline/shared";import{WebSocketServer as y2e}from"ws";import{chmodSync as Qje,existsSync as Zje,mkdirSync as e2e}from"node:fs";import{dirname as t2e}from"node:path";import{loadSqliteDb as n2e}from"@cerebriline/shared/db";var d_t=3;class GJ extends Error{lockFile;constructor(e){super(`Hub instance lock is held by a live Hub: ${e}. Connect to the running Hub or diagnose it; never replace it.`);this.name="HubLockHeldError",this.lockFile=e}}function VJ(e){return e instanceof Error&&e.name==="HubLockHeldError"}function YJ(e){return`${e}.instance.lock`}class gu{db;lockFile;constructor(e,t){this.lockFile=e,this.db=t}get held(){return this.db!==void 0}release(){let e=this.db;if(!e)return;this.db=void 0;try{e.exec("ROLLBACK;")}catch{}e.close?.()}static acquire(e){let t=!1,n;try{e2e(t2e(e),{recursive:!0}),t=Zje(e),n=n2e(e)}catch{return new gu(e,void 0)}try{n.exec("PRAGMA busy_timeout = 0;"),n.exec("BEGIN EXCLUSIVE;")}catch(r){if(n.close?.(),r2e(r))throw new GJ(e);return new gu(e,void 0)}if(!t)try{Qje(e,384)}catch{}return new gu(e,n)}}function r2e(e){let t=e instanceof Error?e.message:String(e),n=e?.code;return n==="SQLITE_BUSY"||n==="SQLITE_LOCKED"||t.includes("SQLITE_BUSY")||t.includes("SQLITE_LOCKED")||t.includes("database is locked")}import{isAbsolute as o2e,relative as i2e,resolve as wM,sep as s2e}from"node:path";import{captureSdkError as XJ,HUB_COMMAND_SLOW_LOG_MS as a2e,resolveHubCommandTimeoutMs as d2e,safeJsonParse as l2e}from"@cerebriline/shared";var c2e=200,u2e=1000;function bM(e){return{command:e.envelope.command,requestId:e.envelope.requestId,clientId:e.envelope.clientId,sessionId:e.envelope.sessionId}}function df(e,t,n){return{version:e.envelope.version,requestId:e.envelope.requestId,ok:!1,error:{code:t,message:n}}}function h2e(e,t,n=!1){let r=e.envelope.payload??{},o=e.envelope.clientId?.trim(),i=r.clientId?.trim()||o;if(!i||o&&i!==o)throw Error("Registration clientId must match the command connection");let s=r.workspaceContext?.workspaceRoot?.trim(),a=n?s||t?.trim():t?.trim();if(!a)return{clientId:i};let d=wM(a);if(!n&&s&&wM(s)!==d)throw Error("Registration workspace must match the Hub-authorized workspace");let l=wM(r.workspaceContext?.cwd?.trim()||d),c=i2e(d,l);if(c===".."||c.startsWith(`..${s2e}`)||o2e(c))throw Error("Registration cwd must be inside its workspace");return{clientId:i,workspaceContext:{workspaceRoot:d,cwd:l},...n?{crossWorkspace:!0}:{}}}class vM{transport;telemetry;workspaceRoot;constructor(e,t,n){this.transport=e;this.telemetry=t;this.workspaceRoot=n}attach(e,t={}){let n=new Map,r=new Set,o,i=!1,s=(c)=>{try{e.send(JSON.stringify(c))}catch(u){console.error(`[hub] failed to send websocket frame: ${u instanceof Error?u.stack||u.message:String(u)}`)}},a=(c)=>{s({kind:"event",envelope:c})},d=async(c)=>{try{let u=JSON.parse(c.data);switch(u.kind){case"command":{let h;if(o&&u.envelope.command==="client.register"){s({kind:"reply",envelope:df(u,"client_already_registered","This connection already owns a registered client.")});break}if(o&&u.envelope.clientId?.trim()!==o.clientId){s({kind:"reply",envelope:df(u,"client_authority_mismatch","Command clientId does not belong to this connection.")});break}if(u.envelope.command==="client.register")try{h=h2e(u,this.workspaceRoot,t.allowRegisteredWorkspace)}catch(S){s({kind:"reply",envelope:df(u,"invalid_client_registration",S instanceof Error?S.message:String(S))});break}let p=performance.now(),m=!1,f=bM(u);ke("info","command.start",f);let g=setTimeout(()=>{if(m)return;ke("warn","command.slow",{...f,elapsedMs:Math.round(performance.now()-p)})},a2e),y=this.transport.command(u.envelope,o??null);y.then((S)=>{if(!m)return;ke(S.ok?"warn":"error","command.late_end",{...f,elapsedMs:Math.round(performance.now()-p),ok:S.ok,errorCode:S.error?.code,errorMessage:S.error?.message})},(S)=>{if(!m)return;ke("error","command.late_error",{...f,elapsedMs:Math.round(performance.now()-p),error:S})});let w=!1,k,b,v=d2e(u.envelope.command,u.envelope.timeoutMs);try{b=v===null?await y:await Promise.race([y,new Promise((S)=>{k=setTimeout(()=>{w=!0,XJ(this.telemetry,{component:"core",operation:"hub.command_timeout",error:Error(`Hub command ${u.envelope.command} did not complete within ${v}ms.`),severity:"error",handled:!0,context:{...f,timeoutMs:v}}),S(df(u,"hub_command_timeout",`Hub command ${u.envelope.command} did not complete within ${v}ms. Check hub-daemon.log for command.start/command.slow logs with requestId ${u.envelope.requestId}.`))},v)})])}catch(S){if(clearTimeout(g),k)clearTimeout(k);throw S}if(m=w,clearTimeout(g),k)clearTimeout(k);let E=Math.round(performance.now()-p);if(w)ke("error","command.timeout",{...f,durationMs:E,timeoutMs:v});else ke(b.ok?"info":"warn","command.end",{...f,durationMs:E,ok:b.ok,errorCode:b.error?.code,errorMessage:b.error?.message});if(u.envelope.command==="client.register"&&b.ok){if(h)r.add(h.clientId),o=h}else if(u.envelope.command==="client.unregister"&&b.ok){let S=u.envelope.clientId?.trim();if(S)r.delete(S),o=void 0}s({kind:"reply",envelope:b});break}case"stream.subscribe":{let h=`${u.clientId}:${u.sessionId??"*"}`;if(n.has(h))break;let p=typeof u.sinceSequence==="number"&&Number.isFinite(u.sinceSequence)&&u.sinceSequence>=0?Math.floor(u.sinceSequence):void 0;if(p===void 0||typeof this.transport.replayEventsAfter!=="function"){let v=await this.transport.subscribe(u.clientId,a,{sessionId:u.sessionId});n.set(h,v);break}let m=!1,f=p,g=[],y=new Set,w=(v)=>{if(typeof v.sequence==="number"){if(v.sequence<=f)return;f=v.sequence}if(v.eventId&&y){if(y.has(v.eventId))return;y.add(v.eventId)}a(v)},k=(v)=>{if(!m){g.push(v);return}w(v)},b=await this.transport.subscribe(u.clientId,k,{sessionId:u.sessionId});n.set(h,b);try{let v=0;while(!i&&v<u2e){let E=f,S=this.transport.replayEventsAfter(f,{sessionId:u.sessionId,limit:c2e});if(S.length===0)break;for(let x of S)w(x);if(f<=E)break;v+=1,await new Promise((x)=>setTimeout(x,0))}}finally{m=!0;for(let v of g)w(v);g.length=0,y=void 0}break}case"stream.unsubscribe":{let h=`${u.clientId}:${u.sessionId??"*"}`;n.get(h)?.(),n.delete(h);break}case"reply":case"event":break}}catch(u){let h=typeof c.data==="string"?l2e(c.data):void 0;if(!h||h.kind!=="command"){ke("error","rejected malformed websocket frame",{error:u});return}ke("error","command.error",{...bM(h),error:u}),XJ(this.telemetry,{component:"core",operation:"hub.websocket_command",error:u,severity:"error",handled:!0,context:bM(h)}),s({kind:"reply",envelope:df(h,"command_failed",u instanceof Error?u.message:"Unknown hub error")})}},l=()=>{if(i)return;i=!0;for(let c of n.values())c();n.clear();for(let c of r)this.transport.command({version:"v1",command:"client.unregister",clientId:c});r.clear(),e.removeEventListener("message",d),e.removeEventListener("close",l)};return e.addEventListener("message",d),e.addEventListener("close",l),l}}class kM{transport;constructor(e){this.transport=e}command(e,t){return this.transport.handleCommand(e,t)}subscribe(e,t,n){return this.transport.subscribe(e,t,n)}replayEventsAfter(e,t){return this.transport.replayEventsAfter?.(e,t)??[]}}function s9(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();return String(e)}function w2e(e){return{send(t){e.send(t)},addEventListener(t,n){if(t==="message"){e.on("message",(r)=>{n({data:s9(r)})});return}e.on("close",n)},removeEventListener(){}}}function b2e(e){try{e.write(`HTTP/1.1 400 Bad Request\r
2119
+ ${t.instructions}${r}`,s=await rf(this.ctx,{version:"v1",command:"run.start",requestId:gM("task_run_"),clientId:n.requestedByClientId??"agenda-task-manager",sessionId:e,payload:{sessionId:e,input:i,mode:t.mode??"act",timeoutSeconds:t.timeoutSeconds}});if(!s.ok)return{status:"failed",error:s.error?.message??"task session run failed"};let a=s.payload?.result,d=typeof a?.finishReason==="string"?a.finishReason:void 0,l=typeof a?.text==="string"&&a.text.trim()?a.text.trim():void 0;if(d==="completed")return{status:"completed",summary:l};if(d==="aborted")return{status:"cancelled",summary:l};return{status:"failed",summary:l,error:l??(d?`Task session ended with ${d}`:"Task session did not return a completion result")}}getCronService(){return this.cronService}getHubId(){return this.hubId}async start(){if(this.sessionSearch.start(),await this.tasks.start(),await this.schedules.start(),this.cronService)try{await this.cronService.start()}catch(e){console.error("[hub] cron service start failed",e)}this.startEventLog(),this.startRunQueue()}startEventLog(){if(this.options.eventLog===!1||this.eventLog)return;try{let e=new pM({ownerId:this.options.owner?.ownerId,...this.options.eventLog??{}});e.prune(),this.eventLog=e,this.eventLogPruneTimer=setInterval(()=>{try{e.prune()}catch{}},3600000),this.eventLogPruneTimer.unref?.()}catch(e){ke("error","event_log.start_failed",{error:e})}}startRunQueue(){if(this.options.runQueue===!1||this.runQueue)return;try{this.runQueue=new aM({ownerId:this.options.owner?.ownerId,...this.options.runQueue??{}}),this.runExecutor=new dM(this.ctx,this.runQueue);let e=this.runQueue.recoverOnStartup();for(let n of e.interrupted)this.publish(Xr("run.interrupted",{runId:n.runId,error:n.error,reason:"hub_restart"},n.sessionId));let t=new Set(e.requeued.map((n)=>n.sessionId));for(let n of t)this.runExecutor.pump(n);if(e.interrupted.length>0||e.requeued.length>0)ke("info","run.queue.recovered",{interrupted:e.interrupted.length,requeued:e.requeued.length})}catch(e){ke("error","run.queue.start_failed",{error:e})}}async stop(){if(this.eventLogPruneTimer)clearInterval(this.eventLogPruneTimer),this.eventLogPruneTimer=void 0;for(let e of this.pendingApprovals.keys())tM(this.ctx,e,{approved:!1,reason:"Hub shutting down before approval was resolved."});if(_s(this.ctx,()=>!0,"Hub shutting down before capability request was resolved."),await this.sessionSearch.dispose(),await this.tasks.dispose(),await this.sessionHost.dispose("hub_server_stop"),await this.schedules.dispose(),this.cronService)try{await this.cronService.dispose()}catch(e){console.error("[hub] cron service stop failed",e)}this.eventLog?.close(),this.eventLog=void 0,this.runQueue?.close(),this.runQueue=void 0,this.runExecutor=void 0}async handleCommand(e,t){try{let n=e.clientId?.trim(),r=t===void 0?this.options.workspaceRoot?.trim()&&n?{clientId:n,workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.workspaceRoot}}:void 0:t??void 0,o=await this.dispatchCommand(e,r);return this.captureFailedReply(e,o),o}catch(n){throw Ck(this.options.telemetry,{component:"core",operation:"hub.command",error:n,severity:"error",handled:!1,context:this.commandTelemetryContext(e)}),n}}async dispatchCommand(e,t){if(this.draining&&dJ(e.command))return lJ(e);if(qJ(e.command))return await this.taskCommands.handleCommand(e,t);switch(e.command){case"client.register":{let n=VX(this.ctx,e);return this.tasks.notifyAutomationReadinessChanged(),n}case"client.update":{let n=YX(this.ctx,e);return this.tasks.notifyAutomationReadinessChanged(),n}case"client.unregister":{let n=XX(this.ctx,e,(r)=>{this.listeners.delete(r),this.detachClientFromSessions(r)});return this.tasks.notifyAutomationReadinessChanged(),n}case"client.list":return JX(this.ctx,e);case"session.create":return await hM(this.ctx,e,(n)=>_k(this.ctx,n));case"session.restore":return await EJ(this.ctx,e,(n)=>_k(this.ctx,n));case"session.attach":return await AJ(this.ctx,e);case"session.detach":return await RJ(this.ctx,e);case"session.get":return await IJ(this.ctx,e);case"session.messages":return await CJ(this.ctx,e);case"session.compaction.get":return await PJ(this.ctx,e);case"session.list":return await MJ(this.ctx,e);case"session.search":return await OJ(this.ctx,e);case"session.update":return await LJ(this.ctx,e);case"session.update_connection":return await NJ(this.ctx,e);case"session.compaction.update":return await DJ(this.ctx,e);case"session.pending_prompts":return await FJ(this.ctx,e);case"session.steer_first_pending_prompt":return await UJ(this.ctx,e);case"session.update_pending_prompt":return await BJ(this.ctx,e);case"session.remove_pending_prompt":return await HJ(this.ctx,e);case"session.delete":return await $J(this.ctx,e);case"session.hook":return await aJ(this.ctx,e);case"run.start":case"session.send_input":return await rf(this.ctx,e);case"run.enqueue":{if(!this.runQueue||!this.runExecutor)return{version:e.version,requestId:e.requestId,ok:!1,error:{code:"run_queue_unavailable",message:"This hub has no durable run queue; use run.start instead."}};return cJ(this.ctx,e,this.runQueue,this.runExecutor)}case"run.list":{if(!this.runQueue)return ie(e,{runs:[]});return uJ(e,this.runQueue)}case"hub.drain":return this.handleHubDrain(e);case"hub.status":return this.handleHubStatus(e);case"run.abort":return await iJ(this.ctx,e);case"run.proceed_while_running":return await sJ(this.ctx,e);case"capability.request":return await KX(this.ctx,e);case"approval.respond":return await WX(this.ctx,e);case"capability.respond":return GX(this.ctx,e);case"capability.progress":return zX(this.ctx,e);case"ui.notify":return this.publish(Xr("ui.notify",e.payload??{})),ie(e);case"ui.show_window":return this.publish(Xr("ui.show_window",e.payload??{})),ie(e);case"settings.list":return await this.handleSettingsList(e);case"settings.toggle":return await this.handleSettingsToggle(e);case"connector.channels":case"connector.configure":case"connector.delete_config":case"connector.start":case"connector.stop":case"connector.supervised":return await rJ(this.ctx,e);case"settings.get":case"settings.patch":return{version:e.version,requestId:e.requestId,ok:!1,error:{code:"not_implemented",message:`${e.command} is not implemented yet.`}};default:{let n=await this.scheduleCommands.handleCommand(e,t);if(n.ok){let r=WJ(e.command);if(r)this.publish(Xr(r,n.payload))}return n}}}captureFailedReply(e,t){if(t.ok||!t.error||!Jje(t.error.code))return;Ck(this.options.telemetry,{component:"core",operation:"hub.command_reply",error:Error(t.error.message),severity:t.error.code==="session_not_found"?"warn":"error",handled:!0,context:{...this.commandTelemetryContext(e),errorCode:t.error.code}})}commandTelemetryContext(e){return{command:e.command,requestId:e.requestId,clientId:e.clientId,sessionId:typeof e.payload?.sessionId==="string"?e.payload.sessionId:e.sessionId}}async handleSettingsList(e){try{let t=await this.settings.list(KJ(e.payload));return{version:e.version,requestId:e.requestId,ok:!0,payload:{snapshot:t}}}catch(t){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:"settings_list_failed",message:t instanceof Error?t.message:String(t)}}}}async handleSettingsToggle(e){try{let t=await this.settings.toggle(Xje(e.payload));return this.publish(Xr("settings.changed",{types:t.changedTypes,snapshot:t.snapshot})),{version:e.version,requestId:e.requestId,ok:!0,payload:{snapshot:t.snapshot,changedTypes:t.changedTypes}}}catch(t){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:"settings_toggle_failed",message:t instanceof Error?t.message:String(t)}}}}handleHubDrain(e){let t=e.payload?.draining!==!1,n=typeof e.payload?.reason==="string"?e.payload.reason:void 0;if(this.draining!==t)this.draining=t,this.publish(Xr("hub.drain_changed",{draining:this.draining,...n?{reason:n}:{}})),ke("info","hub.drain_changed",{draining:this.draining,reason:n});return ie(e,this.describeStatus())}handleHubStatus(e){return ie(e,this.describeStatus())}describeStatus(){let e=0;for(let t of this.activeRpcTurnCountBySession.values())e+=t;return{hubId:this.hubId,draining:this.draining,activeRpcTurns:e,pendingRuns:this.runQueue?.countPending()??0,eventLog:this.eventLog?{lastSequence:this.eventLog.lastSequence()}:void 0,idle:e===0&&(this.runQueue?.countPending()??0)===0}}isDraining(){return this.draining}replayEventsAfter(e,t){if(!this.eventLog)return[];return this.eventLog.listAfter(e,{sessionId:t.sessionId},t.limit)}lastEventSequence(){return this.eventLog?.lastSequence()??0}subscribe(e,t,n){let r=this.listeners.get(e)??new Set,o={sessionId:n?.sessionId,listener:t};r.add(o),this.listeners.set(e,r);let i=HX(this.ctx,n?.sessionId);if(i.length>0)queueMicrotask(()=>{if(!this.listeners.get(e)?.has(o))return;for(let a of i)try{o.listener(a)}catch(d){pd("listener threw while re-issuing pending approval",d)}});return()=>{let s=this.listeners.get(e);if(!s)return;if(s.delete(o),s.size===0)this.listeners.delete(e)}}detachClientFromSessions(e){for(let[t,n]of this.sessionState.entries()){if(n.participants.delete(e),n.createdByClientId===e)n.createdByClientId=void 0;if(n.participants.size===0)this.sessionState.delete(t)}_s(this.ctx,(t)=>t.targetClientId===e,`Capability owner client ${e} disconnected before request was resolved.`)}publish(e){if(this.eventLog)try{e=this.eventLog.append(e)}catch(t){pd(`event log append failed for ${e.event}`,t)}for(let t of this.listeners.values())for(let n of t){if(n.sessionId&&n.sessionId!==e.sessionId)continue;try{n.listener(e)}catch(r){pd(`listener threw while publishing ${e.event}`,r),Ck(this.options.telemetry,{component:"core",operation:"hub.publish",error:r,severity:"warn",handled:!0,context:{event:e.event,sessionId:e.sessionId}})}}}}function Jje(e){return e==="session_not_found"||e==="session_messages_not_found"||e==="hub_command_timeout"||e.endsWith("_failed")}import{timingSafeEqual as p2e}from"node:crypto";import m2e from"node:http";import f2e from"node:net";import{URL as lf}from"node:url";import{CURRENT_HUB_PROTOCOL_VERSION as TM,HUB_CAPABILITIES as g2e,MAX_CLIENT_HUB_PROTOCOL_VERSION as JJ,MIN_CLIENT_HUB_PROTOCOL_VERSION as QJ}from"@cerebriline/shared";import{WebSocketServer as y2e}from"ws";import{chmodSync as Qje,existsSync as Zje,mkdirSync as e2e}from"node:fs";import{dirname as t2e}from"node:path";import{loadSqliteDb as n2e}from"@cerebriline/shared/db";var c_t=3;class GJ extends Error{lockFile;constructor(e){super(`Hub instance lock is held by a live Hub: ${e}. Connect to the running Hub or diagnose it; never replace it.`);this.name="HubLockHeldError",this.lockFile=e}}function VJ(e){return e instanceof Error&&e.name==="HubLockHeldError"}function YJ(e){return`${e}.instance.lock`}class gu{db;lockFile;constructor(e,t){this.lockFile=e,this.db=t}get held(){return this.db!==void 0}release(){let e=this.db;if(!e)return;this.db=void 0;try{e.exec("ROLLBACK;")}catch{}e.close?.()}static acquire(e){let t=!1,n;try{e2e(t2e(e),{recursive:!0}),t=Zje(e),n=n2e(e)}catch{return new gu(e,void 0)}try{n.exec("PRAGMA busy_timeout = 0;"),n.exec("BEGIN EXCLUSIVE;")}catch(r){if(n.close?.(),r2e(r))throw new GJ(e);return new gu(e,void 0)}if(!t)try{Qje(e,384)}catch{}return new gu(e,n)}}function r2e(e){let t=e instanceof Error?e.message:String(e),n=e?.code;return n==="SQLITE_BUSY"||n==="SQLITE_LOCKED"||t.includes("SQLITE_BUSY")||t.includes("SQLITE_LOCKED")||t.includes("database is locked")}import{isAbsolute as o2e,relative as i2e,resolve as wM,sep as s2e}from"node:path";import{captureSdkError as XJ,HUB_COMMAND_SLOW_LOG_MS as a2e,resolveHubCommandTimeoutMs as d2e,safeJsonParse as l2e}from"@cerebriline/shared";var c2e=200,u2e=1000;function bM(e){return{command:e.envelope.command,requestId:e.envelope.requestId,clientId:e.envelope.clientId,sessionId:e.envelope.sessionId}}function df(e,t,n){return{version:e.envelope.version,requestId:e.envelope.requestId,ok:!1,error:{code:t,message:n}}}function h2e(e,t,n=!1){let r=e.envelope.payload??{},o=e.envelope.clientId?.trim(),i=r.clientId?.trim()||o;if(!i||o&&i!==o)throw Error("Registration clientId must match the command connection");let s=r.workspaceContext?.workspaceRoot?.trim(),a=n?s||t?.trim():t?.trim();if(!a)return{clientId:i};let d=wM(a);if(!n&&s&&wM(s)!==d)throw Error("Registration workspace must match the Hub-authorized workspace");let l=wM(r.workspaceContext?.cwd?.trim()||d),c=i2e(d,l);if(c===".."||c.startsWith(`..${s2e}`)||o2e(c))throw Error("Registration cwd must be inside its workspace");return{clientId:i,workspaceContext:{workspaceRoot:d,cwd:l},...n?{crossWorkspace:!0}:{}}}class vM{transport;telemetry;workspaceRoot;constructor(e,t,n){this.transport=e;this.telemetry=t;this.workspaceRoot=n}attach(e,t={}){let n=new Map,r=new Set,o,i=!1,s=(c)=>{try{e.send(JSON.stringify(c))}catch(u){console.error(`[hub] failed to send websocket frame: ${u instanceof Error?u.stack||u.message:String(u)}`)}},a=(c)=>{s({kind:"event",envelope:c})},d=async(c)=>{try{let u=JSON.parse(c.data);switch(u.kind){case"command":{let h;if(o&&u.envelope.command==="client.register"){s({kind:"reply",envelope:df(u,"client_already_registered","This connection already owns a registered client.")});break}if(o&&u.envelope.clientId?.trim()!==o.clientId){s({kind:"reply",envelope:df(u,"client_authority_mismatch","Command clientId does not belong to this connection.")});break}if(u.envelope.command==="client.register")try{h=h2e(u,this.workspaceRoot,t.allowRegisteredWorkspace)}catch(S){s({kind:"reply",envelope:df(u,"invalid_client_registration",S instanceof Error?S.message:String(S))});break}let p=performance.now(),m=!1,f=bM(u);ke("info","command.start",f);let g=setTimeout(()=>{if(m)return;ke("warn","command.slow",{...f,elapsedMs:Math.round(performance.now()-p)})},a2e),y=this.transport.command(u.envelope,o??null);y.then((S)=>{if(!m)return;ke(S.ok?"warn":"error","command.late_end",{...f,elapsedMs:Math.round(performance.now()-p),ok:S.ok,errorCode:S.error?.code,errorMessage:S.error?.message})},(S)=>{if(!m)return;ke("error","command.late_error",{...f,elapsedMs:Math.round(performance.now()-p),error:S})});let w=!1,k,b,v=d2e(u.envelope.command,u.envelope.timeoutMs);try{b=v===null?await y:await Promise.race([y,new Promise((S)=>{k=setTimeout(()=>{w=!0,XJ(this.telemetry,{component:"core",operation:"hub.command_timeout",error:Error(`Hub command ${u.envelope.command} did not complete within ${v}ms.`),severity:"error",handled:!0,context:{...f,timeoutMs:v}}),S(df(u,"hub_command_timeout",`Hub command ${u.envelope.command} did not complete within ${v}ms. Check hub-daemon.log for command.start/command.slow logs with requestId ${u.envelope.requestId}.`))},v)})])}catch(S){if(clearTimeout(g),k)clearTimeout(k);throw S}if(m=w,clearTimeout(g),k)clearTimeout(k);let E=Math.round(performance.now()-p);if(w)ke("error","command.timeout",{...f,durationMs:E,timeoutMs:v});else ke(b.ok?"info":"warn","command.end",{...f,durationMs:E,ok:b.ok,errorCode:b.error?.code,errorMessage:b.error?.message});if(u.envelope.command==="client.register"&&b.ok){if(h)r.add(h.clientId),o=h}else if(u.envelope.command==="client.unregister"&&b.ok){let S=u.envelope.clientId?.trim();if(S)r.delete(S),o=void 0}s({kind:"reply",envelope:b});break}case"stream.subscribe":{let h=`${u.clientId}:${u.sessionId??"*"}`;if(n.has(h))break;let p=typeof u.sinceSequence==="number"&&Number.isFinite(u.sinceSequence)&&u.sinceSequence>=0?Math.floor(u.sinceSequence):void 0;if(p===void 0||typeof this.transport.replayEventsAfter!=="function"){let v=await this.transport.subscribe(u.clientId,a,{sessionId:u.sessionId});n.set(h,v);break}let m=!1,f=p,g=[],y=new Set,w=(v)=>{if(typeof v.sequence==="number"){if(v.sequence<=f)return;f=v.sequence}if(v.eventId&&y){if(y.has(v.eventId))return;y.add(v.eventId)}a(v)},k=(v)=>{if(!m){g.push(v);return}w(v)},b=await this.transport.subscribe(u.clientId,k,{sessionId:u.sessionId});n.set(h,b);try{let v=0;while(!i&&v<u2e){let E=f,S=this.transport.replayEventsAfter(f,{sessionId:u.sessionId,limit:c2e});if(S.length===0)break;for(let x of S)w(x);if(f<=E)break;v+=1,await new Promise((x)=>setTimeout(x,0))}}finally{m=!0;for(let v of g)w(v);g.length=0,y=void 0}break}case"stream.unsubscribe":{let h=`${u.clientId}:${u.sessionId??"*"}`;n.get(h)?.(),n.delete(h);break}case"reply":case"event":break}}catch(u){let h=typeof c.data==="string"?l2e(c.data):void 0;if(!h||h.kind!=="command"){ke("error","rejected malformed websocket frame",{error:u});return}ke("error","command.error",{...bM(h),error:u}),XJ(this.telemetry,{component:"core",operation:"hub.websocket_command",error:u,severity:"error",handled:!0,context:bM(h)}),s({kind:"reply",envelope:df(h,"command_failed",u instanceof Error?u.message:"Unknown hub error")})}},l=()=>{if(i)return;i=!0;for(let c of n.values())c();n.clear();for(let c of r)this.transport.command({version:"v1",command:"client.unregister",clientId:c});r.clear(),e.removeEventListener("message",d),e.removeEventListener("close",l)};return e.addEventListener("message",d),e.addEventListener("close",l),l}}class kM{transport;constructor(e){this.transport=e}command(e,t){return this.transport.handleCommand(e,t)}subscribe(e,t,n){return this.transport.subscribe(e,t,n)}replayEventsAfter(e,t){return this.transport.replayEventsAfter?.(e,t)??[]}}function s9(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();return String(e)}function w2e(e){return{send(t){e.send(t)},addEventListener(t,n){if(t==="message"){e.on("message",(r)=>{n({data:s9(r)})});return}e.on("close",n)},removeEventListener(){}}}function b2e(e){try{e.write(`HTTP/1.1 400 Bad Request\r
2120
2120
  Connection: close\r
2121
2121
  Content-Length: 0\r
2122
2122
  \r
@@ -2129,4 +2129,4 @@ Connection: close\r
2129
2129
  Content-Length: 0\r
2130
2130
  \r
2131
2131
  `),e.end()}catch{e.destroy()}}function Ok(e,t){if(!e||!t)return!1;let n=Buffer.from(e,"utf8"),r=Buffer.from(t,"utf8");return n.length===r.length&&p2e(n,r)}function ZJ(e,t){let n=e&&typeof e==="object"&&"code"in e&&typeof e.code==="string"?e.code:void 0,r=e instanceof Error?e.message:typeof e==="string"?e:"Unknown startup error",o=`Failed to start hub server on ${t.host}:${t.port}${t.pathname}: ${r}`,i=Error(n?`${o} (${n})`:o);if(n)e.code=n,i.code=n;if(e instanceof Error&&e.stack)i.stack=`${i.name}: ${i.message}
2132
- Caused by: ${e.stack}`;return i}var T2e=new Set([1,7,9,11,13,15,17,19,20,21,22,23,25,37,42,43,53,69,77,79,87,95,101,102,103,104,109,110,111,113,115,117,119,123,135,137,139,143,161,179,389,427,465,512,513,514,515,526,530,531,532,540,548,554,556,563,587,601,636,989,990,993,995,1719,1720,1723,2049,3659,4045,4190,5060,5061,6000,6566,6665,6666,6667,6668,6669,6679,6697,10080]),S2e=8;async function P_t(e,t=x2e){for(let n=1;n<S2e;n+=1){let r=await t(e);if(!T2e.has(r))return r}return await t(e)}async function x2e(e){return await new Promise((t,n)=>{let r=f2e.createServer();r.once("error",n),r.listen(0,e,()=>{let o=r.address();if(!o||typeof o==="string"){r.close(()=>n(Error("Failed to resolve free port")));return}let i=o.port;r.close((s)=>{if(s){n(s);return}t(i)})})})}function _2e(e){return e instanceof Error&&"code"in e&&e.code==="EADDRINUSE"}function e9(e,t,n,r){try{let o=new lf(e),i=new lf(qo(t,n===0?1:n,r));return o.protocol===i.protocol&&o.hostname===i.hostname&&o.pathname===i.pathname&&(n===0||o.port===i.port)}catch{return!1}}function t9(e,t,n){return Error(`Hub owner ${e} is already running at ${t}; refusing a second endpoint at ${n}`)}var Ai=new Map,n9="cline-hub-auth.",E2e=30000,r9=2000,A2e=3000,R2e=100;async function o9(e,t){let n;try{return await Promise.race([e.then(()=>!0,()=>!0),new Promise((r)=>{n=setTimeout(()=>r(!1),t)})])}finally{if(n)clearTimeout(n)}}function xM(e){return Array.isArray(e)?e.join(","):e??""}function i9(e){return e===32||e===9}function SM(e){let t=xM(e).trim(),n="bearer";if(t.length<=6||t.slice(0,6).toLowerCase()!=="bearer"||!i9(t.charCodeAt(6)))return null;let r=7;while(r<t.length&&i9(t.charCodeAt(r)))r+=1;return t.slice(r).trim()||null}function I2e(e){for(let t of xM(e).split(",")){let n=t.trim();if(n.startsWith(n9))return n.slice(n9.length).trim()||null}return null}function a9(e){let t=e.trim().toLowerCase();return t==="localhost"||t==="127.0.0.1"||t==="::1"||t==="[::1]"}function C2e(e){let t=xM(e).trim();if(!t)return!1;try{return a9(new lf(t).hostname)}catch{return!1}}async function _M(e){let t=e.owner??Us(),n=e.host??"127.0.0.1",r=e.pathname??"/hub",i=e.port??Of(),s=i,a=qo(n,i,r),d=eo(),l=yT(),c=NL(),u=gu.acquire(YJ(t.discoveryPath));if(!u.held)ke("warn","instance_lock.unavailable",{lockFile:u.lockFile});let h;try{h=new Mk({...e,owner:t}),await h.start()}catch(R){throw u.release(),R}let p=h.getHubId(),m=new vM(new kM(h),e.telemetry,e.workspaceRoot),f=new Set,g=new Date().toISOString(),y={protocolVersion:TM,minClientProtocolVersion:QJ,maxClientProtocolVersion:JJ,capabilities:g2e,coreVersion:Oi.version,buildId:d,buildEpochMs:l,pid:process.pid,startedAt:g},w=new Set,k,b,v,E=!1,S=()=>{if(b)return b;if(v){let D=Ai.get(t.discoveryPath);if(D?.server===v)D.state="closing"}if(k)clearInterval(k),k=void 0;let R=new Promise((D,K)=>{A.close((V)=>{if(V){K(V);return}D()})}),C=new Promise((D,K)=>{T.close((V)=>{if(V){K(V);return}D()})}),L=Promise.resolve().then(()=>h.stop()),N=L.then(async()=>{await DL(t.discoveryPath,p)}),W=(async()=>{let K=(await Promise.allSettled([R,C,L,N])).flatMap((V)=>V.status==="rejected"?[V.reason]:[]);if(K.length>0)throw AggregateError(K,"hub server close failed")})().finally(()=>{if(Ai.get(t.discoveryPath)?.server===v)Ai.delete(t.discoveryPath);u.release()});b={transportStopped:L,closed:W};for(let D of w)D.terminate?.();w.clear();for(let D of f)D();return f.clear(),b},x=()=>S().closed,T=m2e.createServer((R,C)=>{if(!E){C.statusCode=503,C.end("Starting");return}if((R.url??"/")==="/health"){let N=JSON.stringify({ok:!0,protocolVersion:y.protocolVersion,minClientProtocolVersion:y.minClientProtocolVersion,maxClientProtocolVersion:y.maxClientProtocolVersion,coreVersion:y.coreVersion,buildId:y.buildId,buildEpochMs:y.buildEpochMs,draining:h.isDraining(),host:n,port:s,url:a});C.statusCode=200,C.setHeader("content-type","application/json"),C.end(N);return}if((R.url??"/")==="/status"){if(!Ok(SM(R.headers.authorization),c)){C.statusCode=401,C.end("Unauthorized");return}let N=JSON.stringify({hubId:p,...y,authToken:c,host:n,port:s,url:a,updatedAt:new Date().toISOString()});C.statusCode=200,C.setHeader("content-type","application/json"),C.end(N);return}if((R.url??"/")==="/version"){C.statusCode=200,C.setHeader("content-type","application/json"),C.end(JSON.stringify(y));return}let L=new lf(R.url??"/",`http://${n}:${s}`);if(L.pathname==="/drain"&&R.method==="POST"){if(!Ok(SM(R.headers.authorization),c)){C.statusCode=401,C.end("Unauthorized");return}let N=L.searchParams.get("off")===null;h.handleCommand({version:TM,command:"hub.drain",payload:{draining:N,reason:L.searchParams.get("reason")??"authenticated HTTP drain request"}}).then((W)=>{C.statusCode=W.ok?200:500,C.setHeader("content-type","application/json"),C.end(JSON.stringify(W.payload??{ok:W.ok}))},()=>{C.statusCode=500,C.end("Drain failed")});return}if(L.pathname==="/shutdown"&&R.method==="POST"){if(!Ok(SM(R.headers.authorization),c)){C.statusCode=401,C.end("Unauthorized");return}let N=!1,W=()=>{if(N)return;N=!0;try{Promise.resolve(e.onShutdownRequested?.()).catch(()=>{return})}catch{}finally{x().catch(()=>{return})}};C.statusCode=202,C.setHeader("content-type","application/json"),C.setHeader("connection","close");let D=setTimeout(W,1000);D.unref?.(),C.end(JSON.stringify({ok:!0}),()=>{setImmediate(()=>{clearTimeout(D),W()})});return}C.statusCode=404,C.end("Not found")}),A=new y2e({noServer:!0});k=setInterval(()=>{for(let R of w){if(R.isAlive===!1){R.heartbeatTerminated=!0;try{R.terminate?.()}catch{}w.delete(R);continue}R.isAlive=!1;try{R.ping?.()}catch{try{R.terminate?.()}catch{}w.delete(R)}}},E2e),T.on("upgrade",(R,C,L)=>{if(!E){k2e(C);return}if(new lf(R.url??"/",`http://${n}:${s}`).pathname!==r){C.destroy();return}let W=Ok(I2e(R.headers["sec-websocket-protocol"]),c);if(!(W||a9(n)&&C2e(R.headers.origin))){v2e(C);return}try{A.handleUpgrade(R,C,L,(K)=>{let V=K;V.isAlive=!0,V.on("pong",()=>{V.isAlive=!0}),w.add(V),V.once("close",(j,G)=>{ke("info","socket.closed",{code:j,reason:s9(G).slice(0,200)||void 0,heartbeatTerminated:V.heartbeatTerminated??!1,serverClosing:b!==void 0})});let B=m.attach(w2e(K),{allowRegisteredWorkspace:W});f.add(B),K.once("close",()=>{w.delete(V),B(),f.delete(B)})})}catch{b2e(C)}});try{await new Promise((R,C)=>{T.once("error",(L)=>{C(ZJ(L,{host:n,port:i,pathname:r}))}),T.listen(i,n,()=>{let L=T.address();if(!L||typeof L==="string"){C(ZJ(Error("Failed to resolve hub port"),{host:n,port:i,pathname:r}));return}s=L.port,a=qo(n,s,r),R()})})}catch(R){if(k)clearInterval(k),k=void 0;if(R instanceof Error)R.hubInstanceLockHeld=u.held;throw await o9(Promise.resolve().then(()=>h.stop()),r9),u.release(),R}try{await Pf(t.discoveryPath,{hubId:p,protocolVersion:TM,minClientProtocolVersion:QJ,maxClientProtocolVersion:JJ,capabilities:[...y.capabilities],coreVersion:Oi.version,buildId:d,buildEpochMs:l,authToken:c,host:n,port:s,url:a,pid:process.pid,startedAt:g,updatedAt:g},{beforePublish:()=>{E=!0}})}catch(R){if(E=!1,!await o9(S().closed,r9))try{T.closeAllConnections(),T.unref()}catch{}throw R}return v={host:n,port:s,url:a,authToken:c,beginClose:S,close:x},v}async function d9(e){let t=e.owner??Us(),n=e.host!==void 0||e.port!==void 0||e.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),r=e.host??"127.0.0.1",o=e.port??Of(),i=e.pathname??"/hub",s=qo(r,o,i),a=t.discoveryPath,d=(c)=>{if(!n)$d(c.url,c.authToken);return c},l=Ai.get(a);if(l){let c=await l.promise;if(l.state==="closing"){if(await c.beginClose().closed.catch(()=>{return}),Ai.get(a)===l)Ai.delete(a)}else if(e9(c.url,r,o,i)||e.allowPortFallback===!0)return d({server:c,url:c.url,authToken:c.authToken,action:"reuse"});else throw t9(t.ownerId,c.url,s)}return await Mf(t.discoveryPath,async()=>{let c=await qt(t.discoveryPath);if(c?.url){let p=await jo(c.url,{authToken:c.authToken});if(p?.url&&Ld(p)&&await nr(p.url,{authToken:c.authToken})){if(e9(c.url,r,o,i)||e.allowPortFallback===!0)return d({url:p.url,authToken:c.authToken,action:"reuse"});throw t9(t.ownerId,c.url,s)}if(p?.url){let m={url:p.url,authToken:c.authToken,pid:p.pid??c.pid};if(await TT(m)){if(await nr(p.url,{authToken:c.authToken}))return d({url:p.url,authToken:c.authToken,action:"reuse"})}else await Dd(m,t.discoveryPath)}else await Wo(t.discoveryPath)}let u=async(p)=>{let m=_M({...p,owner:t}),f={promise:m,state:"starting"};Ai.set(a,f);try{let g=await m;return f.server=g,f.state="open",d({server:g,url:g.url,authToken:g.authToken,action:"started"})}catch(g){if(Ai.get(a)===f)Ai.delete(a);throw g}},h=Date.now()+A2e;for(;;)try{return await u(e)}catch(p){if(VJ(p)&&Date.now()<h){await new Promise((m)=>setTimeout(m,R2e));continue}if(!e.allowPortFallback||!_2e(p))throw p;return await u({...e,port:0})}})}function c9(){return l9()==="production"?to():Er()}function P2e(e){return l9()!=="production"&&!e}async function q_t(e){let t=Bs({host:e.host,port:e.port,pathname:e.pathname});return await _M({...e,...t,owner:c9()})}async function z_t(e){let t=e.port!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),n=Bs({host:e.host,port:e.port,pathname:e.pathname});return await d9({...e,...n,allowPortFallback:e.allowPortFallback??P2e(t),owner:c9()})}export{vM as BrowserWebSocketHubAdapter,vZ as DEFAULT_HUB_HOST,TZ as DEFAULT_HUB_PATHNAME,kZ as DEFAULT_HUB_PORT,d_t as HUB_LOCK_HELD_EXIT_CODE,Nf as HubCommandError,pM as HubEventLogStore,gu as HubInstanceLock,GJ as HubLockHeldError,Ak as HubRunAdmissionRejectedError,aM as HubRunQueue,uf as HubScheduleCommandService,Tf as HubScheduleService,Mk as HubServerTransport,Vee as HubSessionClient,an as HubTransportError,Yee as HubUIClient,kM as NativeHubTransportAdapter,Ws as NodeHubClient,Pd as ScheduledTaskInputSchema,TL as TASKS_SYSTEM_PROMPT_RULE,Mu as TASKS_TOOL_NAME,xL as TasksToolInputSchema,Xze as __test__,qee as checkManagedHubBuildMismatch,Wo as clearHubDiscovery,DL as clearHubDiscoveryIfOwned,Lu as compareHubBuilds,oN as connectToHub,NQ as createConfiguredTelemetryHandle,mL as createConfiguredTelemetryService,NL as createHubAuthToken,qo as createHubServerUrl,Pze as createInMemoryHubOwnerContext,Avt as createLocalHubScheduleRuntimeHandlers,pT as createTasksPromptExtension,hT as createTasksTool,RT as ensureCompatibleLocalHubUrl,$u as ensureDetachedHubServer,z_t as ensureHubServer,d9 as ensureHubWebSocketServer,rT as executeScheduleOperation,Fs as getManagedHubCompatibility,dKe as hasActiveHubSessions,TT as hubHasLiveSessions,Mze as isDiscoveryFilePresent,aKe as isHubCommandTimeoutError,VJ as isHubLockHeldError,kee as isHubReconnectableTransportError,a9 as isLocalHubHostName,C2e as isLocalHubOrigin,Ld as isManagedHubReusable,nN as localHubHasNoActiveSessions,Df as normalizeHubWebSocketUrl,Jze as prewarmDetachedHubServer,fKe as probeHubConnection,jo as probeHubServer,Fd as queryHubSessionActivity,SM as readBearerToken,qt as readHubDiscovery,JZ as readSupersededHubDiscovery,VL as rememberLocalHubAuthToken,$d as rememberRecoverableLocalHubUrl,Hs as requestHubDrain,ST as requestHubShutdown,Ou as resolveClineDataDir,Ize as resolveClineDir,Eee as resolveCompatibleLocalHubUrl,SZ as resolveDefaultHubHost,xZ as resolveDefaultHubPathname,Of as resolveDefaultHubPort,P_t as resolveEphemeralPort,yT as resolveHubBuildEpochMs,eo as resolveHubBuildId,Nu as resolveHubBuildIdentity,Bs as resolveHubEndpointOptions,Hje as resolveHubEventLogPath,YJ as resolveHubInstanceLockPath,Us as resolveHubOwnerContext,pje as resolveHubRunQueuePath,Lee as resolveHubUrl,to as resolveProductionHubOwnerContext,Er as resolveSharedHubOwnerContext,Uze as resolveWorkspaceHubOwnerContext,lKe as restartLocalHubIfIdleAfterStartupTimeout,Dd as retireDiscoveredHub,gKe as sendHubCommand,ree as spawnDetachedHubServer,oee as spawnDetachedHubServerWithRetry,q_t as startHubServer,_M as startHubWebSocketServer,Aee as stopLocalHubServerGracefully,tN as summarizeHubSessionActivity,FL as toHubHealthUrl,pZ as toHubStatusUrl,k0 as truncateNotificationBody,Qze as upgradeManagedHub,nr as verifyHubConnection,SKe as watchManagedHubBuildMismatch,Mf as withHubStartupLock,Pf as writeHubDiscovery};
2132
+ Caused by: ${e.stack}`;return i}var T2e=new Set([1,7,9,11,13,15,17,19,20,21,22,23,25,37,42,43,53,69,77,79,87,95,101,102,103,104,109,110,111,113,115,117,119,123,135,137,139,143,161,179,389,427,465,512,513,514,515,526,530,531,532,540,548,554,556,563,587,601,636,989,990,993,995,1719,1720,1723,2049,3659,4045,4190,5060,5061,6000,6566,6665,6666,6667,6668,6669,6679,6697,10080]),S2e=8;async function O_t(e,t=x2e){for(let n=1;n<S2e;n+=1){let r=await t(e);if(!T2e.has(r))return r}return await t(e)}async function x2e(e){return await new Promise((t,n)=>{let r=f2e.createServer();r.once("error",n),r.listen(0,e,()=>{let o=r.address();if(!o||typeof o==="string"){r.close(()=>n(Error("Failed to resolve free port")));return}let i=o.port;r.close((s)=>{if(s){n(s);return}t(i)})})})}function _2e(e){return e instanceof Error&&"code"in e&&e.code==="EADDRINUSE"}function e9(e,t,n,r){try{let o=new lf(e),i=new lf(qo(t,n===0?1:n,r));return o.protocol===i.protocol&&o.hostname===i.hostname&&o.pathname===i.pathname&&(n===0||o.port===i.port)}catch{return!1}}function t9(e,t,n){return Error(`Hub owner ${e} is already running at ${t}; refusing a second endpoint at ${n}`)}var Ai=new Map,n9="cline-hub-auth.",E2e=30000,r9=2000,A2e=3000,R2e=100;async function o9(e,t){let n;try{return await Promise.race([e.then(()=>!0,()=>!0),new Promise((r)=>{n=setTimeout(()=>r(!1),t)})])}finally{if(n)clearTimeout(n)}}function xM(e){return Array.isArray(e)?e.join(","):e??""}function i9(e){return e===32||e===9}function SM(e){let t=xM(e).trim(),n="bearer";if(t.length<=6||t.slice(0,6).toLowerCase()!=="bearer"||!i9(t.charCodeAt(6)))return null;let r=7;while(r<t.length&&i9(t.charCodeAt(r)))r+=1;return t.slice(r).trim()||null}function I2e(e){for(let t of xM(e).split(",")){let n=t.trim();if(n.startsWith(n9))return n.slice(n9.length).trim()||null}return null}function a9(e){let t=e.trim().toLowerCase();return t==="localhost"||t==="127.0.0.1"||t==="::1"||t==="[::1]"}function C2e(e){let t=xM(e).trim();if(!t)return!1;try{return a9(new lf(t).hostname)}catch{return!1}}async function _M(e){let t=e.owner??Us(),n=e.host??"127.0.0.1",r=e.pathname??"/hub",i=e.port??Of(),s=i,a=qo(n,i,r),d=eo(),l=yT(),c=NL(),u=gu.acquire(YJ(t.discoveryPath));if(!u.held)ke("warn","instance_lock.unavailable",{lockFile:u.lockFile});let h;try{h=new Mk({...e,owner:t}),await h.start()}catch(R){throw u.release(),R}let p=h.getHubId(),m=new vM(new kM(h),e.telemetry,e.workspaceRoot),f=new Set,g=new Date().toISOString(),y={protocolVersion:TM,minClientProtocolVersion:QJ,maxClientProtocolVersion:JJ,capabilities:g2e,coreVersion:Oi.version,buildId:d,buildEpochMs:l,pid:process.pid,startedAt:g},w=new Set,k,b,v,E=!1,S=()=>{if(b)return b;if(v){let D=Ai.get(t.discoveryPath);if(D?.server===v)D.state="closing"}if(k)clearInterval(k),k=void 0;let R=new Promise((D,K)=>{A.close((V)=>{if(V){K(V);return}D()})}),C=new Promise((D,K)=>{T.close((V)=>{if(V){K(V);return}D()})}),L=Promise.resolve().then(()=>h.stop()),N=L.then(async()=>{await DL(t.discoveryPath,p)}),W=(async()=>{let K=(await Promise.allSettled([R,C,L,N])).flatMap((V)=>V.status==="rejected"?[V.reason]:[]);if(K.length>0)throw AggregateError(K,"hub server close failed")})().finally(()=>{if(Ai.get(t.discoveryPath)?.server===v)Ai.delete(t.discoveryPath);u.release()});b={transportStopped:L,closed:W};for(let D of w)D.terminate?.();w.clear();for(let D of f)D();return f.clear(),b},x=()=>S().closed,T=m2e.createServer((R,C)=>{if(!E){C.statusCode=503,C.end("Starting");return}if((R.url??"/")==="/health"){let N=JSON.stringify({ok:!0,protocolVersion:y.protocolVersion,minClientProtocolVersion:y.minClientProtocolVersion,maxClientProtocolVersion:y.maxClientProtocolVersion,coreVersion:y.coreVersion,buildId:y.buildId,buildEpochMs:y.buildEpochMs,draining:h.isDraining(),host:n,port:s,url:a});C.statusCode=200,C.setHeader("content-type","application/json"),C.end(N);return}if((R.url??"/")==="/status"){if(!Ok(SM(R.headers.authorization),c)){C.statusCode=401,C.end("Unauthorized");return}let N=JSON.stringify({hubId:p,...y,authToken:c,host:n,port:s,url:a,updatedAt:new Date().toISOString()});C.statusCode=200,C.setHeader("content-type","application/json"),C.end(N);return}if((R.url??"/")==="/version"){C.statusCode=200,C.setHeader("content-type","application/json"),C.end(JSON.stringify(y));return}let L=new lf(R.url??"/",`http://${n}:${s}`);if(L.pathname==="/drain"&&R.method==="POST"){if(!Ok(SM(R.headers.authorization),c)){C.statusCode=401,C.end("Unauthorized");return}let N=L.searchParams.get("off")===null;h.handleCommand({version:TM,command:"hub.drain",payload:{draining:N,reason:L.searchParams.get("reason")??"authenticated HTTP drain request"}}).then((W)=>{C.statusCode=W.ok?200:500,C.setHeader("content-type","application/json"),C.end(JSON.stringify(W.payload??{ok:W.ok}))},()=>{C.statusCode=500,C.end("Drain failed")});return}if(L.pathname==="/shutdown"&&R.method==="POST"){if(!Ok(SM(R.headers.authorization),c)){C.statusCode=401,C.end("Unauthorized");return}let N=!1,W=()=>{if(N)return;N=!0;try{Promise.resolve(e.onShutdownRequested?.()).catch(()=>{return})}catch{}finally{x().catch(()=>{return})}};C.statusCode=202,C.setHeader("content-type","application/json"),C.setHeader("connection","close");let D=setTimeout(W,1000);D.unref?.(),C.end(JSON.stringify({ok:!0}),()=>{setImmediate(()=>{clearTimeout(D),W()})});return}C.statusCode=404,C.end("Not found")}),A=new y2e({noServer:!0});k=setInterval(()=>{for(let R of w){if(R.isAlive===!1){R.heartbeatTerminated=!0;try{R.terminate?.()}catch{}w.delete(R);continue}R.isAlive=!1;try{R.ping?.()}catch{try{R.terminate?.()}catch{}w.delete(R)}}},E2e),T.on("upgrade",(R,C,L)=>{if(!E){k2e(C);return}if(new lf(R.url??"/",`http://${n}:${s}`).pathname!==r){C.destroy();return}let W=Ok(I2e(R.headers["sec-websocket-protocol"]),c);if(!(W||a9(n)&&C2e(R.headers.origin))){v2e(C);return}try{A.handleUpgrade(R,C,L,(K)=>{let V=K;V.isAlive=!0,V.on("pong",()=>{V.isAlive=!0}),w.add(V),V.once("close",(j,G)=>{ke("info","socket.closed",{code:j,reason:s9(G).slice(0,200)||void 0,heartbeatTerminated:V.heartbeatTerminated??!1,serverClosing:b!==void 0})});let B=m.attach(w2e(K),{allowRegisteredWorkspace:W});f.add(B),K.once("close",()=>{w.delete(V),B(),f.delete(B)})})}catch{b2e(C)}});try{await new Promise((R,C)=>{T.once("error",(L)=>{C(ZJ(L,{host:n,port:i,pathname:r}))}),T.listen(i,n,()=>{let L=T.address();if(!L||typeof L==="string"){C(ZJ(Error("Failed to resolve hub port"),{host:n,port:i,pathname:r}));return}s=L.port,a=qo(n,s,r),R()})})}catch(R){if(k)clearInterval(k),k=void 0;if(R instanceof Error)R.hubInstanceLockHeld=u.held;throw await o9(Promise.resolve().then(()=>h.stop()),r9),u.release(),R}try{await Pf(t.discoveryPath,{hubId:p,protocolVersion:TM,minClientProtocolVersion:QJ,maxClientProtocolVersion:JJ,capabilities:[...y.capabilities],coreVersion:Oi.version,buildId:d,buildEpochMs:l,authToken:c,host:n,port:s,url:a,pid:process.pid,startedAt:g,updatedAt:g},{beforePublish:()=>{E=!0}})}catch(R){if(E=!1,!await o9(S().closed,r9))try{T.closeAllConnections(),T.unref()}catch{}throw R}return v={host:n,port:s,url:a,authToken:c,beginClose:S,close:x},v}async function d9(e){let t=e.owner??Us(),n=e.host!==void 0||e.port!==void 0||e.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),r=e.host??"127.0.0.1",o=e.port??Of(),i=e.pathname??"/hub",s=qo(r,o,i),a=t.discoveryPath,d=(c)=>{if(!n)$d(c.url,c.authToken);return c},l=Ai.get(a);if(l){let c=await l.promise;if(l.state==="closing"){if(await c.beginClose().closed.catch(()=>{return}),Ai.get(a)===l)Ai.delete(a)}else if(e9(c.url,r,o,i)||e.allowPortFallback===!0)return d({server:c,url:c.url,authToken:c.authToken,action:"reuse"});else throw t9(t.ownerId,c.url,s)}return await Mf(t.discoveryPath,async()=>{let c=await qt(t.discoveryPath);if(c?.url){let p=await jo(c.url,{authToken:c.authToken});if(p?.url&&Ld(p)&&await nr(p.url,{authToken:c.authToken})){if(e9(c.url,r,o,i)||e.allowPortFallback===!0)return d({url:p.url,authToken:c.authToken,action:"reuse"});throw t9(t.ownerId,c.url,s)}if(p?.url){let m={url:p.url,authToken:c.authToken,pid:p.pid??c.pid};if(await TT(m)){if(await nr(p.url,{authToken:c.authToken}))return d({url:p.url,authToken:c.authToken,action:"reuse"})}else await Dd(m,t.discoveryPath)}else await Wo(t.discoveryPath)}let u=async(p)=>{let m=_M({...p,owner:t}),f={promise:m,state:"starting"};Ai.set(a,f);try{let g=await m;return f.server=g,f.state="open",d({server:g,url:g.url,authToken:g.authToken,action:"started"})}catch(g){if(Ai.get(a)===f)Ai.delete(a);throw g}},h=Date.now()+A2e;for(;;)try{return await u(e)}catch(p){if(VJ(p)&&Date.now()<h){await new Promise((m)=>setTimeout(m,R2e));continue}if(!e.allowPortFallback||!_2e(p))throw p;return await u({...e,port:0})}})}function c9(){return l9()==="production"?to():Er()}function P2e(e){return l9()!=="production"&&!e}async function K_t(e){let t=Bs({host:e.host,port:e.port,pathname:e.pathname});return await _M({...e,...t,owner:c9()})}async function G_t(e){let t=e.port!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),n=Bs({host:e.host,port:e.port,pathname:e.pathname});return await d9({...e,...n,allowPortFallback:e.allowPortFallback??P2e(t),owner:c9()})}export{vM as BrowserWebSocketHubAdapter,vZ as DEFAULT_HUB_HOST,TZ as DEFAULT_HUB_PATHNAME,kZ as DEFAULT_HUB_PORT,c_t as HUB_LOCK_HELD_EXIT_CODE,Nf as HubCommandError,pM as HubEventLogStore,gu as HubInstanceLock,GJ as HubLockHeldError,Ak as HubRunAdmissionRejectedError,aM as HubRunQueue,uf as HubScheduleCommandService,Tf as HubScheduleService,Mk as HubServerTransport,Vee as HubSessionClient,an as HubTransportError,Yee as HubUIClient,kM as NativeHubTransportAdapter,Ws as NodeHubClient,Pd as ScheduledTaskInputSchema,TL as TASKS_SYSTEM_PROMPT_RULE,Mu as TASKS_TOOL_NAME,xL as TasksToolInputSchema,Xze as __test__,qee as checkManagedHubBuildMismatch,Wo as clearHubDiscovery,DL as clearHubDiscoveryIfOwned,Lu as compareHubBuilds,oN as connectToHub,NQ as createConfiguredTelemetryHandle,mL as createConfiguredTelemetryService,NL as createHubAuthToken,qo as createHubServerUrl,Pze as createInMemoryHubOwnerContext,Ivt as createLocalHubScheduleRuntimeHandlers,pT as createTasksPromptExtension,hT as createTasksTool,RT as ensureCompatibleLocalHubUrl,$u as ensureDetachedHubServer,G_t as ensureHubServer,d9 as ensureHubWebSocketServer,rT as executeScheduleOperation,Fs as getManagedHubCompatibility,dKe as hasActiveHubSessions,TT as hubHasLiveSessions,Mze as isDiscoveryFilePresent,aKe as isHubCommandTimeoutError,VJ as isHubLockHeldError,kee as isHubReconnectableTransportError,a9 as isLocalHubHostName,C2e as isLocalHubOrigin,Ld as isManagedHubReusable,nN as localHubHasNoActiveSessions,Df as normalizeHubWebSocketUrl,Jze as prewarmDetachedHubServer,fKe as probeHubConnection,jo as probeHubServer,Fd as queryHubSessionActivity,SM as readBearerToken,qt as readHubDiscovery,JZ as readSupersededHubDiscovery,VL as rememberLocalHubAuthToken,$d as rememberRecoverableLocalHubUrl,Hs as requestHubDrain,ST as requestHubShutdown,Ou as resolveClineDataDir,Ize as resolveClineDir,Eee as resolveCompatibleLocalHubUrl,SZ as resolveDefaultHubHost,xZ as resolveDefaultHubPathname,Of as resolveDefaultHubPort,O_t as resolveEphemeralPort,yT as resolveHubBuildEpochMs,eo as resolveHubBuildId,Nu as resolveHubBuildIdentity,Bs as resolveHubEndpointOptions,Hje as resolveHubEventLogPath,YJ as resolveHubInstanceLockPath,Us as resolveHubOwnerContext,pje as resolveHubRunQueuePath,Lee as resolveHubUrl,to as resolveProductionHubOwnerContext,Er as resolveSharedHubOwnerContext,Uze as resolveWorkspaceHubOwnerContext,lKe as restartLocalHubIfIdleAfterStartupTimeout,Dd as retireDiscoveredHub,gKe as sendHubCommand,ree as spawnDetachedHubServer,oee as spawnDetachedHubServerWithRetry,K_t as startHubServer,_M as startHubWebSocketServer,Aee as stopLocalHubServerGracefully,tN as summarizeHubSessionActivity,FL as toHubHealthUrl,pZ as toHubStatusUrl,k0 as truncateNotificationBody,Qze as upgradeManagedHub,nr as verifyHubConnection,SKe as watchManagedHubBuildMismatch,Mf as withHubStartupLock,Pf as writeHubDiscovery};