@cerebriline/core 4.100.265 → 4.100.266

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.
@@ -1478,7 +1478,7 @@ ${P.plan}`,metadata:{kind:"atomic_plan",transaction:P.transaction,from:P.from}})
1478
1478
 
1479
1479
  `),Um=Wt?LDe(Zc,Wt,{}).map((Zt)=>({...Zt,description:Zt.description??""})):Zc,ws=Rc(Um,{source:ge.source,readFile:async(Zt)=>{try{return await PDe(Zt)}catch{return}}}),AJ=vt?R8(ws,{notes:vt,heads:()=>ge.heads(),relative:(Zt)=>{let pk=M.workspaceRoot??M.cwd??process.cwd(),J0=pk.endsWith("/")?pk:`${pk}/`;return Zt.startsWith(J0)?Zt.slice(J0.length):Zt}}):ws,RJ=ii({kind:"subagent",prompt:Dn,configProvider:lt,tools:AJ,onEvent:kt?(Zt)=>{kt.observe(Zt),P(Zt)}:P,toolPolicies:A.toolPolicies,requestToolApproval:A.requestToolApproval,hookErrorMode:M.hookErrorMode,...Nt?{consumePendingUserMessage:()=>Nt.take()}:{}});return P8(RJ,{start:(Zt)=>R.invokeBackendOptional("handleSubAgentStart",t,Zt),end:(Zt)=>R.invokeBackendOptional("handleSubAgentEnd",t,Zt)})},...(()=>{let P=Ve?re.delegatedAgentConfigProvider?.getRuntimeConfig().slotGates?.for(Nr({providerId:Ve.providerId,baseUrl:Ve.baseUrl})):void 0;return P?{gate:P}:{}})(),readTransaction:()=>{let P=et?.controller;if(!P||P.transaction===0)return;return{transaction:P.transaction,maxChanges:M.atomicProtocol?.maxChanges??qp,maxTransactions:M.atomicProtocol?.maxTransactions??Vb,...P.oracle?{oracle:P.oracle}:{},history:P.outcomes}},assess:async(P)=>{let ye=et?.controller,nt=ye?.outcomes??[],lt=(await DV(P.files,M.workspaceRoot??M.cwd)).lines,Wt={...lt.length>0?{complexity:lt}:{},...be>0?{iteration:be}:{},...Q?{signals:Q.signalsAt(be)}:{},...ye&&ye.transaction>0?{transactions:{opened:ye.transaction,discarded:nt.filter((ws)=>!ws.kept&&!ws.carried).length,carried:nt.filter((ws)=>ws.carried).length}}:{},...Vr?.spent?{guardStoodDown:!0}:{}},Dn=M.escalation?.appraise;if(!Dn)return Yb(Wt);let Um=await qDe(Dn({task:this.sessions.get(t)?.pendingPrompt??m.prompt,...P.goal?{goal:P.goal}:{},...P.reason?{reason:P.reason}:{},measured:Yb(Wt)??""}),jDe);return Yb({...Wt,...Um?.length?{appraisal:Um}:{}})},...M.escalation?.approve?{approve:M.escalation.approve}:{},readTask:()=>this.sessions.get(t)?.pendingPrompt??m.prompt,takeSteering:()=>this.pendingPromptsController.consumeSteer(t)?.prompt,...M.atomicProtocol?.forgetReads?{forgetReads:M.atomicProtocol.forgetReads}:{},onEvent:(P)=>{if(P.type==="escalation_started"){this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:`Escalation ${P.index} of ${P.of}: the task has been handed to the expert.
1480
1480
 
1481
- ${P.brief}`,metadata:{kind:"escalation_started",index:P.index,of:P.of,brief:P.brief}});return}if(P.type==="expert_said"){this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:P.text,metadata:{kind:P.kind==="thinking"?"expert_thinking":"expert_message",index:P.index,of:P.of}});return}if(P.type==="expert_progress"){this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:`The expert is working: ${P.toolCalls} tool call${P.toolCalls===1?"":"s"} so far.`,metadata:{kind:"expert_progress",index:P.index,of:P.of,toolCalls:P.toolCalls,...P.lastTool?{lastTool:P.lastTool}:{},usage:{inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,generateTokens:P.usage.generateTokens,generateMs:P.usage.generateMs,wallMs:P.usage.wallMs,requests:P.usage.requests}}});return}if(P.type==="expert_asked"){this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:P.message,metadata:{kind:"escalation_message"}});return}if(P.type==="escalation_failed"){this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:P.limitReached?`The expert stopped: its account reached its usage limit. ${P.reason}`:`The expert's run failed: ${P.reason}`,metadata:{kind:"escalation_failed",index:P.index,of:P.of,reason:P.reason,changed:P.changed,limitReached:P.limitReached,...P.usage?{usage:{inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,generateTokens:P.usage.generateTokens,generateMs:P.usage.generateMs,wallMs:P.usage.wallMs,requests:P.usage.requests}}:{}}});return}if(P.type==="expert_replied"){this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:P.reply,metadata:{kind:"expert_reply",changed:P.changed,usage:{inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,generateTokens:P.usage.generateTokens,generateMs:P.usage.generateMs,wallMs:P.usage.wallMs,requests:P.usage.requests}}});return}this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:P.held?"The expert conversation is on hold. It keeps its context, so a second escalation costs a message rather than the whole exchange again.":"The expert conversation is closed and its slot released.",metadata:{kind:"escalation_ended",held:P.held,usage:{inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,generateTokens:P.usage.generateTokens,generateMs:P.usage.generateMs,wallMs:P.usage.wallMs,requests:P.usage.requests}}})}}),wi=et?et.decorateTools([...Ue,...et.tools]):G?j.decorate([...Ue,...j.tools]):Ue.some((P)=>KDe.test(P.name))?j.decorateReads([...Ue,...j.tools]):Ue;Zc=Ue.filter((P)=>!Ew.has(P.name));let Vr=me.tools.length>0?M8({remaining:()=>me.remaining,stop:(P)=>{M.logger?.log?.(`[Escalation] ${P}`),this.sessions.get(t)?.agent.abort(Error(P))},logger:{log:(P)=>M.logger?.log?.(P)}}):void 0;ee=()=>{let P=me.remaining;return P>0?dA({diagnosis:"This is the last transaction this task gets. Whatever it ends as is what the run ends as.",remaining:P}):void 0};let gs=Cw(),ae=M.enableSpawnAgent!==!1&&ns({maxConcurrentAgents:M.maxConcurrentAgents,nodes:cs(M)}),Fe=me.tools.length>0||ae;Q=Fe?new Yi(M.escalation?.struggleThresholds):void 0;let Te=Q?wa(Q,(P)=>{let ye=me.remaining;if(!P.message)return;if(P.kind==="nudge"){DV(P.files,M.workspaceRoot??M.cwd).then(({lines:lt,high:Wt,broken:Dn})=>{gs.hold(nj({diagnosis:P.message,complexity:lt,high:Wt,broken:Dn,...P.reason?{reason:P.reason}:{},canDelegate:ae,remaining:ye})),this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:"the run has the shape of a stuck one",metadata:{kind:"struggle",phase:"nudge",...P.reason?{reason:P.reason}:{},remaining:ye,high:Wt,broken:Dn}})});return}if(ye<=0)return;let nt=dA({diagnosis:P.message,remaining:ye});M.logger?.debug?.(`[Escalation] ${P.message}`),this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:"the run has the shape of a stuck one — the expert was offered",metadata:{kind:"struggle",phase:"offer",...P.reason?{reason:P.reason}:{},remaining:ye}}),gs.hold(nt)}):void 0,gt=Fe?Pw(me.tools.length>0?[...wi,...me.tools]:wi,gs):wi,Qt=Ee?w8(gt,Ee):gt,ys=et?{...Tr,onCompletionAttempt:(P)=>et.onCompletionAttempt(P),describeUnstartedWork:()=>et.describeUnstartedWork()}:Tr,dk=re.extensions??A.extensions,lk=s.initialCompactionState,ck,uk=lk??y,Y0=w?C3(m.metadata):void 0,SJ=Y0?HN({config:M,importedFrom:Y0.tool,next:oe}):oe,xJ=uk?{...uk,conversation_id:uk.conversation_id?.trim()||t}:void 0,X0=0,_J=yT(UT({compact:SJ,getState:()=>ck?.compactionState,logger:M.logger,saveState:async(P,ye)=>{let nt=ck;if(!nt)return;let lt={...P,conversation_id:nt.sessionId},Wt=zDe(lt);if(Wt>X0)X0=Wt,Q?.noteCompaction();try{if(!(await this.persistActiveSessionCompactionState(nt,lt,ye)).updated)M.logger?.debug?.("Skipped stale session compaction state",{sessionId:nt.sessionId,sourceMessageCount:lt.source_message_count})}catch(Dn){M.logger?.error?.("Failed to persist session compaction state",{sessionId:nt.sessionId,error:Dn}),yr(M.telemetry,{component:"core",operation:"session.persist_compaction_state",severity:"warn",handled:!0,error:Dn,context:{sessionId:nt.sessionId,providerId:M.providerId,modelId:M.modelId}})}}}),he),rd={distinctId:this.distinctId,sessionId:t,providerId:X.providerId,modelId:X.modelId,apiKey:X.apiKey,baseUrl:X.baseUrl,headers:X.headers,onAuthError:Ge,knownModels:X.knownModels,providerConfig:X,thinking:M.thinking,reasoningEffort:M.reasoningEffort??X.reasoningEffort,thinkingBudgetTokens:M.thinkingBudgetTokens,maxTokensPerTurn:M.maxTokensPerTurn,maxToolResultChars:M.maxToolResultChars,toolResultFormat:M.toolResultFormat,staleReadRewrites:M.staleReadRewrites,temperature:M.temperature,systemPrompt:M.systemPrompt,maxIterations:M.maxIterations,execution:M.execution,prepareTurn:_J,condenseDiscardedReasoning:se,recoverTurnFault:ur({label:"lead",baseUrl:()=>X.baseUrl,headers:()=>X.headers,...M.logger?{logger:M.logger}:{}}),recoverTurnFaultKinds:["refusal"],tools:Qt,modelTools:re.modelTools,hooks:A.hooks,extensions:dk,hookErrorMode:M.hookErrorMode,initialMessages:A.effectiveInput.initialMessages,userFileContentLoader:IV,toolPolicies:A.toolPolicies,...re.unavailableToolReasons?{unavailableToolReasons:re.unavailableToolReasons}:{},requestToolApproval:A.requestToolApproval?async(P)=>{let ye=A.requestToolApproval,nt=this.sessions.get(t);if(nt)await this.markTurnPending(nt);try{if(!ye)return{approved:!1,reason:"Tool approval callback is not configured."};return await ye(P)}finally{let lt=this.sessions.get(t);if(lt?.status==="pending")await this.markTurnRunning(lt)}}:void 0,telemetry:M.telemetry,onConsecutiveMistakeLimitReached:Vr?async(P)=>Vr.decide({guard:P.forced?"The repeated-call loop guard":"The consecutive-mistake limit",...P.details?{diagnosis:P.details}:{}})??await M.onConsecutiveMistakeLimitReached?.(P)??{action:"stop"}:M.onConsecutiveMistakeLimitReached,onLoopCut:(P)=>iP(yi(c,`${t}.cuts.jsonl`),P),...Vr?{onReasoningLoopLimitReached:(P)=>Vr.decide({guard:"The reasoning-loop guard",diagnosis:P.diagnosis})??{action:"stop"}}:{},completionPolicy:ys,consumePendingUserMessage:async()=>{if(this.pendingAtomicDisengage.delete(t)){let ye=await this.sessions.get(t)?.atomicProtocol?.disengage();if(ye)return _c(ye,M.mode)}let P=this.pendingPromptsController.consumeSteer(t);return P?_c(P.prompt,P.mode??M.mode):void 0},describeImages:M.describeImages,alwaysDescribeImages:M.alwaysDescribeImages,logger:re.logger??M.logger,extensionContext:M.extensionContext,onEvent:(P)=>{if(P.type==="iteration_start")be=P.iteration;Te?.observe(P),Vr?.observe(P),this.eventBridge.dispatchAgentEvent(t,M,P)}};rd.hooks={...rd.hooks,onEvent:async(P)=>{if(await A.hooks?.onEvent?.(P),P.type!=="assistant-message")return;let ye=this.sessions.get(t);if(!ye)return;let nt=ye.agent.getMessages();try{await this.invoke("persistSessionMessages",t,nt,M.systemPrompt)}catch(lt){M.logger?.error?.("Failed to persist session messages after assistant response",{sessionId:t,error:lt}),yr(M.telemetry,{component:"core",operation:"session.persist_messages_after_assistant_response",error:lt,severity:"warn",handled:!0,context:{sessionId:t,providerId:M.providerId,modelId:M.modelId}})}}};let od=this.createAgentInstance(rd);if(rd.onEvent)od.subscribeEvents(rd.onEvent);this.sideTurnConfigs.set(t,rd),He(t).messageWaiting=()=>this.sessions.get(t)?.pendingPrompts.some((P)=>P.delivery==="steer"&&P.noteKind!=="queued")===!0,this.leadNudgeUnsubscribes.get(t)?.(),this.leadNudgeUnsubscribes.set(t,n2(t,(P,ye)=>this.nudgeLead(t,P,ye))),this.roundUnsubscribes.get(t)?.();let EJ=He(t);this.roundUnsubscribes.set(t,EJ.onSettled((P)=>this.deliverRound(t,P))),re.registerLeadAgent?.(od);let hk=ui({agentId:od.getAgentId(),conversationId:od.getConversationId(),teamId:re.teamRuntime?.getTeamId(),teamName:re.teamRuntime?.getTeamName(),teamRole:re.teamRuntime?"lead":void 0});if(P3(M,t,n,p,hk),hk)ld(M.telemetry,{ulid:t,modelId:M.modelId,provider:M.providerId,...hk});if(re.teamRuntime)RM(M.telemetry,{ulid:t,teamId:re.teamRuntime.getTeamId(),teamName:re.teamRuntime.getTeamName(),leadAgentId:od.getAgentId(),restoredFromPersistence:re.teamRestoredFromPersistence===!0});let je={sessionId:t,config:M,sessionMetadata:B,...g?{artifacts:g}:{},source:o,startedAt:g?.manifest.started_at??i,updatedAt:g?.manifest.ended_at??g?.manifest.started_at??i,pendingPrompt:m.prompt,runtime:re,revisionLog:j.log,agent:od,started:!1,status:g?.manifest.status??(f?"idle":"running"),aborting:!1,interactive:e.interactive===!0,persistedMessages:a,compactionState:xJ,activeTeamRunIds:new Set,pendingTeamRunUpdates:[],teamRunWaiters:[],pendingPrompts:[],drainingPendingPrompts:!1,...et?{atomicProtocol:et}:{},...me.tools.length>0?{escalation:me}:{},...Y?{pendingAtomicStatus:Y}:{},pluginSandboxShutdown:A.pluginSandboxShutdown,delegatedSandboxesShutdown:async()=>{await C?.closeAll()},submitAndExitObserved:!1,taskCompletedEmitted:!1,lastInteractiveTurnFinishReason:void 0};if(ck=je,je.compactionState&&!this.isCompactionStateForSession(je.sessionId,je.compactionState,je))je.config.logger?.log?.("Ignoring session compaction state for a different conversation",{severity:"warn",sessionId:je.sessionId,conversationId:je.compactionState.conversation_id}),je.compactionState=void 0;this.sessions.set(t,je);for(let P of He(t).list())if(P.status==="done"&&!P.delivered)this.deliverRound(t,{record:P,report:He(t).reportFor(P.id)});if(g)await this.refreshActiveSessionGitMetadata(je,A.gitState);if(a.length>0&&!g)try{await this.ensureSessionPersisted(je),await this.invoke("persistSessionMessages",t,a,je.config.systemPrompt)}catch(P){je.config.logger?.error?.("Failed to persist seeded session messages at start",{sessionId:t,error:P}),yr(je.config.telemetry,{component:"core",operation:"session.persist_seeded_messages",error:P,severity:"warn",handled:!0,context:{sessionId:t,providerId:je.config.providerId,modelId:je.config.modelId}})}this.emitStatus(t,je.status);let eu;try{if(s.prompt?.trim())if(eu=await this.executeTurn(je,{prompt:s.prompt,userImages:s.userImages,userFiles:s.userFiles}),!je.interactive)await this.finalizeSingleRun(je,eu.finishReason);else await this.completeInteractiveTurn(je,eu.finishReason)}catch(P){if(je.interactive&&je.aborting)eu=await this.completeAbortedInteractiveTurn(je);else{yr(je.config.telemetry,{component:"core",operation:"session.start",error:P,severity:"error",handled:!1,context:{sessionId:je.sessionId,providerId:je.config.providerId,modelId:je.config.modelId}});try{await this.failSession(je)}catch(ye){je.config.logger?.error?.("Session failure cleanup threw",{sessionId:je.sessionId,error:ye})}throw P}}return{sessionId:t,manifest:m,manifestPath:h,messagesPath:u,result:eu,resolvedConfig:A.resolvedConfig}}async restoreSession(e){return this.sessionVersioning.restoreCheckpoint({...e,telemetry:this.defaultTelemetry,getSession:(t)=>this.getSession(t),readMessages:(t)=>this.readSessionMessages(t),buildStartInput:(t,n)=>{let r=t.restoredCheckpointMetadata?{...n.sessionMetadata??{},checkpoint:t.restoredCheckpointMetadata}:n.sessionMetadata;return{...n,...r?{sessionMetadata:r}:{},initialMessages:t.initialMessages}},startSession:(t)=>this.startSession(t),getStartedSessionId:(t)=>t.sessionId,cleanupStartedSession:async(t)=>{if(!await this.deleteSession(t.sessionId))throw Error(`Failed to clean up restored session ${t.sessionId}`)},readRestoredSession:(t)=>this.getSession(t)})}answerSteerInSideTurn(e,t,n="user"){let r=e.sessionId,o=this.sideTurnConfigs.get(r);if(!o)return;let s=(this.sideTurns.get(r)??Promise.resolve()).then(async()=>{e.config.logger?.log?.(`[Agents] steer while ${pt.runningIn(r).length} agent(s) run: answering in a side turn`);let d=await MV({sessionId:r,message:t,source:n,messages:e.agent.getMessages(),leadTools:(o.tools??[]).filter((l)=>dP.has(l.name)),createRunner:(l)=>{let c=this.createAgentInstance({...o,tools:l,modelTools:void 0,prepareTurn:void 0,hooks:void 0,extensions:void 0,onEvent:void 0,initialMessages:void 0,consumePendingUserMessage:void 0,requestToolApproval:void 0,toolPolicies:void 0,maxIterations:Bc});return{restore:(u)=>c.restore(u),continue:async(u)=>{let h=await c.continue(u);return{text:h.text,finishReason:h.finishReason}}}}});this.eventBridge.dispatchAgentEvent(r,e.config,{type:"notice",noticeType:"status",displayRole:"status",message:[...n==="system"?[`Agents stuck for a long time:
1481
+ ${P.brief}`,metadata:{kind:"escalation_started",index:P.index,of:P.of,brief:P.brief}});return}if(P.type==="expert_said"){this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:P.text,metadata:{kind:P.kind==="thinking"?"expert_thinking":"expert_message",index:P.index,of:P.of}});return}if(P.type==="expert_progress"){this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:`The expert is working: ${P.toolCalls} tool call${P.toolCalls===1?"":"s"} so far.`,metadata:{kind:"expert_progress",index:P.index,of:P.of,toolCalls:P.toolCalls,...P.lastTool?{lastTool:P.lastTool}:{},usage:{inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,generateTokens:P.usage.generateTokens,generateMs:P.usage.generateMs,wallMs:P.usage.wallMs,requests:P.usage.requests}}});return}if(P.type==="expert_asked"){this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:P.message,metadata:{kind:"escalation_message"}});return}if(P.type==="escalation_failed"){this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:P.limitReached?`The expert stopped: its account reached its usage limit. ${P.reason}`:`The expert's run failed: ${P.reason}`,metadata:{kind:"escalation_failed",index:P.index,of:P.of,reason:P.reason,changed:P.changed,limitReached:P.limitReached,...P.usage?{usage:{inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,generateTokens:P.usage.generateTokens,generateMs:P.usage.generateMs,wallMs:P.usage.wallMs,requests:P.usage.requests}}:{}}});return}if(P.type==="expert_replied"){this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:P.reply,metadata:{kind:"expert_reply",changed:P.changed,usage:{inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,generateTokens:P.usage.generateTokens,generateMs:P.usage.generateMs,wallMs:P.usage.wallMs,requests:P.usage.requests}}});return}this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:P.held?"The expert conversation is on hold. It keeps its context, so a second escalation costs a message rather than the whole exchange again.":"The expert conversation is closed and its slot released.",metadata:{kind:"escalation_ended",held:P.held,usage:{inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,generateTokens:P.usage.generateTokens,generateMs:P.usage.generateMs,wallMs:P.usage.wallMs,requests:P.usage.requests}}})}}),wi=et?et.decorateTools([...Ue,...et.tools]):G?j.decorate([...Ue,...j.tools]):Ue.some((P)=>KDe.test(P.name))?j.decorateReads([...Ue,...j.tools]):Ue;Zc=Ue.filter((P)=>!Ew.has(P.name));let Vr=me.tools.length>0?M8({remaining:()=>me.remaining,stop:(P)=>{M.logger?.log?.(`[Escalation] ${P}`),this.sessions.get(t)?.agent.abort(Error(P))},logger:{log:(P)=>M.logger?.log?.(P)}}):void 0;ee=()=>{let P=me.remaining;return P>0?dA({diagnosis:"This is the last transaction this task gets. Whatever it ends as is what the run ends as.",remaining:P}):void 0};let gs=Cw(),ae=M.enableSpawnAgent!==!1&&ns({maxConcurrentAgents:M.maxConcurrentAgents,nodes:cs(M)}),Fe=me.tools.length>0||ae;Q=Fe?new Yi(M.escalation?.struggleThresholds):void 0;let Te=Q?wa(Q,(P)=>{let ye=me.remaining;if(!P.message)return;if(P.kind==="nudge"){DV(P.files,M.workspaceRoot??M.cwd).then(({lines:lt,high:Wt,broken:Dn})=>{gs.hold(nj({diagnosis:P.message,complexity:lt,high:Wt,broken:Dn,...P.reason?{reason:P.reason}:{},canDelegate:ae,remaining:ye})),this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:"the run has the shape of a stuck one",metadata:{kind:"struggle",phase:"nudge",...P.reason?{reason:P.reason}:{},remaining:ye,high:Wt,broken:Dn}})});return}if(ye<=0)return;let nt=dA({diagnosis:P.message,remaining:ye});M.logger?.debug?.(`[Escalation] ${P.message}`),this.eventBridge.dispatchAgentEvent(t,M,{type:"notice",noticeType:"status",displayRole:"status",message:"the run has the shape of a stuck one — the expert was offered",metadata:{kind:"struggle",phase:"offer",...P.reason?{reason:P.reason}:{},remaining:ye}}),gs.hold(nt)}):void 0,gt=Fe?Pw(me.tools.length>0?[...wi,...me.tools]:wi,gs):wi,Qt=Ee?w8(gt,Ee):gt,ys=et?{...Tr,onCompletionAttempt:(P)=>et.onCompletionAttempt(P),describeUnstartedWork:()=>et.describeUnstartedWork()}:Tr,dk=re.extensions??A.extensions,lk=s.initialCompactionState,ck,uk=lk??y,Y0=w?C3(m.metadata):void 0,SJ=Y0?HN({config:M,importedFrom:Y0.tool,next:oe}):oe,xJ=uk?{...uk,conversation_id:uk.conversation_id?.trim()||t}:void 0,X0=0,_J=yT(UT({compact:SJ,getState:()=>ck?.compactionState,logger:M.logger,saveState:async(P,ye)=>{let nt=ck;if(!nt)return;let lt={...P,conversation_id:nt.sessionId},Wt=zDe(lt);if(Wt>X0)X0=Wt,Q?.noteCompaction();try{if(!(await this.persistActiveSessionCompactionState(nt,lt,ye)).updated)M.logger?.debug?.("Skipped stale session compaction state",{sessionId:nt.sessionId,sourceMessageCount:lt.source_message_count})}catch(Dn){M.logger?.error?.("Failed to persist session compaction state",{sessionId:nt.sessionId,error:Dn}),yr(M.telemetry,{component:"core",operation:"session.persist_compaction_state",severity:"warn",handled:!0,error:Dn,context:{sessionId:nt.sessionId,providerId:M.providerId,modelId:M.modelId}})}}}),he),rd={distinctId:this.distinctId,sessionId:t,providerId:X.providerId,modelId:X.modelId,apiKey:X.apiKey,baseUrl:X.baseUrl,headers:X.headers,onAuthError:Ge,knownModels:X.knownModels,providerConfig:X,thinking:M.thinking,reasoningEffort:M.reasoningEffort??X.reasoningEffort,thinkingBudgetTokens:M.thinkingBudgetTokens,maxTokensPerTurn:M.maxTokensPerTurn,maxToolResultChars:M.maxToolResultChars,toolResultFormat:M.toolResultFormat,staleReadRewrites:M.staleReadRewrites,temperature:M.temperature,systemPrompt:M.systemPrompt,maxIterations:M.maxIterations,execution:M.execution,prepareTurn:_J,condenseDiscardedReasoning:se,recoverTurnFault:ur({label:"lead",baseUrl:()=>X.baseUrl,headers:()=>X.headers,...M.logger?{logger:M.logger}:{}}),recoverTurnFaultKinds:["refusal"],tools:Qt,modelTools:re.modelTools,hooks:A.hooks,extensions:dk,hookErrorMode:M.hookErrorMode,initialMessages:A.effectiveInput.initialMessages,userFileContentLoader:IV,toolPolicies:A.toolPolicies,...re.unavailableToolReasons?{unavailableToolReasons:re.unavailableToolReasons}:{},requestToolApproval:A.requestToolApproval?async(P)=>{let ye=A.requestToolApproval,nt=this.sessions.get(t);if(nt)await this.markTurnPending(nt);try{if(!ye)return{approved:!1,reason:"Tool approval callback is not configured."};return await ye(P)}finally{let lt=this.sessions.get(t);if(lt?.status==="pending")await this.markTurnRunning(lt)}}:void 0,telemetry:M.telemetry,onConsecutiveMistakeLimitReached:Vr?async(P)=>Vr.decide({guard:P.forced?"The repeated-call loop guard":"The consecutive-mistake limit",...P.details?{diagnosis:P.details}:{}})??await M.onConsecutiveMistakeLimitReached?.(P)??{action:"stop"}:M.onConsecutiveMistakeLimitReached,onLoopCut:(P)=>iP(yi(c,`${t}.cuts.jsonl`),P),onReasoningLoopLimitReached:Vr?async(P)=>Vr.decide({guard:"The reasoning-loop guard",diagnosis:P.diagnosis})??await M.onReasoningLoopLimitReached?.(P)??{action:"stop"}:M.onReasoningLoopLimitReached,completionPolicy:ys,consumePendingUserMessage:async()=>{if(this.pendingAtomicDisengage.delete(t)){let ye=await this.sessions.get(t)?.atomicProtocol?.disengage();if(ye)return _c(ye,M.mode)}let P=this.pendingPromptsController.consumeSteer(t);return P?_c(P.prompt,P.mode??M.mode):void 0},describeImages:M.describeImages,alwaysDescribeImages:M.alwaysDescribeImages,logger:re.logger??M.logger,extensionContext:M.extensionContext,onEvent:(P)=>{if(P.type==="iteration_start")be=P.iteration;Te?.observe(P),Vr?.observe(P),this.eventBridge.dispatchAgentEvent(t,M,P)}};rd.hooks={...rd.hooks,onEvent:async(P)=>{if(await A.hooks?.onEvent?.(P),P.type!=="assistant-message")return;let ye=this.sessions.get(t);if(!ye)return;let nt=ye.agent.getMessages();try{await this.invoke("persistSessionMessages",t,nt,M.systemPrompt)}catch(lt){M.logger?.error?.("Failed to persist session messages after assistant response",{sessionId:t,error:lt}),yr(M.telemetry,{component:"core",operation:"session.persist_messages_after_assistant_response",error:lt,severity:"warn",handled:!0,context:{sessionId:t,providerId:M.providerId,modelId:M.modelId}})}}};let od=this.createAgentInstance(rd);if(rd.onEvent)od.subscribeEvents(rd.onEvent);this.sideTurnConfigs.set(t,rd),He(t).messageWaiting=()=>this.sessions.get(t)?.pendingPrompts.some((P)=>P.delivery==="steer"&&P.noteKind!=="queued")===!0,this.leadNudgeUnsubscribes.get(t)?.(),this.leadNudgeUnsubscribes.set(t,n2(t,(P,ye)=>this.nudgeLead(t,P,ye))),this.roundUnsubscribes.get(t)?.();let EJ=He(t);this.roundUnsubscribes.set(t,EJ.onSettled((P)=>this.deliverRound(t,P))),re.registerLeadAgent?.(od);let hk=ui({agentId:od.getAgentId(),conversationId:od.getConversationId(),teamId:re.teamRuntime?.getTeamId(),teamName:re.teamRuntime?.getTeamName(),teamRole:re.teamRuntime?"lead":void 0});if(P3(M,t,n,p,hk),hk)ld(M.telemetry,{ulid:t,modelId:M.modelId,provider:M.providerId,...hk});if(re.teamRuntime)RM(M.telemetry,{ulid:t,teamId:re.teamRuntime.getTeamId(),teamName:re.teamRuntime.getTeamName(),leadAgentId:od.getAgentId(),restoredFromPersistence:re.teamRestoredFromPersistence===!0});let je={sessionId:t,config:M,sessionMetadata:B,...g?{artifacts:g}:{},source:o,startedAt:g?.manifest.started_at??i,updatedAt:g?.manifest.ended_at??g?.manifest.started_at??i,pendingPrompt:m.prompt,runtime:re,revisionLog:j.log,agent:od,started:!1,status:g?.manifest.status??(f?"idle":"running"),aborting:!1,interactive:e.interactive===!0,persistedMessages:a,compactionState:xJ,activeTeamRunIds:new Set,pendingTeamRunUpdates:[],teamRunWaiters:[],pendingPrompts:[],drainingPendingPrompts:!1,...et?{atomicProtocol:et}:{},...me.tools.length>0?{escalation:me}:{},...Y?{pendingAtomicStatus:Y}:{},pluginSandboxShutdown:A.pluginSandboxShutdown,delegatedSandboxesShutdown:async()=>{await C?.closeAll()},submitAndExitObserved:!1,taskCompletedEmitted:!1,lastInteractiveTurnFinishReason:void 0};if(ck=je,je.compactionState&&!this.isCompactionStateForSession(je.sessionId,je.compactionState,je))je.config.logger?.log?.("Ignoring session compaction state for a different conversation",{severity:"warn",sessionId:je.sessionId,conversationId:je.compactionState.conversation_id}),je.compactionState=void 0;this.sessions.set(t,je);for(let P of He(t).list())if(P.status==="done"&&!P.delivered)this.deliverRound(t,{record:P,report:He(t).reportFor(P.id)});if(g)await this.refreshActiveSessionGitMetadata(je,A.gitState);if(a.length>0&&!g)try{await this.ensureSessionPersisted(je),await this.invoke("persistSessionMessages",t,a,je.config.systemPrompt)}catch(P){je.config.logger?.error?.("Failed to persist seeded session messages at start",{sessionId:t,error:P}),yr(je.config.telemetry,{component:"core",operation:"session.persist_seeded_messages",error:P,severity:"warn",handled:!0,context:{sessionId:t,providerId:je.config.providerId,modelId:je.config.modelId}})}this.emitStatus(t,je.status);let eu;try{if(s.prompt?.trim())if(eu=await this.executeTurn(je,{prompt:s.prompt,userImages:s.userImages,userFiles:s.userFiles}),!je.interactive)await this.finalizeSingleRun(je,eu.finishReason);else await this.completeInteractiveTurn(je,eu.finishReason)}catch(P){if(je.interactive&&je.aborting)eu=await this.completeAbortedInteractiveTurn(je);else{yr(je.config.telemetry,{component:"core",operation:"session.start",error:P,severity:"error",handled:!1,context:{sessionId:je.sessionId,providerId:je.config.providerId,modelId:je.config.modelId}});try{await this.failSession(je)}catch(ye){je.config.logger?.error?.("Session failure cleanup threw",{sessionId:je.sessionId,error:ye})}throw P}}return{sessionId:t,manifest:m,manifestPath:h,messagesPath:u,result:eu,resolvedConfig:A.resolvedConfig}}async restoreSession(e){return this.sessionVersioning.restoreCheckpoint({...e,telemetry:this.defaultTelemetry,getSession:(t)=>this.getSession(t),readMessages:(t)=>this.readSessionMessages(t),buildStartInput:(t,n)=>{let r=t.restoredCheckpointMetadata?{...n.sessionMetadata??{},checkpoint:t.restoredCheckpointMetadata}:n.sessionMetadata;return{...n,...r?{sessionMetadata:r}:{},initialMessages:t.initialMessages}},startSession:(t)=>this.startSession(t),getStartedSessionId:(t)=>t.sessionId,cleanupStartedSession:async(t)=>{if(!await this.deleteSession(t.sessionId))throw Error(`Failed to clean up restored session ${t.sessionId}`)},readRestoredSession:(t)=>this.getSession(t)})}answerSteerInSideTurn(e,t,n="user"){let r=e.sessionId,o=this.sideTurnConfigs.get(r);if(!o)return;let s=(this.sideTurns.get(r)??Promise.resolve()).then(async()=>{e.config.logger?.log?.(`[Agents] steer while ${pt.runningIn(r).length} agent(s) run: answering in a side turn`);let d=await MV({sessionId:r,message:t,source:n,messages:e.agent.getMessages(),leadTools:(o.tools??[]).filter((l)=>dP.has(l.name)),createRunner:(l)=>{let c=this.createAgentInstance({...o,tools:l,modelTools:void 0,prepareTurn:void 0,hooks:void 0,extensions:void 0,onEvent:void 0,initialMessages:void 0,consumePendingUserMessage:void 0,requestToolApproval:void 0,toolPolicies:void 0,maxIterations:Bc});return{restore:(u)=>c.restore(u),continue:async(u)=>{let h=await c.continue(u);return{text:h.text,finishReason:h.finishReason}}}}});this.eventBridge.dispatchAgentEvent(r,e.config,{type:"notice",noticeType:"status",displayRole:"status",message:[...n==="system"?[`Agents stuck for a long time:
1482
1482
  ${t}`]:[],`While the agents run: ${d.reply||"(no reply)"}`,...d.actions].join(`
1483
1483
 
1484
1484
  `),metadata:{kind:n==="system"?"lead_nudge_reply":"steer_reply",actions:d.actions}}),this.pendingPromptsController.enqueue(r,{prompt:OV(t,d,n),delivery:"steer",origin:"harness",noteKind:"recap"})});this.sideTurns.set(r,s.catch(()=>{return}))}nudgeLead(e,t,n){let r=this.sessions.get(e);if(!r)return;let o={prompt:t,delivery:"steer",origin:"harness",noteKind:n?.noteKind??"status",...n?.refresh?{refresh:n.refresh}:{}};if(He(e).leadAwaiting){if(this.pendingPromptsController.enqueue(e,o),!n?.quiet)He(e).wakeAwaits();return}if(!n?.quiet&&!r.agent.canStartRun()&&this.sideTurnConfigs.has(e)&&He(e).leadBlocked&&pt.runningIn(e).length>0){this.answerSteerInSideTurn(r,t,"system");return}this.pendingPromptsController.enqueue(e,o)}async runTurn(e){let t=this.getSessionOrThrow(e.sessionId),n=t.agent.canStartRun(),r=e.delivery??(t.interactive&&!n?"queue":void 0);if(t.config.telemetry?.capture({event:"session.input_sent",properties:{sessionId:e.sessionId,promptLength:e.prompt.length,userImageCount:e.userImages?.length??0,userFileCount:e.userFiles?.length??0,delivery:r??"immediate"}}),(r==="queue"||r==="steer")&&e.prompt.trim()===""&&!e.userImages?.length&&!e.userFiles?.length)return;if(r==="steer"&&!n&&He(e.sessionId).leadAwaiting){this.pendingPromptsController.enqueue(e.sessionId,{prompt:e.prompt,mode:e.mode,delivery:r,userImages:e.userImages,userFiles:e.userFiles}),He(e.sessionId).wakeAwaits();return}if(r==="steer"&&!n&&!e.userImages?.length&&!e.userFiles?.length&&this.sideTurnConfigs.has(e.sessionId)&&He(e.sessionId).leadBlocked&&pt.runningIn(e.sessionId).length>0){this.answerSteerInSideTurn(t,e.prompt);return}if(r==="queue"||r==="steer"){this.pendingPromptsController.enqueue(e.sessionId,{prompt:e.prompt,mode:e.mode,delivery:r,userImages:e.userImages,userFiles:e.userFiles});return}try{let o=await this.executeTurn(t,{prompt:e.prompt,mode:e.mode,userImages:e.userImages,userFiles:e.userFiles});if(!t.interactive)await this.finalizeSingleRun(t,o.finishReason);else await this.completeInteractiveTurn(t,o.finishReason);if(o.finishReason!=="error")queueMicrotask(()=>{this.pendingPromptsController.drain(e.sessionId)});return o}catch(o){if(t.interactive&&t.aborting)return await this.completeAbortedInteractiveTurn(t);throw yr(t.config.telemetry,{component:"core",operation:"session.submit",error:o,severity:"error",handled:!1,context:{sessionId:t.sessionId,providerId:t.config.providerId,modelId:t.config.modelId}}),await this.failSession(t),o}}async getAccumulatedUsage(e){let t=ZC(this.usageBySession.get(e)),n=ZC(this.aggregateUsageBySession.get(e));return t||n?{usage:t,aggregateUsage:n}:void 0}async abort(e,t){let n=this.sessions.get(e);if(!n)return;if(n.config.telemetry?.capture({event:"session.aborted",properties:{sessionId:e}}),n.aborting=!0,n.drainingPendingPrompts)this.pendingPromptsController.discardQueue(n);else this.pendingPromptsController.dropHarnessNotes(n);let r=n.runtime.teamRuntime;try{r?.cancelOutstandingWork(t)}finally{if(r)n.activeTeamRunIds.clear(),n.pendingTeamRunUpdates.length=0,$p(n);n.agent.abort(t)}}async proceedWhileRunning(e,t){return this.runCommandExecutionController.proceedWhileRunning(e,t)}async stopSession(e){let t=this.sessions.get(e);if(!t)return;if(t.config.telemetry?.capture({event:"session.stopped",properties:{sessionId:e}}),t.interactive&&!Kt(t.status)){await this.releaseSessionRuntime(t,"session_stop");return}if(t.interactive&&t.agent.canStartRun()){await this.shutdownSession(t,{status:this.resolveInteractiveStopStatus(t),exitCode:this.resolveInteractiveStopExitCode(t),shutdownReason:"session_stop",endReason:"stopped"});return}t.aborting=!0,t.agent.abort(Error("session_stop")),await this.shutdownSession(t,{status:"cancelled",exitCode:0,shutdownReason:"session_stop",endReason:"stopped"})}async dispose(e="session_manager_dispose"){let t=[...this.sessions.values()];if(t.length===0)return;await Promise.allSettled(t.map((n)=>n.interactive&&!Kt(n.status)?this.releaseSessionRuntime(n,e):n.interactive&&n.agent.canStartRun()?this.shutdownSession(n,{status:this.resolveInteractiveStopStatus(n),exitCode:this.resolveInteractiveStopExitCode(n),shutdownReason:e,endReason:"disposed"}):this.shutdownSession(n,{status:"cancelled",exitCode:0,shutdownReason:e,endReason:"disposed"}))),this.usageBySession.clear(),this.aggregateUsageBySession.clear()}async getSession(e){let t=this.sessions.get(e);if(t)return tP(t);let n=e.trim();if(!n)return;let r=await this.getRow(n);if(r)return ub(r);let o=await this.readManifest(n);return o?TV(o):void 0}async listSessions(e=200,t={}){let r=(await this.listRows(e,t)).map(ub),o=new Set(r.map((i)=>i.sessionId));for(let i of this.sessions.values()){if(o.has(i.sessionId))continue;r.unshift(tP(i))}return r.slice(0,e)}async deleteSession(e){if(this.sessions.has(e))await this.stopSession(e);let t=await this.invoke("deleteSession",e);if(t.deleted)this.usageBySession.delete(e),this.aggregateUsageBySession.delete(e);return t.deleted}async updateSession(e,t){let n=await this.invokeOptionalValue("updateSession",{sessionId:e,prompt:t.prompt,metadata:t.metadata,title:t.title}),r=n?.updated===!0;if(r&&n.metadata!==void 0){let o=this.sessions.get(e.trim());if(o){if(o.sessionMetadata=n.metadata??void 0,o.artifacts)o.artifacts.manifest.metadata=o.sessionMetadata}}return{updated:r}}async updateSessionCompactionState(e,t){let n=e.trim();if(!n)return{updated:!1};let r=this.sessions.get(n),o=r?void 0:await this.getSession(n);if(!(r??o))return{updated:!1};if(r){let a=await this.readSessionMessages(n),d=t.source_message_count>0&&a.length>=t.source_message_count,l=d?a:void 0;if(d){if(!await this.canPersistCompactionState(n,t,r,void 0,a))return{updated:!1};r.agent.restore(a)}return await this.persistActiveSessionCompactionState(r,t,l)}if(!await this.canPersistCompactionState(n,t,void 0,o))return{updated:!1};let s=await this.invokeOptionalValue("readSessionCompactionState",n);if($V(t,s))return{updated:!1};return await this.invoke("persistSessionCompactionState",n,t),{updated:!0}}async readSessionCompactionState(e){let t=e.trim();if(!t)return;let n=this.sessions.get(t);if(n)for(;;){let r=n.compactionStateWriteQueue;if(!r)return n.compactionState;await r.catch(()=>{return})}return await this.invokeOptionalValue("readSessionCompactionState",t)}isCompactionStateForSession(e,t,n,r){let o=t.conversation_id?.trim();if(!o)return!0;if(o===e)return!0;let i=n?.agent.getConversationId()?.trim()||r?.conversationId?.trim();return i?o===i:!1}async canPersistCompactionState(e,t,n,r,o){if(!t.conversation_id?.trim())return!1;if(!this.isCompactionStateForSession(e,t,n,r))return!1;let i=o??n?.agent.getMessages()??await this.readSessionMessages(e);return gu(t,i)!==void 0}async persistActiveSessionCompactionState(e,t,n){if(!await this.canPersistCompactionState(e.sessionId,t,e,void 0,n))return{updated:!1};return await this.enqueueCompactionStateWrite(e,async()=>{let r=e.compactionState,o=r!==void 0&&gu(r,n??e.agent.getMessages())!==void 0;if(r&&(o?$V(t,r):Date.parse(t.updated_at)<Date.parse(r.updated_at)))return{updated:!1};return await this.invoke("persistSessionCompactionState",e.sessionId,t),e.compactionState=t,{updated:!0}})}async enqueueCompactionStateWrite(e,t){let r=(e.compactionStateWriteQueue??Promise.resolve()).catch(()=>{return}).then(t),o=r.then(()=>{return},()=>{return});e.compactionStateWriteQueue=o;try{return await r}finally{if(e.compactionStateWriteQueue===o)e.compactionStateWriteQueue=void 0}}async listConfiguredAgents(e){let t=this.sessions.get(e.trim());return Ra(t?.runtime.configuredAgents)}async delegateToConfiguredAgent(e){let t=e.sessionId.trim(),n=this.sessions.get(t);if(!n)throw Error("There is no running session to delegate from. Start a task first.");if(!n.agent.canStartRun())throw Error("Cannot delegate while a response is in progress. Wait for the current turn to finish, or abort it.");let r=await cp({agents:n.runtime.configuredAgents,tools:n.runtime.tools,agentName:e.agentName,prompt:e.prompt,sessionId:t,parentAgentId:n.agent.getAgentId(),conversationId:n.agent.getConversationId(),signal:e.signal}),o=n.agent.getMessages();return n.agent.restore([...o,{role:"user",content:sb(r,e.prompt)}]),r}async startBackgroundDelegation(e){let t=e.sessionId.trim(),n=this.sessions.get(t);if(!n)throw Error("There is no running session to delegate from. Start a task first.");return bR(this.backgroundDelegationsFor(t),{agents:n.runtime.configuredAgents,tools:n.runtime.tools,agentName:e.agentName,prompt:e.prompt,sessionId:t,parentAgentId:n.agent.getAgentId(),conversationId:n.agent.getConversationId(),onSettled:(r)=>{this.deliverBackgroundDelegation(t,r)}})}async listBackgroundDelegations(e){return this.backgroundDelegations.get(e.trim())?.list()??[]}async controlBackgroundDelegation(e){let t=this.backgroundDelegations.get(e.sessionId.trim());if(!t)return!1;if(e.action==="pause")return t.pause(e.id);if(e.action==="resume")return t.resume(e.id);return t.stop(e.id)}backgroundDelegationsFor(e){let t=this.backgroundDelegations.get(e);if(t)return t;let n=wR();return this.backgroundDelegations.set(e,n),n}async disengageAtomicProtocol(e){let t=this.sessions.get(e),n=t?.atomicProtocol;if(!t||!n||n.disengaged)return!1;if(t.agent.canStartRun()){let r=await n.disengage();if(r)t.agent.restore([...t.agent.getMessages(),{role:"user",content:r}]);return!0}return this.pendingAtomicDisengage.add(e),!0}deliverRound(e,t){let n=this.sessions.get(e);if(!n)return;He(e).markDelivered(t.record.id);let r=E2(t);if(n.agent.canStartRun()){n.agent.restore([...n.agent.getMessages(),{role:"user",content:r}]);return}this.pendingPromptsController.enqueue(e,{prompt:r,delivery:"steer",origin:"harness"})}deliverBackgroundDelegation(e,t){let n=t.result?sb(t.result,t.prompt):`The background delegation to "${t.agentName}" failed: ${t.error??"no reason given"}
@@ -1551,7 +1551,7 @@ ${d}`:d,t.mode??e.config.mode),c=this.resolveAbsoluteFilePaths(e.config.cwd,t.us
1551
1551
  provider, model, cwd, workspace_root, team_name, enable_tools, enable_spawn, enable_teams,
1552
1552
  parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent, prompt,
1553
1553
  metadata_json, transcript_path, hook_path, messages_path, updated_at
1554
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[e.sessionId,e.source,e.pid,e.startedAt,null,null,"running",0,e.interactive?1:0,e.provider,e.model,e.cwd,e.workspaceRoot,e.teamName??null,e.enableTools?1:0,e.enableSpawn?1:0,e.enableTeams?1:0,null,null,null,null,0,e.prompt??null,e.metadata?JSON.stringify(e.metadata):null,"","",e.messagesPath,ft()])}}function x$e(e){return{text:e.text,usage:e.usage,inputTokens:e.usage.inputTokens,outputTokens:e.usage.outputTokens,iterations:e.iterations,finishReason:e.finishReason,toolCalls:e.toolCalls.map((t)=>({name:t.name,input:t.input,output:t.output,error:t.error,durationMs:t.durationMs}))}}function _$e(e){return e.mode==="plan"?"plan":e.mode==="yolo"?"yolo":"act"}function GV(e={}){let t=async(r)=>r,n=new dm({sessionService:new hm(new um),capabilities:{toolExecutors:{submit:t}},fetch:e.fetch,telemetry:e.telemetry});return{async startSession(r,o){let i=(r.cwd?.trim()||r.workspaceRoot).trim(),s=await n.startSession({source:Gt.CORE,mode:"automation",sessionMetadata:Gn(o?.sessionMetadata,{mode:"automation",trigger:r.source}),interactive:!1,config:{providerId:S$e(r.provider),modelId:r.model,apiKey:r.apiKey?.trim()||void 0,cwd:i,workspaceRoot:r.workspaceRoot,systemPrompt:r.systemPrompt??"",mode:_$e(r),maxIterations:r.maxIterations,enableTools:r.enableTools!==!1,enableSpawnAgent:r.enableSpawn!==!1,enableAgentTeams:r.enableTeams!==!1,disableMcpSettingsTools:r.disableMcpSettingsTools,agentPluginPaths:r.agentPluginPaths,missionLogIntervalSteps:r.missionStepInterval,missionLogIntervalMs:r.missionTimeIntervalMs},toolPolicies:r.toolPolicies??{"*":{autoApprove:r.autoApproveTools!==!1}},localRuntime:{configExtensions:r.configExtensions}});return{sessionId:s.sessionId,startResult:{sessionId:s.sessionId,manifestPath:s.manifestPath,messagesPath:s.messagesPath}}},async sendSession(r,o){let i=await n.runTurn({sessionId:r,prompt:o.prompt,userImages:o.attachments?.userImages,userFiles:o.attachments?.userFiles?.map((s)=>s.content)});if(!i)throw Error("local hub schedule runtime returned no turn result");return{result:x$e(i)}},async abortSession(r){return await n.abort(r,Error("hub schedule abort")),{applied:!0}},async stopSession(r){return await n.stopSession(r),{applied:!0}}}}import{CLINE_HUB_DEV_PORT as E$e,CLINE_HUB_PORT as A$e,resolveClineBuildEnv as R$e}from"@cerebriline/shared";var I$e="CLINE_HUB_HOST",C$e="CLINE_HUB_PORT",P$e="CLINE_HUB_PATHNAME",M$e="127.0.0.1",O$e=A$e,L$e="/hub";function VV(e){return R$e(e)==="development"?E$e:O$e}function N$e(e={}){return(e.env??process.env)[I$e]?.trim()||M$e}function fP(e={}){let n=(e.env??process.env)[C$e]?.trim();if(!n)return VV(e);let r=Number.parseInt(n,10);if(!Number.isInteger(r)||r<1||r>65535)return VV(e);return r}function D$e(e={}){return(e.env??process.env)[P$e]?.trim()||L$e}function gP(e={},t={}){return{host:e.host??N$e(t),port:e.port??fP(t),pathname:e.pathname??D$e(t)}}import{chmodSync as $$e,existsSync as F$e,mkdirSync as U$e}from"node:fs";import{dirname as B$e}from"node:path";import{loadSqliteDb as H$e}from"@cerebriline/shared/db";var YV=3;class XV extends Error{lockFile;constructor(e){super(`Hub instance lock is held by a live Hub: ${e}. Connect to the running Hub or diagnose it; never replace it.`);this.name="HubLockHeldError",this.lockFile=e}}function pm(e){return e instanceof Error&&e.name==="HubLockHeldError"}function JV(e){return`${e}.instance.lock`}class Hc{db;lockFile;constructor(e,t){this.lockFile=e,this.db=t}get held(){return this.db!==void 0}release(){let e=this.db;if(!e)return;this.db=void 0;try{e.exec("ROLLBACK;")}catch{}e.close?.()}static acquire(e){let t=!1,n;try{U$e(B$e(e),{recursive:!0}),t=F$e(e),n=H$e(e)}catch{return new Hc(e,void 0)}try{n.exec("PRAGMA busy_timeout = 0;"),n.exec("BEGIN EXCLUSIVE;")}catch(r){if(n.close?.(),W$e(r))throw new XV(e);return new Hc(e,void 0)}if(!t)try{$$e(e,384)}catch{}return new Hc(e,n)}}function W$e(e){let t=e instanceof Error?e.message:String(e),n=e?.code;return n==="SQLITE_BUSY"||n==="SQLITE_LOCKED"||t.includes("SQLITE_BUSY")||t.includes("SQLITE_LOCKED")||t.includes("database is locked")}import{join as iFe}from"node:path";import{createHash as j$e,randomBytes as t5}from"node:crypto";import{mkdir as wP,open as QV,readFile as n5,rename as q$e,rm as bP,writeFile as z$e}from"node:fs/promises";import{dirname as r5,join as vP}from"node:path";import{ensureLoopbackProxyBypass as K$e,isHubProtocolCompatible as myt}from"@cerebriline/shared";import{resolveClineDataDir as Ov,resolveClineDir as gyt}from"@cerebriline/shared/storage";var G$e="CLINE_HUB_DISCOVERY_PATH",V$e="CLINE_HUB_BUILD_ID",Y$e="CLINE_HUB_BUILD_EPOCH_MS",X$e=30000,J$e=15000,ZV=100;function Q$e(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function Z$e(e){return j$e("sha256").update(e).digest("hex").slice(0,12)}function eFe(e){if(!Number.isInteger(e)||!e||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return t instanceof Error&&"code"in t?String(t.code)==="EPERM":!1}}function o5(){return t5(32).toString("hex")}function e5(e){return new Promise((t)=>setTimeout(t,e))}function tFe(e){return`${e}.lock`}async function nFe(e){try{let t=JSON.parse(await n5(vP(e,"owner.json"),"utf8"));if(typeof t.pid!=="number"||typeof t.acquiredAt!=="string")return;return{pid:t.pid,acquiredAt:t.acquiredAt}}catch{return}}async function yP(e){await bP(e,{recursive:!0,force:!0}).catch(()=>{return})}function mm(){let e=process.env[V$e]?.trim();if(e)return e;return"sdk-v1-f2f0db7505d8b31008a0c3cbda44bf0771b736cd5527923680498f356a0bafc8".trim()||`source-${String(nc.version)}`}function i5(){let e=Number(process.env[Y$e]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1792858200072)?1792858200072:void 0}function Lv(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${Z$e(e)}`,n=process.env[G$e]?.trim()||vP(Ov(),"locks","hub","owners",`${Q$e(t)}.json`);return{ownerId:t,discoveryPath:n}}async function Nv(e){try{let t=JSON.parse(await n5(e,"utf8"));if(typeof t.hubId!=="string"||typeof t.protocolVersion!=="string"||typeof t.authToken!=="string"||typeof t.host!=="string"||typeof t.port!=="number"||typeof t.url!=="string"||typeof t.startedAt!=="string"||typeof t.updatedAt!=="string")return;return{hubId:t.hubId,protocolVersion:t.protocolVersion,minClientProtocolVersion:typeof t.minClientProtocolVersion==="string"?t.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof t.maxClientProtocolVersion==="string"?t.maxClientProtocolVersion:void 0,capabilities:Array.isArray(t.capabilities)?t.capabilities.filter((n)=>typeof n==="string"):void 0,coreVersion:typeof t.coreVersion==="string"?t.coreVersion:void 0,buildId:typeof t.buildId==="string"?t.buildId:void 0,buildEpochMs:typeof t.buildEpochMs==="number"?t.buildEpochMs:void 0,authToken:t.authToken,host:t.host,port:t.port,url:t.url,pid:typeof t.pid==="number"?t.pid:void 0,startedAt:t.startedAt,updatedAt:t.updatedAt}}catch{return}}async function kP(e,t,n){await a5(e,async()=>{let r=r5(e);await wP(r,{recursive:!0});let o=`${e}.${process.pid}.${t5(6).toString("hex")}.tmp`,i;try{i=await QV(o,"wx",384),await i.writeFile(`${JSON.stringify(t,null,2)}
1554
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[e.sessionId,e.source,e.pid,e.startedAt,null,null,"running",0,e.interactive?1:0,e.provider,e.model,e.cwd,e.workspaceRoot,e.teamName??null,e.enableTools?1:0,e.enableSpawn?1:0,e.enableTeams?1:0,null,null,null,null,0,e.prompt??null,e.metadata?JSON.stringify(e.metadata):null,"","",e.messagesPath,ft()])}}function x$e(e){return{text:e.text,usage:e.usage,inputTokens:e.usage.inputTokens,outputTokens:e.usage.outputTokens,iterations:e.iterations,finishReason:e.finishReason,toolCalls:e.toolCalls.map((t)=>({name:t.name,input:t.input,output:t.output,error:t.error,durationMs:t.durationMs}))}}function _$e(e){return e.mode==="plan"?"plan":e.mode==="yolo"?"yolo":"act"}function GV(e={}){let t=async(r)=>r,n=new dm({sessionService:new hm(new um),capabilities:{toolExecutors:{submit:t}},fetch:e.fetch,telemetry:e.telemetry});return{async startSession(r,o){let i=(r.cwd?.trim()||r.workspaceRoot).trim(),s=await n.startSession({source:Gt.CORE,mode:"automation",sessionMetadata:Gn(o?.sessionMetadata,{mode:"automation",trigger:r.source}),interactive:!1,config:{providerId:S$e(r.provider),modelId:r.model,apiKey:r.apiKey?.trim()||void 0,cwd:i,workspaceRoot:r.workspaceRoot,systemPrompt:r.systemPrompt??"",mode:_$e(r),maxIterations:r.maxIterations,enableTools:r.enableTools!==!1,enableSpawnAgent:r.enableSpawn!==!1,enableAgentTeams:r.enableTeams!==!1,disableMcpSettingsTools:r.disableMcpSettingsTools,agentPluginPaths:r.agentPluginPaths,missionLogIntervalSteps:r.missionStepInterval,missionLogIntervalMs:r.missionTimeIntervalMs},toolPolicies:r.toolPolicies??{"*":{autoApprove:r.autoApproveTools!==!1}},localRuntime:{configExtensions:r.configExtensions}});return{sessionId:s.sessionId,startResult:{sessionId:s.sessionId,manifestPath:s.manifestPath,messagesPath:s.messagesPath}}},async sendSession(r,o){let i=await n.runTurn({sessionId:r,prompt:o.prompt,userImages:o.attachments?.userImages,userFiles:o.attachments?.userFiles?.map((s)=>s.content)});if(!i)throw Error("local hub schedule runtime returned no turn result");return{result:x$e(i)}},async abortSession(r){return await n.abort(r,Error("hub schedule abort")),{applied:!0}},async stopSession(r){return await n.stopSession(r),{applied:!0}}}}import{CLINE_HUB_DEV_PORT as E$e,CLINE_HUB_PORT as A$e,resolveClineBuildEnv as R$e}from"@cerebriline/shared";var I$e="CLINE_HUB_HOST",C$e="CLINE_HUB_PORT",P$e="CLINE_HUB_PATHNAME",M$e="127.0.0.1",O$e=A$e,L$e="/hub";function VV(e){return R$e(e)==="development"?E$e:O$e}function N$e(e={}){return(e.env??process.env)[I$e]?.trim()||M$e}function fP(e={}){let n=(e.env??process.env)[C$e]?.trim();if(!n)return VV(e);let r=Number.parseInt(n,10);if(!Number.isInteger(r)||r<1||r>65535)return VV(e);return r}function D$e(e={}){return(e.env??process.env)[P$e]?.trim()||L$e}function gP(e={},t={}){return{host:e.host??N$e(t),port:e.port??fP(t),pathname:e.pathname??D$e(t)}}import{chmodSync as $$e,existsSync as F$e,mkdirSync as U$e}from"node:fs";import{dirname as B$e}from"node:path";import{loadSqliteDb as H$e}from"@cerebriline/shared/db";var YV=3;class XV extends Error{lockFile;constructor(e){super(`Hub instance lock is held by a live Hub: ${e}. Connect to the running Hub or diagnose it; never replace it.`);this.name="HubLockHeldError",this.lockFile=e}}function pm(e){return e instanceof Error&&e.name==="HubLockHeldError"}function JV(e){return`${e}.instance.lock`}class Hc{db;lockFile;constructor(e,t){this.lockFile=e,this.db=t}get held(){return this.db!==void 0}release(){let e=this.db;if(!e)return;this.db=void 0;try{e.exec("ROLLBACK;")}catch{}e.close?.()}static acquire(e){let t=!1,n;try{U$e(B$e(e),{recursive:!0}),t=F$e(e),n=H$e(e)}catch{return new Hc(e,void 0)}try{n.exec("PRAGMA busy_timeout = 0;"),n.exec("BEGIN EXCLUSIVE;")}catch(r){if(n.close?.(),W$e(r))throw new XV(e);return new Hc(e,void 0)}if(!t)try{$$e(e,384)}catch{}return new Hc(e,n)}}function W$e(e){let t=e instanceof Error?e.message:String(e),n=e?.code;return n==="SQLITE_BUSY"||n==="SQLITE_LOCKED"||t.includes("SQLITE_BUSY")||t.includes("SQLITE_LOCKED")||t.includes("database is locked")}import{join as iFe}from"node:path";import{createHash as j$e,randomBytes as t5}from"node:crypto";import{mkdir as wP,open as QV,readFile as n5,rename as q$e,rm as bP,writeFile as z$e}from"node:fs/promises";import{dirname as r5,join as vP}from"node:path";import{ensureLoopbackProxyBypass as K$e,isHubProtocolCompatible as myt}from"@cerebriline/shared";import{resolveClineDataDir as Ov,resolveClineDir as gyt}from"@cerebriline/shared/storage";var G$e="CLINE_HUB_DISCOVERY_PATH",V$e="CLINE_HUB_BUILD_ID",Y$e="CLINE_HUB_BUILD_EPOCH_MS",X$e=30000,J$e=15000,ZV=100;function Q$e(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function Z$e(e){return j$e("sha256").update(e).digest("hex").slice(0,12)}function eFe(e){if(!Number.isInteger(e)||!e||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return t instanceof Error&&"code"in t?String(t.code)==="EPERM":!1}}function o5(){return t5(32).toString("hex")}function e5(e){return new Promise((t)=>setTimeout(t,e))}function tFe(e){return`${e}.lock`}async function nFe(e){try{let t=JSON.parse(await n5(vP(e,"owner.json"),"utf8"));if(typeof t.pid!=="number"||typeof t.acquiredAt!=="string")return;return{pid:t.pid,acquiredAt:t.acquiredAt}}catch{return}}async function yP(e){await bP(e,{recursive:!0,force:!0}).catch(()=>{return})}function mm(){let e=process.env[V$e]?.trim();if(e)return e;return"sdk-v1-7aeb4eb239b55d469dc974d2695c3cec7d1ab6c26bd86dfce969feab30fbb6ce".trim()||`source-${String(nc.version)}`}function i5(){let e=Number(process.env[Y$e]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1792903650677)?1792903650677:void 0}function Lv(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${Z$e(e)}`,n=process.env[G$e]?.trim()||vP(Ov(),"locks","hub","owners",`${Q$e(t)}.json`);return{ownerId:t,discoveryPath:n}}async function Nv(e){try{let t=JSON.parse(await n5(e,"utf8"));if(typeof t.hubId!=="string"||typeof t.protocolVersion!=="string"||typeof t.authToken!=="string"||typeof t.host!=="string"||typeof t.port!=="number"||typeof t.url!=="string"||typeof t.startedAt!=="string"||typeof t.updatedAt!=="string")return;return{hubId:t.hubId,protocolVersion:t.protocolVersion,minClientProtocolVersion:typeof t.minClientProtocolVersion==="string"?t.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof t.maxClientProtocolVersion==="string"?t.maxClientProtocolVersion:void 0,capabilities:Array.isArray(t.capabilities)?t.capabilities.filter((n)=>typeof n==="string"):void 0,coreVersion:typeof t.coreVersion==="string"?t.coreVersion:void 0,buildId:typeof t.buildId==="string"?t.buildId:void 0,buildEpochMs:typeof t.buildEpochMs==="number"?t.buildEpochMs:void 0,authToken:t.authToken,host:t.host,port:t.port,url:t.url,pid:typeof t.pid==="number"?t.pid:void 0,startedAt:t.startedAt,updatedAt:t.updatedAt}}catch{return}}async function kP(e,t,n){await a5(e,async()=>{let r=r5(e);await wP(r,{recursive:!0});let o=`${e}.${process.pid}.${t5(6).toString("hex")}.tmp`,i;try{i=await QV(o,"wx",384),await i.writeFile(`${JSON.stringify(t,null,2)}
1555
1555
  `,{encoding:"utf8"}),await i.sync(),await i.close(),i=void 0,n?.beforePublish?.(),await q$e(o,e);let s;try{s=await QV(r,"r"),await s.sync()}catch{}finally{await s?.close().catch(()=>{return})}}catch(s){throw await i?.close().catch(()=>{return}),await bP(o,{force:!0}).catch(()=>{return}),s}})}async function s5(e,t){return await a5(e,async()=>{if((await Nv(e))?.hubId!==t)return!1;return await bP(e,{force:!0}),!0})}async function rFe(e,t,n){let r=tFe(e);await wP(r5(r),{recursive:!0});let o=Date.now()+J$e;while(!0){try{await wP(r,{recursive:!1})}catch(i){if((i instanceof Error&&"code"in i?String(i.code):"")!=="EEXIST")throw i;let a=await nFe(r);if(!a){if(Date.now()>=o){await yP(r);continue}await e5(ZV);continue}let d=Date.now()-Date.parse(a.acquiredAt);if(!eFe(a.pid)||d>X$e){await yP(r);continue}if(Date.now()>=o)throw Error(`Timed out waiting for hub ${t} lock ${r}`);await e5(ZV);continue}try{return await z$e(vP(r,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
1556
1556
  `,"utf8"),await n()}finally{await yP(r)}}}function a5(e,t){return rFe(`${e}.mutation`,"discovery mutation",t)}async function fm(e,t){K$e();try{let n=await fetch(t?.authToken?oFe(e):d5(e),{headers:t?.authToken?{authorization:`Bearer ${t.authToken}`}:void 0,signal:t?.signal});if(!n.ok)return;let r=await n.json();if(typeof r.protocolVersion!=="string"||typeof r.host!=="string"||typeof r.port!=="number"||typeof r.url!=="string")return;return{protocolVersion:r.protocolVersion,minClientProtocolVersion:typeof r.minClientProtocolVersion==="string"?r.minClientProtocolVersion:void 0,maxClientProtocolVersion:typeof r.maxClientProtocolVersion==="string"?r.maxClientProtocolVersion:void 0,capabilities:Array.isArray(r.capabilities)?r.capabilities.filter((o)=>typeof o==="string"):void 0,coreVersion:typeof r.coreVersion==="string"?r.coreVersion:void 0,buildId:typeof r.buildId==="string"?r.buildId:void 0,buildEpochMs:typeof r.buildEpochMs==="number"?r.buildEpochMs:void 0,host:r.host,port:r.port,url:r.url,hubId:typeof r.hubId==="string"?r.hubId:void 0,authToken:typeof r.authToken==="string"?r.authToken:void 0,pid:typeof r.pid==="number"?r.pid:void 0,startedAt:typeof r.startedAt==="string"?r.startedAt:void 0,updatedAt:typeof r.updatedAt==="string"?r.updatedAt:void 0}}catch{return}}function Wc(e,t,n="/hub"){return new URL(`ws://${e}:${t}${n}`).toString()}function d5(e){let t=new URL(e);return t.protocol=t.protocol==="wss:"?"https:":"http:",t.pathname="/health",t.search="",t.toString()}function oFe(e){let t=new URL(d5(e));return t.pathname="/status",t.toString()}var sFe="shared:cline",aFe="CLINE_HUB_DISCOVERY_PATH",dFe="hub-production";function Dv(e=sFe){return Lv(`${e}@${mm()}`)}function $v(){return{ownerId:dFe,discoveryPath:process.env[aFe]?.trim()||iFe(Ov(),"locks","hub","production.json")}}function lFe(e){if(typeof e==="string")return e.trim()||void 0;if(!Array.isArray(e))return;return e.map((n)=>{if(n&&typeof n==="object"&&"type"in n&&n.type==="text"&&"text"in n&&typeof n.text==="string")return n.text.trim();return""}).filter(Boolean).join(`
1557
1557
  `).trim()||void 0}var l5=120,TP="...";function SP(e){let t=e.trim();if(!t)return"";if(Buffer.byteLength(t,"utf8")<=l5)return t;let n=l5-Buffer.byteLength(TP,"utf8");if(n<=0)return TP;let r="";for(let o of t){if(Buffer.byteLength(r+o,"utf8")>n)break;r+=o}return`${r}${TP}`}async function c5(e){let t=e?.sessionId?.trim()||"unknown",n=typeof e?.metadata?.messagesPath==="string"?e.metadata.messagesPath:void 0,o=[...await Uc(n)].reverse().find((d)=>d.role==="assistant"),i=o?lFe(o.content):void 0,s=e?.workspaceRoot?.trim()||"workspace",a=typeof e?.metadata?.prompt==="string"?e.metadata.prompt.trim():s;return{title:`Task completed (${t})`,body:SP(i&&i.length>0?i:a.length>0?a:s),severity:"info"}}import{resolve as LHe}from"node:path";import{CLINE_DEFAULT_MODEL_ID as NHe,captureSdkError as rk,createSessionId as P0,HUB_CLIENT_TOOL_APPROVAL_CAPABILITY as DHe}from"@cerebriline/shared";import{isChatWorkspacePath as $He}from"@cerebriline/shared/storage";function gm(e){return!!e&&typeof e==="object"&&!Array.isArray(e)}function xP(e){let t=e?.trim();return t?t:void 0}function cFe(e,t){let n=e?.trim();if(!n)return t;let r=Date.parse(n);if(!Number.isFinite(r))return t;return new Date(r).toISOString()}function u5(e,t){return new Date(new Date(e).getTime()+Math.max(0,Math.floor(t))*1000).toISOString()}function h5(e,t){return new Date(new Date(e).getTime()-Math.max(0,Math.floor(t))*1000).toISOString()}function uFe(e,t){if(!e)return t;return new Date(e).getTime()>=new Date(t).getTime()?e:t}function hFe(e,t){let n=e.eventId.trim(),r=e.eventType.trim(),o=e.source.trim(),i=xP(e.subject),s=xP(e.dedupeKey)??`${r}:${o}:${i??n}`;return{eventId:n,eventType:r,source:o,subject:i,occurredAt:cFe(e.occurredAt,t),workspaceRoot:xP(e.workspaceRoot),payload:gm(e.payload)?e.payload:void 0,attributes:gm(e.attributes)?e.attributes:void 0,dedupeKey:s}}function _P(e,t){if(!t)return;let n=t.split("."),r=e;for(let o of n){if(!gm(r))return;r=r[o]}return r}function pFe(e,t){if(e.attributes&&Object.hasOwn(e.attributes,t))return e.attributes[t];if(e.payload&&Object.hasOwn(e.payload,t))return e.payload[t];let n={eventId:e.eventId,eventType:e.eventType,source:e.source,subject:e.subject,occurredAt:e.occurredAt,workspaceRoot:e.workspaceRoot,dedupeKey:e.dedupeKey,attributes:e.attributes,payload:e.payload},r=_P(n,t);if(r!==void 0)return r;if(e.attributes){let o=_P(e.attributes,t);if(o!==void 0)return o}if(e.payload)return _P(e.payload,t);return}function Fv(e,t){if(Array.isArray(t))return t.some((n)=>Fv(e,n));if(Array.isArray(e))return e.some((n)=>Fv(n,t));if(gm(t)){if(!gm(e))return!1;return Object.entries(t).every(([n,r])=>Fv(e[n],r))}return Object.is(e,t)}function mFe(e,t){if(!t||Object.keys(t).length===0)return!0;return Object.entries(t).every(([n,r])=>Fv(pFe(e,n),r))}class EP{store;nowFn;logger;constructor(e){this.store=e.store,this.nowFn=e.now??(()=>Date.now()),this.logger=e.logger}ingestEvent(e){let t=new Date(this.nowFn()).toISOString(),n=hFe(e,t);try{let r=this.store.eventTransaction(()=>this.materializeEvent(n,t));return this.logger?.debug(r.duplicate?"cron.event.duplicate":"cron.event.processed",{eventId:r.event.eventId,eventType:r.event.eventType,source:r.event.source,status:r.event.processingStatus,matchedSpecCount:r.event.matchedSpecCount,queuedRunCount:r.event.queuedRunCount}),r}catch(r){throw this.logger?.error?.("cron.event.failed",{eventId:n.eventId,eventType:n.eventType,error:r}),r}}materializeEvent(e,t){let n=this.store.insertEventLog(e,{receivedAtIso:t});if(!n.created)return{event:n.record,duplicate:!0,matchedSpecs:[],queuedRuns:[],suppressions:[{reason:"duplicate_event",dedupeKey:n.record.dedupeKey}]};let r=this.store.listEventSpecsForType(e.eventType),o=[],i=[],s=[];for(let l of r){if(!mFe(e,l.filters)){o.push({specId:l.specId,externalId:l.externalId,reason:"filter_mismatch",dedupeKey:e.dedupeKey});continue}i.push(l);let c=this.materializeForSpec(l,e,n.record.receivedAt);if(c.run)s.push(c.run);else o.push({specId:l.specId,externalId:l.externalId,reason:c.reason,dedupeKey:e.dedupeKey})}let a=i.length===0?"unmatched":s.length>0?"queued":"suppressed";return this.store.updateEventLogProcessing(n.record.eventId,{status:a,matchedSpecCount:i.length,queuedRunCount:s.length,suppressedCount:o.filter((l)=>l.reason!=="filter_mismatch").length}),{event:this.store.getEventLog(n.record.eventId)??n.record,duplicate:!1,matchedSpecs:i,queuedRuns:s,suppressions:o}}materializeForSpec(e,t,n){let r=t.dedupeKey??t.eventId,o=e.debounceSeconds??0;if(o>0){let d=this.store.findQueuedEventRunForDedupe({specId:e.specId,dedupeKey:r});if(d){let l=uFe(d.scheduledFor,u5(n,o)),c=this.store.updateQueuedEventRunForDebounce({runId:d.runId,triggerEventId:t.eventId,scheduledFor:l});if(c)return{run:c,reason:"dedupe_window"}}}let i=e.dedupeWindowSeconds??0;if(i>0&&this.store.hasRecentEventRunForDedupe({specId:e.specId,dedupeKey:r,sinceIso:h5(n,i)}))return{reason:"dedupe_window"};let s=e.cooldownSeconds??0;if(s>0&&this.store.hasRecentEventRunForSpec({specId:e.specId,sinceIso:h5(n,s)}))return{reason:"cooldown"};return{run:this.store.enqueueRun({specId:e.specId,specRevision:e.revision,triggerKind:"event",triggerEventId:t.eventId,scheduledFor:o>0?u5(n,o):n}),reason:"dedupe_window"}}}class ym{store;nowFn;constructor(e){this.store=e.store,this.nowFn=e.now??(()=>Date.now())}materializeAll(){let e={oneOffQueued:0,scheduleQueued:0},t=this.store.listSpecs({triggerKind:"one_off",enabled:!0,parseStatus:"valid"});for(let r of t)if(this.materializeOneOff(r))e.oneOffQueued+=1;let n=this.store.listSpecs({triggerKind:"schedule",enabled:!0,parseStatus:"valid"});for(let r of n)try{if(this.materializeSchedule(r))e.scheduleQueued+=1}catch{}return e}materializeOneOff(e){if(e.triggerKind!=="one_off")return!1;if(!e.enabled||e.removed)return!1;if(this.store.hasConsumedOneOffRevision(e.specId,e.revision))return!1;return this.store.enqueueRun({specId:e.specId,specRevision:e.revision,triggerKind:"one_off",scheduledFor:e.nextRunAt??new Date(this.nowFn()).toISOString()}),!0}materializeSchedule(e){if(e.triggerKind!=="schedule")return!1;if(!e.enabled||e.removed)return!1;if(!e.scheduleExpr)return!1;return this.store.materializeDueScheduleRun({specId:e.specId,nowMs:this.nowFn()}).queued}}import{basename as _Fe}from"node:path";import{buildClineSystemPrompt as EFe}from"@cerebriline/shared";import{nowIso as y5}from"@cerebriline/shared/db";import{mkdirSync as fFe,writeFileSync as gFe}from"node:fs";import{isAbsolute as yFe,join as m5}from"node:path";import{resolveCronReportsDir as wFe,resolveCronSpecsDir as bFe}from"@cerebriline/shared/storage";function us(e){if(/[:#\n]/.test(e)||e.includes('"'))return JSON.stringify(e);return e}function wr(e,t){if(t===void 0||t===null)return;return`${e}: ${us(t)}`}function f5(e){let t=0;for(let r of e.matchAll(/`+/g))t=Math.max(t,r[0].length);let n="`".repeat(Math.max(3,t+1));return`${n}
@@ -2080,9 +2080,9 @@ ${e.instructions.trim()}
2080
2080
  ${t.length?`WHERE ${t.join(" AND ")}`:""}
2081
2081
  ORDER BY accepted_seq DESC LIMIT ?;`).all(...n).map(Nm)}recoverOnStartup(){let e=this.db.prepare("SELECT * FROM hub_runs WHERE state = 'running' ORDER BY accepted_seq;").all().map(Nm);this.db.prepare(`UPDATE hub_runs SET state = 'interrupted', ended_at = ?,
2082
2082
  error = 'Hub daemon exited before the run finished.'
2083
- WHERE state = 'running';`).run(Date.now());let t=this.db.prepare("SELECT * FROM hub_runs WHERE state = 'queued' ORDER BY accepted_seq;").all().map(Nm);return this.db.prepare("DELETE FROM hub_runs WHERE ended_at IS NOT NULL AND ended_at < ?;").run(Date.now()-nHe),{interrupted:e.map((n)=>({...n,state:"interrupted"})),requeued:t}}close(){if(this.closed)return;this.closed=!0,this.db.close?.()}}function Nm(e){let t={};try{let n=JSON.parse(String(e.input_json));if(n&&typeof n==="object"&&!Array.isArray(n))t=n}catch{}return{runId:String(e.run_id),sessionId:String(e.session_id),state:String(e.state),input:t,clientId:typeof e.client_id==="string"?e.client_id:void 0,acceptedAt:Number(e.accepted_at),startedAt:e.started_at===null?void 0:Number(e.started_at),endedAt:e.ended_at===null?void 0:Number(e.ended_at),error:typeof e.error==="string"?e.error:void 0}}var oHe="hub_draining",iHe=new Set(["session.create","session.restore","session.fork","run.start","session.send_input","run.enqueue"]);function gX(e){return iHe.has(e)}function yX(e){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:oHe,message:"Hub is draining and refuses new mutating work; retry once a hub is serving again.",details:{retryable:!0}}}}class S0{ctx;queue;activeSessions=new Set;constructor(e,t){this.ctx=e;this.queue=t}pump(e){if(this.activeSessions.has(e))return;this.activeSessions.add(e),this.drainSession(e).catch((t)=>{ke("error","run.queue.pump_failed",{sessionId:e,error:t})}).finally(()=>{if(this.activeSessions.delete(e),this.queue.nextQueued(e))this.pump(e)})}async drainSession(e){for(;;){let t=this.queue.nextQueued(e);if(!t)return;this.queue.markRunning(t.runId),await this.execute(t)}}async execute(e){let t={version:"v1",command:"run.start",requestId:e.runId,clientId:e.clientId,sessionId:e.sessionId,payload:{...e.input,sessionId:e.sessionId}};try{let n=await Lm(this.ctx,t);if(n.ok){let r=n.payload?.result?.finishReason;this.queue.markTerminal(e.runId,r==="aborted"?"aborted":r==="error"||r==="failed"?"failed":"completed",r==="error"?"Run finished with an error.":void 0)}else this.queue.markTerminal(e.runId,"failed",n.error?.message??"Run failed.")}catch(n){this.queue.markTerminal(e.runId,"failed",n instanceof Error?n.message:String(n))}}}function wX(e,t,n,r){let o=Rt(t);if(!o)return pe(t,"invalid_session_id","run.enqueue requires a sessionId");let i=t.payload&&typeof t.payload==="object"?t.payload:{};if(!(typeof i.prompt==="string"?i.prompt:typeof i.input==="string"?i.input:"").trim())return pe(t,"invalid_session_input","run.enqueue requires a prompt string");let a;try{a=n.admit(o,i,t.clientId?.trim()||void 0)}catch(d){if(d instanceof ek)return{version:t.version,requestId:t.requestId,ok:!1,error:{code:"run_admission_rejected",message:d.message,details:{retryable:!0}}};throw d}return e.publish(e.buildEvent("run.enqueued",{runId:a.runId,acceptedAt:a.acceptedAt,queuePosition:a.queuePosition,...t.clientId?{clientId:t.clientId}:{}},o)),r.pump(o),ie(t,{...a})}function bX(e,t){let n=Rt(e)||void 0,r=typeof e.payload?.limit==="number"&&Number.isFinite(e.payload.limit)&&e.payload.limit>0?Math.floor(e.payload.limit):void 0;return ie(e,{runs:t.list({sessionId:n,limit:r}).map((o)=>({runId:o.runId,sessionId:o.sessionId,state:o.state,acceptedAt:o.acceptedAt,startedAt:o.startedAt,endedAt:o.endedAt,error:o.error}))})}async function vX(e,t){switch(t.type){case"chunk":return;case"agent_event":await sHe(e,t);return;case"hook":if(t.payload.hookEventName==="tool_call")e.publish(e.buildEvent("tool.started",{toolName:t.payload.toolName},t.payload.sessionId));else if(t.payload.hookEventName==="tool_result")e.publish(e.buildEvent("tool.finished",{toolName:t.payload.toolName},t.payload.sessionId));return;case"team_progress":{let n={type:"team_progress_projection",version:1,sessionId:t.payload.sessionId,summary:t.payload.summary,lastEvent:t.payload.lifecycle};e.publish(e.buildEvent("team.progress",n,t.payload.sessionId));return}case"pending_prompts":e.publish(e.buildEvent("session.pending_prompts",{sessionId:t.payload.sessionId,prompts:t.payload.prompts},t.payload.sessionId));return;case"pending_prompt_submitted":{let n={id:t.payload.id,prompt:t.payload.prompt,delivery:t.payload.delivery,attachmentCount:t.payload.attachmentCount,userImages:t.payload.userImages,userFiles:t.payload.userFiles,...t.payload.origin?{origin:t.payload.origin}:{}};e.publish(e.buildEvent("session.pending_prompt_submitted",{sessionId:t.payload.sessionId,prompt:n},t.payload.sessionId));return}case"session_snapshot":e.publish(e.buildEvent("session.updated",{sessionId:t.payload.sessionId,snapshot:t.payload.snapshot},t.payload.sessionId));return;case"status":{let[n,r]=await Promise.all([kn(e,t.payload.sessionId),Nn(e,t.payload.sessionId)]);if(n)e.publish(e.buildEvent("session.updated",{session:n,...r?{snapshot:r}:{}},t.payload.sessionId));return}case"ended":await dHe(e,t);return;default:return}}async function sHe(e,t){let{sessionId:n,event:r}=t.payload;if(r.type==="iteration_start"){e.publish(e.buildEvent("iteration.started",{iteration:r.iteration},n));return}if(r.type==="iteration_end"){e.publish(e.buildEvent("iteration.finished",{iteration:r.iteration,hadToolCalls:r.hadToolCalls,toolCallCount:r.toolCallCount},n));return}if(r.type==="content_start"){if(r.contentType==="text"&&typeof r.text==="string"&&r.text.length>0){e.publish(e.buildEvent("assistant.delta",{text:r.text},n));return}if(r.contentType==="reasoning"){if(r.redacted&&!r.reasoning){e.publish(e.buildEvent("reasoning.delta",{text:"",redacted:!0},n));return}if(typeof r.reasoning==="string"&&r.reasoning.length>0)e.publish(e.buildEvent("reasoning.delta",{text:r.reasoning,redacted:r.redacted===!0},n));return}if(r.contentType==="tool"){e.publish(e.buildEvent("tool.started",{toolCallId:r.toolCallId,toolName:r.toolName,input:r.input},n));return}}if(r.type==="content_update"&&r.contentType==="tool"){e.publish(e.buildEvent("tool.updated",{toolCallId:r.toolCallId,toolName:r.toolName,update:r.update},n));return}if(r.type==="content_end"){switch(r.contentType){case"text":e.publish(e.buildEvent("assistant.finished",{text:r.text},n));break;case"media":if(r.media)e.publish(e.buildEvent("assistant.media",{media:r.media},n));break;case"reasoning":e.publish(e.buildEvent("reasoning.finished",{reasoning:r.reasoning},n));break;case"tool":e.publish(e.buildEvent("tool.finished",{toolCallId:r.toolCallId,toolName:r.toolName,output:r.output,error:r.error},n));break}return}if(r.type==="notice"){e.publish(e.buildEvent("session.notice",{sessionId:n,message:r.message,noticeType:r.noticeType,...r.displayRole?{displayRole:r.displayRole}:{},...r.reason?{reason:r.reason}:{},...r.metadata?{metadata:r.metadata}:{},agent:{kind:t.payload.teamRole==="teammate"?"teammate":r.parentAgentId?"subagent":"lead",agentId:r.agentId,conversationId:r.conversationId,parentAgentId:r.parentAgentId,teamAgentId:t.payload.teamAgentId,teamRole:t.payload.teamRole}},n));return}if(r.type==="usage"){let o;try{o=await e.sessionHost.getAccumulatedUsage?.(n)}catch{o=void 0}e.publish(e.buildEvent("usage.updated",{sessionId:n,delta:{inputTokens:r.inputTokens,outputTokens:r.outputTokens,cacheReadTokens:r.cacheReadTokens??0,cacheWriteTokens:r.cacheWriteTokens??0,reasoningTokenCount:r.reasoningTokenCount,totalCost:r.cost??0,...r.reasoningTokens!==void 0?{reasoningTokens:r.reasoningTokens}:{},...r.timings?{timings:r.timings}:{},...r.outputSplit?{outputSplit:r.outputSplit}:{},...r.auxiliary?{auxiliary:!0}:{}},totals:{inputTokens:r.totalInputTokens,outputTokens:r.totalOutputTokens,cacheReadTokens:r.totalCacheReadTokens??0,cacheWriteTokens:r.totalCacheWriteTokens??0,totalCost:r.totalCost??0},usage:o?.usage,aggregateUsage:o?.aggregateUsage,agent:{kind:t.payload.teamRole==="teammate"?"teammate":r.parentAgentId?"subagent":"lead",agentId:r.agentId,conversationId:r.conversationId,parentAgentId:r.parentAgentId,teamAgentId:t.payload.teamAgentId,teamRole:t.payload.teamRole}},n));return}if(r.type==="done"){e.publish(e.buildEvent("agent.done",{reason:r.reason,text:r.text,iterations:r.iterations,usage:r.usage},n));return}if(r.type==="error")await aHe(e,t)}async function aHe(e,t){let{sessionId:n,event:r}=t.payload;if(r.type!=="error"||r.recoverable)return;if(r.parentAgentId||t.payload.teamRole==="teammate")return;if((e.activeRpcTurnCountBySession.get(n)??0)>0)return;let o=r.error instanceof Error?r.error.message:String(r.error),i=await Nn(e,n);e.publish(e.buildEvent("run.failed",{reason:"error",...o?{error:o,text:o}:{},...i?{snapshot:i}:{}},n))}async function dHe(e,t){let n=e.suppressNextTerminalEventBySession.get(t.payload.sessionId),r=n===t.payload.reason||n==="run.start.reply";if(r)e.suppressNextTerminalEventBySession.delete(t.payload.sessionId);let[o,i]=await Promise.all([kn(e,t.payload.sessionId),Nn(e,t.payload.sessionId)]);if(t.payload.reason==="completed"){let s=await c5(o);e.publish(e.buildEvent("ui.notify",s,t.payload.sessionId))}if(r)return;e.publish(e.buildEvent(t.payload.reason==="aborted"?"run.aborted":t.payload.reason==="error"||t.payload.reason==="failed"?"run.failed":"run.completed",{reason:t.payload.reason,...i?{snapshot:i}:{}},t.payload.sessionId))}import{createSessionId as EX,parseRuntimeConfigExtensions as AX,ReasoningEffortSchema as bHe}from"@cerebriline/shared";import{HUB_CHECKPOINT_CAPABILITY as rkt,HUB_COMPACTION_CAPABILITY as okt,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as ikt,HUB_HOOK_CAPABILITY_PREFIX as skt,HUB_MISTAKE_LIMIT_CAPABILITY as akt,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as dkt,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as lkt,isHubToolExecutorName as lHe}from"@cerebriline/shared";import{HUB_CHECKPOINT_CAPABILITY as gkt,HUB_COMPACTION_CAPABILITY as ykt,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as wkt,HUB_HOOK_CAPABILITY_PREFIX as bkt,HUB_MISTAKE_LIMIT_CAPABILITY as vkt,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as kkt,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as Tkt}from"@cerebriline/shared";var cHe=["beforeRun","afterRun","beforeModel","afterModel","beforeTool","afterTool","onEvent"];function td(e){return e&&typeof e==="object"&&!Array.isArray(e)?JSON.parse(JSON.stringify(e)):void 0}function uHe(e,t){let n=typeof e.name==="string"?e.name.trim():"",r=typeof e.description==="string"?e.description:"",o=typeof e.capabilityName==="string"?e.capabilityName.trim():"",i=td(e.inputSchema);if(!n||!r||!i||!o||t.has(o))return;return t.add(o),{kind:"tool",capabilityName:o,name:n,description:r,inputSchema:i,...td(e.lifecycle)?{lifecycle:td(e.lifecycle)}:{}}}function _0(e){if(!Array.isArray(e))return[];let t=[],n=new Set;for(let r of e){if(!r||typeof r!=="object"||Array.isArray(r))continue;let o=r,i=o.kind,s=typeof o.capabilityName==="string"?o.capabilityName.trim():"";if(!s||n.has(s))continue;if(i==="tool"){let a=uHe(o,n);if(a)t.push(a);continue}if(i==="toolExecutor"){let a=o.executor;if(!lHe(a))continue;n.add(s),t.push({kind:"toolExecutor",capabilityName:s,executor:a});continue}if(i==="hook"){let a=typeof o.name==="string"?o.name.trim():"";if(!a)continue;n.add(s),t.push({kind:"hook",capabilityName:s,name:a});continue}if(i==="compaction"){n.add(s),t.push({kind:"compaction",capabilityName:s,...td(o.config)?{config:td(o.config)}:{}});continue}if(i==="checkpoint"){n.add(s),t.push({kind:"checkpoint",capabilityName:s,...td(o.config)?{config:td(o.config)}:{}});continue}if(i==="mistakeLimit"){n.add(s),t.push({kind:"mistakeLimit",capabilityName:s});continue}if(i==="userInstructionService")n.add(s),t.push({kind:"userInstructionService",capabilityName:s})}return t}function TX(e){let t=e.metadata?{...e.metadata}:void 0;return{sessionId:e.sessionId,agentId:e.agentId,conversationId:e.conversationId,runId:e.runId,iteration:e.iteration,toolCallId:e.toolCallId,metadata:t&&Object.keys(t).length>0?t:void 0}}function SX(e){return Object.hasOwn(e,"update")?e.update:e}function Dm(e){return e.trim().replace(/^\/+/,"").toLowerCase()}function hHe(e){let t=(e??[]).map(Dm).filter(Boolean);return t.length>0?new Set(t):void 0}function pHe(e,t,n){if(!n)return!0;let r=Dm(e),o=Dm(t),i=r.includes(":")?r.split(":").at(-1)??r:r,s=o.includes(":")?o.split(":").at(-1)??o:o;return n.has(r)||n.has(o)||n.has(i)||n.has(s)}function x0(e,t){let n=hHe(t);return e.records.skill.map((r)=>({id:r.id,name:r.item.name,description:"description"in r.item&&typeof r.item.description==="string"?r.item.description:void 0,disabled:r.item.disabled===!0,skill:r.item})).filter((r)=>pHe(r.id,r.name,n))}function kX(e,t){let n=async(r,o)=>{let i=Dm(r),a=x0(e,t).filter((l)=>l.id===i||Dm(l.name)===i||l.id.endsWith(`:${i}`)).filter((l)=>!l.disabled);if(a.length!==1)return a.length>1?`Skill "${r}" is ambiguous. Use one of: ${a.map((l)=>l.id).join(", ")}`:`Skill "${r}" not found.`;let d=a[0].skill;return wC(d,o)};return Object.defineProperty(n,"configuredSkills",{get:()=>x0(e,t).map(({skill:r,...o})=>o),enumerable:!0}),n}function mHe(e,t,n,r){let o={records:{skill:[],rule:[],workflow:[]},runtimeCommands:[]},i=async()=>{let s=await r(e,n.capabilityName,{},t);if(s?.snapshot)o=s.snapshot};return{start:i,stop:()=>{},refreshType:async()=>{await i()},listRecords:(s)=>[...o.records[s]],listRuntimeCommands:()=>[...o.runtimeCommands],resolveRuntimeSlashCommand:(s,a)=>{if(!s.startsWith("/")||s.length<2)return s;let l=s.match(/^\/(\S+)/)?.[1];if(!l)return s;let c=ls(l),u=o.runtimeCommands.find((h)=>ls(h.name)===c);if(!u)return s;if(u.kind==="skill"&&a?.expandSkillCommands===!1)return s;return`${u.instructions}${s.slice(l.length+1)}`},hasConfiguredSkills:(s)=>x0(o,s).some((a)=>!a.disabled),createSkillsExecutor:(s)=>kX(o,s),createExtension:(s)=>({name:"cline-hub-user-instructions",manifest:{capabilities:[s.includeRules?"rules":void 0,s.registerSkillsTool?"tools":void 0,s.includeSkills||s.includeWorkflows?"commands":void 0].filter((a)=>Boolean(a))},setup(a){if(s.includeRules)a.registerRule({id:"cline-hub-user-instructions:rules",source:"hub-user-instructions",content:()=>sv(o.records.rule)});if(s.registerSkillsTool)a.registerTool(Ho(kX(o,s.allowedSkillNames)));for(let d of o.runtimeCommands.filter((l)=>l.kind==="skill"&&s.includeSkills||l.kind==="workflow"&&s.includeWorkflows))a.registerCommand({name:d.name,description:d.description,handler:(l)=>{let c=l.trim();return c?`${d.instructions}
2083
+ WHERE state = 'running';`).run(Date.now());let t=this.db.prepare("SELECT * FROM hub_runs WHERE state = 'queued' ORDER BY accepted_seq;").all().map(Nm);return this.db.prepare("DELETE FROM hub_runs WHERE ended_at IS NOT NULL AND ended_at < ?;").run(Date.now()-nHe),{interrupted:e.map((n)=>({...n,state:"interrupted"})),requeued:t}}close(){if(this.closed)return;this.closed=!0,this.db.close?.()}}function Nm(e){let t={};try{let n=JSON.parse(String(e.input_json));if(n&&typeof n==="object"&&!Array.isArray(n))t=n}catch{}return{runId:String(e.run_id),sessionId:String(e.session_id),state:String(e.state),input:t,clientId:typeof e.client_id==="string"?e.client_id:void 0,acceptedAt:Number(e.accepted_at),startedAt:e.started_at===null?void 0:Number(e.started_at),endedAt:e.ended_at===null?void 0:Number(e.ended_at),error:typeof e.error==="string"?e.error:void 0}}var oHe="hub_draining",iHe=new Set(["session.create","session.restore","session.fork","run.start","session.send_input","run.enqueue"]);function gX(e){return iHe.has(e)}function yX(e){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:oHe,message:"Hub is draining and refuses new mutating work; retry once a hub is serving again.",details:{retryable:!0}}}}class S0{ctx;queue;activeSessions=new Set;constructor(e,t){this.ctx=e;this.queue=t}pump(e){if(this.activeSessions.has(e))return;this.activeSessions.add(e),this.drainSession(e).catch((t)=>{ke("error","run.queue.pump_failed",{sessionId:e,error:t})}).finally(()=>{if(this.activeSessions.delete(e),this.queue.nextQueued(e))this.pump(e)})}async drainSession(e){for(;;){let t=this.queue.nextQueued(e);if(!t)return;this.queue.markRunning(t.runId),await this.execute(t)}}async execute(e){let t={version:"v1",command:"run.start",requestId:e.runId,clientId:e.clientId,sessionId:e.sessionId,payload:{...e.input,sessionId:e.sessionId}};try{let n=await Lm(this.ctx,t);if(n.ok){let r=n.payload?.result?.finishReason;this.queue.markTerminal(e.runId,r==="aborted"?"aborted":r==="error"||r==="failed"?"failed":"completed",r==="error"?"Run finished with an error.":void 0)}else this.queue.markTerminal(e.runId,"failed",n.error?.message??"Run failed.")}catch(n){this.queue.markTerminal(e.runId,"failed",n instanceof Error?n.message:String(n))}}}function wX(e,t,n,r){let o=Rt(t);if(!o)return pe(t,"invalid_session_id","run.enqueue requires a sessionId");let i=t.payload&&typeof t.payload==="object"?t.payload:{};if(!(typeof i.prompt==="string"?i.prompt:typeof i.input==="string"?i.input:"").trim())return pe(t,"invalid_session_input","run.enqueue requires a prompt string");let a;try{a=n.admit(o,i,t.clientId?.trim()||void 0)}catch(d){if(d instanceof ek)return{version:t.version,requestId:t.requestId,ok:!1,error:{code:"run_admission_rejected",message:d.message,details:{retryable:!0}}};throw d}return e.publish(e.buildEvent("run.enqueued",{runId:a.runId,acceptedAt:a.acceptedAt,queuePosition:a.queuePosition,...t.clientId?{clientId:t.clientId}:{}},o)),r.pump(o),ie(t,{...a})}function bX(e,t){let n=Rt(e)||void 0,r=typeof e.payload?.limit==="number"&&Number.isFinite(e.payload.limit)&&e.payload.limit>0?Math.floor(e.payload.limit):void 0;return ie(e,{runs:t.list({sessionId:n,limit:r}).map((o)=>({runId:o.runId,sessionId:o.sessionId,state:o.state,acceptedAt:o.acceptedAt,startedAt:o.startedAt,endedAt:o.endedAt,error:o.error}))})}async function vX(e,t){switch(t.type){case"chunk":return;case"agent_event":await sHe(e,t);return;case"hook":if(t.payload.hookEventName==="tool_call")e.publish(e.buildEvent("tool.started",{toolName:t.payload.toolName},t.payload.sessionId));else if(t.payload.hookEventName==="tool_result")e.publish(e.buildEvent("tool.finished",{toolName:t.payload.toolName},t.payload.sessionId));return;case"team_progress":{let n={type:"team_progress_projection",version:1,sessionId:t.payload.sessionId,summary:t.payload.summary,lastEvent:t.payload.lifecycle};e.publish(e.buildEvent("team.progress",n,t.payload.sessionId));return}case"pending_prompts":e.publish(e.buildEvent("session.pending_prompts",{sessionId:t.payload.sessionId,prompts:t.payload.prompts},t.payload.sessionId));return;case"pending_prompt_submitted":{let n={id:t.payload.id,prompt:t.payload.prompt,delivery:t.payload.delivery,attachmentCount:t.payload.attachmentCount,userImages:t.payload.userImages,userFiles:t.payload.userFiles,...t.payload.origin?{origin:t.payload.origin}:{}};e.publish(e.buildEvent("session.pending_prompt_submitted",{sessionId:t.payload.sessionId,prompt:n},t.payload.sessionId));return}case"session_snapshot":e.publish(e.buildEvent("session.updated",{sessionId:t.payload.sessionId,snapshot:t.payload.snapshot},t.payload.sessionId));return;case"status":{let[n,r]=await Promise.all([kn(e,t.payload.sessionId),Nn(e,t.payload.sessionId)]);if(n)e.publish(e.buildEvent("session.updated",{session:n,...r?{snapshot:r}:{}},t.payload.sessionId));return}case"ended":await dHe(e,t);return;default:return}}async function sHe(e,t){let{sessionId:n,event:r}=t.payload;if(r.type==="iteration_start"){e.publish(e.buildEvent("iteration.started",{iteration:r.iteration},n));return}if(r.type==="iteration_end"){e.publish(e.buildEvent("iteration.finished",{iteration:r.iteration,hadToolCalls:r.hadToolCalls,toolCallCount:r.toolCallCount},n));return}if(r.type==="content_start"){if(r.contentType==="text"&&typeof r.text==="string"&&r.text.length>0){e.publish(e.buildEvent("assistant.delta",{text:r.text},n));return}if(r.contentType==="reasoning"){if(r.redacted&&!r.reasoning){e.publish(e.buildEvent("reasoning.delta",{text:"",redacted:!0},n));return}if(typeof r.reasoning==="string"&&r.reasoning.length>0)e.publish(e.buildEvent("reasoning.delta",{text:r.reasoning,redacted:r.redacted===!0},n));return}if(r.contentType==="tool"){e.publish(e.buildEvent("tool.started",{toolCallId:r.toolCallId,toolName:r.toolName,input:r.input},n));return}}if(r.type==="content_update"&&r.contentType==="tool"){e.publish(e.buildEvent("tool.updated",{toolCallId:r.toolCallId,toolName:r.toolName,update:r.update},n));return}if(r.type==="content_end"){switch(r.contentType){case"text":e.publish(e.buildEvent("assistant.finished",{text:r.text},n));break;case"media":if(r.media)e.publish(e.buildEvent("assistant.media",{media:r.media},n));break;case"reasoning":e.publish(e.buildEvent("reasoning.finished",{reasoning:r.reasoning},n));break;case"tool":e.publish(e.buildEvent("tool.finished",{toolCallId:r.toolCallId,toolName:r.toolName,output:r.output,error:r.error},n));break}return}if(r.type==="notice"){e.publish(e.buildEvent("session.notice",{sessionId:n,message:r.message,noticeType:r.noticeType,...r.displayRole?{displayRole:r.displayRole}:{},...r.reason?{reason:r.reason}:{},...r.metadata?{metadata:r.metadata}:{},agent:{kind:t.payload.teamRole==="teammate"?"teammate":r.parentAgentId?"subagent":"lead",agentId:r.agentId,conversationId:r.conversationId,parentAgentId:r.parentAgentId,teamAgentId:t.payload.teamAgentId,teamRole:t.payload.teamRole}},n));return}if(r.type==="usage"){let o;try{o=await e.sessionHost.getAccumulatedUsage?.(n)}catch{o=void 0}e.publish(e.buildEvent("usage.updated",{sessionId:n,delta:{inputTokens:r.inputTokens,outputTokens:r.outputTokens,cacheReadTokens:r.cacheReadTokens??0,cacheWriteTokens:r.cacheWriteTokens??0,reasoningTokenCount:r.reasoningTokenCount,totalCost:r.cost??0,...r.reasoningTokens!==void 0?{reasoningTokens:r.reasoningTokens}:{},...r.timings?{timings:r.timings}:{},...r.outputSplit?{outputSplit:r.outputSplit}:{},...r.auxiliary?{auxiliary:!0}:{}},totals:{inputTokens:r.totalInputTokens,outputTokens:r.totalOutputTokens,cacheReadTokens:r.totalCacheReadTokens??0,cacheWriteTokens:r.totalCacheWriteTokens??0,totalCost:r.totalCost??0},usage:o?.usage,aggregateUsage:o?.aggregateUsage,agent:{kind:t.payload.teamRole==="teammate"?"teammate":r.parentAgentId?"subagent":"lead",agentId:r.agentId,conversationId:r.conversationId,parentAgentId:r.parentAgentId,teamAgentId:t.payload.teamAgentId,teamRole:t.payload.teamRole}},n));return}if(r.type==="done"){e.publish(e.buildEvent("agent.done",{reason:r.reason,text:r.text,iterations:r.iterations,usage:r.usage},n));return}if(r.type==="error")await aHe(e,t)}async function aHe(e,t){let{sessionId:n,event:r}=t.payload;if(r.type!=="error"||r.recoverable)return;if(r.parentAgentId||t.payload.teamRole==="teammate")return;if((e.activeRpcTurnCountBySession.get(n)??0)>0)return;let o=r.error instanceof Error?r.error.message:String(r.error),i=await Nn(e,n);e.publish(e.buildEvent("run.failed",{reason:"error",...o?{error:o,text:o}:{},...i?{snapshot:i}:{}},n))}async function dHe(e,t){let n=e.suppressNextTerminalEventBySession.get(t.payload.sessionId),r=n===t.payload.reason||n==="run.start.reply";if(r)e.suppressNextTerminalEventBySession.delete(t.payload.sessionId);let[o,i]=await Promise.all([kn(e,t.payload.sessionId),Nn(e,t.payload.sessionId)]);if(t.payload.reason==="completed"){let s=await c5(o);e.publish(e.buildEvent("ui.notify",s,t.payload.sessionId))}if(r)return;e.publish(e.buildEvent(t.payload.reason==="aborted"?"run.aborted":t.payload.reason==="error"||t.payload.reason==="failed"?"run.failed":"run.completed",{reason:t.payload.reason,...i?{snapshot:i}:{}},t.payload.sessionId))}import{createSessionId as EX,parseRuntimeConfigExtensions as AX,ReasoningEffortSchema as bHe}from"@cerebriline/shared";import{HUB_CHECKPOINT_CAPABILITY as rkt,HUB_COMPACTION_CAPABILITY as okt,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as ikt,HUB_HOOK_CAPABILITY_PREFIX as skt,HUB_MISTAKE_LIMIT_CAPABILITY as akt,HUB_REASONING_LOOP_LIMIT_CAPABILITY as dkt,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as lkt,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as ckt,isHubToolExecutorName as lHe}from"@cerebriline/shared";import{HUB_CHECKPOINT_CAPABILITY as ykt,HUB_COMPACTION_CAPABILITY as wkt,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as bkt,HUB_HOOK_CAPABILITY_PREFIX as vkt,HUB_MISTAKE_LIMIT_CAPABILITY as kkt,HUB_REASONING_LOOP_LIMIT_CAPABILITY as Tkt,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as Skt,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as xkt}from"@cerebriline/shared";var cHe=["beforeRun","afterRun","beforeModel","afterModel","beforeTool","afterTool","onEvent"];function td(e){return e&&typeof e==="object"&&!Array.isArray(e)?JSON.parse(JSON.stringify(e)):void 0}function uHe(e,t){let n=typeof e.name==="string"?e.name.trim():"",r=typeof e.description==="string"?e.description:"",o=typeof e.capabilityName==="string"?e.capabilityName.trim():"",i=td(e.inputSchema);if(!n||!r||!i||!o||t.has(o))return;return t.add(o),{kind:"tool",capabilityName:o,name:n,description:r,inputSchema:i,...td(e.lifecycle)?{lifecycle:td(e.lifecycle)}:{}}}function _0(e){if(!Array.isArray(e))return[];let t=[],n=new Set;for(let r of e){if(!r||typeof r!=="object"||Array.isArray(r))continue;let o=r,i=o.kind,s=typeof o.capabilityName==="string"?o.capabilityName.trim():"";if(!s||n.has(s))continue;if(i==="tool"){let a=uHe(o,n);if(a)t.push(a);continue}if(i==="toolExecutor"){let a=o.executor;if(!lHe(a))continue;n.add(s),t.push({kind:"toolExecutor",capabilityName:s,executor:a});continue}if(i==="hook"){let a=typeof o.name==="string"?o.name.trim():"";if(!a)continue;n.add(s),t.push({kind:"hook",capabilityName:s,name:a});continue}if(i==="compaction"){n.add(s),t.push({kind:"compaction",capabilityName:s,...td(o.config)?{config:td(o.config)}:{}});continue}if(i==="checkpoint"){n.add(s),t.push({kind:"checkpoint",capabilityName:s,...td(o.config)?{config:td(o.config)}:{}});continue}if(i==="mistakeLimit"){n.add(s),t.push({kind:"mistakeLimit",capabilityName:s});continue}if(i==="reasoningLoopLimit"){n.add(s),t.push({kind:"reasoningLoopLimit",capabilityName:s});continue}if(i==="userInstructionService")n.add(s),t.push({kind:"userInstructionService",capabilityName:s})}return t}function TX(e){let t=e.metadata?{...e.metadata}:void 0;return{sessionId:e.sessionId,agentId:e.agentId,conversationId:e.conversationId,runId:e.runId,iteration:e.iteration,toolCallId:e.toolCallId,metadata:t&&Object.keys(t).length>0?t:void 0}}function SX(e){return Object.hasOwn(e,"update")?e.update:e}function Dm(e){return e.trim().replace(/^\/+/,"").toLowerCase()}function hHe(e){let t=(e??[]).map(Dm).filter(Boolean);return t.length>0?new Set(t):void 0}function pHe(e,t,n){if(!n)return!0;let r=Dm(e),o=Dm(t),i=r.includes(":")?r.split(":").at(-1)??r:r,s=o.includes(":")?o.split(":").at(-1)??o:o;return n.has(r)||n.has(o)||n.has(i)||n.has(s)}function x0(e,t){let n=hHe(t);return e.records.skill.map((r)=>({id:r.id,name:r.item.name,description:"description"in r.item&&typeof r.item.description==="string"?r.item.description:void 0,disabled:r.item.disabled===!0,skill:r.item})).filter((r)=>pHe(r.id,r.name,n))}function kX(e,t){let n=async(r,o)=>{let i=Dm(r),a=x0(e,t).filter((l)=>l.id===i||Dm(l.name)===i||l.id.endsWith(`:${i}`)).filter((l)=>!l.disabled);if(a.length!==1)return a.length>1?`Skill "${r}" is ambiguous. Use one of: ${a.map((l)=>l.id).join(", ")}`:`Skill "${r}" not found.`;let d=a[0].skill;return wC(d,o)};return Object.defineProperty(n,"configuredSkills",{get:()=>x0(e,t).map(({skill:r,...o})=>o),enumerable:!0}),n}function mHe(e,t,n,r){let o={records:{skill:[],rule:[],workflow:[]},runtimeCommands:[]},i=async()=>{let s=await r(e,n.capabilityName,{},t);if(s?.snapshot)o=s.snapshot};return{start:i,stop:()=>{},refreshType:async()=>{await i()},listRecords:(s)=>[...o.records[s]],listRuntimeCommands:()=>[...o.runtimeCommands],resolveRuntimeSlashCommand:(s,a)=>{if(!s.startsWith("/")||s.length<2)return s;let l=s.match(/^\/(\S+)/)?.[1];if(!l)return s;let c=ls(l),u=o.runtimeCommands.find((h)=>ls(h.name)===c);if(!u)return s;if(u.kind==="skill"&&a?.expandSkillCommands===!1)return s;return`${u.instructions}${s.slice(l.length+1)}`},hasConfiguredSkills:(s)=>x0(o,s).some((a)=>!a.disabled),createSkillsExecutor:(s)=>kX(o,s),createExtension:(s)=>({name:"cline-hub-user-instructions",manifest:{capabilities:[s.includeRules?"rules":void 0,s.registerSkillsTool?"tools":void 0,s.includeSkills||s.includeWorkflows?"commands":void 0].filter((a)=>Boolean(a))},setup(a){if(s.includeRules)a.registerRule({id:"cline-hub-user-instructions:rules",source:"hub-user-instructions",content:()=>sv(o.records.rule)});if(s.registerSkillsTool)a.registerTool(Ho(kX(o,s.allowedSkillNames)));for(let d of o.runtimeCommands.filter((l)=>l.kind==="skill"&&s.includeSkills||l.kind==="workflow"&&s.includeWorkflows))a.registerCommand({name:d.name,description:d.description,handler:(l)=>{let c=l.trim();return c?`${d.instructions}
2084
2084
 
2085
- ${c}`:d.instructions}})}})}}function fHe(e,t,n,r){let o=n.map((i)=>[i.executor,async(...s)=>{let a=s.at(-1),d=s.slice(0,-1);return(await r(e,i.capabilityName,{executor:i.executor,args:d,context:TX(a)},t,a.emitUpdate?(c)=>{a.emitUpdate?.(SX(c))}:void 0))?.result}]);return o.length>0?Object.fromEntries(o):void 0}function gHe(e,t,n,r){if(n.length===0)return;return n.map((o)=>({name:o.name,description:o.description,inputSchema:o.inputSchema,lifecycle:o.lifecycle,async execute(i,s){return(await r(e,o.capabilityName,{toolName:o.name,input:i,context:TX(s)},t,s.emitUpdate?(d)=>{s.emitUpdate?.(SX(d))}:void 0))?.result}}))}var yHe=new Set(["assistant-text-delta","assistant-reasoning-delta","tool-updated"]);function wHe(e,t,n,r){let o=new Map(n.map((s)=>[s.name,s])),i={};for(let s of cHe){let a=o.get(s);if(!a)continue;i[s]=async(d)=>{if(s==="onEvent"&&yHe.has(d.type))return;return(await r(e,a.capabilityName,{context:d},t))?.control}}return Object.keys(i).length>0?i:void 0}function E0(e){let t=e.contributions.filter((d)=>d.kind==="toolExecutor"),n=e.contributions.filter((d)=>d.kind==="tool"),r=e.contributions.filter((d)=>d.kind==="hook"),o=e.contributions.find((d)=>d.kind==="compaction"),i=e.contributions.find((d)=>d.kind==="checkpoint"),s=e.contributions.find((d)=>d.kind==="mistakeLimit"),a=e.contributions.find((d)=>d.kind==="userInstructionService");return{hasClientContributions:e.contributions.length>0,toolExecutors:fHe(e.sessionId,e.targetClientId,t,e.requestCapability),localRuntime:{...r.length>0?{hooks:wHe(e.sessionId,e.targetClientId,r,e.requestCapability)}:{},...n.length>0?{extraTools:gHe(e.sessionId,e.targetClientId,n,e.requestCapability)}:{},...o?{compaction:{...e.sessionConfig?.compaction??{},...o.config,compact:async(d)=>(await e.requestCapability(e.sessionId,o.capabilityName,{context:d},e.targetClientId))?.result}}:{},...i?{checkpoint:{...e.sessionConfig?.checkpoint??{},...i.config,createCheckpoint:async(d)=>(await e.requestCapability(e.sessionId,i.capabilityName,{context:d},e.targetClientId))?.result}}:{},...s?{onConsecutiveMistakeLimitReached:async(d)=>(await e.requestCapability(e.sessionId,s.capabilityName,{context:d},e.targetClientId))?.result}:{},...a?{userInstructionService:mHe(e.sessionId,e.targetClientId,a,e.requestCapability)}:{}}}}var xX="hubCapabilityOwnerClientId";function nd(e,t){let n=e?.[t];return typeof n==="string"&&n.trim()?n.trim():void 0}function RX(e){let t=No(e),n=typeof t?.name==="string"?t.name.trim():"";if(!n)return;let r=nd(t,"version"),o=nd(t,"platform"),i=nd(t,"platformVersion");return{name:n,...r?{version:r}:{},...o?{platform:o}:{},...i?{platformVersion:i}:{},...typeof t?.isMultiRoot==="boolean"?{isMultiRoot:t.isMultiRoot}:{}}}function IX(e){let t=No(e),n=nd(t,"distinctId"),o=t?.accountId===null?null:nd(t,"accountId"),i=nd(t,"email"),s=nd(t,"organizationId");if(!n&&o===void 0&&!i&&!s)return;return{...n?{distinctId:n}:{},...o!==void 0?{accountId:o}:{},...i?{email:i}:{},...s?{organizationId:s}:{}}}async function CX(e,t){let n=await e.sessionHost.deleteSession(t);e.sessionState.delete(t);try{e.sessionSearch.removeSession(t)}catch(r){ke("warn","session search eviction failed",{error:r,sessionId:t})}return n}function PX(e,t,n){let r=ZA(n);return e.filter((o)=>(t!=="yolo"||o.name!==Xv)&&eR(o.name,r))}function tk(e){return typeof e==="string"&&e.trim().length>0?e.trim():void 0}function vHe(e){if(e===null)return null;let t=bHe.safeParse(e);return t.success?t.data:void 0}function kHe(e){let t=No(e)??{},n={},r=tk(t.providerId);if(r)n.providerId=r;let o=tk(t.modelId);if(o)n.modelId=o;let i=tk(t.apiKey);if(i!==void 0)n.apiKey=i;let s=tk(t.baseUrl);if(s!==void 0)n.baseUrl=s;if(t.headers&&typeof t.headers==="object")n.headers=t.headers;if(t.providerConfig&&typeof t.providerConfig==="object")n.providerConfig=t.providerConfig;if(Object.hasOwn(t,"thinking")){if(typeof t.thinking==="boolean"||t.thinking===null)n.thinking=t.thinking}if(Object.hasOwn(t,"reasoningEffort")){let a=vHe(t.reasoningEffort);if(a!==void 0)n.reasoningEffort=a}if(Object.hasOwn(t,"thinkingBudgetTokens")){if(typeof t.thinkingBudgetTokens==="number"&&Number.isFinite(t.thinkingBudgetTokens)&&t.thinkingBudgetTokens>0)n.thinkingBudgetTokens=Math.trunc(t.thinkingBudgetTokens);else if(t.thinkingBudgetTokens===null)n.thinkingBudgetTokens=null}return rc(n)}function THe(e,t){return e.sessionState.get(t)?.createdByClientId}function _X(e){return typeof e==="string"||e===null?e:void 0}function SHe(e){if(!e||!("autoApproveTools"in e)&&!(xX in e))return e;let t={...e};return delete t[xX],delete t.autoApproveTools,t}function MX(e,t){let n=No(e),r=No(n?.["*"]);if(typeof r?.autoApprove==="boolean")return r.autoApprove;return t.autoApproveTools===!0}function OX(e){let t=THe(e.ctx,e.sessionId);if(!t)return pe(e.envelope,"session_wrong_client",`Session ${e.sessionId} has no owner`);if(t!==e.clientId)return pe(e.envelope,"session_wrong_client",`Session ${e.sessionId} is owned by ${t}`);return}async function A0(e,t,n){let r=performance.now(),o={command:t.command,requestId:t.requestId,clientId:t.clientId,sessionId:t.sessionId};ke("info","session.create.begin",o);let i=t.payload&&typeof t.payload==="object"?t.payload:{},s=i.metadata&&typeof i.metadata==="object"?JSON.parse(JSON.stringify(i.metadata)):{},a=i.sessionConfig&&typeof i.sessionConfig==="object"?JSON.parse(JSON.stringify(i.sessionConfig)):void 0,d=i.runtimeOptions&&typeof i.runtimeOptions==="object"?i.runtimeOptions:{},l=RX(d.clientContext),c=IX(d.userContext),u=Ed(i.initialCompactionState);if(typeof a?.mode==="string")s.mode=a.mode;else if(typeof d.mode==="string")s.mode=d.mode;if(typeof a?.systemPrompt==="string")s.systemPrompt=a.systemPrompt;else if(typeof d.systemPrompt==="string")s.systemPrompt=d.systemPrompt;if((a?.checkpoint?.enabled??d.checkpointEnabled)!==!1)s.checkpointEnabled=!0;s.autoApproveTools=MX(i.toolPolicies,d);let h=i.modelSelection&&typeof i.modelSelection==="object"?i.modelSelection:{},p=typeof i.workspaceRoot==="string"&&i.workspaceRoot.trim()?i.workspaceRoot.trim():typeof i.cwd==="string"&&i.cwd.trim()?i.cwd.trim():void 0,f=t.clientId?.trim()||"hub-client",m=_0(d.clientContributions);ke("info","session.create.contributions_parsed",{...o,clientId:f,workspaceRoot:p,cwd:typeof i.cwd==="string"?i.cwd:void 0,contributionCount:m.length});let y=(typeof a?.sessionId==="string"?a.sessionId.trim():"")||EX(),w=AX(d.configExtensions);ke("info","session.create.runtime_build.begin",{...o,sessionId:y,configExtensionCount:w?.length??0});let k=E0({sessionId:y,targetClientId:f,contributions:m,sessionConfig:a,requestCapability:e.requestCapability});ke("info","session.create.start_session.begin",{...o,sessionId:y,provider:a?.providerId??(typeof h.provider==="string"?h.provider:typeof s.provider==="string"?s.provider:"hub"),model:a?.modelId??(typeof h.model==="string"?h.model:typeof s.model==="string"?s.model:"hub")});let b=a?.mode??(d.mode==="plan"||d.mode==="yolo"?d.mode:"act"),v=await e.sessionHost.startSession({source:typeof s.source==="string"?s.source:void 0,interactive:s.interactive!==!1,sessionMetadata:Object.keys(s).length>0?s:void 0,initialMessages:Array.isArray(i.initialMessages)?i.initialMessages:void 0,initialCompactionState:u,localRuntime:{modelCatalogDefaults:{loadLatestOnInit:!0,loadPrivateOnAuth:!0},configExtensions:w,...k.localRuntime,...l||c?{extensionContext:{...k.localRuntime.extensionContext,...l?{client:l}:{},...c?{user:c}:{}}}:{},extensions:[...e.sessionExtensions??[],...k.localRuntime.extensions??[]],extraTools:PX([...e.sessionTools??[],...k.localRuntime.extraTools??[]],b,typeof s.source==="string"?s.source:void 0)},capabilities:{toolExecutors:k.toolExecutors,requestToolApproval:n},config:{...a??{},sessionId:y,providerId:a?.providerId??(typeof h.provider==="string"?h.provider:typeof s.provider==="string"?s.provider:"hub"),modelId:a?.modelId??(typeof h.model==="string"?h.model:typeof s.model==="string"?s.model:"hub"),apiKey:a?.apiKey??(typeof h.apiKey==="string"?h.apiKey:void 0),cwd:a?.cwd??(typeof i.cwd==="string"&&i.cwd.trim()?i.cwd.trim():p),workspaceRoot:a?.workspaceRoot??p,systemPrompt:a?.systemPrompt??(typeof d.systemPrompt==="string"?d.systemPrompt:""),mode:b,maxIterations:a?.maxIterations??(typeof d.maxIterations==="number"?d.maxIterations:void 0),enableTools:a?.enableTools??d.enableTools!==!1,enableSpawnAgent:a?.enableSpawnAgent??d.enableSpawn!==!1,enableAgentTeams:a?.enableAgentTeams??d.enableTeams===!0,checkpoint:a?.checkpoint??{enabled:d.checkpointEnabled!==!1},teamName:a?.teamName??(typeof s.teamName==="string"?s.teamName:void 0)},toolPolicies:i.toolPolicies&&typeof i.toolPolicies==="object"&&!Array.isArray(i.toolPolicies)?JSON.parse(JSON.stringify(i.toolPolicies)):d.autoApproveTools===!0?{"*":{autoApprove:!0}}:void 0});ke("info","session.create.start_session.end",{...o,sessionId:v.sessionId,elapsedMs:Math.round(performance.now()-r),hasImmediateResult:!!v.result}),g0(e,v.sessionId,f,"creator",{interactive:s.interactive!==!1}),ke("info","session.create.read_records.begin",{...o,sessionId:v.sessionId});let[E,S]=await Promise.all([kn(e,v.sessionId),Nn(e,v.sessionId)]);if(ke("info","session.create.read_records.end",{...o,sessionId:v.sessionId,hasSession:!!E,hasSnapshot:!!S,elapsedMs:Math.round(performance.now()-r)}),E)e.publish(e.buildEvent("session.created",{session:E,...S?{snapshot:S}:{}},v.sessionId));return ke("info","session.create.reply",{...o,sessionId:v.sessionId,elapsedMs:Math.round(performance.now()-r)}),ie(t,{session:E,...S?{snapshot:S}:{}})}async function LX(e,t,n){let r=t.payload&&typeof t.payload==="object"?t.payload:{},o=typeof r.sessionId==="string"?r.sessionId.trim():t.sessionId?.trim()||"",i=r.checkpointRunCount;if(!o)return pe(t,"invalid_restore","session.restore requires a session id");let s=r.restore&&typeof r.restore==="object"?r.restore:{},a=s.messages!==!1;if(typeof i!=="number")return pe(t,"invalid_restore","checkpointRunCount must be a positive integer");try{let d=r.sessionConfig&&typeof r.sessionConfig==="object"?JSON.parse(JSON.stringify(r.sessionConfig)):void 0;if(a&&!d)return pe(t,"invalid_restore","sessionConfig is required when restore.messages is true");let l=r.runtimeOptions&&typeof r.runtimeOptions==="object"?r.runtimeOptions:{},c=RX(l.clientContext),u=IX(l.userContext),h=Ed(r.initialCompactionState),p=r.metadata&&typeof r.metadata==="object"?JSON.parse(JSON.stringify(r.metadata)):{};if(typeof d?.mode==="string")p.mode=d.mode;else if(typeof l.mode==="string")p.mode=l.mode;if(typeof d?.systemPrompt==="string")p.systemPrompt=d.systemPrompt;else if(typeof l.systemPrompt==="string")p.systemPrompt=l.systemPrompt;if((d?.checkpoint?.enabled??l.checkpointEnabled)!==!1)p.checkpointEnabled=!0;p.autoApproveTools=MX(r.toolPolicies,l);let f=r.modelSelection&&typeof r.modelSelection==="object"?r.modelSelection:{},m=t.clientId?.trim()||"hub-client",g=_0(l.clientContributions),w=(typeof d?.sessionId==="string"?d.sessionId.trim():"")||EX(),k=AX(l.configExtensions),b=E0({sessionId:w,targetClientId:m,contributions:g,sessionConfig:d,requestCapability:e.requestCapability}),E=await new Op().restoreCheckpoint({sessionId:o,checkpointRunCount:i,telemetry:e.telemetry,restore:{messages:s.messages,workspace:s.workspace,omitCheckpointMessageFromSession:s.omitCheckpointMessageFromSession===!0},start:d,cwd:typeof d?.cwd==="string"&&d.cwd.trim()||typeof d?.workspaceRoot==="string"&&d.workspaceRoot.trim()||void 0,getSession:(A)=>e.sessionHost.getSession(A),readMessages:(A)=>e.sessionHost.readSessionMessages(A),buildStartInput:(A)=>{if(A.restoredCheckpointMetadata)p.checkpoint=A.restoredCheckpointMetadata;let R=typeof r.workspaceRoot==="string"&&r.workspaceRoot.trim()?r.workspaceRoot.trim():typeof r.cwd==="string"&&r.cwd.trim()?r.cwd.trim():A.sourceSession.workspaceRoot||A.sourceSession.cwd,C=d?.mode??(l.mode==="plan"||l.mode==="yolo"?l.mode:"act");return{source:typeof p.source==="string"?p.source:void 0,interactive:p.interactive!==!1,sessionMetadata:{...p,restoredFromSessionId:o,restoredCheckpointRunCount:i},initialMessages:A.initialMessages,initialCompactionState:h,localRuntime:{modelCatalogDefaults:{loadLatestOnInit:!0,loadPrivateOnAuth:!0},configExtensions:k,...b.localRuntime,...c||u?{extensionContext:{...b.localRuntime.extensionContext,...c?{client:c}:{},...u?{user:u}:{}}}:{},extensions:[...e.sessionExtensions??[],...b.localRuntime.extensions??[]],extraTools:PX([...e.sessionTools??[],...b.localRuntime.extraTools??[]],C,typeof p.source==="string"?p.source:void 0)},capabilities:{toolExecutors:b.toolExecutors,requestToolApproval:n},config:{...d??{},sessionId:w,providerId:d?.providerId??(typeof f.provider==="string"?f.provider:A.sourceSession.provider),modelId:d?.modelId??(typeof f.model==="string"?f.model:A.sourceSession.model),apiKey:d?.apiKey??(typeof f.apiKey==="string"?f.apiKey:""),cwd:d?.cwd??A.plan.cwd,workspaceRoot:d?.workspaceRoot??R,systemPrompt:d?.systemPrompt??(typeof l.systemPrompt==="string"?l.systemPrompt:""),mode:C,maxIterations:d?.maxIterations??(typeof l.maxIterations==="number"?l.maxIterations:void 0),enableTools:d?.enableTools??l.enableTools!==!1,enableSpawnAgent:d?.enableSpawnAgent??l.enableSpawn!==!1,enableAgentTeams:d?.enableAgentTeams??l.enableTeams===!0,checkpoint:d?.checkpoint??{enabled:l.checkpointEnabled!==!1},teamName:d?.teamName??(typeof p.teamName==="string"?p.teamName:void 0)},toolPolicies:r.toolPolicies&&typeof r.toolPolicies==="object"&&!Array.isArray(r.toolPolicies)?JSON.parse(JSON.stringify(r.toolPolicies)):l.autoApproveTools===!0?{"*":{autoApprove:!0}}:void 0}},startSession:(A)=>e.sessionHost.startSession(A),getStartedSessionId:(A)=>A.sessionId,cleanupStartedSession:async(A)=>{if(!await CX(e,A.sessionId))throw Error(`Failed to clean up restored session ${A.sessionId}`)},readRestoredSession:(A)=>e.sessionHost.getSession(A)});if(!a)return ie(t,{checkpoint:E.checkpoint});let S=E.startResult;if(!S)return pe(t,"restore_failed","Checkpoint restore did not start a session");g0(e,S.sessionId,m,"creator",{interactive:p.interactive!==!1});let[x,T]=await Promise.all([kn(e,S.sessionId),Nn(e,S.sessionId)]);if(x)e.publish(e.buildEvent("session.created",{session:x,...T?{snapshot:T}:{}},S.sessionId));return ie(t,{session:x,...T?{snapshot:T}:{},messages:E.messages??[],checkpoint:E.checkpoint})}catch(d){if(d instanceof Fr)return pe(t,d.code,d.code==="session_not_found"?`Unknown session: ${o}`:d.message);return pe(t,"restore_failed",d instanceof Error?d.message:String(d))}}async function NX(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_attach","session.attach requires a session id");let r=await kn(e,n);if(!r)return pe(t,"session_not_found",`Unknown session: ${n}`);JY(e,n,t.clientId?.trim()||"hub-client","participant");let o=await kn(e,n);return e.publish(e.buildEvent("session.attached",{session:o??r},n)),ie(t,{session:o??r})}async function DX(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_detach","session.detach requires a session id");let r=t.clientId?.trim()||"hub-client",o=e.sessionState.get(n);if(o){if(o.participants.delete(r),o.createdByClientId===r)o.createdByClientId=void 0;if(o.participants.size===0)e.sessionState.delete(n)}fs(e,(a)=>a.sessionId===n&&a.targetClientId===r,`Capability owner client ${r} detached before request was resolved.`);let[i,s]=await Promise.all([kn(e,n),Nn(e,n)]);return e.publish(e.buildEvent("session.detached",i?{session:i,...s?{snapshot:s}:{},clientId:r}:{clientId:r},n)),ie(t)}async function $X(e,t){let n=Rt(t),r=t.payload?.includeSnapshot===!0,[o,i]=await Promise.all([kn(e,n),r?Nn(e,n):Promise.resolve(void 0)]);return o?ie(t,{session:o,...i?{snapshot:i}:{}}):pe(t,"session_not_found",`Unknown session: ${n}`)}async function FX(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_id","session.messages requires a session id");if(!await kn(e,n))return pe(t,"session_not_found",`Unknown session: ${n}`);let o=await e.sessionHost.readSessionMessages(n);return ie(t,{sessionId:n,messages:o})}async function UX(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_id","session.compaction.get requires a session id");if(!await kn(e,n))return pe(t,"session_not_found",`Unknown session: ${n}`);let o=t.clientId?.trim()||"hub-client",i=OX({sessionId:n,ctx:e,clientId:o,envelope:t});if(i)return i;let s=await e.sessionHost.readSessionCompactionState(n);return ie(t,{sessionId:n,state:s})}async function BX(e,t){let n=typeof t.payload?.limit==="number"?t.payload.limit:200,o=(await e.sessionHost.listSessions(n,{rootOnly:t.payload?.rootOnly===!0})).map((i)=>Jv(i,e.sessionState.get(i.sessionId)));return ie(t,{sessions:o})}async function HX(e,t){let n=t.payload??{};if(typeof n.query!=="string"||!n.query.trim())return pe(t,"invalid_search_query","session.search requires a non-empty query");return ie(t,{hits:e.sessionSearch.search({query:n.query,limit:n.limit,workspaceRoot:n.workspaceRoot})})}async function WX(e,t){let n=Rt(t),r=SHe(No(t.payload?.metadata)),o=_X(t.payload?.prompt),i=_X(t.payload?.title),s=await e.sessionHost.updateSession(n,{metadata:r,...o!==void 0?{prompt:o}:{},...i!==void 0?{title:i}:{}}),[a,d]=await Promise.all([kn(e,n),Nn(e,n)]);if(a)e.publish(e.buildEvent("session.updated",{session:a,...d?{snapshot:d}:{}},n));return{version:t.version,requestId:t.requestId,ok:s.updated,payload:{updated:s.updated,session:a,...d?{snapshot:d}:{}}}}async function jX(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_update_connection","session.update_connection requires a session id");let r=e.sessionHost.updateSessionConnection;if(!r)return pe(t,"unsupported_session_update_connection","runtime host does not support session connection updates");let o=No(t.payload),i=kHe(o?.updates);return await r.call(e.sessionHost,n,i),ie(t,{sessionId:n,updated:!0})}async function qX(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_id","session.compaction.update requires a session id");let r=t.clientId?.trim()||"hub-client",o=await kn(e,n);if(!o)return pe(t,"session_not_found",`Unknown session: ${n}`);let i=OX({sessionId:n,ctx:e,clientId:r,envelope:t});if(i)return i;let s=t.payload&&typeof t.payload==="object"?t.payload:{},a=Ed(s.state);if(!a)return pe(t,"invalid_compaction_state","session.compaction.update requires a valid compaction state");let d=await e.sessionHost.updateSessionCompactionState(n,a),[l,c]=d.updated?await Promise.all([kn(e,n),Nn(e,n)]):[o,void 0];if(d.updated)e.publish(e.buildEvent("session.updated",{session:l??o,...c?{snapshot:c}:{}},n));return{version:t.version,requestId:t.requestId,ok:!0,payload:{updated:d.updated,session:l??o,...c?{snapshot:c}:{}}}}async function zX(e,t){let n=Rt(t),r=await CX(e,n);return ie(t,{deleted:r})}async function KX(e,t){let n=Rt(t),r=e.sessionHost.pendingPrompts;if(!r)return pe(t,"pending_prompts_unavailable","Pending prompt service is not available.");let o=await r.list({sessionId:n});return ie(t,{sessionId:n,prompts:o})}async function GX(e,t){let n=Rt(t),r=e.sessionHost.pendingPrompts;if(!r)return pe(t,"pending_prompts_unavailable","Pending prompt service is not available.");let o=await r.steerFirst({sessionId:n});return ie(t,o)}async function VX(e,t){let n=Rt(t),r=typeof t.payload?.promptId==="string"?t.payload.promptId.trim():"",o=typeof t.payload?.prompt==="string"?t.payload.prompt:void 0,i=t.payload?.delivery==="queue"||t.payload?.delivery==="steer"?t.payload.delivery:void 0,s=e.sessionHost.pendingPrompts;if(!s)return pe(t,"pending_prompts_unavailable","Pending prompt service is not available.");let a=await s.update({sessionId:n,promptId:r,prompt:o,delivery:i});return ie(t,a)}async function YX(e,t){let n=Rt(t),r=typeof t.payload?.promptId==="string"?t.payload.promptId.trim():"",o=e.sessionHost.pendingPrompts;if(!o)return pe(t,"pending_prompts_unavailable","Pending prompt service is not available.");let i=await o.delete({sessionId:n,promptId:r});return ie(t,i)}import{join as xHe}from"node:path";import{loadSqliteDb as _He}from"@cerebriline/shared/db";import{resolveDbDataDir as EHe}from"@cerebriline/shared/storage";var AHe=604800000,RHe=200000,IHe=67108864,CHe=16777216;function PHe(e){let t=e?.replace(/[^a-zA-Z0-9_-]/g,"-");return xHe(EHe(),t?`hub-events-${t}.db`:"hub-events.db")}class R0{db;retentionMs;maxRows;maxTotalBytes;appendedBytesSincePrune=0;closed=!1;constructor(e={}){this.db=_He(e.dbPath??PHe(e.ownerId)),this.retentionMs=e.retentionMs??AHe,this.maxRows=e.maxRows??RHe,this.maxTotalBytes=e.maxTotalBytes??IHe,this.db.exec("PRAGMA journal_mode = WAL;"),this.db.exec("PRAGMA synchronous = NORMAL;"),this.db.exec("PRAGMA busy_timeout = 5000;"),this.db.exec(`
2085
+ ${c}`:d.instructions}})}})}}function fHe(e,t,n,r){let o=n.map((i)=>[i.executor,async(...s)=>{let a=s.at(-1),d=s.slice(0,-1);return(await r(e,i.capabilityName,{executor:i.executor,args:d,context:TX(a)},t,a.emitUpdate?(c)=>{a.emitUpdate?.(SX(c))}:void 0))?.result}]);return o.length>0?Object.fromEntries(o):void 0}function gHe(e,t,n,r){if(n.length===0)return;return n.map((o)=>({name:o.name,description:o.description,inputSchema:o.inputSchema,lifecycle:o.lifecycle,async execute(i,s){return(await r(e,o.capabilityName,{toolName:o.name,input:i,context:TX(s)},t,s.emitUpdate?(d)=>{s.emitUpdate?.(SX(d))}:void 0))?.result}}))}var yHe=new Set(["assistant-text-delta","assistant-reasoning-delta","tool-updated"]);function wHe(e,t,n,r){let o=new Map(n.map((s)=>[s.name,s])),i={};for(let s of cHe){let a=o.get(s);if(!a)continue;i[s]=async(d)=>{if(s==="onEvent"&&yHe.has(d.type))return;return(await r(e,a.capabilityName,{context:d},t))?.control}}return Object.keys(i).length>0?i:void 0}function E0(e){let t=e.contributions.filter((l)=>l.kind==="toolExecutor"),n=e.contributions.filter((l)=>l.kind==="tool"),r=e.contributions.filter((l)=>l.kind==="hook"),o=e.contributions.find((l)=>l.kind==="compaction"),i=e.contributions.find((l)=>l.kind==="checkpoint"),s=e.contributions.find((l)=>l.kind==="mistakeLimit"),a=e.contributions.find((l)=>l.kind==="reasoningLoopLimit"),d=e.contributions.find((l)=>l.kind==="userInstructionService");return{hasClientContributions:e.contributions.length>0,toolExecutors:fHe(e.sessionId,e.targetClientId,t,e.requestCapability),localRuntime:{...r.length>0?{hooks:wHe(e.sessionId,e.targetClientId,r,e.requestCapability)}:{},...n.length>0?{extraTools:gHe(e.sessionId,e.targetClientId,n,e.requestCapability)}:{},...o?{compaction:{...e.sessionConfig?.compaction??{},...o.config,compact:async(l)=>(await e.requestCapability(e.sessionId,o.capabilityName,{context:l},e.targetClientId))?.result}}:{},...i?{checkpoint:{...e.sessionConfig?.checkpoint??{},...i.config,createCheckpoint:async(l)=>(await e.requestCapability(e.sessionId,i.capabilityName,{context:l},e.targetClientId))?.result}}:{},...s?{onConsecutiveMistakeLimitReached:async(l)=>(await e.requestCapability(e.sessionId,s.capabilityName,{context:l},e.targetClientId))?.result}:{},...a?{onReasoningLoopLimitReached:async(l)=>(await e.requestCapability(e.sessionId,a.capabilityName,{context:l},e.targetClientId))?.result}:{},...d?{userInstructionService:mHe(e.sessionId,e.targetClientId,d,e.requestCapability)}:{}}}}var xX="hubCapabilityOwnerClientId";function nd(e,t){let n=e?.[t];return typeof n==="string"&&n.trim()?n.trim():void 0}function RX(e){let t=No(e),n=typeof t?.name==="string"?t.name.trim():"";if(!n)return;let r=nd(t,"version"),o=nd(t,"platform"),i=nd(t,"platformVersion");return{name:n,...r?{version:r}:{},...o?{platform:o}:{},...i?{platformVersion:i}:{},...typeof t?.isMultiRoot==="boolean"?{isMultiRoot:t.isMultiRoot}:{}}}function IX(e){let t=No(e),n=nd(t,"distinctId"),o=t?.accountId===null?null:nd(t,"accountId"),i=nd(t,"email"),s=nd(t,"organizationId");if(!n&&o===void 0&&!i&&!s)return;return{...n?{distinctId:n}:{},...o!==void 0?{accountId:o}:{},...i?{email:i}:{},...s?{organizationId:s}:{}}}async function CX(e,t){let n=await e.sessionHost.deleteSession(t);e.sessionState.delete(t);try{e.sessionSearch.removeSession(t)}catch(r){ke("warn","session search eviction failed",{error:r,sessionId:t})}return n}function PX(e,t,n){let r=ZA(n);return e.filter((o)=>(t!=="yolo"||o.name!==Xv)&&eR(o.name,r))}function tk(e){return typeof e==="string"&&e.trim().length>0?e.trim():void 0}function vHe(e){if(e===null)return null;let t=bHe.safeParse(e);return t.success?t.data:void 0}function kHe(e){let t=No(e)??{},n={},r=tk(t.providerId);if(r)n.providerId=r;let o=tk(t.modelId);if(o)n.modelId=o;let i=tk(t.apiKey);if(i!==void 0)n.apiKey=i;let s=tk(t.baseUrl);if(s!==void 0)n.baseUrl=s;if(t.headers&&typeof t.headers==="object")n.headers=t.headers;if(t.providerConfig&&typeof t.providerConfig==="object")n.providerConfig=t.providerConfig;if(Object.hasOwn(t,"thinking")){if(typeof t.thinking==="boolean"||t.thinking===null)n.thinking=t.thinking}if(Object.hasOwn(t,"reasoningEffort")){let a=vHe(t.reasoningEffort);if(a!==void 0)n.reasoningEffort=a}if(Object.hasOwn(t,"thinkingBudgetTokens")){if(typeof t.thinkingBudgetTokens==="number"&&Number.isFinite(t.thinkingBudgetTokens)&&t.thinkingBudgetTokens>0)n.thinkingBudgetTokens=Math.trunc(t.thinkingBudgetTokens);else if(t.thinkingBudgetTokens===null)n.thinkingBudgetTokens=null}return rc(n)}function THe(e,t){return e.sessionState.get(t)?.createdByClientId}function _X(e){return typeof e==="string"||e===null?e:void 0}function SHe(e){if(!e||!("autoApproveTools"in e)&&!(xX in e))return e;let t={...e};return delete t[xX],delete t.autoApproveTools,t}function MX(e,t){let n=No(e),r=No(n?.["*"]);if(typeof r?.autoApprove==="boolean")return r.autoApprove;return t.autoApproveTools===!0}function OX(e){let t=THe(e.ctx,e.sessionId);if(!t)return pe(e.envelope,"session_wrong_client",`Session ${e.sessionId} has no owner`);if(t!==e.clientId)return pe(e.envelope,"session_wrong_client",`Session ${e.sessionId} is owned by ${t}`);return}async function A0(e,t,n){let r=performance.now(),o={command:t.command,requestId:t.requestId,clientId:t.clientId,sessionId:t.sessionId};ke("info","session.create.begin",o);let i=t.payload&&typeof t.payload==="object"?t.payload:{},s=i.metadata&&typeof i.metadata==="object"?JSON.parse(JSON.stringify(i.metadata)):{},a=i.sessionConfig&&typeof i.sessionConfig==="object"?JSON.parse(JSON.stringify(i.sessionConfig)):void 0,d=i.runtimeOptions&&typeof i.runtimeOptions==="object"?i.runtimeOptions:{},l=RX(d.clientContext),c=IX(d.userContext),u=Ed(i.initialCompactionState);if(typeof a?.mode==="string")s.mode=a.mode;else if(typeof d.mode==="string")s.mode=d.mode;if(typeof a?.systemPrompt==="string")s.systemPrompt=a.systemPrompt;else if(typeof d.systemPrompt==="string")s.systemPrompt=d.systemPrompt;if((a?.checkpoint?.enabled??d.checkpointEnabled)!==!1)s.checkpointEnabled=!0;s.autoApproveTools=MX(i.toolPolicies,d);let h=i.modelSelection&&typeof i.modelSelection==="object"?i.modelSelection:{},p=typeof i.workspaceRoot==="string"&&i.workspaceRoot.trim()?i.workspaceRoot.trim():typeof i.cwd==="string"&&i.cwd.trim()?i.cwd.trim():void 0,f=t.clientId?.trim()||"hub-client",m=_0(d.clientContributions);ke("info","session.create.contributions_parsed",{...o,clientId:f,workspaceRoot:p,cwd:typeof i.cwd==="string"?i.cwd:void 0,contributionCount:m.length});let y=(typeof a?.sessionId==="string"?a.sessionId.trim():"")||EX(),w=AX(d.configExtensions);ke("info","session.create.runtime_build.begin",{...o,sessionId:y,configExtensionCount:w?.length??0});let k=E0({sessionId:y,targetClientId:f,contributions:m,sessionConfig:a,requestCapability:e.requestCapability});ke("info","session.create.start_session.begin",{...o,sessionId:y,provider:a?.providerId??(typeof h.provider==="string"?h.provider:typeof s.provider==="string"?s.provider:"hub"),model:a?.modelId??(typeof h.model==="string"?h.model:typeof s.model==="string"?s.model:"hub")});let b=a?.mode??(d.mode==="plan"||d.mode==="yolo"?d.mode:"act"),v=await e.sessionHost.startSession({source:typeof s.source==="string"?s.source:void 0,interactive:s.interactive!==!1,sessionMetadata:Object.keys(s).length>0?s:void 0,initialMessages:Array.isArray(i.initialMessages)?i.initialMessages:void 0,initialCompactionState:u,localRuntime:{modelCatalogDefaults:{loadLatestOnInit:!0,loadPrivateOnAuth:!0},configExtensions:w,...k.localRuntime,...l||c?{extensionContext:{...k.localRuntime.extensionContext,...l?{client:l}:{},...c?{user:c}:{}}}:{},extensions:[...e.sessionExtensions??[],...k.localRuntime.extensions??[]],extraTools:PX([...e.sessionTools??[],...k.localRuntime.extraTools??[]],b,typeof s.source==="string"?s.source:void 0)},capabilities:{toolExecutors:k.toolExecutors,requestToolApproval:n},config:{...a??{},sessionId:y,providerId:a?.providerId??(typeof h.provider==="string"?h.provider:typeof s.provider==="string"?s.provider:"hub"),modelId:a?.modelId??(typeof h.model==="string"?h.model:typeof s.model==="string"?s.model:"hub"),apiKey:a?.apiKey??(typeof h.apiKey==="string"?h.apiKey:void 0),cwd:a?.cwd??(typeof i.cwd==="string"&&i.cwd.trim()?i.cwd.trim():p),workspaceRoot:a?.workspaceRoot??p,systemPrompt:a?.systemPrompt??(typeof d.systemPrompt==="string"?d.systemPrompt:""),mode:b,maxIterations:a?.maxIterations??(typeof d.maxIterations==="number"?d.maxIterations:void 0),enableTools:a?.enableTools??d.enableTools!==!1,enableSpawnAgent:a?.enableSpawnAgent??d.enableSpawn!==!1,enableAgentTeams:a?.enableAgentTeams??d.enableTeams===!0,checkpoint:a?.checkpoint??{enabled:d.checkpointEnabled!==!1},teamName:a?.teamName??(typeof s.teamName==="string"?s.teamName:void 0)},toolPolicies:i.toolPolicies&&typeof i.toolPolicies==="object"&&!Array.isArray(i.toolPolicies)?JSON.parse(JSON.stringify(i.toolPolicies)):d.autoApproveTools===!0?{"*":{autoApprove:!0}}:void 0});ke("info","session.create.start_session.end",{...o,sessionId:v.sessionId,elapsedMs:Math.round(performance.now()-r),hasImmediateResult:!!v.result}),g0(e,v.sessionId,f,"creator",{interactive:s.interactive!==!1}),ke("info","session.create.read_records.begin",{...o,sessionId:v.sessionId});let[E,S]=await Promise.all([kn(e,v.sessionId),Nn(e,v.sessionId)]);if(ke("info","session.create.read_records.end",{...o,sessionId:v.sessionId,hasSession:!!E,hasSnapshot:!!S,elapsedMs:Math.round(performance.now()-r)}),E)e.publish(e.buildEvent("session.created",{session:E,...S?{snapshot:S}:{}},v.sessionId));return ke("info","session.create.reply",{...o,sessionId:v.sessionId,elapsedMs:Math.round(performance.now()-r)}),ie(t,{session:E,...S?{snapshot:S}:{}})}async function LX(e,t,n){let r=t.payload&&typeof t.payload==="object"?t.payload:{},o=typeof r.sessionId==="string"?r.sessionId.trim():t.sessionId?.trim()||"",i=r.checkpointRunCount;if(!o)return pe(t,"invalid_restore","session.restore requires a session id");let s=r.restore&&typeof r.restore==="object"?r.restore:{},a=s.messages!==!1;if(typeof i!=="number")return pe(t,"invalid_restore","checkpointRunCount must be a positive integer");try{let d=r.sessionConfig&&typeof r.sessionConfig==="object"?JSON.parse(JSON.stringify(r.sessionConfig)):void 0;if(a&&!d)return pe(t,"invalid_restore","sessionConfig is required when restore.messages is true");let l=r.runtimeOptions&&typeof r.runtimeOptions==="object"?r.runtimeOptions:{},c=RX(l.clientContext),u=IX(l.userContext),h=Ed(r.initialCompactionState),p=r.metadata&&typeof r.metadata==="object"?JSON.parse(JSON.stringify(r.metadata)):{};if(typeof d?.mode==="string")p.mode=d.mode;else if(typeof l.mode==="string")p.mode=l.mode;if(typeof d?.systemPrompt==="string")p.systemPrompt=d.systemPrompt;else if(typeof l.systemPrompt==="string")p.systemPrompt=l.systemPrompt;if((d?.checkpoint?.enabled??l.checkpointEnabled)!==!1)p.checkpointEnabled=!0;p.autoApproveTools=MX(r.toolPolicies,l);let f=r.modelSelection&&typeof r.modelSelection==="object"?r.modelSelection:{},m=t.clientId?.trim()||"hub-client",g=_0(l.clientContributions),w=(typeof d?.sessionId==="string"?d.sessionId.trim():"")||EX(),k=AX(l.configExtensions),b=E0({sessionId:w,targetClientId:m,contributions:g,sessionConfig:d,requestCapability:e.requestCapability}),E=await new Op().restoreCheckpoint({sessionId:o,checkpointRunCount:i,telemetry:e.telemetry,restore:{messages:s.messages,workspace:s.workspace,omitCheckpointMessageFromSession:s.omitCheckpointMessageFromSession===!0},start:d,cwd:typeof d?.cwd==="string"&&d.cwd.trim()||typeof d?.workspaceRoot==="string"&&d.workspaceRoot.trim()||void 0,getSession:(A)=>e.sessionHost.getSession(A),readMessages:(A)=>e.sessionHost.readSessionMessages(A),buildStartInput:(A)=>{if(A.restoredCheckpointMetadata)p.checkpoint=A.restoredCheckpointMetadata;let R=typeof r.workspaceRoot==="string"&&r.workspaceRoot.trim()?r.workspaceRoot.trim():typeof r.cwd==="string"&&r.cwd.trim()?r.cwd.trim():A.sourceSession.workspaceRoot||A.sourceSession.cwd,C=d?.mode??(l.mode==="plan"||l.mode==="yolo"?l.mode:"act");return{source:typeof p.source==="string"?p.source:void 0,interactive:p.interactive!==!1,sessionMetadata:{...p,restoredFromSessionId:o,restoredCheckpointRunCount:i},initialMessages:A.initialMessages,initialCompactionState:h,localRuntime:{modelCatalogDefaults:{loadLatestOnInit:!0,loadPrivateOnAuth:!0},configExtensions:k,...b.localRuntime,...c||u?{extensionContext:{...b.localRuntime.extensionContext,...c?{client:c}:{},...u?{user:u}:{}}}:{},extensions:[...e.sessionExtensions??[],...b.localRuntime.extensions??[]],extraTools:PX([...e.sessionTools??[],...b.localRuntime.extraTools??[]],C,typeof p.source==="string"?p.source:void 0)},capabilities:{toolExecutors:b.toolExecutors,requestToolApproval:n},config:{...d??{},sessionId:w,providerId:d?.providerId??(typeof f.provider==="string"?f.provider:A.sourceSession.provider),modelId:d?.modelId??(typeof f.model==="string"?f.model:A.sourceSession.model),apiKey:d?.apiKey??(typeof f.apiKey==="string"?f.apiKey:""),cwd:d?.cwd??A.plan.cwd,workspaceRoot:d?.workspaceRoot??R,systemPrompt:d?.systemPrompt??(typeof l.systemPrompt==="string"?l.systemPrompt:""),mode:C,maxIterations:d?.maxIterations??(typeof l.maxIterations==="number"?l.maxIterations:void 0),enableTools:d?.enableTools??l.enableTools!==!1,enableSpawnAgent:d?.enableSpawnAgent??l.enableSpawn!==!1,enableAgentTeams:d?.enableAgentTeams??l.enableTeams===!0,checkpoint:d?.checkpoint??{enabled:l.checkpointEnabled!==!1},teamName:d?.teamName??(typeof p.teamName==="string"?p.teamName:void 0)},toolPolicies:r.toolPolicies&&typeof r.toolPolicies==="object"&&!Array.isArray(r.toolPolicies)?JSON.parse(JSON.stringify(r.toolPolicies)):l.autoApproveTools===!0?{"*":{autoApprove:!0}}:void 0}},startSession:(A)=>e.sessionHost.startSession(A),getStartedSessionId:(A)=>A.sessionId,cleanupStartedSession:async(A)=>{if(!await CX(e,A.sessionId))throw Error(`Failed to clean up restored session ${A.sessionId}`)},readRestoredSession:(A)=>e.sessionHost.getSession(A)});if(!a)return ie(t,{checkpoint:E.checkpoint});let S=E.startResult;if(!S)return pe(t,"restore_failed","Checkpoint restore did not start a session");g0(e,S.sessionId,m,"creator",{interactive:p.interactive!==!1});let[x,T]=await Promise.all([kn(e,S.sessionId),Nn(e,S.sessionId)]);if(x)e.publish(e.buildEvent("session.created",{session:x,...T?{snapshot:T}:{}},S.sessionId));return ie(t,{session:x,...T?{snapshot:T}:{},messages:E.messages??[],checkpoint:E.checkpoint})}catch(d){if(d instanceof Fr)return pe(t,d.code,d.code==="session_not_found"?`Unknown session: ${o}`:d.message);return pe(t,"restore_failed",d instanceof Error?d.message:String(d))}}async function NX(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_attach","session.attach requires a session id");let r=await kn(e,n);if(!r)return pe(t,"session_not_found",`Unknown session: ${n}`);JY(e,n,t.clientId?.trim()||"hub-client","participant");let o=await kn(e,n);return e.publish(e.buildEvent("session.attached",{session:o??r},n)),ie(t,{session:o??r})}async function DX(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_detach","session.detach requires a session id");let r=t.clientId?.trim()||"hub-client",o=e.sessionState.get(n);if(o){if(o.participants.delete(r),o.createdByClientId===r)o.createdByClientId=void 0;if(o.participants.size===0)e.sessionState.delete(n)}fs(e,(a)=>a.sessionId===n&&a.targetClientId===r,`Capability owner client ${r} detached before request was resolved.`);let[i,s]=await Promise.all([kn(e,n),Nn(e,n)]);return e.publish(e.buildEvent("session.detached",i?{session:i,...s?{snapshot:s}:{},clientId:r}:{clientId:r},n)),ie(t)}async function $X(e,t){let n=Rt(t),r=t.payload?.includeSnapshot===!0,[o,i]=await Promise.all([kn(e,n),r?Nn(e,n):Promise.resolve(void 0)]);return o?ie(t,{session:o,...i?{snapshot:i}:{}}):pe(t,"session_not_found",`Unknown session: ${n}`)}async function FX(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_id","session.messages requires a session id");if(!await kn(e,n))return pe(t,"session_not_found",`Unknown session: ${n}`);let o=await e.sessionHost.readSessionMessages(n);return ie(t,{sessionId:n,messages:o})}async function UX(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_id","session.compaction.get requires a session id");if(!await kn(e,n))return pe(t,"session_not_found",`Unknown session: ${n}`);let o=t.clientId?.trim()||"hub-client",i=OX({sessionId:n,ctx:e,clientId:o,envelope:t});if(i)return i;let s=await e.sessionHost.readSessionCompactionState(n);return ie(t,{sessionId:n,state:s})}async function BX(e,t){let n=typeof t.payload?.limit==="number"?t.payload.limit:200,o=(await e.sessionHost.listSessions(n,{rootOnly:t.payload?.rootOnly===!0})).map((i)=>Jv(i,e.sessionState.get(i.sessionId)));return ie(t,{sessions:o})}async function HX(e,t){let n=t.payload??{};if(typeof n.query!=="string"||!n.query.trim())return pe(t,"invalid_search_query","session.search requires a non-empty query");return ie(t,{hits:e.sessionSearch.search({query:n.query,limit:n.limit,workspaceRoot:n.workspaceRoot})})}async function WX(e,t){let n=Rt(t),r=SHe(No(t.payload?.metadata)),o=_X(t.payload?.prompt),i=_X(t.payload?.title),s=await e.sessionHost.updateSession(n,{metadata:r,...o!==void 0?{prompt:o}:{},...i!==void 0?{title:i}:{}}),[a,d]=await Promise.all([kn(e,n),Nn(e,n)]);if(a)e.publish(e.buildEvent("session.updated",{session:a,...d?{snapshot:d}:{}},n));return{version:t.version,requestId:t.requestId,ok:s.updated,payload:{updated:s.updated,session:a,...d?{snapshot:d}:{}}}}async function jX(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_update_connection","session.update_connection requires a session id");let r=e.sessionHost.updateSessionConnection;if(!r)return pe(t,"unsupported_session_update_connection","runtime host does not support session connection updates");let o=No(t.payload),i=kHe(o?.updates);return await r.call(e.sessionHost,n,i),ie(t,{sessionId:n,updated:!0})}async function qX(e,t){let n=Rt(t);if(!n)return pe(t,"invalid_session_id","session.compaction.update requires a session id");let r=t.clientId?.trim()||"hub-client",o=await kn(e,n);if(!o)return pe(t,"session_not_found",`Unknown session: ${n}`);let i=OX({sessionId:n,ctx:e,clientId:r,envelope:t});if(i)return i;let s=t.payload&&typeof t.payload==="object"?t.payload:{},a=Ed(s.state);if(!a)return pe(t,"invalid_compaction_state","session.compaction.update requires a valid compaction state");let d=await e.sessionHost.updateSessionCompactionState(n,a),[l,c]=d.updated?await Promise.all([kn(e,n),Nn(e,n)]):[o,void 0];if(d.updated)e.publish(e.buildEvent("session.updated",{session:l??o,...c?{snapshot:c}:{}},n));return{version:t.version,requestId:t.requestId,ok:!0,payload:{updated:d.updated,session:l??o,...c?{snapshot:c}:{}}}}async function zX(e,t){let n=Rt(t),r=await CX(e,n);return ie(t,{deleted:r})}async function KX(e,t){let n=Rt(t),r=e.sessionHost.pendingPrompts;if(!r)return pe(t,"pending_prompts_unavailable","Pending prompt service is not available.");let o=await r.list({sessionId:n});return ie(t,{sessionId:n,prompts:o})}async function GX(e,t){let n=Rt(t),r=e.sessionHost.pendingPrompts;if(!r)return pe(t,"pending_prompts_unavailable","Pending prompt service is not available.");let o=await r.steerFirst({sessionId:n});return ie(t,o)}async function VX(e,t){let n=Rt(t),r=typeof t.payload?.promptId==="string"?t.payload.promptId.trim():"",o=typeof t.payload?.prompt==="string"?t.payload.prompt:void 0,i=t.payload?.delivery==="queue"||t.payload?.delivery==="steer"?t.payload.delivery:void 0,s=e.sessionHost.pendingPrompts;if(!s)return pe(t,"pending_prompts_unavailable","Pending prompt service is not available.");let a=await s.update({sessionId:n,promptId:r,prompt:o,delivery:i});return ie(t,a)}async function YX(e,t){let n=Rt(t),r=typeof t.payload?.promptId==="string"?t.payload.promptId.trim():"",o=e.sessionHost.pendingPrompts;if(!o)return pe(t,"pending_prompts_unavailable","Pending prompt service is not available.");let i=await o.delete({sessionId:n,promptId:r});return ie(t,i)}import{join as xHe}from"node:path";import{loadSqliteDb as _He}from"@cerebriline/shared/db";import{resolveDbDataDir as EHe}from"@cerebriline/shared/storage";var AHe=604800000,RHe=200000,IHe=67108864,CHe=16777216;function PHe(e){let t=e?.replace(/[^a-zA-Z0-9_-]/g,"-");return xHe(EHe(),t?`hub-events-${t}.db`:"hub-events.db")}class R0{db;retentionMs;maxRows;maxTotalBytes;appendedBytesSincePrune=0;closed=!1;constructor(e={}){this.db=_He(e.dbPath??PHe(e.ownerId)),this.retentionMs=e.retentionMs??AHe,this.maxRows=e.maxRows??RHe,this.maxTotalBytes=e.maxTotalBytes??IHe,this.db.exec("PRAGMA journal_mode = WAL;"),this.db.exec("PRAGMA synchronous = NORMAL;"),this.db.exec("PRAGMA busy_timeout = 5000;"),this.db.exec(`
2086
2086
  CREATE TABLE IF NOT EXISTS hub_events (
2087
2087
  sequence INTEGER PRIMARY KEY AUTOINCREMENT,
2088
2088
  event TEXT NOT NULL,
@@ -2118,7 +2118,7 @@ Title: ${t.title}
2118
2118
  Type: ${t.type}
2119
2119
  Priority: P${t.priority}${o}
2120
2120
 
2121
- ${t.instructions}${r}`,s=await Lm(this.ctx,{version:"v1",command:"run.start",requestId:P0("task_run_"),clientId:n.requestedByClientId??"agenda-task-manager",sessionId:e,payload:{sessionId:e,input:i,mode:t.mode??"act",timeoutSeconds:t.timeoutSeconds}});if(!s.ok)return{status:"failed",error:s.error?.message??"task session run failed"};let a=s.payload?.result,d=typeof a?.finishReason==="string"?a.finishReason:void 0,l=typeof a?.text==="string"&&a.text.trim()?a.text.trim():void 0;if(d==="completed")return{status:"completed",summary:l};if(d==="aborted")return{status:"cancelled",summary:l};return{status:"failed",summary:l,error:l??(d?`Task session ended with ${d}`:"Task session did not return a completion result")}}getCronService(){return this.cronService}getHubId(){return this.hubId}async start(){if(this.sessionSearch.start(),await this.tasks.start(),await this.schedules.start(),this.cronService)try{await this.cronService.start()}catch(e){console.error("[hub] cron service start failed",e)}this.startEventLog(),this.startRunQueue()}startEventLog(){if(this.options.eventLog===!1||this.eventLog)return;try{let e=new R0({ownerId:this.options.owner?.ownerId,...this.options.eventLog??{}});e.prune(),this.eventLog=e,this.eventLogPruneTimer=setInterval(()=>{try{e.prune()}catch{}},3600000),this.eventLogPruneTimer.unref?.()}catch(e){ke("error","event_log.start_failed",{error:e})}}startRunQueue(){if(this.options.runQueue===!1||this.runQueue)return;try{this.runQueue=new T0({ownerId:this.options.owner?.ownerId,...this.options.runQueue??{}}),this.runExecutor=new S0(this.ctx,this.runQueue);let e=this.runQueue.recoverOnStartup();for(let n of e.interrupted)this.publish(Kr("run.interrupted",{runId:n.runId,error:n.error,reason:"hub_restart"},n.sessionId));let t=new Set(e.requeued.map((n)=>n.sessionId));for(let n of t)this.runExecutor.pump(n);if(e.interrupted.length>0||e.requeued.length>0)ke("info","run.queue.recovered",{interrupted:e.interrupted.length,requeued:e.requeued.length})}catch(e){ke("error","run.queue.start_failed",{error:e})}}async stop(){if(this.eventLogPruneTimer)clearInterval(this.eventLogPruneTimer),this.eventLogPruneTimer=void 0;for(let e of this.pendingApprovals.keys())y0(this.ctx,e,{approved:!1,reason:"Hub shutting down before approval was resolved."});if(fs(this.ctx,()=>!0,"Hub shutting down before capability request was resolved."),await this.sessionSearch.dispose(),await this.tasks.dispose(),await this.sessionHost.dispose("hub_server_stop"),await this.schedules.dispose(),this.cronService)try{await this.cronService.dispose()}catch(e){console.error("[hub] cron service stop failed",e)}this.eventLog?.close(),this.eventLog=void 0,this.runQueue?.close(),this.runQueue=void 0,this.runExecutor=void 0}async handleCommand(e,t){try{let n=e.clientId?.trim(),r=t===void 0?this.options.workspaceRoot?.trim()&&n?{clientId:n,workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.workspaceRoot}}:void 0:t??void 0,o=await this.dispatchCommand(e,r);return this.captureFailedReply(e,o),o}catch(n){throw rk(this.options.telemetry,{component:"core",operation:"hub.command",error:n,severity:"error",handled:!1,context:this.commandTelemetryContext(e)}),n}}async dispatchCommand(e,t){if(this.draining&&gX(e.command))return yX(e);if(QX(e.command))return await this.taskCommands.handleCommand(e,t);switch(e.command){case"client.register":{let n=iX(this.ctx,e);return this.tasks.notifyAutomationReadinessChanged(),n}case"client.update":{let n=sX(this.ctx,e);return this.tasks.notifyAutomationReadinessChanged(),n}case"client.unregister":{let n=aX(this.ctx,e,(r)=>{this.listeners.delete(r),this.detachClientFromSessions(r)});return this.tasks.notifyAutomationReadinessChanged(),n}case"client.list":return dX(this.ctx,e);case"session.create":return await A0(this.ctx,e,(n)=>Qv(this.ctx,n));case"session.restore":return await LX(this.ctx,e,(n)=>Qv(this.ctx,n));case"session.attach":return await NX(this.ctx,e);case"session.detach":return await DX(this.ctx,e);case"session.get":return await $X(this.ctx,e);case"session.messages":return await FX(this.ctx,e);case"session.compaction.get":return await UX(this.ctx,e);case"session.list":return await BX(this.ctx,e);case"session.search":return await HX(this.ctx,e);case"session.update":return await WX(this.ctx,e);case"session.update_connection":return await jX(this.ctx,e);case"session.compaction.update":return await qX(this.ctx,e);case"session.pending_prompts":return await KX(this.ctx,e);case"session.steer_first_pending_prompt":return await GX(this.ctx,e);case"session.update_pending_prompt":return await VX(this.ctx,e);case"session.remove_pending_prompt":return await YX(this.ctx,e);case"session.delete":return await zX(this.ctx,e);case"session.hook":return await fX(this.ctx,e);case"run.start":case"session.send_input":return await Lm(this.ctx,e);case"run.enqueue":{if(!this.runQueue||!this.runExecutor)return{version:e.version,requestId:e.requestId,ok:!1,error:{code:"run_queue_unavailable",message:"This hub has no durable run queue; use run.start instead."}};return wX(this.ctx,e,this.runQueue,this.runExecutor)}case"run.list":{if(!this.runQueue)return ie(e,{runs:[]});return bX(e,this.runQueue)}case"hub.drain":return this.handleHubDrain(e);case"hub.status":return this.handleHubStatus(e);case"run.abort":return await pX(this.ctx,e);case"run.proceed_while_running":return await mX(this.ctx,e);case"capability.request":return await rX(this.ctx,e);case"approval.respond":return await ZY(this.ctx,e);case"capability.respond":return oX(this.ctx,e);case"capability.progress":return nX(this.ctx,e);case"ui.notify":return this.publish(Kr("ui.notify",e.payload??{})),ie(e);case"ui.show_window":return this.publish(Kr("ui.show_window",e.payload??{})),ie(e);case"settings.list":return await this.handleSettingsList(e);case"settings.toggle":return await this.handleSettingsToggle(e);case"connector.channels":case"connector.configure":case"connector.delete_config":case"connector.start":case"connector.stop":case"connector.supervised":return await uX(this.ctx,e);case"settings.get":case"settings.patch":return{version:e.version,requestId:e.requestId,ok:!1,error:{code:"not_implemented",message:`${e.command} is not implemented yet.`}};default:{let n=await this.scheduleCommands.handleCommand(e,t);if(n.ok){let r=XX(e.command);if(r)this.publish(Kr(r,n.payload))}return n}}}captureFailedReply(e,t){if(t.ok||!t.error||!HHe(t.error.code))return;rk(this.options.telemetry,{component:"core",operation:"hub.command_reply",error:Error(t.error.message),severity:t.error.code==="session_not_found"?"warn":"error",handled:!0,context:{...this.commandTelemetryContext(e),errorCode:t.error.code}})}commandTelemetryContext(e){return{command:e.command,requestId:e.requestId,clientId:e.clientId,sessionId:typeof e.payload?.sessionId==="string"?e.payload.sessionId:e.sessionId}}async handleSettingsList(e){try{let t=await this.settings.list(eJ(e.payload));return{version:e.version,requestId:e.requestId,ok:!0,payload:{snapshot:t}}}catch(t){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:"settings_list_failed",message:t instanceof Error?t.message:String(t)}}}}async handleSettingsToggle(e){try{let t=await this.settings.toggle(BHe(e.payload));return this.publish(Kr("settings.changed",{types:t.changedTypes,snapshot:t.snapshot})),{version:e.version,requestId:e.requestId,ok:!0,payload:{snapshot:t.snapshot,changedTypes:t.changedTypes}}}catch(t){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:"settings_toggle_failed",message:t instanceof Error?t.message:String(t)}}}}handleHubDrain(e){let t=e.payload?.draining!==!1,n=typeof e.payload?.reason==="string"?e.payload.reason:void 0;if(this.draining!==t)this.draining=t,this.publish(Kr("hub.drain_changed",{draining:this.draining,...n?{reason:n}:{}})),ke("info","hub.drain_changed",{draining:this.draining,reason:n});return ie(e,this.describeStatus())}handleHubStatus(e){return ie(e,this.describeStatus())}describeStatus(){let e=0;for(let t of this.activeRpcTurnCountBySession.values())e+=t;return{hubId:this.hubId,draining:this.draining,activeRpcTurns:e,pendingRuns:this.runQueue?.countPending()??0,eventLog:this.eventLog?{lastSequence:this.eventLog.lastSequence()}:void 0,idle:e===0&&(this.runQueue?.countPending()??0)===0}}isDraining(){return this.draining}replayEventsAfter(e,t){if(!this.eventLog)return[];return this.eventLog.listAfter(e,{sessionId:t.sessionId},t.limit)}lastEventSequence(){return this.eventLog?.lastSequence()??0}subscribe(e,t,n){let r=this.listeners.get(e)??new Set,o={sessionId:n?.sessionId,listener:t};r.add(o),this.listeners.set(e,r);let i=QY(this.ctx,n?.sessionId);if(i.length>0)queueMicrotask(()=>{if(!this.listeners.get(e)?.has(o))return;for(let a of i)try{o.listener(a)}catch(d){Za("listener threw while re-issuing pending approval",d)}});return()=>{let s=this.listeners.get(e);if(!s)return;if(s.delete(o),s.size===0)this.listeners.delete(e)}}detachClientFromSessions(e){for(let[t,n]of this.sessionState.entries()){if(n.participants.delete(e),n.createdByClientId===e)n.createdByClientId=void 0;if(n.participants.size===0)this.sessionState.delete(t)}fs(this.ctx,(t)=>t.targetClientId===e,`Capability owner client ${e} disconnected before request was resolved.`)}publish(e){if(this.eventLog)try{e=this.eventLog.append(e)}catch(t){Za(`event log append failed for ${e.event}`,t)}for(let t of this.listeners.values())for(let n of t){if(n.sessionId&&n.sessionId!==e.sessionId)continue;try{n.listener(e)}catch(r){Za(`listener threw while publishing ${e.event}`,r),rk(this.options.telemetry,{component:"core",operation:"hub.publish",error:r,severity:"warn",handled:!0,context:{event:e.event,sessionId:e.sessionId}})}}}}function HHe(e){return e==="session_not_found"||e==="session_messages_not_found"||e==="hub_command_timeout"||e.endsWith("_failed")}import{timingSafeEqual as tWe}from"node:crypto";import nWe from"node:http";import{URL as B0}from"node:url";import{CURRENT_HUB_PROTOCOL_VERSION as $0,HUB_CAPABILITIES as rWe,MAX_CLIENT_HUB_PROTOCOL_VERSION as oJ,MIN_CLIENT_HUB_PROTOCOL_VERSION as iJ}from"@cerebriline/shared";import{WebSocketServer as oWe}from"ws";import{createSessionId as FTt,ensureLoopbackProxyBypass as UTt,isHubProtocolCompatible as BTt,resolveClineBuildEnv as HTt,resolveHubCommandTimeoutMs as WTt}from"@cerebriline/shared";import qTt from"ws";import{CLINE_RUN_AS_HUB_DAEMON_ENV as TTt,isBunEmbeddedModulePath as STt,isHubDaemonProcess as xTt,resolveClineBuildEnv as _Tt,withResolvedClineBuildEnv as ETt}from"@cerebriline/shared";import{isAbsolute as KHe,relative as GHe,resolve as O0,sep as VHe}from"node:path";import{captureSdkError as rJ,HUB_COMMAND_SLOW_LOG_MS as YHe,resolveHubCommandTimeoutMs as XHe,safeJsonParse as JHe}from"@cerebriline/shared";var QHe=200,ZHe=1000;function L0(e){return{command:e.envelope.command,requestId:e.envelope.requestId,clientId:e.envelope.clientId,sessionId:e.envelope.sessionId}}function Fm(e,t,n){return{version:e.envelope.version,requestId:e.envelope.requestId,ok:!1,error:{code:t,message:n}}}function eWe(e,t,n=!1){let r=e.envelope.payload??{},o=e.envelope.clientId?.trim(),i=r.clientId?.trim()||o;if(!i||o&&i!==o)throw Error("Registration clientId must match the command connection");let s=r.workspaceContext?.workspaceRoot?.trim(),a=n?s||t?.trim():t?.trim();if(!a)return{clientId:i};let d=O0(a);if(!n&&s&&O0(s)!==d)throw Error("Registration workspace must match the Hub-authorized workspace");let l=O0(r.workspaceContext?.cwd?.trim()||d),c=GHe(d,l);if(c===".."||c.startsWith(`..${VHe}`)||KHe(c))throw Error("Registration cwd must be inside its workspace");return{clientId:i,workspaceContext:{workspaceRoot:d,cwd:l},...n?{crossWorkspace:!0}:{}}}class N0{transport;telemetry;workspaceRoot;constructor(e,t,n){this.transport=e;this.telemetry=t;this.workspaceRoot=n}attach(e,t={}){let n=new Map,r=new Set,o,i=!1,s=(c)=>{try{e.send(JSON.stringify(c))}catch(u){console.error(`[hub] failed to send websocket frame: ${u instanceof Error?u.stack||u.message:String(u)}`)}},a=(c)=>{s({kind:"event",envelope:c})},d=async(c)=>{try{let u=JSON.parse(c.data);switch(u.kind){case"command":{let h;if(o&&u.envelope.command==="client.register"){s({kind:"reply",envelope:Fm(u,"client_already_registered","This connection already owns a registered client.")});break}if(o&&u.envelope.clientId?.trim()!==o.clientId){s({kind:"reply",envelope:Fm(u,"client_authority_mismatch","Command clientId does not belong to this connection.")});break}if(u.envelope.command==="client.register")try{h=eWe(u,this.workspaceRoot,t.allowRegisteredWorkspace)}catch(S){s({kind:"reply",envelope:Fm(u,"invalid_client_registration",S instanceof Error?S.message:String(S))});break}let p=performance.now(),f=!1,m=L0(u);ke("info","command.start",m);let g=setTimeout(()=>{if(f)return;ke("warn","command.slow",{...m,elapsedMs:Math.round(performance.now()-p)})},YHe),y=this.transport.command(u.envelope,o??null);y.then((S)=>{if(!f)return;ke(S.ok?"warn":"error","command.late_end",{...m,elapsedMs:Math.round(performance.now()-p),ok:S.ok,errorCode:S.error?.code,errorMessage:S.error?.message})},(S)=>{if(!f)return;ke("error","command.late_error",{...m,elapsedMs:Math.round(performance.now()-p),error:S})});let w=!1,k,b,v=XHe(u.envelope.command,u.envelope.timeoutMs);try{b=v===null?await y:await Promise.race([y,new Promise((S)=>{k=setTimeout(()=>{w=!0,rJ(this.telemetry,{component:"core",operation:"hub.command_timeout",error:Error(`Hub command ${u.envelope.command} did not complete within ${v}ms.`),severity:"error",handled:!0,context:{...m,timeoutMs:v}}),S(Fm(u,"hub_command_timeout",`Hub command ${u.envelope.command} did not complete within ${v}ms. Check hub-daemon.log for command.start/command.slow logs with requestId ${u.envelope.requestId}.`))},v)})])}catch(S){if(clearTimeout(g),k)clearTimeout(k);throw S}if(f=w,clearTimeout(g),k)clearTimeout(k);let E=Math.round(performance.now()-p);if(w)ke("error","command.timeout",{...m,durationMs:E,timeoutMs:v});else ke(b.ok?"info":"warn","command.end",{...m,durationMs:E,ok:b.ok,errorCode:b.error?.code,errorMessage:b.error?.message});if(u.envelope.command==="client.register"&&b.ok){if(h)r.add(h.clientId),o=h}else if(u.envelope.command==="client.unregister"&&b.ok){let S=u.envelope.clientId?.trim();if(S)r.delete(S),o=void 0}s({kind:"reply",envelope:b});break}case"stream.subscribe":{let h=`${u.clientId}:${u.sessionId??"*"}`;if(n.has(h))break;let p=typeof u.sinceSequence==="number"&&Number.isFinite(u.sinceSequence)&&u.sinceSequence>=0?Math.floor(u.sinceSequence):void 0;if(p===void 0||typeof this.transport.replayEventsAfter!=="function"){let v=await this.transport.subscribe(u.clientId,a,{sessionId:u.sessionId});n.set(h,v);break}let f=!1,m=p,g=[],y=new Set,w=(v)=>{if(typeof v.sequence==="number"){if(v.sequence<=m)return;m=v.sequence}if(v.eventId&&y){if(y.has(v.eventId))return;y.add(v.eventId)}a(v)},k=(v)=>{if(!f){g.push(v);return}w(v)},b=await this.transport.subscribe(u.clientId,k,{sessionId:u.sessionId});n.set(h,b);try{let v=0;while(!i&&v<ZHe){let E=m,S=this.transport.replayEventsAfter(m,{sessionId:u.sessionId,limit:QHe});if(S.length===0)break;for(let x of S)w(x);if(m<=E)break;v+=1,await new Promise((x)=>setTimeout(x,0))}}finally{f=!0;for(let v of g)w(v);g.length=0,y=void 0}break}case"stream.unsubscribe":{let h=`${u.clientId}:${u.sessionId??"*"}`;n.get(h)?.(),n.delete(h);break}case"reply":case"event":break}}catch(u){let h=typeof c.data==="string"?JHe(c.data):void 0;if(!h||h.kind!=="command"){ke("error","rejected malformed websocket frame",{error:u});return}ke("error","command.error",{...L0(h),error:u}),rJ(this.telemetry,{component:"core",operation:"hub.websocket_command",error:u,severity:"error",handled:!0,context:L0(h)}),s({kind:"reply",envelope:Fm(h,"command_failed",u instanceof Error?u.message:"Unknown hub error")})}},l=()=>{if(i)return;i=!0;for(let c of n.values())c();n.clear();for(let c of r)this.transport.command({version:"v1",command:"client.unregister",clientId:c});r.clear(),e.removeEventListener("message",d),e.removeEventListener("close",l)};return e.addEventListener("message",d),e.addEventListener("close",l),l}}class D0{transport;constructor(e){this.transport=e}command(e,t){return this.transport.handleCommand(e,t)}subscribe(e,t,n){return this.transport.subscribe(e,t,n)}replayEventsAfter(e,t){return this.transport.replayEventsAfter?.(e,t)??[]}}function uJ(e){if(typeof e==="string")return e;if(e instanceof Uint8Array)return Buffer.from(e).toString();if(e instanceof ArrayBuffer)return Buffer.from(e).toString();if(Array.isArray(e))return Buffer.concat(e.map((t)=>Buffer.from(t))).toString();return String(e)}function iWe(e){return{send(t){e.send(t)},addEventListener(t,n){if(t==="message"){e.on("message",(r)=>{n({data:uJ(r)})});return}e.on("close",n)},removeEventListener(){}}}function sWe(e){try{e.write(`HTTP/1.1 400 Bad Request\r
2121
+ ${t.instructions}${r}`,s=await Lm(this.ctx,{version:"v1",command:"run.start",requestId:P0("task_run_"),clientId:n.requestedByClientId??"agenda-task-manager",sessionId:e,payload:{sessionId:e,input:i,mode:t.mode??"act",timeoutSeconds:t.timeoutSeconds}});if(!s.ok)return{status:"failed",error:s.error?.message??"task session run failed"};let a=s.payload?.result,d=typeof a?.finishReason==="string"?a.finishReason:void 0,l=typeof a?.text==="string"&&a.text.trim()?a.text.trim():void 0;if(d==="completed")return{status:"completed",summary:l};if(d==="aborted")return{status:"cancelled",summary:l};return{status:"failed",summary:l,error:l??(d?`Task session ended with ${d}`:"Task session did not return a completion result")}}getCronService(){return this.cronService}getHubId(){return this.hubId}async start(){if(this.sessionSearch.start(),await this.tasks.start(),await this.schedules.start(),this.cronService)try{await this.cronService.start()}catch(e){console.error("[hub] cron service start failed",e)}this.startEventLog(),this.startRunQueue()}startEventLog(){if(this.options.eventLog===!1||this.eventLog)return;try{let e=new R0({ownerId:this.options.owner?.ownerId,...this.options.eventLog??{}});e.prune(),this.eventLog=e,this.eventLogPruneTimer=setInterval(()=>{try{e.prune()}catch{}},3600000),this.eventLogPruneTimer.unref?.()}catch(e){ke("error","event_log.start_failed",{error:e})}}startRunQueue(){if(this.options.runQueue===!1||this.runQueue)return;try{this.runQueue=new T0({ownerId:this.options.owner?.ownerId,...this.options.runQueue??{}}),this.runExecutor=new S0(this.ctx,this.runQueue);let e=this.runQueue.recoverOnStartup();for(let n of e.interrupted)this.publish(Kr("run.interrupted",{runId:n.runId,error:n.error,reason:"hub_restart"},n.sessionId));let t=new Set(e.requeued.map((n)=>n.sessionId));for(let n of t)this.runExecutor.pump(n);if(e.interrupted.length>0||e.requeued.length>0)ke("info","run.queue.recovered",{interrupted:e.interrupted.length,requeued:e.requeued.length})}catch(e){ke("error","run.queue.start_failed",{error:e})}}async stop(){if(this.eventLogPruneTimer)clearInterval(this.eventLogPruneTimer),this.eventLogPruneTimer=void 0;for(let e of this.pendingApprovals.keys())y0(this.ctx,e,{approved:!1,reason:"Hub shutting down before approval was resolved."});if(fs(this.ctx,()=>!0,"Hub shutting down before capability request was resolved."),await this.sessionSearch.dispose(),await this.tasks.dispose(),await this.sessionHost.dispose("hub_server_stop"),await this.schedules.dispose(),this.cronService)try{await this.cronService.dispose()}catch(e){console.error("[hub] cron service stop failed",e)}this.eventLog?.close(),this.eventLog=void 0,this.runQueue?.close(),this.runQueue=void 0,this.runExecutor=void 0}async handleCommand(e,t){try{let n=e.clientId?.trim(),r=t===void 0?this.options.workspaceRoot?.trim()&&n?{clientId:n,workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.workspaceRoot}}:void 0:t??void 0,o=await this.dispatchCommand(e,r);return this.captureFailedReply(e,o),o}catch(n){throw rk(this.options.telemetry,{component:"core",operation:"hub.command",error:n,severity:"error",handled:!1,context:this.commandTelemetryContext(e)}),n}}async dispatchCommand(e,t){if(this.draining&&gX(e.command))return yX(e);if(QX(e.command))return await this.taskCommands.handleCommand(e,t);switch(e.command){case"client.register":{let n=iX(this.ctx,e);return this.tasks.notifyAutomationReadinessChanged(),n}case"client.update":{let n=sX(this.ctx,e);return this.tasks.notifyAutomationReadinessChanged(),n}case"client.unregister":{let n=aX(this.ctx,e,(r)=>{this.listeners.delete(r),this.detachClientFromSessions(r)});return this.tasks.notifyAutomationReadinessChanged(),n}case"client.list":return dX(this.ctx,e);case"session.create":return await A0(this.ctx,e,(n)=>Qv(this.ctx,n));case"session.restore":return await LX(this.ctx,e,(n)=>Qv(this.ctx,n));case"session.attach":return await NX(this.ctx,e);case"session.detach":return await DX(this.ctx,e);case"session.get":return await $X(this.ctx,e);case"session.messages":return await FX(this.ctx,e);case"session.compaction.get":return await UX(this.ctx,e);case"session.list":return await BX(this.ctx,e);case"session.search":return await HX(this.ctx,e);case"session.update":return await WX(this.ctx,e);case"session.update_connection":return await jX(this.ctx,e);case"session.compaction.update":return await qX(this.ctx,e);case"session.pending_prompts":return await KX(this.ctx,e);case"session.steer_first_pending_prompt":return await GX(this.ctx,e);case"session.update_pending_prompt":return await VX(this.ctx,e);case"session.remove_pending_prompt":return await YX(this.ctx,e);case"session.delete":return await zX(this.ctx,e);case"session.hook":return await fX(this.ctx,e);case"run.start":case"session.send_input":return await Lm(this.ctx,e);case"run.enqueue":{if(!this.runQueue||!this.runExecutor)return{version:e.version,requestId:e.requestId,ok:!1,error:{code:"run_queue_unavailable",message:"This hub has no durable run queue; use run.start instead."}};return wX(this.ctx,e,this.runQueue,this.runExecutor)}case"run.list":{if(!this.runQueue)return ie(e,{runs:[]});return bX(e,this.runQueue)}case"hub.drain":return this.handleHubDrain(e);case"hub.status":return this.handleHubStatus(e);case"run.abort":return await pX(this.ctx,e);case"run.proceed_while_running":return await mX(this.ctx,e);case"capability.request":return await rX(this.ctx,e);case"approval.respond":return await ZY(this.ctx,e);case"capability.respond":return oX(this.ctx,e);case"capability.progress":return nX(this.ctx,e);case"ui.notify":return this.publish(Kr("ui.notify",e.payload??{})),ie(e);case"ui.show_window":return this.publish(Kr("ui.show_window",e.payload??{})),ie(e);case"settings.list":return await this.handleSettingsList(e);case"settings.toggle":return await this.handleSettingsToggle(e);case"connector.channels":case"connector.configure":case"connector.delete_config":case"connector.start":case"connector.stop":case"connector.supervised":return await uX(this.ctx,e);case"settings.get":case"settings.patch":return{version:e.version,requestId:e.requestId,ok:!1,error:{code:"not_implemented",message:`${e.command} is not implemented yet.`}};default:{let n=await this.scheduleCommands.handleCommand(e,t);if(n.ok){let r=XX(e.command);if(r)this.publish(Kr(r,n.payload))}return n}}}captureFailedReply(e,t){if(t.ok||!t.error||!HHe(t.error.code))return;rk(this.options.telemetry,{component:"core",operation:"hub.command_reply",error:Error(t.error.message),severity:t.error.code==="session_not_found"?"warn":"error",handled:!0,context:{...this.commandTelemetryContext(e),errorCode:t.error.code}})}commandTelemetryContext(e){return{command:e.command,requestId:e.requestId,clientId:e.clientId,sessionId:typeof e.payload?.sessionId==="string"?e.payload.sessionId:e.sessionId}}async handleSettingsList(e){try{let t=await this.settings.list(eJ(e.payload));return{version:e.version,requestId:e.requestId,ok:!0,payload:{snapshot:t}}}catch(t){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:"settings_list_failed",message:t instanceof Error?t.message:String(t)}}}}async handleSettingsToggle(e){try{let t=await this.settings.toggle(BHe(e.payload));return this.publish(Kr("settings.changed",{types:t.changedTypes,snapshot:t.snapshot})),{version:e.version,requestId:e.requestId,ok:!0,payload:{snapshot:t.snapshot,changedTypes:t.changedTypes}}}catch(t){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:"settings_toggle_failed",message:t instanceof Error?t.message:String(t)}}}}handleHubDrain(e){let t=e.payload?.draining!==!1,n=typeof e.payload?.reason==="string"?e.payload.reason:void 0;if(this.draining!==t)this.draining=t,this.publish(Kr("hub.drain_changed",{draining:this.draining,...n?{reason:n}:{}})),ke("info","hub.drain_changed",{draining:this.draining,reason:n});return ie(e,this.describeStatus())}handleHubStatus(e){return ie(e,this.describeStatus())}describeStatus(){let e=0;for(let t of this.activeRpcTurnCountBySession.values())e+=t;return{hubId:this.hubId,draining:this.draining,activeRpcTurns:e,pendingRuns:this.runQueue?.countPending()??0,eventLog:this.eventLog?{lastSequence:this.eventLog.lastSequence()}:void 0,idle:e===0&&(this.runQueue?.countPending()??0)===0}}isDraining(){return this.draining}replayEventsAfter(e,t){if(!this.eventLog)return[];return this.eventLog.listAfter(e,{sessionId:t.sessionId},t.limit)}lastEventSequence(){return this.eventLog?.lastSequence()??0}subscribe(e,t,n){let r=this.listeners.get(e)??new Set,o={sessionId:n?.sessionId,listener:t};r.add(o),this.listeners.set(e,r);let i=QY(this.ctx,n?.sessionId);if(i.length>0)queueMicrotask(()=>{if(!this.listeners.get(e)?.has(o))return;for(let a of i)try{o.listener(a)}catch(d){Za("listener threw while re-issuing pending approval",d)}});return()=>{let s=this.listeners.get(e);if(!s)return;if(s.delete(o),s.size===0)this.listeners.delete(e)}}detachClientFromSessions(e){for(let[t,n]of this.sessionState.entries()){if(n.participants.delete(e),n.createdByClientId===e)n.createdByClientId=void 0;if(n.participants.size===0)this.sessionState.delete(t)}fs(this.ctx,(t)=>t.targetClientId===e,`Capability owner client ${e} disconnected before request was resolved.`)}publish(e){if(this.eventLog)try{e=this.eventLog.append(e)}catch(t){Za(`event log append failed for ${e.event}`,t)}for(let t of this.listeners.values())for(let n of t){if(n.sessionId&&n.sessionId!==e.sessionId)continue;try{n.listener(e)}catch(r){Za(`listener threw while publishing ${e.event}`,r),rk(this.options.telemetry,{component:"core",operation:"hub.publish",error:r,severity:"warn",handled:!0,context:{event:e.event,sessionId:e.sessionId}})}}}}function HHe(e){return e==="session_not_found"||e==="session_messages_not_found"||e==="hub_command_timeout"||e.endsWith("_failed")}import{timingSafeEqual as tWe}from"node:crypto";import nWe from"node:http";import{URL as B0}from"node:url";import{CURRENT_HUB_PROTOCOL_VERSION as $0,HUB_CAPABILITIES as rWe,MAX_CLIENT_HUB_PROTOCOL_VERSION as oJ,MIN_CLIENT_HUB_PROTOCOL_VERSION as iJ}from"@cerebriline/shared";import{WebSocketServer as oWe}from"ws";import{createSessionId as BTt,ensureLoopbackProxyBypass as HTt,isHubProtocolCompatible as WTt,resolveClineBuildEnv as jTt,resolveHubCommandTimeoutMs as qTt}from"@cerebriline/shared";import KTt from"ws";import{CLINE_RUN_AS_HUB_DAEMON_ENV as xTt,isBunEmbeddedModulePath as _Tt,isHubDaemonProcess as ETt,resolveClineBuildEnv as ATt,withResolvedClineBuildEnv as RTt}from"@cerebriline/shared";import{isAbsolute as KHe,relative as GHe,resolve as O0,sep as VHe}from"node:path";import{captureSdkError as rJ,HUB_COMMAND_SLOW_LOG_MS as YHe,resolveHubCommandTimeoutMs as XHe,safeJsonParse as JHe}from"@cerebriline/shared";var QHe=200,ZHe=1000;function L0(e){return{command:e.envelope.command,requestId:e.envelope.requestId,clientId:e.envelope.clientId,sessionId:e.envelope.sessionId}}function Fm(e,t,n){return{version:e.envelope.version,requestId:e.envelope.requestId,ok:!1,error:{code:t,message:n}}}function eWe(e,t,n=!1){let r=e.envelope.payload??{},o=e.envelope.clientId?.trim(),i=r.clientId?.trim()||o;if(!i||o&&i!==o)throw Error("Registration clientId must match the command connection");let s=r.workspaceContext?.workspaceRoot?.trim(),a=n?s||t?.trim():t?.trim();if(!a)return{clientId:i};let d=O0(a);if(!n&&s&&O0(s)!==d)throw Error("Registration workspace must match the Hub-authorized workspace");let l=O0(r.workspaceContext?.cwd?.trim()||d),c=GHe(d,l);if(c===".."||c.startsWith(`..${VHe}`)||KHe(c))throw Error("Registration cwd must be inside its workspace");return{clientId:i,workspaceContext:{workspaceRoot:d,cwd:l},...n?{crossWorkspace:!0}:{}}}class N0{transport;telemetry;workspaceRoot;constructor(e,t,n){this.transport=e;this.telemetry=t;this.workspaceRoot=n}attach(e,t={}){let n=new Map,r=new Set,o,i=!1,s=(c)=>{try{e.send(JSON.stringify(c))}catch(u){console.error(`[hub] failed to send websocket frame: ${u instanceof Error?u.stack||u.message:String(u)}`)}},a=(c)=>{s({kind:"event",envelope:c})},d=async(c)=>{try{let u=JSON.parse(c.data);switch(u.kind){case"command":{let h;if(o&&u.envelope.command==="client.register"){s({kind:"reply",envelope:Fm(u,"client_already_registered","This connection already owns a registered client.")});break}if(o&&u.envelope.clientId?.trim()!==o.clientId){s({kind:"reply",envelope:Fm(u,"client_authority_mismatch","Command clientId does not belong to this connection.")});break}if(u.envelope.command==="client.register")try{h=eWe(u,this.workspaceRoot,t.allowRegisteredWorkspace)}catch(S){s({kind:"reply",envelope:Fm(u,"invalid_client_registration",S instanceof Error?S.message:String(S))});break}let p=performance.now(),f=!1,m=L0(u);ke("info","command.start",m);let g=setTimeout(()=>{if(f)return;ke("warn","command.slow",{...m,elapsedMs:Math.round(performance.now()-p)})},YHe),y=this.transport.command(u.envelope,o??null);y.then((S)=>{if(!f)return;ke(S.ok?"warn":"error","command.late_end",{...m,elapsedMs:Math.round(performance.now()-p),ok:S.ok,errorCode:S.error?.code,errorMessage:S.error?.message})},(S)=>{if(!f)return;ke("error","command.late_error",{...m,elapsedMs:Math.round(performance.now()-p),error:S})});let w=!1,k,b,v=XHe(u.envelope.command,u.envelope.timeoutMs);try{b=v===null?await y:await Promise.race([y,new Promise((S)=>{k=setTimeout(()=>{w=!0,rJ(this.telemetry,{component:"core",operation:"hub.command_timeout",error:Error(`Hub command ${u.envelope.command} did not complete within ${v}ms.`),severity:"error",handled:!0,context:{...m,timeoutMs:v}}),S(Fm(u,"hub_command_timeout",`Hub command ${u.envelope.command} did not complete within ${v}ms. Check hub-daemon.log for command.start/command.slow logs with requestId ${u.envelope.requestId}.`))},v)})])}catch(S){if(clearTimeout(g),k)clearTimeout(k);throw S}if(f=w,clearTimeout(g),k)clearTimeout(k);let E=Math.round(performance.now()-p);if(w)ke("error","command.timeout",{...m,durationMs:E,timeoutMs:v});else ke(b.ok?"info":"warn","command.end",{...m,durationMs:E,ok:b.ok,errorCode:b.error?.code,errorMessage:b.error?.message});if(u.envelope.command==="client.register"&&b.ok){if(h)r.add(h.clientId),o=h}else if(u.envelope.command==="client.unregister"&&b.ok){let S=u.envelope.clientId?.trim();if(S)r.delete(S),o=void 0}s({kind:"reply",envelope:b});break}case"stream.subscribe":{let h=`${u.clientId}:${u.sessionId??"*"}`;if(n.has(h))break;let p=typeof u.sinceSequence==="number"&&Number.isFinite(u.sinceSequence)&&u.sinceSequence>=0?Math.floor(u.sinceSequence):void 0;if(p===void 0||typeof this.transport.replayEventsAfter!=="function"){let v=await this.transport.subscribe(u.clientId,a,{sessionId:u.sessionId});n.set(h,v);break}let f=!1,m=p,g=[],y=new Set,w=(v)=>{if(typeof v.sequence==="number"){if(v.sequence<=m)return;m=v.sequence}if(v.eventId&&y){if(y.has(v.eventId))return;y.add(v.eventId)}a(v)},k=(v)=>{if(!f){g.push(v);return}w(v)},b=await this.transport.subscribe(u.clientId,k,{sessionId:u.sessionId});n.set(h,b);try{let v=0;while(!i&&v<ZHe){let E=m,S=this.transport.replayEventsAfter(m,{sessionId:u.sessionId,limit:QHe});if(S.length===0)break;for(let x of S)w(x);if(m<=E)break;v+=1,await new Promise((x)=>setTimeout(x,0))}}finally{f=!0;for(let v of g)w(v);g.length=0,y=void 0}break}case"stream.unsubscribe":{let h=`${u.clientId}:${u.sessionId??"*"}`;n.get(h)?.(),n.delete(h);break}case"reply":case"event":break}}catch(u){let h=typeof c.data==="string"?JHe(c.data):void 0;if(!h||h.kind!=="command"){ke("error","rejected malformed websocket frame",{error:u});return}ke("error","command.error",{...L0(h),error:u}),rJ(this.telemetry,{component:"core",operation:"hub.websocket_command",error:u,severity:"error",handled:!0,context:L0(h)}),s({kind:"reply",envelope:Fm(h,"command_failed",u instanceof Error?u.message:"Unknown hub error")})}},l=()=>{if(i)return;i=!0;for(let c of n.values())c();n.clear();for(let c of r)this.transport.command({version:"v1",command:"client.unregister",clientId:c});r.clear(),e.removeEventListener("message",d),e.removeEventListener("close",l)};return e.addEventListener("message",d),e.addEventListener("close",l),l}}class D0{transport;constructor(e){this.transport=e}command(e,t){return this.transport.handleCommand(e,t)}subscribe(e,t,n){return this.transport.subscribe(e,t,n)}replayEventsAfter(e,t){return this.transport.replayEventsAfter?.(e,t)??[]}}function uJ(e){if(typeof e==="string")return e;if(e instanceof Uint8Array)return Buffer.from(e).toString();if(e instanceof ArrayBuffer)return Buffer.from(e).toString();if(Array.isArray(e))return Buffer.concat(e.map((t)=>Buffer.from(t))).toString();return String(e)}function iWe(e){return{send(t){e.send(t)},addEventListener(t,n){if(t==="message"){e.on("message",(r)=>{n({data:uJ(r)})});return}e.on("close",n)},removeEventListener(){}}}function sWe(e){try{e.write(`HTTP/1.1 400 Bad Request\r
2122
2122
  Connection: close\r
2123
2123
  Content-Length: 0\r
2124
2124
  \r