@cline/core 0.0.80 → 0.0.81

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
@@ -292,7 +292,7 @@ ${JSON.stringify(J,null,2)}`}startClaimLeaseHeartbeat($){let Z=Math.max(1000,Mat
292
292
  error = ?,
293
293
  scheduled_for = COALESCE(?, scheduled_for),
294
294
  updated_at = ?
295
- WHERE run_id = ? AND claim_token = ?`).run($.error??null,$.scheduledFor??null,Z,$.runId,$.claimToken).changes??0)>0}attachSessionIdToRun($,Z){this.db.prepare("UPDATE cron_runs SET session_id = ?, updated_at = ? WHERE run_id = ?").run(Z,x0(),$)}attachReportPathToRun($,Z){this.db.prepare("UPDATE cron_runs SET report_path = ?, updated_at = ? WHERE run_id = ?").run(Z,x0(),$)}}function BQ($){return $?new Date($).getTime():void 0}function qR($){let Z=$.metadata?{...$.metadata}:void 0;if(Z)delete Z.__hubScheduleCreatedBy,delete Z.__hubScheduleCwd,delete Z.__hubRuntimeOptions;return Z}function b5($){let Z=$.metadata;return{scheduleId:$.externalId,name:$.title,cronPattern:$.triggerKind==="one_off"?KQ:$.scheduleExpr??"",timezone:$.triggerKind==="schedule"?$.timezone:void 0,prompt:$.prompt??"",workspaceRoot:$.workspaceRoot??"",cwd:typeof Z?.__hubScheduleCwd==="string"?Z.__hubScheduleCwd:void 0,modelSelection:$.providerId||$.modelId?{providerId:$.providerId??"",modelId:$.modelId??""}:void 0,enabled:$.enabled&&!$.removed&&$.parseStatus==="valid",mode:$.mode==="plan"?"plan":$.mode==="act"?"act":"yolo",systemPrompt:$.systemPrompt,maxIterations:$.maxIterations,timeoutSeconds:$.timeoutSeconds,maxParallel:$.maxParallel??1,createdAt:new Date($.createdAt).getTime(),updatedAt:new Date($.updatedAt).getTime(),nextRunAt:BQ($.nextRunAt),lastRunAt:BQ($.lastRunAt),createdBy:typeof Z?.__hubScheduleCreatedBy==="string"?Z.__hubScheduleCreatedBy:void 0,tags:$.tags,runtimeOptions:Z?.__hubRuntimeOptions&&typeof Z.__hubRuntimeOptions==="object"&&!Array.isArray(Z.__hubRuntimeOptions)?Z.__hubRuntimeOptions:void 0,metadata:qR($)}}function AR($){switch($){case"done":return"success";case"cancelled":return"aborted";case"running":return"running";case"queued":return"pending";default:return"failed"}}function pW($,Z){return{executionId:$.runId,scheduleId:Z,sessionId:$.sessionId,triggeredAt:new Date($.scheduledFor??$.createdAt).getTime(),startedAt:BQ($.startedAt),endedAt:BQ($.completedAt),status:AR($.status),errorMessage:$.error}}class A8{store;materializer;runner;started=!1;disposed=!1;constructor($){this.store=new S5({dbPath:$.dbPath}),this.materializer=new T5({store:this.store}),this.runner=new R5({store:this.store,materializer:this.materializer,runtimeHandlers:$.runtimeHandlers,eventPublisher:$.eventPublisher,workspaceRoot:"",specs:$.specs,logger:$.logger,pollIntervalMs:$.pollIntervalMs,claimLeaseSeconds:$.claimLeaseSeconds,globalMaxConcurrency:$.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($){if(this.validateScheduleTiming($.cronPattern,$.timezone,$.metadata,!0),!$.workspaceRoot?.trim())throw Error("workspaceRoot is required for schedules");return b5(this.store.createHubSchedule($))}getSchedule($){let Z=this.store.getHubSchedule($);return Z?b5(Z):void 0}listSchedules($={}){return this.store.listHubSchedules($).map((Z)=>b5(Z))}updateSchedule($,Z){let Q=this.store.getHubSchedule($);if(!Q)return;let J=Z.workspaceRoot!==void 0?Z.workspaceRoot.trim():Q.workspaceRoot,X=Z.enabled??Q.enabled,W=b5(Q),j=Z.cronPattern??W.cronPattern;if(j.trim()===KQ&&typeof Z.timezone==="string"&&Z.timezone.trim())throw Error("timezone is only supported for recurring schedules");if(this.validateScheduleTiming(j,j.trim()===KQ?void 0:Z.timezone===null?void 0:Z.timezone??W.timezone,Z.metadata??W.metadata,X),X&&!J)throw Error("workspaceRoot is required for enabled schedules");let Y=this.store.updateHubSchedule($,{...Z,scheduleId:$});return Y?b5(Y):void 0}validateScheduleTiming($,Z,Q,J){if($.trim()!==KQ){IH($),uW(Z);return}if(Z?.trim())throw Error("timezone is only supported for recurring schedules");let X=Q?.[NR];if(typeof X!=="number"||!Number.isFinite(X)||J&&X<=Date.now())throw Error("runAt must be a future timestamp")}deleteSchedule($){return this.store.deleteHubSchedule($)}pauseSchedule($){return this.updateSchedule($,{scheduleId:$,enabled:!1})}resumeSchedule($){return this.updateSchedule($,{scheduleId:$,enabled:!0})}async triggerScheduleNow($){let Z=this.store.enqueueHubScheduleRun($,"manual");if(!Z)return;await this.runner.tick();let Q=this.store.getRun(Z.runId)??Z;return pW(Q,$)}triggerScheduleNowDetached($){let Z=this.store.enqueueHubScheduleRun($,"manual");if(!Z)return;return this.runner.tick().catch(()=>{return}),pW(Z,$)}listScheduleExecutions($){let Z=$.scheduleId?this.store.getHubSchedule($.scheduleId):void 0,Q={specId:Z?.specId,limit:$.limit};return this.store.listRuns(Q).map((X)=>{let W=Z??this.store.getSpec(X.specId);if(!W||W.source!=="hub-schedule")return;return pW(X,W.externalId)}).filter((X)=>{if(!X)return!1;return!$.status||X.status===$.status})}getScheduleStats($){let Z=this.listScheduleExecutions({scheduleId:$,limit:1e4});if(Z.length===0)return{totalRuns:0,successRate:0,avgDurationSeconds:0};let Q=0,J=0,X=0,W;for(let j of Z){if(j.status==="success"||j.status==="completed")Q+=1;if(!W&&j.status!=="success"&&j.status!=="completed")W=j;if(j.startedAt&&j.endedAt)X+=j.endedAt-j.startedAt,J+=1}return{totalRuns:Z.length,successRate:Q/Z.length,avgDurationSeconds:J>0?X/J/1000:0,lastFailure:W}}getActiveExecutions(){return this.runner.getActiveRuns().flatMap(($)=>{let Z=this.store.getSpec($.specId);if(!Z||Z.source!=="hub-schedule"||!$.sessionId)return[];return[{executionId:$.runId,scheduleId:Z.externalId,sessionId:$.sessionId,startedAt:$.startedAt??new Date().toISOString(),timeoutAt:Z.timeoutSeconds&&$.startedAt?new Date(new Date($.startedAt).getTime()+Z.timeoutSeconds*1000).toISOString():void 0}]})}getUpcomingRuns($=20){let Z={triggerKind:"schedule",enabled:!0,limit:$};return this.store.listSpecs(Z).flatMap((Q)=>Q.source==="hub-schedule"&&Q.nextRunAt?[{spec:Q,nextRunAt:Q.nextRunAt}]:[]).sort((Q,J)=>String(Q.nextRunAt).localeCompare(String(J.nextRunAt))).slice(0,$).map(({spec:Q,nextRunAt:J})=>({scheduleId:Q.externalId,name:Q.title,nextRunAt:J}))}}q0();import{realpathSync as rW,statSync as kR}from"node:fs";import{isAbsolute as JU,relative as xR,sep as XU}from"node:path";import{ONE_TIME_SCHEDULE_CRON_PATTERN as WU,ONE_TIME_SCHEDULE_RUN_AT_METADATA_KEY as jU}from"@cline/shared";import{z as N0}from"zod";var yR=N0.enum(["create","update","list","get","pause","resume","delete","run_now"]),IR=N0.object({provider_id:N0.string().min(1),model_id:N0.string().min(1).optional()}),Q2=N0.object({operation:yR,schedule_id:N0.string().min(1).optional(),schedule_type:N0.enum(["once","recurring"]).optional(),name:N0.string().min(1).optional(),prompt:N0.string().min(1).optional(),run_at:N0.string().datetime({offset:!0}).optional(),cron_pattern:N0.string().min(1).optional(),timezone:N0.string().min(1).nullable().optional(),enabled:N0.boolean().optional(),mode:N0.enum(["act","plan","yolo"]).optional(),system_prompt:N0.string().nullable().optional(),max_iterations:N0.number().int().positive().nullable().optional(),timeout_seconds:N0.number().int().positive().nullable().optional(),max_parallel:N0.number().int().positive().max(32).optional(),tags:N0.array(N0.string().min(1)).optional(),model_selection:IR.optional(),limit:N0.number().int().positive().max(200).optional()});function E8($,Z,Q,J){if(!YU.has(Z.operation))return;o1($.telemetry,{ulid:Q.sessionId??Q.conversationId??Q.agentId,tool:`tasks.scheduled.${Z.operation}`,success:J,agentId:Q.agentId})}var YU=new Set(["create","update","pause","resume","delete","run_now"]);function R8($,Z){let Q=$?.trim();if(!Q)throw Error(`${Z} is required for this operation`);return Q}function aW($,Z){try{let Q=rW.native($);if(!kR(Q).isDirectory())throw Error("not a directory");return Q}catch{throw Error(`${Z} does not resolve to an existing safe path`)}}function hR($,Z){try{return rW.native($)===rW.native(Z)}catch{return!1}}function VU($,Z,Q){let J=xR($,Z);if(J===".."||J.startsWith(`..${XU}`)||JU(J))throw Error(`${Q} is outside the workspace scope`)}function KU($,Z,Q){return aW(JU(Z)?Z:`${$}${XU}${Z}`,Q)}function vR($){let Z=aW($.workspaceRoot,"workspaceRoot"),Q=$.cwd?KU(Z,$.cwd,"cwd"):Z;return VU(Z,Q,"cwd"),{...$,workspaceRoot:Z,cwd:Q}}function M8($,Z){if(!$)throw Error("schedule does not exist");if(!hR($.workspaceRoot,Z.workspaceRoot))throw Error("schedule is outside this session's workspace scope");let Q=aW($.workspaceRoot,"schedule workspaceRoot");if($.cwd){let J=KU(Q,$.cwd,"schedule cwd");VU(Q,J,"schedule cwd")}}function QU($){if(!$)return;return{providerId:$.provider_id.trim(),modelId:$.model_id?.trim()||void 0}}function iW($){if(!$)return;return[...new Set($.map((Z)=>Z.trim()).filter(Boolean))]}function BU($){let Z=Date.parse(R8($,"run_at"));if(!Number.isFinite(Z))throw Error("run_at must be an ISO timestamp");if(Z<=Date.now())throw Error("run_at must be in the future");return Z}function gR($){if($.schedule_type==="once"){if($.cron_pattern)throw Error("cron_pattern cannot be used with a one-time schedule");if($.timezone)throw Error("timezone is encoded in run_at for a one-time schedule");return{cronPattern:WU,metadata:{[jU]:BU($.run_at)}}}if($.schedule_type==="recurring"){if($.run_at)throw Error("run_at cannot be used with a recurring schedule");return{cronPattern:R8($.cron_pattern,"cron_pattern"),timezone:$.timezone?.trim()||void 0}}throw Error("schedule_type is required for create")}function mR($){if($.run_at&&$.cron_pattern)throw Error("run_at and cron_pattern cannot be updated together");if($.schedule_type==="once"||$.run_at){if($.cron_pattern)throw Error("cron_pattern cannot be used with a one-time schedule");if($.timezone)throw Error("timezone is encoded in run_at for a one-time schedule");return{cronPattern:WU,timezone:null,metadata:{[jU]:BU($.run_at)}}}if($.schedule_type==="recurring"||$.cron_pattern)return{cronPattern:R8($.cron_pattern,"cron_pattern"),timezone:$.timezone===null?null:$.timezone?.trim()||void 0};return{timezone:$.timezone===null?null:$.timezone?.trim()||void 0}}function I5($){return R8($.schedule_id,"schedule_id")}async function h5($,Z,Q){let J=Q2.safeParse(Z);if(!J.success)return{ok:!1,error:{code:"invalid_schedule_input",message:J.error.issues[0]?.message??"Invalid schedule input"}};let X=J.data;try{if(!Q.sessionId)throw Error("tasks requires a Hub session");let W=await $.resolveSessionDefaults(Q.sessionId);if(!W?.workspaceRoot.trim())throw Error("tasks could not resolve the current workspace");let j=vR(W);if(YU.has(X.operation)&&!j.interactive)throw Error("schedule mutations require an interactive user session");switch(X.operation){case"create":{let Y=$.schedules.createSchedule({name:R8(X.name,"name"),...gR(X),prompt:R8(X.prompt,"prompt"),workspaceRoot:j.workspaceRoot,cwd:j.cwd,modelSelection:QU(X.model_selection)??j.modelSelection,enabled:X.enabled,mode:X.mode??"yolo",systemPrompt:X.system_prompt??void 0,maxIterations:X.max_iterations??void 0,timeoutSeconds:X.timeout_seconds??void 0,maxParallel:X.max_parallel??1,createdBy:`agent:${Q.agentId}`,tags:iW(X.tags)});return $.publish?.("schedule.created",{schedule:Y},Q.sessionId),E8($,X,Q,!0),{ok:!0,operation:X.operation,schedule:Y}}case"update":{let Y=I5(X);M8($.schedules.getSchedule(Y),j);let V=$.schedules.updateSchedule(Y,{scheduleId:Y,...mR(X),name:X.name?.trim()||void 0,prompt:X.prompt?.trim()||void 0,modelSelection:QU(X.model_selection),enabled:X.enabled,mode:X.mode,systemPrompt:X.system_prompt,maxIterations:X.max_iterations,timeoutSeconds:X.timeout_seconds,maxParallel:X.max_parallel,tags:iW(X.tags)});if(!V)throw Error("schedule does not exist");return $.publish?.("schedule.updated",{schedule:V},Q.sessionId),E8($,X,Q,!0),{ok:!0,operation:X.operation,schedule:V}}case"list":{let Y=$.schedules.listSchedules({enabled:X.enabled,tags:iW(X.tags),workspaceRoot:j.workspaceRoot,limit:X.limit??50}).filter((V)=>{try{return M8(V,j),!0}catch{return!1}}).slice(0,X.limit??50);return{ok:!0,operation:X.operation,schedules:Y}}case"get":{let Y=$.schedules.getSchedule(I5(X));return M8(Y,j),{ok:!0,operation:X.operation,schedule:Y}}case"pause":case"resume":{let Y=I5(X);M8($.schedules.getSchedule(Y),j);let V=X.operation==="pause"?$.schedules.pauseSchedule(Y):$.schedules.resumeSchedule(Y);if(!V)throw Error("schedule does not exist");return $.publish?.("schedule.updated",{schedule:V},Q.sessionId),E8($,X,Q,!0),{ok:!0,operation:X.operation,schedule:V}}case"delete":{let Y=I5(X);M8($.schedules.getSchedule(Y),j);let V=$.schedules.deleteSchedule(Y);if(!V)throw Error("schedule does not exist");return $.publish?.("schedule.deleted",{deleted:V,scheduleId:Y},Q.sessionId),E8($,X,Q,!0),{ok:!0,operation:X.operation,deleted:V}}case"run_now":{let Y=I5(X);M8($.schedules.getSchedule(Y),j);let V=$.schedules.triggerScheduleNowDetached(Y);if(!V)throw Error("schedule does not exist");return $.publish?.("schedule.triggered",{execution:V},Q.sessionId),E8($,X,Q,!0),{ok:!0,operation:X.operation,execution:V}}}}catch(W){return E8($,X,Q,!1),{ok:!1,operation:X.operation,error:{code:"schedule_operation_failed",message:W instanceof Error?W.message:String(W)}}}}yQ();import{createTool as yC,zodToJsonSchema as IC}from"@cline/shared";import{z as t1}from"zod";q0();import{resolve as IU}from"node:path";import{z as $0}from"zod";var hU=$0.enum(["suggestion","follow-up","todo","handoff","idea","reminder"]),SC=$0.enum(["pending_approval","approved","in_progress","completed","failed","cancelled","expired"]),vU=$0.union([$0.literal(0),$0.literal(1),$0.literal(2),$0.literal(3),$0.literal(4),$0.literal(5)]),bC=$0.object({provider_id:$0.string().min(1),model_id:$0.string().min(1).optional()}),k8=$0.object({operation:$0.enum(["create","update","list","get"]),task_id:$0.string().min(1).optional(),expected_revision:$0.number().int().positive().optional(),type:hU.optional(),title:$0.string().min(1).optional(),description:$0.string().nullable().optional(),instructions:$0.string().min(1).optional(),scope:$0.enum(["workspace","global"]).optional(),workspace_root:$0.string().min(1).nullable().optional(),cwd:$0.string().min(1).nullable().optional(),resource_paths:$0.array($0.string().min(1)).optional(),priority:vU.optional(),assignee:$0.string().min(1).nullable().optional(),model_selection:bC.nullable().optional(),mode:$0.enum(["act","plan","yolo"]).nullable().optional(),system_prompt:$0.string().nullable().optional(),max_iterations:$0.number().int().positive().nullable().optional(),timeout_seconds:$0.number().int().positive().nullable().optional(),available_at:$0.string().datetime().optional(),expires_at:$0.string().datetime().optional(),automation_eligible:$0.boolean().optional(),statuses:$0.array(SC).optional(),types:$0.array(hU).optional(),priorities:$0.array(vU).optional(),limit:$0.number().int().positive().max(500).optional()}),kC=new Set(["create","update"]);function Qj($,Z,Q,J){if(!kC.has(Z.operation))return;o1($.telemetry,{ulid:Q.sessionId??Q.conversationId??Q.agentId,tool:`tasks.todo.${Z.operation}`,success:J,agentId:Q.agentId})}function b8($,Z){let Q=$?.trim();if(!Q)throw Error(`${Z} is required for this operation`);return Q}function gU($){if($===void 0||$===null)return $;return{providerId:$.provider_id,modelId:$.model_id}}function cU($,Z){return IU($)===IU(Z)}function mU($,Z){if(!$)throw Error("task does not exist");if(Z.workspaceRoot){if($.scope!=="workspace"||!$.workspaceRoot||!cU($.workspaceRoot,Z.workspaceRoot))throw Error("task is outside this session's workspace scope");return}if($.scope!=="global")throw Error("task is outside this session's global scope")}function xC($,Z){let Q=Z.workspaceRoot?"workspace":"global";if($.scope&&$.scope!==Q)throw Error(`this session can only manage ${Q} tasks`);if($.workspace_root!==void 0){if(!Z.workspaceRoot||$.workspace_root===null||!cU($.workspace_root,Z.workspaceRoot))throw Error(`this session can only manage ${Q} tasks`)}return Q}async function IQ($,Z,Q){let J=k8.safeParse(Z);if(!J.success)return{ok:!1,error:{code:"invalid_task_input",message:J.error.issues[0]?.message??"Invalid task input"}};let X=J.data,W={kind:"agent",id:Q.agentId,agentId:Q.agentId,sessionId:Q.sessionId};try{if(!Q.sessionId)throw Error("tasks requires a Hub session");let j=await $.resolveSessionDefaults(Q.sessionId);if(!j)throw Error("tasks could not resolve the current session");let Y=xC(X,j);switch(X.operation){case"create":{let V={type:b8(X.type,"type"),title:b8(X.title,"title"),description:X.description??void 0,instructions:b8(X.instructions,"instructions"),scope:Y,workspaceRoot:j.workspaceRoot,cwd:Y==="workspace"?(X.cwd??j.cwd)?.trim()||void 0:void 0,resourcePaths:X.resource_paths,priority:X.priority,assignee:X.assignee??void 0,modelSelection:gU(X.model_selection)??j.modelSelection,mode:X.mode??void 0,systemPrompt:X.system_prompt??void 0,maxIterations:X.max_iterations??void 0,timeoutSeconds:X.timeout_seconds??void 0,availableAt:X.available_at,expiresAt:b8(X.expires_at,"expires_at"),automationEligible:X.automation_eligible,createdBy:W,originSessionId:Q.sessionId,originTaskId:j.originTaskId},K={ok:!0,operation:X.operation,task:await $.manager.createTask(V)};return Qj($,X,Q,!0),K}case"update":{let V=b8(X.task_id,"task_id");if(mU(await $.manager.getTask(V),j),!X.expected_revision)throw Error("expected_revision is required for update");let K={ok:!0,operation:X.operation,task:await $.manager.updateTask({taskId:V,expectedRevision:X.expected_revision,type:X.type,title:X.title,description:X.description,instructions:X.instructions,scope:Y,workspaceRoot:j.workspaceRoot??null,cwd:X.cwd,resourcePaths:X.resource_paths,priority:X.priority,assignee:X.assignee,modelSelection:gU(X.model_selection),mode:X.mode,systemPrompt:X.system_prompt,maxIterations:X.max_iterations,timeoutSeconds:X.timeout_seconds,availableAt:X.available_at,expiresAt:X.expires_at,automationEligible:X.automation_eligible,updatedBy:W})};return Qj($,X,Q,!0),K}case"list":{let V={statuses:X.statuses,types:X.types,scope:Y,workspaceRoot:j.workspaceRoot,priorities:X.priorities,automationEligible:X.automation_eligible,limit:X.limit};return{ok:!0,operation:X.operation,tasks:await $.manager.listTasks(V)}}case"get":{let V=await $.manager.getTask(b8(X.task_id,"task_id"));return mU(V,j),{ok:!0,operation:X.operation,task:V}}}}catch(j){return Qj($,X,Q,!1),{ok:!1,operation:X.operation,error:{code:"task_operation_failed",message:j instanceof Error?j.message:String(j)}}}}var J2="tasks",d5='# 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 may include an IANA `timezone`.\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- 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.',Jj='# 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 may include an IANA `timezone`.\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. Include the goal, constraints, relevant project context, and expected output.\n- Only update, pause, resume, delete, or run a schedule immediately when the user asks for that action.',hC=k8.extend({kind:t1.literal("todo")}).strict(),uU=Q2.extend({kind:t1.literal("scheduled")}).strict(),l5=t1.discriminatedUnion("kind",[hC,uU]),vC=t1.discriminatedUnion("kind",[uU]),dU=["create","update","list","get","pause","resume","delete","run_now"],gC=t1.object({...Q2.shape,...k8.shape,kind:t1.enum(["todo","scheduled"]),operation:t1.enum(dU)}).strict(),mC=t1.object({...Q2.shape,kind:t1.enum(["scheduled"]),operation:t1.enum(dU)}).strict();function x8($){let Z=$.todo;return yC({name:J2,description:Z?'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:IC(Z?gC:mC),retryable:!1,maxRetries:0,execute:async(Q,J)=>{let X=(Z?l5:vC).safeParse(Q);if(!X.success)return{ok:!1,kind:typeof Q==="object"&&Q!==null&&"kind"in Q&&(Q.kind==="todo"||Q.kind==="scheduled")?Q.kind:void 0,error:{code:"invalid_tasks_input",message:X.error.issues[0]?.message??"Invalid tasks input"}};if(X.data.kind==="todo"){if(!Z)return{ok:!1,kind:"todo",error:{code:"invalid_tasks_input",message:'kind "todo" is not available in this session'}};return{kind:"todo",...await IQ(Z,X.data,J)}}return{kind:"scheduled",...await h5($.scheduled,X.data,J)}}})}function y8($){return{name:"hub-task-guidance",manifest:{capabilities:["rules"]},setup:(Z)=>{Z.registerRule({id:"hub:task-guidance",content:$?.todoEnabled===!1?Jj:d5,whenToolAvailable:J2})}}}import{createSessionId as dP,isHubProtocolCompatible as lP,resolveClineBuildEnv as pP,resolveHubCommandTimeoutMs as iP}from"@cline/shared";var lU={};f(lU,{splitCoreSessionConfig:()=>p5,isUnusableSessionError:()=>Xj,isSessionNotFoundError:()=>e1,SessionNotFoundError:()=>R$,SESSION_NOT_FOUND_ERROR_CODE:()=>e2});var e2="session_not_found";class R$ extends Error{sessionId;code="session_not_found";constructor($,Z){super(Z??($?`session not found: ${$}`:"session not found"));this.sessionId=$;this.name="SessionNotFoundError"}}function e1($){return $ instanceof R$||typeof $==="object"&&$!==null&&"code"in $&&$.code==="session_not_found"}function cC($){if($ instanceof Error)return $.message;if(typeof $==="object"&&$!==null&&"message"in $){let Z=$.message;return typeof Z==="string"?Z:""}return typeof $==="string"?$:""}function Xj($){if(e1($))return!0;if(typeof $==="object"&&$!==null&&"code"in $&&$.code==="session_run_in_progress")return!0;return cC($).includes("shutdown called while a run is in progress")}function p5($){let{hooks:Z,logger:Q,telemetry:J,extensionContext:X,extraTools:W,extensions:j,onTeamEvent:Y,onConsecutiveMistakeLimitReached:V,checkpoint:K,compaction:B,...G}=$,H={};if(Z)H.hooks=Z;if(Q)H.logger=Q;if(J)H.telemetry=J;if(X)H.extensionContext=X;if(W)H.extraTools=W;if(j)H.extensions=j;if(Y)H.onTeamEvent=Y;if(V)H.onConsecutiveMistakeLimitReached=V;if(K?.createCheckpoint)H.checkpoint=K;if(B?.compact)H.compaction=B;let U=Object.keys(H).length>0?H:void 0;return{config:{...G,...K?{checkpoint:{enabled:K.enabled}}:{},...B?{compaction:{enabled:B.enabled,strategy:B.strategy,preserveRecentTokens:B.preserveRecentTokens,summarizer:B.summarizer}}:{}},...U?{localRuntime:U}:{}}}import{spawn as FP}from"node:child_process";import{closeSync as DP,mkdirSync as LP,openSync as _P,readFileSync as zP,unlinkSync as OP}from"node:fs";import{basename as NP,dirname as qP,join as AP}from"node:path";import{fileURLToPath as TP}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as EP,isHubDaemonProcess as KF,resolveClineBuildEnv as BF,withResolvedClineBuildEnv as MP}from"@cline/shared";import{createHash as uC,randomBytes as sU}from"node:crypto";import{existsSync as dC}from"node:fs";import{mkdir as jj,open as iU,readFile as tU,rename as lC,rm as hQ,writeFile as pC}from"node:fs/promises";import{dirname as eU,join as Yj}from"node:path";import{isHubProtocolCompatible as iC}from"@cline/shared";import{resolveClineDataDir as Z6,resolveClineDir as $F}from"@cline/shared/storage";var X2="0.0.80";var $6={name:"@cline/core",description:"Cline Core SDK for Node Runtime",version:X2,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"}},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:{"@cline/agents":"workspace:*","@cline/shared":"workspace:*","@cline/llms":"workspace:*","@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",jiti:"^2.7.0","node-machine-id":"^1.1.12",nanoid:"^5.1.7","simple-git":"3.36.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/ws":"^8.18.1","posthog-node":"^5.8.0"},engines:{node:">=22"},files:["dist","!dist/**/*.d.ts.map"]};var rC="CLINE_HUB_DISCOVERY_PATH",aC="CLINE_HUB_BUILD_ID",nC="CLINE_HUB_BUILD_EPOCH_MS",oC=30000,sC=15000,rU=100;function tC($){return $.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function eC($){return uC("sha256").update($).digest("hex").slice(0,12)}function $P($){if(!Number.isInteger($)||!$||$<=0)return!1;try{return process.kill($,0),!0}catch(Z){return Z instanceof Error&&"code"in Z?String(Z.code)==="EPERM":!1}}function vQ(){return sU(32).toString("hex")}function aU($){return new Promise((Z)=>setTimeout(Z,$))}function ZP($){return`${$}.lock`}async function QP($){try{let Z=JSON.parse(await tU(Yj($,"owner.json"),"utf8"));if(typeof Z.pid!=="number"||typeof Z.acquiredAt!=="string")return;return{pid:Z.pid,acquiredAt:Z.acquiredAt}}catch{return}}async function Wj($){await hQ($,{recursive:!0,force:!0}).catch(()=>{return})}function _1(){let $=process.env[aC]?.trim();if($)return $;return"sdk-v1-7c774bb330e8f67a20a44c033269b28c159484476d222bf7d8155cfeea107d3c".trim()||`source-${String($6.version)}`}function i5(){let $=Number(process.env[nC]);if(Number.isFinite($)&&$>0)return $;return Number.isFinite(1787733879770)?1787733879770:void 0}function Q6($,Z=_1()){let Q=iC($);if(!Q.compatible)return Q;let J=$.buildId?.trim();if(!J)return{compatible:!1,reason:"missing_build"};if(J!==Z)return{compatible:!1,reason:"build_mismatch"};return{compatible:!0}}function nU($){return typeof $==="number"&&Number.isFinite($)&&$>0?$:void 0}function oU($){let Z=$?.trim().split(/[-+]/,1)[0];if(!Z)return;let Q=Z.split(".").map((J)=>Number(J));if(Q.length===0||Q.some((J)=>!Number.isInteger(J)||J<0))return;return Q}function JP($,Z){for(let Q=0;Q<Math.max($.length,Z.length);Q++){let J=$[Q]??0,X=Z[Q]??0;if(J!==X)return J<X?-1:1}return 0}function r5($,Z){let Q=$.buildId?.trim(),J=Z.buildId?.trim();if(Q&&J&&Q===J)return 0;let X=nU($.buildEpochMs),W=nU(Z.buildEpochMs);if(X!==void 0&&W!==void 0&&X!==W)return X<W?-1:1;let j=oU($.coreVersion),Y=oU(Z.coreVersion);if(j&&Y){let V=JP(j,Y);if(V!==0)return V}if(Q&&J&&Q!==J)return Q<J?-1:1;return 0}function a5(){return{buildId:_1(),buildEpochMs:i5(),coreVersion:String($6.version)}}function W2($,Z){let Q=Z?.self??a5(),J=Q6($,Q.buildId??"");if(J.compatible)return!0;if(J.reason!=="build_mismatch"&&J.reason!=="missing_build")return!1;return r5(Q,$)<=0}function C$($=process.argv[1]?.trim()||process.cwd()){let Z=`hub-${eC($)}`,Q=process.env[rC]?.trim()||Yj(Z6(),"locks","hub","owners",`${tC(Z)}.json`);return{ownerId:Z,discoveryPath:Q}}function ZF($=`hub-${Date.now().toString(36)}`){return C$($)}async function R0($){try{let Z=JSON.parse(await tU($,"utf8"));if(typeof Z.hubId!=="string"||typeof Z.protocolVersion!=="string"||typeof Z.authToken!=="string"||typeof Z.host!=="string"||typeof Z.port!=="number"||typeof Z.url!=="string"||typeof Z.startedAt!=="string"||typeof Z.updatedAt!=="string")return;return{hubId:Z.hubId,protocolVersion:Z.protocolVersion,minClientProtocolVersion:typeof Z.minClientProtocolVersion==="string"?Z.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof Z.maxClientProtocolVersion==="string"?Z.maxClientProtocolVersion:void 0,capabilities:Array.isArray(Z.capabilities)?Z.capabilities.filter((Q)=>typeof Q==="string"):void 0,coreVersion:typeof Z.coreVersion==="string"?Z.coreVersion:void 0,buildId:typeof Z.buildId==="string"?Z.buildId:void 0,buildEpochMs:typeof Z.buildEpochMs==="number"?Z.buildEpochMs:void 0,authToken:Z.authToken,host:Z.host,port:Z.port,url:Z.url,pid:typeof Z.pid==="number"?Z.pid:void 0,startedAt:Z.startedAt,updatedAt:Z.updatedAt}}catch{return}}async function I8($,Z){await Vj($,async()=>{let Q=eU($);await jj(Q,{recursive:!0});let J=`${$}.${process.pid}.${sU(6).toString("hex")}.tmp`,X;try{X=await iU(J,"wx",384),await X.writeFile(`${JSON.stringify(Z,null,2)}
295
+ WHERE run_id = ? AND claim_token = ?`).run($.error??null,$.scheduledFor??null,Z,$.runId,$.claimToken).changes??0)>0}attachSessionIdToRun($,Z){this.db.prepare("UPDATE cron_runs SET session_id = ?, updated_at = ? WHERE run_id = ?").run(Z,x0(),$)}attachReportPathToRun($,Z){this.db.prepare("UPDATE cron_runs SET report_path = ?, updated_at = ? WHERE run_id = ?").run(Z,x0(),$)}}function BQ($){return $?new Date($).getTime():void 0}function qR($){let Z=$.metadata?{...$.metadata}:void 0;if(Z)delete Z.__hubScheduleCreatedBy,delete Z.__hubScheduleCwd,delete Z.__hubRuntimeOptions;return Z}function b5($){let Z=$.metadata;return{scheduleId:$.externalId,name:$.title,cronPattern:$.triggerKind==="one_off"?KQ:$.scheduleExpr??"",timezone:$.triggerKind==="schedule"?$.timezone:void 0,prompt:$.prompt??"",workspaceRoot:$.workspaceRoot??"",cwd:typeof Z?.__hubScheduleCwd==="string"?Z.__hubScheduleCwd:void 0,modelSelection:$.providerId||$.modelId?{providerId:$.providerId??"",modelId:$.modelId??""}:void 0,enabled:$.enabled&&!$.removed&&$.parseStatus==="valid",mode:$.mode==="plan"?"plan":$.mode==="act"?"act":"yolo",systemPrompt:$.systemPrompt,maxIterations:$.maxIterations,timeoutSeconds:$.timeoutSeconds,maxParallel:$.maxParallel??1,createdAt:new Date($.createdAt).getTime(),updatedAt:new Date($.updatedAt).getTime(),nextRunAt:BQ($.nextRunAt),lastRunAt:BQ($.lastRunAt),createdBy:typeof Z?.__hubScheduleCreatedBy==="string"?Z.__hubScheduleCreatedBy:void 0,tags:$.tags,runtimeOptions:Z?.__hubRuntimeOptions&&typeof Z.__hubRuntimeOptions==="object"&&!Array.isArray(Z.__hubRuntimeOptions)?Z.__hubRuntimeOptions:void 0,metadata:qR($)}}function AR($){switch($){case"done":return"success";case"cancelled":return"aborted";case"running":return"running";case"queued":return"pending";default:return"failed"}}function pW($,Z){return{executionId:$.runId,scheduleId:Z,sessionId:$.sessionId,triggeredAt:new Date($.scheduledFor??$.createdAt).getTime(),startedAt:BQ($.startedAt),endedAt:BQ($.completedAt),status:AR($.status),errorMessage:$.error}}class A8{store;materializer;runner;started=!1;disposed=!1;constructor($){this.store=new S5({dbPath:$.dbPath}),this.materializer=new T5({store:this.store}),this.runner=new R5({store:this.store,materializer:this.materializer,runtimeHandlers:$.runtimeHandlers,eventPublisher:$.eventPublisher,workspaceRoot:"",specs:$.specs,logger:$.logger,pollIntervalMs:$.pollIntervalMs,claimLeaseSeconds:$.claimLeaseSeconds,globalMaxConcurrency:$.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($){if(this.validateScheduleTiming($.cronPattern,$.timezone,$.metadata,!0),!$.workspaceRoot?.trim())throw Error("workspaceRoot is required for schedules");return b5(this.store.createHubSchedule($))}getSchedule($){let Z=this.store.getHubSchedule($);return Z?b5(Z):void 0}listSchedules($={}){return this.store.listHubSchedules($).map((Z)=>b5(Z))}updateSchedule($,Z){let Q=this.store.getHubSchedule($);if(!Q)return;let J=Z.workspaceRoot!==void 0?Z.workspaceRoot.trim():Q.workspaceRoot,X=Z.enabled??Q.enabled,W=b5(Q),j=Z.cronPattern??W.cronPattern;if(j.trim()===KQ&&typeof Z.timezone==="string"&&Z.timezone.trim())throw Error("timezone is only supported for recurring schedules");if(this.validateScheduleTiming(j,j.trim()===KQ?void 0:Z.timezone===null?void 0:Z.timezone??W.timezone,Z.metadata??W.metadata,X),X&&!J)throw Error("workspaceRoot is required for enabled schedules");let Y=this.store.updateHubSchedule($,{...Z,scheduleId:$});return Y?b5(Y):void 0}validateScheduleTiming($,Z,Q,J){if($.trim()!==KQ){IH($),uW(Z);return}if(Z?.trim())throw Error("timezone is only supported for recurring schedules");let X=Q?.[NR];if(typeof X!=="number"||!Number.isFinite(X)||J&&X<=Date.now())throw Error("runAt must be a future timestamp")}deleteSchedule($){return this.store.deleteHubSchedule($)}pauseSchedule($){return this.updateSchedule($,{scheduleId:$,enabled:!1})}resumeSchedule($){return this.updateSchedule($,{scheduleId:$,enabled:!0})}async triggerScheduleNow($){let Z=this.store.enqueueHubScheduleRun($,"manual");if(!Z)return;await this.runner.tick();let Q=this.store.getRun(Z.runId)??Z;return pW(Q,$)}triggerScheduleNowDetached($){let Z=this.store.enqueueHubScheduleRun($,"manual");if(!Z)return;return this.runner.tick().catch(()=>{return}),pW(Z,$)}listScheduleExecutions($){let Z=$.scheduleId?this.store.getHubSchedule($.scheduleId):void 0,Q={specId:Z?.specId,limit:$.limit};return this.store.listRuns(Q).map((X)=>{let W=Z??this.store.getSpec(X.specId);if(!W||W.source!=="hub-schedule")return;return pW(X,W.externalId)}).filter((X)=>{if(!X)return!1;return!$.status||X.status===$.status})}getScheduleStats($){let Z=this.listScheduleExecutions({scheduleId:$,limit:1e4});if(Z.length===0)return{totalRuns:0,successRate:0,avgDurationSeconds:0};let Q=0,J=0,X=0,W;for(let j of Z){if(j.status==="success"||j.status==="completed")Q+=1;if(!W&&j.status!=="success"&&j.status!=="completed")W=j;if(j.startedAt&&j.endedAt)X+=j.endedAt-j.startedAt,J+=1}return{totalRuns:Z.length,successRate:Q/Z.length,avgDurationSeconds:J>0?X/J/1000:0,lastFailure:W}}getActiveExecutions(){return this.runner.getActiveRuns().flatMap(($)=>{let Z=this.store.getSpec($.specId);if(!Z||Z.source!=="hub-schedule"||!$.sessionId)return[];return[{executionId:$.runId,scheduleId:Z.externalId,sessionId:$.sessionId,startedAt:$.startedAt??new Date().toISOString(),timeoutAt:Z.timeoutSeconds&&$.startedAt?new Date(new Date($.startedAt).getTime()+Z.timeoutSeconds*1000).toISOString():void 0}]})}getUpcomingRuns($=20){let Z={triggerKind:"schedule",enabled:!0,limit:$};return this.store.listSpecs(Z).flatMap((Q)=>Q.source==="hub-schedule"&&Q.nextRunAt?[{spec:Q,nextRunAt:Q.nextRunAt}]:[]).sort((Q,J)=>String(Q.nextRunAt).localeCompare(String(J.nextRunAt))).slice(0,$).map(({spec:Q,nextRunAt:J})=>({scheduleId:Q.externalId,name:Q.title,nextRunAt:J}))}}q0();import{realpathSync as rW,statSync as kR}from"node:fs";import{isAbsolute as JU,relative as xR,sep as XU}from"node:path";import{ONE_TIME_SCHEDULE_CRON_PATTERN as WU,ONE_TIME_SCHEDULE_RUN_AT_METADATA_KEY as jU}from"@cline/shared";import{z as N0}from"zod";var yR=N0.enum(["create","update","list","get","pause","resume","delete","run_now"]),IR=N0.object({provider_id:N0.string().min(1),model_id:N0.string().min(1).optional()}),Q2=N0.object({operation:yR,schedule_id:N0.string().min(1).optional(),schedule_type:N0.enum(["once","recurring"]).optional(),name:N0.string().min(1).optional(),prompt:N0.string().min(1).optional(),run_at:N0.string().datetime({offset:!0}).optional(),cron_pattern:N0.string().min(1).optional(),timezone:N0.string().min(1).nullable().optional(),enabled:N0.boolean().optional(),mode:N0.enum(["act","plan","yolo"]).optional(),system_prompt:N0.string().nullable().optional(),max_iterations:N0.number().int().positive().nullable().optional(),timeout_seconds:N0.number().int().positive().nullable().optional(),max_parallel:N0.number().int().positive().max(32).optional(),tags:N0.array(N0.string().min(1)).optional(),model_selection:IR.optional(),limit:N0.number().int().positive().max(200).optional()});function E8($,Z,Q,J){if(!YU.has(Z.operation))return;o1($.telemetry,{ulid:Q.sessionId??Q.conversationId??Q.agentId,tool:`tasks.scheduled.${Z.operation}`,success:J,agentId:Q.agentId})}var YU=new Set(["create","update","pause","resume","delete","run_now"]);function R8($,Z){let Q=$?.trim();if(!Q)throw Error(`${Z} is required for this operation`);return Q}function aW($,Z){try{let Q=rW.native($);if(!kR(Q).isDirectory())throw Error("not a directory");return Q}catch{throw Error(`${Z} does not resolve to an existing safe path`)}}function hR($,Z){try{return rW.native($)===rW.native(Z)}catch{return!1}}function VU($,Z,Q){let J=xR($,Z);if(J===".."||J.startsWith(`..${XU}`)||JU(J))throw Error(`${Q} is outside the workspace scope`)}function KU($,Z,Q){return aW(JU(Z)?Z:`${$}${XU}${Z}`,Q)}function vR($){let Z=aW($.workspaceRoot,"workspaceRoot"),Q=$.cwd?KU(Z,$.cwd,"cwd"):Z;return VU(Z,Q,"cwd"),{...$,workspaceRoot:Z,cwd:Q}}function M8($,Z){if(!$)throw Error("schedule does not exist");if(!hR($.workspaceRoot,Z.workspaceRoot))throw Error("schedule is outside this session's workspace scope");let Q=aW($.workspaceRoot,"schedule workspaceRoot");if($.cwd){let J=KU(Q,$.cwd,"schedule cwd");VU(Q,J,"schedule cwd")}}function QU($){if(!$)return;return{providerId:$.provider_id.trim(),modelId:$.model_id?.trim()||void 0}}function iW($){if(!$)return;return[...new Set($.map((Z)=>Z.trim()).filter(Boolean))]}function BU($){let Z=Date.parse(R8($,"run_at"));if(!Number.isFinite(Z))throw Error("run_at must be an ISO timestamp");if(Z<=Date.now())throw Error("run_at must be in the future");return Z}function gR($){if($.schedule_type==="once"){if($.cron_pattern)throw Error("cron_pattern cannot be used with a one-time schedule");if($.timezone)throw Error("timezone is encoded in run_at for a one-time schedule");return{cronPattern:WU,metadata:{[jU]:BU($.run_at)}}}if($.schedule_type==="recurring"){if($.run_at)throw Error("run_at cannot be used with a recurring schedule");return{cronPattern:R8($.cron_pattern,"cron_pattern"),timezone:$.timezone?.trim()||void 0}}throw Error("schedule_type is required for create")}function mR($){if($.run_at&&$.cron_pattern)throw Error("run_at and cron_pattern cannot be updated together");if($.schedule_type==="once"||$.run_at){if($.cron_pattern)throw Error("cron_pattern cannot be used with a one-time schedule");if($.timezone)throw Error("timezone is encoded in run_at for a one-time schedule");return{cronPattern:WU,timezone:null,metadata:{[jU]:BU($.run_at)}}}if($.schedule_type==="recurring"||$.cron_pattern)return{cronPattern:R8($.cron_pattern,"cron_pattern"),timezone:$.timezone===null?null:$.timezone?.trim()||void 0};return{timezone:$.timezone===null?null:$.timezone?.trim()||void 0}}function I5($){return R8($.schedule_id,"schedule_id")}async function h5($,Z,Q){let J=Q2.safeParse(Z);if(!J.success)return{ok:!1,error:{code:"invalid_schedule_input",message:J.error.issues[0]?.message??"Invalid schedule input"}};let X=J.data;try{if(!Q.sessionId)throw Error("tasks requires a Hub session");let W=await $.resolveSessionDefaults(Q.sessionId);if(!W?.workspaceRoot.trim())throw Error("tasks could not resolve the current workspace");let j=vR(W);if(YU.has(X.operation)&&!j.interactive)throw Error("schedule mutations require an interactive user session");switch(X.operation){case"create":{let Y=$.schedules.createSchedule({name:R8(X.name,"name"),...gR(X),prompt:R8(X.prompt,"prompt"),workspaceRoot:j.workspaceRoot,cwd:j.cwd,modelSelection:QU(X.model_selection)??j.modelSelection,enabled:X.enabled,mode:X.mode??"yolo",systemPrompt:X.system_prompt??void 0,maxIterations:X.max_iterations??void 0,timeoutSeconds:X.timeout_seconds??void 0,maxParallel:X.max_parallel??1,createdBy:`agent:${Q.agentId}`,tags:iW(X.tags)});return $.publish?.("schedule.created",{schedule:Y},Q.sessionId),E8($,X,Q,!0),{ok:!0,operation:X.operation,schedule:Y}}case"update":{let Y=I5(X);M8($.schedules.getSchedule(Y),j);let V=$.schedules.updateSchedule(Y,{scheduleId:Y,...mR(X),name:X.name?.trim()||void 0,prompt:X.prompt?.trim()||void 0,modelSelection:QU(X.model_selection),enabled:X.enabled,mode:X.mode,systemPrompt:X.system_prompt,maxIterations:X.max_iterations,timeoutSeconds:X.timeout_seconds,maxParallel:X.max_parallel,tags:iW(X.tags)});if(!V)throw Error("schedule does not exist");return $.publish?.("schedule.updated",{schedule:V},Q.sessionId),E8($,X,Q,!0),{ok:!0,operation:X.operation,schedule:V}}case"list":{let Y=$.schedules.listSchedules({enabled:X.enabled,tags:iW(X.tags),workspaceRoot:j.workspaceRoot,limit:X.limit??50}).filter((V)=>{try{return M8(V,j),!0}catch{return!1}}).slice(0,X.limit??50);return{ok:!0,operation:X.operation,schedules:Y}}case"get":{let Y=$.schedules.getSchedule(I5(X));return M8(Y,j),{ok:!0,operation:X.operation,schedule:Y}}case"pause":case"resume":{let Y=I5(X);M8($.schedules.getSchedule(Y),j);let V=X.operation==="pause"?$.schedules.pauseSchedule(Y):$.schedules.resumeSchedule(Y);if(!V)throw Error("schedule does not exist");return $.publish?.("schedule.updated",{schedule:V},Q.sessionId),E8($,X,Q,!0),{ok:!0,operation:X.operation,schedule:V}}case"delete":{let Y=I5(X);M8($.schedules.getSchedule(Y),j);let V=$.schedules.deleteSchedule(Y);if(!V)throw Error("schedule does not exist");return $.publish?.("schedule.deleted",{deleted:V,scheduleId:Y},Q.sessionId),E8($,X,Q,!0),{ok:!0,operation:X.operation,deleted:V}}case"run_now":{let Y=I5(X);M8($.schedules.getSchedule(Y),j);let V=$.schedules.triggerScheduleNowDetached(Y);if(!V)throw Error("schedule does not exist");return $.publish?.("schedule.triggered",{execution:V},Q.sessionId),E8($,X,Q,!0),{ok:!0,operation:X.operation,execution:V}}}}catch(W){return E8($,X,Q,!1),{ok:!1,operation:X.operation,error:{code:"schedule_operation_failed",message:W instanceof Error?W.message:String(W)}}}}yQ();import{createTool as yC,zodToJsonSchema as IC}from"@cline/shared";import{z as t1}from"zod";q0();import{resolve as IU}from"node:path";import{z as $0}from"zod";var hU=$0.enum(["suggestion","follow-up","todo","handoff","idea","reminder"]),SC=$0.enum(["pending_approval","approved","in_progress","completed","failed","cancelled","expired"]),vU=$0.union([$0.literal(0),$0.literal(1),$0.literal(2),$0.literal(3),$0.literal(4),$0.literal(5)]),bC=$0.object({provider_id:$0.string().min(1),model_id:$0.string().min(1).optional()}),k8=$0.object({operation:$0.enum(["create","update","list","get"]),task_id:$0.string().min(1).optional(),expected_revision:$0.number().int().positive().optional(),type:hU.optional(),title:$0.string().min(1).optional(),description:$0.string().nullable().optional(),instructions:$0.string().min(1).optional(),scope:$0.enum(["workspace","global"]).optional(),workspace_root:$0.string().min(1).nullable().optional(),cwd:$0.string().min(1).nullable().optional(),resource_paths:$0.array($0.string().min(1)).optional(),priority:vU.optional(),assignee:$0.string().min(1).nullable().optional(),model_selection:bC.nullable().optional(),mode:$0.enum(["act","plan","yolo"]).nullable().optional(),system_prompt:$0.string().nullable().optional(),max_iterations:$0.number().int().positive().nullable().optional(),timeout_seconds:$0.number().int().positive().nullable().optional(),available_at:$0.string().datetime().optional(),expires_at:$0.string().datetime().optional(),automation_eligible:$0.boolean().optional(),statuses:$0.array(SC).optional(),types:$0.array(hU).optional(),priorities:$0.array(vU).optional(),limit:$0.number().int().positive().max(500).optional()}),kC=new Set(["create","update"]);function Qj($,Z,Q,J){if(!kC.has(Z.operation))return;o1($.telemetry,{ulid:Q.sessionId??Q.conversationId??Q.agentId,tool:`tasks.todo.${Z.operation}`,success:J,agentId:Q.agentId})}function b8($,Z){let Q=$?.trim();if(!Q)throw Error(`${Z} is required for this operation`);return Q}function gU($){if($===void 0||$===null)return $;return{providerId:$.provider_id,modelId:$.model_id}}function cU($,Z){return IU($)===IU(Z)}function mU($,Z){if(!$)throw Error("task does not exist");if(Z.workspaceRoot){if($.scope!=="workspace"||!$.workspaceRoot||!cU($.workspaceRoot,Z.workspaceRoot))throw Error("task is outside this session's workspace scope");return}if($.scope!=="global")throw Error("task is outside this session's global scope")}function xC($,Z){let Q=Z.workspaceRoot?"workspace":"global";if($.scope&&$.scope!==Q)throw Error(`this session can only manage ${Q} tasks`);if($.workspace_root!==void 0){if(!Z.workspaceRoot||$.workspace_root===null||!cU($.workspace_root,Z.workspaceRoot))throw Error(`this session can only manage ${Q} tasks`)}return Q}async function IQ($,Z,Q){let J=k8.safeParse(Z);if(!J.success)return{ok:!1,error:{code:"invalid_task_input",message:J.error.issues[0]?.message??"Invalid task input"}};let X=J.data,W={kind:"agent",id:Q.agentId,agentId:Q.agentId,sessionId:Q.sessionId};try{if(!Q.sessionId)throw Error("tasks requires a Hub session");let j=await $.resolveSessionDefaults(Q.sessionId);if(!j)throw Error("tasks could not resolve the current session");let Y=xC(X,j);switch(X.operation){case"create":{let V={type:b8(X.type,"type"),title:b8(X.title,"title"),description:X.description??void 0,instructions:b8(X.instructions,"instructions"),scope:Y,workspaceRoot:j.workspaceRoot,cwd:Y==="workspace"?(X.cwd??j.cwd)?.trim()||void 0:void 0,resourcePaths:X.resource_paths,priority:X.priority,assignee:X.assignee??void 0,modelSelection:gU(X.model_selection)??j.modelSelection,mode:X.mode??void 0,systemPrompt:X.system_prompt??void 0,maxIterations:X.max_iterations??void 0,timeoutSeconds:X.timeout_seconds??void 0,availableAt:X.available_at,expiresAt:b8(X.expires_at,"expires_at"),automationEligible:X.automation_eligible,createdBy:W,originSessionId:Q.sessionId,originTaskId:j.originTaskId},K={ok:!0,operation:X.operation,task:await $.manager.createTask(V)};return Qj($,X,Q,!0),K}case"update":{let V=b8(X.task_id,"task_id");if(mU(await $.manager.getTask(V),j),!X.expected_revision)throw Error("expected_revision is required for update");let K={ok:!0,operation:X.operation,task:await $.manager.updateTask({taskId:V,expectedRevision:X.expected_revision,type:X.type,title:X.title,description:X.description,instructions:X.instructions,scope:Y,workspaceRoot:j.workspaceRoot??null,cwd:X.cwd,resourcePaths:X.resource_paths,priority:X.priority,assignee:X.assignee,modelSelection:gU(X.model_selection),mode:X.mode,systemPrompt:X.system_prompt,maxIterations:X.max_iterations,timeoutSeconds:X.timeout_seconds,availableAt:X.available_at,expiresAt:X.expires_at,automationEligible:X.automation_eligible,updatedBy:W})};return Qj($,X,Q,!0),K}case"list":{let V={statuses:X.statuses,types:X.types,scope:Y,workspaceRoot:j.workspaceRoot,priorities:X.priorities,automationEligible:X.automation_eligible,limit:X.limit};return{ok:!0,operation:X.operation,tasks:await $.manager.listTasks(V)}}case"get":{let V=await $.manager.getTask(b8(X.task_id,"task_id"));return mU(V,j),{ok:!0,operation:X.operation,task:V}}}}catch(j){return Qj($,X,Q,!1),{ok:!1,operation:X.operation,error:{code:"task_operation_failed",message:j instanceof Error?j.message:String(j)}}}}var J2="tasks",d5='# 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 may include an IANA `timezone`.\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- 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.',Jj='# 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 may include an IANA `timezone`.\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. Include the goal, constraints, relevant project context, and expected output.\n- Only update, pause, resume, delete, or run a schedule immediately when the user asks for that action.',hC=k8.extend({kind:t1.literal("todo")}).strict(),uU=Q2.extend({kind:t1.literal("scheduled")}).strict(),l5=t1.discriminatedUnion("kind",[hC,uU]),vC=t1.discriminatedUnion("kind",[uU]),dU=["create","update","list","get","pause","resume","delete","run_now"],gC=t1.object({...Q2.shape,...k8.shape,kind:t1.enum(["todo","scheduled"]),operation:t1.enum(dU)}).strict(),mC=t1.object({...Q2.shape,kind:t1.enum(["scheduled"]),operation:t1.enum(dU)}).strict();function x8($){let Z=$.todo;return yC({name:J2,description:Z?'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:IC(Z?gC:mC),retryable:!1,maxRetries:0,execute:async(Q,J)=>{let X=(Z?l5:vC).safeParse(Q);if(!X.success)return{ok:!1,kind:typeof Q==="object"&&Q!==null&&"kind"in Q&&(Q.kind==="todo"||Q.kind==="scheduled")?Q.kind:void 0,error:{code:"invalid_tasks_input",message:X.error.issues[0]?.message??"Invalid tasks input"}};if(X.data.kind==="todo"){if(!Z)return{ok:!1,kind:"todo",error:{code:"invalid_tasks_input",message:'kind "todo" is not available in this session'}};return{kind:"todo",...await IQ(Z,X.data,J)}}return{kind:"scheduled",...await h5($.scheduled,X.data,J)}}})}function y8($){return{name:"hub-task-guidance",manifest:{capabilities:["rules"]},setup:(Z)=>{Z.registerRule({id:"hub:task-guidance",content:$?.todoEnabled===!1?Jj:d5,whenToolAvailable:J2})}}}import{createSessionId as dP,isHubProtocolCompatible as lP,resolveClineBuildEnv as pP,resolveHubCommandTimeoutMs as iP}from"@cline/shared";var lU={};f(lU,{splitCoreSessionConfig:()=>p5,isUnusableSessionError:()=>Xj,isSessionNotFoundError:()=>e1,SessionNotFoundError:()=>R$,SESSION_NOT_FOUND_ERROR_CODE:()=>e2});var e2="session_not_found";class R$ extends Error{sessionId;code="session_not_found";constructor($,Z){super(Z??($?`session not found: ${$}`:"session not found"));this.sessionId=$;this.name="SessionNotFoundError"}}function e1($){return $ instanceof R$||typeof $==="object"&&$!==null&&"code"in $&&$.code==="session_not_found"}function cC($){if($ instanceof Error)return $.message;if(typeof $==="object"&&$!==null&&"message"in $){let Z=$.message;return typeof Z==="string"?Z:""}return typeof $==="string"?$:""}function Xj($){if(e1($))return!0;if(typeof $==="object"&&$!==null&&"code"in $&&$.code==="session_run_in_progress")return!0;return cC($).includes("shutdown called while a run is in progress")}function p5($){let{hooks:Z,logger:Q,telemetry:J,extensionContext:X,extraTools:W,extensions:j,onTeamEvent:Y,onConsecutiveMistakeLimitReached:V,checkpoint:K,compaction:B,...G}=$,H={};if(Z)H.hooks=Z;if(Q)H.logger=Q;if(J)H.telemetry=J;if(X)H.extensionContext=X;if(W)H.extraTools=W;if(j)H.extensions=j;if(Y)H.onTeamEvent=Y;if(V)H.onConsecutiveMistakeLimitReached=V;if(K?.createCheckpoint)H.checkpoint=K;if(B?.compact)H.compaction=B;let U=Object.keys(H).length>0?H:void 0;return{config:{...G,...K?{checkpoint:{enabled:K.enabled}}:{},...B?{compaction:{enabled:B.enabled,strategy:B.strategy,preserveRecentTokens:B.preserveRecentTokens,summarizer:B.summarizer}}:{}},...U?{localRuntime:U}:{}}}import{spawn as FP}from"node:child_process";import{closeSync as DP,mkdirSync as LP,openSync as _P,readFileSync as zP,unlinkSync as OP}from"node:fs";import{basename as NP,dirname as qP,join as AP}from"node:path";import{fileURLToPath as TP}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as EP,isHubDaemonProcess as KF,resolveClineBuildEnv as BF,withResolvedClineBuildEnv as MP}from"@cline/shared";import{createHash as uC,randomBytes as sU}from"node:crypto";import{existsSync as dC}from"node:fs";import{mkdir as jj,open as iU,readFile as tU,rename as lC,rm as hQ,writeFile as pC}from"node:fs/promises";import{dirname as eU,join as Yj}from"node:path";import{isHubProtocolCompatible as iC}from"@cline/shared";import{resolveClineDataDir as Z6,resolveClineDir as $F}from"@cline/shared/storage";var X2="0.0.81";var $6={name:"@cline/core",description:"Cline Core SDK for Node Runtime",version:X2,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"}},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:{"@cline/agents":"workspace:*","@cline/shared":"workspace:*","@cline/llms":"workspace:*","@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",jiti:"^2.7.0","node-machine-id":"^1.1.12",nanoid:"^5.1.7","simple-git":"3.36.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/ws":"^8.18.1","posthog-node":"^5.8.0"},engines:{node:">=22"},files:["dist","!dist/**/*.d.ts.map"]};var rC="CLINE_HUB_DISCOVERY_PATH",aC="CLINE_HUB_BUILD_ID",nC="CLINE_HUB_BUILD_EPOCH_MS",oC=30000,sC=15000,rU=100;function tC($){return $.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function eC($){return uC("sha256").update($).digest("hex").slice(0,12)}function $P($){if(!Number.isInteger($)||!$||$<=0)return!1;try{return process.kill($,0),!0}catch(Z){return Z instanceof Error&&"code"in Z?String(Z.code)==="EPERM":!1}}function vQ(){return sU(32).toString("hex")}function aU($){return new Promise((Z)=>setTimeout(Z,$))}function ZP($){return`${$}.lock`}async function QP($){try{let Z=JSON.parse(await tU(Yj($,"owner.json"),"utf8"));if(typeof Z.pid!=="number"||typeof Z.acquiredAt!=="string")return;return{pid:Z.pid,acquiredAt:Z.acquiredAt}}catch{return}}async function Wj($){await hQ($,{recursive:!0,force:!0}).catch(()=>{return})}function _1(){let $=process.env[aC]?.trim();if($)return $;return"sdk-v1-de9deb37f4cb8cc9eb360a3aafe9a44f52cc6b6ca6b75b2a98c16c7a5d68a027".trim()||`source-${String($6.version)}`}function i5(){let $=Number(process.env[nC]);if(Number.isFinite($)&&$>0)return $;return Number.isFinite(1787736998718)?1787736998718:void 0}function Q6($,Z=_1()){let Q=iC($);if(!Q.compatible)return Q;let J=$.buildId?.trim();if(!J)return{compatible:!1,reason:"missing_build"};if(J!==Z)return{compatible:!1,reason:"build_mismatch"};return{compatible:!0}}function nU($){return typeof $==="number"&&Number.isFinite($)&&$>0?$:void 0}function oU($){let Z=$?.trim().split(/[-+]/,1)[0];if(!Z)return;let Q=Z.split(".").map((J)=>Number(J));if(Q.length===0||Q.some((J)=>!Number.isInteger(J)||J<0))return;return Q}function JP($,Z){for(let Q=0;Q<Math.max($.length,Z.length);Q++){let J=$[Q]??0,X=Z[Q]??0;if(J!==X)return J<X?-1:1}return 0}function r5($,Z){let Q=$.buildId?.trim(),J=Z.buildId?.trim();if(Q&&J&&Q===J)return 0;let X=nU($.buildEpochMs),W=nU(Z.buildEpochMs);if(X!==void 0&&W!==void 0&&X!==W)return X<W?-1:1;let j=oU($.coreVersion),Y=oU(Z.coreVersion);if(j&&Y){let V=JP(j,Y);if(V!==0)return V}if(Q&&J&&Q!==J)return Q<J?-1:1;return 0}function a5(){return{buildId:_1(),buildEpochMs:i5(),coreVersion:String($6.version)}}function W2($,Z){let Q=Z?.self??a5(),J=Q6($,Q.buildId??"");if(J.compatible)return!0;if(J.reason!=="build_mismatch"&&J.reason!=="missing_build")return!1;return r5(Q,$)<=0}function C$($=process.argv[1]?.trim()||process.cwd()){let Z=`hub-${eC($)}`,Q=process.env[rC]?.trim()||Yj(Z6(),"locks","hub","owners",`${tC(Z)}.json`);return{ownerId:Z,discoveryPath:Q}}function ZF($=`hub-${Date.now().toString(36)}`){return C$($)}async function R0($){try{let Z=JSON.parse(await tU($,"utf8"));if(typeof Z.hubId!=="string"||typeof Z.protocolVersion!=="string"||typeof Z.authToken!=="string"||typeof Z.host!=="string"||typeof Z.port!=="number"||typeof Z.url!=="string"||typeof Z.startedAt!=="string"||typeof Z.updatedAt!=="string")return;return{hubId:Z.hubId,protocolVersion:Z.protocolVersion,minClientProtocolVersion:typeof Z.minClientProtocolVersion==="string"?Z.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof Z.maxClientProtocolVersion==="string"?Z.maxClientProtocolVersion:void 0,capabilities:Array.isArray(Z.capabilities)?Z.capabilities.filter((Q)=>typeof Q==="string"):void 0,coreVersion:typeof Z.coreVersion==="string"?Z.coreVersion:void 0,buildId:typeof Z.buildId==="string"?Z.buildId:void 0,buildEpochMs:typeof Z.buildEpochMs==="number"?Z.buildEpochMs:void 0,authToken:Z.authToken,host:Z.host,port:Z.port,url:Z.url,pid:typeof Z.pid==="number"?Z.pid:void 0,startedAt:Z.startedAt,updatedAt:Z.updatedAt}}catch{return}}async function I8($,Z){await Vj($,async()=>{let Q=eU($);await jj(Q,{recursive:!0});let J=`${$}.${process.pid}.${sU(6).toString("hex")}.tmp`,X;try{X=await iU(J,"wx",384),await X.writeFile(`${JSON.stringify(Z,null,2)}
296
296
  `,{encoding:"utf8"}),await X.sync(),await X.close(),X=void 0,await lC(J,$);let W;try{W=await iU(Q,"r"),await W.sync()}catch{}finally{await W?.close().catch(()=>{return})}}catch(W){throw await X?.close().catch(()=>{return}),await hQ(J,{force:!0}).catch(()=>{return}),W}})}async function I1($){await Vj($,async()=>{await hQ($,{force:!0}).catch(()=>{return})})}async function gQ($,Z){return await Vj($,async()=>{if((await R0($))?.hubId!==Z)return!1;return await hQ($,{force:!0}),!0})}async function QF($,Z,Q){let J=ZP($);await jj(eU(J),{recursive:!0});let X=Date.now()+sC;while(!0){try{await jj(J,{recursive:!1})}catch(W){if((W instanceof Error&&"code"in W?String(W.code):"")!=="EEXIST")throw W;let Y=await QP(J);if(!Y){if(Date.now()>=X){await Wj(J);continue}await aU(rU);continue}let V=Date.now()-Date.parse(Y.acquiredAt);if(!$P(Y.pid)||V>oC){await Wj(J);continue}if(Date.now()>=X)throw Error(`Timed out waiting for hub ${Z} lock ${J}`);await aU(rU);continue}try{return await pC(Yj(J,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
297
297
  `,"utf8"),await Q()}finally{await Wj(J)}}}function Vj($,Z){return QF(`${$}.mutation`,"discovery mutation",Z)}function h8($,Z){return QF($,"startup",Z)}async function h1($,Z){try{let Q=await fetch(Z?.authToken?Kj($):mQ($),{headers:Z?.authToken?{authorization:`Bearer ${Z.authToken}`}:void 0});if(!Q.ok)return;let J=await Q.json();if(typeof J.protocolVersion!=="string"||typeof J.host!=="string"||typeof J.port!=="number"||typeof J.url!=="string")return;return{protocolVersion:J.protocolVersion,minClientProtocolVersion:typeof J.minClientProtocolVersion==="string"?J.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof J.maxClientProtocolVersion==="string"?J.maxClientProtocolVersion:void 0,capabilities:Array.isArray(J.capabilities)?J.capabilities.filter((X)=>typeof X==="string"):void 0,coreVersion:typeof J.coreVersion==="string"?J.coreVersion:void 0,buildId:typeof J.buildId==="string"?J.buildId:void 0,buildEpochMs:typeof J.buildEpochMs==="number"?J.buildEpochMs:void 0,host:J.host,port:J.port,url:J.url,hubId:typeof J.hubId==="string"?J.hubId:void 0,authToken:typeof J.authToken==="string"?J.authToken:void 0,pid:typeof J.pid==="number"?J.pid:void 0,startedAt:typeof J.startedAt==="string"?J.startedAt:void 0,updatedAt:typeof J.updatedAt==="string"?J.updatedAt:void 0}}catch{return}}function v1($,Z,Q="/hub"){return new URL(`ws://${$}:${Z}${Q}`).toString()}function mQ($){let Z=new URL($);return Z.protocol=Z.protocol==="wss:"?"https:":"http:",Z.pathname="/health",Z.search="",Z.toString()}function Kj($){let Z=new URL(mQ($));return Z.pathname="/status",Z.toString()}function JF($){return dC($)}import{CLINE_HUB_DEV_PORT as XP,CLINE_HUB_PORT as WP,resolveClineBuildEnv as jP}from"@cline/shared";var YP="CLINE_HUB_HOST",VP="CLINE_HUB_PORT",KP="CLINE_HUB_PATHNAME",Bj="127.0.0.1",Gj=WP,Hj="/hub";function XF($){return jP($)==="development"?XP:Gj}function Uj($={}){return($.env??process.env)[YP]?.trim()||Bj}function v8($={}){let Q=($.env??process.env)[VP]?.trim();if(!Q)return XF($);let J=Number.parseInt(Q,10);if(!Number.isInteger(J)||J<1||J>65535)return XF($);return J}function Fj($={}){return($.env??process.env)[KP]?.trim()||Hj}function P$($={},Z={}){return{host:$.host??Uj(Z),port:$.port??v8(Z),pathname:$.pathname??Fj(Z)}}import{join as BP}from"node:path";var GP="shared:cline",HP="CLINE_HUB_DISCOVERY_PATH",UP="hub-production";function WF($){let Z=n1($.trim());return C$(`workspace:${Z||$.trim()}`)}function j1($=GP){return C$(`${$}@${_1()}`)}function z1(){return{ownerId:UP,discoveryPath:process.env[HP]?.trim()||BP(Z6(),"locks","hub","production.json")}}var RP=8000,CP=200,jF=3000,PP=100,fP=[100,250,500,1000,2000],wP="--cline-hub-daemon",SP=3,bP=60000,_j=new Map,GF={resetRetireAttempts(){_j.clear()}};function kP($,Z=Date.now()){let Q=_j.get($);if(!Q||Z-Q.windowStartedAt>bP)return _j.set($,{count:1,windowStartedAt:Z}),!0;return Q.count+=1,Q.count<=SP}function xP($){return[...$.host?["--host",$.host]:[],...typeof $.port==="number"?["--port",String($.port)]:[],...$.pathname?["--pathname",$.pathname]:[]]}function yP(){try{let $=AP(Z6(),"logs","hub-daemon.log");return LP(qP($),{recursive:!0}),{fd:_P($,"a"),logPath:$}}catch{return}}function IP(){return BF()==="production"?z1():j1()}function n5($){return W2($)}function zj($){try{let Z=JSON.parse(zP(`${$}.superseded`,"utf8"));return{url:typeof Z.url==="string"?Z.url:void 0,authToken:typeof Z.authToken==="string"?Z.authToken:void 0,pid:typeof Z.pid==="number"?Z.pid:void 0}}catch{return}}function Dj($){try{OP(`${$}.superseded`)}catch{}}function YF($,Z,Q){if(!Z||Z.url!==Q)return $;return{...$,authToken:$.authToken??Z.authToken,pid:$.pid??Z.pid}}async function o5($,Z){try{return await h1($,{authToken:Z})}catch{return}}async function VF($,Z){let Q=Date.now()+Z;while(Date.now()<Q){if(!(await o5($))?.url)return!0;await new Promise((X)=>setTimeout(X,PP))}return!1}async function J6($,Z){if(!kP($.url))return!1;await uQ($.url,$.authToken,"retired by newer install").catch(()=>!1),await e5($.url,$.authToken).catch(()=>!1);let Q=await VF($.url,jF);if(!Q&&$.pid&&hP($.pid)){try{process.kill($.pid,"SIGTERM")}catch{}Q=await VF($.url,jF)}if(Q)await I1(Z).catch(()=>{return});return Q}function hP($){try{return process.kill($,0),!0}catch(Z){return Z?.code==="EPERM"}}async function s5($){try{return!await g8($.url,$.authToken)}catch{return!1}}async function Lj($,Z){if(n5($))return"reusable";if(await s5($))return"deferred_busy";return await J6($,Z)?"retired":"failed"}async function vP($){if(BF()!=="production")return;let Z=j1();if(Z.discoveryPath===$.discoveryPath)return;let Q=await R0(Z.discoveryPath);if(Q?.url)await J6(Q,Z.discoveryPath);else await I1(Z.discoveryPath).catch(()=>{return})}function gP(){let $=import.meta.url.endsWith(".ts")?"ts":"js";return TP(new URL(`./entry.${$}`,import.meta.url))}function mP($,Z){let Q=gP(),J=process.execPath?.trim();if(!J)throw Error("unable to resolve runtime executable for hub daemon");let X=NP(J).toLowerCase().includes("bun"),W=Q.startsWith("/$bunfs/"),j=X&&Q.toLowerCase().endsWith(".ts"),Y=W?[wP]:[...j?["--conditions=development"]:[],Q];return{launcher:J,args:[...Y,"--cwd",$,...xP(Z)],cwd:$,env:{...MP(process.env),CLINE_NO_INTERACTIVE:"1",[EP]:"1"}}}function cP($){if(!$||typeof $!=="object")return!1;if(("code"in $?$.code:void 0)==="ETXTBSY")return!0;let Q="message"in $?$.message:void 0;return typeof Q==="string"&&Q.includes("ETXTBSY")}function Oj($,Z={}){if(KF())return;let Q=mP($,Z),J=yP();try{FP(Q.launcher,Q.args,{detached:!0,stdio:J?["ignore",J.fd,J.fd]:"ignore",env:Q.env,cwd:Q.cwd,windowsHide:!0}).unref()}finally{if(J)DP(J.fd)}}async function Nj($,Z={}){for(let Q=0;;Q++)try{Oj($,Z);return}catch(J){let X=fP[Q];if(!cP(J)||X===void 0)throw J;await new Promise((W)=>setTimeout(W,X))}}function cQ($,Z={}){if(KF())return;t5($,Z).catch(()=>{})}async function uP($,Z,Q={}){let J=Q.host!==void 0||Q.port!==void 0||Q.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),X=P$(Q),W=v1(X.host,X.port,X.pathname),j=(F)=>{if(!J)j2(F.url,F.authToken);return F};await vP($).catch(()=>{return});let Y=await R0($.discoveryPath),V=Y?.url?void 0:zj($.discoveryPath),K=!1;if(Y?.url){let F=Y.authToken;if(!F)K=!0,await J6(Y,$.discoveryPath);else{let D=await o5(Y.url,F);if(D?.url&&n5(D)&&await e0(D.url,{authToken:F}))return Dj($.discoveryPath),j({url:D.url,authToken:F});if(D?.url){if(await Lj({...D,authToken:F},$.discoveryPath)==="deferred_busy"&&await e0(D.url,{authToken:F}))return j({url:D.url,authToken:F})}else await I1($.discoveryPath).catch(()=>{return})}}let B=await o5(W);if(B?.url){let F=YF(B,Y??V,W);if(n5(B)){let L=[B.authToken,Y?.authToken,V?.authToken].filter((_)=>typeof _==="string"&&_.trim().length>0);for(let _ of L){if(!await e0(B.url,{authToken:_}))continue;let O={hubId:B.hubId??`repaired-${B.port}`,protocolVersion:B.protocolVersion,minClientProtocolVersion:B.minClientProtocolVersion,maxClientProtocolVersion:B.maxClientProtocolVersion,capabilities:B.capabilities,coreVersion:B.coreVersion,buildId:B.buildId,authToken:_,host:B.host,port:B.port,url:B.url,pid:B.pid??Y?.pid??V?.pid,startedAt:B.startedAt??new Date().toISOString(),updatedAt:new Date().toISOString()};try{await I8($.discoveryPath,O)}catch{}return Dj($.discoveryPath),j({url:B.url,authToken:_})}throw Error(`A compatible Cline Hub is already running at ${W}, but its discovery record is missing or unreadable and no usable auth token is available. Run 'cline doctor fix' to repair local hub discovery.${K?" 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 D=await Lj(F,$.discoveryPath);if(D==="deferred_busy"){for(let L of[F.authToken,Y?.authToken].filter((z)=>typeof z==="string"&&z.trim().length>0))if(await e0(B.url,{authToken:L}))return j({url:B.url,authToken:L});if(Q.allowPortFallback!==!0&&X.port!==0)throw Error(`An older Cline Hub is running at ${W} 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(D==="failed"&&Q.allowPortFallback!==!0&&X.port!==0)throw Error(`An incompatible Cline Hub is already running at ${W} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}let H=Q.allowPortFallback===!0&&X.port!==0?{...X,port:0}:X;await Nj(Z,H);let U=Date.now()+RP;while(Date.now()<U){let F=await R0($.discoveryPath);if(F?.url&&F.authToken){let L=await o5(F.url,F.authToken);if(L?.url&&n5(L)&&await e0(L.url,{authToken:F.authToken}))return Dj($.discoveryPath),j({url:L.url,authToken:F.authToken})}let D=await o5(W);if(D?.url&&!n5(D)){let L=YF(D,F??V,W),z=await Lj(L,$.discoveryPath);if(z==="deferred_busy"&&F?.authToken&&await e0(D.url,{authToken:F.authToken}))return j({url:D.url,authToken:F.authToken});if(z==="failed"&&Q.allowPortFallback!==!0&&X.port!==0)throw Error(`An incompatible Cline Hub is still running at ${W} and could not be retired automatically. Run 'cline doctor fix' to stop stale hub daemons before starting a new hub.`)}await new Promise((L)=>setTimeout(L,CP))}throw Error("Timed out waiting for detached hub startup.")}async function t5($,Z={}){let Q=IP();return await h8(Q.discoveryPath,async()=>uP(Q,$,Z))}function Mj(){return pP()==="production"?z1():j1()}function rP(){let $=globalThis.WebSocket;if(!$)throw Error("Global WebSocket is not available in this runtime. Node 22+ is required for hub mode.");return $}function DF($){if(typeof $==="string")return $;if($ instanceof Uint8Array)return Buffer.from($).toString();if($ instanceof ArrayBuffer)return Buffer.from($).toString();if(Array.isArray($))return Buffer.concat($.map((Z)=>Buffer.from(Z))).toString();if($&&typeof $==="object"&&"data"in $&&typeof $.data<"u")return DF($.data);return String($)}function aP($){if(typeof $==="string")return $;if($ instanceof Uint8Array)return Buffer.from($).toString("utf8");if($ instanceof ArrayBuffer)return Buffer.from($).toString("utf8");return""}function HF($){let Z=$,Q=aP(Z.reason);return new $1("hub_connection_closed",Z.code||Q?`Hub connection closed (code=${Z.code??0}${Q?`, reason=${Q}`:""})`:Aj,{closeCode:Z.code,closeReason:Q||void 0})}function nP($,Z){if($ instanceof $1)return $;if($ instanceof Error)return new $1("hub_connect_failed",$.message);if($&&typeof $==="object"&&"error"in $&&$.error instanceof Error)return new $1("hub_connect_failed",$.error.message);let Q=$&&typeof $==="object"&&"message"in $&&typeof $.message==="string"?$.message.trim():"";if(Q)return new $1("hub_connect_failed",Q);let J=$&&typeof $==="object"&&"type"in $&&typeof $.type==="string"?$.type.trim():"";return new $1("hub_connect_failed",J?`Failed to connect to hub at ${Z.toString()} (${J} event before socket open).`:`Failed to connect to hub at ${Z.toString()}.`)}var qj="*",UF=8000,oP="cline-hub-auth.",LF=new Map,_F=new Set,sP=3000,tP=3000,eP=100,Aj="Hub connection closed",$f=250,Zf=5000,FF=0.5;class $1 extends Error{code;details;constructor($,Z,Q){super(Z);this.code=$;this.details=Q;this.name="HubTransportError"}}function Rj($){return $ instanceof $1}class m8 extends Error{command;code;constructor($,Z,Q){super(Q);this.command=$;this.code=Z;this.name="HubCommandError"}}function dQ($,Z){return $ instanceof m8&&$.code==="hub_command_timeout"&&(Z===void 0||$.command===Z)}function Cj($){let Z=$.searchParams.get("authToken")?.trim();if($.searchParams.delete("authToken"),Z)return Z;let Q=Pj($.toString());return Q?LF.get(Q):void 0}function Qf($){try{let Q=new URL($).hostname.toLowerCase().replace(/^\[|\]$/g,"");return Q==="localhost"||Q==="127.0.0.1"||Q==="::1"}catch{return!1}}function Pj($){if(!Qf($))return;let Z=new URL(Y2($));return Z.search="",Z.hash="",Z.toString()}function Tj($){let Z=Pj($);return!!Z&&_F.has(Z)}function j2($,Z){let Q=Pj($);if(Q){if(_F.add(Q),Z?.trim())LF.set(Q,Z)}return $}class g1{options;socket;connectPromise;clientId;currentUrl;recoveryPromise;pendingReplies=new Map;listeners=new Set;subscriptionCounts=new Map;lastEventSequenceByKey=new Map;reconnectTimer;reconnectAttempt=0;closedByClient=!1;lastCloseError=new $1("hub_connection_closed",Aj);sawSocketClose=!1;registered=!1;capabilities;constructor($){this.options=$;this.clientId=$.clientId??`core-${Math.random().toString(36).slice(2,10)}-${Date.now().toString(36)}`,this.currentUrl=$.url,this.capabilities=[...$.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($){if(this.capabilities=$.map((Z)=>({...Z})),!this.registered)return;await this.command("client.update",{capabilities:this.capabilities})}async connect(){if(this.socket&&(this.socket.readyState===1||this.socket.readyState===0))return this.connectPromise??Promise.resolve();this.closedByClient=!1,this.clearReconnectTimer();let $=new URL(this.currentUrl),Z=this.options.authToken?.trim()||Cj($);$.hash="";let J=new(rP())($.toString(),Z?[`${oP}${Z}`]:void 0);this.socket=J;let X=!1;this.connectPromise=new Promise((W,j)=>{let Y=!1,V=setTimeout(()=>{if(Y)return;Y=!0,X=!0,this.lastCloseError=new $1("hub_connect_timeout",`Timed out connecting to hub after ${UF}ms`),this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;try{J.close()}catch{}j(this.lastCloseError)},UF);J.addEventListener("open",()=>{if(Y)return;Y=!0,clearTimeout(V),W()}),J.addEventListener("error",(K)=>{if(Y)return;Y=!0,clearTimeout(V),this.lastCloseError=nP(K,$),this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0,j(this.lastCloseError)}),J.addEventListener("close",(K)=>{if(Y)return;if(Y=!0,clearTimeout(V),!X)this.lastCloseError=HF(K),this.sawSocketClose=!0;this.connectPromise=void 0,this.socket=void 0,j(this.lastCloseError)})}),J.addEventListener("message",(W)=>{this.handleFrame(JSON.parse(DF(W)))}),J.addEventListener("close",(W)=>{if(this.socket!==J)return;if(!X)this.lastCloseError=HF(W),this.sawSocketClose=!0;this.registered=!1;for(let j of this.pendingReplies.values())j.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,this.socket=void 0,!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect()}),await this.connectPromise,await this.command("client.register",{clientId:this.clientId,clientType:this.options.clientType??"core",displayName:this.options.displayName??"core",transport:"native",actorKind:"client",capabilities:this.capabilities,workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}}),this.registered=!0;for(let W of this.subscriptionCounts.keys())this.sendSubscriptionFrame("stream.subscribe",this.subscriptionSessionIdFromKey(W));this.reconnectAttempt=0}subscribe($,Z){let Q=Z?.sessionId?.trim()||void 0,J={listener:$,sessionId:Q};return this.listeners.add(J),this.adjustSubscriptionCount(Q,1),()=>{if(!this.listeners.delete(J))return;this.adjustSubscriptionCount(Q,-1)}}async command($,Z,Q,J){let X=0,W=$!=="client.register"&&$!=="client.unregister";while(!0)try{return await this.commandOnce($,Z,Q,J)}catch(j){if(!W||X>=1||!await this.recoverLocalHubTransport(j))throw j;X+=1}}async commandOnce($,Z,Q,J){await this.connect();let X=dP("hubreq_"),W=iP($,J?.timeoutMs),j=new Promise((V,K)=>{let B=W===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(X))return;K(new m8($,"hub_command_timeout",`Hub command ${$} timed out after ${W}ms (hub=${this.currentUrl}, requestId=${X}, clientId=${this.clientId}). Check hub-daemon.log for matching command.start/command.slow entries, or run 'cline doctor fix' to restart the hub.`))},W);this.pendingReplies.set(X,{resolve:(G)=>{if(B)clearTimeout(B);V(G)},reject:(G)=>{if(B)clearTimeout(B);K(G)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:$,requestId:X,clientId:this.clientId,sessionId:Q,timeoutMs:W,payload:Z}})}catch(V){throw this.pendingReplies.delete(X),V}let Y=await j;if(!Y.ok){if(Y.error?.code===e2){let V=Q??(typeof Z?.sessionId==="string"?Z.sessionId:void 0);throw new R$(V,Y.error.message)}throw new m8($,Y.error?.code,Y.error?.message??`Hub command ${$} failed`)}return Y}async recoverLocalHubTransport($){if(!Tj(this.currentUrl)||!Rj($))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let Z=await X6({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}).catch(()=>{return});if(!Z)return!1;return this.currentUrl=Z,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 $=Math.min($f*2**this.reconnectAttempt,Zf),Z=Math.round($*(1-FF)+Math.random()*$*FF);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.reconnectSubscribedTransport()},Z)}async reconnectSubscribedTransport(){if(this.closedByClient||!this.hasActiveSubscriptions())return;try{await this.connect(),this.reconnectAttempt=0}catch{if(!Tj(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let $=await X6({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd});if($){this.currentUrl=$,await this.connect(),this.reconnectAttempt=0;return}}catch{}this.reconnectAttempt+=1,this.scheduleReconnect()}}close(){let $=this.socket;if(this.closedByClient=!0,this.clearReconnectTimer(),this.registered=!1,!$)return;this.lastCloseError=new $1("hub_connection_closed",Aj),this.sawSocketClose=!1;for(let Z of this.pendingReplies.values())Z.reject(this.lastCloseError);this.pendingReplies.clear(),this.connectPromise=void 0,this.socket=void 0;try{$.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($){if(!this.socket||this.socket.readyState!==1){if(this.lastCloseError.code==="hub_connection_closed"&&!this.sawSocketClose)throw new $1("hub_connection_not_open","Hub connection is not open.");throw this.lastCloseError}this.socket.send(JSON.stringify($))}sendSubscriptionFrame($,Z){let Q=$==="stream.subscribe"?this.lastEventSequenceByKey.get(this.subscriptionKeyForSessionId(Z)):void 0;this.sendFrame({kind:$,clientId:this.clientId,...Z?{sessionId:Z}:{},...Q!==void 0?{sinceSequence:Q}:{}})}adjustSubscriptionCount($,Z){let Q=this.subscriptionKeyForSessionId($),J=(this.subscriptionCounts.get(Q)??0)+Z;if(J<=0){if(this.subscriptionCounts.delete(Q),!this.hasActiveSubscriptions())this.clearReconnectTimer();if(Z<0&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.unsubscribe",$);return}if(this.subscriptionCounts.set(Q,J),Z>0&&J===1&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.subscribe",$)}subscriptionKeyForSessionId($){return $??qj}subscriptionSessionIdFromKey($){return $===qj?void 0:$}handleFrame($){switch($.kind){case"reply":{let Z=$.envelope.requestId;if(!Z)return;let Q=this.pendingReplies.get(Z);if(!Q)return;this.pendingReplies.delete(Z),Q.resolve($.envelope);return}case"event":{let Z=$.envelope.sequence;if(typeof Z==="number"){let Q=$.envelope.sessionId?.trim();for(let J of[qj,Q]){if(!J||!this.subscriptionCounts.has(J))continue;let X=this.lastEventSequenceByKey.get(J)??0;if(Z>X)this.lastEventSequenceByKey.set(J,Z)}}for(let Q of this.listeners){if(Q.sessionId&&Q.sessionId!==$.envelope.sessionId?.trim())continue;Q.listener($.envelope)}return}case"command":case"stream.subscribe":case"stream.unsubscribe":return}}}function Y2($){let Z=new URL($);if(Z.protocol==="http:")Z.protocol="ws:";else if(Z.protocol==="https:")Z.protocol="wss:";return Z.toString()}async function e0($,Z){let Q=new g1({url:$,authToken:Z?.authToken,clientType:"hub-healthcheck",displayName:"hub healthcheck",workspaceRoot:Z?.workspaceRoot,cwd:Z?.cwd});try{return await Q.connect(),!0}catch{return!1}finally{Q.close()}}async function Ej($,Z){let Q=Y2($),J=await h1(Q,{authToken:Z?.authToken});if(!J)return{status:"unreachable",url:Q};if(Z?.requireCurrentBuild){let X=_1(),W=Q6(J,X);if(!W.compatible&&!W2(J))return{status:W.reason==="unsupported_protocol"?"protocol_mismatch":"build_mismatch",url:Q}}else if(!lP(J).compatible)return{status:"protocol_mismatch",url:Q};if(Z?.verifyConnection===!0&&!await e0(Q,{workspaceRoot:Z.workspaceRoot,cwd:Z.cwd,authToken:Z.authToken}))return{status:"unreachable",url:Q};return{status:"compatible",url:Q}}async function Jf($){let Z=Date.now()+tP;while(Date.now()<Z){if(!(await h1($).catch(()=>{return}))?.url)return!0;await new Promise((J)=>setTimeout(J,eP))}return!1}function Xf($,Z){try{return Y2($)===Y2(Z)}catch{return!1}}function fj($){return($&&typeof $==="object"&&Array.isArray($.sessions)?$.sessions:[]).some((Q)=>{if(!Q||typeof Q!=="object")return!1;let J=Q;return Array.isArray(J.participants)&&J.participants.length>0})}async function g8($,Z,Q){let J=new g1({url:$,authToken:Z,clientType:"hub-recovery-check",displayName:"hub recovery check",workspaceRoot:Q?.workspaceRoot,cwd:Q?.cwd});try{let X=await J.command("session.list",{limit:500},void 0,{timeoutMs:sP});return!fj(X.payload)}catch{return!1}finally{await J.dispose().catch(()=>{return})}}async function Wf($,Z){let Q=`${$.discoveryPath}.superseded`,J=await R0(Q);if(!J?.url||!J.authToken)return;let X=await Ej(J.url,{authToken:J.authToken});if(X.status!=="compatible")return;if(await g8(X.url,J.authToken,Z))return;return j2(X.url,J.authToken)}async function $9($={}){if($.endpoint?.trim()){let X=await Ej($.endpoint);return X.status==="compatible"?X.url:void 0}let Z=Mj(),Q=await R0(Z.discoveryPath);if(!Q?.url)return await Wf(Z,$);let J=await Ej(Q.url,{authToken:Q.authToken,requireCurrentBuild:!0});if(J.status==="compatible")return j2(J.url,Q.authToken);if(J.status==="protocol_mismatch")await I1(Z.discoveryPath).catch(()=>{return});return}async function X6($={}){let Z=await $9($);if(Z&&await e0(Z,{workspaceRoot:$.workspaceRoot,cwd:$.cwd}))return Z;if($.endpoint?.trim())return;try{return(await t5($.workspaceRoot??process.cwd())).url}catch{return}}async function uQ($,Z,Q,J){let X=new URL($),W=Z?.trim()||Cj(X);if(X.protocol==="ws:")X.protocol="http:";else if(X.protocol==="wss:")X.protocol="https:";if(X.pathname="/drain",X.hash="",Q)X.searchParams.set("reason",Q);if(J?.off)X.searchParams.set("off","1");return(await fetch(X,{method:"POST",headers:W?{authorization:`Bearer ${W}`}:void 0})).ok}async function e5($,Z){let Q=new URL($),J=Z?.trim()||Cj(Q);if(Q.protocol==="ws:")Q.protocol="http:";else if(Q.protocol==="wss:")Q.protocol="https:";return Q.pathname="/shutdown",Q.hash="",(await fetch(Q,{method:"POST",headers:J?{authorization:`Bearer ${J}`}:void 0})).ok}async function wj($=Mj()){let Z=await R0($.discoveryPath);if(!Z?.url)return!1;try{if(await e5(Z.url,Z.authToken))return!0}catch{}return!1}async function lQ($){if(!Tj($.url))return;let Z=Mj(),Q=await R0(Z.discoveryPath);if(!Q?.url||!Xf(Q.url,$.url))return;if(!await g8(Q.url,Q.authToken,{workspaceRoot:$.workspaceRoot,cwd:$.cwd}))return;if(!await wj())return;if(!await Jf(Q.url))return;return await I1(Z.discoveryPath).catch(()=>{return}),await X6({workspaceRoot:$.workspaceRoot,cwd:$.cwd})}import{resolveClineBuildEnv as jf}from"@cline/shared";function Yf($,Z){if($ instanceof Error)return $;if($&&typeof $==="object"&&"message"in $&&typeof $.message==="string"&&$.message.trim())return Error($.message.trim());let Q=$&&typeof $==="object"&&"type"in $&&typeof $.type==="string"?$.type.trim():"";return Error(Q?`Failed to connect to hub at ${Z} (${Q} event before socket open).`:`Failed to connect to hub at ${Z}.`)}var Vf="cline-hub-auth.";function Kf($){return $.host!==void 0||$.port!==void 0||$.pathname!==void 0}function Bf($,Z){let Q=new URL($),J=new URL(Z);return Q.search="",Q.hash="",J.search="",J.hash="",Q.toString()===J.toString()}function zF(){return jf()==="production"?z1():j1()}async function Gf($){let Z=$.searchParams.get("authToken")?.trim();if($.searchParams.delete("authToken"),Z)return Z;let Q=zF(),J=await R0(Q.discoveryPath);if(J?.url&&Bf($.toString(),J.url))return J.authToken;return}async function Sj($={}){let Z=P$($);if(!Kf($)){let Q=zF(),J=await R0(Q.discoveryPath);if(J?.url)return J.url}return v1(Z.host,Z.port,Z.pathname)}async function pQ($){return await new Promise((Z,Q)=>{(async()=>{let J=new URL($),X=await Gf(J);J.hash="";let W=new WebSocket(J.toString(),X?[`${Vf}${X}`]:void 0),j=new Map,Y=0;W.addEventListener("open",()=>{Z({send(V){let K=V.requestId??`hub-client-${++Y}`;return new Promise((B,G)=>{j.set(K,{resolve:B,reject:G});let H={kind:"command",envelope:{...V,requestId:K}};W.send(JSON.stringify(H))})},close(){W.close()}})}),W.addEventListener("message",(V)=>{let K=JSON.parse(String(V.data));if(K.kind==="reply"&&K.envelope.requestId){let B=j.get(K.envelope.requestId);if(B)j.delete(K.envelope.requestId),B.resolve(K.envelope)}}),W.addEventListener("close",()=>{for(let V of j.values())V.reject(Error("Hub connection closed"));j.clear()}),W.addEventListener("error",(V)=>{Q(Yf(V,$))})})().catch(Q)})}async function OF($){try{return(await pQ($)).close(),!0}catch{return!1}}async function NF($,Z){let Q=await Sj($),J=await pQ(Q);try{return await J.send({version:Z.version??"v1",clientId:Z.clientId??"hub-client",...Z})}finally{J.close()}}import{existsSync as Hf}from"node:fs";import{isHubDaemonProcess as Uf,resolveClineBuildEnv as Ff}from"@cline/shared";var Df=1e4,Lf="CLINE_HUB_BUILD_WATCH_INTERVAL_MS";function _f(){let $=Number(process.env[Lf]);return Number.isFinite($)&&$>0?$:Df}function zf(){return Ff()==="production"?z1():j1()}function Of($){try{return Hf(`${$}.lock`)}catch{return!1}}async function bj(){let $=zf();if(Of($.discoveryPath))return;let Z=await R0($.discoveryPath).catch(()=>{return});if(!Z?.url)return;let Q=await h1(Z.url).catch(()=>{return});if(!Q?.url)return;let J=_1(),X=Q6(Q,J);if(X.compatible)return;let W=(j)=>({url:Q.url,reason:j,hubBuildId:Q.buildId,hubCoreVersion:Q.coreVersion,expectedBuildId:J});if(X.reason==="unsupported_protocol")return W("unsupported_protocol");if(r5(a5(),Q)>0)return W("outdated_hub");return W("build_mismatch")}function qF($){if(Uf()||process.env.CLINE_HUB_PORT?.trim())return()=>{};let Z=$.intervalMs??_f(),Q,J,X=!1,W=setInterval(()=>{if(X)return;X=!0,bj().then((j)=>{if(!j){Q=void 0,J=void 0;return}let Y=`${j.reason}:${j.hubBuildId??""}`;if(Y===Q)return;if(j.reason==="outdated_hub"&&J!==Y){J=Y;return}J=void 0,Q=Y,$.onMismatch(j)}).catch(()=>{return}).finally(()=>{X=!1})},Z);return W.unref?.(),()=>{clearInterval(W)}}function kj($){return $?JSON.parse(JSON.stringify($)):{}}function iQ($){let Z=$?.session&&typeof $.session==="object"?$.session:void 0;if(!Z)return;let Q=Z.metadata&&typeof Z.metadata==="object"?kj(Z.metadata):void 0;return{sessionId:typeof Z.sessionId==="string"?Z.sessionId:"",parentSessionId:typeof Q?.parentSessionId==="string"?Q.parentSessionId:void 0,status:typeof Z.status==="string"?Z.status:void 0,messagesPath:typeof Q?.messagesPath==="string"?Q.messagesPath:void 0,metadata:Q}}function AF($,Z){return $.error?.message??`hub command failed: ${Z}`}function Nf($){let Z=kj($);if(typeof Z.error==="string"&&Z.error.trim())return{...Z,error:Z.error.trim()};let Q=Z.result&&typeof Z.result==="object"?Z.result:void 0;if(typeof Q?.text==="string"&&Q.text.trim())return{...Z,error:Q.text.trim()};let J=Q?.error&&typeof Q.error==="object"?Q.error:void 0;if(typeof J?.message==="string"&&J.message.trim())return{...Z,error:J.message.trim()};return Z}function TF($){let Z=$?.sessionId;return typeof Z==="string"&&Z.trim()?Z.trim():void 0}function qf($){let Z=$?.checkpoint;if(!Z||typeof Z!=="object"||Array.isArray(Z))throw Error("hub checkpoint restore returned no checkpoint");let Q=Z;if(typeof Q.ref!=="string"||typeof Q.createdAt!=="number"||typeof Q.runCount!=="number")throw Error("hub checkpoint restore returned an invalid checkpoint");return Q}function Af($){let Z=kj($.payload);if($.event==="schedule.execution_completed")return{sessionId:$.sessionId?.trim()||TF(Z)||"",eventType:"schedule.execution.completed",payload:Z};if($.event==="schedule.execution_failed")return{sessionId:$.sessionId?.trim()||TF(Z)||"",eventType:"schedule.execution.failed",payload:Z};let Q=$.sessionId?.trim();if(!Q)return;switch($.event){case"iteration.started":return{sessionId:Q,eventType:"runtime.chat.iteration_start",payload:Z};case"iteration.finished":return{sessionId:Q,eventType:"runtime.chat.iteration_end",payload:Z};case"assistant.delta":return{sessionId:Q,eventType:"runtime.chat.text_delta",payload:Z};case"assistant.media":return{sessionId:Q,eventType:"runtime.chat.media",payload:Z};case"usage.updated":return{sessionId:Q,eventType:"runtime.chat.usage",payload:Z};case"session.notice":return{sessionId:Q,eventType:"runtime.chat.notice",payload:Z};case"tool.started":return{sessionId:Q,eventType:"runtime.chat.tool_call_start",payload:Z};case"tool.updated":return{sessionId:Q,eventType:"runtime.chat.tool_call_update",payload:Z};case"tool.finished":return{sessionId:Q,eventType:"runtime.chat.tool_call_end",payload:Z};case"approval.requested":return{sessionId:Q,eventType:"approval.requested",payload:Z};case"run.aborted":return{sessionId:Q,eventType:"runtime.chat.aborted",payload:Z};case"run.failed":return{sessionId:Q,eventType:"runtime.chat.failed",payload:Nf($.payload)};case"run.completed":return{sessionId:Q,eventType:"runtime.chat.completed",payload:Z};default:return}}class xj{options;client;metadataApplied=!1;constructor($){this.options=$;this.client=new g1({url:$.address,authToken:$.authToken,clientId:$.clientId,clientType:$.clientType??"hub-session-client",displayName:$.displayName??"hub session client",workspaceRoot:$.workspaceRoot,cwd:$.cwd})}async ensureMetadataApplied(){if(this.metadataApplied||!this.options.metadata){if(!this.options.metadata)await this.client.connect();return}await this.client.connect(),await this.client.command("client.update",{metadata:this.options.metadata}),this.metadataApplied=!0}async connect(){await this.ensureMetadataApplied()}async taskCommand($,Z){return await this.ensureMetadataApplied(),(await this.client.command($,Z)).payload??{}}close(){this.client.close()}async dispose(){await this.client.dispose()}async startRuntimeSession($){await this.ensureMetadataApplied();let Z=await this.client.command("session.create",{workspaceRoot:$.workspaceRoot,cwd:$.cwd,sessionConfig:{providerId:$.provider,modelId:$.model,apiKey:$.apiKey,cwd:$.cwd??$.workspaceRoot,workspaceRoot:$.workspaceRoot,systemPrompt:$.systemPrompt??"",mode:$.mode??"act",rules:$.rules,maxIterations:$.maxIterations,timeoutSeconds:$.timeoutSeconds,enableTools:$.enableTools,enableSpawnAgent:$.enableSpawn!==!1,enableAgentTeams:$.enableTeams!==!1,disableMcpSettingsTools:$.disableMcpSettingsTools,missionLogIntervalSteps:$.missionStepInterval,missionLogIntervalMs:$.missionTimeIntervalMs},metadata:{source:$.source??"cli",provider:$.provider,model:$.model,enableTools:$.enableTools,enableSpawn:$.enableSpawn,enableTeams:$.enableTeams,prompt:void 0,interactive:$.interactive!==!1},runtimeOptions:{mode:$.mode,systemPrompt:$.systemPrompt,maxIterations:$.maxIterations,timeoutSeconds:$.timeoutSeconds,enableTools:$.enableTools,enableSpawn:$.enableSpawn,enableTeams:$.enableTeams,autoApproveTools:$.autoApproveTools,toolExecutors:$.toolExecutors,configExtensions:$.configExtensions},modelSelection:{provider:$.provider,model:$.model,apiKey:$.apiKey},toolPolicies:$.toolPolicies}),Q=iQ(Z.payload);if(!Q?.sessionId)throw Error("hub session create returned no session id");return{sessionId:Q.sessionId,startResult:{sessionId:Q.sessionId,manifestPath:"",messagesPath:Q.messagesPath??""}}}async sendRuntimeSession($,Z,Q){return await this.ensureMetadataApplied(),{result:(await this.client.command("session.send_input",{prompt:Z.prompt,mode:Z.config.mode,attachments:Z.attachments,delivery:Z.delivery,timeoutSeconds:Z.config.timeoutSeconds},$,Q)).payload?.result}}async stopRuntimeSession($){return await this.ensureMetadataApplied(),await this.client.command("session.detach",{sessionId:$},$),{applied:!0}}async abortRuntimeSession($){return await this.ensureMetadataApplied(),await this.client.command("run.abort",{sessionId:$},$),{applied:!0}}async updateSession($){return await this.ensureMetadataApplied(),await this.client.command("session.update",{sessionId:$.sessionId,metadata:$.metadata},$.sessionId),{updated:!0}}async getSession($){await this.ensureMetadataApplied();let Z;try{Z=await this.client.command("session.get",void 0,$)}catch(Q){if(e1(Q))return;throw Q}return iQ(Z.payload)}async readMessages($){let Z=$.trim();if(!Z)return[];await this.ensureMetadataApplied();let Q=await this.client.command("session.messages",{sessionId:Z},Z);if(!Q.ok)throw Error(AF(Q,"session.messages"));let J=Q.payload?.messages;return Array.isArray(J)?J:[]}async restore($){let Z=$.sessionId.trim();if(!Z)throw Error("sessionId is required");let Q=$.restore?.messages!==!1;if(Q&&!$.config)throw Error("config is required when restore.messages is true");await this.ensureMetadataApplied();let J=$.config,X=await this.client.command("session.restore",{sessionId:Z,checkpointRunCount:$.checkpointRunCount,restore:$.restore,...J?{workspaceRoot:J.workspaceRoot,cwd:J.cwd,sessionConfig:{providerId:J.provider,modelId:J.model,apiKey:J.apiKey,cwd:J.cwd??J.workspaceRoot,workspaceRoot:J.workspaceRoot,systemPrompt:J.systemPrompt??"",mode:J.mode??"act",rules:J.rules,maxIterations:J.maxIterations,enableTools:J.enableTools,enableSpawnAgent:J.enableSpawn!==!1,enableAgentTeams:J.enableTeams!==!1,disableMcpSettingsTools:J.disableMcpSettingsTools,missionLogIntervalSteps:J.missionStepInterval,missionLogIntervalMs:J.missionTimeIntervalMs},metadata:{source:J.source??"cli",provider:J.provider,model:J.model,enableTools:J.enableTools,enableSpawn:J.enableSpawn,enableTeams:J.enableTeams,prompt:void 0,interactive:J.interactive!==!1},runtimeOptions:{mode:J.mode,systemPrompt:J.systemPrompt,maxIterations:J.maxIterations,enableTools:J.enableTools,enableSpawn:J.enableSpawn,enableTeams:J.enableTeams,autoApproveTools:J.autoApproveTools,configExtensions:J.configExtensions},modelSelection:{provider:J.provider,model:J.model,apiKey:J.apiKey},toolPolicies:J.toolPolicies}:{}},Z);if(!X.ok)throw Error(AF(X,"session.restore"));let W=iQ(X.payload);if(Q&&!W?.sessionId)throw Error("hub checkpoint restore returned no session id");let j=Array.isArray(X.payload?.messages)?X.payload.messages:void 0,Y=qf(X.payload);return{sessionId:W?.sessionId,startResult:W?.sessionId?{sessionId:W.sessionId,manifestPath:"",messagesPath:W.messagesPath??""}:void 0,...j?{messages:j}:{},checkpoint:Y}}async listSessions($){await this.ensureMetadataApplied();let Z=await this.client.command("session.list",{limit:$?.limit??200});return(Array.isArray(Z.payload?.sessions)?Z.payload?.sessions:[]).map((J)=>iQ({session:J})).filter((J)=>Boolean(J?.sessionId))}async deleteSession($,Z=!0){return await this.ensureMetadataApplied(),(await this.client.command("session.delete",{sessionId:$,deleteCheckpointRefs:Z})).payload?.deleted===!0}async respondToolApproval($){await this.ensureMetadataApplied(),await this.client.command("approval.respond",{approvalId:$.approvalId,approved:$.approved,payload:$.reason?{reason:$.reason}:void 0,responderClientId:$.responderClientId})}streamEvents($,Z){let Q=new Set(($.sessionIds??[]).map((X)=>X.trim()).filter(Boolean)),J=this.client.subscribe((X)=>{let W=Af(X);if(!W)return;if(Q.size>0&&!Q.has(W.sessionId))return;Z.onEvent?.(W)});return this.ensureMetadataApplied().catch((X)=>{Z.onError?.(X instanceof Error?X:Error(String(X)))}),J}streamTeamProgress($,Z){let Q=this.client.subscribe((J)=>{if(J.event!=="team.progress"||!J.payload)return;Z.onProjection?.(J.payload)});return this.ensureMetadataApplied().catch((J)=>{Z.onError?.(J instanceof Error?J:Error(String(J)))}),Q}async createSchedule($){return await this.ensureMetadataApplied(),(await this.client.command("schedule.create",$)).payload?.schedule}async listSchedules($){await this.ensureMetadataApplied();let Z=await this.client.command("schedule.list");return Array.isArray(Z.payload?.schedules)?Z.payload?.schedules:[]}async getSchedule($){return await this.ensureMetadataApplied(),(await this.client.command("schedule.get",{scheduleId:$})).payload?.schedule}async updateSchedule($,Z){return await this.ensureMetadataApplied(),(await this.client.command("schedule.update",{scheduleId:$,...Z})).payload?.schedule}async pauseSchedule($){return await this.ensureMetadataApplied(),(await this.client.command("schedule.disable",{scheduleId:$})).payload?.schedule}async resumeSchedule($){return await this.ensureMetadataApplied(),(await this.client.command("schedule.enable",{scheduleId:$})).payload?.schedule}async deleteSchedule($){return await this.ensureMetadataApplied(),(await this.client.command("schedule.delete",{scheduleId:$})).payload?.deleted===!0}async triggerScheduleNow($){return await this.ensureMetadataApplied(),(await this.client.command("schedule.trigger",{scheduleId:$})).payload?.execution}async listScheduleExecutions($,Z){await this.ensureMetadataApplied();let Q=await this.client.command("schedule.list_executions",{scheduleId:$,limit:Z});return Array.isArray(Q.payload?.executions)?Q.payload?.executions:[]}async getScheduleStats(){return await this.ensureMetadataApplied(),(await this.client.command("schedule.stats")).payload?.stats}async getActiveScheduledExecutions(){await this.ensureMetadataApplied();let $=await this.client.command("schedule.active");return Array.isArray($.payload?.executions)?$.payload?.executions:[]}async getUpcomingScheduledRuns($){await this.ensureMetadataApplied();let Z=await this.client.command("schedule.upcoming",{limit:$});return Array.isArray(Z.payload?.upcoming)?Z.payload?.upcoming:[]}async createTask($){return(await this.taskCommand("task.create",$)).task}async listTasks($={}){let Z=await this.taskCommand("task.list",$);return Array.isArray(Z.tasks)?Z.tasks:[]}async getTask($){return(await this.taskCommand("task.get",{taskId:$})).task}async updateTask($){return(await this.taskCommand("task.update",$)).task}async approveTask($,Z){return(await this.taskCommand("task.approve",{taskId:$,expectedRevision:Z})).task}async cancelTask($,Z,Q){return(await this.taskCommand("task.cancel",{taskId:$,reason:Q,expectedRevision:Z})).task}async runTask($,Z){return await this.taskCommand("task.run",{taskId:$,expectedRevision:Z})}async getTaskAutomation(){return(await this.taskCommand("task.automation.get",{})).policy}async setTaskAutomation($){return(await this.taskCommand("task.automation.set",{policy:$})).policy}}class yj{client;constructor($){this.client=new g1({url:$.address,authToken:$.authToken,clientId:$.clientId,clientType:$.clientType??"hub-ui-client",displayName:$.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($){await this.client.command("ui.notify",$)}async sendShowWindow($){await this.client.command("ui.show_window",$??{})}async listClients(){let $=await this.client.command("client.list");return Array.isArray($.payload?.clients)?$.payload.clients:[]}async listSessions($=200){let Z=await this.client.command("session.list",{limit:$});return Array.isArray(Z.payload?.sessions)?Z.payload.sessions:[]}async toggleSetting($){let Z=await this.client.command("settings.toggle",$);if(!Z.ok)throw Error(Z.error?.message??"settings.toggle failed");return Z.payload}subscribeUI($){return this.client.subscribe((Z)=>{switch(Z.event){case"ui.notify":$.onNotify?.(Z.payload);break;case"ui.show_window":$.onShowWindow?.(Z.payload);break;case"hub.client.registered":$.onClientRegistered?.(Z.payload??{});break;case"hub.client.disconnected":$.onClientDisconnected?.(Z.payload??{});break;case"session.created":$.onSessionCreated?.(Z.payload??{});break;case"session.updated":$.onSessionUpdated?.(Z.payload??{});break;case"session.detached":$.onSessionDetached?.(Z.payload??{});break}})}}import{normalizeProviderId as rn}from"@cline/llms";var JE={};f(JE,{LocalRuntimeHost:()=>H$});import{readdirSync as In}from"node:fs";import{homedir as hn}from"node:os";import{isAbsolute as vn,join as cG,resolve as uG}from"node:path";import{captureSdkError as x1,createSessionId as gn,isLikelyAuthError as mn,normalizeUserInput as cn}from"@cline/shared";import{setHomeDirIfUnset as un}from"@cline/shared/storage";var eF={};f(eF,{saveProviderOAuthCredentials:()=>j6,resolveProviderApiKeyFromSettings:()=>sj,loginAndSaveProviderOAuthCredentials:()=>K9,isOAuthProvider:()=>K2,getProviderOAuthCredentialsFromSettings:()=>B9,getProviderAuthStorageId:()=>oj,getProviderAuthHandler:()=>C0,getPersistedProviderApiKey:()=>i8,formatProviderOAuthApiKey:()=>tj});import{decodeJwtPayload as jw,getClineEnvironmentConfig as sF}from"@cline/shared";var xF={};f(xF,{startClineDeviceAuth:()=>lj,refreshClineToken:()=>oQ,loginClineOAuth:()=>Z9,getValidClineCredentials:()=>Q9,completeClineDeviceAuth:()=>pj});import{decodeJwtPayload as ff,getClineEnvironmentConfig as vj}from"@cline/shared";var EF={};f(EF,{setSdkLogger:()=>hj,sdkDebug:()=>j0,hashSecret:()=>d0,getSdkLogger:()=>Ef});import{createHash as Tf}from"node:crypto";var Ij;function hj($){Ij=$}function Ef(){return Ij}function d0($){if(typeof $!=="string"||$.length===0)return"unset";return Tf("sha256").update($).digest("hex").slice(0,8)}function j0($){try{Ij?.debug($)}catch{}}q0();var MF={};f(MF,{startLocalOAuthServer:()=>m1});function Mf(){let $;return{promise:new Promise((Q)=>{$=Q}),resolve:$}}async function m1($){let Z=await import("node:http"),Q=$.host??"127.0.0.1",J=$.timeoutMs??300000,X=$.successHtml??Rf,W=Mf(),j=!1,Y=null,V=null,K=null,B=(U)=>{if(j)return;j=!0,W.resolve(U)},G=()=>{if(Y)clearTimeout(Y),Y=null;let U=K;if(K=null,V)V.close(),V.closeAllConnections?.(),V=null;if(U!==null&&$.onClose)Promise.resolve($.onClose({host:Q,port:U})).catch(()=>{})},H=async()=>{return Y=setTimeout(()=>{G(),B(null)},J),W.promise};for(let U of $.ports){let F=Z.createServer((L,z)=>{try{let _=new URL(L.url||"",`http://${Q}:${U}`);if(_.pathname!==$.callbackPath){z.statusCode=404,z.end("Not found");return}let O={url:_,code:_.searchParams.get("code")??void 0,state:_.searchParams.get("state")??void 0,provider:_.searchParams.get("provider")??void 0,error:_.searchParams.get("error")??void 0};if(O.error){z.statusCode=400,z.end(`Authentication failed: ${O.error}`),G(),B(O);return}if(!O.code){z.statusCode=400,z.end("Missing authorization code");return}if($.expectedState&&O.state!==$.expectedState){z.statusCode=400,z.end("State mismatch");return}z.statusCode=200,z.setHeader("Content-Type","text/html; charset=utf-8"),z.end(X),G(),B(O)}catch{z.statusCode=500,z.end("Internal error")}}),D=await new Promise((L)=>{let z=(_)=>{F.off("error",z),L({bound:!1,error:_})};F.once("error",z),F.listen(U,Q,()=>{F.off("error",z),V=F,L({bound:!0})})});if(D.error){if(D.error.code==="EADDRINUSE")continue;throw G(),D.error}if(D.bound){K=U;let L=`http://${Q}:${U}${$.callbackPath}`;if($.onListening)await Promise.resolve($.onListening({host:Q,port:U,callbackUrl:L})).catch(()=>{});return{callbackUrl:L,waitForCallback:H,cancelWait:()=>{G(),B(null)},close:()=>{G(),B(null)}}}}return{callbackUrl:"",waitForCallback:async()=>null,cancelWait:()=>{},close:()=>{}}}var Rf=`<!DOCTYPE html>
298
298
  <html lang="en">
@@ -952,8 +952,8 @@ ${$.instructions.trim()}
952
952
  enabled_at = excluded.enabled_at,
953
953
  updated_at = excluded.updated_at`).run(Z,$.mode,$.applyToAgentCreated?1:0,Q,J,X,$.enabledBy?JSON.stringify($.enabledBy):null,gT($.enabledAt,"enabledAt")??null,W),this.getAutomationPolicy(Z)}}var N5={kind:"system",id:"file_reconciler"},F8={kind:"system",id:"task_manager"},uT={kind:"automation_policy",id:"global"},yZ=new Set(["completed","failed","cancelled","interrupted"]),_a=30000,za=250;function _$(){return new Date().toISOString()}function dT($){return typeof $==="string"&&$.trim()?$.trim():void 0}function lT($){let Z=Date.parse($);if(!Number.isFinite(Z))throw Error("expiresAt must be a valid ISO-8601 timestamp");if(Z<=Date.now())throw Error("expiresAt must be in the future")}function pT($,Z){let Q=Da($,Z);return Q!==""&&!Q.startsWith("..")&&!Q.startsWith("/")}function IZ($){if(!$||!TG($))return!1;try{return Ua($).isDirectory()}catch{return!1}}function qG($,Z){return JSON.stringify({type:$.type,title:$.title,description:$.description,instructions:$.instructions,scope:$.scope,workspaceRoot:$.workspaceRoot,cwd:$.cwd,resourcePaths:$.resourcePaths,priority:$.priority,assignee:$.assignee,modelSelection:$.modelSelection,mode:$.mode,systemPrompt:$.systemPrompt,maxIterations:$.maxIterations,timeoutSeconds:$.timeoutSeconds,availableAt:$.availableAt??Z.availableAt,expiresAt:$.expiresAt,automationEligible:$.automationEligible})}function AG($){return JSON.stringify({type:$.type,title:$.title,description:$.description,instructions:$.instructions,scope:$.scope,workspaceRoot:$.workspaceRoot,cwd:$.cwd,resourcePaths:$.resourcePaths,priority:$.priority,assignee:$.assignee,modelSelection:$.modelSelection,mode:$.mode,systemPrompt:$.systemPrompt,maxIterations:$.maxIterations,timeoutSeconds:$.timeoutSeconds,availableAt:$.availableAt,expiresAt:$.expiresAt,automationEligible:$.automationEligible})}function Oa($,Z){return{taskId:Z.taskId,expectedRevision:Z.revision,type:$.type,title:$.title,description:$.description??null,instructions:$.instructions,scope:$.scope,workspaceRoot:$.workspaceRoot??null,cwd:$.cwd??null,resourcePaths:$.resourcePaths,priority:$.priority,assignee:$.assignee??null,modelSelection:$.modelSelection??null,mode:$.mode??null,systemPrompt:$.systemPrompt??null,maxIterations:$.maxIterations??null,timeoutSeconds:$.timeoutSeconds??null,availableAt:$.availableAt??Z.availableAt,expiresAt:$.expiresAt,automationEligible:$.automationEligible,updatedBy:N5}}function Na($,Z){return{...$,type:Z.type??$.type,title:Z.title??$.title,description:Z.description===null?void 0:Z.description??$.description,instructions:Z.instructions??$.instructions,scope:Z.scope??$.scope,workspaceRoot:Z.workspaceRoot===null?void 0:Z.workspaceRoot??$.workspaceRoot,cwd:Z.cwd===null?void 0:Z.cwd??$.cwd,resourcePaths:Z.resourcePaths??$.resourcePaths,priority:Z.priority??$.priority,assignee:Z.assignee===null?void 0:Z.assignee??$.assignee,modelSelection:Z.modelSelection===null?void 0:Z.modelSelection??$.modelSelection,mode:Z.mode===null?void 0:Z.mode??$.mode,systemPrompt:Z.systemPrompt===null?void 0:Z.systemPrompt??$.systemPrompt,maxIterations:Z.maxIterations===null?void 0:Z.maxIterations??$.maxIterations,timeoutSeconds:Z.timeoutSeconds===null?void 0:Z.timeoutSeconds??$.timeoutSeconds,availableAt:Z.availableAt??$.availableAt,expiresAt:Z.expiresAt??$.expiresAt,automationEligible:Z.automationEligible??$.automationEligible}}class hZ{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($){this.runtime=$.runtime,this.ownsStore=!$.store,this.store=$.store??new xZ({dbPath:$.dbPath}),this.globalSpecsDir=$.globalSpecsDir,this.watcherDebounceMs=Math.max(0,$.watcherDebounceMs??za),this.watchFiles=$.watchFiles!==!1,this.automationEnabled=$.automationEnabled!==!1,this.logger=$.logger??La,this.publishEvent=$.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 $ of this.store.listWorkspaceRoots())if(IZ($))await this.reconcileSourceForProjection("workspace",$,"startup");this.expireTasks(),this.maintenanceTimer=setInterval(()=>{this.expireTasks(),this.queueAutomation()},_a),this.maintenanceTimer.unref?.(),this.queueAutomation()}async dispose(){if(this.disposed)return;if(this.disposed=!0,this.maintenanceTimer)clearInterval(this.maintenanceTimer);for(let $ of this.scopes.values()){if($.timer)clearTimeout($.timer);$.watcher?.close()}this.scopes.clear();for(let $ of this.activeRuns.values())if($.sessionId)await this.runtime.abortSession($.sessionId,"Hub task manager stopped").catch(()=>{});await Promise.allSettled(this.backgroundRuns);for(let[$,Z]of this.activeRuns)this.store.updateRun(Z.runId,{status:"interrupted",completedAt:_$(),error:"Hub task manager stopped before the run completed."}),this.store.updateTaskState($,{status:"failed",currentRunId:null,error:"Hub task manager stopped before the run completed.",updatedBy:F8});if(this.activeRuns.clear(),this.ownsStore)this.store.close()}async createTask($){this.assertUsable(),lT($.expiresAt);let Z=L$($),Q={...$,...Z},J=dT(Q.taskId)??cT("task_");if(await this.reconcileScope(Q.scope,Q.workspaceRoot),this.store.getTask(J))throw Error(`task ${J} already exists`);let X=this.ensureScope(Q.scope,Q.workspaceRoot),W=X.resolveWritePath(J,Q.specPath);if(TG(W)||this.store.getTaskBySpecPath(W))throw Error(`task spec already exists: ${W}`);let j=this.store.createTask({...Q,taskId:J,specPath:W});try{X.writeSpec({...Q,taskId:J},{specPath:W,createOnly:!0})}catch(Y){throw this.store.deleteTask(J),Y}return this.publish("task.created",j),this.expireTask(j),this.queueAutomation(),this.requireTask(J)}async listTasks($={}){if(this.assertUsable(),!$.scope||$.scope==="global")await this.reconcileSourceForProjection("global",void 0,"list");if($.workspaceRoot){if(IZ($.workspaceRoot))await this.reconcileSourceForProjection("workspace",$.workspaceRoot,"list")}else if($.scope!=="global"){for(let Z of this.store.listWorkspaceRoots())if(IZ(Z))await this.reconcileSourceForProjection("workspace",Z,"list")}return this.expireTasks(),this.store.listTasks($)}async getTask($){this.assertUsable();let Z=this.store.getTask($.trim());if(Z?.scope==="workspace"&&IZ(Z.workspaceRoot))await this.reconcileSourceForProjection("workspace",Z.workspaceRoot,"read");else if(Z?.scope==="global")await this.reconcileSourceForProjection("global",void 0,"read");let Q=this.store.getTask($.trim());if(Q)this.expireTask(Q);return this.store.getTask($.trim())}async updateTask($){this.assertUsable();let Z=this.requireTask($.taskId);if(Z.revision!==$.expectedRevision)this.store.updateTask($);if(Z.status==="in_progress")throw Error("an in-progress task cannot be edited");if(Z.status==="completed"||Z.status==="cancelled"||Z.status==="expired")throw Error(`task ${Z.taskId} cannot be edited from ${Z.status}; create a new task instead`);let Q=Na(Z,$);lT(Q.expiresAt);let J=L$(Q),X={...Q,...J},W={...$,scope:X.scope,workspaceRoot:X.workspaceRoot??null,cwd:X.cwd??null,resourcePaths:X.resourcePaths},j=this.ensureScope(X.scope,X.workspaceRoot),Y=Z.specPath!==void 0&&pT(j.specsDir,Z.specPath);if(!Y)await this.reconcileFileStore(j);let V=j.resolveWritePath(Z.taskId,Y?Z.specPath:void 0);if(V!==Z.specPath&&(TG(V)||this.store.getTaskBySpecPath(V)))throw Error(`task spec already exists: ${V}`);let K;if(Y&&Z.specPath){let F=j.readSpec(Z.specPath);if(!F.ok)throw Error(`task spec is invalid: ${F.error}`);if($.updatedBy.id!==N5.id&&qG(F.spec,Z)!==AG(Z))throw Error(`task spec changed outside the manager; reconcile task ${Z.taskId} and retry`);K=F.contentHash}let B,G;try{B=j.writeSpec(X,{specPath:V,expectedContentHash:K,createOnly:!Y}),G=this.store.updateTask(W)}catch(F){try{if(B&&Y&&Z.specPath)j.writeSpec(Z,{specPath:Z.specPath,expectedContentHash:B.contentHash});else if(B)j.deleteSpec(V,{expectedContentHash:B.contentHash})}catch(D){this.logError("agenda task update rollback failed",D,{taskId:Z.taskId,specPath:V})}throw F}if(!G||!B)throw Error(`unknown task: ${$.taskId}`);let H=this.store.updateTaskState(G.taskId,{status:"pending_approval",approvedRevision:null,currentRunId:null,specPath:B.specPath,error:null,completedAt:null,archivedAt:null,updatedBy:$.updatedBy},G.revision);if(Z.specPath&&Z.specPath!==B.specPath)this.fileStoreForTask(Z).deleteSpec(Z.specPath);let U=H??this.requireTask($.taskId);return this.publish("task.updated",U),this.expireTask(U),this.queueAutomation(),this.requireTask($.taskId)}async approveTask($,Z,Q){this.assertUsable();let J=await this.refreshAndVerifyTaskIntent($);if(this.assertRevision(J,Q),this.isExpired(J))throw this.expireTask(J),Error(`task ${$} has expired`);if(J.status==="approved"&&J.approvedRevision===J.revision)return J;if(J.status!=="pending_approval"&&J.status!=="failed")throw Error(`task ${$} cannot be approved from ${J.status}`);let X=this.store.updateTaskState($,{status:"approved",approvedRevision:J.revision,error:null,updatedBy:Z},J.revision);if(!X)throw Error(`unknown task: ${$}`);return this.publish("task.updated",X),this.queueAutomation(),X}async cancelTask($,Z,Q,J){this.assertUsable();let X=this.requireTask($);if(this.assertRevision(X,Q),X.status==="cancelled")return X;if(X.status==="completed"||X.status==="expired")throw Error(`task ${$} cannot be cancelled from ${X.status}`);let W=X.currentRunId?this.store.getRun(X.currentRunId):void 0,j=J?.trim()||"Agenda task cancelled";if(W&&!yZ.has(W.status))this.store.updateRun(W.runId,{status:"cancelled",completedAt:_$(),error:J?.trim()||void 0});this.activeRuns.delete($);let Y=this.store.updateTaskState($,{status:"cancelled",approvedRevision:null,currentRunId:null,error:J?.trim()||null,updatedBy:Z},X.revision);if(!Y)throw Error(`unknown task: ${$}`);if(this.publish("task.updated",Y,W),W?.sessionId)try{await this.runtime.abortSession(W.sessionId,j)}catch(V){this.logError("agenda task session abort failed",V,{taskId:$,runId:W.runId,sessionId:W.sessionId})}return Y}async runTask($,Z,Q,J){this.assertUsable();let X=await this.refreshAndVerifyTaskIntent($);if(this.assertRevision(X,Q),this.isExpired(X))throw this.expireTask(X),Error(`task ${$} has expired`);if(Date.parse(X.availableAt)>Date.now())throw Error(`task ${$} is not available yet`);if(X.status!=="approved"&&X.status!=="failed")throw Error(`task ${$} must be approved before it can run`);if(X.approvedRevision!==X.revision)throw Error(`task ${$} approval is stale`);if(this.activeRuns.has($)||X.currentRunId)throw Error(`task ${$} already has an active run`);let W=this.store.createRun({taskId:$,taskRevision:X.revision,requestedByClientId:J}),j=this.store.updateTaskState($,{currentRunId:W.runId,lastRunId:W.runId,error:null,completedAt:null,updatedBy:Z},X.revision);if(!j)throw Error(`unknown task: ${$}`);this.activeRuns.set($,{runId:W.runId}),this.publish("task.updated",j,W);try{let Y=await this.runtime.startSession(j,W,J,{unattended:Z.kind==="automation_policy"&&this.store.getAutomationPolicy(j.scope==="workspace"&&j.workspaceRoot?j.workspaceRoot:"global").mode==="unattended"}),V=this.store.getRun(W.runId),K=this.store.getTask($);if(!V||yZ.has(V.status)||K?.status!==X.status||K.currentRunId!==W.runId){if(V&&!yZ.has(V.status))this.store.updateRun(W.runId,{status:"cancelled",sessionId:Y.sessionId,completedAt:_$(),error:"Task changed or was cancelled while its session was starting."});else if(V)this.store.updateRun(W.runId,{sessionId:Y.sessionId});throw this.activeRuns.delete($),await this.runtime.abortSession(Y.sessionId,"Agenda task was cancelled while its session was starting").catch((G)=>this.logError("cancelled agenda task session abort failed",G,{taskId:$,runId:W.runId,sessionId:Y.sessionId})),Error(`task ${$} changed or was cancelled while starting`)}W=this.store.updateRun(W.runId,{status:"running",sessionId:Y.sessionId,startedAt:_$()})??W,j=this.store.updateTaskState($,{status:"in_progress",lastSessionId:Y.sessionId,updatedBy:Z})??j,this.activeRuns.set($,{runId:W.runId,sessionId:Y.sessionId}),this.publish("task.run.started",j,W);let B=this.finishRun(j,W,Y.sessionId);return this.backgroundRuns.add(B),B.finally(()=>this.backgroundRuns.delete(B)),{task:j,run:W}}catch(Y){throw await this.finishRunFailure(j,W,Y),Y}}async getAutomationPolicy($="global"){return this.assertUsable(),this.store.getAutomationPolicy($)}async setAutomationPolicy($,Z){this.assertUsable();let Q=_$(),J=this.store.setAutomationPolicy({...$,enabledBy:$.mode==="manual"?void 0:Z,enabledAt:$.mode==="manual"?void 0:Q});return this.automationPolicyGeneration+=1,this.publishEvent("task.automation.updated",{policy:J}),this.queueAutomation(J.scopeKey),J}notifyAutomationReadinessChanged(){if(!this.disposed)this.queueAutomation()}async finishRun($,Z,Q){try{let J=await this.runtime.runSession(Q,$,Z),X=this.store.getRun(Z.runId);if(!X||yZ.has(X.status))return;if(J.status==="completed"){let W=_$(),j=this.store.updateRun(Z.runId,{status:"completed",completedAt:W,resultSummary:J.summary,error:null})??X,Y=this.store.updateTaskState($.taskId,{status:"completed",currentRunId:null,error:null,completedAt:W,updatedBy:F8})??this.requireTask($.taskId);this.publish("task.run.completed",Y,j)}else if(J.status==="cancelled")await this.cancelTask($.taskId,F8,$.revision,J.error||"Task session was cancelled");else await this.finishRunFailure($,Z,Error(J.error||J.summary||"Task session failed"))}catch(J){await this.finishRunFailure($,Z,J)}finally{this.activeRuns.delete($.taskId);let J=this.store.getTask($.taskId);(J?.scope==="workspace"&&J.workspaceRoot?this.reconcileScope("workspace",J.workspaceRoot):this.reconcileScope("global")).catch((W)=>this.logError("post-run agenda task reconciliation failed",W,{taskId:$.taskId})),this.queueAutomation()}}async finishRunFailure($,Z,Q){let J=this.store.getRun(Z.runId);if(!J||yZ.has(J.status))return;let X=Q instanceof Error?Q.message:String(Q),W=this.store.updateRun(Z.runId,{status:"failed",completedAt:_$(),error:X})??J,j=this.store.getTask($.taskId);if(!j||j.status==="cancelled")return;if(j.currentRunId!==Z.runId){this.activeRuns.delete($.taskId),this.publish("task.run.failed",j,W);return}let Y=this.store.updateTaskState($.taskId,{status:"failed",currentRunId:null,error:X,updatedBy:F8})??j;this.activeRuns.delete($.taskId),this.publish("task.run.failed",Y,W)}ensureScope($,Z){let Q=dT(Z);if($==="workspace"&&!Q)throw Error("workspaceRoot is required for workspace task scope");if($==="workspace"&&!IZ(Q))throw Error("workspaceRoot must be an existing directory");let J=$==="global"?"global":`workspace:${Q}`,X=this.scopes.get(J);if(X)return X.store;let W=new SZ({scope:$,workspaceRoot:Q,taskSpecsDir:$==="global"?this.globalSpecsDir:void 0}),j={store:W},Y=!0;try{W.ensureSpecsDir();let V=this.watchFiles?this.resolveWatchRoot(W.specsDir):void 0;if(V!==void 0)j.watcher=Fa(V,(K,B)=>{if(!B||!String(B).endsWith(".task.md"))return;if(j.timer)clearTimeout(j.timer);j.timer=setTimeout(()=>{j.timer=void 0,this.reconcileFileStore(W).catch((G)=>this.logError("agenda task watcher reconciliation failed",G,{specsDir:W.specsDir}))},this.watcherDebounceMs)}),j.watcher.on("error",(K)=>this.logError("agenda task watcher failed",K,{specsDir:W.specsDir}))}catch(V){Y=!1,this.logError("agenda task source could not be attached",V,{specsDir:W.specsDir})}if(Y)this.scopes.set(J,j);return W}async reconcileScope($,Z){let Q=this.ensureScope($,Z);await this.reconcileFileStore(Q)}async reconcileSourceForProjection($,Z,Q){try{await this.reconcileScope($,Z)}catch(J){this.logError(`agenda task source ${Q} reconciliation failed`,J,{scope:$,...Z?{workspaceRoot:Z}:{}})}}async reconcileFileStore($){if(this.disposed)return;let Z=new Set;for(let J of $.listSpecs()){if(Z.add(J.specPath),!J.ok){this.logger.log("agenda task spec is invalid",{severity:"warn",specPath:J.specPath,error:J.error});continue}try{let X=J.spec;if(!X.taskId)X=$.writeSpec({...X,taskId:cT("task_")},{specPath:X.specPath,expectedContentHash:X.contentHash});let W=this.store.getTaskBySpecPath(X.specPath);if(W&&X.taskId&&X.taskId!==W.taskId)this.logger.log("agenda task id is immutable for an existing spec",{severity:"warn",taskId:W.taskId,requestedTaskId:X.taskId,specPath:X.specPath}),X=$.writeSpec({...X,taskId:W.taskId},{specPath:X.specPath,expectedContentHash:X.contentHash});let j=X.taskId?this.store.getTask(X.taskId):void 0,Y=W??j;if(j?.specPath&&j.specPath!==X.specPath){this.logger.log("agenda task id is already owned by another spec",{severity:"warn",taskId:X.taskId,specPath:X.specPath});continue}if(!Y){let V=this.store.createTask(YW(X,N5));this.publish("task.created",V),this.expireTask(V);continue}if(Y.archivedAt){let V=Y.status==="cancelled"&&Y.error==="Task spec was deleted.",K=this.store.updateTaskState(Y.taskId,{status:V?"pending_approval":Y.status,approvedRevision:V?null:Y.approvedRevision,archivedAt:null,error:V?null:Y.error,updatedBy:N5});if(K)Y=K,this.publish("task.updated",K)}if(qG(X,Y)===AG(Y))continue;if(Y.status==="in_progress"){this.logger.log("agenda task edit deferred until its run completes",{severity:"warn",taskId:Y.taskId});continue}if(Y.status==="completed"||Y.status==="cancelled"||Y.status==="expired"){this.logger.log("terminal agenda task edits are not applied",{severity:"warn",taskId:Y.taskId,status:Y.status}),$.writeSpec(Y,{specPath:X.specPath,expectedContentHash:X.contentHash});continue}await this.updateTask(Oa(X,Y))}catch(X){this.logError("agenda task spec reconciliation failed",X,{specPath:J.spec.specPath})}}let Q=this.store.listTasks({scope:$.scope,workspaceRoot:$.workspaceRoot,includeArchived:!0,limit:1000});for(let J of Q){if(!J.specPath||!pT($.specsDir,J.specPath)||Z.has(J.specPath)||J.archivedAt)continue;if(J.status==="in_progress")await this.cancelTask(J.taskId,N5,J.revision,"Task spec was deleted.");let X=this.store.updateTaskState(J.taskId,{status:J.status==="completed"||J.status==="expired"?J.status:"cancelled",approvedRevision:null,currentRunId:null,error:J.status==="cancelled"?J.error??null:"Task spec was deleted.",archivedAt:_$(),updatedBy:N5});if(X)this.publish("task.deleted",X)}this.queueAutomation()}expireTasks(){for(let $ of this.store.listTasks({limit:1000}))this.expireTask($)}expireTask($){if(!this.isExpired($))return;if($.currentRunId||$.status==="in_progress"||$.status==="completed"||$.status==="cancelled"||$.status==="expired")return;let Z=this.store.updateTaskState($.taskId,{status:"expired",approvedRevision:null,currentRunId:null,error:"Task expired before it was started.",updatedBy:F8});if(Z)this.publish("task.updated",Z)}isExpired($){return Date.parse($.expiresAt)<=Date.now()}recoverInterruptedRuns(){let $=_$();for(let Z of this.store.listRuns({status:["starting","running"],limit:1000})){this.store.updateRun(Z.runId,{status:"interrupted",completedAt:$,error:"Hub restarted while this task was running."});let Q=this.store.getTask(Z.taskId);if(!Q||Q.currentRunId!==Z.runId)continue;if(Q.status==="completed"||Q.status==="cancelled"||Q.status==="expired"){this.store.updateTaskState(Q.taskId,{currentRunId:null});continue}if(Z.status==="starting"&&Q.approvedRevision===Z.taskRevision&&Q.revision===Z.taskRevision&&!this.isExpired(Q)){this.store.updateTaskState(Q.taskId,{status:"approved",currentRunId:null,error:"Hub restarted before this task session was linked.",updatedBy:F8});continue}this.store.updateTaskState(Q.taskId,{status:Z.status==="starting"?"pending_approval":"failed",approvedRevision:Z.status==="starting"?null:Q.approvedRevision,currentRunId:null,error:"Hub restarted while this task was running.",updatedBy:F8})}}queueAutomation($){if(this.disposed||!this.automationEnabled)return;if($)this.queuedAutomationScopes.add($);else for(let Z of this.store.listAutomationPolicies())this.queuedAutomationScopes.add(Z.scopeKey);if(this.automationPumping)return;queueMicrotask(()=>{this.pumpAutomation().catch((Z)=>this.logError("agenda task automation pump failed",Z,{}))})}async pumpAutomation(){if(this.disposed||this.automationPumping)return;this.automationPumping=!0;let $=this.automationPolicyGeneration;try{while(this.queuedAutomationScopes.size>0){let Z=this.queuedAutomationScopes.values().next().value;if(!Z)break;this.queuedAutomationScopes.delete(Z);let Q=this.store.getAutomationPolicy(Z);if(Q.mode==="manual")continue;this.expireTasks();let J=this.store.listRuns({limit:1000}).filter((j)=>Date.parse(j.claimedAt)>=Date.now()-3600000).length,X=Math.min(Math.max(0,Q.maxConcurrentRuns-this.activeRuns.size),Math.max(0,Q.maxStartsPerHour-J));if(X<=0)continue;let W=this.store.listTasks({statuses:["pending_approval","approved"],...Z==="global"?{}:{scope:"workspace",workspaceRoot:Z},automationEligible:!0,availableBefore:_$(),limit:1000});for(let j of W){if(X<=0)break;if($!==this.automationPolicyGeneration)return;try{let Y=j;if(Y.status==="pending_approval"){if(!this.canAutomaticallyApprove(Y,Q))continue;Y=await this.approveTask(Y.taskId,uT,Y.revision)}if($!==this.automationPolicyGeneration)return;if(Q.mode==="auto_start"&&this.runtime.isInteractiveClientAvailable?.()!==!0)continue;await this.runTask(Y.taskId,uT,Y.revision),X-=1}catch(Y){this.logError("agenda task automation start failed",Y,{taskId:j.taskId})}}}}finally{if(this.automationPumping=!1,this.queuedAutomationScopes.size>0)this.queueAutomation()}}canAutomaticallyApprove($,Z){let Q=[$.createdBy,$.updatedBy];if(Q.some((J)=>J.kind==="system"&&J.id==="file_reconciler"))return!1;if(!Z.applyToAgentCreated&&Q.some((J)=>J.kind==="agent"))return!1;return this.taskChainDepth($)<=Z.maxChainDepth}taskChainDepth($){let Z=0,Q=$,J=new Set([$.taskId]);while(Q.originTaskId){if(J.has(Q.originTaskId))return Number.POSITIVE_INFINITY;J.add(Q.originTaskId);let X=this.store.getTask(Q.originTaskId);if(!X)break;Z+=1,Q=X}return Z}fileStoreForTask($){return this.ensureScope($.scope,$.workspaceRoot)}async refreshAndVerifyTaskIntent($){let Z=this.requireTask($);await this.reconcileScope(Z.scope,Z.workspaceRoot);let Q=this.requireTask($);if(Q.archivedAt)throw Error(`task ${$} no longer has an active task spec`);if(!Q.specPath)throw Error(`task ${$} has no canonical task spec`);let J;try{J=this.fileStoreForTask(Q).readSpec(Q.specPath)}catch(X){throw Error(`task ${$} task spec is unavailable: ${X instanceof Error?X.message:String(X)}`)}if(!J.ok)throw Error(`task ${$} task spec is invalid: ${J.error}`);if(J.spec.taskId!==Q.taskId||qG(J.spec,Q)!==AG(Q))throw Error(`task ${$} task spec does not match revision ${Q.revision}`);return Q}requireTask($){let Z=$.trim();if(!Z)throw Error("taskId is required");let Q=this.store.getTask(Z);if(!Q)throw Error(`unknown task: ${Z}`);return Q}assertRevision($,Z){if($.revision!==Z)throw Error(`task ${$.taskId} is at revision ${$.revision}; the requested revision is stale`)}publish($,Z,Q){this.publishEvent($,{task:Z,...Q?{run:Q}:{}},Q?.sessionId??Z.lastSessionId)}resolveWatchRoot($){try{return Ha.native($)}catch(Z){this.logError("agenda task watcher disabled: specs dir could not be resolved",Z,{specsDir:$});return}}logError($,Z,Q){if(this.logger.error)this.logger.error($,{...Q,error:Z});else this.logger.log($,{...Q,error:Z,severity:"error"})}assertUsable(){if(this.disposed)throw Error("AgendaTaskManager disposed")}}var rT={};f(rT,{ChatViewStateSchema:()=>EG,ChatSummarySchema:()=>DW,ChatSessionStatusSchema:()=>GW,ChatSessionConfigSchema:()=>BW,ChatMessageSchema:()=>FW,ChatMessageRoleSchema:()=>HW,ChatMessageImageSchema:()=>UW});import{z as c}from"zod";var BW=c.object({workspaceRoot:c.string().min(1),cwd:c.string().optional(),provider:c.string().min(1),model:c.string().min(1),mode:c.enum(["act","plan"]).default("act"),apiKey:c.string(),systemPrompt:c.string().optional(),rules:c.string().optional(),maxIterations:c.number().int().positive().optional(),enableTools:c.boolean(),enableSpawn:c.boolean().optional(),enableTeams:c.boolean().optional(),autoApproveTools:c.boolean().optional(),missionStepInterval:c.number().int().positive().optional(),missionTimeIntervalMs:c.number().int().positive().optional()}),GW=c.enum(["idle","starting","running","pending","stopping","completed","cancelled","failed","error"]),HW=c.enum(["user","assistant","tool","system","status","error"]),UW=c.object({id:c.string().min(1),mediaType:c.enum(["image/png","image/jpeg","image/gif","image/webp"]),data:c.string().min(1)}),FW=c.object({id:c.string().min(1),sessionId:c.string().nullable(),role:HW,content:c.string(),images:c.array(UW).optional(),createdAt:c.number().int().nonnegative(),meta:c.object({stream:c.enum(["stdout","stderr"]).optional(),toolName:c.string().optional(),iteration:c.number().int().nonnegative().optional(),agentId:c.string().optional(),conversationId:c.string().optional(),hookEventName:c.string().optional(),inputTokens:c.number().int().nonnegative().optional(),outputTokens:c.number().int().nonnegative().optional(),checkpoint:c.object({ref:c.string(),createdAt:c.number().int().nonnegative(),runCount:c.number().int().positive(),kind:c.enum(["stash","commit"]).optional()}).optional()}).optional()}),DW=c.object({toolCalls:c.number().int().nonnegative(),tokensIn:c.number().int().nonnegative(),tokensOut:c.number().int().nonnegative()}),EG=c.object({sessionId:c.string().nullable(),status:GW,config:BW,messages:c.array(FW),rawTranscript:c.string(),error:c.string().nullable(),summary:DW});var aT={};f(aT,{CORE_BUILD_VERSION:()=>MG});var MG=X2;import{Agent as _n,createAgentRuntime as zn}from"@cline/agents";var nT={};f(nT,{loadLlmsConfigFromFile:()=>CG,defineLlmsConfig:()=>RG});import{readFile as qa}from"node:fs/promises";import Aa from"node:path";function RG($){return $}async function CG($){let Z=Aa.resolve($),Q=await qa(Z,"utf8"),J;try{J=JSON.parse(Q)}catch(X){let W=X instanceof Error?X.message:String(X);throw Error(`Failed to parse JSON config at "${Z}": ${W}`)}return Ta(J,Z)}function Ta($,Z){if(!$||typeof $!=="object")throw Error(`Invalid llms config in "${Z}": expected an object.`);let J=$.providers;if(!Array.isArray(J))throw Error(`Invalid llms config in "${Z}": "providers" must be an array.`);if(!J.length)throw Error(`Invalid llms config in "${Z}": "providers" cannot be empty.`);return $}var ZE={};f(ZE,{createLlmsSdk:()=>fG,DefaultLlmsSdk:()=>vZ});import{BUILT_IN_PROVIDER_IDS as tT,createHandler as Ra,createHandlerAsync as Ca,getProviderCollection as Pa,hasProvider as eT,registerAsyncHandler as fa,registerHandler as wa,registerModel as Sa,registerProvider as $E}from"@cline/llms";function oT($){return $?{...$}:{}}function Ea($,Z){if($)return $;if(!Z)return;let Q=globalThis.process;if(!Q?.env)return;return Q.env[Z]}function Ma($,Z){if(!Z.length)throw Error(`Provider "${$}" must include at least one model.`)}function sT($){let Z=Object.keys($.collection.models);return{id:$.collection.provider.id,name:$.collection.provider.name,description:$.collection.provider.description,protocol:$.collection.provider.protocol,baseUrl:$.collection.provider.baseUrl,capabilities:$.collection.provider.capabilities,env:$.collection.provider.env,models:Z,defaultModel:$.collection.provider.defaultModelId,modelCount:Z.length}}class PG{providers=new Map;register($){Ma($.id,$.models);let Z=$.defaultModel??$.models[0];if(!Z)throw Error(`Provider "${$.id}" must define a default model.`);if(!$.models.includes(Z))throw Error(`Default model "${Z}" is not included in configured models for "${$.id}".`);let Q=this.providers.get($.id);this.providers.set($.id,{id:$.id,models:new Set([...Q?.models??[],...$.models]),defaultModel:Z,defaults:{...Q?.defaults??{},...oT($.defaults)}})}registerSelectionConfig($){this.register({id:$.id,models:$.models,defaultModel:$.defaultModel,defaults:{apiKey:Ea($.apiKey,$.apiKeyEnv),routingProviderId:$.builtinProviderId,baseUrl:$.baseUrl,headers:$.headers,timeoutMs:$.timeoutMs,capabilities:$.capabilities,...oT($.settings)}})}registerModel($,Z){let Q=this.providers.get($);if(!Q){this.providers.set($,{id:$,models:new Set([Z]),defaultModel:Z,defaults:{}});return}Q.models.add(Z)}createHandlerConfig($){let Z=this.require($.providerId),Q=$.modelId??Z.defaultModel;if(!Z.models.has(Q))throw Error(`Model "${Q}" is not configured for provider "${$.providerId}".`);return{providerId:$.providerId,modelId:Q,...Z.defaults,...$.overrides}}list(){return Array.from(this.providers.values()).map(($)=>({id:$.id,models:Array.from($.models),defaultModel:$.defaultModel}))}getModels($){return Array.from(this.require($).models)}hasProvider($){return this.providers.has($)}hasModel($,Z){return this.providers.get($)?.models.has(Z)??!1}require($){let Z=this.providers.get($);if(!Z)throw Error(`Provider "${$}" is not configured in this SDK instance.`);return Z}}class vZ{configuredProviders=new PG;constructor($){this.applyConfig($)}createHandler($){return Ra(this.configuredProviders.createHandlerConfig($))}async createHandlerAsync($){return Ca(this.configuredProviders.createHandlerConfig($))}registerProvider($){if($E($.collection),$.handlerFactory&&$.asyncHandlerFactory)throw Error(`Provider "${$.collection.provider.id}" cannot register both sync and async handlers.`);if($.handlerFactory)wa($.collection.provider.id,$.handlerFactory);if($.asyncHandlerFactory)fa($.collection.provider.id,$.asyncHandlerFactory);this.configuredProviders.register({id:$.collection.provider.id,models:$.exposeModels??Object.keys($.collection.models),defaultModel:$.defaultModel??$.collection.provider.defaultModelId,defaults:$.defaults})}registerBuiltinProvider($){let Z=$.exposeModels??Object.keys($.models),Q=$.defaultModel??Z[0];if(!Q)throw Error(`Provider "${$.id}" must define a default model.`);$E({provider:{id:$.id,name:$.name??$.id,description:$.description,protocol:$.protocol,baseUrl:$.baseUrl,defaultModelId:Q,client:$.client??"openai-compatible",capabilities:$.capabilities,env:$.env,source:"system"},models:$.models}),this.configuredProviders.register({id:$.id,models:Z,defaultModel:Q,defaults:{routingProviderId:$.builtinProviderId,...$.defaults??{}}})}registerModel($){Sa($.providerId,$.modelId,$.info),this.configuredProviders.registerModel($.providerId,$.modelId)}getProviders(){return this.configuredProviders.list()}getBuiltInProviderIds(){return[...tT]}async getBuiltInProviders(){return(await Promise.all(tT.map((Z)=>Pa(Z)))).filter((Z)=>Z!==void 0).map((Z)=>sT({collection:Z}))}getModels($){return this.configuredProviders.getModels($)}isProviderConfigured($){return this.configuredProviders.hasProvider($)}isModelConfigured($,Z){return this.configuredProviders.hasModel($,Z)}applyConfig($){for(let Z of $.providers)this.configuredProviders.registerSelectionConfig(Z);for(let Z of $.models??[])this.registerModel(Z);for(let Z of $.customProviders??[])this.registerProvider(Z);for(let Z of this.configuredProviders.list()){let Q=eT(Z.id),J=this.configuredProviders.createHandlerConfig({providerId:Z.id,modelId:Z.defaultModel}).routingProviderId,X=typeof J==="string"&&eT(J);if(!Q&&!X)throw Error(`Provider "${Z.id}" is not known. Register it through customProviders/registerProvider, registerBuiltinProvider, or use a built-in provider ID.`)}}}function fG($){return new vZ($)}eW();async function ba(){return Promise.resolve().then(() => (HX(),eq))}function Mn(){return new Date().toISOString()}var Rn="cline",Cn="cline-pass";function Pn($){if(BE($)!=="providers.json")return;let Z=xG($);if(BE(Z)!=="settings")return;return xG(Z)}class U${filePath;dataDir;constructor($={}){if(this.filePath=$.filePath??En(),this.dataDir=$.dataDir??Pn(this.filePath),this.dataDir||!$.filePath)fZ({providerSettingsManager:this,dataDir:this.dataDir});if(AZ(this),qZ(this.read()),kG(this.filePath))try{KE(this.filePath,384)}catch{}}getFilePath(){return this.filePath}read(){if(!kG(this.filePath))return S2();try{let $=Nn(this.filePath,"utf8"),Z=JSON.parse($),Q=k4.safeParse(Z);if(Q.success){qZ(Q.data);let J=Q.data.providers.cline?.settings?.auth;return j0(`providers.read providers=[${Object.keys(Q.data.providers).join(",")}] lastUsed=${Q.data.lastUsedProvider??"none"} clineAuthPresent=${!!J?.accessToken} clineAccessTokenHash=${d0(J?.accessToken)} clineRefreshTokenHash=${d0(J?.refreshToken)}`),Q.data}}catch{}return S2()}write($){let Z=k4.parse($),Q=xG(this.filePath);if(!kG(Q))On(Q,{recursive:!0,mode:448});let J=`${this.filePath}.${process.pid}.tmp`;try{Tn(J,`${JSON.stringify(Z,null,2)}
954
954
  `,{encoding:"utf8",mode:384}),qn(J,this.filePath)}catch(X){throw An(J,{force:!0}),X}try{KE(this.filePath,384)}catch{}qZ(Z)}saveProviderSettings($,Z={}){let Q=b4.parse($),J=this.read(),X=Q.provider,W=Z.setLastUsed!==!1,j=J.providers[X],Y=Z.tokenSource??j?.tokenSource??"manual",V={...J,providers:{...J.providers,[X]:{settings:Q,updatedAt:Mn(),tokenSource:Y}},lastUsedProvider:W?X:J.lastUsedProvider};this.write(V);let K=J.providers.cline?.settings?.auth,B=Q.provider==="cline"?Q.auth:V.providers.cline?.settings?.auth,G=!!K?.accessToken&&!B?.accessToken;return j0(`providers.save providerId=${X} tokenSource=${Y} clineAuthWasPresent=${!!K?.accessToken} clineAuthIsPresent=${!!B?.accessToken} authDropped=${G}`),V}resolveProviderSettings($,Z){let Q=$.providers[Z]?.settings,X=C0(Z)?.storageProviderId;if(!X||X===Z)return Q;let W=$.providers[X]?.settings;if(!W)return Q;return b4.parse({...W.auth?{auth:W.auth}:{},...W.apiKey?{apiKey:W.apiKey}:{},...W.baseUrl?{baseUrl:W.baseUrl}:{},...Q??{},provider:Z})}getProviderSettings($){let Z=this.read();return this.resolveProviderSettings(Z,$)}getVoiceInputSettings(){return this.read().modes.voiceInput}setVoiceInputSettings($){let Z=this.read();if($)Z.modes.voiceInput=CJ.parse($);else delete Z.modes.voiceInput;return this.write(Z),Z}resolveLastUsedProviderId($,Z){let Q=$.lastUsedProvider;if(Q===Cn&&Z.isClinePassEnabled===!1)return Rn;return Q}getLastUsedProviderSettings($={}){let Z=this.read(),Q=this.resolveLastUsedProviderId(Z,$);if(!Q)return;return this.resolveProviderSettings(Z,Q)}getProviderConfig($,Z){let Q=this.getProviderSettings($);if(!Q)return;return T1(Q,Z)}getLastUsedProviderConfig($={}){let Z=this.getLastUsedProviderSettings($);if(!Z)return;return T1(Z,$)}async refreshCatalog(){try{await f2({})}catch{}}}q0();s2();import{normalizeUserInput as fn}from"@cline/shared";import{nanoid as wn}from"nanoid";class GE{list($){return $?k1($):[]}update($,Z){if(!$)return{sessionId:Z.sessionId,prompts:[],updated:!1};let Q=Z.promptId.trim(),J=$.pendingPrompts.findIndex((V)=>V.id===Q);if(J<0)return{sessionId:Z.sessionId,prompts:k1($),updated:!1};let X=$.pendingPrompts[J];if(!X)return{sessionId:Z.sessionId,prompts:k1($),updated:!1};let W=Z.prompt===void 0?X.prompt:fn(Z.prompt).trim();if(!W)throw Error("prompt cannot be empty");let j=Z.delivery??X.delivery,Y={...X,prompt:W,mode:Z.mode??X.mode,delivery:j};return $.pendingPrompts.splice(J,1),bn($,Y,J,X.delivery),{sessionId:Z.sessionId,prompts:k1($),prompt:qW(Y),updated:!0}}delete($,Z){if(!$)return{sessionId:Z.sessionId,prompts:[],removed:!1};let Q=Z.promptId.trim(),J=$.pendingPrompts.findIndex((W)=>W.id===Q);if(J<0)return{sessionId:Z.sessionId,prompts:k1($),removed:!1};let[X]=$.pendingPrompts.splice(J,1);return{sessionId:Z.sessionId,prompts:k1($),prompt:X?qW(X):void 0,removed:!0}}enqueue($,Z){let{prompt:Q,mode:J,delivery:X,userImages:W,userFiles:j}=Z,Y=$.pendingPrompts.findIndex((V)=>V.prompt===Q);if(Y>=0){let[V]=$.pendingPrompts.splice(Y,1),K={...V,prompt:Q,mode:J??V.mode,userImages:W??V.userImages,userFiles:j??V.userFiles};if(X==="steer"||V.delivery==="steer")$.pendingPrompts.unshift({...K,delivery:"steer"});else $.pendingPrompts.push(K)}else{let V={id:`pending_${Date.now()}_${wn(5)}`,prompt:Q,mode:J,delivery:X,userImages:W,userFiles:j};if(X==="steer")$.pendingPrompts.unshift(V);else $.pendingPrompts.push(V)}return k1($)}consumeSteer($){let Z=$.pendingPrompts.findIndex((J)=>J.delivery==="steer");if(Z<0)return{prompts:k1($)};let[Q]=$.pendingPrompts.splice(Z,1);return{entry:Q,prompts:k1($)}}shiftNext($){return{entry:$.pendingPrompts.shift(),prompts:k1($)}}requeueFront($,Z){return $.pendingPrompts.unshift(Z),k1($)}clear($){return $.pendingPrompts.length=0,[]}}class yG{deps;service=new GE;constructor($){this.deps=$}list($){return this.service.list(this.deps.getSession($))}update($){let Z=this.deps.getSession($.sessionId);if(!Z)return{sessionId:$.sessionId,prompts:[],updated:!1};let Q=this.service.update(Z,$);return this.emitPrompts(Z),this.scheduleDrain($.sessionId,Z),Q}delete($){let Z=this.deps.getSession($.sessionId);if(!Z)return{sessionId:$.sessionId,prompts:[],removed:!1};let Q=this.service.delete(Z,$);return this.emitPrompts(Z),this.scheduleDrain($.sessionId,Z),Q}enqueue($,Z){let Q=this.deps.getSession($);if(!Q)return;this.service.enqueue(Q,Z),this.emitPrompts(Q),this.scheduleDrain($,Q)}consumeSteer($){let Z=this.deps.getSession($);if(!Z)return;let{entry:Q}=this.service.consumeSteer(Z);if(!Q)return;return this.emitPrompts(Z),this.emitSubmitted(Z,Q),Q}discardQueue($){if($.pendingPrompts.length===0)return;this.service.clear($),this.emitPrompts($)}emitPrompts($){this.deps.emit({type:"pending_prompts",payload:{sessionId:$.sessionId,prompts:k1($)}})}scheduleDrain($,Z){if(Z.pendingPrompts.length===0||Z.aborting||Z.drainingPendingPrompts||!Z.agent.canStartRun())return;queueMicrotask(()=>{this.drain($)})}async drain($){let Z=this.deps.getSession($);if(!Z)return;if(Z.aborting||Z.drainingPendingPrompts)return;if(!Z.agent.canStartRun())return;let{entry:Q}=this.service.shiftNext(Z);if(!Q)return;this.emitPrompts(Z),this.emitSubmitted(Z,Q),Z.drainingPendingPrompts=!0;let J=!0;try{let X=await this.deps.send({sessionId:$,prompt:Q.prompt,...Q.mode?{mode:Q.mode}:{},userImages:Q.userImages,userFiles:Q.userFiles});if(Sn(X))J=!1}catch{J=!1,this.service.requeueFront(Z,Q),this.emitPrompts(Z)}finally{if(Z.drainingPendingPrompts=!1,J&&Z.pendingPrompts.length>0&&Z.status!=="failed"&&Z.status!=="cancelled")queueMicrotask(()=>{this.drain($)})}}emitSubmitted($,Z){let Q=qW(Z);this.deps.emit({type:"pending_prompt_submitted",payload:{sessionId:$.sessionId,id:Q.id,prompt:Q.prompt,delivery:Q.delivery,attachmentCount:Q.attachmentCount,userImages:Q.userImages,userFiles:Q.userFiles}})}}function Sn($){return typeof $==="object"&&$!==null&&"finishReason"in $&&$.finishReason==="error"}function qW($){return{id:$.id,prompt:$.prompt,delivery:$.delivery,attachmentCount:($.userImages?.length??0)+($.userFiles?.length??0),userImages:$.userImages,userFiles:$.userFiles}}function k1($){return $.pendingPrompts.map(qW)}function bn($,Z,Q,J){if(Z.delivery==="steer")$.pendingPrompts.unshift(Z);else if(J==="steer")$.pendingPrompts.push(Z);else $.pendingPrompts.splice(Q,0,Z)}q0();class AW{deps;constructor($){this.deps=$}lastKnownIdentityBySession=new Map;static MAX_IDENTITY_SNAPSHOTS=512;dispatchAgentEvent($,Z,Q){let J=this.deps.getSession($),X={sessionId:$,config:Z,liveSession:J,usageBySession:this.deps.usageBySession,aggregateUsageBySession:this.deps.aggregateUsageBySession,persistMessages:this.deps.persistMessages,emit:this.deps.emit},W=$V(Q);if(!!J&&(!W.agentId||W.agentId===IG(J.agent))){let Y={agentId:IG(J.agent),conversationId:J.agent.getConversationId(),...J?.runtime.teamRuntime?{teamRole:"lead"}:{}};this.rememberSessionIdentity($,Y),u3(X,Q,{...Y,isPrimaryAgentEvent:!0});return}u3(X,Q,{...J?{}:this.lastKnownIdentityBySession.get($),isPrimaryAgentEvent:!1})}rememberSessionIdentity($,Z){if(this.lastKnownIdentityBySession.delete($),this.lastKnownIdentityBySession.set($,Z),this.lastKnownIdentityBySession.size>AW.MAX_IDENTITY_SNAPSHOTS){let Q=this.lastKnownIdentityBySession.keys().next().value;if(Q!==void 0)this.lastKnownIdentityBySession.delete(Q)}}async handleTeamEvent($,Z){let Q=this.deps.getSession($);if(Q){if(kK(Q,Z),Z.type==="agent_event"){let J={sessionId:$,config:Q.config,liveSession:Q,usageBySession:this.deps.usageBySession,aggregateUsageBySession:this.deps.aggregateUsageBySession,persistMessages:this.deps.persistMessages,emit:this.deps.emit};u3(J,Z.event,{agentId:Z.agentId,teamRole:"teammate",teamAgentId:Z.agentId,isPrimaryAgentEvent:!1})}if(Z.type==="teammate_spawned"){let J=I$({agentId:Z.teammate.runtimeAgentId??Z.agentId,conversationId:Z.teammate.conversationId,parentAgentId:Z.teammate.parentAgentId,createdByAgentId:IG(Q.agent),teamId:Q.runtime.teamRuntime?.getTeamId(),teamName:Q.runtime.teamRuntime?.getTeamName(),teamRole:"teammate",teamAgentId:Z.agentId});if(J)Z2(Q.config.telemetry,{ulid:$,modelId:Z.teammate.modelId??Q.config.modelId,provider:Q.config.providerId,...J})}}if(await xK($,Z,this.deps.invokeBackendOptional),Q)yK(Q,$,Z,this.deps.emit)}async handlePluginEvent($,Z,Q,J){if(Z.name==="plugin_log"){this.handlePluginLog($,Z.payload);return}if(Z.name==="plugin_telemetry"){this.handlePluginTelemetry($,Z.payload,J);return}if(Z.name==="automation_event"){let K=this.deps.getSession($)?.config.extensionContext?.automation??Q;if(!K)return;let B=Z.payload&&typeof Z.payload==="object"?Z.payload:void 0;if(!B)return;await K.ingestEvent(B);return}if(Z.name!=="steer_message"&&Z.name!=="queue_message"&&Z.name!=="pending_prompt")return;let X=Z.payload&&typeof Z.payload==="object"?Z.payload:void 0,W=typeof X?.sessionId==="string"&&X.sessionId.trim().length>0?X.sessionId.trim():$,j=typeof X?.prompt==="string"?X.prompt.trim():"";if(!j)return;let Y=Z.name==="steer_message"?"steer":Z.name==="queue_message"?"queue":X?.delivery==="steer"?"steer":"queue";this.deps.enqueuePendingPrompt(W,{prompt:j,delivery:Y})}handlePluginTelemetry($,Z,Q){let X=this.deps.getSession($)?.config.telemetry??Q;if(!X||!Z||typeof Z!=="object")return;let W=Z,j=typeof W.pluginName==="string"&&W.pluginName?W.pluginName:"unknown";if(W.kind==="event"){let Y=typeof W.event==="string"?W.event.trim():"";if(!Y)return;let V={...W.properties&&typeof W.properties==="object"?W.properties:{},plugin_name:j,session_id:$};if(W.required===!0)X.captureRequired(`plugin.${Y}`,V);else X.capture({event:`plugin.${Y}`,properties:V});return}if(W.kind==="metric"){let Y=typeof W.name==="string"?W.name.trim():"",V=typeof W.value==="number"?W.value:NaN;if(!Y||Number.isNaN(V))return;let K={...W.attributes&&typeof W.attributes==="object"?W.attributes:{},plugin_name:j},B=typeof W.description==="string"?W.description:void 0,G=W.required===!0,H=`plugin.${Y}`;if(W.metric==="counter")X.recordCounter(H,V,K,B,G);else if(W.metric==="histogram")X.recordHistogram(H,V,K,B,G);else if(W.metric==="gauge")X.recordGauge(H,V,K,B,G)}}handlePluginLog($,Z,Q){let J=this.deps.getSession($),X=Q??J?.config.extensionContext?.logger??J?.config.logger;if(!X||!Z||typeof Z!=="object")return;let W=Z,j=typeof W.message==="string"?W.message:"";if(!j)return;let Y=W.metadata&&typeof W.metadata==="object"?{...W.metadata}:{};if(Y.sessionId??=$,typeof W.pluginName==="string"&&W.pluginName)Y.pluginName=W.pluginName;if(W.level==="debug"){X.debug(j,Y);return}if(W.level==="error"){if(X.error)X.error(j,Y);else X.log(j,{...Y,severity:"error"});return}X.log(j,Y)}}function IG($){return $.getAgentId()}function hG($){return{sessionId:$.sessionId,source:$.source,pid:process.pid,startedAt:$.startedAt,endedAt:$.endedAt??null,exitCode:$.exitCode??null,status:$.status,interactive:$.interactive,provider:$.config.providerId,model:$.config.modelId,cwd:$.config.cwd,workspaceRoot:h$($.config),teamName:$.config.teamName?.trim()||void 0,enableTools:$.config.enableTools,enableSpawn:$.config.enableSpawnAgent,enableTeams:$.config.enableAgentTeams,parentSessionId:typeof $.sessionMetadata?.parentSessionId==="string"?$.sessionMetadata.parentSessionId:void 0,parentAgentId:typeof $.sessionMetadata?.parentAgentId==="string"?$.sessionMetadata.parentAgentId:void 0,agentId:typeof $.sessionMetadata?.agentId==="string"?$.sessionMetadata.agentId:void 0,conversationId:typeof $.sessionMetadata?.conversationId==="string"?$.sessionMetadata.conversationId:void 0,isSubagent:typeof $.sessionMetadata?.isSubagent==="boolean"?$.sessionMetadata.isSubagent:!1,prompt:$.pendingPrompt,metadata:$.sessionMetadata,messagesPath:$.artifacts?.messagesPath,updatedAt:$.updatedAt??$.endedAt??$.startedAt}}function vG($,Z){let Q=$[Z];return typeof Q==="function"?Q:null}async function HE($,Z,...Q){let J=vG($,Z);if(!J)throw Error(`session service method not available: ${Z}`);return Promise.resolve(J.apply($,Q))}async function UE($,Z,...Q){let J=vG($,Z);if(!J)return;await Promise.resolve(J.apply($,Q))}async function FE($,Z,...Q){let J=vG($,Z);if(!J)return;return await Promise.resolve(J.apply($,Q))}y1();q0();function gG($,Z,Q){return{onSubAgentEvent:(J)=>$.onAgentEvent(Q,Z,J),onSubAgentStart:(J)=>{let X=$.getSession(Q)?.runtime.teamRuntime;$.subAgentStarts.set(J.subAgentId,{startedAt:Date.now(),rootSessionId:Q});let W=I$({agentId:J.subAgentId,conversationId:J.conversationId,parentAgentId:J.parentAgentId,teamId:X?.getTeamId(),teamName:X?.getTeamName(),createdByAgentId:J.parentAgentId});if(W)Z2(Z.telemetry,{ulid:Q,modelId:Z.modelId,provider:Z.providerId,...W});y5(Z.telemetry,{event:"started",ulid:Q,durationMs:0,parentId:J.parentAgentId,agentId:J.subAgentId,...W}),$.invokeBackendOptional("handleSubAgentStart",Q,J)},onSubAgentEnd:(J)=>{let X=$.getSession(Q)?.runtime.teamRuntime,W=$.subAgentStarts.get(J.subAgentId),j=W?Date.now()-W.startedAt:0,Y=J.result?.text?J.result.text.split(`
955
- `).length:0;y5(Z.telemetry,{event:"ended",ulid:Q,durationMs:j,outputLines:Y,errorMessage:J.error?String(J.error):void 0,agentId:J.subAgentId,parentId:J.parentAgentId,...I$({agentId:J.subAgentId,conversationId:J.conversationId,parentAgentId:J.parentAgentId,teamId:X?.getTeamId(),teamName:X?.getTeamName(),createdByAgentId:J.parentAgentId})}),$.subAgentStarts.delete(J.subAgentId),$.invokeBackendOptional("handleSubAgentEnd",Q,J)}}}function mG($,Z,Q,J){let X=gG($,Z,Q);return T2({configProvider:{getRuntimeConfig:()=>$.getSession(Q)?.runtime.delegatedAgentConfigProvider?.getRuntimeConfig()??{providerId:Z.providerId,modelId:Z.modelId,cwd:Z.cwd,apiKey:Z.apiKey,baseUrl:Z.baseUrl,headers:Z.headers,providerConfig:Z.providerConfig,knownModels:Z.knownModels,thinking:Z.thinking,maxIterations:Z.maxIterations,hooks:Z.hooks,extensions:Z.extensions,logger:Z.logger,telemetry:Z.telemetry},getConnectionConfig:()=>$.getSession(Q)?.runtime.delegatedAgentConfigProvider?.getConnectionConfig()??{providerId:Z.providerId,modelId:Z.modelId,apiKey:Z.apiKey,baseUrl:Z.baseUrl,headers:Z.headers,providerConfig:Z.providerConfig,knownModels:Z.knownModels,thinking:Z.thinking},updateConnectionDefaults:()=>{}},createSubAgentTools:()=>{let j=Z.enableTools?C6({cwd:Z.cwd,telemetry:Z.telemetry,...A1[x$({mode:Z.mode})],executors:J}):[];if(Z.enableSpawnAgent)j.push(mG($,Z,Q,J));return E$(j)},...X})}import{readFile as kn,stat as xn}from"node:fs/promises";var yn=20480000;async function DE($){let Z=await xn($);if(!Z.isFile())throw Error("Path is not a file");if(Z.size>yn)throw Error("File is too large to read into context.");let Q=await kn($,"utf8");if(Q.includes("\x00"))throw Error("Cannot read binary file into context.");return Q}var LE=5000,dG;function dn($,Z){if(dG)return;dG=CL().then(()=>{return}).catch((Q)=>{dG=void 0,$?.error?.("Detached command log recovery failed",{error:Q}),x1(Z,{component:"core",operation:"command.detached_log_recovery",error:Q,severity:"warn",handled:!0})})}function iZ($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function ln($){if(!$||typeof $!=="object"||Array.isArray($))return;let Z=$,Q=iZ(Z.inputTokens),J=iZ(Z.outputTokens),X=iZ(Z.cacheReadTokens),W=iZ(Z.cacheWriteTokens),j=iZ(Z.totalCost);if(Q===void 0||J===void 0||X===void 0||W===void 0||j===void 0)return;return{inputTokens:Q,outputTokens:J,cacheReadTokens:X,cacheWriteTokens:W,totalCost:j}}function pn($,Z){return{inputTokens:Math.max($.inputTokens,Z.inputTokens),outputTokens:Math.max($.outputTokens,Z.outputTokens),cacheReadTokens:Math.max($.cacheReadTokens,Z.cacheReadTokens),cacheWriteTokens:Math.max($.cacheWriteTokens,Z.cacheWriteTokens),totalCost:Math.max($.totalCost,Z.totalCost)}}function _E($,Z){if(!Z)return!1;if($.source_message_count!==Z.source_message_count)return $.source_message_count<Z.source_message_count;return Date.parse($.updated_at)<Date.parse(Z.updated_at)}class H${runtimeAddress=void 0;pendingPrompts;sessionService;runtimeBuilder;createAgentInstance;toolExecutors;defaultCapabilities;defaultToolPolicies;providerSettingsManager;oauthTokenManager;defaultTelemetry;distinctId;defaultLogger;defaultFetch;events=new m7;sessions=new Map;manifestMutationQueues=new Map;usageBySession=new Map;aggregateUsageBySession=new Map;subAgentStarts=new Map;pendingPromptsController;eventBridge;sessionVersioning=new u2;runCommandExecutionController=new J4;constructor($){let Z=hn();if(Z)un(Z);let Q=W1($.distinctId);this.distinctId=Q,this.sessionService=$.sessionService,this.runtimeBuilder=$.runtimeBuilder??new K5,this.createAgentInstance=$.createAgent??((J)=>new N2(J)),this.defaultCapabilities=i0($.capabilities),this.toolExecutors=this.defaultCapabilities?.toolExecutors,this.defaultToolPolicies=$.toolPolicies,this.providerSettingsManager=$.providerSettingsManager??new U$,this.oauthTokenManager=$.oauthTokenManager??new B5({providerSettingsManager:this.providerSettingsManager,telemetry:$.telemetry}),this.defaultTelemetry=$.telemetry,this.defaultLogger=$.logger,this.defaultTelemetry?.setDistinctId(Q),this.defaultFetch=$.fetch,dn(this.defaultLogger,this.defaultTelemetry),this.pendingPromptsController=new yG({getSession:(J)=>this.sessions.get(J),emit:(J)=>this.emit(J),send:(J)=>this.runTurn(J)}),this.pendingPrompts={list:async(J)=>this.pendingPromptsController.list(J.sessionId),update:async(J)=>this.pendingPromptsController.update(J),delete:async(J)=>this.pendingPromptsController.delete(J)},this.eventBridge=new AW({getSession:(J)=>this.sessions.get(J),usageBySession:this.usageBySession,aggregateUsageBySession:this.aggregateUsageBySession,emit:(J)=>this.emit(J),persistMessages:(J,X,W)=>{this.invoke("persistSessionMessages",J,X,W).catch((j)=>{let Y=this.sessions.get(J);(Y?.config.logger??this.defaultLogger)?.error?.("Failed to persist session messages from agent event",{sessionId:J,error:j}),x1(Y?.config.telemetry??this.defaultTelemetry,{component:"core",operation:"session.persist_messages_on_agent_event",error:j,severity:"warn",handled:!0,context:{sessionId:J,providerId:Y?.config.providerId,modelId:Y?.config.modelId}})})},enqueuePendingPrompt:(J,X)=>this.pendingPromptsController.enqueue(J,X),invokeBackendOptional:(J,...X)=>this.invokeOptional(J,...X)})}async applyInitialOAuthCredentials($){if($.config.apiKey?.trim())return $;let Z=await this.oauthTokenManager.resolveProviderApiKey({providerId:$.config.providerId});if(!Z?.apiKey)return $;return{...$,config:{...$.config,apiKey:Z.apiKey}}}async startSession($){let Z=$.config.sessionId?.trim()??"",Q=Z||gn(),J=Z.length>0&&($.initialMessages?.length??0)>0&&!$.prompt?.trim(),X=Boolean($.config.cwd?.trim()||$.config.workspaceRoot?.trim()),W=J&&!X?await this.invokeOptionalValue("readSessionManifest",Q):void 0,j=W?{...$.config,cwd:W.cwd,workspaceRoot:W.workspace_root}:await gL($.config);return await this.startResolvedSession({...$,config:j},Q,Z.length>0,W)}async startResolvedSession($,Z,Q,J){let X=$.source??J0.CLI,W=L0(),j=await this.applyInitialOAuthCredentials($),Y=j.initialMessages??[],V=Y.length>0?_4(Y):g0(),K=await this.invokeOptionalValue("ensureSessionsDir")??"";if(!K)throw Error("session service method not available: ensureSessionsDir");let B=cG(K,Z),G=cG(B,`${Z}.messages.json`),H=cG(B,`${Z}.json`),U=h$($.config),F=$.interactive===!0&&!j.prompt?.trim(),D=V1.parse({version:1,session_id:Z,source:X,pid:process.pid,started_at:W,status:F?"idle":"running",interactive:$.interactive===!0,provider:j.config.providerId,model:j.config.modelId,cwd:j.config.cwd,workspace_root:U,team_name:j.config.teamName,enable_tools:j.config.enableTools,enable_spawn:j.config.enableSpawnAgent,enable_teams:j.config.enableAgentTeams,prompt:j.prompt?.trim()||void 0,messages_path:G}),L,z;if(Q&&Y.length>0&&!j.prompt?.trim()){let u=J??await this.invokeOptionalValue("readSessionManifest",Z);if(u)D=u,L={manifestPath:H,messagesPath:u.messages_path||G,compactionPath:u.compaction_path,manifest:u},z=await this.invokeOptionalValue("readSessionCompactionState",Z)}let O=await this.seedAggregateUsageFromArtifacts({initialUsage:V,sessionDir:B,rootMessagesPath:L?.messagesPath??G,manifest:D});this.usageBySession.set(Z,V),this.aggregateUsageBySession.set(Z,O);let A=i0(this.defaultCapabilities,$.capabilities),q=A?.toolExecutors??this.toolExecutors,N=$.localRuntime,T=N?.extensionContext?.logger??N?.logger,C=N?.extensionContext?.automation,r=N?.extensionContext?.telemetry??N?.telemetry??this.defaultTelemetry,y,x={getSession:(u)=>this.sessions.get(u),subAgentStarts:this.subAgentStarts,onAgentEvent:(u,F0,k0)=>this.eventBridge.dispatchAgentEvent(u,F0,k0),invokeBackendOptional:(u,...F0)=>this.invokeOptional(u,...F0)};y=await BO({input:j,localRuntime:$.localRuntime,sessionId:Z,providerSettingsManager:this.providerSettingsManager,defaultTelemetry:this.defaultTelemetry,defaultLogger:this.defaultLogger,defaultCapabilities:A,defaultToolPolicies:this.defaultToolPolicies,defaultFetch:this.defaultFetch,onPluginEvent:(u)=>{if(u.name==="plugin_log"){this.eventBridge.handlePluginLog(Z,u.payload,T);return}this.eventBridge.handlePluginEvent(Z,u,C,r)},onTeamEvent:(u)=>{this.eventBridge.handleTeamEvent(Z,u),y.config.onTeamEvent?.(u)},createSpawnTool:()=>mG(x,y.config,Z,q),createSubAgentLifecycleCallbacks:(u)=>gG(x,u,Z),readSessionMetadata:async()=>(await this.getSession(Z))?.metadata,writeSessionMetadata:async(u)=>{await this.persistSessionMetadata(Z,()=>u)}});let E=v0(WQ({...L?.manifest.metadata??{},...j.sessionMetadata??{}},y.gitState),{mode:j.mode,version:y.config.extensionContext?.client?.version});if(!L)D.metadata=E;let g=await this.runtimeBuilder.build({...y.runtimeBuilderInput,distinctId:this.distinctId,runCommandExecutionController:this.runCommandExecutionController}),S=y.config,n=y.providerConfig;if(g.teamRuntime&&!S.teamName?.trim())S.teamName=g.teamRuntime.getTeamName();let k=async()=>{let u=this.sessions.get(Z);if(!u||!K2(u.config.providerId))return!1;try{return await this.syncOAuthCredentials(u,{forceRefresh:!0}),!0}catch{return!1}};g.delegatedAgentConfigProvider?.updateConnectionDefaults({onAuthError:k});let I=[...g.tools,...S.extraTools??[]],d=g.extensions??y.extensions,Z0=j.initialCompactionState,m0,G0=_9(S),G1=Z0??z,r0=G1?{...G1,conversation_id:G1.conversation_id?.trim()||Z}:void 0,z$=z9({compact:G0,getState:()=>m0?.compactionState,saveState:async(u,F0)=>{let k0=m0;if(!k0)return;let a0={...u,conversation_id:k0.sessionId};try{if(!(await this.persistActiveSessionCompactionState(k0,a0,F0)).updated)S.logger?.debug?.("Skipped stale session compaction state",{sessionId:k0.sessionId,sourceMessageCount:a0.source_message_count})}catch(r2){S.logger?.error?.("Failed to persist session compaction state",{sessionId:k0.sessionId,error:r2}),x1(S.telemetry,{component:"core",operation:"session.persist_compaction_state",severity:"warn",handled:!0,error:r2,context:{sessionId:k0.sessionId,providerId:S.providerId,modelId:S.modelId}})}}}),H1={distinctId:this.distinctId,sessionId:Z,providerId:n.providerId,modelId:n.modelId,apiKey:n.apiKey,baseUrl:n.baseUrl,headers:n.headers,onAuthError:k,knownModels:n.knownModels,providerConfig:n,thinking:S.thinking,reasoningEffort:S.reasoningEffort??n.reasoningEffort,thinkingBudgetTokens:S.thinkingBudgetTokens,maxTokensPerTurn:S.maxTokensPerTurn,temperature:S.temperature,systemPrompt:S.systemPrompt,maxIterations:S.maxIterations,execution:S.execution,prepareTurn:z$,tools:I,modelTools:g.modelTools,hooks:y.hooks,extensions:d,hookErrorMode:S.hookErrorMode,initialMessages:y.effectiveInput.initialMessages,userFileContentLoader:DE,toolPolicies:y.toolPolicies,requestToolApproval:y.requestToolApproval?async(u)=>{let F0=y.requestToolApproval,k0=this.sessions.get(Z);if(k0)await this.markTurnPending(k0);try{if(!F0)return{approved:!1,reason:"Tool approval callback is not configured."};return await F0(u)}finally{let a0=this.sessions.get(Z);if(a0?.status==="pending")await this.markTurnRunning(a0)}}:void 0,telemetry:S.telemetry,onConsecutiveMistakeLimitReached:S.onConsecutiveMistakeLimitReached,completionPolicy:g.completionPolicy,consumePendingUserMessage:()=>{let u=this.pendingPromptsController.consumeSteer(Z);return u?n7(u.prompt,u.mode??S.mode):void 0},logger:g.logger??S.logger,extensionContext:S.extensionContext,onEvent:(u)=>this.eventBridge.dispatchAgentEvent(Z,S,u)};H1.hooks={...H1.hooks,onEvent:async(u)=>{if(await y.hooks?.onEvent?.(u),u.type!=="assistant-message")return;let F0=this.sessions.get(Z);if(!F0)return;let k0=F0.agent.getMessages();try{await this.invoke("persistSessionMessages",Z,k0,S.systemPrompt)}catch(a0){S.logger?.error?.("Failed to persist session messages after assistant response",{sessionId:Z,error:a0}),x1(S.telemetry,{component:"core",operation:"session.persist_messages_after_assistant_response",error:a0,severity:"warn",handled:!0,context:{sessionId:Z,providerId:S.providerId,modelId:S.modelId}})}}};let c0=this.createAgentInstance(H1);if(H1.onEvent)c0.subscribeEvents(H1.onEvent);g.registerLeadAgent?.(c0);let t0=I$({agentId:c0.getAgentId(),conversationId:c0.getConversationId(),teamId:g.teamRuntime?.getTeamId(),teamName:g.teamRuntime?.getTeamName(),teamRole:g.teamRuntime?"lead":void 0});if(HO(S,Z,Q,U,t0),t0)Z2(S.telemetry,{ulid:Z,modelId:S.modelId,provider:S.providerId,...t0});if(g.teamRuntime)EQ(S.telemetry,{ulid:Z,teamId:g.teamRuntime.getTeamId(),teamName:g.teamRuntime.getTeamName(),leadAgentId:c0.getAgentId(),restoredFromPersistence:g.teamRestoredFromPersistence===!0});let o={sessionId:Z,config:S,sessionMetadata:E,...L?{artifacts:L}:{},source:X,startedAt:L?.manifest.started_at??W,updatedAt:L?.manifest.ended_at??L?.manifest.started_at??W,pendingPrompt:D.prompt,runtime:g,agent:c0,started:!1,status:L?.manifest.status??(F?"idle":"running"),aborting:!1,interactive:$.interactive===!0,persistedMessages:Y,compactionState:r0,activeTeamRunIds:new Set,pendingTeamRunUpdates:[],teamRunWaiters:[],pendingPrompts:[],drainingPendingPrompts:!1,pluginSandboxShutdown:y.pluginSandboxShutdown,submitAndExitObserved:!1,taskCompletedEmitted:!1,lastInteractiveTurnFinishReason:void 0};if(m0=o,o.compactionState&&!this.isCompactionStateForSession(o.sessionId,o.compactionState,o))o.config.logger?.log?.("Ignoring session compaction state for a different conversation",{severity:"warn",sessionId:o.sessionId,conversationId:o.compactionState.conversation_id}),o.compactionState=void 0;if(this.sessions.set(Z,o),L)await this.refreshActiveSessionGitMetadata(o,y.gitState);if(Y.length>0&&!L)try{await this.ensureSessionPersisted(o),await this.invoke("persistSessionMessages",Z,Y,o.config.systemPrompt)}catch(u){o.config.logger?.error?.("Failed to persist seeded session messages at start",{sessionId:Z,error:u}),x1(o.config.telemetry,{component:"core",operation:"session.persist_seeded_messages",error:u,severity:"warn",handled:!0,context:{sessionId:Z,providerId:o.config.providerId,modelId:o.config.modelId}})}this.emitStatus(Z,o.status);let U1;try{if(j.prompt?.trim())if(U1=await this.executeTurn(o,{prompt:j.prompt,userImages:j.userImages,userFiles:j.userFiles}),!o.interactive)await this.finalizeSingleRun(o,U1.finishReason);else await this.completeInteractiveTurn(o,U1.finishReason)}catch(u){if(o.interactive&&o.aborting)U1=await this.completeAbortedInteractiveTurn(o);else{x1(o.config.telemetry,{component:"core",operation:"session.start",error:u,severity:"error",handled:!1,context:{sessionId:o.sessionId,providerId:o.config.providerId,modelId:o.config.modelId}});try{await this.failSession(o)}catch(F0){o.config.logger?.error?.("Session failure cleanup threw",{sessionId:o.sessionId,error:F0})}throw u}}return{sessionId:Z,manifest:D,manifestPath:H,messagesPath:G,result:U1}}async restoreSession($){return this.sessionVersioning.restoreCheckpoint({...$,getSession:(Z)=>this.getSession(Z),readMessages:(Z)=>this.readSessionMessages(Z),buildStartInput:(Z,Q)=>{let J=Z.restoredCheckpointMetadata?{...Q.sessionMetadata??{},checkpoint:Z.restoredCheckpointMetadata}:Q.sessionMetadata;return{...Q,...J?{sessionMetadata:J}:{},initialMessages:Z.initialMessages}},startSession:(Z)=>this.startSession(Z),getStartedSessionId:(Z)=>Z.sessionId,cleanupStartedSession:async(Z)=>{if(!await this.deleteSession(Z.sessionId))throw Error(`Failed to clean up restored session ${Z.sessionId}`)},readRestoredSession:(Z)=>this.getSession(Z)})}async runTurn($){let Z=this.getSessionOrThrow($.sessionId),Q=Z.agent.canStartRun(),J=$.delivery??(Z.interactive&&!Q?"queue":void 0);if(Z.config.telemetry?.capture({event:"session.input_sent",properties:{sessionId:$.sessionId,promptLength:$.prompt.length,userImageCount:$.userImages?.length??0,userFileCount:$.userFiles?.length??0,delivery:J??"immediate"}}),J==="queue"||J==="steer"){this.pendingPromptsController.enqueue($.sessionId,{prompt:$.prompt,mode:$.mode,delivery:J,userImages:$.userImages,userFiles:$.userFiles});return}try{let X=await this.executeTurn(Z,{prompt:$.prompt,mode:$.mode,userImages:$.userImages,userFiles:$.userFiles});if(!Z.interactive)await this.finalizeSingleRun(Z,X.finishReason);else await this.completeInteractiveTurn(Z,X.finishReason);if(X.finishReason!=="error")queueMicrotask(()=>{this.pendingPromptsController.drain($.sessionId)});return X}catch(X){if(Z.interactive&&Z.aborting)return await this.completeAbortedInteractiveTurn(Z);throw x1(Z.config.telemetry,{component:"core",operation:"session.submit",error:X,severity:"error",handled:!1,context:{sessionId:Z.sessionId,providerId:Z.config.providerId,modelId:Z.config.modelId}}),await this.failSession(Z),X}}async getAccumulatedUsage($){let Z=AK(this.usageBySession.get($)),Q=AK(this.aggregateUsageBySession.get($));return Z||Q?{usage:Z,aggregateUsage:Q}:void 0}async abort($,Z){let Q=this.sessions.get($);if(!Q)return;if(Q.config.telemetry?.capture({event:"session.aborted",properties:{sessionId:$}}),Q.aborting=!0,Q.drainingPendingPrompts)this.pendingPromptsController.discardQueue(Q);Q.agent.abort(Z)}async proceedWhileRunning($,Z){return this.runCommandExecutionController.proceedWhileRunning($,Z)}async stopSession($){let Z=this.sessions.get($);if(!Z)return;if(Z.config.telemetry?.capture({event:"session.stopped",properties:{sessionId:$}}),Z.interactive&&!f0(Z.status)){await this.releaseSessionRuntime(Z,"session_stop");return}if(Z.interactive&&Z.agent.canStartRun()){await this.shutdownSession(Z,{status:this.resolveInteractiveStopStatus(Z),exitCode:this.resolveInteractiveStopExitCode(Z),shutdownReason:"session_stop",endReason:"stopped"});return}Z.aborting=!0,Z.agent.abort(Error("session_stop")),await this.shutdownSession(Z,{status:"cancelled",exitCode:0,shutdownReason:"session_stop",endReason:"stopped"})}async dispose($="session_manager_dispose"){let Z=[...this.sessions.values()];if(Z.length===0)return;await Promise.allSettled(Z.map((Q)=>Q.interactive&&!f0(Q.status)?this.releaseSessionRuntime(Q,$):Q.interactive&&Q.agent.canStartRun()?this.shutdownSession(Q,{status:this.resolveInteractiveStopStatus(Q),exitCode:this.resolveInteractiveStopExitCode(Q),shutdownReason:$,endReason:"disposed"}):this.shutdownSession(Q,{status:"cancelled",exitCode:0,shutdownReason:$,endReason:"disposed"}))),this.usageBySession.clear(),this.aggregateUsageBySession.clear()}async getSession($){let Z=this.sessions.get($);if(Z)return hG(Z);let Q=$.trim();if(!Q)return;let J=await this.getRow(Q);if(J)return p9(J);let X=await this.readManifest(Q);return X?ZX(X):void 0}async listSessions($=200){let Q=(await this.listRows($)).map(p9),J=new Set(Q.map((X)=>X.sessionId));for(let X of this.sessions.values()){if(J.has(X.sessionId))continue;Q.unshift(hG(X))}return Q.slice(0,$)}async deleteSession($){if(this.sessions.has($))await this.stopSession($);let Z=await this.invoke("deleteSession",$);if(Z.deleted)this.usageBySession.delete($),this.aggregateUsageBySession.delete($);return Z.deleted}async updateSession($,Z){return{updated:(await this.invokeOptionalValue("updateSession",{sessionId:$,prompt:Z.prompt,metadata:Z.metadata,title:Z.title}))?.updated===!0}}async updateSessionCompactionState($,Z){let Q=$.trim();if(!Q)return{updated:!1};let J=this.sessions.get(Q),X=J?void 0:await this.getSession(Q);if(!(J??X))return{updated:!1};if(J){let Y=await this.readSessionMessages(Q),V=Z.source_message_count>0&&Y.length>=Z.source_message_count,K=V?Y:void 0;if(V){if(!await this.canPersistCompactionState(Q,Z,J,void 0,Y))return{updated:!1};J.agent.restore(Y)}return await this.persistActiveSessionCompactionState(J,Z,K)}if(!await this.canPersistCompactionState(Q,Z,void 0,X))return{updated:!1};let j=await this.invokeOptionalValue("readSessionCompactionState",Q);if(_E(Z,j))return{updated:!1};return await this.invoke("persistSessionCompactionState",Q,Z),{updated:!0}}async readSessionCompactionState($){let Z=$.trim();if(!Z)return;let Q=this.sessions.get(Z);if(Q)for(;;){let J=Q.compactionStateWriteQueue;if(!J)return Q.compactionState;await J.catch(()=>{return})}return await this.invokeOptionalValue("readSessionCompactionState",Z)}isCompactionStateForSession($,Z,Q,J){let X=Z.conversation_id?.trim();if(!X)return!0;if(X===$)return!0;let W=Q?.agent.getConversationId()?.trim()||J?.conversationId?.trim();return W?X===W:!1}async canPersistCompactionState($,Z,Q,J,X){if(!Z.conversation_id?.trim())return!1;if(!this.isCompactionStateForSession($,Z,Q,J))return!1;let W=X??Q?.agent.getMessages()??await this.readSessionMessages($);return B2(Z,W)!==void 0}async persistActiveSessionCompactionState($,Z,Q){if(!await this.canPersistCompactionState($.sessionId,Z,$,void 0,Q))return{updated:!1};return await this.enqueueCompactionStateWrite($,async()=>{let J=$.compactionState,X=J!==void 0&&B2(J,Q??$.agent.getMessages())!==void 0;if(J&&(X?_E(Z,J):Date.parse(Z.updated_at)<Date.parse(J.updated_at)))return{updated:!1};return await this.invoke("persistSessionCompactionState",$.sessionId,Z),$.compactionState=Z,{updated:!0}})}async enqueueCompactionStateWrite($,Z){let J=($.compactionStateWriteQueue??Promise.resolve()).catch(()=>{return}).then(Z),X=J.then(()=>{return},()=>{return});$.compactionStateWriteQueue=X;try{return await J}finally{if($.compactionStateWriteQueue===X)$.compactionStateWriteQueue=void 0}}async readLiveSessionMessages($){let Z=$.trim();if(!Z)return[];let Q=this.sessions.get(Z);if(Q){let J=Q.agent.getMessages();if(J.length>0)return J}return this.readSessionMessages(Z)}async readSessionMessages($){let Z=$.trim();if(!Z)return[];let Q=await this.getRow(Z);if(Q?.messagesPath)return I2(Q.messagesPath);let J=await this.readManifest(Z);return I2(J?.messages_path)}async dispatchHookEvent($){await gN($,{queueSpawnRequest:(Z)=>this.invokeOptional("queueSpawnRequest",Z),upsertSubagentSessionFromHook:(Z)=>this.invokeOptionalValue("upsertSubagentSessionFromHook",Z),appendSubagentHookAudit:(Z,Q)=>this.invokeOptional("appendSubagentHookAudit",Z,Q),applySubagentStatus:(Z,Q)=>this.invokeOptional("applySubagentStatus",Z,Q)})}subscribe($,Z){return this.events.subscribe($,Z)}async updateSessionModel($,Z){await this.updateSessionConnection($,{modelId:Z})}async updateSessionConnection($,Z){let Q=A6(Z),J=this.getSessionOrThrow($);if(Q.providerId!==void 0)J.config.providerId=Q.providerId;if(Q.modelId!==void 0)J.config.modelId=Q.modelId;if(Q.apiKey!==void 0)J.config.apiKey=Q.apiKey;if(Q.baseUrl!==void 0)J.config.baseUrl=Q.baseUrl;if(Q.headers!==void 0)J.config.headers=Q.headers;if(Q.providerConfig!==void 0)J.config.providerConfig=Q.providerConfig;if(Object.hasOwn(Q,"reasoningEffort"))J.config.reasoningEffort=Q.reasoningEffort??void 0;if(Object.hasOwn(Q,"thinkingBudgetTokens"))J.config.thinkingBudgetTokens=Q.thinkingBudgetTokens??void 0;if(Object.hasOwn(Q,"thinking")){if(J.config.thinking=Q.thinking??void 0,Q.thinking===!1||Q.thinking===null)J.config.reasoningEffort=void 0,J.config.thinkingBudgetTokens=void 0}let X={...Q.providerId!==void 0?{providerId:Q.providerId}:{},...Q.modelId!==void 0?{modelId:Q.modelId}:{},...Q.apiKey!==void 0?{apiKey:Q.apiKey}:{},...Q.baseUrl!==void 0?{baseUrl:Q.baseUrl}:{},...Q.headers!==void 0?{headers:Q.headers}:{},...Q.providerConfig!==void 0?{providerConfig:Q.providerConfig}:{},...Object.hasOwn(Q,"reasoningEffort")?{reasoningEffort:Q.reasoningEffort??void 0}:{},...Object.hasOwn(Q,"thinking")?{thinking:Q.thinking??void 0}:{},...Object.hasOwn(Q,"thinkingBudgetTokens")?{thinkingBudgetTokens:Q.thinkingBudgetTokens??void 0}:{}};if(Q.thinking===!1||Q.thinking===null)X.reasoningEffort=void 0,X.thinkingBudgetTokens=void 0;let W={...Q.apiKey!==void 0?{apiKey:Q.apiKey}:{},...Q.baseUrl!==void 0?{baseUrl:Q.baseUrl}:{},...Q.headers!==void 0?{headers:Q.headers}:{}};if(J.runtime.delegatedAgentConfigProvider?.updateConnectionDefaults(X),J.agent.updateConnection(Q),J.runtime.teamRuntime?.updateTeammateConnections(W),Q.providerId||Q.modelId)await this.mutateSessionManifest(J,(j)=>{if(Q.providerId)j.provider=Q.providerId;if(Q.modelId)j.model=Q.modelId})}async mutateSessionManifest($,Z){let Q=$.artifacts;if(!Q)return;let J=$.sessionId,W=(this.manifestMutationQueues.get(J)??Promise.resolve()).then(async()=>{let Y=await this.invokeOptionalValue("readSessionManifest",J)??Q.manifest;return Z(Y),Q.manifest=Y,await this.invoke("writeSessionManifest",Q.manifestPath,Y),Y}),j=W.then(()=>{return},()=>{return});this.manifestMutationQueues.set(J,j);try{return await W}finally{if(this.manifestMutationQueues.get(J)===j)this.manifestMutationQueues.delete(J)}}handlePluginEvent($,Z,Q){return this.eventBridge.handlePluginEvent($,Z,Q)}async executeTurn($,Z){let Q=await this.prepareTurnInput($,Z),J=Q.prompt.trim(),X=Q?.userImages?.length,W=Q?.userFiles?.length;if(!J&&!X&&!W)throw Error("prompt cannot be empty");if(!$.artifacts&&!$.pendingPrompt)$.pendingPrompt=J;if(await this.ensureSessionPersisted($),!$.pendingPrompt){$.pendingPrompt=J;try{await this.invokeOptionalValue("updateSession",{sessionId:$.sessionId,prompt:J})}catch(j){$.config.logger?.log?.("Failed to backfill seeded session prompt",{severity:"warn",sessionId:$.sessionId,error:j})}}await this.refreshActiveSessionGitMetadata($),await this.syncOAuthCredentials($),await this.markTurnRunning($);try{let j=await this.executeAgentTurn($,J,Q.userImages,Q.userFiles);while(IK($,j.finishReason)){let Y=await hK($);if(Y.length===0)break;let V=vK($,Y);j=await this.executeAgentTurn($,V)}return j}finally{await this.refreshActiveSessionGitMetadata($)}}async completeInteractiveTurn($,Z){if(a7($))return;$.lastInteractiveTurnFinishReason=Z,await this.markTurnIdle($),$.aborting=!1}resolveInteractiveStopStatus($){let Z=$.lastInteractiveTurnFinishReason;if(!Z)return"cancelled";switch(Z){case"completed":return"completed";case"error":return"failed";case"aborted":case"max_iterations":case"mistake_limit":return"cancelled"}return Z}resolveInteractiveStopExitCode($){return $.lastInteractiveTurnFinishReason==="error"?1:0}async completeAbortedInteractiveTurn($){let Z=new Date,Q=$.agent.getMessages(),J=g0();if($.persistedMessages=Q,$.started=$.started||Q.length>0,Q.length>0)try{await this.ensureSessionPersisted($),await this.invoke("persistSessionMessages",$.sessionId,Q,$.config.systemPrompt)}catch(X){$.config.logger?.error?.("Failed to persist session messages after abort",{sessionId:$.sessionId,error:X}),x1($.config.telemetry,{component:"core",operation:"session.persist_messages_after_abort",error:X,severity:"warn",handled:!0,context:{sessionId:$.sessionId,providerId:$.config.providerId,modelId:$.config.modelId}})}return this.eventBridge.dispatchAgentEvent($.sessionId,$.config,{type:"done",reason:"aborted",text:"",iterations:0,usage:J}),await this.completeInteractiveTurn($,"aborted"),queueMicrotask(()=>{this.pendingPromptsController.drain($.sessionId)}),{text:"",usage:J,messages:Q,toolCalls:[],iterations:0,finishReason:"aborted",model:{id:$.config.modelId,provider:$.config.providerId},startedAt:Z,endedAt:Z,durationMs:0}}async executeAgentTurn($,Z,Q,J){let X=$.started||$.agent.getMessages().length>0,W=$.persistedMessages??$.agent.getMessages(),j=this.usageBySession.get($.sessionId)??g0(),Y=this.aggregateUsageBySession.get($.sessionId)??j;$.turnUsageBaseline=j,$.turnAggregateUsageBaseline=Y,$.turnPrimaryUsage=g0(),$.turnUsageByAgent=new Map,_Q($.config.telemetry,$.sessionId,$.config.mode),T8($.config.telemetry,{ulid:$.sessionId,provider:$.config.providerId,model:$.config.modelId,source:"user",mode:$.config.mode,...this.getSessionAgentTelemetryIdentity($)});try{let V=X?()=>$.agent.continue(Z,Q,J):()=>$.agent.run(Z,Q,J),K=await this.runWithAuthRetry($,V,W);$.started=!0;let B=c3(K.messages,K,W);$.persistedMessages=B;let G=r9($.turnUsageByAgent?.values()??[]),H=h0(j,K.usage),U=h0(h0(g0(),K.usage),G),F=h0(Y,U);return this.usageBySession.set($.sessionId,H),this.aggregateUsageBySession.set($.sessionId,F),await this.persistSessionMetadata($.sessionId,(D)=>({...D??{},totalCost:H.totalCost,aggregatedAgentsCost:F.totalCost,usage:H,aggregateUsage:F})),await this.invoke("persistSessionMessages",$.sessionId,B,$.config.systemPrompt),this.observeTaskCompletionTool($,K),K}catch(V){x1($.config.telemetry,{component:"core",operation:"session.turn",error:V,severity:"error",handled:!1,context:{sessionId:$.sessionId,providerId:$.config.providerId,modelId:$.config.modelId}});try{await this.invoke("persistSessionMessages",$.sessionId,$.agent.getMessages(),$.config.systemPrompt)}catch(K){$.config.logger?.error?.("Failed to persist session messages after turn error",{sessionId:$.sessionId,error:K})}throw V}finally{$.turnUsageBaseline=void 0,$.turnAggregateUsageBaseline=void 0,$.turnPrimaryUsage=void 0,$.turnUsageByAgent=void 0}}observeTaskCompletionTool($,Z){if($.submitAndExitObserved)return;if(!Z.toolCalls.some((J)=>J.name===O0.SUBMIT_AND_EXIT&&J.error===void 0))return;$.submitAndExitObserved=!0,$.taskCompletedEmitted=!0,x5($.config.telemetry,{ulid:$.sessionId,provider:$.config.providerId,modelId:$.config.modelId,mode:$.config.mode,durationMs:Date.now()-Date.parse($.startedAt),source:"submit_and_exit",...this.getSessionAgentTelemetryIdentity($)})}emitTaskCompletedOnTeardown($,Z){if($.taskCompletedEmitted||$.submitAndExitObserved)return;if(!($.interactive?$.lastInteractiveTurnFinishReason==="completed"&&!$.aborting&&$.agent.canStartRun():Z==="completed"))return;$.taskCompletedEmitted=!0,x5($.config.telemetry,{ulid:$.sessionId,provider:$.config.providerId,modelId:$.config.modelId,mode:$.config.mode,durationMs:Date.now()-Date.parse($.startedAt),source:"shutdown",...this.getSessionAgentTelemetryIdentity($)})}async prepareTurnInput($,Z){let Q=h$($.config),J=cn(Z.prompt).trim();if(!J)return{prompt:"",userImages:Z.userImages,userFiles:this.resolveAbsoluteFilePaths($.config.cwd,Z.userFiles)};let X=await Q4(J,Q);UO($.config.telemetry,X);let W=n7(X.prompt,Z.mode??$.config.mode),j=this.resolveAbsoluteFilePaths($.config.cwd,Z.userFiles),Y=this.resolveAbsoluteFilePaths(Q,X.matchedFiles),V=Array.from(new Set([...j,...Y]));return{prompt:W,userImages:Z.userImages,userFiles:V.length>0?V:void 0}}async ensureSessionPersisted($){if($.artifacts)return;let Z=h$($.config);if($.artifacts=await this.invoke("createRootSessionWithArtifacts",{sessionId:$.sessionId,source:$.source,pid:process.pid,interactive:$.interactive,provider:$.config.providerId,model:$.config.modelId,cwd:$.config.cwd,workspaceRoot:Z,teamName:$.config.teamName,enableTools:$.config.enableTools,enableSpawn:$.config.enableSpawnAgent,enableTeams:$.config.enableAgentTeams,prompt:$.pendingPrompt,metadata:$.sessionMetadata,startedAt:$.startedAt}),$.compactionState){if(!(await this.persistActiveSessionCompactionState($,$.compactionState)).updated)$.compactionState=void 0}}async markTurnRunning($){if($.status==="running")return;await this.updateStatus($,"running",null)}async refreshActiveSessionGitMetadata($,Z){try{let Q=Z??await xW(h$($.config));if(!Q||!$.artifacts)return;if(kW($.artifacts.manifest.metadata,Q))return;await this.persistSessionMetadata($.sessionId,(J)=>WQ({...J??{},...$.sessionMetadata??{}},Q))}catch(Q){$.config.logger?.debug?.("Failed to refresh session git metadata",{sessionId:$.sessionId,error:Q})}}async markTurnPending($){if($.status==="pending")return;await this.updateStatus($,"pending",null)}async markTurnIdle($){if($.status==="idle")return;await this.updateStatus($,"idle",null)}async persistSessionMetadata($,Z){let Q=this.sessions.get($),J=await this.invokeOptionalValue("readSessionManifest",$)??Q?.artifacts?.manifest,X=Z(J?.metadata);if(!Q?.artifacts)return;if((await this.invokeOptionalValue("updateSession",{sessionId:$,metadata:X}))?.updated===!1)return;Q.sessionMetadata=X,Q.artifacts.manifest.metadata=X}async finalizeSingleRun($,Z){if(a7($))return;let Q=Z==="aborted"||$.aborting,J=Z==="error";await this.shutdownSession($,{status:Q?"cancelled":J?"failed":"completed",exitCode:J?1:0,shutdownReason:J?"session_error":"session_complete",endReason:Z})}async failSession($){$.lastInteractiveTurnFinishReason="error",await this.shutdownSession($,{status:"failed",exitCode:1,shutdownReason:"session_error",endReason:"error"})}async shutdownSession($,Z){if(this.emitTaskCompletedOnTeardown($,Z.status),YX($),!$.aborting&&!$.agent.canStartRun())$.aborting=!0,$.agent.abort(Error(Z.shutdownReason));let Q=[],J=(X,W)=>{Q.push(W),$.config.logger?.log("Session shutdown cleanup failed",{sessionId:$.sessionId,stage:X,error:W,severity:"warn"}),x1($.config.telemetry,{component:"core",operation:"session.shutdown_cleanup",error:W,severity:"warn",handled:!0,context:{sessionId:$.sessionId,stage:X,status:Z.status,shutdownReason:Z.shutdownReason,providerId:$.config.providerId,modelId:$.config.modelId}})};if($.artifacts){await this.refreshActiveSessionGitMetadata($);try{await this.updateStatus($,Z.status,Z.exitCode)}catch(X){J("update_status",X)}}try{await $.agent.shutdown(Z.shutdownReason)}catch(X){J("agent_shutdown",X)}try{await Promise.resolve($.runtime.shutdown(Z.shutdownReason))}catch(X){J("runtime_shutdown",X)}try{await $.pluginSandboxShutdown?.()}catch(X){J("plugin_sandbox_shutdown",X)}if(this.sessions.delete($.sessionId),this.emit({type:"ended",payload:{sessionId:$.sessionId,reason:Z.endReason,ts:Date.now()}}),Q.length>0&&Z.status==="failed")throw Q[0]}async releaseSessionRuntime($,Z){this.emitTaskCompletedOnTeardown($);let Q=[],J=(X,W)=>{Q.push(W),$.config.logger?.log("Session runtime cleanup failed",{sessionId:$.sessionId,stage:X,error:W,severity:"warn"}),x1($.config.telemetry,{component:"core",operation:"session.runtime_cleanup",error:W,severity:"warn",handled:!0,context:{sessionId:$.sessionId,stage:X,reason:Z,providerId:$.config.providerId,modelId:$.config.modelId}})};if(!$.aborting&&!$.agent.canStartRun())$.aborting=!0,$.agent.abort(Error(Z));try{await $.agent.shutdown(Z)}catch(X){J("agent_shutdown",X)}try{await Promise.resolve($.runtime.shutdown(Z))}catch(X){J("runtime_shutdown",X)}try{await $.pluginSandboxShutdown?.()}catch(X){J("plugin_sandbox_shutdown",X)}if(this.sessions.delete($.sessionId),Q.length>0)throw Q[0]}async updateStatus($,Z,Q){if(!$.artifacts)return;let J=await this.invoke("updateSessionStatus",$.sessionId,Z,Q);if(!J.updated)return;let X=await this.mutateSessionManifest($,(W)=>{if(W.status=Z,f0(Z))delete W.ended_at,W.exit_code=null;else W.ended_at=J.endedAt??L0(),W.exit_code=typeof Q==="number"?Q:null});if(!X)return;$.status=Z,$.updatedAt=J.endedAt??L0(),$.endedAt=f0(Z)?null:X.ended_at,$.exitCode=X.exit_code,this.emitStatus($.sessionId,Z)}async runWithAuthRetry($,Z,Q){try{return await Z()}catch(J){if(!K2($.config.providerId)||!mn(J))throw J;return await this.syncOAuthCredentials($,{forceRefresh:!0}),$.agent.restore(Q),Z()}}async syncOAuthCredentials($,Z){let Q=null;try{Q=await this.oauthTokenManager.resolveProviderApiKey({providerId:$.config.providerId,forceRefresh:Z?.forceRefresh})}catch(J){if(J instanceof J8)throw Error(`${J.providerId} requires re-authentication.`);throw J}if(!Q?.apiKey||$.config.apiKey===Q.apiKey)return;$.config.apiKey=Q.apiKey,$.agent.updateConnection({apiKey:Q.apiKey}),$.runtime.delegatedAgentConfigProvider?.updateConnectionDefaults({apiKey:Q.apiKey}),$.runtime.teamRuntime?.updateTeammateConnections({apiKey:Q.apiKey})}getSessionOrThrow($){let Z=this.sessions.get($);if(!Z){let Q=new R$($);throw x1(this.defaultTelemetry,{component:"core",operation:"session.active_lookup",error:Q,severity:"warn",handled:!0,context:{sessionId:$,activeSessionCount:this.sessions.size}}),Q}return Z}resolveAbsoluteFilePaths($,Z){if(!Z||Z.length===0)return[];let Q=Z.map((J)=>J.trim()).filter((J)=>J.length>0).map((J)=>vn(J)?J:uG($,J));return Array.from(new Set(Q))}getSessionAgentTelemetryIdentity($){return I$({agentId:$.agent.getAgentId(),conversationId:$.agent.getConversationId(),teamId:$.runtime.teamRuntime?.getTeamId(),teamName:$.runtime.teamRuntime?.getTeamName(),teamRole:$.runtime.teamRuntime?"lead":void 0})}async seedAggregateUsageFromArtifacts($){let Z=await this.summarizePersistedTeammateUsage($.sessionDir,$.rootMessagesPath,$.manifest.session_id),Q=h0($.initialUsage,Z);return this.withPersistedAggregateUsageFloor(Q,$.manifest)}async summarizePersistedTeammateUsage($,Z,Q){let J=uG(Z),X=`${Q}.messages.json`,W;try{W=In($)}catch{return g0()}let j=g0();for(let Y of W){if(!Y.endsWith(".messages.json"))continue;if(Y===X)continue;let V=uG($,Y);if(V===J)continue;let K=await I2(V);if(K.length===0)continue;j=h0(j,_4(K))}return j}withPersistedAggregateUsageFloor($,Z){let Q=ln(Z.metadata?.aggregateUsage);if(Q)return pn($,Q);let J=Z.metadata?.aggregatedAgentsCost;if(typeof J!=="number"||!Number.isFinite(J)||J<=$.totalCost)return $;return{...$,totalCost:J}}emitStatus($,Z){this.emitSessionSnapshot($),this.emit({type:"status",payload:{sessionId:$,status:Z}})}async emitSessionSnapshot($){let Z=await this.getSession($);if(!Z)return;this.emit({type:"session_snapshot",payload:{sessionId:$,snapshot:j$({session:Z,messages:await this.readSessionMessages($),usage:this.usageBySession.get($),aggregateUsage:this.aggregateUsageBySession.get($)})}})}emit($){this.events.emit($)}async listRows($){return this.invoke("listSessions",Math.min(Math.max(1,Math.floor($)),LE))}async getRow($){let Z=$.trim();if(!Z)return;return(await this.listRows(LE)).find((J)=>J.sessionId===Z)}async readManifest($){let Z=$.trim();if(!Z)return;return await this.invokeOptionalValue("readSessionManifest",Z)}invoke($,...Z){return HE(this.sessionService,$,...Z)}invokeOptional($,...Z){return UE(this.sessionService,$,...Z)}invokeOptionalValue($,...Z){return FE(this.sessionService,$,...Z)}}function an($){return{text:$.text,usage:$.usage,inputTokens:$.usage.inputTokens,outputTokens:$.usage.outputTokens,iterations:$.iterations,finishReason:$.finishReason,toolCalls:$.toolCalls.map((Z)=>({name:Z.name,input:Z.input,output:Z.output,error:Z.error,durationMs:Z.durationMs}))}}function nn($){return $.mode==="plan"?"plan":$.mode==="yolo"?"yolo":"act"}function XE($={}){let Z=async(J)=>J,Q=new H$({sessionService:new G$(new K$),capabilities:{toolExecutors:{submit:Z}},fetch:$.fetch,telemetry:$.telemetry});return{async startSession(J){let X=(J.cwd?.trim()||J.workspaceRoot).trim(),W=await Q.startSession({source:J0.CORE,mode:"automation",sessionMetadata:v0(void 0,{mode:"automation",trigger:J.source}),interactive:!1,config:{providerId:rn(J.provider),modelId:J.model,apiKey:J.apiKey?.trim()||void 0,cwd:X,workspaceRoot:J.workspaceRoot,systemPrompt:J.systemPrompt??"",mode:nn(J),maxIterations:J.maxIterations,enableTools:J.enableTools!==!1,enableSpawnAgent:J.enableSpawn!==!1,enableAgentTeams:J.enableTeams!==!1,disableMcpSettingsTools:J.disableMcpSettingsTools,missionLogIntervalSteps:J.missionStepInterval,missionLogIntervalMs:J.missionTimeIntervalMs},toolPolicies:J.toolPolicies??{"*":{autoApprove:J.autoApproveTools!==!1}},localRuntime:{configExtensions:J.configExtensions}});return{sessionId:W.sessionId,startResult:{sessionId:W.sessionId,manifestPath:W.manifestPath,messagesPath:W.messagesPath}}},async sendSession(J,X){let W=await Q.runTurn({sessionId:J,prompt:X.prompt,userImages:X.attachments?.userImages,userFiles:X.attachments?.userFiles?.map((j)=>j.content)});if(!W)throw Error("local hub schedule runtime returned no turn result");return{result:an(W)}},async abortSession(J){return await Q.abort(J,Error("hub schedule abort")),{applied:!0}},async stopSession(J){return await Q.stopSession(J),{applied:!0}}}}import{resolveClineBuildEnv as CM}from"@cline/shared";function on($){if(typeof $==="string")return $.trim()||void 0;if(!Array.isArray($))return;return $.map((Q)=>{if(Q&&typeof Q==="object"&&"type"in Q&&Q.type==="text"&&"text"in Q&&typeof Q.text==="string")return Q.text.trim();return""}).filter(Boolean).join(`
956
- `).trim()||void 0}var zE=120,lG="...";function gZ($){let Z=$.trim();if(!Z)return"";if(Buffer.byteLength(Z,"utf8")<=zE)return Z;let Q=zE-Buffer.byteLength(lG,"utf8");if(Q<=0)return lG;let J="";for(let X of Z){if(Buffer.byteLength(J+X,"utf8")>Q)break;J+=X}return`${J}${lG}`}async function OE($){let Z=$?.sessionId?.trim()||"unknown",Q=typeof $?.metadata?.messagesPath==="string"?$.metadata.messagesPath:void 0,X=[...await I2(Q)].reverse().find((V)=>V.role==="assistant"),W=X?on(X.content):void 0,j=$?.workspaceRoot?.trim()||"workspace",Y=typeof $?.metadata?.prompt==="string"?$.metadata.prompt.trim():j;return{title:`Task completed (${Z})`,body:gZ(W&&W.length>0?W:Y.length>0?Y:j),severity:"info"}}import{resolve as Vs}from"node:path";import{CLINE_DEFAULT_MODEL_ID as Ks,captureSdkError as PW,createSessionId as XH,HUB_CLIENT_TOOL_APPROVAL_CAPABILITY as Bs}from"@cline/shared";import{isChatWorkspacePath as Gs}from"@cline/shared/storage";import{createSessionId as $o}from"@cline/shared";import{createSessionId as en}from"@cline/shared";function sn($){switch($){case"idle":return"idle";case"pending":return"pending";case"completed":return"completed";case"failed":return"failed";case"cancelled":return"aborted";default:return"running"}}function tn($){let Z=$.metadata&&typeof $.metadata==="object"?JSON.parse(JSON.stringify($.metadata)):{};if($.parentSessionId?.trim())Z.parentSessionId=$.parentSessionId;if($.parentAgentId?.trim())Z.parentAgentId=$.parentAgentId;if($.agentId?.trim())Z.agentId=$.agentId;if($.conversationId?.trim())Z.conversationId=$.conversationId;if($.messagesPath?.trim())Z.messagesPath=$.messagesPath;if($.prompt?.trim())Z.prompt=$.prompt;if($.provider?.trim())Z.provider=$.provider;if($.model?.trim())Z.model=$.model;if($.source?.trim())Z.source=$.source;if(typeof $.pid==="number")Z.pid=$.pid;return Object.keys(Z).length>0?Z:void 0}function TW($,Z,Q,J){return{sessionId:$.sessionId,workspaceRoot:$.workspaceRoot,cwd:$.cwd,createdAt:Date.parse($.startedAt),updatedAt:Date.parse($.updatedAt),createdByClientId:Z?.createdByClientId??"hub",status:sn($.status),participants:Z?[...Z.participants.values()]:[],metadata:tn($),runtimeOptions:{enableTools:$.enableTools,enableSpawn:$.enableSpawn,enableTeams:$.enableTeams,mode:typeof $.metadata?.mode==="string"?$.metadata.mode:void 0,systemPrompt:typeof $.metadata?.systemPrompt==="string"?$.metadata.systemPrompt:void 0},runtimeSession:$.agentId?{agentId:$.agentId,team:$.teamName?{teamId:$.teamName}:void 0}:void 0,...Q?{usage:{...Q}}:{},...J?{aggregateUsage:{...J}}:{}}}function h($,Z){return{version:$.version,requestId:$.requestId,ok:!0,...Z!==void 0?{payload:Z}:{}}}function m($,Z,Q){return{version:$.version,requestId:$.requestId,ok:!1,error:{code:Z,message:Q}}}function p2($){return $&&typeof $==="object"&&!Array.isArray($)?$:void 0}function E0($){if(typeof $.payload?.sessionId==="string")return $.payload.sessionId.trim();return $.sessionId?.trim()??""}function a1($,Z,Q){return{version:"v1",event:$,eventId:en("hevt_"),sessionId:Q,timestamp:Date.now(),payload:Z}}async function s0($,Z){let Q=await $.sessionHost.getSession(Z);if(!Q)return;let J=await $.sessionHost.getAccumulatedUsage?.(Z);return TW(Q,$.sessionState.get(Z),J?.usage,J?.aggregateUsage)}async function X1($,Z){let Q=await $.sessionHost.getSession(Z);if(!Q)return;let[J,X]=await Promise.all([typeof $.sessionHost.readSessionMessages==="function"?$.sessionHost.readSessionMessages(Z):[],$.sessionHost.getAccumulatedUsage?.(Z)]);return j$({session:Q,messages:J,usage:X?.usage,aggregateUsage:X?.aggregateUsage})}function pG($,Z,Q,J,X={}){let W=$.sessionState.get(Z);if(W){if(X.interactive!==void 0)W.interactive=X.interactive;if(J==="creator"&&!W.createdByClientId)W.createdByClientId=Q;if(!W.participants.has(Q))W.participants.set(Q,{clientId:Q,attachedAt:Date.now(),role:J});return W}let j={createdByClientId:Q,interactive:X.interactive??!0,participants:new Map([[Q,{clientId:Q,attachedAt:Date.now(),role:J}]])};return $.sessionState.set(Z,j),j}function NE($,Z,Q,J,X={}){let W=$.sessionState.get(Z);if(W){if(X.interactive!==void 0)W.interactive=X.interactive;if(!W.participants.has(Q))W.participants.set(Q,{clientId:Q,attachedAt:Date.now(),role:J});return W}let j={interactive:X.interactive??!0,participants:new Map([[Q,{clientId:Q,attachedAt:Date.now(),role:J}]])};return $.sessionState.set(Z,j),j}async function EW($,Z){let Q=$o("approval_"),J=Z.sessionId;if($.sessionState.get(J)?.interactive===!1)return{approved:!1,reason:"Tool approval requires an interactive session, but this session is non-interactive."};let W;try{W=await $.sessionHost.getSession(J)}catch{W=void 0}let j=typeof W?.metadata?.agendaTaskId==="string"?W.metadata.agendaTaskId:void 0;return await new Promise((Y)=>{let V=$.buildEvent("approval.requested",{approvalId:Q,sessionId:Z.sessionId,agentId:Z.agentId,conversationId:Z.conversationId,iteration:Z.iteration,toolCallId:Z.toolCallId,toolName:Z.toolName,inputJson:JSON.stringify(Z.input??null),policy:Z.policy,agendaTaskId:j},J);$.pendingApprovals.set(Q,{sessionId:J,resolve:Y,requestedEvent:V}),$.publish(V)})}function qE($,Z){let Q=[];for(let J of $.pendingApprovals.values()){if(!J.requestedEvent)continue;if(Z&&J.sessionId!==Z)continue;Q.push(J.requestedEvent)}return Q}function iG($,Z,Q){let J=$.pendingApprovals.get(Z);if(!J)return;return $.pendingApprovals.delete(Z),J.resolve(Q),{sessionId:J.sessionId}}function rG($,Z,Q){let J=0;for(let[X,W]of[...$.pendingApprovals.entries()]){if(!Z({approvalId:X,sessionId:W.sessionId}))continue;$.pendingApprovals.delete(X),W.resolve({approved:!1,reason:Q}),$.publish($.buildEvent("approval.resolved",{approvalId:X,approved:!1,cancelled:!0,reason:Q},W.sessionId)),J+=1}return J}async function AE($,Z){let Q=typeof Z.payload?.approvalId==="string"?Z.payload.approvalId.trim():"";if(!$.pendingApprovals.get(Q))return m(Z,"approval_not_found",`Unknown approval: ${Q}`);let X=typeof Z.payload?.reason==="string"?Z.payload.reason:Z.payload?.payload&&typeof Z.payload.payload==="object"&&!Array.isArray(Z.payload.payload)&&typeof Z.payload.payload.reason==="string"?Z.payload.payload.reason:void 0,W=Z.payload?.approved===!0,j=iG($,Q,{approved:W,reason:X});if(!j)return m(Z,"approval_not_found",`Unknown approval: ${Q}`);return $.publish($.buildEvent("approval.resolved",{approvalId:Q,approved:W,reason:X},j.sessionId)),h(Z,{approvalId:Q,approved:W})}import{createSessionId as Jo}from"@cline/shared";function Zo($){if($ instanceof Error)return{name:$.name,message:$.message,stack:$.stack};if($===void 0)return;return $}var TE={debug:10,info:20,warn:30,error:40,silent:50};function Qo(){let $=process.env.CLINE_HUB_LOG_LEVEL?.trim().toLowerCase();if($==="debug"||$==="info"||$==="warn"||$==="error"||$==="silent")return $;return process.env.VITEST?"error":"info"}function a($,Z,Q={}){if(TE[$]<TE[Qo()])return;let J=JSON.stringify({ts:new Date().toISOString(),level:$,component:"hub",message:Z,...Object.fromEntries(Object.entries(Q).map(([X,W])=>[X,Zo(W)]).filter(([,X])=>X!==void 0))});if($==="error"||$==="warn"){console.error(`[hub] ${J}`);return}console.log(`[hub] ${J}`)}function rZ($,Z){let Q=Z instanceof Error?Z.stack||Z.message:String(Z);a("error",$,{error:Q})}async function EE($,Z,Q,J,X,W){let j=Jo("capreq_"),Y=performance.now();return a("info","capability.request.start",{requestId:j,sessionId:Z,capabilityName:Q,targetClientId:X}),await new Promise((V,K)=>{$.pendingCapabilityRequests.set(j,{sessionId:Z,targetClientId:X,capabilityName:Q,onProgress:W,resolve:(B)=>{if(a(B.ok?"info":"warn","capability.request.end",{requestId:j,sessionId:Z,capabilityName:Q,targetClientId:X,ok:B.ok,error:B.error,durationMs:Math.round(performance.now()-Y)}),!B.ok){K(Error(B.error||`Capability ${Q} was rejected by ${X}.`));return}V(B.payload)}}),$.publish($.buildEvent("capability.requested",{requestId:j,targetClientId:X,capabilityName:Q,payload:J},Z)),a("info","capability.request.published",{requestId:j,sessionId:Z,capabilityName:Q,targetClientId:X})})}function ME($,Z){let Q=typeof Z.payload?.requestId==="string"?Z.payload.requestId.trim():"",J=$.pendingCapabilityRequests.get(Q);if(!J)return h(Z,{requestId:Q,ignored:!0});if((Z.clientId?.trim()||"")!==J.targetClientId)return m(Z,"capability_wrong_client",`Capability request ${Q} is owned by ${J.targetClientId}`);if(Z.sessionId?.trim()&&Z.sessionId.trim()!==J.sessionId)return m(Z,"capability_wrong_session",`Capability request ${Q} belongs to session ${J.sessionId}`);let W=Z.payload?.payload&&typeof Z.payload.payload==="object"&&!Array.isArray(Z.payload.payload)?Z.payload.payload:{};return J.onProgress?.(W),h(Z,{requestId:Q})}function i2($,Z,Q){let J=0;for(let[X,W]of[...$.pendingCapabilityRequests.entries()]){if(!Z({requestId:X,...W}))continue;$.pendingCapabilityRequests.delete(X),a("warn","capability.request.cancelled",{requestId:X,sessionId:W.sessionId,capabilityName:W.capabilityName,targetClientId:W.targetClientId,reason:Q}),W.resolve({ok:!1,error:Q}),$.publish($.buildEvent("capability.resolved",{requestId:X,capabilityName:W.capabilityName,targetClientId:W.targetClientId,ok:!1,cancelled:!0,error:Q},W.sessionId)),J+=1}return J}async function RE($,Z){let Q=typeof Z.payload?.sessionId==="string"?Z.payload.sessionId.trim():Z.sessionId?.trim()||"",J=typeof Z.payload?.capabilityName==="string"?Z.payload.capabilityName.trim():"",X=typeof Z.payload?.targetClientId==="string"?Z.payload.targetClientId.trim():"";if(!Q||!J||!X)return m(Z,"invalid_capability_request","capability.request requires sessionId, capabilityName, and targetClientId");try{let W=Z.payload?.payload&&typeof Z.payload.payload==="object"&&!Array.isArray(Z.payload.payload)?Z.payload.payload:{},j=await $.requestCapability(Q,J,W,X);return h(Z,j)}catch(W){return m(Z,"capability_request_failed",W instanceof Error?W.message:String(W))}}function CE($,Z){let Q=typeof Z.payload?.requestId==="string"?Z.payload.requestId.trim():"",J=$.pendingCapabilityRequests.get(Q);if(!J)return h(Z,{requestId:Q,ignored:!0});let X=Z.clientId?.trim()||"";if(X!==J.targetClientId)return m(Z,"capability_wrong_client",`Capability request ${Q} is owned by ${J.targetClientId}`);if(Z.sessionId?.trim()&&Z.sessionId.trim()!==J.sessionId)return m(Z,"capability_wrong_session",`Capability request ${Q} belongs to session ${J.sessionId}`);$.pendingCapabilityRequests.delete(Q);let W=Z.payload?.payload&&typeof Z.payload.payload==="object"&&!Array.isArray(Z.payload.payload)?Z.payload.payload:void 0,j=typeof Z.payload?.error==="string"?Z.payload.error:void 0,Y=Z.payload?.ok===!0;return a(Y?"info":"warn","capability.respond",{requestId:Q,sessionId:J.sessionId,capabilityName:J.capabilityName,targetClientId:J.targetClientId,respondedByClientId:X,ok:Y,error:j}),J.resolve({ok:Y,payload:W,error:j}),$.publish($.buildEvent("capability.resolved",{requestId:Q,capabilityName:J.capabilityName,targetClientId:J.targetClientId,respondedByClientId:X,ok:Y,payload:W,error:j},J.sessionId)),h(Z,{requestId:Q,ok:Y})}import{createSessionId as Xo}from"@cline/shared";function PE($,Z){let Q=Z.payload,J=Q?.clientId?.trim()||Z.clientId?.trim()||Xo("client_");return $.clients.set(J,{clientId:J,clientType:Q?.clientType??"unknown",displayName:Q?.displayName,actorKind:Q?.actorKind??"client",connectedAt:Date.now(),lastSeenAt:Date.now(),transport:Q?.transport??"native",capabilities:Q?.capabilities??[],metadata:Q?.metadata,workspaceContext:Q?.workspaceContext}),$.publish($.buildEvent("hub.client.registered",{clientId:J,clientType:Q?.clientType??"unknown",displayName:Q?.displayName,connectedAt:Date.now()})),h(Z,{clientId:J})}function fE($,Z){let Q=Z.clientId?.trim(),J=Q?$.clients.get(Q):void 0;if(!Q||!J)return m(Z,"client_not_found","Client is not registered with this hub.");let X=p2(Z.payload?.metadata);if(J.lastSeenAt=Date.now(),X)J.metadata=JSON.parse(JSON.stringify(X));if(Array.isArray(Z.payload?.capabilities))J.capabilities=Z.payload.capabilities.flatMap((W)=>{if(!W||typeof W!=="object"||Array.isArray(W))return[];let j=W;if(typeof j.name!=="string"||!j.name.trim())return[];return[{name:j.name.trim(),...typeof j.description==="string"?{description:j.description}:{},...Array.isArray(j.scopes)&&j.scopes.every((Y)=>typeof Y==="string")?{scopes:j.scopes}:{}}]});return h(Z)}function wE($,Z,Q){let J=Z.clientId?.trim();if(J)$.clients.delete(J),Q(J),$.publish($.buildEvent("hub.client.disconnected",{clientId:J}));return h(Z)}function SE($,Z){return h(Z,{clients:[...$.clients.values()]})}import{buildConnectorConnectArgs as Wo,CONNECTOR_PLATFORMS as jo,connectorChannelsFromPlatforms as Yo,listConnectorCatalog as Vo,mergeConnectorConnectArgs as Ko,shouldIncludeConnectorField as Bo}from"@cline/shared";import{withConnectorStore as aG}from"@cline/shared/db";q0();function D8($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function MW($){return typeof $==="string"?$.trim():void 0}function bE($){if(!D8($))return{};let Z={};for(let[Q,J]of Object.entries($))if(typeof J==="string")Z[Q]=J.trim();return Z}function Go(){return aG(($)=>$.listConfigs()).map(($)=>({id:$.channel,type:$.type,configuredAt:$.configuredAt,updatedAt:$.updatedAt})).sort(($,Z)=>$.type.localeCompare(Z.type))}function nG(){return{available:Yo(),active:X8(),configured:Go()}}function Ho($,Z){if($.required&&!Z[$.flag]?.trim())throw Error(`${$.label} is required`)}function Uo($,Z){let Q={};for(let X of $.fields)Q[X.flag]=Z[X.flag]??X.initialValue??"";let J={};for(let X of $.fields){if(!Bo(X,Q))continue;Ho(X,Q),J[X.flag]=Q[X.flag]}return J}function Fo($){if(!D8($))throw Error("connector.configure payload must be an object.");let Z=MW($.channel);if(!Z)throw Error("channel is required");let Q=jo.find((G)=>G.id===Z);if(!Q)throw Error(`unknown connector channel: ${Z}`);if(!new Set(Vo().map((G)=>G.name)).has(Q.id))throw Error(`connector channel is not available: ${Z}`);let X=bE($.values),W=Uo(Q,X),j=D8($.security)?$.security:{},Y=j.enabled===!0,V=bE(j.values);if(Y&&Q.security)for(let G of Q.security.fields){let H=V[G.key];if(!H)throw Error(G.requiredMessage);let U=G.validate?.(H);if(U)throw Error(U)}let K=Y?{enabled:!0,values:V}:{enabled:!1,values:{}},B=Wo(Q,W,K);return aG((G)=>G.upsertConfig({channel:Z,type:Z,values:W,security:K,updateConnectArgs:(H)=>Ko(Q,H.connection.connectArgs,B,{replaceSecurityArgs:H.config?.security?.enabled===!0||K.enabled})})),nG()}function Do($){if(!D8($))throw Error("connector.delete_config payload must be an object.");let Z=MW($.channel);if(!Z)throw Error("channel is required");return aG((Q)=>Q.deleteConfig(Z)),nG()}function Lo($){return Array.isArray($)?$.filter((Z)=>typeof Z==="string"):[]}function oG(){let $=YZ();if(!$)throw Error("connector supervision is unavailable in this hub; start connectors with the CLI instead");return $}function kE($){if(!D8($))throw Error("payload must be an object.");let Z=MW($.channel);if(!Z)throw Error("channel is required");let Q=MW($.instanceId);if(!Q)throw Error("instanceId is required");return{channel:Z,instanceId:Q}}async function _o($){let{channel:Z,instanceId:Q}=kE($),J=D8($)?$:{};return await oG().start({channel:Z,instanceId:Q,args:Lo(J.args),restart:J.restart===!0})}async function zo($){let{channel:Z,instanceId:Q}=kE($),J=D8($)?$:{};return{stopped:await oG().stop({channel:Z,instanceId:Q,disableAutostart:J.disableAutostart!==!1}),channel:Z,instanceId:Q}}function Oo($){return $==="connector.configure"||$==="connector.delete_config"||$==="connector.start"||$==="connector.stop"}function aZ($,Z,Q){if(!Oo(Z.command))return;o1($.telemetry,{ulid:Z.sessionId??Z.requestId??"hub",tool:Z.command,success:Q})}async function xE($,Z){try{if(Z.command==="connector.channels")return h(Z,nG());if(Z.command==="connector.configure"){let Q=Fo(Z.payload);return aZ($,Z,!0),h(Z,Q)}if(Z.command==="connector.delete_config"){let Q=Do(Z.payload);return aZ($,Z,!0),h(Z,Q)}if(Z.command==="connector.start"){let Q=await _o(Z.payload);return aZ($,Z,!0),h(Z,Q)}if(Z.command==="connector.stop"){let Q=await zo(Z.payload);return aZ($,Z,!0),h(Z,Q)}if(Z.command==="connector.supervised")return h(Z,{supervised:oG().list()});return m(Z,"unsupported_connector_command",`unsupported connector command: ${Z.command}`)}catch(Q){return aZ($,Z,!1),m(Z,"connector_command_failed",Q instanceof Error?Q.message:String(Q))}}var No=30000;function qo($){if($==="aborted")return"run.aborted";if($==="error"||$==="failed")return"run.failed";return"run.completed"}function Ao($){if($.finishReason!=="error")return;return $.text.trim()||void 0}function To($,Z){let Q=$.activeRpcTurnCountBySession;Q.set(Z,(Q.get(Z)??0)+1);let J=!1;return()=>{if(J)return;J=!0;let X=(Q.get(Z)??1)-1;if(X<=0)Q.delete(Z);else Q.set(Z,X)}}function yE($,Z,Q){let J=Q instanceof Error&&Q.message.trim()?Q.message:`Unknown session: ${Z}`;return m($,e2,J)}function Eo($){return $?$:void 0}function Mo($){let Z=typeof $.timeoutMs==="number"?$.timeoutMs:typeof $.timeout_ms==="number"?$.timeout_ms:void 0;if(Z&&Number.isFinite(Z)&&Z>0)return Math.floor(Z);let Q=typeof $.timeoutSeconds==="number"?$.timeoutSeconds:typeof $.timeout_seconds==="number"?$.timeout_seconds:void 0;if(Q&&Number.isFinite(Q)&&Q>0)return Math.floor(Q*1000);return}async function Ro($,Z,Q,J){let X=performance.now(),W=!1,j={command:Z.command,requestId:Z.requestId,clientId:Z.clientId,sessionId:Q.sessionId,timeoutMs:J},Y=setInterval(()=>{if(W)return;let B=Math.round(performance.now()-X);a("warn","run.heartbeat",{...j,elapsedMs:B}),$.publish($.buildEvent("run.heartbeat",{requestId:Z.requestId,elapsedMs:B,...J?{timeoutMs:J}:{}},Q.sessionId))},No),V=$.sessionHost.runTurn(Q);V.then((B)=>{if(!W)return;a("warn","run.late_end",{...j,elapsedMs:Math.round(performance.now()-X),finishReason:B?.finishReason})},(B)=>{if(!W)return;a("error","run.late_error",{...j,elapsedMs:Math.round(performance.now()-X),error:B})});let K;try{if(!J)return await V;return await Promise.race([V,new Promise((B,G)=>{K=setTimeout(()=>{let H=`Hub run ${Z.command} timed out after ${J}ms.`;W=!0,clearInterval(Y),G(Error(H)),a("error","run.timeout",{...j,elapsedMs:Math.round(performance.now()-X)}),rG($,(U)=>U.sessionId===Q.sessionId,H),i2($,(U)=>U.sessionId===Q.sessionId,H),$.sessionHost.abort(Q.sessionId,H).catch((U)=>{a("error","run.timeout_abort_failed",{...j,error:U})})},J)})])}finally{if(W=!0,clearInterval(Y),K)clearTimeout(K)}}async function nZ($,Z){let Q=E0(Z),J=Z.payload&&typeof Z.payload==="object"?Z.payload:{},X=typeof J.prompt==="string"?J.prompt:typeof J.input==="string"?J.input:"";if(!X.trim())return m(Z,"invalid_session_input","session input requires a prompt string");if(!await $.sessionHost.getSession(Q))return yE(Z,Q);$.publish($.buildEvent("run.started",{...Z.requestId?{requestId:Z.requestId}:{},...Z.clientId?{clientId:Z.clientId}:{}},Q));let j=J.attachments&&typeof J.attachments==="object"&&!Array.isArray(J.attachments)?J.attachments:void 0,Y=Array.isArray(j?.userFiles)?j.userFiles.filter((H)=>typeof H==="string"):void 0,V=Mo(J);$.suppressNextTerminalEventBySession.set(Q,"run.start.reply");let K=To($,Q),B;try{try{B=await Ro($,Z,{sessionId:Q,prompt:X,mode:Eo(J.mode),delivery:J.delivery==="queue"||J.delivery==="steer"?J.delivery:void 0,userImages:Array.isArray(j?.userImages)?j.userImages:void 0,userFiles:Y,timeoutMs:V},V)}catch(H){if($.suppressNextTerminalEventBySession.get(Q)==="run.start.reply")$.suppressNextTerminalEventBySession.delete(Q);if(e1(H))return yE(Z,Q,H);throw $.publish($.buildEvent("run.failed",{reason:"error",error:H instanceof Error?H.message:String(H)},Q)),H}if(B){let H=await X1($,Q),U=Ao(B);if($.publish($.buildEvent(qo(B.finishReason),{reason:B.finishReason,...U?{error:U}:{},result:B,...H?{snapshot:H}:{}},Q)),$.suppressNextTerminalEventBySession.get(Q)==="run.start.reply")$.suppressNextTerminalEventBySession.delete(Q)}else $.suppressNextTerminalEventBySession.delete(Q)}finally{K()}let G=await X1($,Q);return h(Z,B||G?{...B?{result:B}:{},...G?{snapshot:G}:{}}:void 0)}async function IE($,Z){let Q=E0(Z),J=typeof Z.payload?.reason==="string"?Z.payload.reason:"Run was aborted before pending approval or capability request was resolved.";rG($,(X)=>X.sessionId===Q,J);try{await $.sessionHost.abort(Q,Z.payload?.reason)}catch(X){a("warn","run.abort_failed",{command:Z.command,requestId:Z.requestId,clientId:Z.clientId,sessionId:Q,error:X})}finally{i2($,(X)=>X.sessionId===Q,J)}return h(Z,{applied:!0})}async function hE($,Z){let Q=E0(Z);if(!Q)return m(Z,"invalid_session_id","run.proceed_while_running requires a sessionId");if(typeof $.sessionHost.proceedWhileRunning!=="function")return m(Z,"unsupported_command","This runtime does not support proceeding while commands are running.");let J=typeof Z.payload?.toolCallId==="string"&&Z.payload.toolCallId.trim().length>0?Z.payload.toolCallId.trim():void 0,X=await $.sessionHost.proceedWhileRunning(Q,J);return h(Z,{detachedCount:X})}async function vE($,Z){let Q=C4(Z.payload?.payload);if(!Q)return m(Z,"invalid_hook_payload","session.hook requires a valid hook event payload");return await $.sessionHost.dispatchHookEvent(Q),h(Z,{applied:!0})}import{join as Co}from"node:path";import{createSessionId as Po}from"@cline/shared";import{loadSqliteDb as fo}from"@cline/shared/db";import{resolveDbDataDir as wo}from"@cline/shared/storage";var So=32,bo=604800000;class q5 extends Error{retryable=!0;constructor($,Z,Q){super(`Session ${$} queue is full (${Z} pending runs, limit ${Q}); retry later.`);this.name="HubRunAdmissionRejectedError"}}function wG($){let Z=$?.replace(/[^a-zA-Z0-9_-]/g,"-");return Co(wo(),Z?`hub-runs-${Z}.db`:"hub-runs.db")}class mZ{db;maxPendingPerSession;closed=!1;constructor($={}){this.db=fo($.dbPath??wG($.ownerId)),this.maxPendingPerSession=$.maxPendingPerSession??So,this.db.exec("PRAGMA journal_mode = WAL;"),this.db.exec("PRAGMA busy_timeout = 5000;"),this.db.exec(`
955
+ `).length:0;y5(Z.telemetry,{event:"ended",ulid:Q,durationMs:j,outputLines:Y,errorMessage:J.error?String(J.error):void 0,agentId:J.subAgentId,parentId:J.parentAgentId,...I$({agentId:J.subAgentId,conversationId:J.conversationId,parentAgentId:J.parentAgentId,teamId:X?.getTeamId(),teamName:X?.getTeamName(),createdByAgentId:J.parentAgentId})}),$.subAgentStarts.delete(J.subAgentId),$.invokeBackendOptional("handleSubAgentEnd",Q,J)}}}function mG($,Z,Q,J){let X=gG($,Z,Q);return T2({configProvider:{getRuntimeConfig:()=>$.getSession(Q)?.runtime.delegatedAgentConfigProvider?.getRuntimeConfig()??{providerId:Z.providerId,modelId:Z.modelId,cwd:Z.cwd,apiKey:Z.apiKey,baseUrl:Z.baseUrl,headers:Z.headers,providerConfig:Z.providerConfig,knownModels:Z.knownModels,thinking:Z.thinking,maxIterations:Z.maxIterations,hooks:Z.hooks,extensions:Z.extensions,logger:Z.logger,telemetry:Z.telemetry},getConnectionConfig:()=>$.getSession(Q)?.runtime.delegatedAgentConfigProvider?.getConnectionConfig()??{providerId:Z.providerId,modelId:Z.modelId,apiKey:Z.apiKey,baseUrl:Z.baseUrl,headers:Z.headers,providerConfig:Z.providerConfig,knownModels:Z.knownModels,thinking:Z.thinking},updateConnectionDefaults:()=>{}},createSubAgentTools:()=>{let j=Z.enableTools?C6({cwd:Z.cwd,telemetry:Z.telemetry,...A1[x$({mode:Z.mode})],executors:J}):[];if(Z.enableSpawnAgent)j.push(mG($,Z,Q,J));return E$(j)},...X})}import{readFile as kn,stat as xn}from"node:fs/promises";var yn=20480000;async function DE($){let Z=await xn($);if(!Z.isFile())throw Error("Path is not a file");if(Z.size>yn)throw Error("File is too large to read into context.");let Q=await kn($,"utf8");if(Q.includes("\x00"))throw Error("Cannot read binary file into context.");return Q}var LE=5000,dG;function dn($,Z){if(dG)return;dG=CL().then(()=>{return}).catch((Q)=>{dG=void 0,$?.error?.("Detached command log recovery failed",{error:Q}),x1(Z,{component:"core",operation:"command.detached_log_recovery",error:Q,severity:"warn",handled:!0})})}function iZ($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function ln($){if(!$||typeof $!=="object"||Array.isArray($))return;let Z=$,Q=iZ(Z.inputTokens),J=iZ(Z.outputTokens),X=iZ(Z.cacheReadTokens),W=iZ(Z.cacheWriteTokens),j=iZ(Z.totalCost);if(Q===void 0||J===void 0||X===void 0||W===void 0||j===void 0)return;return{inputTokens:Q,outputTokens:J,cacheReadTokens:X,cacheWriteTokens:W,totalCost:j}}function pn($,Z){return{inputTokens:Math.max($.inputTokens,Z.inputTokens),outputTokens:Math.max($.outputTokens,Z.outputTokens),cacheReadTokens:Math.max($.cacheReadTokens,Z.cacheReadTokens),cacheWriteTokens:Math.max($.cacheWriteTokens,Z.cacheWriteTokens),totalCost:Math.max($.totalCost,Z.totalCost)}}function _E($,Z){if(!Z)return!1;if($.source_message_count!==Z.source_message_count)return $.source_message_count<Z.source_message_count;return Date.parse($.updated_at)<Date.parse(Z.updated_at)}class H${runtimeAddress=void 0;pendingPrompts;sessionService;runtimeBuilder;createAgentInstance;toolExecutors;defaultCapabilities;defaultToolPolicies;providerSettingsManager;oauthTokenManager;defaultTelemetry;distinctId;defaultLogger;defaultFetch;events=new m7;sessions=new Map;manifestMutationQueues=new Map;usageBySession=new Map;aggregateUsageBySession=new Map;subAgentStarts=new Map;pendingPromptsController;eventBridge;sessionVersioning=new u2;runCommandExecutionController=new J4;constructor($){let Z=hn();if(Z)un(Z);let Q=W1($.distinctId);this.distinctId=Q,this.sessionService=$.sessionService,this.runtimeBuilder=$.runtimeBuilder??new K5,this.createAgentInstance=$.createAgent??((J)=>new N2(J)),this.defaultCapabilities=i0($.capabilities),this.toolExecutors=this.defaultCapabilities?.toolExecutors,this.defaultToolPolicies=$.toolPolicies,this.providerSettingsManager=$.providerSettingsManager??new U$,this.oauthTokenManager=$.oauthTokenManager??new B5({providerSettingsManager:this.providerSettingsManager,telemetry:$.telemetry}),this.defaultTelemetry=$.telemetry,this.defaultLogger=$.logger,this.defaultTelemetry?.setDistinctId(Q),this.defaultFetch=$.fetch,dn(this.defaultLogger,this.defaultTelemetry),this.pendingPromptsController=new yG({getSession:(J)=>this.sessions.get(J),emit:(J)=>this.emit(J),send:(J)=>this.runTurn(J)}),this.pendingPrompts={list:async(J)=>this.pendingPromptsController.list(J.sessionId),update:async(J)=>this.pendingPromptsController.update(J),delete:async(J)=>this.pendingPromptsController.delete(J)},this.eventBridge=new AW({getSession:(J)=>this.sessions.get(J),usageBySession:this.usageBySession,aggregateUsageBySession:this.aggregateUsageBySession,emit:(J)=>this.emit(J),persistMessages:(J,X,W)=>{this.invoke("persistSessionMessages",J,X,W).catch((j)=>{let Y=this.sessions.get(J);(Y?.config.logger??this.defaultLogger)?.error?.("Failed to persist session messages from agent event",{sessionId:J,error:j}),x1(Y?.config.telemetry??this.defaultTelemetry,{component:"core",operation:"session.persist_messages_on_agent_event",error:j,severity:"warn",handled:!0,context:{sessionId:J,providerId:Y?.config.providerId,modelId:Y?.config.modelId}})})},enqueuePendingPrompt:(J,X)=>this.pendingPromptsController.enqueue(J,X),invokeBackendOptional:(J,...X)=>this.invokeOptional(J,...X)})}async applyInitialOAuthCredentials($){if($.config.apiKey?.trim())return $;let Z=await this.oauthTokenManager.resolveProviderApiKey({providerId:$.config.providerId});if(!Z?.apiKey)return $;return{...$,config:{...$.config,apiKey:Z.apiKey}}}async startSession($){let Z=$.config.sessionId?.trim()??"",Q=Z||gn(),J=Z.length>0&&($.initialMessages?.length??0)>0&&!$.prompt?.trim(),X=Boolean($.config.cwd?.trim()||$.config.workspaceRoot?.trim()),W=J&&!X?await this.invokeOptionalValue("readSessionManifest",Q):void 0,j=W?{...$.config,cwd:W.cwd,workspaceRoot:W.workspace_root}:await gL($.config);return await this.startResolvedSession({...$,config:j},Q,Z.length>0,W)}async startResolvedSession($,Z,Q,J){let X=$.source??J0.CLI,W=L0(),j=await this.applyInitialOAuthCredentials($),Y=j.initialMessages??[],V=Y.length>0?_4(Y):g0(),K=await this.invokeOptionalValue("ensureSessionsDir")??"";if(!K)throw Error("session service method not available: ensureSessionsDir");let B=cG(K,Z),G=cG(B,`${Z}.messages.json`),H=cG(B,`${Z}.json`),U=h$($.config),F=$.interactive===!0&&!j.prompt?.trim(),D=V1.parse({version:1,session_id:Z,source:X,pid:process.pid,started_at:W,status:F?"idle":"running",interactive:$.interactive===!0,provider:j.config.providerId,model:j.config.modelId,cwd:j.config.cwd,workspace_root:U,team_name:j.config.teamName,enable_tools:j.config.enableTools,enable_spawn:j.config.enableSpawnAgent,enable_teams:j.config.enableAgentTeams,prompt:j.prompt?.trim()||void 0,messages_path:G}),L,z;if(Q&&Y.length>0&&!j.prompt?.trim()){let u=J??await this.invokeOptionalValue("readSessionManifest",Z);if(u)D=u,L={manifestPath:H,messagesPath:u.messages_path||G,compactionPath:u.compaction_path,manifest:u},z=await this.invokeOptionalValue("readSessionCompactionState",Z)}let O=await this.seedAggregateUsageFromArtifacts({initialUsage:V,sessionDir:B,rootMessagesPath:L?.messagesPath??G,manifest:D});this.usageBySession.set(Z,V),this.aggregateUsageBySession.set(Z,O);let A=i0(this.defaultCapabilities,$.capabilities),q=A?.toolExecutors??this.toolExecutors,N=$.localRuntime,T=N?.extensionContext?.logger??N?.logger,C=N?.extensionContext?.automation,r=N?.extensionContext?.telemetry??N?.telemetry??this.defaultTelemetry,y,x={getSession:(u)=>this.sessions.get(u),subAgentStarts:this.subAgentStarts,onAgentEvent:(u,F0,k0)=>this.eventBridge.dispatchAgentEvent(u,F0,k0),invokeBackendOptional:(u,...F0)=>this.invokeOptional(u,...F0)};y=await BO({input:j,localRuntime:$.localRuntime,sessionId:Z,providerSettingsManager:this.providerSettingsManager,defaultTelemetry:this.defaultTelemetry,defaultLogger:this.defaultLogger,defaultCapabilities:A,defaultToolPolicies:this.defaultToolPolicies,defaultFetch:this.defaultFetch,onPluginEvent:(u)=>{if(u.name==="plugin_log"){this.eventBridge.handlePluginLog(Z,u.payload,T);return}this.eventBridge.handlePluginEvent(Z,u,C,r)},onTeamEvent:(u)=>{this.eventBridge.handleTeamEvent(Z,u),y.config.onTeamEvent?.(u)},createSpawnTool:()=>mG(x,y.config,Z,q),createSubAgentLifecycleCallbacks:(u)=>gG(x,u,Z),readSessionMetadata:async()=>(await this.getSession(Z))?.metadata,writeSessionMetadata:async(u)=>{await this.persistSessionMetadata(Z,()=>u)}});let E=v0(WQ({...L?.manifest.metadata??{},...j.sessionMetadata??{}},y.gitState),{mode:j.mode,version:y.config.extensionContext?.client?.version});if(!L)D.metadata=E;let g=await this.runtimeBuilder.build({...y.runtimeBuilderInput,distinctId:this.distinctId,runCommandExecutionController:this.runCommandExecutionController}),S=y.config,n=y.providerConfig;if(g.teamRuntime&&!S.teamName?.trim())S.teamName=g.teamRuntime.getTeamName();let k=async()=>{let u=this.sessions.get(Z);if(!u||!K2(u.config.providerId))return!1;try{return await this.syncOAuthCredentials(u,{forceRefresh:!0}),!0}catch{return!1}};g.delegatedAgentConfigProvider?.updateConnectionDefaults({onAuthError:k});let I=[...g.tools,...S.extraTools??[]],d=g.extensions??y.extensions,Z0=j.initialCompactionState,m0,G0=_9(S),G1=Z0??z,r0=G1?{...G1,conversation_id:G1.conversation_id?.trim()||Z}:void 0,z$=z9({compact:G0,getState:()=>m0?.compactionState,saveState:async(u,F0)=>{let k0=m0;if(!k0)return;let a0={...u,conversation_id:k0.sessionId};try{if(!(await this.persistActiveSessionCompactionState(k0,a0,F0)).updated)S.logger?.debug?.("Skipped stale session compaction state",{sessionId:k0.sessionId,sourceMessageCount:a0.source_message_count})}catch(r2){S.logger?.error?.("Failed to persist session compaction state",{sessionId:k0.sessionId,error:r2}),x1(S.telemetry,{component:"core",operation:"session.persist_compaction_state",severity:"warn",handled:!0,error:r2,context:{sessionId:k0.sessionId,providerId:S.providerId,modelId:S.modelId}})}}}),H1={distinctId:this.distinctId,sessionId:Z,providerId:n.providerId,modelId:n.modelId,apiKey:n.apiKey,baseUrl:n.baseUrl,headers:n.headers,onAuthError:k,knownModels:n.knownModels,providerConfig:n,thinking:S.thinking,reasoningEffort:S.reasoningEffort??n.reasoningEffort,thinkingBudgetTokens:S.thinkingBudgetTokens,maxTokensPerTurn:S.maxTokensPerTurn,temperature:S.temperature,systemPrompt:S.systemPrompt,maxIterations:S.maxIterations,execution:S.execution,prepareTurn:z$,tools:I,modelTools:g.modelTools,hooks:y.hooks,extensions:d,hookErrorMode:S.hookErrorMode,initialMessages:y.effectiveInput.initialMessages,userFileContentLoader:DE,toolPolicies:y.toolPolicies,requestToolApproval:y.requestToolApproval?async(u)=>{let F0=y.requestToolApproval,k0=this.sessions.get(Z);if(k0)await this.markTurnPending(k0);try{if(!F0)return{approved:!1,reason:"Tool approval callback is not configured."};return await F0(u)}finally{let a0=this.sessions.get(Z);if(a0?.status==="pending")await this.markTurnRunning(a0)}}:void 0,telemetry:S.telemetry,onConsecutiveMistakeLimitReached:S.onConsecutiveMistakeLimitReached,completionPolicy:g.completionPolicy,consumePendingUserMessage:()=>{let u=this.pendingPromptsController.consumeSteer(Z);return u?n7(u.prompt,u.mode??S.mode):void 0},logger:g.logger??S.logger,extensionContext:S.extensionContext,onEvent:(u)=>this.eventBridge.dispatchAgentEvent(Z,S,u)};H1.hooks={...H1.hooks,onEvent:async(u)=>{if(await y.hooks?.onEvent?.(u),u.type!=="assistant-message")return;let F0=this.sessions.get(Z);if(!F0)return;let k0=F0.agent.getMessages();try{await this.invoke("persistSessionMessages",Z,k0,S.systemPrompt)}catch(a0){S.logger?.error?.("Failed to persist session messages after assistant response",{sessionId:Z,error:a0}),x1(S.telemetry,{component:"core",operation:"session.persist_messages_after_assistant_response",error:a0,severity:"warn",handled:!0,context:{sessionId:Z,providerId:S.providerId,modelId:S.modelId}})}}};let c0=this.createAgentInstance(H1);if(H1.onEvent)c0.subscribeEvents(H1.onEvent);g.registerLeadAgent?.(c0);let t0=I$({agentId:c0.getAgentId(),conversationId:c0.getConversationId(),teamId:g.teamRuntime?.getTeamId(),teamName:g.teamRuntime?.getTeamName(),teamRole:g.teamRuntime?"lead":void 0});if(HO(S,Z,Q,U,t0),t0)Z2(S.telemetry,{ulid:Z,modelId:S.modelId,provider:S.providerId,...t0});if(g.teamRuntime)EQ(S.telemetry,{ulid:Z,teamId:g.teamRuntime.getTeamId(),teamName:g.teamRuntime.getTeamName(),leadAgentId:c0.getAgentId(),restoredFromPersistence:g.teamRestoredFromPersistence===!0});let o={sessionId:Z,config:S,sessionMetadata:E,...L?{artifacts:L}:{},source:X,startedAt:L?.manifest.started_at??W,updatedAt:L?.manifest.ended_at??L?.manifest.started_at??W,pendingPrompt:D.prompt,runtime:g,agent:c0,started:!1,status:L?.manifest.status??(F?"idle":"running"),aborting:!1,interactive:$.interactive===!0,persistedMessages:Y,compactionState:r0,activeTeamRunIds:new Set,pendingTeamRunUpdates:[],teamRunWaiters:[],pendingPrompts:[],drainingPendingPrompts:!1,pluginSandboxShutdown:y.pluginSandboxShutdown,submitAndExitObserved:!1,taskCompletedEmitted:!1,lastInteractiveTurnFinishReason:void 0};if(m0=o,o.compactionState&&!this.isCompactionStateForSession(o.sessionId,o.compactionState,o))o.config.logger?.log?.("Ignoring session compaction state for a different conversation",{severity:"warn",sessionId:o.sessionId,conversationId:o.compactionState.conversation_id}),o.compactionState=void 0;if(this.sessions.set(Z,o),L)await this.refreshActiveSessionGitMetadata(o,y.gitState);if(Y.length>0&&!L)try{await this.ensureSessionPersisted(o),await this.invoke("persistSessionMessages",Z,Y,o.config.systemPrompt)}catch(u){o.config.logger?.error?.("Failed to persist seeded session messages at start",{sessionId:Z,error:u}),x1(o.config.telemetry,{component:"core",operation:"session.persist_seeded_messages",error:u,severity:"warn",handled:!0,context:{sessionId:Z,providerId:o.config.providerId,modelId:o.config.modelId}})}this.emitStatus(Z,o.status);let U1;try{if(j.prompt?.trim())if(U1=await this.executeTurn(o,{prompt:j.prompt,userImages:j.userImages,userFiles:j.userFiles}),!o.interactive)await this.finalizeSingleRun(o,U1.finishReason);else await this.completeInteractiveTurn(o,U1.finishReason)}catch(u){if(o.interactive&&o.aborting)U1=await this.completeAbortedInteractiveTurn(o);else{x1(o.config.telemetry,{component:"core",operation:"session.start",error:u,severity:"error",handled:!1,context:{sessionId:o.sessionId,providerId:o.config.providerId,modelId:o.config.modelId}});try{await this.failSession(o)}catch(F0){o.config.logger?.error?.("Session failure cleanup threw",{sessionId:o.sessionId,error:F0})}throw u}}return{sessionId:Z,manifest:D,manifestPath:H,messagesPath:G,result:U1}}async restoreSession($){return this.sessionVersioning.restoreCheckpoint({...$,getSession:(Z)=>this.getSession(Z),readMessages:(Z)=>this.readSessionMessages(Z),buildStartInput:(Z,Q)=>{let J=Z.restoredCheckpointMetadata?{...Q.sessionMetadata??{},checkpoint:Z.restoredCheckpointMetadata}:Q.sessionMetadata;return{...Q,...J?{sessionMetadata:J}:{},initialMessages:Z.initialMessages}},startSession:(Z)=>this.startSession(Z),getStartedSessionId:(Z)=>Z.sessionId,cleanupStartedSession:async(Z)=>{if(!await this.deleteSession(Z.sessionId))throw Error(`Failed to clean up restored session ${Z.sessionId}`)},readRestoredSession:(Z)=>this.getSession(Z)})}async runTurn($){let Z=this.getSessionOrThrow($.sessionId),Q=Z.agent.canStartRun(),J=$.delivery??(Z.interactive&&!Q?"queue":void 0);if(Z.config.telemetry?.capture({event:"session.input_sent",properties:{sessionId:$.sessionId,promptLength:$.prompt.length,userImageCount:$.userImages?.length??0,userFileCount:$.userFiles?.length??0,delivery:J??"immediate"}}),J==="queue"||J==="steer"){this.pendingPromptsController.enqueue($.sessionId,{prompt:$.prompt,mode:$.mode,delivery:J,userImages:$.userImages,userFiles:$.userFiles});return}try{let X=await this.executeTurn(Z,{prompt:$.prompt,mode:$.mode,userImages:$.userImages,userFiles:$.userFiles});if(!Z.interactive)await this.finalizeSingleRun(Z,X.finishReason);else await this.completeInteractiveTurn(Z,X.finishReason);if(X.finishReason!=="error")queueMicrotask(()=>{this.pendingPromptsController.drain($.sessionId)});return X}catch(X){if(Z.interactive&&Z.aborting)return await this.completeAbortedInteractiveTurn(Z);throw x1(Z.config.telemetry,{component:"core",operation:"session.submit",error:X,severity:"error",handled:!1,context:{sessionId:Z.sessionId,providerId:Z.config.providerId,modelId:Z.config.modelId}}),await this.failSession(Z),X}}async getAccumulatedUsage($){let Z=AK(this.usageBySession.get($)),Q=AK(this.aggregateUsageBySession.get($));return Z||Q?{usage:Z,aggregateUsage:Q}:void 0}async abort($,Z){let Q=this.sessions.get($);if(!Q)return;if(Q.config.telemetry?.capture({event:"session.aborted",properties:{sessionId:$}}),Q.aborting=!0,Q.drainingPendingPrompts)this.pendingPromptsController.discardQueue(Q);Q.agent.abort(Z)}async proceedWhileRunning($,Z){return this.runCommandExecutionController.proceedWhileRunning($,Z)}async stopSession($){let Z=this.sessions.get($);if(!Z)return;if(Z.config.telemetry?.capture({event:"session.stopped",properties:{sessionId:$}}),Z.interactive&&!f0(Z.status)){await this.releaseSessionRuntime(Z,"session_stop");return}if(Z.interactive&&Z.agent.canStartRun()){await this.shutdownSession(Z,{status:this.resolveInteractiveStopStatus(Z),exitCode:this.resolveInteractiveStopExitCode(Z),shutdownReason:"session_stop",endReason:"stopped"});return}Z.aborting=!0,Z.agent.abort(Error("session_stop")),await this.shutdownSession(Z,{status:"cancelled",exitCode:0,shutdownReason:"session_stop",endReason:"stopped"})}async dispose($="session_manager_dispose"){let Z=[...this.sessions.values()];if(Z.length===0)return;await Promise.allSettled(Z.map((Q)=>Q.interactive&&!f0(Q.status)?this.releaseSessionRuntime(Q,$):Q.interactive&&Q.agent.canStartRun()?this.shutdownSession(Q,{status:this.resolveInteractiveStopStatus(Q),exitCode:this.resolveInteractiveStopExitCode(Q),shutdownReason:$,endReason:"disposed"}):this.shutdownSession(Q,{status:"cancelled",exitCode:0,shutdownReason:$,endReason:"disposed"}))),this.usageBySession.clear(),this.aggregateUsageBySession.clear()}async getSession($){let Z=this.sessions.get($);if(Z)return hG(Z);let Q=$.trim();if(!Q)return;let J=await this.getRow(Q);if(J)return p9(J);let X=await this.readManifest(Q);return X?ZX(X):void 0}async listSessions($=200){let Q=(await this.listRows($)).map(p9),J=new Set(Q.map((X)=>X.sessionId));for(let X of this.sessions.values()){if(J.has(X.sessionId))continue;Q.unshift(hG(X))}return Q.slice(0,$)}async deleteSession($){if(this.sessions.has($))await this.stopSession($);let Z=await this.invoke("deleteSession",$);if(Z.deleted)this.usageBySession.delete($),this.aggregateUsageBySession.delete($);return Z.deleted}async updateSession($,Z){return{updated:(await this.invokeOptionalValue("updateSession",{sessionId:$,prompt:Z.prompt,metadata:Z.metadata,title:Z.title}))?.updated===!0}}async updateSessionCompactionState($,Z){let Q=$.trim();if(!Q)return{updated:!1};let J=this.sessions.get(Q),X=J?void 0:await this.getSession(Q);if(!(J??X))return{updated:!1};if(J){let Y=await this.readSessionMessages(Q),V=Z.source_message_count>0&&Y.length>=Z.source_message_count,K=V?Y:void 0;if(V){if(!await this.canPersistCompactionState(Q,Z,J,void 0,Y))return{updated:!1};J.agent.restore(Y)}return await this.persistActiveSessionCompactionState(J,Z,K)}if(!await this.canPersistCompactionState(Q,Z,void 0,X))return{updated:!1};let j=await this.invokeOptionalValue("readSessionCompactionState",Q);if(_E(Z,j))return{updated:!1};return await this.invoke("persistSessionCompactionState",Q,Z),{updated:!0}}async readSessionCompactionState($){let Z=$.trim();if(!Z)return;let Q=this.sessions.get(Z);if(Q)for(;;){let J=Q.compactionStateWriteQueue;if(!J)return Q.compactionState;await J.catch(()=>{return})}return await this.invokeOptionalValue("readSessionCompactionState",Z)}isCompactionStateForSession($,Z,Q,J){let X=Z.conversation_id?.trim();if(!X)return!0;if(X===$)return!0;let W=Q?.agent.getConversationId()?.trim()||J?.conversationId?.trim();return W?X===W:!1}async canPersistCompactionState($,Z,Q,J,X){if(!Z.conversation_id?.trim())return!1;if(!this.isCompactionStateForSession($,Z,Q,J))return!1;let W=X??Q?.agent.getMessages()??await this.readSessionMessages($);return B2(Z,W)!==void 0}async persistActiveSessionCompactionState($,Z,Q){if(!await this.canPersistCompactionState($.sessionId,Z,$,void 0,Q))return{updated:!1};return await this.enqueueCompactionStateWrite($,async()=>{let J=$.compactionState,X=J!==void 0&&B2(J,Q??$.agent.getMessages())!==void 0;if(J&&(X?_E(Z,J):Date.parse(Z.updated_at)<Date.parse(J.updated_at)))return{updated:!1};return await this.invoke("persistSessionCompactionState",$.sessionId,Z),$.compactionState=Z,{updated:!0}})}async enqueueCompactionStateWrite($,Z){let J=($.compactionStateWriteQueue??Promise.resolve()).catch(()=>{return}).then(Z),X=J.then(()=>{return},()=>{return});$.compactionStateWriteQueue=X;try{return await J}finally{if($.compactionStateWriteQueue===X)$.compactionStateWriteQueue=void 0}}async readLiveSessionMessages($){let Z=$.trim();if(!Z)return[];let Q=this.sessions.get(Z);if(Q){let J=Q.agent.getMessages();if(J.length>0)return J}return this.readSessionMessages(Z)}async readSessionMessages($){let Z=$.trim();if(!Z)return[];let Q=await this.getRow(Z);if(Q?.messagesPath)return I2(Q.messagesPath);let J=await this.readManifest(Z);return I2(J?.messages_path)}async dispatchHookEvent($){await gN($,{queueSpawnRequest:(Z)=>this.invokeOptional("queueSpawnRequest",Z),upsertSubagentSessionFromHook:(Z)=>this.invokeOptionalValue("upsertSubagentSessionFromHook",Z),appendSubagentHookAudit:(Z,Q)=>this.invokeOptional("appendSubagentHookAudit",Z,Q),applySubagentStatus:(Z,Q)=>this.invokeOptional("applySubagentStatus",Z,Q)})}subscribe($,Z){return this.events.subscribe($,Z)}async updateSessionModel($,Z){await this.updateSessionConnection($,{modelId:Z})}async updateSessionConnection($,Z){let Q=A6(Z),J=this.getSessionOrThrow($);if(Q.providerId!==void 0)J.config.providerId=Q.providerId;if(Q.modelId!==void 0)J.config.modelId=Q.modelId;if(Q.apiKey!==void 0)J.config.apiKey=Q.apiKey;if(Q.baseUrl!==void 0)J.config.baseUrl=Q.baseUrl;if(Q.headers!==void 0)J.config.headers=Q.headers;if(Q.providerConfig!==void 0)J.config.providerConfig=Q.providerConfig;if(Object.hasOwn(Q,"reasoningEffort"))J.config.reasoningEffort=Q.reasoningEffort??void 0;if(Object.hasOwn(Q,"thinkingBudgetTokens"))J.config.thinkingBudgetTokens=Q.thinkingBudgetTokens??void 0;if(Object.hasOwn(Q,"thinking")){if(J.config.thinking=Q.thinking??void 0,Q.thinking===!1||Q.thinking===null)J.config.reasoningEffort=void 0,J.config.thinkingBudgetTokens=void 0}let X={...Q.providerId!==void 0?{providerId:Q.providerId}:{},...Q.modelId!==void 0?{modelId:Q.modelId}:{},...Q.apiKey!==void 0?{apiKey:Q.apiKey}:{},...Q.baseUrl!==void 0?{baseUrl:Q.baseUrl}:{},...Q.headers!==void 0?{headers:Q.headers}:{},...Q.providerConfig!==void 0?{providerConfig:Q.providerConfig}:{},...Object.hasOwn(Q,"reasoningEffort")?{reasoningEffort:Q.reasoningEffort??void 0}:{},...Object.hasOwn(Q,"thinking")?{thinking:Q.thinking??void 0}:{},...Object.hasOwn(Q,"thinkingBudgetTokens")?{thinkingBudgetTokens:Q.thinkingBudgetTokens??void 0}:{}};if(Q.thinking===!1||Q.thinking===null)X.reasoningEffort=void 0,X.thinkingBudgetTokens=void 0;let W={...Q.apiKey!==void 0?{apiKey:Q.apiKey}:{},...Q.baseUrl!==void 0?{baseUrl:Q.baseUrl}:{},...Q.headers!==void 0?{headers:Q.headers}:{}};if(J.runtime.delegatedAgentConfigProvider?.updateConnectionDefaults(X),J.agent.updateConnection(Q),J.runtime.teamRuntime?.updateTeammateConnections(W),Q.providerId||Q.modelId)await this.mutateSessionManifest(J,(j)=>{if(Q.providerId)j.provider=Q.providerId;if(Q.modelId)j.model=Q.modelId})}async mutateSessionManifest($,Z){let Q=$.artifacts;if(!Q)return;let J=$.sessionId,W=(this.manifestMutationQueues.get(J)??Promise.resolve()).then(async()=>{let Y=await this.invokeOptionalValue("readSessionManifest",J)??Q.manifest;return Z(Y),Q.manifest=Y,await this.invoke("writeSessionManifest",Q.manifestPath,Y),Y}),j=W.then(()=>{return},()=>{return});this.manifestMutationQueues.set(J,j);try{return await W}finally{if(this.manifestMutationQueues.get(J)===j)this.manifestMutationQueues.delete(J)}}handlePluginEvent($,Z,Q){return this.eventBridge.handlePluginEvent($,Z,Q)}async executeTurn($,Z){let Q=await this.prepareTurnInput($,Z),J=Q.prompt.trim(),X=Q?.userImages?.length,W=Q?.userFiles?.length;if(!J&&!X&&!W)throw Error("prompt cannot be empty");if(!$.artifacts&&!$.pendingPrompt)$.pendingPrompt=J;if(await this.ensureSessionPersisted($),!$.pendingPrompt){$.pendingPrompt=J;try{await this.invokeOptionalValue("updateSession",{sessionId:$.sessionId,prompt:J})}catch(j){$.config.logger?.log?.("Failed to backfill seeded session prompt",{severity:"warn",sessionId:$.sessionId,error:j})}}await this.refreshActiveSessionGitMetadata($),await this.syncOAuthCredentials($),await this.markTurnRunning($);try{let j=await this.executeAgentTurn($,J,Q.userImages,Q.userFiles);while(IK($,j.finishReason)){let Y=await hK($);if(Y.length===0)break;let V=vK($,Y);j=await this.executeAgentTurn($,V)}return j}finally{await this.refreshActiveSessionGitMetadata($)}}async completeInteractiveTurn($,Z){if(a7($))return;$.lastInteractiveTurnFinishReason=Z,await this.markTurnIdle($),$.aborting=!1}resolveInteractiveStopStatus($){let Z=$.lastInteractiveTurnFinishReason;if(!Z)return"cancelled";switch(Z){case"completed":return"completed";case"error":return"failed";case"aborted":case"max_iterations":case"mistake_limit":return"cancelled"}return Z}resolveInteractiveStopExitCode($){return $.lastInteractiveTurnFinishReason==="error"?1:0}async completeAbortedInteractiveTurn($){let Z=new Date,Q=$.agent.getMessages(),J=g0();if($.persistedMessages=Q,$.started=$.started||Q.length>0,Q.length>0)try{await this.ensureSessionPersisted($),await this.invoke("persistSessionMessages",$.sessionId,Q,$.config.systemPrompt)}catch(X){$.config.logger?.error?.("Failed to persist session messages after abort",{sessionId:$.sessionId,error:X}),x1($.config.telemetry,{component:"core",operation:"session.persist_messages_after_abort",error:X,severity:"warn",handled:!0,context:{sessionId:$.sessionId,providerId:$.config.providerId,modelId:$.config.modelId}})}return this.eventBridge.dispatchAgentEvent($.sessionId,$.config,{type:"done",reason:"aborted",text:"",iterations:0,usage:J}),await this.completeInteractiveTurn($,"aborted"),queueMicrotask(()=>{this.pendingPromptsController.drain($.sessionId)}),{text:"",usage:J,messages:Q,toolCalls:[],iterations:0,finishReason:"aborted",model:{id:$.config.modelId,provider:$.config.providerId},startedAt:Z,endedAt:Z,durationMs:0}}async executeAgentTurn($,Z,Q,J){let X=$.started||$.agent.getMessages().length>0,W=$.persistedMessages??$.agent.getMessages(),j=this.usageBySession.get($.sessionId)??g0(),Y=this.aggregateUsageBySession.get($.sessionId)??j;$.turnUsageBaseline=j,$.turnAggregateUsageBaseline=Y,$.turnPrimaryUsage=g0(),$.turnUsageByAgent=new Map,_Q($.config.telemetry,$.sessionId,$.config.mode),T8($.config.telemetry,{ulid:$.sessionId,provider:$.config.providerId,model:$.config.modelId,source:"user",mode:$.config.mode,...this.getSessionAgentTelemetryIdentity($)});try{let V=X?()=>$.agent.continue(Z,Q,J):()=>$.agent.run(Z,Q,J),K=await this.runWithAuthRetry($,V,W);$.started=!0;let B=c3(K.messages,K,W);$.persistedMessages=B;let G=r9($.turnUsageByAgent?.values()??[]),H=h0(j,K.usage),U=h0(h0(g0(),K.usage),G),F=h0(Y,U);return this.usageBySession.set($.sessionId,H),this.aggregateUsageBySession.set($.sessionId,F),await this.persistSessionMetadata($.sessionId,(D)=>({...D??{},totalCost:H.totalCost,aggregatedAgentsCost:F.totalCost,usage:H,aggregateUsage:F})),await this.invoke("persistSessionMessages",$.sessionId,B,$.config.systemPrompt),this.observeTaskCompletionTool($,K),K}catch(V){x1($.config.telemetry,{component:"core",operation:"session.turn",error:V,severity:"error",handled:!1,context:{sessionId:$.sessionId,providerId:$.config.providerId,modelId:$.config.modelId}});try{await this.invoke("persistSessionMessages",$.sessionId,$.agent.getMessages(),$.config.systemPrompt)}catch(K){$.config.logger?.error?.("Failed to persist session messages after turn error",{sessionId:$.sessionId,error:K})}throw V}finally{$.turnUsageBaseline=void 0,$.turnAggregateUsageBaseline=void 0,$.turnPrimaryUsage=void 0,$.turnUsageByAgent=void 0}}observeTaskCompletionTool($,Z){if($.submitAndExitObserved)return;if(!Z.toolCalls.some((J)=>J.name===O0.SUBMIT_AND_EXIT&&J.error===void 0))return;$.submitAndExitObserved=!0,$.taskCompletedEmitted=!0,x5($.config.telemetry,{ulid:$.sessionId,provider:$.config.providerId,modelId:$.config.modelId,mode:$.config.mode,durationMs:Date.now()-Date.parse($.startedAt),source:"submit_and_exit",...this.getSessionAgentTelemetryIdentity($)})}emitTaskCompletedOnTeardown($,Z){if($.taskCompletedEmitted||$.submitAndExitObserved)return;if(!($.interactive?$.lastInteractiveTurnFinishReason==="completed"&&!$.aborting&&$.agent.canStartRun():Z==="completed"))return;$.taskCompletedEmitted=!0,x5($.config.telemetry,{ulid:$.sessionId,provider:$.config.providerId,modelId:$.config.modelId,mode:$.config.mode,durationMs:Date.now()-Date.parse($.startedAt),source:"shutdown",...this.getSessionAgentTelemetryIdentity($)})}async prepareTurnInput($,Z){let Q=h$($.config),J=cn(Z.prompt).trim();if(!J)return{prompt:"",userImages:Z.userImages,userFiles:this.resolveAbsoluteFilePaths($.config.cwd,Z.userFiles)};let X=await Q4(J,Q);UO($.config.telemetry,X);let W=n7(X.prompt,Z.mode??$.config.mode),j=this.resolveAbsoluteFilePaths($.config.cwd,Z.userFiles),Y=this.resolveAbsoluteFilePaths(Q,X.matchedFiles),V=Array.from(new Set([...j,...Y]));return{prompt:W,userImages:Z.userImages,userFiles:V.length>0?V:void 0}}async ensureSessionPersisted($){if($.artifacts)return;let Z=h$($.config);if($.artifacts=await this.invoke("createRootSessionWithArtifacts",{sessionId:$.sessionId,source:$.source,pid:process.pid,interactive:$.interactive,provider:$.config.providerId,model:$.config.modelId,cwd:$.config.cwd,workspaceRoot:Z,teamName:$.config.teamName,enableTools:$.config.enableTools,enableSpawn:$.config.enableSpawnAgent,enableTeams:$.config.enableAgentTeams,prompt:$.pendingPrompt,metadata:$.sessionMetadata,startedAt:$.startedAt}),$.compactionState){if(!(await this.persistActiveSessionCompactionState($,$.compactionState)).updated)$.compactionState=void 0}}async markTurnRunning($){if($.status==="running")return;await this.updateStatus($,"running",null)}async refreshActiveSessionGitMetadata($,Z){try{let Q=Z??await xW(h$($.config));if(!Q||!$.artifacts)return;if(kW($.artifacts.manifest.metadata,Q))return;await this.persistSessionMetadata($.sessionId,(J)=>WQ({...J??{},...$.sessionMetadata??{}},Q))}catch(Q){$.config.logger?.debug?.("Failed to refresh session git metadata",{sessionId:$.sessionId,error:Q})}}async markTurnPending($){if($.status==="pending")return;await this.updateStatus($,"pending",null)}async markTurnIdle($){if($.status==="idle")return;await this.updateStatus($,"idle",null)}async persistSessionMetadata($,Z){let Q=this.sessions.get($),J=await this.invokeOptionalValue("readSessionManifest",$)??Q?.artifacts?.manifest,X=Z(J?.metadata);if(!Q?.artifacts)return;if((await this.invokeOptionalValue("updateSession",{sessionId:$,metadata:X}))?.updated===!1)return;Q.sessionMetadata=X,Q.artifacts.manifest.metadata=X}async finalizeSingleRun($,Z){if(a7($))return;let Q=Z==="aborted"||$.aborting,J=Z==="error";await this.shutdownSession($,{status:Q?"cancelled":J?"failed":"completed",exitCode:J?1:0,shutdownReason:J?"session_error":"session_complete",endReason:Z})}async failSession($){$.lastInteractiveTurnFinishReason="error",await this.shutdownSession($,{status:"failed",exitCode:1,shutdownReason:"session_error",endReason:"error"})}async shutdownSession($,Z){if(this.emitTaskCompletedOnTeardown($,Z.status),YX($),!$.aborting&&!$.agent.canStartRun())$.aborting=!0,$.agent.abort(Error(Z.shutdownReason));let Q=[],J=(X,W)=>{Q.push(W),$.config.logger?.log("Session shutdown cleanup failed",{sessionId:$.sessionId,stage:X,error:W,severity:"warn"}),x1($.config.telemetry,{component:"core",operation:"session.shutdown_cleanup",error:W,severity:"warn",handled:!0,context:{sessionId:$.sessionId,stage:X,status:Z.status,shutdownReason:Z.shutdownReason,providerId:$.config.providerId,modelId:$.config.modelId}})};if($.artifacts){await this.refreshActiveSessionGitMetadata($);try{await this.updateStatus($,Z.status,Z.exitCode)}catch(X){J("update_status",X)}}try{await $.agent.shutdown(Z.shutdownReason)}catch(X){J("agent_shutdown",X)}try{await Promise.resolve($.runtime.shutdown(Z.shutdownReason))}catch(X){J("runtime_shutdown",X)}try{await $.pluginSandboxShutdown?.()}catch(X){J("plugin_sandbox_shutdown",X)}if(this.sessions.delete($.sessionId),this.emit({type:"ended",payload:{sessionId:$.sessionId,reason:Z.endReason,ts:Date.now()}}),Q.length>0&&Z.status==="failed")throw Q[0]}async releaseSessionRuntime($,Z){this.emitTaskCompletedOnTeardown($);let Q=[],J=(X,W)=>{Q.push(W),$.config.logger?.log("Session runtime cleanup failed",{sessionId:$.sessionId,stage:X,error:W,severity:"warn"}),x1($.config.telemetry,{component:"core",operation:"session.runtime_cleanup",error:W,severity:"warn",handled:!0,context:{sessionId:$.sessionId,stage:X,reason:Z,providerId:$.config.providerId,modelId:$.config.modelId}})};if(!$.aborting&&!$.agent.canStartRun())$.aborting=!0,$.agent.abort(Error(Z));try{await $.agent.shutdown(Z)}catch(X){J("agent_shutdown",X)}try{await Promise.resolve($.runtime.shutdown(Z))}catch(X){J("runtime_shutdown",X)}try{await $.pluginSandboxShutdown?.()}catch(X){J("plugin_sandbox_shutdown",X)}if(this.sessions.delete($.sessionId),Q.length>0)throw Q[0]}async updateStatus($,Z,Q){if(!$.artifacts)return;let J=await this.invoke("updateSessionStatus",$.sessionId,Z,Q);if(!J.updated)return;let X=await this.mutateSessionManifest($,(W)=>{if(W.status=Z,f0(Z))delete W.ended_at,W.exit_code=null;else W.ended_at=J.endedAt??L0(),W.exit_code=typeof Q==="number"?Q:null});if(!X)return;$.status=Z,$.updatedAt=J.endedAt??L0(),$.endedAt=f0(Z)?null:X.ended_at,$.exitCode=X.exit_code,this.emitStatus($.sessionId,Z)}async runWithAuthRetry($,Z,Q){try{return await Z()}catch(J){if(!K2($.config.providerId)||!mn(J))throw J;return await this.syncOAuthCredentials($,{forceRefresh:!0}),$.agent.restore(Q),Z()}}async syncOAuthCredentials($,Z){let Q=null;try{Q=await this.oauthTokenManager.resolveProviderApiKey({providerId:$.config.providerId,forceRefresh:Z?.forceRefresh})}catch(J){if(J instanceof J8)throw Error(`${J.providerId} requires re-authentication.`);throw J}if(!Q?.apiKey||$.config.apiKey===Q.apiKey)return;$.config.apiKey=Q.apiKey,$.agent.updateConnection({apiKey:Q.apiKey}),$.runtime.delegatedAgentConfigProvider?.updateConnectionDefaults({apiKey:Q.apiKey}),$.runtime.teamRuntime?.updateTeammateConnections({apiKey:Q.apiKey})}getSessionOrThrow($){let Z=this.sessions.get($);if(!Z){let Q=new R$($);throw x1(this.defaultTelemetry,{component:"core",operation:"session.active_lookup",error:Q,severity:"warn",handled:!0,context:{sessionId:$,activeSessionCount:this.sessions.size}}),Q}return Z}resolveAbsoluteFilePaths($,Z){if(!Z||Z.length===0)return[];let Q=Z.map((J)=>J.trim()).filter((J)=>J.length>0).map((J)=>vn(J)?J:uG($,J));return Array.from(new Set(Q))}getSessionAgentTelemetryIdentity($){return I$({agentId:$.agent.getAgentId(),conversationId:$.agent.getConversationId(),teamId:$.runtime.teamRuntime?.getTeamId(),teamName:$.runtime.teamRuntime?.getTeamName(),teamRole:$.runtime.teamRuntime?"lead":void 0})}async seedAggregateUsageFromArtifacts($){let Z=await this.summarizePersistedTeammateUsage($.sessionDir,$.rootMessagesPath,$.manifest.session_id),Q=h0($.initialUsage,Z);return this.withPersistedAggregateUsageFloor(Q,$.manifest)}async summarizePersistedTeammateUsage($,Z,Q){let J=uG(Z),X=`${Q}.messages.json`,W;try{W=In($)}catch{return g0()}let j=g0();for(let Y of W){if(!Y.endsWith(".messages.json"))continue;if(Y===X)continue;let V=uG($,Y);if(V===J)continue;let K=await I2(V);if(K.length===0)continue;j=h0(j,_4(K))}return j}withPersistedAggregateUsageFloor($,Z){let Q=ln(Z.metadata?.aggregateUsage);if(Q)return pn($,Q);let J=Z.metadata?.aggregatedAgentsCost;if(typeof J!=="number"||!Number.isFinite(J)||J<=$.totalCost)return $;return{...$,totalCost:J}}emitStatus($,Z){this.emitSessionSnapshot($),this.emit({type:"status",payload:{sessionId:$,status:Z}})}async emitSessionSnapshot($){let Z=await this.getSession($);if(!Z)return;this.emit({type:"session_snapshot",payload:{sessionId:$,snapshot:j$({session:Z,usage:this.usageBySession.get($),aggregateUsage:this.aggregateUsageBySession.get($)})}})}emit($){this.events.emit($)}async listRows($){return this.invoke("listSessions",Math.min(Math.max(1,Math.floor($)),LE))}async getRow($){let Z=$.trim();if(!Z)return;return(await this.listRows(LE)).find((J)=>J.sessionId===Z)}async readManifest($){let Z=$.trim();if(!Z)return;return await this.invokeOptionalValue("readSessionManifest",Z)}invoke($,...Z){return HE(this.sessionService,$,...Z)}invokeOptional($,...Z){return UE(this.sessionService,$,...Z)}invokeOptionalValue($,...Z){return FE(this.sessionService,$,...Z)}}function an($){return{text:$.text,usage:$.usage,inputTokens:$.usage.inputTokens,outputTokens:$.usage.outputTokens,iterations:$.iterations,finishReason:$.finishReason,toolCalls:$.toolCalls.map((Z)=>({name:Z.name,input:Z.input,output:Z.output,error:Z.error,durationMs:Z.durationMs}))}}function nn($){return $.mode==="plan"?"plan":$.mode==="yolo"?"yolo":"act"}function XE($={}){let Z=async(J)=>J,Q=new H$({sessionService:new G$(new K$),capabilities:{toolExecutors:{submit:Z}},fetch:$.fetch,telemetry:$.telemetry});return{async startSession(J){let X=(J.cwd?.trim()||J.workspaceRoot).trim(),W=await Q.startSession({source:J0.CORE,mode:"automation",sessionMetadata:v0(void 0,{mode:"automation",trigger:J.source}),interactive:!1,config:{providerId:rn(J.provider),modelId:J.model,apiKey:J.apiKey?.trim()||void 0,cwd:X,workspaceRoot:J.workspaceRoot,systemPrompt:J.systemPrompt??"",mode:nn(J),maxIterations:J.maxIterations,enableTools:J.enableTools!==!1,enableSpawnAgent:J.enableSpawn!==!1,enableAgentTeams:J.enableTeams!==!1,disableMcpSettingsTools:J.disableMcpSettingsTools,missionLogIntervalSteps:J.missionStepInterval,missionLogIntervalMs:J.missionTimeIntervalMs},toolPolicies:J.toolPolicies??{"*":{autoApprove:J.autoApproveTools!==!1}},localRuntime:{configExtensions:J.configExtensions}});return{sessionId:W.sessionId,startResult:{sessionId:W.sessionId,manifestPath:W.manifestPath,messagesPath:W.messagesPath}}},async sendSession(J,X){let W=await Q.runTurn({sessionId:J,prompt:X.prompt,userImages:X.attachments?.userImages,userFiles:X.attachments?.userFiles?.map((j)=>j.content)});if(!W)throw Error("local hub schedule runtime returned no turn result");return{result:an(W)}},async abortSession(J){return await Q.abort(J,Error("hub schedule abort")),{applied:!0}},async stopSession(J){return await Q.stopSession(J),{applied:!0}}}}import{resolveClineBuildEnv as CM}from"@cline/shared";function on($){if(typeof $==="string")return $.trim()||void 0;if(!Array.isArray($))return;return $.map((Q)=>{if(Q&&typeof Q==="object"&&"type"in Q&&Q.type==="text"&&"text"in Q&&typeof Q.text==="string")return Q.text.trim();return""}).filter(Boolean).join(`
956
+ `).trim()||void 0}var zE=120,lG="...";function gZ($){let Z=$.trim();if(!Z)return"";if(Buffer.byteLength(Z,"utf8")<=zE)return Z;let Q=zE-Buffer.byteLength(lG,"utf8");if(Q<=0)return lG;let J="";for(let X of Z){if(Buffer.byteLength(J+X,"utf8")>Q)break;J+=X}return`${J}${lG}`}async function OE($){let Z=$?.sessionId?.trim()||"unknown",Q=typeof $?.metadata?.messagesPath==="string"?$.metadata.messagesPath:void 0,X=[...await I2(Q)].reverse().find((V)=>V.role==="assistant"),W=X?on(X.content):void 0,j=$?.workspaceRoot?.trim()||"workspace",Y=typeof $?.metadata?.prompt==="string"?$.metadata.prompt.trim():j;return{title:`Task completed (${Z})`,body:gZ(W&&W.length>0?W:Y.length>0?Y:j),severity:"info"}}import{resolve as Vs}from"node:path";import{CLINE_DEFAULT_MODEL_ID as Ks,captureSdkError as PW,createSessionId as XH,HUB_CLIENT_TOOL_APPROVAL_CAPABILITY as Bs}from"@cline/shared";import{isChatWorkspacePath as Gs}from"@cline/shared/storage";import{createSessionId as $o}from"@cline/shared";import{createSessionId as en}from"@cline/shared";function sn($){switch($){case"idle":return"idle";case"pending":return"pending";case"completed":return"completed";case"failed":return"failed";case"cancelled":return"aborted";default:return"running"}}function tn($){let Z=$.metadata&&typeof $.metadata==="object"?JSON.parse(JSON.stringify($.metadata)):{};if($.parentSessionId?.trim())Z.parentSessionId=$.parentSessionId;if($.parentAgentId?.trim())Z.parentAgentId=$.parentAgentId;if($.agentId?.trim())Z.agentId=$.agentId;if($.conversationId?.trim())Z.conversationId=$.conversationId;if($.messagesPath?.trim())Z.messagesPath=$.messagesPath;if($.prompt?.trim())Z.prompt=$.prompt;if($.provider?.trim())Z.provider=$.provider;if($.model?.trim())Z.model=$.model;if($.source?.trim())Z.source=$.source;if(typeof $.pid==="number")Z.pid=$.pid;return Object.keys(Z).length>0?Z:void 0}function TW($,Z,Q,J){return{sessionId:$.sessionId,workspaceRoot:$.workspaceRoot,cwd:$.cwd,createdAt:Date.parse($.startedAt),updatedAt:Date.parse($.updatedAt),createdByClientId:Z?.createdByClientId??"hub",status:sn($.status),participants:Z?[...Z.participants.values()]:[],metadata:tn($),runtimeOptions:{enableTools:$.enableTools,enableSpawn:$.enableSpawn,enableTeams:$.enableTeams,mode:typeof $.metadata?.mode==="string"?$.metadata.mode:void 0,systemPrompt:typeof $.metadata?.systemPrompt==="string"?$.metadata.systemPrompt:void 0},runtimeSession:$.agentId?{agentId:$.agentId,team:$.teamName?{teamId:$.teamName}:void 0}:void 0,...Q?{usage:{...Q}}:{},...J?{aggregateUsage:{...J}}:{}}}function h($,Z){return{version:$.version,requestId:$.requestId,ok:!0,...Z!==void 0?{payload:Z}:{}}}function m($,Z,Q){return{version:$.version,requestId:$.requestId,ok:!1,error:{code:Z,message:Q}}}function p2($){return $&&typeof $==="object"&&!Array.isArray($)?$:void 0}function E0($){if(typeof $.payload?.sessionId==="string")return $.payload.sessionId.trim();return $.sessionId?.trim()??""}function a1($,Z,Q){return{version:"v1",event:$,eventId:en("hevt_"),sessionId:Q,timestamp:Date.now(),payload:Z}}async function s0($,Z){let Q=await $.sessionHost.getSession(Z);if(!Q)return;let J=await $.sessionHost.getAccumulatedUsage?.(Z);return TW(Q,$.sessionState.get(Z),J?.usage,J?.aggregateUsage)}async function X1($,Z){let Q=await $.sessionHost.getSession(Z);if(!Q)return;let J=await $.sessionHost.getAccumulatedUsage?.(Z);return j$({session:Q,usage:J?.usage,aggregateUsage:J?.aggregateUsage})}function pG($,Z,Q,J,X={}){let W=$.sessionState.get(Z);if(W){if(X.interactive!==void 0)W.interactive=X.interactive;if(J==="creator"&&!W.createdByClientId)W.createdByClientId=Q;if(!W.participants.has(Q))W.participants.set(Q,{clientId:Q,attachedAt:Date.now(),role:J});return W}let j={createdByClientId:Q,interactive:X.interactive??!0,participants:new Map([[Q,{clientId:Q,attachedAt:Date.now(),role:J}]])};return $.sessionState.set(Z,j),j}function NE($,Z,Q,J,X={}){let W=$.sessionState.get(Z);if(W){if(X.interactive!==void 0)W.interactive=X.interactive;if(!W.participants.has(Q))W.participants.set(Q,{clientId:Q,attachedAt:Date.now(),role:J});return W}let j={interactive:X.interactive??!0,participants:new Map([[Q,{clientId:Q,attachedAt:Date.now(),role:J}]])};return $.sessionState.set(Z,j),j}async function EW($,Z){let Q=$o("approval_"),J=Z.sessionId;if($.sessionState.get(J)?.interactive===!1)return{approved:!1,reason:"Tool approval requires an interactive session, but this session is non-interactive."};let W;try{W=await $.sessionHost.getSession(J)}catch{W=void 0}let j=typeof W?.metadata?.agendaTaskId==="string"?W.metadata.agendaTaskId:void 0;return await new Promise((Y)=>{let V=$.buildEvent("approval.requested",{approvalId:Q,sessionId:Z.sessionId,agentId:Z.agentId,conversationId:Z.conversationId,iteration:Z.iteration,toolCallId:Z.toolCallId,toolName:Z.toolName,inputJson:JSON.stringify(Z.input??null),policy:Z.policy,agendaTaskId:j},J);$.pendingApprovals.set(Q,{sessionId:J,resolve:Y,requestedEvent:V}),$.publish(V)})}function qE($,Z){let Q=[];for(let J of $.pendingApprovals.values()){if(!J.requestedEvent)continue;if(Z&&J.sessionId!==Z)continue;Q.push(J.requestedEvent)}return Q}function iG($,Z,Q){let J=$.pendingApprovals.get(Z);if(!J)return;return $.pendingApprovals.delete(Z),J.resolve(Q),{sessionId:J.sessionId}}function rG($,Z,Q){let J=0;for(let[X,W]of[...$.pendingApprovals.entries()]){if(!Z({approvalId:X,sessionId:W.sessionId}))continue;$.pendingApprovals.delete(X),W.resolve({approved:!1,reason:Q}),$.publish($.buildEvent("approval.resolved",{approvalId:X,approved:!1,cancelled:!0,reason:Q},W.sessionId)),J+=1}return J}async function AE($,Z){let Q=typeof Z.payload?.approvalId==="string"?Z.payload.approvalId.trim():"";if(!$.pendingApprovals.get(Q))return m(Z,"approval_not_found",`Unknown approval: ${Q}`);let X=typeof Z.payload?.reason==="string"?Z.payload.reason:Z.payload?.payload&&typeof Z.payload.payload==="object"&&!Array.isArray(Z.payload.payload)&&typeof Z.payload.payload.reason==="string"?Z.payload.payload.reason:void 0,W=Z.payload?.approved===!0,j=iG($,Q,{approved:W,reason:X});if(!j)return m(Z,"approval_not_found",`Unknown approval: ${Q}`);return $.publish($.buildEvent("approval.resolved",{approvalId:Q,approved:W,reason:X},j.sessionId)),h(Z,{approvalId:Q,approved:W})}import{createSessionId as Jo}from"@cline/shared";function Zo($){if($ instanceof Error)return{name:$.name,message:$.message,stack:$.stack};if($===void 0)return;return $}var TE={debug:10,info:20,warn:30,error:40,silent:50};function Qo(){let $=process.env.CLINE_HUB_LOG_LEVEL?.trim().toLowerCase();if($==="debug"||$==="info"||$==="warn"||$==="error"||$==="silent")return $;return process.env.VITEST?"error":"info"}function a($,Z,Q={}){if(TE[$]<TE[Qo()])return;let J=JSON.stringify({ts:new Date().toISOString(),level:$,component:"hub",message:Z,...Object.fromEntries(Object.entries(Q).map(([X,W])=>[X,Zo(W)]).filter(([,X])=>X!==void 0))});if($==="error"||$==="warn"){console.error(`[hub] ${J}`);return}console.log(`[hub] ${J}`)}function rZ($,Z){let Q=Z instanceof Error?Z.stack||Z.message:String(Z);a("error",$,{error:Q})}async function EE($,Z,Q,J,X,W){let j=Jo("capreq_"),Y=performance.now();return a("info","capability.request.start",{requestId:j,sessionId:Z,capabilityName:Q,targetClientId:X}),await new Promise((V,K)=>{$.pendingCapabilityRequests.set(j,{sessionId:Z,targetClientId:X,capabilityName:Q,onProgress:W,resolve:(B)=>{if(a(B.ok?"info":"warn","capability.request.end",{requestId:j,sessionId:Z,capabilityName:Q,targetClientId:X,ok:B.ok,error:B.error,durationMs:Math.round(performance.now()-Y)}),!B.ok){K(Error(B.error||`Capability ${Q} was rejected by ${X}.`));return}V(B.payload)}}),$.publish($.buildEvent("capability.requested",{requestId:j,targetClientId:X,capabilityName:Q,payload:J},Z)),a("info","capability.request.published",{requestId:j,sessionId:Z,capabilityName:Q,targetClientId:X})})}function ME($,Z){let Q=typeof Z.payload?.requestId==="string"?Z.payload.requestId.trim():"",J=$.pendingCapabilityRequests.get(Q);if(!J)return h(Z,{requestId:Q,ignored:!0});if((Z.clientId?.trim()||"")!==J.targetClientId)return m(Z,"capability_wrong_client",`Capability request ${Q} is owned by ${J.targetClientId}`);if(Z.sessionId?.trim()&&Z.sessionId.trim()!==J.sessionId)return m(Z,"capability_wrong_session",`Capability request ${Q} belongs to session ${J.sessionId}`);let W=Z.payload?.payload&&typeof Z.payload.payload==="object"&&!Array.isArray(Z.payload.payload)?Z.payload.payload:{};return J.onProgress?.(W),h(Z,{requestId:Q})}function i2($,Z,Q){let J=0;for(let[X,W]of[...$.pendingCapabilityRequests.entries()]){if(!Z({requestId:X,...W}))continue;$.pendingCapabilityRequests.delete(X),a("warn","capability.request.cancelled",{requestId:X,sessionId:W.sessionId,capabilityName:W.capabilityName,targetClientId:W.targetClientId,reason:Q}),W.resolve({ok:!1,error:Q}),$.publish($.buildEvent("capability.resolved",{requestId:X,capabilityName:W.capabilityName,targetClientId:W.targetClientId,ok:!1,cancelled:!0,error:Q},W.sessionId)),J+=1}return J}async function RE($,Z){let Q=typeof Z.payload?.sessionId==="string"?Z.payload.sessionId.trim():Z.sessionId?.trim()||"",J=typeof Z.payload?.capabilityName==="string"?Z.payload.capabilityName.trim():"",X=typeof Z.payload?.targetClientId==="string"?Z.payload.targetClientId.trim():"";if(!Q||!J||!X)return m(Z,"invalid_capability_request","capability.request requires sessionId, capabilityName, and targetClientId");try{let W=Z.payload?.payload&&typeof Z.payload.payload==="object"&&!Array.isArray(Z.payload.payload)?Z.payload.payload:{},j=await $.requestCapability(Q,J,W,X);return h(Z,j)}catch(W){return m(Z,"capability_request_failed",W instanceof Error?W.message:String(W))}}function CE($,Z){let Q=typeof Z.payload?.requestId==="string"?Z.payload.requestId.trim():"",J=$.pendingCapabilityRequests.get(Q);if(!J)return h(Z,{requestId:Q,ignored:!0});let X=Z.clientId?.trim()||"";if(X!==J.targetClientId)return m(Z,"capability_wrong_client",`Capability request ${Q} is owned by ${J.targetClientId}`);if(Z.sessionId?.trim()&&Z.sessionId.trim()!==J.sessionId)return m(Z,"capability_wrong_session",`Capability request ${Q} belongs to session ${J.sessionId}`);$.pendingCapabilityRequests.delete(Q);let W=Z.payload?.payload&&typeof Z.payload.payload==="object"&&!Array.isArray(Z.payload.payload)?Z.payload.payload:void 0,j=typeof Z.payload?.error==="string"?Z.payload.error:void 0,Y=Z.payload?.ok===!0;return a(Y?"info":"warn","capability.respond",{requestId:Q,sessionId:J.sessionId,capabilityName:J.capabilityName,targetClientId:J.targetClientId,respondedByClientId:X,ok:Y,error:j}),J.resolve({ok:Y,payload:W,error:j}),$.publish($.buildEvent("capability.resolved",{requestId:Q,capabilityName:J.capabilityName,targetClientId:J.targetClientId,respondedByClientId:X,ok:Y,payload:W,error:j},J.sessionId)),h(Z,{requestId:Q,ok:Y})}import{createSessionId as Xo}from"@cline/shared";function PE($,Z){let Q=Z.payload,J=Q?.clientId?.trim()||Z.clientId?.trim()||Xo("client_");return $.clients.set(J,{clientId:J,clientType:Q?.clientType??"unknown",displayName:Q?.displayName,actorKind:Q?.actorKind??"client",connectedAt:Date.now(),lastSeenAt:Date.now(),transport:Q?.transport??"native",capabilities:Q?.capabilities??[],metadata:Q?.metadata,workspaceContext:Q?.workspaceContext}),$.publish($.buildEvent("hub.client.registered",{clientId:J,clientType:Q?.clientType??"unknown",displayName:Q?.displayName,connectedAt:Date.now()})),h(Z,{clientId:J})}function fE($,Z){let Q=Z.clientId?.trim(),J=Q?$.clients.get(Q):void 0;if(!Q||!J)return m(Z,"client_not_found","Client is not registered with this hub.");let X=p2(Z.payload?.metadata);if(J.lastSeenAt=Date.now(),X)J.metadata=JSON.parse(JSON.stringify(X));if(Array.isArray(Z.payload?.capabilities))J.capabilities=Z.payload.capabilities.flatMap((W)=>{if(!W||typeof W!=="object"||Array.isArray(W))return[];let j=W;if(typeof j.name!=="string"||!j.name.trim())return[];return[{name:j.name.trim(),...typeof j.description==="string"?{description:j.description}:{},...Array.isArray(j.scopes)&&j.scopes.every((Y)=>typeof Y==="string")?{scopes:j.scopes}:{}}]});return h(Z)}function wE($,Z,Q){let J=Z.clientId?.trim();if(J)$.clients.delete(J),Q(J),$.publish($.buildEvent("hub.client.disconnected",{clientId:J}));return h(Z)}function SE($,Z){return h(Z,{clients:[...$.clients.values()]})}import{buildConnectorConnectArgs as Wo,CONNECTOR_PLATFORMS as jo,connectorChannelsFromPlatforms as Yo,listConnectorCatalog as Vo,mergeConnectorConnectArgs as Ko,shouldIncludeConnectorField as Bo}from"@cline/shared";import{withConnectorStore as aG}from"@cline/shared/db";q0();function D8($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function MW($){return typeof $==="string"?$.trim():void 0}function bE($){if(!D8($))return{};let Z={};for(let[Q,J]of Object.entries($))if(typeof J==="string")Z[Q]=J.trim();return Z}function Go(){return aG(($)=>$.listConfigs()).map(($)=>({id:$.channel,type:$.type,configuredAt:$.configuredAt,updatedAt:$.updatedAt})).sort(($,Z)=>$.type.localeCompare(Z.type))}function nG(){return{available:Yo(),active:X8(),configured:Go()}}function Ho($,Z){if($.required&&!Z[$.flag]?.trim())throw Error(`${$.label} is required`)}function Uo($,Z){let Q={};for(let X of $.fields)Q[X.flag]=Z[X.flag]??X.initialValue??"";let J={};for(let X of $.fields){if(!Bo(X,Q))continue;Ho(X,Q),J[X.flag]=Q[X.flag]}return J}function Fo($){if(!D8($))throw Error("connector.configure payload must be an object.");let Z=MW($.channel);if(!Z)throw Error("channel is required");let Q=jo.find((G)=>G.id===Z);if(!Q)throw Error(`unknown connector channel: ${Z}`);if(!new Set(Vo().map((G)=>G.name)).has(Q.id))throw Error(`connector channel is not available: ${Z}`);let X=bE($.values),W=Uo(Q,X),j=D8($.security)?$.security:{},Y=j.enabled===!0,V=bE(j.values);if(Y&&Q.security)for(let G of Q.security.fields){let H=V[G.key];if(!H)throw Error(G.requiredMessage);let U=G.validate?.(H);if(U)throw Error(U)}let K=Y?{enabled:!0,values:V}:{enabled:!1,values:{}},B=Wo(Q,W,K);return aG((G)=>G.upsertConfig({channel:Z,type:Z,values:W,security:K,updateConnectArgs:(H)=>Ko(Q,H.connection.connectArgs,B,{replaceSecurityArgs:H.config?.security?.enabled===!0||K.enabled})})),nG()}function Do($){if(!D8($))throw Error("connector.delete_config payload must be an object.");let Z=MW($.channel);if(!Z)throw Error("channel is required");return aG((Q)=>Q.deleteConfig(Z)),nG()}function Lo($){return Array.isArray($)?$.filter((Z)=>typeof Z==="string"):[]}function oG(){let $=YZ();if(!$)throw Error("connector supervision is unavailable in this hub; start connectors with the CLI instead");return $}function kE($){if(!D8($))throw Error("payload must be an object.");let Z=MW($.channel);if(!Z)throw Error("channel is required");let Q=MW($.instanceId);if(!Q)throw Error("instanceId is required");return{channel:Z,instanceId:Q}}async function _o($){let{channel:Z,instanceId:Q}=kE($),J=D8($)?$:{};return await oG().start({channel:Z,instanceId:Q,args:Lo(J.args),restart:J.restart===!0})}async function zo($){let{channel:Z,instanceId:Q}=kE($),J=D8($)?$:{};return{stopped:await oG().stop({channel:Z,instanceId:Q,disableAutostart:J.disableAutostart!==!1}),channel:Z,instanceId:Q}}function Oo($){return $==="connector.configure"||$==="connector.delete_config"||$==="connector.start"||$==="connector.stop"}function aZ($,Z,Q){if(!Oo(Z.command))return;o1($.telemetry,{ulid:Z.sessionId??Z.requestId??"hub",tool:Z.command,success:Q})}async function xE($,Z){try{if(Z.command==="connector.channels")return h(Z,nG());if(Z.command==="connector.configure"){let Q=Fo(Z.payload);return aZ($,Z,!0),h(Z,Q)}if(Z.command==="connector.delete_config"){let Q=Do(Z.payload);return aZ($,Z,!0),h(Z,Q)}if(Z.command==="connector.start"){let Q=await _o(Z.payload);return aZ($,Z,!0),h(Z,Q)}if(Z.command==="connector.stop"){let Q=await zo(Z.payload);return aZ($,Z,!0),h(Z,Q)}if(Z.command==="connector.supervised")return h(Z,{supervised:oG().list()});return m(Z,"unsupported_connector_command",`unsupported connector command: ${Z.command}`)}catch(Q){return aZ($,Z,!1),m(Z,"connector_command_failed",Q instanceof Error?Q.message:String(Q))}}var No=30000;function qo($){if($==="aborted")return"run.aborted";if($==="error"||$==="failed")return"run.failed";return"run.completed"}function Ao($){if($.finishReason!=="error")return;return $.text.trim()||void 0}function To($,Z){let Q=$.activeRpcTurnCountBySession;Q.set(Z,(Q.get(Z)??0)+1);let J=!1;return()=>{if(J)return;J=!0;let X=(Q.get(Z)??1)-1;if(X<=0)Q.delete(Z);else Q.set(Z,X)}}function yE($,Z,Q){let J=Q instanceof Error&&Q.message.trim()?Q.message:`Unknown session: ${Z}`;return m($,e2,J)}function Eo($){return $?$:void 0}function Mo($){let Z=typeof $.timeoutMs==="number"?$.timeoutMs:typeof $.timeout_ms==="number"?$.timeout_ms:void 0;if(Z&&Number.isFinite(Z)&&Z>0)return Math.floor(Z);let Q=typeof $.timeoutSeconds==="number"?$.timeoutSeconds:typeof $.timeout_seconds==="number"?$.timeout_seconds:void 0;if(Q&&Number.isFinite(Q)&&Q>0)return Math.floor(Q*1000);return}async function Ro($,Z,Q,J){let X=performance.now(),W=!1,j={command:Z.command,requestId:Z.requestId,clientId:Z.clientId,sessionId:Q.sessionId,timeoutMs:J},Y=setInterval(()=>{if(W)return;let B=Math.round(performance.now()-X);a("warn","run.heartbeat",{...j,elapsedMs:B}),$.publish($.buildEvent("run.heartbeat",{requestId:Z.requestId,elapsedMs:B,...J?{timeoutMs:J}:{}},Q.sessionId))},No),V=$.sessionHost.runTurn(Q);V.then((B)=>{if(!W)return;a("warn","run.late_end",{...j,elapsedMs:Math.round(performance.now()-X),finishReason:B?.finishReason})},(B)=>{if(!W)return;a("error","run.late_error",{...j,elapsedMs:Math.round(performance.now()-X),error:B})});let K;try{if(!J)return await V;return await Promise.race([V,new Promise((B,G)=>{K=setTimeout(()=>{let H=`Hub run ${Z.command} timed out after ${J}ms.`;W=!0,clearInterval(Y),G(Error(H)),a("error","run.timeout",{...j,elapsedMs:Math.round(performance.now()-X)}),rG($,(U)=>U.sessionId===Q.sessionId,H),i2($,(U)=>U.sessionId===Q.sessionId,H),$.sessionHost.abort(Q.sessionId,H).catch((U)=>{a("error","run.timeout_abort_failed",{...j,error:U})})},J)})])}finally{if(W=!0,clearInterval(Y),K)clearTimeout(K)}}async function nZ($,Z){let Q=E0(Z),J=Z.payload&&typeof Z.payload==="object"?Z.payload:{},X=typeof J.prompt==="string"?J.prompt:typeof J.input==="string"?J.input:"";if(!X.trim())return m(Z,"invalid_session_input","session input requires a prompt string");if(!await $.sessionHost.getSession(Q))return yE(Z,Q);$.publish($.buildEvent("run.started",{...Z.requestId?{requestId:Z.requestId}:{},...Z.clientId?{clientId:Z.clientId}:{}},Q));let j=J.attachments&&typeof J.attachments==="object"&&!Array.isArray(J.attachments)?J.attachments:void 0,Y=Array.isArray(j?.userFiles)?j.userFiles.filter((H)=>typeof H==="string"):void 0,V=Mo(J);$.suppressNextTerminalEventBySession.set(Q,"run.start.reply");let K=To($,Q),B;try{try{B=await Ro($,Z,{sessionId:Q,prompt:X,mode:Eo(J.mode),delivery:J.delivery==="queue"||J.delivery==="steer"?J.delivery:void 0,userImages:Array.isArray(j?.userImages)?j.userImages:void 0,userFiles:Y,timeoutMs:V},V)}catch(H){if($.suppressNextTerminalEventBySession.get(Q)==="run.start.reply")$.suppressNextTerminalEventBySession.delete(Q);if(e1(H))return yE(Z,Q,H);throw $.publish($.buildEvent("run.failed",{reason:"error",error:H instanceof Error?H.message:String(H)},Q)),H}if(B){let H=await X1($,Q),U=Ao(B);if($.publish($.buildEvent(qo(B.finishReason),{reason:B.finishReason,...U?{error:U}:{},result:B,...H?{snapshot:H}:{}},Q)),$.suppressNextTerminalEventBySession.get(Q)==="run.start.reply")$.suppressNextTerminalEventBySession.delete(Q)}else $.suppressNextTerminalEventBySession.delete(Q)}finally{K()}let G=await X1($,Q);return h(Z,B||G?{...B?{result:B}:{},...G?{snapshot:G}:{}}:void 0)}async function IE($,Z){let Q=E0(Z),J=typeof Z.payload?.reason==="string"?Z.payload.reason:"Run was aborted before pending approval or capability request was resolved.";rG($,(X)=>X.sessionId===Q,J);try{await $.sessionHost.abort(Q,Z.payload?.reason)}catch(X){a("warn","run.abort_failed",{command:Z.command,requestId:Z.requestId,clientId:Z.clientId,sessionId:Q,error:X})}finally{i2($,(X)=>X.sessionId===Q,J)}return h(Z,{applied:!0})}async function hE($,Z){let Q=E0(Z);if(!Q)return m(Z,"invalid_session_id","run.proceed_while_running requires a sessionId");if(typeof $.sessionHost.proceedWhileRunning!=="function")return m(Z,"unsupported_command","This runtime does not support proceeding while commands are running.");let J=typeof Z.payload?.toolCallId==="string"&&Z.payload.toolCallId.trim().length>0?Z.payload.toolCallId.trim():void 0,X=await $.sessionHost.proceedWhileRunning(Q,J);return h(Z,{detachedCount:X})}async function vE($,Z){let Q=C4(Z.payload?.payload);if(!Q)return m(Z,"invalid_hook_payload","session.hook requires a valid hook event payload");return await $.sessionHost.dispatchHookEvent(Q),h(Z,{applied:!0})}import{join as Co}from"node:path";import{createSessionId as Po}from"@cline/shared";import{loadSqliteDb as fo}from"@cline/shared/db";import{resolveDbDataDir as wo}from"@cline/shared/storage";var So=32,bo=604800000;class q5 extends Error{retryable=!0;constructor($,Z,Q){super(`Session ${$} queue is full (${Z} pending runs, limit ${Q}); retry later.`);this.name="HubRunAdmissionRejectedError"}}function wG($){let Z=$?.replace(/[^a-zA-Z0-9_-]/g,"-");return Co(wo(),Z?`hub-runs-${Z}.db`:"hub-runs.db")}class mZ{db;maxPendingPerSession;closed=!1;constructor($={}){this.db=fo($.dbPath??wG($.ownerId)),this.maxPendingPerSession=$.maxPendingPerSession??So,this.db.exec("PRAGMA journal_mode = WAL;"),this.db.exec("PRAGMA busy_timeout = 5000;"),this.db.exec(`
957
957
  CREATE TABLE IF NOT EXISTS hub_runs (
958
958
  accepted_seq INTEGER PRIMARY KEY AUTOINCREMENT,
959
959
  run_id TEXT NOT NULL UNIQUE,