@cerebriline/core 4.100.272 → 4.100.273

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 O7(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:O7(e)}}function L7(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:L7(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){CO(e),Xk(t);return}if(t?.trim())throw Error("timezone is only supported for recurring schedules");let o=n?.[M7];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 N7}from"node:fs";import{isAbsolute as HO,relative as D7,sep as WO}from"node:path";import{ONE_TIME_SCHEDULE_CRON_PATTERN as jO,ONE_TIME_SCHEDULE_RUN_AT_METADATA_KEY as qO}from"@cerebriline/shared";import{z as _t}from"zod";var $7=_t.enum(["create","update","list","get","pause","resume","delete","run_now"]),F7=_t.object({provider_id:_t.string().min(1),model_id:_t.string().min(1).optional()}),Pd=_t.object({operation:$7,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:F7.optional(),limit:_t.number().int().positive().max(200).optional()});function Rd(e,t,n,r){if(!zO.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 zO=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(!N7(n).isDirectory())throw Error("not a directory");return n}catch{throw Error(`${t} does not resolve to an existing safe path`)}}function U7(e,t){try{return tT.native(e)===tT.native(t)}catch{return!1}}function KO(e,t,n){let r=D7(e,t);if(r===".."||r.startsWith(`..${WO}`)||HO(r))throw Error(`${n} is outside the workspace scope`)}function GO(e,t,n){return nT(HO(t)?t:`${e}${WO}${t}`,n)}function B7(e){let t=nT(e.workspaceRoot,"workspaceRoot"),n=e.cwd?GO(t,e.cwd,"cwd"):t;return KO(t,n,"cwd"),{...e,workspaceRoot:t,cwd:n}}function Id(e,t){if(!e)throw Error("schedule does not exist");if(!U7(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=GO(n,e.cwd,"schedule cwd");KO(n,r,"schedule cwd")}}function BO(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 VO(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 H7(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:jO,metadata:{[qO]:VO(e.run_at)}}}if(e.schedule_type==="recurring"){if(e.run_at)throw Error("run_at cannot be used with a recurring schedule");return{cronPattern:Cd(e.cron_pattern,"cron_pattern"),timezone:e.timezone?.trim()||void 0}}throw Error("schedule_type is required for create")}function W7(e){if(e.run_at&&e.cron_pattern)throw Error("run_at and cron_pattern cannot be updated together");if(e.schedule_type==="once"||e.run_at){if(e.cron_pattern)throw Error("cron_pattern cannot be used with a one-time schedule");if(e.timezone)throw Error("timezone is encoded in run_at for a one-time schedule");return{cronPattern:jO,timezone:null,metadata:{[qO]:VO(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=B7(i);if(zO.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"),...H7(o),prompt:Cd(o.prompt,"prompt"),workspaceRoot:s.workspaceRoot,cwd:s.cwd,modelSelection:BO(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,...W7(o),name:o.name?.trim()||void 0,prompt:o.prompt?.trim()||void 0,modelSelection:BO(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 fQ}from"@cerebriline/llms";import{markOtlpTraceRelayProvider as gQ}from"@cerebriline/shared";import{metrics as yQ,trace as wQ}from"@opentelemetry/api";import{logs as bQ}from"@opentelemetry/api-logs";import{OTLPLogExporter as vQ}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as kQ}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as TQ}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as SQ}from"@opentelemetry/resources";import{BatchLogRecordProcessor as xQ,ConsoleLogRecordExporter as _Q,LoggerProvider as EQ}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as AQ,MeterProvider as RQ,PeriodicExportingMetricReader as hL}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as IQ,ConsoleSpanExporter as CQ,SimpleSpanProcessor as PQ}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as MQ}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as OQ,ATTR_SERVICE_VERSION as LQ}from"@opentelemetry/semantic-conventions";import{mkdirSync as j7,readFileSync as q7,statSync as z7,writeFileSync as K7}from"node:fs";import{dirname as G7}from"node:path";import{CONFIGURABLE_MODEL_TOOL_NAMES as YO}from"@cerebriline/shared";import{resolveGlobalSettingsPath as XO}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}),V7=Dt.enum(["basic","agentic"]).catch("agentic"),Y7=Dt.partialRecord(Dt.enum(YO),Dt.object({enabled:Dt.boolean()}).strip()).optional(),X7=Dt.record(Dt.string(),Dt.object({enabled:Dt.boolean()}).strip()).optional().catch(void 0),J7=Dt.enum(["plan","act"]),iT=Dt.object({telemetryOptOut:Dt.boolean().default(!1).catch(!1),autoUpdateEnabled:Dt.boolean().default(!0).catch(!0),compactionStrategy:V7.optional(),compactionEnabled:Dt.boolean().optional().catch(void 0),planActMode:J7.optional().catch(void 0),toolAutoApprove:Dt.boolean().optional().catch(void 0),tuiTheme:Dt.string().optional().catch(void 0),disabledTools:oT.optional(),tools:Y7,disabledPlugins:oT.optional(),disabledAgentPlugins:oT.optional(),bundledSkills:X7}).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 Q7(){xf=void 0}function Z7(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 eQ(e){let t;try{t=q7(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 JO(){let e=XO(),t=z7(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?eQ(e):{value:Sf(),loadFailed:!1},s=Z7(i.value);return xf={path:e,mtimeMs:n,size:r,value:s,loadFailed:i.loadFailed},xf}function mn(){return JO().value}function Ds(e,t={}){let n=XO(),r=mn();j7(G7(n),{recursive:!0});let o=iT.parse(e);if(!r.telemetryOptOut&&o.telemetryOptOut)zM(t.telemetry);K7(n,`${JSON.stringify(o,null,2)}
321
- `,"utf8"),Q7()}function QO(){return mn().telemetryOptOut}function $s(e){return new Set(e??mn().disabledTools??[])}function ZO(e){return new Set(e??mn().disabledPlugins??[])}function Cu(e){return new Set(e??mn().disabledAgentPlugins??[])}function eL(e){return YO.includes(e)}function tQ(){let e=JO();return{web_search:{enabled:!e.loadFailed},...e.value.tools}}function sT(e){return tQ()[e]?.enabled===!0}function nQ(e,t){let n=mn();Ds({...n,tools:{...n.tools,[e]:{enabled:t}}})}function tL(e){if(eL(e)){let o=sT(e);return nQ(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 rQ(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(eL(s)){i[s]={enabled:!t};continue}if(t)o.add(s);else o.delete(s)}Ds({...r,disabledTools:[...o],tools:i})}function nL(e,t){return rQ([e],t),t}function rL(e,t){let n=e.trim();if(!n)return;let r=mn(),o=ZO(r.disabledPlugins);if(t)o.add(n);else o.delete(n);Ds({...r,disabledPlugins:[...o]})}function oL(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 iL(e,t){let n=ZO(t);if(n.size===0)return[...e];return e.filter((r)=>!n.has(r))}function Mi(e,t){let n=$s(t);if(n.size===0)return[...e];return e.filter((r)=>!n.has(r.name))}function sL(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 oQ,mkdirSync as iQ,readFileSync as sQ,writeFileSync as aQ}from"node:fs";import{resolve as dQ}from"node:path";import{resolveSessionDataDir as lQ}from"@cerebriline/shared/storage";import{nanoid as cQ}from"nanoid";import*as uQ from"node-machine-id";var hQ="machine-id",aL,dL=!1;function lL(){if(!dL)aL=cL(),dL=!0;return aL??uL()}function Pu(e){let t=e?.trim();if(t)return t;let n=cL();if(n)return n;return uL()}function pQ(){let e=uQ;return e.machineIdSync??e.default?.machineIdSync}function cL(){try{let e=pQ();if(!e)return;return e().trim()||void 0}catch{return}}function uL(){let e=lQ(),t=dQ(e,hQ);try{if(oQ(t)){let r=sQ(t,"utf8").trim();if(r.length>0)return r}}catch{}let n=`cl-${cQ()}`;try{iQ(e,{recursive:!0}),aQ(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(mQ(d)){o[l]=d;continue}try{o[l]=JSON.stringify(d)}catch{o[l]=String(d)}}return o}}function mQ(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??lL(),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 pL{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 mL{meterProvider;loggerProvider;tracerProvider;options;constructor(e={}){this.options=e;let t=SQ({[OQ]:e.serviceName??"cline",...e.serviceVersion?{[LQ]:e.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(t),this.loggerProvider=this.createLoggerProvider(t),this.tracerProvider=this.createTracerProvider(t),this.meterProvider)yQ.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)bQ.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(e="cline",t){return wQ.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)=>UQ(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 RQ({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=FQ(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 MQ({resource:e,spanProcessors:i?[new fQ,...o]:o});if(i)gQ(s);return s}createLoggerProvider(e){let t=lT(this.options.logsExporter);if(t.length===0)return null;let n=t.map((r)=>{let o=$Q(r,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!o)return null;return new xQ(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 EQ({resource:e,processors:n})}}function NQ(e){let t=new mL(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 fL(e){if(QO())return{telemetry:new pL(e)};if(e.enabled!==!0)return{telemetry:new _f({...e,distinctId:Pu(e.distinctId)})};return NQ(e)}function DQ(e){let{telemetry:t,provider:n,emitProviderCreated:r}=fL(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 $Q(e,t){if(e==="console")return new _Q;if(!t.endpoint)return null;let n=cT(t.endpoint,"/v1/logs");return new vQ({url:n,headers:t.headers})}function FQ(e,t){if(e==="console")return new PQ(new CQ);if(!t.endpoint)return null;let n=cT(t.endpoint,"/v1/traces");return new IQ(new TQ({url:n,headers:t.headers}))}function UQ(e,t){if(e==="console")return new hL({exporter:new AQ,exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout});if(!t.endpoint)return null;let n=cT(t.endpoint,"/v1/metrics");return new hL({exporter:new kQ({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 qQ,zodToJsonSchema as zQ}from"@cerebriline/shared";import{z as Zr}from"zod";import{resolve as gL}from"node:path";import{z as Pe}from"zod";var yL=Pe.enum(["suggestion","follow-up","todo","handoff","idea","reminder"]),BQ=Pe.enum(["pending_approval","approved","in_progress","completed","failed","cancelled","expired"]),wL=Pe.union([Pe.literal(0),Pe.literal(1),Pe.literal(2),Pe.literal(3),Pe.literal(4),Pe.literal(5)]),HQ=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:yL.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:wL.optional(),assignee:Pe.string().min(1).nullable().optional(),model_selection:HQ.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(BQ).optional(),types:Pe.array(yL).optional(),priorities:Pe.array(wL).optional(),limit:Pe.number().int().positive().max(500).optional()}),WQ=new Set(["create","update"]);function uT(e,t,n,r){if(!WQ.has(t.operation))return;Ii(e.telemetry,{ulid:n.sessionId??n.conversationId??n.agentId,tool:`tasks.todo.${t.operation}`,success:r,agentId:n.agentId})}function Md(e,t){let n=e?.trim();if(!n)throw Error(`${t} is required for this operation`);return n}function bL(e){if(e===void 0||e===null)return e;return{providerId:e.provider_id,modelId:e.model_id}}function kL(e,t){return gL(e)===gL(t)}function vL(e,t){if(!e)throw Error("task does not exist");if(t.workspaceRoot){if(e.scope!=="workspace"||!e.workspaceRoot||!kL(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 jQ(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||!kL(e.workspace_root,t.workspaceRoot))throw Error(`this session can only manage ${n} tasks`)}return n}async function TL(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=jQ(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:bL(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(vL(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:bL(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 vL(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",SL='# 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.',KQ="# 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.",GQ=Ef.extend({kind:Zr.literal("todo")}).strict(),xL=Pd.extend({kind:Zr.literal("scheduled")}).strict(),_L=Zr.discriminatedUnion("kind",[GQ,xL]),VQ=Zr.discriminatedUnion("kind",[xL]),EL=["create","update","list","get","pause","resume","delete","run_now"],YQ=Zr.object({...Pd.shape,...Ef.shape,kind:Zr.enum(["todo","scheduled"]),operation:Zr.enum(EL)}).strict(),XQ=Zr.object({...Pd.shape,kind:Zr.enum(["scheduled"]),operation:Zr.enum(EL)}).strict();function hT(e){let t=e.todo;return qQ({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:zQ(t?YQ:XQ),retryable:!1,maxRetries:0,execute:async(n,r)=>{let o=(t?_L:VQ).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 TL(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?KQ:SL,whenToolAvailable:Mu})}}}import{createSessionId as lee,ensureLoopbackProxyBypass as ZL,isHubProtocolCompatible as cee,resolveClineBuildEnv as uee,resolveHubCommandTimeoutMs as hee}from"@cerebriline/shared";import pee 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 CZ}from"node:child_process";import{closeSync as PZ,mkdirSync as MZ,openSync as OZ,readFileSync as LZ,unlinkSync as NZ}from"node:fs";import{basename as DZ,dirname as $Z,join as FZ}from"node:path";import{fileURLToPath as UZ}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as BZ,isBunEmbeddedModulePath as HZ,isHubDaemonProcess as zL,resolveClineBuildEnv as KL,withResolvedClineBuildEnv as WZ}from"@cerebriline/shared";import{createHash as JQ,randomBytes as OL}from"node:crypto";import{existsSync as QQ}from"node:fs";import{mkdir as fT,open as RL,readFile as LL,rename as ZQ,rm as Cf,writeFile as eZ}from"node:fs/promises";import{dirname as NL,join as gT}from"node:path";import{ensureLoopbackProxyBypass as tZ,isHubProtocolCompatible as nZ}from"@cerebriline/shared";import{resolveClineDataDir as Ou,resolveClineDir as Cze}from"@cerebriline/shared/storage";var rZ="CLINE_HUB_DISCOVERY_PATH",oZ="CLINE_HUB_BUILD_ID",iZ="CLINE_HUB_BUILD_EPOCH_MS",sZ=30000,aZ=15000,IL=100;function dZ(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function lZ(e){return JQ("sha256").update(e).digest("hex").slice(0,12)}function cZ(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 DL(){return OL(32).toString("hex")}function CL(e){return new Promise((t)=>setTimeout(t,e))}function uZ(e){return`${e}.lock`}async function hZ(e){try{let t=JSON.parse(await LL(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[oZ]?.trim();if(e)return e;return"sdk-v1-53775de0d2fd28896f283d6a0b352b1849403c4306c8f9e8a4a256efd67e5186".trim()||`source-${String(Oi.version)}`}function yT(){let e=Number(process.env[iZ]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1793571532443)?1793571532443:void 0}function Fs(e,t=eo()){let n=nZ(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 PL(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0}function ML(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 pZ(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=PL(e.buildEpochMs),i=PL(t.buildEpochMs);if(o!==void 0&&i!==void 0&&o!==i)return o<i?-1:1;let s=ML(e.coreVersion),a=ML(t.coreVersion);if(s&&a){let d=pZ(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-${lZ(e)}`,n=process.env[rZ]?.trim()||gT(Ou(),"locks","hub","owners",`${dZ(t)}.json`);return{ownerId:t,discoveryPath:n}}function Mze(e=`hub-${Date.now().toString(36)}`){return Us(e)}async function qt(e){try{let t=JSON.parse(await LL(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=NL(e);await fT(r,{recursive:!0});let o=`${e}.${process.pid}.${OL(6).toString("hex")}.tmp`,i;try{i=await RL(o,"wx",384),await i.writeFile(`${JSON.stringify(t,null,2)}
321
+ `,"utf8"),Q7()}function QO(){return mn().telemetryOptOut}function $s(e){return new Set(e??mn().disabledTools??[])}function ZO(e){return new Set(e??mn().disabledPlugins??[])}function Cu(e){return new Set(e??mn().disabledAgentPlugins??[])}function eL(e){return YO.includes(e)}function tQ(){let e=JO();return{web_search:{enabled:!e.loadFailed},...e.value.tools}}function sT(e){return tQ()[e]?.enabled===!0}function nQ(e,t){let n=mn();Ds({...n,tools:{...n.tools,[e]:{enabled:t}}})}function tL(e){if(eL(e)){let o=sT(e);return nQ(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 rQ(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(eL(s)){i[s]={enabled:!t};continue}if(t)o.add(s);else o.delete(s)}Ds({...r,disabledTools:[...o],tools:i})}function nL(e,t){return rQ([e],t),t}function rL(e,t){let n=e.trim();if(!n)return;let r=mn(),o=ZO(r.disabledPlugins);if(t)o.add(n);else o.delete(n);Ds({...r,disabledPlugins:[...o]})}function oL(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 iL(e,t){let n=ZO(t);if(n.size===0)return[...e];return e.filter((r)=>!n.has(r))}function Mi(e,t){let n=$s(t);if(n.size===0)return[...e];return e.filter((r)=>!n.has(r.name))}function sL(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 oQ,mkdirSync as iQ,readFileSync as sQ,writeFileSync as aQ}from"node:fs";import{resolve as dQ}from"node:path";import{resolveSessionDataDir as lQ}from"@cerebriline/shared/storage";import{nanoid as cQ}from"nanoid";import*as uQ from"node-machine-id";var hQ="machine-id",aL,dL=!1;function lL(){if(!dL)aL=cL(),dL=!0;return aL??uL()}function Pu(e){let t=e?.trim();if(t)return t;let n=cL();if(n)return n;return uL()}function pQ(){let e=uQ;return e.machineIdSync??e.default?.machineIdSync}function cL(){try{let e=pQ();if(!e)return;return e().trim()||void 0}catch{return}}function uL(){let e=lQ(),t=dQ(e,hQ);try{if(oQ(t)){let r=sQ(t,"utf8").trim();if(r.length>0)return r}}catch{}let n=`cl-${cQ()}`;try{iQ(e,{recursive:!0}),aQ(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(mQ(d)){o[l]=d;continue}try{o[l]=JSON.stringify(d)}catch{o[l]=String(d)}}return o}}function mQ(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??lL(),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 pL{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 mL{meterProvider;loggerProvider;tracerProvider;options;constructor(e={}){this.options=e;let t=SQ({[OQ]:e.serviceName??"cline",...e.serviceVersion?{[LQ]:e.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(t),this.loggerProvider=this.createLoggerProvider(t),this.tracerProvider=this.createTracerProvider(t),this.meterProvider)yQ.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)bQ.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(e="cline",t){return wQ.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)=>UQ(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 RQ({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=FQ(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 MQ({resource:e,spanProcessors:i?[new fQ,...o]:o});if(i)gQ(s);return s}createLoggerProvider(e){let t=lT(this.options.logsExporter);if(t.length===0)return null;let n=t.map((r)=>{let o=$Q(r,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!o)return null;return new xQ(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 EQ({resource:e,processors:n})}}function NQ(e){let t=new mL(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 fL(e){if(QO())return{telemetry:new pL(e)};if(e.enabled!==!0)return{telemetry:new _f({...e,distinctId:Pu(e.distinctId)})};return NQ(e)}function DQ(e){let{telemetry:t,provider:n,emitProviderCreated:r}=fL(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 $Q(e,t){if(e==="console")return new _Q;if(!t.endpoint)return null;let n=cT(t.endpoint,"/v1/logs");return new vQ({url:n,headers:t.headers})}function FQ(e,t){if(e==="console")return new PQ(new CQ);if(!t.endpoint)return null;let n=cT(t.endpoint,"/v1/traces");return new IQ(new TQ({url:n,headers:t.headers}))}function UQ(e,t){if(e==="console")return new hL({exporter:new AQ,exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout});if(!t.endpoint)return null;let n=cT(t.endpoint,"/v1/metrics");return new hL({exporter:new kQ({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 qQ,zodToJsonSchema as zQ}from"@cerebriline/shared";import{z as Zr}from"zod";import{resolve as gL}from"node:path";import{z as Pe}from"zod";var yL=Pe.enum(["suggestion","follow-up","todo","handoff","idea","reminder"]),BQ=Pe.enum(["pending_approval","approved","in_progress","completed","failed","cancelled","expired"]),wL=Pe.union([Pe.literal(0),Pe.literal(1),Pe.literal(2),Pe.literal(3),Pe.literal(4),Pe.literal(5)]),HQ=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:yL.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:wL.optional(),assignee:Pe.string().min(1).nullable().optional(),model_selection:HQ.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(BQ).optional(),types:Pe.array(yL).optional(),priorities:Pe.array(wL).optional(),limit:Pe.number().int().positive().max(500).optional()}),WQ=new Set(["create","update"]);function uT(e,t,n,r){if(!WQ.has(t.operation))return;Ii(e.telemetry,{ulid:n.sessionId??n.conversationId??n.agentId,tool:`tasks.todo.${t.operation}`,success:r,agentId:n.agentId})}function Md(e,t){let n=e?.trim();if(!n)throw Error(`${t} is required for this operation`);return n}function bL(e){if(e===void 0||e===null)return e;return{providerId:e.provider_id,modelId:e.model_id}}function kL(e,t){return gL(e)===gL(t)}function vL(e,t){if(!e)throw Error("task does not exist");if(t.workspaceRoot){if(e.scope!=="workspace"||!e.workspaceRoot||!kL(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 jQ(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||!kL(e.workspace_root,t.workspaceRoot))throw Error(`this session can only manage ${n} tasks`)}return n}async function TL(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=jQ(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:bL(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(vL(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:bL(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 vL(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",SL='# 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.',KQ="# 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.",GQ=Ef.extend({kind:Zr.literal("todo")}).strict(),xL=Pd.extend({kind:Zr.literal("scheduled")}).strict(),_L=Zr.discriminatedUnion("kind",[GQ,xL]),VQ=Zr.discriminatedUnion("kind",[xL]),EL=["create","update","list","get","pause","resume","delete","run_now"],YQ=Zr.object({...Pd.shape,...Ef.shape,kind:Zr.enum(["todo","scheduled"]),operation:Zr.enum(EL)}).strict(),XQ=Zr.object({...Pd.shape,kind:Zr.enum(["scheduled"]),operation:Zr.enum(EL)}).strict();function hT(e){let t=e.todo;return qQ({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:zQ(t?YQ:XQ),retryable:!1,maxRetries:0,execute:async(n,r)=>{let o=(t?_L:VQ).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 TL(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?KQ:SL,whenToolAvailable:Mu})}}}import{createSessionId as lee,ensureLoopbackProxyBypass as ZL,isHubProtocolCompatible as cee,resolveClineBuildEnv as uee,resolveHubCommandTimeoutMs as hee}from"@cerebriline/shared";import pee 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 CZ}from"node:child_process";import{closeSync as PZ,mkdirSync as MZ,openSync as OZ,readFileSync as LZ,unlinkSync as NZ}from"node:fs";import{basename as DZ,dirname as $Z,join as FZ}from"node:path";import{fileURLToPath as UZ}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as BZ,isBunEmbeddedModulePath as HZ,isHubDaemonProcess as zL,resolveClineBuildEnv as KL,withResolvedClineBuildEnv as WZ}from"@cerebriline/shared";import{createHash as JQ,randomBytes as OL}from"node:crypto";import{existsSync as QQ}from"node:fs";import{mkdir as fT,open as RL,readFile as LL,rename as ZQ,rm as Cf,writeFile as eZ}from"node:fs/promises";import{dirname as NL,join as gT}from"node:path";import{ensureLoopbackProxyBypass as tZ,isHubProtocolCompatible as nZ}from"@cerebriline/shared";import{resolveClineDataDir as Ou,resolveClineDir as Cze}from"@cerebriline/shared/storage";var rZ="CLINE_HUB_DISCOVERY_PATH",oZ="CLINE_HUB_BUILD_ID",iZ="CLINE_HUB_BUILD_EPOCH_MS",sZ=30000,aZ=15000,IL=100;function dZ(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function lZ(e){return JQ("sha256").update(e).digest("hex").slice(0,12)}function cZ(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 DL(){return OL(32).toString("hex")}function CL(e){return new Promise((t)=>setTimeout(t,e))}function uZ(e){return`${e}.lock`}async function hZ(e){try{let t=JSON.parse(await LL(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[oZ]?.trim();if(e)return e;return"sdk-v1-9bddedd25140e23b59f323e1be32195661b948d1b05998eef4e40b70f7e54c6a".trim()||`source-${String(Oi.version)}`}function yT(){let e=Number(process.env[iZ]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1793814281879)?1793814281879:void 0}function Fs(e,t=eo()){let n=nZ(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 PL(e){return typeof e==="number"&&Number.isFinite(e)&&e>0?e:void 0}function ML(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 pZ(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=PL(e.buildEpochMs),i=PL(t.buildEpochMs);if(o!==void 0&&i!==void 0&&o!==i)return o<i?-1:1;let s=ML(e.coreVersion),a=ML(t.coreVersion);if(s&&a){let d=pZ(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-${lZ(e)}`,n=process.env[rZ]?.trim()||gT(Ou(),"locks","hub","owners",`${dZ(t)}.json`);return{ownerId:t,discoveryPath:n}}function Mze(e=`hub-${Date.now().toString(36)}`){return Us(e)}async function qt(e){try{let t=JSON.parse(await LL(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=NL(e);await fT(r,{recursive:!0});let o=`${e}.${process.pid}.${OL(6).toString("hex")}.tmp`,i;try{i=await RL(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 ZQ(o,e);let s;try{s=await RL(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 $L(e,t){return await wT(e,async()=>{if((await qt(e))?.hubId!==t)return!1;return await Cf(e,{force:!0}),!0})}async function FL(e,t,n){let r=uZ(e);await fT(NL(r),{recursive:!0});let o=Date.now()+aZ;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 hZ(r);if(!a){if(Date.now()>=o){await mT(r);continue}await CL(IL);continue}let d=Date.now()-Date.parse(a.acquiredAt);if(!cZ(a.pid)||d>sZ){await mT(r);continue}if(Date.now()>=o)throw Error(`Timed out waiting for hub ${t} lock ${r}`);await CL(IL);continue}try{return await eZ(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 FL(`${e}.mutation`,"discovery mutation",t)}function Mf(e,t){return FL(e,"startup",t)}async function jo(e,t){tZ();try{let n=await fetch(t?.authToken?mZ(e):UL(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 UL(e){let t=new URL(e);return t.protocol=t.protocol==="wss:"?"https:":"http:",t.pathname="/health",t.search="",t.toString()}function mZ(e){let t=new URL(UL(e));return t.pathname="/status",t.toString()}function Oze(e){return QQ(e)}import{CLINE_HUB_DEV_PORT as fZ,CLINE_HUB_PORT as gZ,resolveClineBuildEnv as yZ}from"@cerebriline/shared";var wZ="CLINE_HUB_HOST",bZ="CLINE_HUB_PORT",vZ="CLINE_HUB_PATHNAME",kZ="127.0.0.1",TZ=gZ,SZ="/hub";function BL(e){return yZ(e)==="development"?fZ:TZ}function xZ(e={}){return(e.env??process.env)[wZ]?.trim()||kZ}function Of(e={}){let n=(e.env??process.env)[bZ]?.trim();if(!n)return BL(e);let r=Number.parseInt(n,10);if(!Number.isInteger(r)||r<1||r>65535)return BL(e);return r}function _Z(e={}){return(e.env??process.env)[vZ]?.trim()||SZ}function Bs(e={},t={}){return{host:e.host??xZ(t),port:e.port??Of(t),pathname:e.pathname??_Z(t)}}import{join as EZ}from"node:path";var AZ="shared:cline",RZ="CLINE_HUB_DISCOVERY_PATH",IZ="hub-production";function Bze(e){let t=Ms(e.trim());return Us(`workspace:${t||e.trim()}`)}function Er(e=AZ){return Us(`${e}@${eo()}`)}function to(){return{ownerId:IZ,discoveryPath:process.env[RZ]?.trim()||EZ(Ou(),"locks","hub","production.json")}}var HL=15000,jZ=200,WL=3000,qZ=100,zZ=[100,250,500,1000,2000],KZ="--cline-hub-daemon",GZ=3,VZ=60000,kT=new Map,Jze={resetRetireAttempts(){kT.clear()},resolveDaemonEntryArgs:VL};function YZ(e,t=Date.now()){let n=kT.get(e);if(!n||t-n.windowStartedAt>VZ)return kT.set(e,{count:1,windowStartedAt:t}),!0;return n.count+=1,n.count<=GZ}function XZ(e){return[...e.host?["--host",e.host]:[],...typeof e.port==="number"?["--port",String(e.port)]:[],...e.pathname?["--pathname",e.pathname]:[]]}function JZ(){try{let e=FZ(Ou(),"logs","hub-daemon.log");return MZ($Z(e),{recursive:!0}),{fd:OZ(e,"a"),logPath:e}}catch{return}}function GL(){return KL()==="production"?to():Er()}function Du(e){return Ld(e)}function QZ(e){try{let t=JSON.parse(LZ(`${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{NZ(`${e}.superseded`)}catch{}}function jL(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 qL(e,t){let n=Date.now()+t;while(Date.now()<n){if(!(await Nd(e))?.url)return!0;await new Promise((o)=>setTimeout(o,qZ))}return!1}async function Dd(e,t){if(!YZ(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 qL(e.url,WL);if(!n&&e.pid&&ZZ(e.pid)){try{process.kill(e.pid,"SIGTERM")}catch{}n=await qL(e.url,WL)}if(n)await Wo(t).catch(()=>{return});return n}function ZZ(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 eee(e){if(KL()!=="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 tee(){let e=import.meta.url.endsWith(".ts")?"ts":"js";return UZ(new URL(`./entry.${e}`,import.meta.url))}function VL(e,t){if(HZ(e))return[KZ];return[...t&&e.toLowerCase().endsWith(".ts")?["--conditions=development"]:[],e]}function nee(e,t){let n=tee(),r=process.execPath?.trim();if(!r)throw Error("unable to resolve runtime executable for hub daemon");let o=DZ(r).toLowerCase().includes("bun"),i=VL(n,o);return{launcher:r,args:[...i,"--cwd",e,...XZ(t),...t.manageConnectors===!1?["--no-connectors"]:[]],cwd:e,env:{...WZ(process.env),CLINE_NO_INTERACTIVE:"1",[BZ]:"1"}}}function ree(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 oee(e,t={}){if(zL())return;let n=nee(e,t),r=JZ();try{CZ(n.launcher,n.args,{detached:!0,stdio:r?["ignore",r.fd,r.fd]:"ignore",env:n.env,cwd:n.cwd,windowsHide:!0}).unref()}finally{if(r)PZ(r.fd)}}async function iee(e,t={}){for(let n=0;;n++)try{oee(e,t);return}catch(r){let o=zZ[n];if(!ree(r)||o===void 0)throw r;await new Promise((i)=>setTimeout(i,o))}}function Qze(e,t={}){if(zL())return;$u(e,t).catch(()=>{})}async function see(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 YL(m.url,m.authToken);return m};await eee(e).catch(()=>{return});let a=await qt(e.discoveryPath),d=a?.url?void 0:QZ(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=jL(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 iee(t,{...h,manageConnectors:n.manageConnectors});let p=Date.now()+HL;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=jL(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,jZ))}throw Error(`Timed out after ${HL}ms waiting for detached hub startup.`)}async function $u(e,t={}){let n=GL();return await Mf(n.discoveryPath,async()=>see(n,e,t))}var aee=5000,dee=500;async function Zze(e={}){let t=GL(),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??aee),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,dee))}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 uee()==="production"?to():Er()}function mee(){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 eN(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 eN(e.data);return String(e)}function fee(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 XL(e){let t=e,n=fee(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 JL(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,gee="cline-hub-auth.",CT=new Map,tN=new Set,yee=3000,wee=3000,bee=100,_T="Hub connection closed",vee=250,kee=5000,QL=0.5;class an extends Error{code;details;constructor(e,t,n){super(t);this.code=e;this.details=n;this.name="HubTransportError"}}function Tee(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 dKe(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 See(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(!See(e))return;let t=new URL(Df(e));return t.search="",t.hash="",t.toString()}function ET(e){let t=$f(e);return!!t&&tN.has(t)}function $d(e,t){let n=$f(e);if(n){if(tN.add(n),t?.trim())CT.set(n,t)}return e}function YL(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=JL(s,e),this.registered=!1,this.sawSocketClose=!1,this.socket=void 0;try{o.close()}catch{}}if(!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect();throw s}}async openSocket(e,t,n){let r=this.options.resolveConnectionHeaders,o;if(r){let d;try{o=await Promise.race([Promise.resolve().then(()=>r()),new Promise((l,c)=>{d=setTimeout(()=>{c(new 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 pee(e.toString(),{headers:{...o}}):new(mee())(e.toString(),t?[`${gee}${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=JL(h,e);if(this.socket===i)this.lastCloseError=p,this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;l(p)}),i.addEventListener("close",(h)=>{if(c)return;c=!0,clearTimeout(u);let p=s?this.lastCloseError:XL(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(eN(d)))}),i.addEventListener("close",(d)=>{if(this.socket!==i)return;if(!s)this.lastCloseError=XL(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=lee("hubreq_");r?.onDispatch?.(i);let s=hee(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)||!Tee(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(vee*2**this.reconnectAttempt,kee),t=Math.round(e*(1-QL)+Math.random()*e*QL);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.reconnectSubscribedTransport()},t)}async reconnectSubscribedTransport(){if(this.closedByClient||!this.hasActiveSubscriptions())return;try{await this.connect(),this.reconnectAttempt=0}catch{if(!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(!cee(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 xee(e){let t=Date.now()+wee;while(Date.now()<t){if(!(await jo(e).catch(()=>{return}))?.url)return!0;await new Promise((r)=>setTimeout(r,bee))}return!1}function _ee(e,t){try{return Df(e)===Df(t)}catch{return!1}}function nN(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 lKe(e){return nN(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:yee});return nN(o.payload)}finally{await r.dispose().catch(()=>{return})}}async function rN(e,t,n){try{return(await Fd(e,t,n)).activeSessionCount===0}catch{return!1}}async function Eee(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 rN(o.url,r.authToken,t))return;return $d(o.url,r.authToken)}async function Aee(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 Eee(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 Aee(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){ZL();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){ZL();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 Ree(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 cKe(e){if(!ET(e.url))return;let t=IT(),n=await qt(t.discoveryPath);if(!n?.url||!_ee(n.url,e.url))return;if(!await rN(n.url,n.authToken,{workspaceRoot:e.workspaceRoot,cwd:e.cwd}))return;if(!await Ree())return;if(!await xee(n.url))return;return await Wo(t.discoveryPath).catch(()=>{return}),await RT({workspaceRoot:e.workspaceRoot,cwd:e.cwd})}import{resolveClineBuildEnv as Iee}from"@cerebriline/shared";function Cee(e,t){if(e instanceof Error)return e;if(e&&typeof e==="object"&&"message"in e&&typeof e.message==="string"&&e.message.trim())return Error(e.message.trim());let n=e&&typeof e==="object"&&"type"in e&&typeof e.type==="string"?e.type.trim():"";return Error(n?`Failed to connect to hub at ${t} (${n} event before socket open).`:`Failed to connect to hub at ${t}.`)}var Pee="cline-hub-auth.";function Mee(e){return e.host!==void 0||e.port!==void 0||e.pathname!==void 0}function Oee(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 oN(){return Iee()==="production"?to():Er()}async function Lee(e){let t=e.searchParams.get("authToken")?.trim();if(e.searchParams.delete("authToken"),t)return t;let n=oN(),r=await qt(n.discoveryPath);if(r?.url&&Oee(e.toString(),r.url))return r.authToken;return}async function Nee(e={}){let t=Bs(e);if(!Mee(e)){let n=oN(),r=await qt(n.discoveryPath);if(r?.url)return r.url}return qo(t.host,t.port,t.pathname)}async function iN(e){return await new Promise((t,n)=>{(async()=>{let r=new URL(e),o=await Lee(r);r.hash="";let i=new WebSocket(r.toString(),o?[`${Pee}${o}`]:void 0),s=new Map,a=0;i.addEventListener("open",()=>{t({send(d){let l=d.requestId??`hub-client-${++a}`;return new Promise((c,u)=>{s.set(l,{resolve:c,reject:u});let h={kind:"command",envelope:{...d,requestId:l}};i.send(JSON.stringify(h))})},close(){i.close()}})}),i.addEventListener("message",(d)=>{let l=JSON.parse(String(d.data));if(l.kind==="reply"&&l.envelope.requestId){let c=s.get(l.envelope.requestId);if(c)s.delete(l.envelope.requestId),c.resolve(l.envelope)}}),i.addEventListener("close",()=>{for(let d of s.values())d.reject(Error("Hub connection closed"));s.clear()}),i.addEventListener("error",(d)=>{n(Cee(d,e))})})().catch(n)})}async function gKe(e){try{return(await iN(e)).close(),!0}catch{return!1}}async function yKe(e,t){let n=await Nee(e),r=await iN(n);try{return await r.send({version:t.version??"v1",clientId:t.clientId??"hub-client",...t})}finally{r.close()}}import{existsSync as Dee}from"node:fs";import{isHubDaemonProcess as $ee,resolveClineBuildEnv as Fee}from"@cerebriline/shared";var Uee=1e4,Bee="CLINE_HUB_BUILD_WATCH_INTERVAL_MS";function Hee(){let e=Number(process.env[Bee]);return Number.isFinite(e)&&e>0?e:Uee}async function Wee(e,t){try{let n=await Fd(e.url,t);return{...e,activeSessionCount:n.activeSessionCount,participantClientCount:n.participantClientCount}}catch{return e}}function jee(){return Fee()==="production"?to():Er()}function qee(e){try{return Dee(`${e}.lock`)}catch{return!1}}async function zee(){let e=jee();if(qee(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 Wee(i("outdated_hub"),t.authToken);return i("build_mismatch")}function xKe(e){if($ee()||process.env.CLINE_HUB_PORT?.trim())return()=>{};let t=e.intervalMs??Hee(),n,r,o=!1,i=setInterval(()=>{if(o)return;o=!0,zee().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 sN(e,t){return e.error?.message??`hub command failed: ${t}`}function Kee(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 aN(e){let t=e?.sessionId;return typeof t==="string"&&t.trim()?t.trim():void 0}function Gee(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 Vee(e){let t=MT(e.payload);if(e.event==="schedule.execution_completed")return{sessionId:e.sessionId?.trim()||aN(t)||"",eventType:"schedule.execution.completed",payload:t};if(e.event==="schedule.execution_failed")return{sessionId:e.sessionId?.trim()||aN(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:Kee(e.payload)};case"run.completed":return{sessionId:n,eventType:"runtime.chat.completed",payload:t};default:return}}class Yee{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(sN(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(sN(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=Gee(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=Vee(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 Xee{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 yBe}from"@cerebriline/llms";import{existsSync as S1e,readdirSync as x1e}from"node:fs";import{readFile as _1e}from"node:fs/promises";import{homedir as E1e}from"node:os";import{isAbsolute as LY,join as Ei,resolve as f0}from"node:path";import{onXollamaSideCall as A1e,releasePolykvSwarmsOf as CY}from"@cerebriline/llms";import{applyPromptTemplateToTools as R1e,captureSdkError as vr,createSessionId as I1e,isLikelyAuthError as C1e,normalizeUserInput as P1e}from"@cerebriline/shared";import{setHomeDirIfUnset as M1e}from"@cerebriline/shared/storage";import{decodeJwtPayload as zte,getClineEnvironmentConfig as IN}from"@cerebriline/shared";import{decodeJwtPayload as rte,getClineEnvironmentConfig as ote}from"@cerebriline/shared";import{createHash as Jee}from"node:crypto";var Qee;function Un(e){if(typeof e!=="string"||e.length===0)return"unset";return Jee("sha256").update(e).digest("hex").slice(0,8)}function ct(e){try{Qee?.debug(e)}catch{}}function Zee(){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??ete,i=Zee(),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 ete=`<!DOCTYPE html>
324
324
  <html lang="en">
@@ -1576,7 +1576,7 @@ ${i}${e.instructions}
1576
1576
 
1577
1577
  ${s}`:o.instructions}})}}}function Gv(e){return e.trim().replace(/^\/+/,"").toLowerCase()}function c5(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 AP(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)=>c5(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(c5(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 u5{watcher;ready;stopped=!1;constructor(e){this.watcher=i5(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 d5(e,this.watcher,t)}hasConfiguredSkills(e){return Nm(this.watcher,e).some((t)=>!t.disabled)}createSkillsExecutor(e){return EP(this.watcher,(this.ready??Promise.resolve()).catch(()=>{}),e)}createExtension(e){return l5({...e,watcher:this.watcher,watcherReady:(this.ready??Promise.resolve()).catch(()=>{})})}}function iu(e){return new u5(e)}import{spawn as MFe}from"node:child_process";import{mkdir as OFe}from"node:fs/promises";import{StringDecoder as U5}from"node:string_decoder";import{formatMcpTimeoutErrorMessage as LFe,isMcpTimeoutConfigured as B5}from"@cerebriline/shared";import{Client as NFe}from"@modelcontextprotocol/sdk/client/index.js";import{randomUUID as TFe}from"node:crypto";import{UnauthorizedError as O5}from"@modelcontextprotocol/sdk/client/auth.js";import{Client as Emt}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as SFe,SseError as xFe}from"@modelcontextprotocol/sdk/client/sse.js";import{StreamableHTTPClientTransport as _Fe}from"@modelcontextprotocol/sdk/client/streamableHttp.js";BP();import{formatMcpTimeoutErrorMessage as bFe,resolveMcpTimeoutSeconds as vFe}from"@cerebriline/shared";import{ErrorCode as kFe,McpError as P5}from"@modelcontextprotocol/sdk/types.js";function Jv(e){return vFe(e)*1000}function Bm(e,t,n){if(!(e instanceof P5)||e.code!==kFe.RequestTimeout)return e;return new P5(e.code,bFe(t,n),e.data)}var EFe=new Set([301,302,303,307,308]),M5=20,AFe=new Set(["authorization","cookie","proxy-authorization"]),RFe=new Set(["mcp-protocol-version","mcp-session-id"]);function IFe(e){if(!e.headers||!e.restrictConfiguredHeadersToOrigin)return e.headers;let t=Object.entries(e.headers).filter(([n])=>{let r=n.toLowerCase();if(RFe.has(r))return!1;return r!=="authorization"||!e.oauthProvider});return t.length>0?Object.fromEntries(t):void 0}function CFe(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)||AFe.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(!EFe.has(p.status))return p;if(h>=M5)throw await p.body?.cancel().catch(()=>{return}),Error(`MCP endpoint exceeded ${M5} 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 PFe(e){return{client_name:"Cerebriline",redirect_uris:[e],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none"}}function HP(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 WP(e){let t={};try{t=$P(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 FP(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 PFe(t.redirectUrl??e.redirectUrl)},state:()=>(r=TFe(),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 L5(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=IFe({headers:t.headers,oauthProvider:e.oauthProvider,restrictConfiguredHeadersToOrigin:e.restrictConfiguredHeadersToOrigin}),r=n?{headers:n}:void 0,o=e.restrictConfiguredHeadersToOrigin&&n?CFe({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 O5("MCP server requires authorization");return d};if(t.type==="sse")return new SFe(new URL(t.url),{authProvider:e.oauthProvider,requestInit:r,eventSourceInit:{fetch:(s,a)=>(o??globalThis.fetch)(s,a)},fetch:i});return new _Fe(new URL(t.url),{authProvider:e.oauthProvider,requestInit:r,fetch:i})}function jP(e){return e instanceof O5||e instanceof xFe&&e.code===401}var DFe="2024-11-05",H5=1e4,$Fe=1e4,N5="http://127.0.0.1:1456/mcp/oauth/callback",D5=250,qP=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 FFe(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 $5(e){return Buffer.from(`${JSON.stringify(e)}
1579
+ ${a}`:i.instructions}})}})}}class u5{watcher;ready;stopped=!1;constructor(e){this.watcher=i5(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 d5(e,this.watcher,t)}hasConfiguredSkills(e){return Nm(this.watcher,e).some((t)=>!t.disabled)}createSkillsExecutor(e){return EP(this.watcher,(this.ready??Promise.resolve()).catch(()=>{}),e)}createExtension(e){return l5({...e,watcher:this.watcher,watcherReady:(this.ready??Promise.resolve()).catch(()=>{})})}}function iu(e){return new u5(e)}import{spawn as MFe}from"node:child_process";import{mkdir as OFe}from"node:fs/promises";import{StringDecoder as U5}from"node:string_decoder";import{formatMcpTimeoutErrorMessage as LFe,isMcpTimeoutConfigured as B5}from"@cerebriline/shared";import{Client as NFe}from"@modelcontextprotocol/sdk/client/index.js";import{randomUUID as TFe}from"node:crypto";import{UnauthorizedError as O5}from"@modelcontextprotocol/sdk/client/auth.js";import{Client as Emt}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as SFe,SseError as xFe}from"@modelcontextprotocol/sdk/client/sse.js";import{StreamableHTTPClientTransport as _Fe}from"@modelcontextprotocol/sdk/client/streamableHttp.js";BP();import{formatMcpTimeoutErrorMessage as bFe,resolveMcpTimeoutSeconds as vFe}from"@cerebriline/shared";import{ErrorCode as kFe,McpError as P5}from"@modelcontextprotocol/sdk/types.js";function Jv(e){return vFe(e)*1000}function Bm(e,t,n){if(!(e instanceof P5)||e.code!==kFe.RequestTimeout)return e;return new P5(e.code,bFe(t,n),e.data)}var EFe=new Set([301,302,303,307,308]),M5=20,AFe=new Set(["authorization","cookie","proxy-authorization"]),RFe=new Set(["mcp-protocol-version","mcp-session-id"]);function IFe(e){if(!e.headers||!e.restrictConfiguredHeadersToOrigin)return e.headers;let t=Object.entries(e.headers).filter(([n])=>{let r=n.toLowerCase();if(RFe.has(r))return!1;return r!=="authorization"||!e.oauthProvider});return t.length>0?Object.fromEntries(t):void 0}function CFe(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)||AFe.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(!EFe.has(p.status))return p;if(h>=M5)throw await p.body?.cancel().catch(()=>{return}),Error(`MCP endpoint exceeded ${M5} 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 PFe(e){return{client_name:"Cerebriline",redirect_uris:[e],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none"}}function HP(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 WP(e){let t={};try{t=$P(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 FP(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 PFe(t.redirectUrl??e.redirectUrl)},state:()=>(r=TFe(),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(d)=>{await s((l)=>{let c=e.clientInformation,u=c!==void 0&&!Qv(l.clientInformation,c);return{...l,...c?{clientInformation:c}:{},...u||d?.forgetTokens?{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 L5(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=IFe({headers:t.headers,oauthProvider:e.oauthProvider,restrictConfiguredHeadersToOrigin:e.restrictConfiguredHeadersToOrigin}),r=n?{headers:n}:void 0,o=e.restrictConfiguredHeadersToOrigin&&n?CFe({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 O5("MCP server requires authorization");return d};if(t.type==="sse")return new SFe(new URL(t.url),{authProvider:e.oauthProvider,requestInit:r,eventSourceInit:{fetch:(s,a)=>(o??globalThis.fetch)(s,a)},fetch:i});return new _Fe(new URL(t.url),{authProvider:e.oauthProvider,requestInit:r,fetch:i})}function jP(e){return e instanceof O5||e instanceof xFe&&e.code===401}var DFe="2024-11-05",H5=1e4,$Fe=1e4,N5="http://127.0.0.1:1456/mcp/oauth/callback",D5=250,qP=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 FFe(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 $5(e){return Buffer.from(`${JSON.stringify(e)}
1580
1580
  `,"utf8")}function F5(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 zP{buffer="";decoder=new U5("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 u5{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 KP{buffer="";decoder=new U5("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 W5{registration;process;processClose;nextRequestId=1;pending=new Map;framedParser=new zP;newlineParser=new KP;stderrBuffer="";stdinFailure;stdinFailureTimer;connected=!1;protocolMode="newline";requestTimeoutMs;connectAttemptTimeoutMs;constructor(e){this.registration=e,this.requestTimeoutMs=Jv(e.timeoutSeconds),this.connectAttemptTimeoutMs=B5(e.timeoutSeconds)?this.requestTimeoutMs:H5}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:DFe,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(()=>{}),FFe(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 OFe(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,qP))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,D5))return;if(e.kill(),await Zv(t,qP))return;if(e.kill("SIGKILL"),!await Zv(t,qP))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 zP,this.newlineParser=new KP,this.stderrBuffer="",this.stdinFailure=void 0,this.clearStdinFailureTimer(),this.protocolMode=e;let n=process.platform==="win32"?{windowsHide:!0,shell:!0}:{},r=MFe(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(()=>{})},D5),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"?F5(s):$5(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(LFe(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"?F5(r):$5(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 j5{registration;options;client;authContext;requestTimeoutMs;connectAttemptTimeoutMs;constructor(e,t){this.registration=e;this.options=t;this.requestTimeoutMs=Jv(e.timeoutSeconds),this.connectAttemptTimeoutMs=B5(e.timeoutSeconds)?this.requestTimeoutMs:$Fe}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=WP({settingsPath:this.options.settingsPath,serverName:this.registration.name,redirectUrl:this.registration.oauth?.redirectUrl??N5,clientInformation:HP(this.registration.oauthClient)});this.authContext=e;let t=await e.provider.tokens()?e.provider:void 0,n;try{n=new NFe({name:this.options.clientName?.trim()||"@cerebriline/core",version:this.options.clientVersion?.trim()||"0.0.0"});let r=L5({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=jP(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??WP({settingsPath:this.options.settingsPath,serverName:this.registration.name,redirectUrl:this.registration.oauth?.redirectUrl??N5,clientInformation:HP(this.registration.oauthClient)}),n=Bm(e,this.registration.name,this.requestTimeoutMs),r=jP(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 W5(t):new j5(t,e)}BP();import{isMcpTimeoutConfigured as q5,resolveMcpTimeoutSeconds as z5}from"@cerebriline/shared";var UFe=5000;function br(){return Date.now()}function BFe(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??UFe}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=q5(t.registration.timeoutSeconds)!==q5(e.timeoutSeconds)||z5(t.registration.timeoutSeconds)!==z5(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=BFe(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 HFe}from"node:crypto";var K5=64,WFe=/[^a-zA-Z0-9_-]+/g,G5=8,jFe=1,qFe="mcp_tool";function zFe(e){return HFe("sha1").update(e).digest("hex").slice(0,G5)}function KFe(e){return e.replace(WFe,"_")}var nk=({serverName:e,toolName:t})=>{let n=`${e}__${t}`,r=KFe(n);if(r===n&&n.length<=K5)return n;let o=zFe(n),i=K5-jFe-G5;return`${r.slice(0,i)||qFe}_${o}`};import{createTool as GFe}from"@cerebriline/shared";function VFe(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 GP(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 GFe({name:o,resultPolicy:"cache-oversized",description:VFe(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 Ift}from"@cerebriline/shared";import{DEFAULT_LIBRARY_SETTINGS as vft}from"@cerebriline/shared";import{resolveClineDataDir as Tft}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 YFe=2000;function XFe(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 V5(e){let t=Math.max(0,e.holdRetryMs??YFe),n=e.sleep??XFe,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 iUe}from"node:fs/promises";import{createTool as sUe,validateWithZod as aUe,zodToJsonSchema as dUe}from"@cerebriline/shared";import{resolveAgentConfigSearchPaths as lUe}from"@cerebriline/shared/storage";import{z as Dn}from"zod";import{mkdir as JFe,writeFile as QFe}from"node:fs/promises";import{basename as ZFe,dirname as eUe,join as tUe,resolve as Y5}from"node:path";import{agentFileName as nUe,renderAgentFile as rUe,validateAgentFields as oUe}from"@cerebriline/shared";async function X5(e){oUe(e.agent);let t=tUe(e.directory,nUe(e.agent.name));if(eUe(Y5(t))!==Y5(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 ${ZFe(t)}. Pass overwrite to replace it, or choose another name.`);return await JFe(e.directory,{recursive:!0}),await QFe(t,rUe(e.agent),"utf-8"),{path:t,overwritten:n}}var J5=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 cUe(e){try{return await iUe(e),!0}catch{return!1}}function Q5(e){return sUe({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:dUe(J5),execute:async(n)=>{let r=aUe(J5,n),o=r.scope??"workspace",i=lUe(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 X5({directory:d,agent:l,overwrite:r.overwrite,fileExists:cUe});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 uUe,zodToJsonSchema as hUe}from"@cerebriline/shared";var pUe=new Set(["check_file","ask_lsp","list_files"]),Z5="ask_question";function mUe(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 GP(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 GFe({name:o,resultPolicy:"cache-oversized",description:VFe(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 Pft}from"@cerebriline/shared";import{DEFAULT_LIBRARY_SETTINGS as Tft}from"@cerebriline/shared";import{resolveClineDataDir as xft}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 YFe=2000;function XFe(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 V5(e){let t=Math.max(0,e.holdRetryMs??YFe),n=e.sleep??XFe,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 iUe}from"node:fs/promises";import{createTool as sUe,validateWithZod as aUe,zodToJsonSchema as dUe}from"@cerebriline/shared";import{resolveAgentConfigSearchPaths as lUe}from"@cerebriline/shared/storage";import{z as Dn}from"zod";import{mkdir as JFe,writeFile as QFe}from"node:fs/promises";import{basename as ZFe,dirname as eUe,join as tUe,resolve as Y5}from"node:path";import{agentFileName as nUe,renderAgentFile as rUe,validateAgentFields as oUe}from"@cerebriline/shared";async function X5(e){oUe(e.agent);let t=tUe(e.directory,nUe(e.agent.name));if(eUe(Y5(t))!==Y5(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 ${ZFe(t)}. Pass overwrite to replace it, or choose another name.`);return await JFe(e.directory,{recursive:!0}),await QFe(t,rUe(e.agent),"utf-8"),{path:t,overwritten:n}}var J5=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 cUe(e){try{return await iUe(e),!0}catch{return!1}}function Q5(e){return sUe({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:dUe(J5),execute:async(n)=>{let r=aUe(J5,n),o=r.scope??"workspace",i=lUe(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 X5({directory:d,agent:l,overwrite:r.overwrite,fileExists:cUe});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 uUe,zodToJsonSchema as hUe}from"@cerebriline/shared";var pUe=new Set(["check_file","ask_lsp","list_files"]),Z5="ask_question";function mUe(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 fUe(){return{name:Z5,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:hUe(ia),lifecycle:{completesRun:!0},retryable:!1,maxRetries:0,execute:async(e)=>{let t=uUe(ia,e);return mUe(t.question,t.options)}}}function Wm(e,t){let n=(t??[]).filter((i)=>pUe.has(i.name)),r=new Set(n.map((i)=>i.name));return[...e.filter((i)=>!r.has(i.name)),...n].map((i)=>i.name===Z5?fUe():i)}import{appendFileSync as _Ue,existsSync as lu,mkdirSync as iY,readdirSync as EUe,readFileSync as YP,renameSync as sY,statSync as AUe,writeFileSync as aY}from"node:fs";import{join as XP}from"node:path";import{resolveTeamDataDir as RUe}from"@cerebriline/shared/storage";import{existsSync as gUe,mkdirSync as yUe}from"node:fs";import{join as wUe}from"node:path";import{safeJsonParse as oY}from"@cerebriline/shared";import{loadSqliteDb as bUe,nowIso as au}from"@cerebriline/shared/db";import{resolveDbDataDir as vUe}from"@cerebriline/shared/storage";function kUe(){return vUe()}function TUe(e){let t=oY(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 eY=ps,VP=2000,SUe=2592000000,tY=["agent_event","run_progress"],nY=2,xUe=["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 oY(e)??t}var qm=(e)=>typeof e==="string"?e:"";function rY(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??kUe(),this.retentionPerTeam=e.eventRetentionPerTeam??VP,this.retentionMs=e.eventRetentionMs??SUe}init(){this.getRawDb()}close(){this.db?.close?.(),this.db=void 0}ensureTeamDir(){if(!gUe(this.teamDirPath))yUe(this.teamDirPath,{recursive:!0});return this.teamDirPath}dbPath(){return wUe(this.ensureTeamDir(),"teams.db")}getRawDb(){if(this.db)return this.db;let e=bUe(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 GP(e){let t=await e.pr
1758
1758
  `).filter(Boolean),r=[],o=0;for(let s=n.length-1;s>=0&&r.length<VP;s--){let a=n[s];if(o+=Buffer.byteLength(a,"utf8")+1,o>dY/2&&r.length>0)break;r.push(a)}r.reverse();let i=`${e}.tmp`;aY(i,`${r.join(`
1759
1759
  `)}
1760
1760
  `,"utf8"),sY(i,e)}persistRuntime(e,t,n){this.ensureTeamSubdir(e);let r={version:1,updatedAt:lY(),teamState:{...t,runs:t.runs.map((s)=>({...s,result:Lo(s.result)}))},teammates:n},o=this.statePath(e),i=`${o}.tmp`;aY(i,`${JSON.stringify(r,null,2)}
1761
- `,"utf8"),sY(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))iY(this.teamDirPath,{recursive:!0});return this.teamDirPath}ensureTeamSubdir(e){let t=XP(this.ensureTeamDir(),wn(e));if(!lu(t))iY(t,{recursive:!0});return t}statePath(e){return XP(this.ensureTeamDir(),wn(e),"state.json")}historyPath(e){return XP(this.ensureTeamDir(),wn(e),"task-history.jsonl")}readEnvelope(e){let t=this.statePath(e);if(!lu(t))return;try{let n=JSON.parse(YP(t,"utf8"));if(n?.version===1&&n.teamState)return n}catch{}return}}function cY(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 IUe,existsSync as JP}from"node:fs";import{join as QP}from"node:path";function ak(e){if(!e)return;if(process.platform==="win32"){let t=QP(e,"cerebriline-sandbox.exe"),n=QP(e,"hook.dll");if(!JP(t)||!JP(n))return;return{launcher:t,hook:n,platforms:["win32"]}}if(process.platform==="linux")return uY(e,"","linux");if(process.platform==="darwin")return uY(e,"darwin-","darwin");return}function uY(e,t,n){let r={x64:"x64",arm64:"arm64"}[process.arch],i=(r?[`cerebriline-sandbox-${t}${r}`,"cerebriline-sandbox"]:["cerebriline-sandbox"]).map((s)=>QP(e,s)).find(JP);if(!i)return;try{IUe(i,493)}catch{}return{launcher:i,hook:i,platforms:[n]}}var CUe=300,PUe=60000,hY=5000;class ZP{opts;pendingEvents=[];teammatesDirty=!1;timer;lastFlushAt=0;disposed=!1;constructor(e){this.opts={batchMs:CUe,telemetryFlushMs:PUe,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>hY?s.slice(-hY):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 DUe(e,t)}function mY(e,t){let n=t?.["*"]??{},r=t?.[e]??{};return{...n,...r}.enabled!==!1}function UUe(e,t){return e.filter((n)=>mY(n.name,t))}function ck(e,t){return Mi(UUe(e,t))}function BUe(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 HUe(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 WUe={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 jUe(e){let t=e.trim().toLowerCase();return WUe[t]??t}function qUe(e,t){if(t.tools===void 0)return e;let n=new Set(t.tools.map(jUe));if(t.skills!==void 0)n.add("skills");return e.filter((r)=>n.has(r.name))}function zUe(){return`team-${FUe(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&&mY(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 KUe(e){return uk(e.cwd,e.providerId,e.mode,e.modelId,e.toolRoutingRules,e.toolPolicies,GUe,e.toolExecutors).some((t)=>t.name==="skills")}var GUe=async()=>"";async function VUe(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 UP(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)=>GP({serverName:u.name,provider:i,timeoutMs:$Ue(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 e0(e){return`teammate:${e}`}function YUe(e){return{handBack:(t)=>e().handBack(e0(t),t),release:async(t)=>{await e().close(e0(t),t)}}}function XUe(e,t){if(!e)return;try{e.cancelOutstandingWork(`${t0}${t}`)}catch{}for(let n of e.getTeammateIds())try{e.shutdownTeammate(n,`${t0}${t}`)}catch{}}var t0="runtime_shutdown:";function JUe(e){if(e===void 0)return!1;if(e.startsWith(t0))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 QUe(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 ZUe(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 n0{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=ZUe(t),m=[];if(p.enableTools&&p.mode!=="yolo"&&sT("web_search")&&pY({providerId:t.providerId,modelId:t.modelId},"web_search"))m.push({name:"web_search"});if(p.enableTools&&pY({providerId:t.providerId,modelId:t.modelId},"image_generation"))m.push({name:"image_generation",outputFormat:"png"});let f=t.workspaceRoot??t.cwd,g=HUe(e.toolPolicies??t.toolPolicies,t.enableExtractDocument===!0?t.providerConfig?.tools?.disabled:[...t.providerConfig?.tools?.disabled??[],le.EXTRACT_DOCUMENT]),y=BUe(t.providerConfig?.tools),w=$s(),k=[],b=t.teamName?.trim()||zUe(),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=AP([D,Y])}if(D)await D.start().catch(()=>{});let V=p.enableTools&&T&&Boolean(D)&&D?.hasConfiguredSkills(t.skills)===!0&&KUe({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),A3({enabled:t.leadSandboxConfine===!0,workspaceRoot:t.workspaceRoot??t.cwd,binaries:ak(t.sandboxBinariesDir),tempRoot:OUe(MUe(),"cerebriline-sandbox-tmp")})));let Y=C?e.agentPluginMcpServers:void 0;if(!p.disableMcpSettingsTools||Y?.length){let Q=await VUe({logger:t.logger,includeSettings:!p.disableMcpSettingsTools,agentPluginServers:Y});k.push(...Q.tools),K=Q.shutdown}}let M,X=p.enableAgentTeams?cY():void 0,oe=X?.loadRuntime(v),H=oe?.state,J=oe?.teammates??[],he=new Map(J.map((Y)=>[Y.agentId,Y])),se=X?new ZP({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)?V5({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([Q5({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 qUe(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:YUe(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"&&!JUe(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(e0(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)=>Iz.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?nz(t.sessionId):void 0,Jr=Ze&&pn?()=>Ze()??pn():Ze??pn;NUe(t.toolIntentGuard!==!1);let Sr={...er?{requireCompletionTool:!0}:{},...Jr?{completionGuard:Jr}:{},maxNoToolCallNudges:LUe,...t.strongNudges===!1?{strongNudges:!1}:{}},xr=QUe({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)=>{XUe(M,Y),se?.dispose(),X?.close(),this.teamRuntimeEntries.delete(re),await K?.();for(let Q of W)Q.stop()}}}}import{normalizeUserInput as e1e}from"@cerebriline/shared";import{nanoid as t1e}from"nanoid";class gY{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:e1e(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),r1e(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"?bq(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()}_${t1e(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&&fY(n))return{entry:n,prompts:Qn(e)}}}shiftNext(e){for(;;){let t=e.pendingPrompts.shift();if(!t||fY(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 r0{deps;service=new gY;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(n1e(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 fY(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 n1e(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 r1e(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 syt,normalizeUserInput as ayt}from"@cerebriline/shared";import{resolveSessionDataDir as lyt}from"@cerebriline/shared/storage";import{existsSync as o0}from"node:fs";import{readFile as o1e}from"node:fs/promises";import{join as i1e}from"node:path";class i0{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 yY(e,t,n){let r=e?.trim();if(r&&o0(r))return r;let o=n?.trim();if(o){let i=i1e(o,t,`${t}.messages.json`);if(o0(i))return i}return r||void 0}async function cu(e){let t=e?.trim();if(!t||!o0(t))return[];try{let n=(await o1e(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 s0(e){return e?{...e}:void 0}async function wY(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 bY(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===a0(r.agent))){let a={agentId:a0(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:a0(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 a0(e){return e.getAgentId()}function d0(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 l0(e,t){let n=e[t];return typeof n==="function"?n:null}async function vY(e,t,...n){let r=l0(e,t);if(!r)throw Error(`session service method not available: ${t}`);return Promise.resolve(r.apply(e,n))}async function kY(e,t,...n){let r=l0(e,t);if(!r)return;await Promise.resolve(r.apply(e,n))}async function TY(e,t,...n){let r=l0(e,t);if(!r)return;return await Promise.resolve(r.apply(e,n))}import{clearPolykvSession as mk,releasePolykvAgent as c0,setPolykvSession as s1e}from"@cerebriline/llms";function xY(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"),sY(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))iY(this.teamDirPath,{recursive:!0});return this.teamDirPath}ensureTeamSubdir(e){let t=XP(this.ensureTeamDir(),wn(e));if(!lu(t))iY(t,{recursive:!0});return t}statePath(e){return XP(this.ensureTeamDir(),wn(e),"state.json")}historyPath(e){return XP(this.ensureTeamDir(),wn(e),"task-history.jsonl")}readEnvelope(e){let t=this.statePath(e);if(!lu(t))return;try{let n=JSON.parse(YP(t,"utf8"));if(n?.version===1&&n.teamState)return n}catch{}return}}function cY(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 IUe,existsSync as JP}from"node:fs";import{join as QP}from"node:path";function ak(e){if(!e)return;if(process.platform==="win32"){let t=QP(e,"cerebriline-sandbox.exe"),n=QP(e,"hook.dll");if(!JP(t)||!JP(n))return;return{launcher:t,hook:n,platforms:["win32"]}}if(process.platform==="linux")return uY(e,"","linux");if(process.platform==="darwin")return uY(e,"darwin-","darwin");return}function uY(e,t,n){let r={x64:"x64",arm64:"arm64"}[process.arch],i=(r?[`cerebriline-sandbox-${t}${r}`,"cerebriline-sandbox"]:["cerebriline-sandbox"]).map((s)=>QP(e,s)).find(JP);if(!i)return;try{IUe(i,493)}catch{}return{launcher:i,hook:i,platforms:[n]}}var CUe=300,PUe=60000,hY=5000;class ZP{opts;pendingEvents=[];teammatesDirty=!1;timer;lastFlushAt=0;disposed=!1;constructor(e){this.opts={batchMs:CUe,telemetryFlushMs:PUe,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>hY?s.slice(-hY):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 DUe(e,t)}function mY(e,t){let n=t?.["*"]??{},r=t?.[e]??{};return{...n,...r}.enabled!==!1}function UUe(e,t){return e.filter((n)=>mY(n.name,t))}function ck(e,t){return Mi(UUe(e,t))}function BUe(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 HUe(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 WUe={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 jUe(e){let t=e.trim().toLowerCase();return WUe[t]??t}function qUe(e,t){if(t.tools===void 0)return e;let n=new Set(t.tools.map(jUe));if(t.skills!==void 0)n.add("skills");return e.filter((r)=>n.has(r.name))}function zUe(){return`team-${FUe(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&&mY(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 KUe(e){return uk(e.cwd,e.providerId,e.mode,e.modelId,e.toolRoutingRules,e.toolPolicies,GUe,e.toolExecutors).some((t)=>t.name==="skills")}var GUe=async()=>"";async function VUe(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 UP(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)=>GP({serverName:u.name,provider:i,timeoutMs:$Ue(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 e0(e){return`teammate:${e}`}function YUe(e){return{handBack:(t)=>e().handBack(e0(t),t),release:async(t)=>{await e().close(e0(t),t)}}}function XUe(e,t){if(!e)return;try{e.cancelOutstandingWork(`${t0}${t}`)}catch{}for(let n of e.getTeammateIds())try{e.shutdownTeammate(n,`${t0}${t}`)}catch{}}var t0="runtime_shutdown:";function JUe(e){if(e===void 0)return!1;if(e.startsWith(t0))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 QUe(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 ZUe(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 n0{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=ZUe(t),m=[];if(p.enableTools&&p.mode!=="yolo"&&sT("web_search")&&pY({providerId:t.providerId,modelId:t.modelId},"web_search"))m.push({name:"web_search"});if(p.enableTools&&pY({providerId:t.providerId,modelId:t.modelId},"image_generation"))m.push({name:"image_generation",outputFormat:"png"});let f=t.workspaceRoot??t.cwd,g=HUe(e.toolPolicies??t.toolPolicies,t.enableExtractDocument===!0?t.providerConfig?.tools?.disabled:[...t.providerConfig?.tools?.disabled??[],le.EXTRACT_DOCUMENT]),y=BUe(t.providerConfig?.tools),w=$s(),k=[],b=t.teamName?.trim()||zUe(),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=AP([D,Y])}if(D)await D.start().catch(()=>{});let V=p.enableTools&&T&&Boolean(D)&&D?.hasConfiguredSkills(t.skills)===!0&&KUe({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),A3({enabled:t.leadSandboxConfine===!0,workspaceRoot:t.workspaceRoot??t.cwd,binaries:ak(t.sandboxBinariesDir),tempRoot:OUe(MUe(),"cerebriline-sandbox-tmp")})));let Y=C?e.agentPluginMcpServers:void 0;if(!p.disableMcpSettingsTools||Y?.length){let Q=await VUe({logger:t.logger,includeSettings:!p.disableMcpSettingsTools,agentPluginServers:Y});k.push(...Q.tools),K=Q.shutdown}}let M,X=p.enableAgentTeams?cY():void 0,oe=X?.loadRuntime(v),H=oe?.state,J=oe?.teammates??[],he=new Map(J.map((Y)=>[Y.agentId,Y])),se=X?new ZP({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)?V5({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([Q5({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 qUe(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:YUe(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"&&!JUe(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(e0(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)=>Iz.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?nz(t.sessionId):void 0,Jr=Ze&&pn?()=>Ze()??pn():Ze??pn;NUe(t.toolIntentGuard!==!1);let Sr={...er?{requireCompletionTool:!0}:{},...Jr?{completionGuard:Jr}:{},maxNoToolCallNudges:LUe,...t.strongNudges===!1?{strongNudges:!1}:{}},xr=QUe({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)=>{XUe(M,Y),se?.dispose(),X?.close(),this.teamRuntimeEntries.delete(re),await K?.();for(let Q of W)Q.stop()}}}}import{normalizeUserInput as e1e}from"@cerebriline/shared";import{nanoid as t1e}from"nanoid";class gY{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:e1e(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),r1e(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"?bq(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()}_${t1e(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&&fY(n))return{entry:n,prompts:Qn(e)}}}shiftNext(e){for(;;){let t=e.pendingPrompts.shift();if(!t||fY(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 r0{deps;service=new gY;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(n1e(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 fY(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 n1e(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 r1e(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 dyt,normalizeUserInput as lyt}from"@cerebriline/shared";import{resolveSessionDataDir as uyt}from"@cerebriline/shared/storage";import{existsSync as o0}from"node:fs";import{readFile as o1e}from"node:fs/promises";import{join as i1e}from"node:path";class i0{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 yY(e,t,n){let r=e?.trim();if(r&&o0(r))return r;let o=n?.trim();if(o){let i=i1e(o,t,`${t}.messages.json`);if(o0(i))return i}return r||void 0}async function cu(e){let t=e?.trim();if(!t||!o0(t))return[];try{let n=(await o1e(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 s0(e){return e?{...e}:void 0}async function wY(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 bY(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===a0(r.agent))){let a={agentId:a0(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:a0(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 a0(e){return e.getAgentId()}function d0(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 l0(e,t){let n=e[t];return typeof n==="function"?n:null}async function vY(e,t,...n){let r=l0(e,t);if(!r)throw Error(`session service method not available: ${t}`);return Promise.resolve(r.apply(e,n))}async function kY(e,t,...n){let r=l0(e,t);if(!r)return;await Promise.resolve(r.apply(e,n))}async function TY(e,t,...n){let r=l0(e,t);if(!r)return;return await Promise.resolve(r.apply(e,n))}import{clearPolykvSession as mk,releasePolykvAgent as c0,setPolykvSession as s1e}from"@cerebriline/llms";function xY(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);a1e(r,d,l)}e.invokeBackendOptional("handleSubAgentEnd",n,r)},onSubAgentSettled:async(r)=>{if(r.toolCallId)await e.sandboxes?.close(r.toolCallId,r.name)}}}function a1e(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 u0(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,...xY(c,r,_a(t))}),t.extraTools):[];if(t.enableSpawnAgent)u.push(u0(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 d1e(e,t){if(e&&typeof e==="object")e.handback=t}function SY(e,t){let n=t&&typeof t==="object"?t.handback:void 0;if(n)e?.handedBack("reducer",n)}function _Y(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,...xY(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)s1e(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 c0(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 c0(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(()=>[]);d1e(D??K,j??[])}mk(f),v(),b.dispose();let B=await c0(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 PD({sessionId:n,providerConfig:i,logger:t.logger});if(!u)return;return{poolId:u.poolId,release:u.borrowed?async()=>{return}:()=>MD({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 wBe(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 bBe(e){return e.mode==="plan"?"plan":e.mode==="yolo"?"yolo":"act"}function Mvt(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:yBe(r.provider),modelId:r.model,apiKey:r.apiKey?.trim()||void 0,cwd:i,workspaceRoot:r.workspaceRoot,systemPrompt:r.systemPrompt??"",mode:bBe(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:wBe(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 c9}from"@cerebriline/shared";function vBe(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 wBe(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 bBe(e){return e.mode==="plan"?"plan":e.mode==="yolo"?"yolo":"act"}function Lvt(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:yBe(r.provider),modelId:r.model,apiKey:r.apiKey?.trim()||void 0,cwd:i,workspaceRoot:r.workspaceRoot,systemPrompt:r.systemPrompt??"",mode:bBe(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:wBe(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 c9}from"@cerebriline/shared";function vBe(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 jY=120,k0="...";function T0(e){let t=e.trim();if(!t)return"";if(Buffer.byteLength(t,"utf8")<=jY)return t;let n=jY-Buffer.byteLength(k0,"utf8");if(n<=0)return k0;let r="";for(let o of t){if(Buffer.byteLength(r+o,"utf8")>n)break;r+=o}return`${r}${k0}`}async function qY(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?vBe(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:T0(i&&i.length>0?i:a.length>0?a:s),severity:"info"}}import{resolve as zje}from"node:path";import{CLINE_DEFAULT_MODEL_ID as Kje,captureSdkError as Ck,createSessionId as yM,HUB_CLIENT_TOOL_APPROVAL_CAPABILITY as Gje}from"@cerebriline/shared";import{isChatWorkspacePath as Vje}from"@cerebriline/shared/storage";function Jm(e){return!!e&&typeof e==="object"&&!Array.isArray(e)}function S0(e){let t=e?.trim();return t?t:void 0}function kBe(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 zY(e,t){return new Date(new Date(e).getTime()+Math.max(0,Math.floor(t))*1000).toISOString()}function KY(e,t){return new Date(new Date(e).getTime()-Math.max(0,Math.floor(t))*1000).toISOString()}function TBe(e,t){if(!e)return t;return new Date(e).getTime()>=new Date(t).getTime()?e:t}function SBe(e,t){let n=e.eventId.trim(),r=e.eventType.trim(),o=e.source.trim(),i=S0(e.subject),s=S0(e.dedupeKey)??`${r}:${o}:${i??n}`;return{eventId:n,eventType:r,source:o,subject:i,occurredAt:kBe(e.occurredAt,t),workspaceRoot:S0(e.workspaceRoot),payload:Jm(e.payload)?e.payload:void 0,attributes:Jm(e.attributes)?e.attributes:void 0,dedupeKey:s}}function x0(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 xBe(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=x0(n,t);if(r!==void 0)return r;if(e.attributes){let o=x0(e.attributes,t);if(o!==void 0)return o}if(e.payload)return x0(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 _Be(e,t){if(!t||Object.keys(t).length===0)return!0;return Object.entries(t).every(([n,r])=>wk(xBe(e,n),r))}class _0{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=SBe(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(!_Be(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=TBe(d.scheduledFor,zY(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:KY(n,i)}))return{reason:"dedupe_window"};let s=e.cooldownSeconds??0;if(s>0&&this.store.hasRecentEventRunForSpec({specId:e.specId,sinceIso:KY(n,s)}))return{reason:"cooldown"};return{run:this.store.enqueueRun({specId:e.specId,specRevision:e.revision,triggerKind:"event",triggerEventId:t.eventId,scheduledFor:o>0?zY(n,o):n}),reason:"dedupe_window"}}}import{existsSync as WBe,readdirSync as jBe,readFileSync as qBe,statSync as zBe}from"node:fs";import{relative as KBe}from"node:path";import{resolveCronSpecsDir as GBe}from"@cerebriline/shared/storage";import{createHash as EBe}from"node:crypto";import{stripUtf8Bom as ABe}from"@cerebriline/shared";import RBe from"yaml";function IBe(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 CBe(e){let t=ABe(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,LX(e.enabledAt,"enabledAt")??null,i),this.getAutomationPolicy(t)}}var hd={kind:"system",id:"file_reconciler"},ud={kind:"system",id:"task_manager"},$X={kind:"automation_policy",id:"global"},ef=new Set(["completed","failed","cancelled","interrupted"]),bWe=30000,vWe=250;function Bo(){return new Date().toISOString()}function FX(e){return typeof e==="string"&&e.trim()?e.trim():void 0}function UX(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 BX(e,t){let n=yWe(e,t);return n!==""&&!n.startsWith("..")&&!n.startsWith("/")}function tf(e){if(!e||!Z0(e))return!1;try{return fWe(e).isDirectory()}catch{return!1}}function J0(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 Q0(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 kWe(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 TWe(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 eM{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 X0({dbPath:e.dbPath}),this.globalSpecsDir=e.globalSpecsDir,this.watcherDebounceMs=Math.max(0,e.watcherDebounceMs??vWe),this.watchFiles=e.watchFiles!==!1,this.automationEnabled=e.automationEnabled!==!1,this.logger=e.logger??wWe,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()},bWe),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(),UX(e.expiresAt);let t=Ss(e),n={...e,...t},r=FX(n.taskId)??DX("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(Z0(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=TWe(n,e);UX(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&&BX(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&&(Z0(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&&J0(f.spec,n)!==Q0(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=FX(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 V0({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=gWe(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:DX("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(SX(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(J0(o,a)===Q0(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(kWe(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||!BX(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,$X,a.revision)}if(e!==this.automationPolicyGeneration)return;if(n.mode==="auto_start"&&this.runtime.isInteractiveClientAvailable?.()!==!0)continue;await this.runTask(a.taskId,$X,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||J0(r.spec,n)!==Q0(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 mWe.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 EWe}from"@cerebriline/shared";import{createSessionId as _We}from"@cerebriline/shared";function SWe(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 xWe(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:SWe(e.status),participants:t?[...t.participants.values()]:[],metadata:xWe(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:_We("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 tM(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 HX(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=EWe("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 WX(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 nM(e,t,n){let r=e.pendingApprovals.get(t);if(!r)return;return e.pendingApprovals.delete(t),r.resolve(n),{sessionId:r.sessionId}}function rM(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 jX(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=nM(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 IWe}from"@cerebriline/shared";function AWe(e){if(e instanceof Error)return{name:e.name,message:e.message,stack:e.stack};if(e===void 0)return;return e}var qX={debug:10,info:20,warn:30,error:40,silent:50};function RWe(){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(qX[e]<qX[RWe()])return;let r=JSON.stringify({ts:new Date().toISOString(),level:e,component:"hub",message:t,...Object.fromEntries(Object.entries(n).map(([o,i])=>[o,AWe(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 zX(e,t,n,r,o,i){let s=IWe("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 KX(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 GX(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 VX(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 CWe}from"@cerebriline/shared";function YX(e,t){let n=t.payload,r=n?.clientId?.trim()||t.clientId?.trim()||CWe("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 XX(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 JX(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 QX(e,t){return ie(t,{clients:[...e.clients.values()]})}import{buildConnectorConnectArgs as BWe,CONNECTOR_PLATFORMS as HWe,connectorChannelsFromPlatforms as WWe,listConnectorCatalog as jWe,mergeConnectorConnectArgs as qWe,shouldIncludeConnectorField as zWe}from"@cerebriline/shared";import{withConnectorStore as iM}from"@cerebriline/shared/db";import{existsSync as PWe,readdirSync as MWe,readFileSync as OWe}from"node:fs";import{join as ZX}from"node:path";import{listConnectorCatalog as LWe}from"@cerebriline/shared";import{resolveConnectorDataDir as NWe}from"@cerebriline/shared/storage";var eJ={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},DWe={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 $We(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch{return!1}}function FWe(e,t){let n;try{let d=JSON.parse(OWe(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||!$We(r))return;let i=DWe[e];if(!i)return;let s={};for(let d of i.required){let l=eJ[d](n);if(!l||typeof l==="string"&&!l.trim())return;s[d]=l}for(let d of i.optional){let l=eJ[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 oM(){let e=[];for(let{name:t}of LWe()){let n=ZX(NWe(),t);if(!PWe(n))continue;for(let r of MWe(n)){if(!r.endsWith(".json")||r.endsWith(".threads.json"))continue;let o=FWe(t,ZX(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 tSt,readConnectorCliLaunchSpec as nSt}from"@cerebriline/shared";import{ensureParentDir as oSt,resolveConnectorLogPath as iSt}from"@cerebriline/shared/storage";import{withConnectorStore as zTt}from"@cerebriline/shared/db";import{CLINE_CONNECTOR_STARTING_INSTANCE_ENV as VTt,CLINE_RUN_AS_HUB_DAEMON_ENV as YTt}from"@cerebriline/shared";var UWe;function tJ(){return UWe}function md(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function Ek(e){return typeof e==="string"?e.trim():void 0}function nJ(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 KWe(){return iM((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 sM(){return{available:WWe(),active:oM(),configured:KWe()}}function GWe(e,t){if(e.required&&!t[e.flag]?.trim())throw Error(`${e.label} is required`)}function VWe(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(!zWe(o,n))continue;GWe(o,n),r[o.flag]=n[o.flag]}return r}function YWe(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=HWe.find((u)=>u.id===t);if(!n)throw Error(`unknown connector channel: ${t}`);if(!new Set(jWe().map((u)=>u.name)).has(n.id))throw Error(`connector channel is not available: ${t}`);let o=nJ(e.values),i=VWe(n,o),s=md(e.security)?e.security:{},a=s.enabled===!0,d=nJ(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=BWe(n,i,l);return iM((u)=>u.upsertConfig({channel:t,type:t,values:i,security:l,updateConnectArgs:(h)=>qWe(n,h.connection.connectArgs,c,{replaceSecurityArgs:h.config?.security?.enabled===!0||l.enabled})})),sM()}function XWe(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 iM((n)=>n.deleteConfig(t)),sM()}function JWe(e){return Array.isArray(e)?e.filter((t)=>typeof t==="string"):[]}function aM(){let e=tJ();if(!e)throw Error("connector supervision is unavailable in this hub; start connectors with the CLI instead");return e}function rJ(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 QWe(e){let{channel:t,instanceId:n}=rJ(e),r=md(e)?e:{};return await aM().start({channel:t,instanceId:n,args:JWe(r.args),restart:r.restart===!0})}async function ZWe(e){let{channel:t,instanceId:n}=rJ(e),r=md(e)?e:{};return{stopped:await aM().stop({channel:t,instanceId:n,disableAutostart:r.disableAutostart!==!1}),channel:t,instanceId:n}}function eje(e){return e==="connector.configure"||e==="connector.delete_config"||e==="connector.start"||e==="connector.stop"}function nf(e,t,n){if(!eje(t.command))return;Ii(e.telemetry,{ulid:t.sessionId??t.requestId??"hub",tool:t.command,success:n})}async function oJ(e,t){try{if(t.command==="connector.channels")return ie(t,sM());if(t.command==="connector.configure"){let n=YWe(t.payload);return nf(e,t,!0),ie(t,n)}if(t.command==="connector.delete_config"){let n=XWe(t.payload);return nf(e,t,!0),ie(t,n)}if(t.command==="connector.start"){let n=await QWe(t.payload);return nf(e,t,!0),ie(t,n)}if(t.command==="connector.stop"){let n=await ZWe(t.payload);return nf(e,t,!0),ie(t,n)}if(t.command==="connector.supervised")return ie(t,{supervised:aM().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 tje=30000;function nje(e){if(e==="aborted")return"run.aborted";if(e==="error"||e==="failed")return"run.failed";return"run.completed"}function rje(e){if(e.finishReason!=="error")return;return e.text.trim()||void 0}function oje(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 iJ(e,t,n){let r=n instanceof Error&&n.message.trim()?n.message:`Unknown session: ${t}`;return pe(e,Rf,r)}function ije(e){return e?e:void 0}function sje(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 aje(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))},tje),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)}),rM(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 iJ(t,n);e.publish(e.buildEvent("run.started",{...t.requestId?{requestId:t.requestId}:{},...t.clientId?{clientId:t.clientId}:{}},n));let l=sje(r);e.suppressNextTerminalEventBySession.set(n,"run.start.reply");let c=oje(e,n),u;try{try{u=await aje(e,t,{sessionId:n,prompt:o,mode:ije(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 iJ(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=rje(u);if(e.publish(e.buildEvent(nje(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 sJ(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.";rM(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 aJ(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 dJ(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 dje}from"node:path";import{createSessionId as lje}from"@cerebriline/shared";import{loadSqliteDb as cje}from"@cerebriline/shared/db";import{resolveDbDataDir as uje}from"@cerebriline/shared/storage";var hje=32,pje=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 mje(e){let t=e?.replace(/[^a-zA-Z0-9_-]/g,"-");return dje(uje(),t?`hub-runs-${t}.db`:"hub-runs.db")}class dM{db;maxPendingPerSession;closed=!1;constructor(e={}){this.db=cje(e.dbPath??mje(e.ownerId)),this.maxPendingPerSession=e.maxPendingPerSession??hje,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,LX(e.enabledAt,"enabledAt")??null,i),this.getAutomationPolicy(t)}}var hd={kind:"system",id:"file_reconciler"},ud={kind:"system",id:"task_manager"},$X={kind:"automation_policy",id:"global"},ef=new Set(["completed","failed","cancelled","interrupted"]),bWe=30000,vWe=250;function Bo(){return new Date().toISOString()}function FX(e){return typeof e==="string"&&e.trim()?e.trim():void 0}function UX(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 BX(e,t){let n=yWe(e,t);return n!==""&&!n.startsWith("..")&&!n.startsWith("/")}function tf(e){if(!e||!Z0(e))return!1;try{return fWe(e).isDirectory()}catch{return!1}}function J0(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 Q0(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 kWe(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 TWe(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 eM{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 X0({dbPath:e.dbPath}),this.globalSpecsDir=e.globalSpecsDir,this.watcherDebounceMs=Math.max(0,e.watcherDebounceMs??vWe),this.watchFiles=e.watchFiles!==!1,this.automationEnabled=e.automationEnabled!==!1,this.logger=e.logger??wWe,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()},bWe),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(),UX(e.expiresAt);let t=Ss(e),n={...e,...t},r=FX(n.taskId)??DX("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(Z0(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=TWe(n,e);UX(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&&BX(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&&(Z0(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&&J0(f.spec,n)!==Q0(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=FX(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 V0({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=gWe(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:DX("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(SX(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(J0(o,a)===Q0(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(kWe(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||!BX(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,$X,a.revision)}if(e!==this.automationPolicyGeneration)return;if(n.mode==="auto_start"&&this.runtime.isInteractiveClientAvailable?.()!==!0)continue;await this.runTask(a.taskId,$X,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||J0(r.spec,n)!==Q0(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 mWe.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 EWe}from"@cerebriline/shared";import{createSessionId as _We}from"@cerebriline/shared";function SWe(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 xWe(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:SWe(e.status),participants:t?[...t.participants.values()]:[],metadata:xWe(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:_We("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 tM(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 HX(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=EWe("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 WX(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 nM(e,t,n){let r=e.pendingApprovals.get(t);if(!r)return;return e.pendingApprovals.delete(t),r.resolve(n),{sessionId:r.sessionId}}function rM(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 jX(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=nM(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 IWe}from"@cerebriline/shared";function AWe(e){if(e instanceof Error)return{name:e.name,message:e.message,stack:e.stack};if(e===void 0)return;return e}var qX={debug:10,info:20,warn:30,error:40,silent:50};function RWe(){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(qX[e]<qX[RWe()])return;let r=JSON.stringify({ts:new Date().toISOString(),level:e,component:"hub",message:t,...Object.fromEntries(Object.entries(n).map(([o,i])=>[o,AWe(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 zX(e,t,n,r,o,i){let s=IWe("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 KX(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 GX(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 VX(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 CWe}from"@cerebriline/shared";function YX(e,t){let n=t.payload,r=n?.clientId?.trim()||t.clientId?.trim()||CWe("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 XX(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 JX(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 QX(e,t){return ie(t,{clients:[...e.clients.values()]})}import{buildConnectorConnectArgs as BWe,CONNECTOR_PLATFORMS as HWe,connectorChannelsFromPlatforms as WWe,listConnectorCatalog as jWe,mergeConnectorConnectArgs as qWe,shouldIncludeConnectorField as zWe}from"@cerebriline/shared";import{withConnectorStore as iM}from"@cerebriline/shared/db";import{existsSync as PWe,readdirSync as MWe,readFileSync as OWe}from"node:fs";import{join as ZX}from"node:path";import{listConnectorCatalog as LWe}from"@cerebriline/shared";import{resolveConnectorDataDir as NWe}from"@cerebriline/shared/storage";var eJ={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},DWe={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 $We(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch{return!1}}function FWe(e,t){let n;try{let d=JSON.parse(OWe(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||!$We(r))return;let i=DWe[e];if(!i)return;let s={};for(let d of i.required){let l=eJ[d](n);if(!l||typeof l==="string"&&!l.trim())return;s[d]=l}for(let d of i.optional){let l=eJ[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 oM(){let e=[];for(let{name:t}of LWe()){let n=ZX(NWe(),t);if(!PWe(n))continue;for(let r of MWe(n)){if(!r.endsWith(".json")||r.endsWith(".threads.json"))continue;let o=FWe(t,ZX(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 rSt,readConnectorCliLaunchSpec as oSt}from"@cerebriline/shared";import{ensureParentDir as sSt,resolveConnectorLogPath as aSt}from"@cerebriline/shared/storage";import{withConnectorStore as GTt}from"@cerebriline/shared/db";import{CLINE_CONNECTOR_STARTING_INSTANCE_ENV as XTt,CLINE_RUN_AS_HUB_DAEMON_ENV as JTt}from"@cerebriline/shared";var UWe;function tJ(){return UWe}function md(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function Ek(e){return typeof e==="string"?e.trim():void 0}function nJ(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 KWe(){return iM((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 sM(){return{available:WWe(),active:oM(),configured:KWe()}}function GWe(e,t){if(e.required&&!t[e.flag]?.trim())throw Error(`${e.label} is required`)}function VWe(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(!zWe(o,n))continue;GWe(o,n),r[o.flag]=n[o.flag]}return r}function YWe(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=HWe.find((u)=>u.id===t);if(!n)throw Error(`unknown connector channel: ${t}`);if(!new Set(jWe().map((u)=>u.name)).has(n.id))throw Error(`connector channel is not available: ${t}`);let o=nJ(e.values),i=VWe(n,o),s=md(e.security)?e.security:{},a=s.enabled===!0,d=nJ(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=BWe(n,i,l);return iM((u)=>u.upsertConfig({channel:t,type:t,values:i,security:l,updateConnectArgs:(h)=>qWe(n,h.connection.connectArgs,c,{replaceSecurityArgs:h.config?.security?.enabled===!0||l.enabled})})),sM()}function XWe(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 iM((n)=>n.deleteConfig(t)),sM()}function JWe(e){return Array.isArray(e)?e.filter((t)=>typeof t==="string"):[]}function aM(){let e=tJ();if(!e)throw Error("connector supervision is unavailable in this hub; start connectors with the CLI instead");return e}function rJ(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 QWe(e){let{channel:t,instanceId:n}=rJ(e),r=md(e)?e:{};return await aM().start({channel:t,instanceId:n,args:JWe(r.args),restart:r.restart===!0})}async function ZWe(e){let{channel:t,instanceId:n}=rJ(e),r=md(e)?e:{};return{stopped:await aM().stop({channel:t,instanceId:n,disableAutostart:r.disableAutostart!==!1}),channel:t,instanceId:n}}function eje(e){return e==="connector.configure"||e==="connector.delete_config"||e==="connector.start"||e==="connector.stop"}function nf(e,t,n){if(!eje(t.command))return;Ii(e.telemetry,{ulid:t.sessionId??t.requestId??"hub",tool:t.command,success:n})}async function oJ(e,t){try{if(t.command==="connector.channels")return ie(t,sM());if(t.command==="connector.configure"){let n=YWe(t.payload);return nf(e,t,!0),ie(t,n)}if(t.command==="connector.delete_config"){let n=XWe(t.payload);return nf(e,t,!0),ie(t,n)}if(t.command==="connector.start"){let n=await QWe(t.payload);return nf(e,t,!0),ie(t,n)}if(t.command==="connector.stop"){let n=await ZWe(t.payload);return nf(e,t,!0),ie(t,n)}if(t.command==="connector.supervised")return ie(t,{supervised:aM().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 tje=30000;function nje(e){if(e==="aborted")return"run.aborted";if(e==="error"||e==="failed")return"run.failed";return"run.completed"}function rje(e){if(e.finishReason!=="error")return;return e.text.trim()||void 0}function oje(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 iJ(e,t,n){let r=n instanceof Error&&n.message.trim()?n.message:`Unknown session: ${t}`;return pe(e,Rf,r)}function ije(e){return e?e:void 0}function sje(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 aje(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))},tje),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)}),rM(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 iJ(t,n);e.publish(e.buildEvent("run.started",{...t.requestId?{requestId:t.requestId}:{},...t.clientId?{clientId:t.clientId}:{}},n));let l=sje(r);e.suppressNextTerminalEventBySession.set(n,"run.start.reply");let c=oje(e,n),u;try{try{u=await aje(e,t,{sessionId:n,prompt:o,mode:ije(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 iJ(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=rje(u);if(e.publish(e.buildEvent(nje(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 sJ(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.";rM(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 aJ(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 dJ(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 dje}from"node:path";import{createSessionId as lje}from"@cerebriline/shared";import{loadSqliteDb as cje}from"@cerebriline/shared/db";import{resolveDbDataDir as uje}from"@cerebriline/shared/storage";var hje=32,pje=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 mje(e){let t=e?.replace(/[^a-zA-Z0-9_-]/g,"-");return dje(uje(),t?`hub-runs-${t}.db`:"hub-runs.db")}class dM{db;maxPendingPerSession;closed=!1;constructor(e={}){this.db=cje(e.dbPath??mje(e.ownerId)),this.maxPendingPerSession=e.maxPendingPerSession??hje,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()-pje),{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 fje="hub_draining",gje=new Set(["session.create","session.restore","session.fork","run.start","session.send_input","run.enqueue"]);function lJ(e){return gje.has(e)}function cJ(e){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:fje,message:"Hub is draining and refuses new mutating work; retry once a hub is serving again.",details:{retryable:!0}}}}class lM{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 uJ(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 hJ(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 pJ(e,t){switch(t.type){case"chunk":return;case"agent_event":await yje(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 bje(e,t);return;default:return}}async function yje(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 wje(e,t)}async function wje(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 bje(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 qY(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 bJ,parseRuntimeConfigExtensions as vJ,ReasoningEffortSchema as Cje}from"@cerebriline/shared";import{HUB_CHECKPOINT_CAPABILITY as KSt,HUB_COMPACTION_CAPABILITY as GSt,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as VSt,HUB_HOOK_CAPABILITY_PREFIX as YSt,HUB_MISTAKE_LIMIT_CAPABILITY as XSt,HUB_REASONING_LOOP_LIMIT_CAPABILITY as JSt,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as QSt,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as ZSt,isHubToolExecutorName as vje}from"@cerebriline/shared";import{HUB_CHECKPOINT_CAPABILITY as sxt,HUB_COMPACTION_CAPABILITY as axt,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as dxt,HUB_HOOK_CAPABILITY_PREFIX as lxt,HUB_MISTAKE_LIMIT_CAPABILITY as cxt,HUB_REASONING_LOOP_LIMIT_CAPABILITY as uxt,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as hxt,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as pxt}from"@cerebriline/shared";var kje=["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 Tje(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 uM(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=Tje(o,n);if(a)t.push(a);continue}if(i==="toolExecutor"){let a=o.executor;if(!vje(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 fJ(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 gJ(e){return Object.hasOwn(e,"update")?e.update:e}function sf(e){return e.trim().replace(/^\/+/,"").toLowerCase()}function Sje(e){let t=(e??[]).map(sf).filter(Boolean);return t.length>0?new Set(t):void 0}function xje(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 cM(e,t){let n=Sje(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)=>xje(r.id,r.name,n))}function mJ(e,t){let n=async(r,o)=>{let i=sf(r),a=cM(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 _P(d,o)};return Object.defineProperty(n,"configuredSkills",{get:()=>cM(e,t).map(({skill:r,...o})=>o),enumerable:!0}),n}function _je(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)=>cM(o,s).some((a)=>!a.disabled),createSkillsExecutor:(s)=>mJ(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(mJ(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()-pje),{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 fje="hub_draining",gje=new Set(["session.create","session.restore","session.fork","run.start","session.send_input","run.enqueue"]);function lJ(e){return gje.has(e)}function cJ(e){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:fje,message:"Hub is draining and refuses new mutating work; retry once a hub is serving again.",details:{retryable:!0}}}}class lM{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 uJ(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 hJ(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 pJ(e,t){switch(t.type){case"chunk":return;case"agent_event":await yje(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 bje(e,t);return;default:return}}async function yje(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 wje(e,t)}async function wje(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 bje(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 qY(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 bJ,parseRuntimeConfigExtensions as vJ,ReasoningEffortSchema as Cje}from"@cerebriline/shared";import{HUB_CHECKPOINT_CAPABILITY as VSt,HUB_COMPACTION_CAPABILITY as YSt,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as XSt,HUB_HOOK_CAPABILITY_PREFIX as JSt,HUB_MISTAKE_LIMIT_CAPABILITY as QSt,HUB_REASONING_LOOP_LIMIT_CAPABILITY as ZSt,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as ext,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as txt,isHubToolExecutorName as vje}from"@cerebriline/shared";import{HUB_CHECKPOINT_CAPABILITY as dxt,HUB_COMPACTION_CAPABILITY as lxt,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as cxt,HUB_HOOK_CAPABILITY_PREFIX as uxt,HUB_MISTAKE_LIMIT_CAPABILITY as hxt,HUB_REASONING_LOOP_LIMIT_CAPABILITY as pxt,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as mxt,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as fxt}from"@cerebriline/shared";var kje=["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 Tje(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 uM(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=Tje(o,n);if(a)t.push(a);continue}if(i==="toolExecutor"){let a=o.executor;if(!vje(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 fJ(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 gJ(e){return Object.hasOwn(e,"update")?e.update:e}function sf(e){return e.trim().replace(/^\/+/,"").toLowerCase()}function Sje(e){let t=(e??[]).map(sf).filter(Boolean);return t.length>0?new Set(t):void 0}function xje(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 cM(e,t){let n=Sje(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)=>xje(r.id,r.name,n))}function mJ(e,t){let n=async(r,o)=>{let i=sf(r),a=cM(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 _P(d,o)};return Object.defineProperty(n,"configuredSkills",{get:()=>cM(e,t).map(({skill:r,...o})=>o),enumerable:!0}),n}function _je(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)=>cM(o,s).some((a)=>!a.disabled),createSkillsExecutor:(s)=>mJ(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(mJ(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 Eje(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:fJ(a)},t,a.emitUpdate?(c)=>{a.emitUpdate?.(gJ(c))}:void 0))?.result}]);return o.length>0?Object.fromEntries(o):void 0}function Aje(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:fJ(s)},t,s.emitUpdate?(d)=>{s.emitUpdate?.(gJ(d))}:void 0))?.result}}))}var Rje=new Set(["assistant-text-delta","assistant-reasoning-delta","tool-updated"]);function Ije(e,t,n,r){let o=new Map(n.map((s)=>[s.name,s])),i={};for(let s of kje){let a=o.get(s);if(!a)continue;i[s]=async(d)=>{if(s==="onEvent"&&Rje.has(d.type))return;return(await r(e,a.capabilityName,{context:d},t))?.control}}return Object.keys(i).length>0?i:void 0}function hM(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:Eje(e.sessionId,e.targetClientId,t,e.requestCapability),localRuntime:{...r.length>0?{hooks:Ije(e.sessionId,e.targetClientId,r,e.requestCapability)}:{},...n.length>0?{extraTools:Aje(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:_je(e.sessionId,e.targetClientId,d,e.requestCapability)}:{}}}}var yJ="hubCapabilityOwnerClientId";function gd(e,t){let n=e?.[t];return typeof n==="string"&&n.trim()?n.trim():void 0}function kJ(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 TJ(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 SJ(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 xJ(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 Pje(e){if(e===null)return null;let t=Cje.safeParse(e);return t.success?t.data:void 0}function Mje(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=Pje(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 Oje(e,t){return e.sessionState.get(t)?.createdByClientId}function wJ(e){return typeof e==="string"||e===null?e:void 0}function Lje(e){if(!e||!("autoApproveTools"in e)&&!(yJ in e))return e;let t={...e};return delete t[yJ],delete t.autoApproveTools,t}function _J(e,t){let n=Ho(e),r=Ho(n?.["*"]);if(typeof r?.autoApprove==="boolean")return r.autoApprove;return t.autoApproveTools===!0}function EJ(e){let t=Oje(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 pM(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=kJ(d.clientContext),c=TJ(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=_J(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=uM(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():"")||bJ(),w=vJ(d.configExtensions);ke("info","session.create.runtime_build.begin",{...o,sessionId:y,configExtensionCount:w?.length??0});let k=hM({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:xJ([...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}),tM(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 AJ(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=kJ(l.clientContext),u=TJ(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=_J(r.toolPolicies,l);let m=r.modelSelection&&typeof r.modelSelection==="object"?r.modelSelection:{},f=t.clientId?.trim()||"hub-client",g=uM(l.clientContributions),w=(typeof d?.sessionId==="string"?d.sessionId.trim():"")||bJ(),k=vJ(l.configExtensions),b=hM({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:xJ([...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 SJ(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");tM(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 RJ(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}`);HX(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 IJ(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 CJ(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 PJ(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 MJ(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=EJ({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 OJ(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 LJ(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 NJ(e,t){let n=Rt(t),r=Lje(Ho(t.payload?.metadata)),o=wJ(t.payload?.prompt),i=wJ(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 DJ(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=Mje(o?.updates);return await r.call(e.sessionHost,n,i),ie(t,{sessionId:n,updated:!0})}async function $J(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=EJ({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 FJ(e,t){let n=Rt(t),r=await SJ(e,n);return ie(t,{deleted:r})}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.list({sessionId:n});return ie(t,{sessionId:n,prompts:o})}async function BJ(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 HJ(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 WJ(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 Nje}from"node:path";import{loadSqliteDb as Dje}from"@cerebriline/shared/db";import{resolveDbDataDir as $je}from"@cerebriline/shared/storage";var Fje=604800000,Uje=200000,Bje=67108864,Hje=16777216;function Wje(e){let t=e?.replace(/[^a-zA-Z0-9_-]/g,"-");return Nje($je(),t?`hub-events-${t}.db`:"hub-events.db")}class mM{db;retentionMs;maxRows;maxTotalBytes;appendedBytesSincePrune=0;closed=!1;constructor(e={}){this.db=Dje(e.dbPath??Wje(e.ownerId)),this.retentionMs=e.retentionMs??Fje,this.maxRows=e.maxRows??Uje,this.maxTotalBytes=e.maxTotalBytes??Bje,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:yM("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 mM({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 dM({ownerId:this.options.owner?.ownerId,...this.options.runQueue??{}}),this.runExecutor=new lM(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())nM(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&&lJ(e.command))return cJ(e);if(zJ(e.command))return await this.taskCommands.handleCommand(e,t);switch(e.command){case"client.register":{let n=YX(this.ctx,e);return this.tasks.notifyAutomationReadinessChanged(),n}case"client.update":{let n=XX(this.ctx,e);return this.tasks.notifyAutomationReadinessChanged(),n}case"client.unregister":{let n=JX(this.ctx,e,(r)=>{this.listeners.delete(r),this.detachClientFromSessions(r)});return this.tasks.notifyAutomationReadinessChanged(),n}case"client.list":return QX(this.ctx,e);case"session.create":return await pM(this.ctx,e,(n)=>_k(this.ctx,n));case"session.restore":return await AJ(this.ctx,e,(n)=>_k(this.ctx,n));case"session.attach":return await RJ(this.ctx,e);case"session.detach":return await IJ(this.ctx,e);case"session.get":return await CJ(this.ctx,e);case"session.messages":return await PJ(this.ctx,e);case"session.compaction.get":return await MJ(this.ctx,e);case"session.list":return await OJ(this.ctx,e);case"session.search":return await LJ(this.ctx,e);case"session.update":return await NJ(this.ctx,e);case"session.update_connection":return await DJ(this.ctx,e);case"session.compaction.update":return await $J(this.ctx,e);case"session.pending_prompts":return await UJ(this.ctx,e);case"session.steer_first_pending_prompt":return await BJ(this.ctx,e);case"session.update_pending_prompt":return await HJ(this.ctx,e);case"session.remove_pending_prompt":return await WJ(this.ctx,e);case"session.delete":return await FJ(this.ctx,e);case"session.hook":return await dJ(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 uJ(this.ctx,e,this.runQueue,this.runExecutor)}case"run.list":{if(!this.runQueue)return ie(e,{runs:[]});return hJ(e,this.runQueue)}case"hub.drain":return this.handleHubDrain(e);case"hub.status":return this.handleHubStatus(e);case"run.abort":return await sJ(this.ctx,e);case"run.proceed_while_running":return await aJ(this.ctx,e);case"capability.request":return await GX(this.ctx,e);case"approval.respond":return await jX(this.ctx,e);case"capability.respond":return VX(this.ctx,e);case"capability.progress":return KX(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 oJ(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=jJ(e.command);if(r)this.publish(Xr(r,n.payload))}return n}}}captureFailedReply(e,t){if(t.ok||!t.error||!Qje(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(GJ(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(Jje(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=WX(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 Qje(e){return e==="session_not_found"||e==="session_messages_not_found"||e==="hub_command_timeout"||e.endsWith("_failed")}import{timingSafeEqual as m2e}from"node:crypto";import f2e from"node:http";import g2e from"node:net";import{URL as lf}from"node:url";import{CURRENT_HUB_PROTOCOL_VERSION as SM,HUB_CAPABILITIES as y2e,MAX_CLIENT_HUB_PROTOCOL_VERSION as QJ,MIN_CLIENT_HUB_PROTOCOL_VERSION as ZJ}from"@cerebriline/shared";import{WebSocketServer as w2e}from"ws";import{chmodSync as Zje,existsSync as e2e,mkdirSync as t2e}from"node:fs";import{dirname as n2e}from"node:path";import{loadSqliteDb as r2e}from"@cerebriline/shared/db";var p_t=3;class VJ 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 YJ(e){return e instanceof Error&&e.name==="HubLockHeldError"}function XJ(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{t2e(n2e(e),{recursive:!0}),t=e2e(e),n=r2e(e)}catch{return new gu(e,void 0)}try{n.exec("PRAGMA busy_timeout = 0;"),n.exec("BEGIN EXCLUSIVE;")}catch(r){if(n.close?.(),o2e(r))throw new VJ(e);return new gu(e,void 0)}if(!t)try{Zje(e,384)}catch{}return new gu(e,n)}}function o2e(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 i2e,relative as s2e,resolve as bM,sep as a2e}from"node:path";import{captureSdkError as JJ,HUB_COMMAND_SLOW_LOG_MS as d2e,resolveHubCommandTimeoutMs as l2e,safeJsonParse as c2e}from"@cerebriline/shared";var u2e=200,h2e=1000;function vM(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 p2e(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=bM(a);if(!n&&s&&bM(s)!==d)throw Error("Registration workspace must match the Hub-authorized workspace");let l=bM(r.workspaceContext?.cwd?.trim()||d),c=s2e(d,l);if(c===".."||c.startsWith(`..${a2e}`)||i2e(c))throw Error("Registration cwd must be inside its workspace");return{clientId:i,workspaceContext:{workspaceRoot:d,cwd:l},...n?{crossWorkspace:!0}:{}}}class kM{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=p2e(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=vM(u);ke("info","command.start",f);let g=setTimeout(()=>{if(m)return;ke("warn","command.slow",{...f,elapsedMs:Math.round(performance.now()-p)})},d2e),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=l2e(u.envelope.command,u.envelope.timeoutMs);try{b=v===null?await y:await Promise.race([y,new Promise((S)=>{k=setTimeout(()=>{w=!0,JJ(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<h2e){let E=f,S=this.transport.replayEventsAfter(f,{sessionId:u.sessionId,limit:u2e});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"?c2e(c.data):void 0;if(!h||h.kind!=="command"){ke("error","rejected malformed websocket frame",{error:u});return}ke("error","command.error",{...vM(h),error:u}),JJ(this.telemetry,{component:"core",operation:"hub.websocket_command",error:u,severity:"error",handled:!0,context:vM(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 TM{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 a9(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 b2e(e){return{send(t){e.send(t)},addEventListener(t,n){if(t==="message"){e.on("message",(r)=>{n({data:a9(r)})});return}e.on("close",n)},removeEventListener(){}}}function v2e(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:yM("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 mM({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 dM({ownerId:this.options.owner?.ownerId,...this.options.runQueue??{}}),this.runExecutor=new lM(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())nM(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&&lJ(e.command))return cJ(e);if(zJ(e.command))return await this.taskCommands.handleCommand(e,t);switch(e.command){case"client.register":{let n=YX(this.ctx,e);return this.tasks.notifyAutomationReadinessChanged(),n}case"client.update":{let n=XX(this.ctx,e);return this.tasks.notifyAutomationReadinessChanged(),n}case"client.unregister":{let n=JX(this.ctx,e,(r)=>{this.listeners.delete(r),this.detachClientFromSessions(r)});return this.tasks.notifyAutomationReadinessChanged(),n}case"client.list":return QX(this.ctx,e);case"session.create":return await pM(this.ctx,e,(n)=>_k(this.ctx,n));case"session.restore":return await AJ(this.ctx,e,(n)=>_k(this.ctx,n));case"session.attach":return await RJ(this.ctx,e);case"session.detach":return await IJ(this.ctx,e);case"session.get":return await CJ(this.ctx,e);case"session.messages":return await PJ(this.ctx,e);case"session.compaction.get":return await MJ(this.ctx,e);case"session.list":return await OJ(this.ctx,e);case"session.search":return await LJ(this.ctx,e);case"session.update":return await NJ(this.ctx,e);case"session.update_connection":return await DJ(this.ctx,e);case"session.compaction.update":return await $J(this.ctx,e);case"session.pending_prompts":return await UJ(this.ctx,e);case"session.steer_first_pending_prompt":return await BJ(this.ctx,e);case"session.update_pending_prompt":return await HJ(this.ctx,e);case"session.remove_pending_prompt":return await WJ(this.ctx,e);case"session.delete":return await FJ(this.ctx,e);case"session.hook":return await dJ(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 uJ(this.ctx,e,this.runQueue,this.runExecutor)}case"run.list":{if(!this.runQueue)return ie(e,{runs:[]});return hJ(e,this.runQueue)}case"hub.drain":return this.handleHubDrain(e);case"hub.status":return this.handleHubStatus(e);case"run.abort":return await sJ(this.ctx,e);case"run.proceed_while_running":return await aJ(this.ctx,e);case"capability.request":return await GX(this.ctx,e);case"approval.respond":return await jX(this.ctx,e);case"capability.respond":return VX(this.ctx,e);case"capability.progress":return KX(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 oJ(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=jJ(e.command);if(r)this.publish(Xr(r,n.payload))}return n}}}captureFailedReply(e,t){if(t.ok||!t.error||!Qje(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(GJ(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(Jje(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=WX(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 Qje(e){return e==="session_not_found"||e==="session_messages_not_found"||e==="hub_command_timeout"||e.endsWith("_failed")}import{timingSafeEqual as m2e}from"node:crypto";import f2e from"node:http";import g2e from"node:net";import{URL as lf}from"node:url";import{CURRENT_HUB_PROTOCOL_VERSION as SM,HUB_CAPABILITIES as y2e,MAX_CLIENT_HUB_PROTOCOL_VERSION as QJ,MIN_CLIENT_HUB_PROTOCOL_VERSION as ZJ}from"@cerebriline/shared";import{WebSocketServer as w2e}from"ws";import{chmodSync as Zje,existsSync as e2e,mkdirSync as t2e}from"node:fs";import{dirname as n2e}from"node:path";import{loadSqliteDb as r2e}from"@cerebriline/shared/db";var f_t=3;class VJ 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 YJ(e){return e instanceof Error&&e.name==="HubLockHeldError"}function XJ(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{t2e(n2e(e),{recursive:!0}),t=e2e(e),n=r2e(e)}catch{return new gu(e,void 0)}try{n.exec("PRAGMA busy_timeout = 0;"),n.exec("BEGIN EXCLUSIVE;")}catch(r){if(n.close?.(),o2e(r))throw new VJ(e);return new gu(e,void 0)}if(!t)try{Zje(e,384)}catch{}return new gu(e,n)}}function o2e(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 i2e,relative as s2e,resolve as bM,sep as a2e}from"node:path";import{captureSdkError as JJ,HUB_COMMAND_SLOW_LOG_MS as d2e,resolveHubCommandTimeoutMs as l2e,safeJsonParse as c2e}from"@cerebriline/shared";var u2e=200,h2e=1000;function vM(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 p2e(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=bM(a);if(!n&&s&&bM(s)!==d)throw Error("Registration workspace must match the Hub-authorized workspace");let l=bM(r.workspaceContext?.cwd?.trim()||d),c=s2e(d,l);if(c===".."||c.startsWith(`..${a2e}`)||i2e(c))throw Error("Registration cwd must be inside its workspace");return{clientId:i,workspaceContext:{workspaceRoot:d,cwd:l},...n?{crossWorkspace:!0}:{}}}class kM{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=p2e(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=vM(u);ke("info","command.start",f);let g=setTimeout(()=>{if(m)return;ke("warn","command.slow",{...f,elapsedMs:Math.round(performance.now()-p)})},d2e),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=l2e(u.envelope.command,u.envelope.timeoutMs);try{b=v===null?await y:await Promise.race([y,new Promise((S)=>{k=setTimeout(()=>{w=!0,JJ(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<h2e){let E=f,S=this.transport.replayEventsAfter(f,{sessionId:u.sessionId,limit:u2e});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"?c2e(c.data):void 0;if(!h||h.kind!=="command"){ke("error","rejected malformed websocket frame",{error:u});return}ke("error","command.error",{...vM(h),error:u}),JJ(this.telemetry,{component:"core",operation:"hub.websocket_command",error:u,severity:"error",handled:!0,context:vM(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 TM{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 a9(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 b2e(e){return{send(t){e.send(t)},addEventListener(t,n){if(t==="message"){e.on("message",(r)=>{n({data:a9(r)})});return}e.on("close",n)},removeEventListener(){}}}function v2e(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&&m2e(n,r)}function e9(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 S2e=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]),x2e=8;async function D_t(e,t=_2e){for(let n=1;n<x2e;n+=1){let r=await t(e);if(!S2e.has(r))return r}return await t(e)}async function _2e(e){return await new Promise((t,n)=>{let r=g2e.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 E2e(e){return e instanceof Error&&"code"in e&&e.code==="EADDRINUSE"}function t9(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 n9(e,t,n){return Error(`Hub owner ${e} is already running at ${t}; refusing a second endpoint at ${n}`)}var Ai=new Map,r9="cline-hub-auth.",A2e=30000,o9=2000,R2e=3000,I2e=100;async function i9(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 _M(e){return Array.isArray(e)?e.join(","):e??""}function s9(e){return e===32||e===9}function xM(e){let t=_M(e).trim(),n="bearer";if(t.length<=6||t.slice(0,6).toLowerCase()!=="bearer"||!s9(t.charCodeAt(6)))return null;let r=7;while(r<t.length&&s9(t.charCodeAt(r)))r+=1;return t.slice(r).trim()||null}function C2e(e){for(let t of _M(e).split(",")){let n=t.trim();if(n.startsWith(r9))return n.slice(r9.length).trim()||null}return null}function d9(e){let t=e.trim().toLowerCase();return t==="localhost"||t==="127.0.0.1"||t==="::1"||t==="[::1]"}function P2e(e){let t=_M(e).trim();if(!t)return!1;try{return d9(new lf(t).hostname)}catch{return!1}}async function EM(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=DL(),u=gu.acquire(XJ(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 kM(new TM(h),e.telemetry,e.workspaceRoot),f=new Set,g=new Date().toISOString(),y={protocolVersion:SM,minClientProtocolVersion:ZJ,maxClientProtocolVersion:QJ,capabilities:y2e,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 $L(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=f2e.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(xM(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(xM(R.headers.authorization),c)){C.statusCode=401,C.end("Unauthorized");return}let N=L.searchParams.get("off")===null;h.handleCommand({version:SM,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(xM(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 w2e({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)}}},A2e),T.on("upgrade",(R,C,L)=>{if(!E){T2e(C);return}if(new lf(R.url??"/",`http://${n}:${s}`).pathname!==r){C.destroy();return}let W=Ok(C2e(R.headers["sec-websocket-protocol"]),c);if(!(W||d9(n)&&P2e(R.headers.origin))){k2e(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:a9(G).slice(0,200)||void 0,heartbeatTerminated:V.heartbeatTerminated??!1,serverClosing:b!==void 0})});let B=m.attach(b2e(K),{allowRegisteredWorkspace:W});f.add(B),K.once("close",()=>{w.delete(V),B(),f.delete(B)})})}catch{v2e(C)}});try{await new Promise((R,C)=>{T.once("error",(L)=>{C(e9(L,{host:n,port:i,pathname:r}))}),T.listen(i,n,()=>{let L=T.address();if(!L||typeof L==="string"){C(e9(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 i9(Promise.resolve().then(()=>h.stop()),o9),u.release(),R}try{await Pf(t.discoveryPath,{hubId:p,protocolVersion:SM,minClientProtocolVersion:ZJ,maxClientProtocolVersion:QJ,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 i9(S().closed,o9))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 l9(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(t9(c.url,r,o,i)||e.allowPortFallback===!0)return d({server:c,url:c.url,authToken:c.authToken,action:"reuse"});else throw n9(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(t9(c.url,r,o,i)||e.allowPortFallback===!0)return d({url:p.url,authToken:c.authToken,action:"reuse"});throw n9(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=EM({...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()+R2e;for(;;)try{return await u(e)}catch(p){if(YJ(p)&&Date.now()<h){await new Promise((m)=>setTimeout(m,I2e));continue}if(!e.allowPortFallback||!E2e(p))throw p;return await u({...e,port:0})}})}function u9(){return c9()==="production"?to():Er()}function M2e(e){return c9()!=="production"&&!e}async function Y_t(e){let t=Bs({host:e.host,port:e.port,pathname:e.pathname});return await EM({...e,...t,owner:u9()})}async function X_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 l9({...e,...n,allowPortFallback:e.allowPortFallback??M2e(t),owner:u9()})}export{kM as BrowserWebSocketHubAdapter,kZ as DEFAULT_HUB_HOST,SZ as DEFAULT_HUB_PATHNAME,TZ as DEFAULT_HUB_PORT,p_t as HUB_LOCK_HELD_EXIT_CODE,Nf as HubCommandError,mM as HubEventLogStore,gu as HubInstanceLock,VJ as HubLockHeldError,Ak as HubRunAdmissionRejectedError,dM as HubRunQueue,uf as HubScheduleCommandService,Tf as HubScheduleService,Mk as HubServerTransport,Yee as HubSessionClient,an as HubTransportError,Xee as HubUIClient,TM as NativeHubTransportAdapter,Ws as NodeHubClient,Pd as ScheduledTaskInputSchema,SL as TASKS_SYSTEM_PROMPT_RULE,Mu as TASKS_TOOL_NAME,_L as TasksToolInputSchema,Jze as __test__,zee as checkManagedHubBuildMismatch,Wo as clearHubDiscovery,$L as clearHubDiscoveryIfOwned,Lu as compareHubBuilds,iN as connectToHub,DQ as createConfiguredTelemetryHandle,fL as createConfiguredTelemetryService,DL as createHubAuthToken,qo as createHubServerUrl,Mze as createInMemoryHubOwnerContext,Mvt as createLocalHubScheduleRuntimeHandlers,pT as createTasksPromptExtension,hT as createTasksTool,RT as ensureCompatibleLocalHubUrl,$u as ensureDetachedHubServer,X_t as ensureHubServer,l9 as ensureHubWebSocketServer,rT as executeScheduleOperation,Fs as getManagedHubCompatibility,lKe as hasActiveHubSessions,TT as hubHasLiveSessions,Oze as isDiscoveryFilePresent,dKe as isHubCommandTimeoutError,YJ as isHubLockHeldError,Tee as isHubReconnectableTransportError,d9 as isLocalHubHostName,P2e as isLocalHubOrigin,Ld as isManagedHubReusable,rN as localHubHasNoActiveSessions,Df as normalizeHubWebSocketUrl,Qze as prewarmDetachedHubServer,gKe as probeHubConnection,jo as probeHubServer,Fd as queryHubSessionActivity,xM as readBearerToken,qt as readHubDiscovery,QZ as readSupersededHubDiscovery,YL as rememberLocalHubAuthToken,$d as rememberRecoverableLocalHubUrl,Hs as requestHubDrain,ST as requestHubShutdown,Ou as resolveClineDataDir,Cze as resolveClineDir,Aee as resolveCompatibleLocalHubUrl,xZ as resolveDefaultHubHost,_Z as resolveDefaultHubPathname,Of as resolveDefaultHubPort,D_t as resolveEphemeralPort,yT as resolveHubBuildEpochMs,eo as resolveHubBuildId,Nu as resolveHubBuildIdentity,Bs as resolveHubEndpointOptions,Wje as resolveHubEventLogPath,XJ as resolveHubInstanceLockPath,Us as resolveHubOwnerContext,mje as resolveHubRunQueuePath,Nee as resolveHubUrl,to as resolveProductionHubOwnerContext,Er as resolveSharedHubOwnerContext,Bze as resolveWorkspaceHubOwnerContext,cKe as restartLocalHubIfIdleAfterStartupTimeout,Dd as retireDiscoveredHub,yKe as sendHubCommand,oee as spawnDetachedHubServer,iee as spawnDetachedHubServerWithRetry,Y_t as startHubServer,EM as startHubWebSocketServer,Ree as stopLocalHubServerGracefully,nN as summarizeHubSessionActivity,UL as toHubHealthUrl,mZ as toHubStatusUrl,T0 as truncateNotificationBody,Zze as upgradeManagedHub,nr as verifyHubConnection,xKe as watchManagedHubBuildMismatch,Mf as withHubStartupLock,Pf as writeHubDiscovery};
2132
+ Caused by: ${e.stack}`;return i}var S2e=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]),x2e=8;async function F_t(e,t=_2e){for(let n=1;n<x2e;n+=1){let r=await t(e);if(!S2e.has(r))return r}return await t(e)}async function _2e(e){return await new Promise((t,n)=>{let r=g2e.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 E2e(e){return e instanceof Error&&"code"in e&&e.code==="EADDRINUSE"}function t9(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 n9(e,t,n){return Error(`Hub owner ${e} is already running at ${t}; refusing a second endpoint at ${n}`)}var Ai=new Map,r9="cline-hub-auth.",A2e=30000,o9=2000,R2e=3000,I2e=100;async function i9(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 _M(e){return Array.isArray(e)?e.join(","):e??""}function s9(e){return e===32||e===9}function xM(e){let t=_M(e).trim(),n="bearer";if(t.length<=6||t.slice(0,6).toLowerCase()!=="bearer"||!s9(t.charCodeAt(6)))return null;let r=7;while(r<t.length&&s9(t.charCodeAt(r)))r+=1;return t.slice(r).trim()||null}function C2e(e){for(let t of _M(e).split(",")){let n=t.trim();if(n.startsWith(r9))return n.slice(r9.length).trim()||null}return null}function d9(e){let t=e.trim().toLowerCase();return t==="localhost"||t==="127.0.0.1"||t==="::1"||t==="[::1]"}function P2e(e){let t=_M(e).trim();if(!t)return!1;try{return d9(new lf(t).hostname)}catch{return!1}}async function EM(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=DL(),u=gu.acquire(XJ(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 kM(new TM(h),e.telemetry,e.workspaceRoot),f=new Set,g=new Date().toISOString(),y={protocolVersion:SM,minClientProtocolVersion:ZJ,maxClientProtocolVersion:QJ,capabilities:y2e,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 $L(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=f2e.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(xM(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(xM(R.headers.authorization),c)){C.statusCode=401,C.end("Unauthorized");return}let N=L.searchParams.get("off")===null;h.handleCommand({version:SM,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(xM(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 w2e({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)}}},A2e),T.on("upgrade",(R,C,L)=>{if(!E){T2e(C);return}if(new lf(R.url??"/",`http://${n}:${s}`).pathname!==r){C.destroy();return}let W=Ok(C2e(R.headers["sec-websocket-protocol"]),c);if(!(W||d9(n)&&P2e(R.headers.origin))){k2e(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:a9(G).slice(0,200)||void 0,heartbeatTerminated:V.heartbeatTerminated??!1,serverClosing:b!==void 0})});let B=m.attach(b2e(K),{allowRegisteredWorkspace:W});f.add(B),K.once("close",()=>{w.delete(V),B(),f.delete(B)})})}catch{v2e(C)}});try{await new Promise((R,C)=>{T.once("error",(L)=>{C(e9(L,{host:n,port:i,pathname:r}))}),T.listen(i,n,()=>{let L=T.address();if(!L||typeof L==="string"){C(e9(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 i9(Promise.resolve().then(()=>h.stop()),o9),u.release(),R}try{await Pf(t.discoveryPath,{hubId:p,protocolVersion:SM,minClientProtocolVersion:ZJ,maxClientProtocolVersion:QJ,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 i9(S().closed,o9))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 l9(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(t9(c.url,r,o,i)||e.allowPortFallback===!0)return d({server:c,url:c.url,authToken:c.authToken,action:"reuse"});else throw n9(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(t9(c.url,r,o,i)||e.allowPortFallback===!0)return d({url:p.url,authToken:c.authToken,action:"reuse"});throw n9(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=EM({...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()+R2e;for(;;)try{return await u(e)}catch(p){if(YJ(p)&&Date.now()<h){await new Promise((m)=>setTimeout(m,I2e));continue}if(!e.allowPortFallback||!E2e(p))throw p;return await u({...e,port:0})}})}function u9(){return c9()==="production"?to():Er()}function M2e(e){return c9()!=="production"&&!e}async function J_t(e){let t=Bs({host:e.host,port:e.port,pathname:e.pathname});return await EM({...e,...t,owner:u9()})}async function Q_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 l9({...e,...n,allowPortFallback:e.allowPortFallback??M2e(t),owner:u9()})}export{kM as BrowserWebSocketHubAdapter,kZ as DEFAULT_HUB_HOST,SZ as DEFAULT_HUB_PATHNAME,TZ as DEFAULT_HUB_PORT,f_t as HUB_LOCK_HELD_EXIT_CODE,Nf as HubCommandError,mM as HubEventLogStore,gu as HubInstanceLock,VJ as HubLockHeldError,Ak as HubRunAdmissionRejectedError,dM as HubRunQueue,uf as HubScheduleCommandService,Tf as HubScheduleService,Mk as HubServerTransport,Yee as HubSessionClient,an as HubTransportError,Xee as HubUIClient,TM as NativeHubTransportAdapter,Ws as NodeHubClient,Pd as ScheduledTaskInputSchema,SL as TASKS_SYSTEM_PROMPT_RULE,Mu as TASKS_TOOL_NAME,_L as TasksToolInputSchema,Jze as __test__,zee as checkManagedHubBuildMismatch,Wo as clearHubDiscovery,$L as clearHubDiscoveryIfOwned,Lu as compareHubBuilds,iN as connectToHub,DQ as createConfiguredTelemetryHandle,fL as createConfiguredTelemetryService,DL as createHubAuthToken,qo as createHubServerUrl,Mze as createInMemoryHubOwnerContext,Lvt as createLocalHubScheduleRuntimeHandlers,pT as createTasksPromptExtension,hT as createTasksTool,RT as ensureCompatibleLocalHubUrl,$u as ensureDetachedHubServer,Q_t as ensureHubServer,l9 as ensureHubWebSocketServer,rT as executeScheduleOperation,Fs as getManagedHubCompatibility,lKe as hasActiveHubSessions,TT as hubHasLiveSessions,Oze as isDiscoveryFilePresent,dKe as isHubCommandTimeoutError,YJ as isHubLockHeldError,Tee as isHubReconnectableTransportError,d9 as isLocalHubHostName,P2e as isLocalHubOrigin,Ld as isManagedHubReusable,rN as localHubHasNoActiveSessions,Df as normalizeHubWebSocketUrl,Qze as prewarmDetachedHubServer,gKe as probeHubConnection,jo as probeHubServer,Fd as queryHubSessionActivity,xM as readBearerToken,qt as readHubDiscovery,QZ as readSupersededHubDiscovery,YL as rememberLocalHubAuthToken,$d as rememberRecoverableLocalHubUrl,Hs as requestHubDrain,ST as requestHubShutdown,Ou as resolveClineDataDir,Cze as resolveClineDir,Aee as resolveCompatibleLocalHubUrl,xZ as resolveDefaultHubHost,_Z as resolveDefaultHubPathname,Of as resolveDefaultHubPort,F_t as resolveEphemeralPort,yT as resolveHubBuildEpochMs,eo as resolveHubBuildId,Nu as resolveHubBuildIdentity,Bs as resolveHubEndpointOptions,Wje as resolveHubEventLogPath,XJ as resolveHubInstanceLockPath,Us as resolveHubOwnerContext,mje as resolveHubRunQueuePath,Nee as resolveHubUrl,to as resolveProductionHubOwnerContext,Er as resolveSharedHubOwnerContext,Bze as resolveWorkspaceHubOwnerContext,cKe as restartLocalHubIfIdleAfterStartupTimeout,Dd as retireDiscoveredHub,yKe as sendHubCommand,oee as spawnDetachedHubServer,iee as spawnDetachedHubServerWithRetry,J_t as startHubServer,EM as startHubWebSocketServer,Ree as stopLocalHubServerGracefully,nN as summarizeHubSessionActivity,UL as toHubHealthUrl,mZ as toHubStatusUrl,T0 as truncateNotificationBody,Zze as upgradeManagedHub,nr as verifyHubConnection,xKe as watchManagedHubBuildMismatch,Mf as withHubStartupLock,Pf as writeHubDiscovery};