@cerebriline/core 4.100.272 → 4.100.273

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1277,7 +1277,7 @@ ${i}${e.instructions}
1277
1277
 
1278
1278
  ${s}`:o.instructions}})}}}function dv(e){return e.trim().replace(/^\/+/,"").toLowerCase()}function g8(e,t){let n=e.map((i)=>i.createSkillsExecutor?.(t)).filter((i)=>i!==void 0),r=()=>n.flatMap((i)=>(i.configuredSkills??[]).map((s)=>({metadata:s,executor:i}))),o=async(i,s,a)=>{let d=dv(i);if(!d)return"Missing skill name.";let l=r(),c=l.filter(({metadata:f})=>dv(f.id)===d),u=c.length>0?c:l.filter(({metadata:f})=>{let m=dv(f.id);return dv(f.name)===d||m.endsWith(`:${d}`)}),h=u.filter(({metadata:f})=>!f.disabled);if(h.length===1)return h[0].executor(h[0].metadata.id,s,a);if(h.length>1)return`Skill "${i}" is ambiguous. Use one of: ${h.map(({metadata:f})=>f.id).join(", ")}`;if(u.length>0)return`Skill "${i}" is configured but disabled.`;let p=l.filter(({metadata:f})=>!f.disabled).map(({metadata:f})=>f.id).sort((f,m)=>f.localeCompare(m));return p.length>0?`Skill "${i}" not found. Available skills: ${p.join(", ")}`:"No skills are currently available."};return Object.defineProperty(o,"configuredSkills",{get:()=>r().map(({metadata:i})=>i),enumerable:!0,configurable:!1}),o}function kC(e){if(e.length===0)throw Error("At least one user instruction service is required.");if(e.length===1)return e[0];let t=(r)=>{let o=new Map;for(let i of e)for(let s of i.listRecords(r))if(!o.has(s.id))o.set(s.id,s);return[...o.values()]},n=()=>{let r=new Map;for(let o of e)for(let i of o.listRuntimeCommands()){let s=ls(i.name);if(s&&!r.has(s))r.set(s,i)}return[...r.values()].sort((o,i)=>o.name.localeCompare(i.name))};return{start:async()=>{await Promise.all(e.map((r)=>r.start()))},stop:()=>{for(let r of e)r.stop()},refreshType:async(r)=>{await Promise.all(e.map((o)=>o.refreshType(r)))},listRecords:t,listRuntimeCommands:n,resolveRuntimeSlashCommand:(r,o)=>{for(let i of e){let s=i.resolveRuntimeSlashCommand(r,o);if(s!==r)return s}return r},hasConfiguredSkills:(r)=>e.some((o)=>o.hasConfiguredSkills(r)),createSkillsExecutor:(r)=>g8(e,r),createExtension:(r)=>({name:"cline-combined-user-instructions",manifest:{capabilities:[r.includeRules?"rules":void 0,r.registerSkillsTool?"tools":void 0,r.includeSkills||r.includeWorkflows?"commands":void 0].filter((o)=>Boolean(o))},setup(o){if(r.includeRules)o.registerRule({id:"cline-combined-user-instructions:rules",source:"combined-user-instructions",content:()=>sv(t("rule"))});if(r.registerSkillsTool)o.registerTool(Ho(g8(e,r.allowedSkillNames)));for(let i of n().filter((s)=>s.kind==="skill"&&r.includeSkills||s.kind==="workflow"&&r.includeWorkflows))o.registerCommand({name:i.name,description:i.description,handler:(s)=>{let a=s.trim();return a?`${i.instructions}
1279
1279
 
1280
- ${a}`:i.instructions}})}})}}class y8{watcher;ready;stopped=!1;constructor(e){this.watcher=d8(e)}start(){if(!this.ready)this.stopped=!1,this.ready=this.watcher.start();return this.ready}stop(){if(this.stopped)return;this.stopped=!0,this.watcher.stop(),this.ready=void 0}async refreshType(e){await this.start(),await this.watcher.refreshType(e)}listRecords(e){return[...this.watcher.getSnapshot(e).entries()].map(([t,n])=>({type:e,id:t,filePath:n.filePath,item:n.item}))}listRuntimeCommands(){return Qp(this.watcher)}resolveRuntimeSlashCommand(e,t){return m8(e,this.watcher,t)}hasConfiguredSkills(e){return Zp(this.watcher,e).some((t)=>!t.disabled)}createSkillsExecutor(e){return vC(this.watcher,(this.ready??Promise.resolve()).catch(()=>{}),e)}createExtension(e){return f8({...e,watcher:this.watcher,watcherReady:(this.ready??Promise.resolve()).catch(()=>{})})}}function Lc(e){return new y8(e)}import{spawn as WLe}from"node:child_process";import{mkdir as jLe}from"node:fs/promises";import{StringDecoder as z8}from"node:string_decoder";import{formatMcpTimeoutErrorMessage as qLe,isMcpTimeoutConfigured as G8}from"@cerebriline/shared";import{Client as zLe}from"@modelcontextprotocol/sdk/client/index.js";import{randomUUID as MLe}from"node:crypto";import{UnauthorizedError as U8}from"@modelcontextprotocol/sdk/client/auth.js";import{Client as out}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as OLe,SseError as LLe}from"@modelcontextprotocol/sdk/client/sse.js";import{StreamableHTTPClientTransport as NLe}from"@modelcontextprotocol/sdk/client/streamableHttp.js";LC();import{formatMcpTimeoutErrorMessage as ILe,resolveMcpTimeoutSeconds as CLe}from"@cerebriline/shared";import{ErrorCode as PLe,McpError as $8}from"@modelcontextprotocol/sdk/types.js";function hv(e){return CLe(e)*1000}function om(e,t,n){if(!(e instanceof $8)||e.code!==PLe.RequestTimeout)return e;return new $8(e.code,ILe(t,n),e.data)}var DLe=new Set([301,302,303,307,308]),F8=20,$Le=new Set(["authorization","cookie","proxy-authorization"]),FLe=new Set(["mcp-protocol-version","mcp-session-id"]);function ULe(e){if(!e.headers||!e.restrictConfiguredHeadersToOrigin)return e.headers;let t=Object.entries(e.headers).filter(([n])=>{let r=n.toLowerCase();if(FLe.has(r))return!1;return r!=="authorization"||!e.oauthProvider});return t.length>0?Object.fromEntries(t):void 0}function BLe(e){let t=new URL(e.endpointUrl).origin,n=new Set(Object.keys(e.configuredHeaders).map((i)=>i.toLowerCase())),r=e.baseFetch??globalThis.fetch,o=(i)=>{let s=[];i.forEach((a,d)=>{let l=d.toLowerCase();if(n.has(l)||$Le.has(l))s.push(d)});for(let a of s)i.delete(a)};return async(i,s)=>{let a=i instanceof Request?new Request(i,s):new Request(String(i),s),d=new URL(a.url),l=a.method,c=l==="GET"||l==="HEAD"?void 0:await a.clone().arrayBuffer(),u=new Headers(a.headers);if(d.origin!==t)o(u);for(let h=0;;h+=1){let p=await r(d,{method:l,headers:u,body:c,redirect:"manual",signal:a.signal});if(!DLe.has(p.status))return p;if(h>=F8)throw await p.body?.cancel().catch(()=>{return}),Error(`MCP endpoint exceeded ${F8} redirects.`);let f=p.headers.get("location");if(!f)return p;let m=new URL(f,d);if(await p.body?.cancel().catch(()=>{return}),m.origin!==t)o(u);if(p.status===303&&l!=="GET"&&l!=="HEAD"||(p.status===301||p.status===302)&&l==="POST")l="GET",c=void 0,u.delete("content-length"),u.delete("content-type");d=m}}}function HLe(e){return{client_name:"Cerebriline",redirect_uris:[e],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none"}}function NC(e){return e?{client_id:e.clientId,...e.clientSecret?{client_secret:e.clientSecret}:{}}:void 0}function pv(e,t){return e?.client_id===t?.client_id&&e?.client_secret===t?.client_secret}function im(e,t,n){if(!pv(t.clientInformation,n))throw new Nc(e)}function DC(e){let t={};try{t=PC(e.serverName,{filePath:e.settingsPath})??{}}catch{t={}}let n,r,o=()=>e.clientInformation??t.clientInformation,i=e.clientInformation?{clientId:e.clientInformation.client_id,...e.clientInformation.client_secret?{clientSecret:e.clientInformation.client_secret}:{}}:null,s=async(d)=>{try{t=await MC(e.serverName,d,{filePath:e.settingsPath,expectedOAuthClient:i})}catch(l){if(e.settingsPath||l instanceof Nc)throw l;t=tm(d(t))??{}}};return{provider:{get redirectUrl(){return t.redirectUrl??e.redirectUrl},get clientMetadata(){return HLe(t.redirectUrl??e.redirectUrl)},state:()=>(r=MLe(),r),clientInformation:o,saveClientInformation:async(d)=>{let l=t.clientInformation;await s((c)=>{im(e.serverName,c,l);let u=!pv(c.clientInformation,d);return{...c,clientInformation:d,...u?{tokens:void 0,lastAuthenticatedAt:void 0}:{},redirectUrl:e.redirectUrl,lastError:void 0}})},tokens:()=>o()?.client_id&&pv(t.clientInformation,o())?t.tokens:void 0,saveTokens:async(d)=>{let l=Date.now(),c=o();if(!c?.client_id)throw Error("Cannot save MCP OAuth tokens without a client ID.");await s((u)=>{if(u.clientInformation||!e.clientInformation)im(e.serverName,u,c);return{...u,tokens:d,clientInformation:c,redirectUrl:e.redirectUrl,lastError:void 0,lastAuthenticatedAt:l}})},redirectToAuthorization:async(d)=>{n=d.toString(),await e.onAuthorizationUrl?.(n)},saveCodeVerifier:async(d)=>{let l=o();await s((c)=>(im(e.serverName,c,l),{...c,codeVerifier:d,redirectUrl:e.redirectUrl}))},codeVerifier:()=>{if(!t.codeVerifier)throw Error(`Missing OAuth code verifier for MCP server "${e.serverName}".`);return t.codeVerifier},invalidateCredentials:async(d)=>{let l=t.clientInformation;await s((c)=>{if(im(e.serverName,c,l),d==="all")return{lastError:c.lastError,redirectUrl:c.redirectUrl};return{...c,...d==="client"?{clientInformation:void 0}:{},...d==="tokens"?{tokens:void 0,lastAuthenticatedAt:void 0}:{},...d==="verifier"?{codeVerifier:void 0}:{},...d==="discovery"?{discoveryState:void 0}:{}}})},saveDiscoveryState:async(d)=>{let l=t.clientInformation;await s((c)=>(im(e.serverName,c,l),{...c,discoveryState:d}))},discoveryState:()=>t.discoveryState},getLastAuthorizationUrl:()=>n,getLastOAuthState:()=>r,resetInteractiveState:async()=>{await s((d)=>{let l=e.clientInformation,c=l!==void 0&&!pv(d.clientInformation,l);return{...d,...l?{clientInformation:l}:{},...c?{tokens:void 0,lastAuthenticatedAt:void 0}:{},codeVerifier:void 0,discoveryState:void 0,lastError:void 0,redirectUrl:e.redirectUrl}})},markError:async(d)=>{await s((l)=>({...l,lastError:d}))},markConnectionError:async(d)=>{await s((l)=>({...l,lastError:d,authorizationRequired:void 0}))},markAuthorizationRequired:async(d)=>{await s((l)=>({...l,lastError:d,authorizationRequired:!0}))},clearError:async()=>{await s((d)=>({...d,lastError:void 0,authorizationRequired:void 0}))}}}function B8(e){let t=e.registration.transport;if(t.type==="stdio")throw Error(`MCP server "${e.registration.name}" uses stdio transport and does not support OAuth browser flow.`);let n=ULe({headers:t.headers,oauthProvider:e.oauthProvider,restrictConfiguredHeadersToOrigin:e.restrictConfiguredHeadersToOrigin}),r=n?{headers:n}:void 0,o=e.restrictConfiguredHeadersToOrigin&&n?BLe({endpointUrl:t.url,configuredHeaders:n,baseFetch:e.fetch}):e.fetch,i=e.oauthProvider?o:async(s,a)=>{let d=await(o??globalThis.fetch)(s,a);if(d.status===401)throw await d.body?.cancel().catch(()=>{return}),new U8("MCP server requires authorization");return d};if(t.type==="sse")return new OLe(new URL(t.url),{authProvider:e.oauthProvider,requestInit:r,eventSourceInit:{fetch:(s,a)=>(o??globalThis.fetch)(s,a)},fetch:i});return new NLe(new URL(t.url),{authProvider:e.oauthProvider,requestInit:r,fetch:i})}function $C(e){return e instanceof U8||e instanceof LLe&&e.code===401}var GLe="2024-11-05",K8=1e4,KLe=1e4,H8="http://127.0.0.1:1456/mcp/oauth/callback",W8=250,FC=2000;function Wa(e){return e instanceof Error?e.message:String(e)}async function mv(e,t){return new Promise((n)=>{let r=!1,o=(s)=>{if(r)return;r=!0,clearTimeout(i),n(s)},i=setTimeout(()=>o(!1),t);i.unref(),e.then(()=>o(!0),()=>o(!0))})}function VLe(e,t,n){let r=Wa(t),o=Wa(n);if(r===o)return t instanceof Error?t:Error(r);return Error(`MCP server "${e}" failed to initialize. Newline-delimited attempt: ${r} Content-Length framed attempt: ${o}`)}function j8(e){return Buffer.from(`${JSON.stringify(e)}
1280
+ ${a}`:i.instructions}})}})}}class y8{watcher;ready;stopped=!1;constructor(e){this.watcher=d8(e)}start(){if(!this.ready)this.stopped=!1,this.ready=this.watcher.start();return this.ready}stop(){if(this.stopped)return;this.stopped=!0,this.watcher.stop(),this.ready=void 0}async refreshType(e){await this.start(),await this.watcher.refreshType(e)}listRecords(e){return[...this.watcher.getSnapshot(e).entries()].map(([t,n])=>({type:e,id:t,filePath:n.filePath,item:n.item}))}listRuntimeCommands(){return Qp(this.watcher)}resolveRuntimeSlashCommand(e,t){return m8(e,this.watcher,t)}hasConfiguredSkills(e){return Zp(this.watcher,e).some((t)=>!t.disabled)}createSkillsExecutor(e){return vC(this.watcher,(this.ready??Promise.resolve()).catch(()=>{}),e)}createExtension(e){return f8({...e,watcher:this.watcher,watcherReady:(this.ready??Promise.resolve()).catch(()=>{})})}}function Lc(e){return new y8(e)}import{spawn as WLe}from"node:child_process";import{mkdir as jLe}from"node:fs/promises";import{StringDecoder as z8}from"node:string_decoder";import{formatMcpTimeoutErrorMessage as qLe,isMcpTimeoutConfigured as G8}from"@cerebriline/shared";import{Client as zLe}from"@modelcontextprotocol/sdk/client/index.js";import{randomUUID as MLe}from"node:crypto";import{UnauthorizedError as U8}from"@modelcontextprotocol/sdk/client/auth.js";import{Client as out}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as OLe,SseError as LLe}from"@modelcontextprotocol/sdk/client/sse.js";import{StreamableHTTPClientTransport as NLe}from"@modelcontextprotocol/sdk/client/streamableHttp.js";LC();import{formatMcpTimeoutErrorMessage as ILe,resolveMcpTimeoutSeconds as CLe}from"@cerebriline/shared";import{ErrorCode as PLe,McpError as $8}from"@modelcontextprotocol/sdk/types.js";function hv(e){return CLe(e)*1000}function om(e,t,n){if(!(e instanceof $8)||e.code!==PLe.RequestTimeout)return e;return new $8(e.code,ILe(t,n),e.data)}var DLe=new Set([301,302,303,307,308]),F8=20,$Le=new Set(["authorization","cookie","proxy-authorization"]),FLe=new Set(["mcp-protocol-version","mcp-session-id"]);function ULe(e){if(!e.headers||!e.restrictConfiguredHeadersToOrigin)return e.headers;let t=Object.entries(e.headers).filter(([n])=>{let r=n.toLowerCase();if(FLe.has(r))return!1;return r!=="authorization"||!e.oauthProvider});return t.length>0?Object.fromEntries(t):void 0}function BLe(e){let t=new URL(e.endpointUrl).origin,n=new Set(Object.keys(e.configuredHeaders).map((i)=>i.toLowerCase())),r=e.baseFetch??globalThis.fetch,o=(i)=>{let s=[];i.forEach((a,d)=>{let l=d.toLowerCase();if(n.has(l)||$Le.has(l))s.push(d)});for(let a of s)i.delete(a)};return async(i,s)=>{let a=i instanceof Request?new Request(i,s):new Request(String(i),s),d=new URL(a.url),l=a.method,c=l==="GET"||l==="HEAD"?void 0:await a.clone().arrayBuffer(),u=new Headers(a.headers);if(d.origin!==t)o(u);for(let h=0;;h+=1){let p=await r(d,{method:l,headers:u,body:c,redirect:"manual",signal:a.signal});if(!DLe.has(p.status))return p;if(h>=F8)throw await p.body?.cancel().catch(()=>{return}),Error(`MCP endpoint exceeded ${F8} redirects.`);let f=p.headers.get("location");if(!f)return p;let m=new URL(f,d);if(await p.body?.cancel().catch(()=>{return}),m.origin!==t)o(u);if(p.status===303&&l!=="GET"&&l!=="HEAD"||(p.status===301||p.status===302)&&l==="POST")l="GET",c=void 0,u.delete("content-length"),u.delete("content-type");d=m}}}function HLe(e){return{client_name:"Cerebriline",redirect_uris:[e],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none"}}function NC(e){return e?{client_id:e.clientId,...e.clientSecret?{client_secret:e.clientSecret}:{}}:void 0}function pv(e,t){return e?.client_id===t?.client_id&&e?.client_secret===t?.client_secret}function im(e,t,n){if(!pv(t.clientInformation,n))throw new Nc(e)}function DC(e){let t={};try{t=PC(e.serverName,{filePath:e.settingsPath})??{}}catch{t={}}let n,r,o=()=>e.clientInformation??t.clientInformation,i=e.clientInformation?{clientId:e.clientInformation.client_id,...e.clientInformation.client_secret?{clientSecret:e.clientInformation.client_secret}:{}}:null,s=async(d)=>{try{t=await MC(e.serverName,d,{filePath:e.settingsPath,expectedOAuthClient:i})}catch(l){if(e.settingsPath||l instanceof Nc)throw l;t=tm(d(t))??{}}};return{provider:{get redirectUrl(){return t.redirectUrl??e.redirectUrl},get clientMetadata(){return HLe(t.redirectUrl??e.redirectUrl)},state:()=>(r=MLe(),r),clientInformation:o,saveClientInformation:async(d)=>{let l=t.clientInformation;await s((c)=>{im(e.serverName,c,l);let u=!pv(c.clientInformation,d);return{...c,clientInformation:d,...u?{tokens:void 0,lastAuthenticatedAt:void 0}:{},redirectUrl:e.redirectUrl,lastError:void 0}})},tokens:()=>o()?.client_id&&pv(t.clientInformation,o())?t.tokens:void 0,saveTokens:async(d)=>{let l=Date.now(),c=o();if(!c?.client_id)throw Error("Cannot save MCP OAuth tokens without a client ID.");await s((u)=>{if(u.clientInformation||!e.clientInformation)im(e.serverName,u,c);return{...u,tokens:d,clientInformation:c,redirectUrl:e.redirectUrl,lastError:void 0,lastAuthenticatedAt:l}})},redirectToAuthorization:async(d)=>{n=d.toString(),await e.onAuthorizationUrl?.(n)},saveCodeVerifier:async(d)=>{let l=o();await s((c)=>(im(e.serverName,c,l),{...c,codeVerifier:d,redirectUrl:e.redirectUrl}))},codeVerifier:()=>{if(!t.codeVerifier)throw Error(`Missing OAuth code verifier for MCP server "${e.serverName}".`);return t.codeVerifier},invalidateCredentials:async(d)=>{let l=t.clientInformation;await s((c)=>{if(im(e.serverName,c,l),d==="all")return{lastError:c.lastError,redirectUrl:c.redirectUrl};return{...c,...d==="client"?{clientInformation:void 0}:{},...d==="tokens"?{tokens:void 0,lastAuthenticatedAt:void 0}:{},...d==="verifier"?{codeVerifier:void 0}:{},...d==="discovery"?{discoveryState:void 0}:{}}})},saveDiscoveryState:async(d)=>{let l=t.clientInformation;await s((c)=>(im(e.serverName,c,l),{...c,discoveryState:d}))},discoveryState:()=>t.discoveryState},getLastAuthorizationUrl:()=>n,getLastOAuthState:()=>r,resetInteractiveState:async(d)=>{await s((l)=>{let c=e.clientInformation,u=c!==void 0&&!pv(l.clientInformation,c);return{...l,...c?{clientInformation:c}:{},...u||d?.forgetTokens?{tokens:void 0,lastAuthenticatedAt:void 0}:{},codeVerifier:void 0,discoveryState:void 0,lastError:void 0,redirectUrl:e.redirectUrl}})},markError:async(d)=>{await s((l)=>({...l,lastError:d}))},markConnectionError:async(d)=>{await s((l)=>({...l,lastError:d,authorizationRequired:void 0}))},markAuthorizationRequired:async(d)=>{await s((l)=>({...l,lastError:d,authorizationRequired:!0}))},clearError:async()=>{await s((d)=>({...d,lastError:void 0,authorizationRequired:void 0}))}}}function B8(e){let t=e.registration.transport;if(t.type==="stdio")throw Error(`MCP server "${e.registration.name}" uses stdio transport and does not support OAuth browser flow.`);let n=ULe({headers:t.headers,oauthProvider:e.oauthProvider,restrictConfiguredHeadersToOrigin:e.restrictConfiguredHeadersToOrigin}),r=n?{headers:n}:void 0,o=e.restrictConfiguredHeadersToOrigin&&n?BLe({endpointUrl:t.url,configuredHeaders:n,baseFetch:e.fetch}):e.fetch,i=e.oauthProvider?o:async(s,a)=>{let d=await(o??globalThis.fetch)(s,a);if(d.status===401)throw await d.body?.cancel().catch(()=>{return}),new U8("MCP server requires authorization");return d};if(t.type==="sse")return new OLe(new URL(t.url),{authProvider:e.oauthProvider,requestInit:r,eventSourceInit:{fetch:(s,a)=>(o??globalThis.fetch)(s,a)},fetch:i});return new NLe(new URL(t.url),{authProvider:e.oauthProvider,requestInit:r,fetch:i})}function $C(e){return e instanceof U8||e instanceof LLe&&e.code===401}var GLe="2024-11-05",K8=1e4,KLe=1e4,H8="http://127.0.0.1:1456/mcp/oauth/callback",W8=250,FC=2000;function Wa(e){return e instanceof Error?e.message:String(e)}async function mv(e,t){return new Promise((n)=>{let r=!1,o=(s)=>{if(r)return;r=!0,clearTimeout(i),n(s)},i=setTimeout(()=>o(!1),t);i.unref(),e.then(()=>o(!0),()=>o(!0))})}function VLe(e,t,n){let r=Wa(t),o=Wa(n);if(r===o)return t instanceof Error?t:Error(r);return Error(`MCP server "${e}" failed to initialize. Newline-delimited attempt: ${r} Content-Length framed attempt: ${o}`)}function j8(e){return Buffer.from(`${JSON.stringify(e)}
1281
1281
  `,"utf8")}function q8(e){let t=Buffer.from(JSON.stringify(e),"utf8");return Buffer.concat([Buffer.from(`Content-Length: ${t.byteLength}\r
1282
1282
  \r
1283
1283
  `,"utf8"),t])}class UC{buffer="";decoder=new z8("utf8");push(e){this.buffer+=this.decoder.write(e);let t=[];while(!0){let n=this.buffer.indexOf(`\r
@@ -1285,7 +1285,7 @@ ${a}`:i.instructions}})}})}}class y8{watcher;ready;stopped=!1;constructor(e){thi
1285
1285
  `);if(n<0)break;let o=this.buffer.slice(0,n).match(/(?:^|\r\n)Content-Length:\s*(\d+)(?:\r\n|$)/i);if(!o)throw Error("Invalid MCP stdio frame: missing Content-Length header.");let i=Number.parseInt(o[1],10),s=n+4,a=s+i;if(this.buffer.length<a)break;t.push(this.buffer.slice(s,a)),this.buffer=this.buffer.slice(a)}return t}}class BC{buffer="";decoder=new z8("utf8");push(e){this.buffer+=this.decoder.write(e);let t=[];while(!0){let n=this.buffer.indexOf(`
1286
1286
  `);if(n<0)break;let r=this.buffer.slice(0,n).trim();if(this.buffer=this.buffer.slice(n+1),r.length>0)t.push(r)}return t}}class V8{registration;process;processClose;nextRequestId=1;pending=new Map;framedParser=new UC;newlineParser=new BC;stderrBuffer="";stdinFailure;stdinFailureTimer;connected=!1;protocolMode="newline";requestTimeoutMs;connectAttemptTimeoutMs;constructor(e){this.registration=e,this.requestTimeoutMs=hv(e.timeoutSeconds),this.connectAttemptTimeoutMs=G8(e.timeoutSeconds)?this.requestTimeoutMs:K8}async connect(){if(this.connected)return;if(this.registration.transport.type!=="stdio")throw Error(`Unsupported MCP transport for "${this.registration.name}": ${this.registration.transport.type}`);let e={protocolVersion:GLe,capabilities:{},clientInfo:{name:"@cerebriline/core",version:"0.0.0"}};await this.ensureAgentPluginDataDirectory(),this.spawnProcess("newline");try{await this.request("initialize",e,this.connectAttemptTimeoutMs)}catch(t){await this.disconnect().catch(()=>{}),this.spawnProcess("framed");try{await this.request("initialize",e,this.connectAttemptTimeoutMs)}catch(n){throw await this.disconnect().catch(()=>{}),VLe(this.registration.name,t,n)}}this.notify("notifications/initialized"),this.connected=!0}async ensureAgentPluginDataDirectory(){if(this.registration.metadata?.source!=="agent-plugin")return;let e=this.registration.metadata.pluginDataPath;if(typeof e!=="string"||e.length===0)return;await jLe(e,{recursive:!0})}async disconnect(){let e=this.process,t=this.processClose;if(this.connected=!1,this.process=void 0,this.processClose=void 0,this.clearStdinFailureTimer(),this.failAllPending(Error(`Disconnected from MCP server "${this.registration.name}".`)),!t)return;if(!e){if(!await mv(t,FC))throw Error(`MCP process for "${this.registration.name}" did not close during disconnect.`);return}if(!e.stdin.destroyed)e.stdin.end();if(await mv(t,W8))return;if(e.kill(),await mv(t,FC))return;if(e.kill("SIGKILL"),!await mv(t,FC))throw Error(`MCP process for "${this.registration.name}" did not exit during disconnect.`)}async listTools(){return((await this.request("tools/list")).tools??[]).filter((t)=>typeof t?.name==="string"&&typeof t.inputSchema==="object"&&t.inputSchema!==null).map((t)=>({name:t.name,description:t.description,inputSchema:t.inputSchema,...t.annotations?.readOnlyHint===!0?{readOnlyHint:!0}:{}}))}async callTool(e){return this.request("tools/call",{name:e.name,arguments:e.arguments??{}},void 0,e.context?.signal)}spawnProcess(e){let t=this.registration.transport;if(t.type!=="stdio")throw Error(`Unsupported MCP transport for "${this.registration.name}": ${t.type}`);this.framedParser=new UC,this.newlineParser=new BC,this.stderrBuffer="",this.stdinFailure=void 0,this.clearStdinFailureTimer(),this.protocolMode=e;let n=process.platform==="win32"?{windowsHide:!0,shell:!0}:{},r=WLe(t.command,t.args??[],{cwd:t.cwd,env:{...process.env,...t.env??{}},stdio:["pipe","pipe","pipe"],...n});this.process=r,this.processClose=new Promise((o)=>{r.once("close",()=>o())}),r.stdout.on("data",(o)=>this.handleStdout(o)),r.stderr.on("data",(o)=>{if(this.process!==r)return;if(this.stderrBuffer+=o.toString("utf8"),this.stderrBuffer.length>16384)this.stderrBuffer=this.stderrBuffer.slice(-16384)}),r.once("error",(o)=>{if(this.process!==r)return;this.failAllPending(Error(`MCP process error: ${Wa(o)}`))}),r.stdin.on("error",(o)=>{if(this.process!==r)return;if(this.stdinFailure??=Wa(o),this.stdinFailureTimer!==void 0)return;this.stdinFailureTimer=setTimeout(()=>{if(this.stdinFailureTimer=void 0,this.process!==r)return;this.failAllPending(Error(`MCP server "${this.registration.name}" stopped reading its input before the request was fully delivered (${this.stdinFailure}) and did not exit.`)),this.disconnect().catch(()=>{})},W8),this.stdinFailureTimer.unref()}),r.once("exit",(o,i)=>{if(this.process!==r)return;this.connected=!1,this.process=void 0,this.clearStdinFailureTimer();let s=this.stderrBuffer.trim()?` stderr: ${this.stderrBuffer.trim()}`:"";this.failAllPending(Error(`MCP process exited for "${this.registration.name}" (code=${o??"null"}, signal=${i??"null"}).${s}${this.describeStdinFailure()}`))})}handleStdout(e){try{let t=this.protocolMode==="framed"?this.framedParser.push(e):this.newlineParser.push(e);for(let n of t){let r=JSON.parse(n);if(typeof r.id!=="number")continue;let o=this.takePending(r.id);if(!o)continue;if(r.error){let i=r.error.message||`MCP request failed with code ${r.error.code??"unknown"}`;o.reject(Error(i));continue}o.resolve(r.result)}}catch(t){this.handleProtocolFailure(t)}}handleProtocolFailure(e){let t=this.process;if(!t)return;this.connected=!1,this.process=void 0;let n=this.stderrBuffer.trim()?` stderr: ${this.stderrBuffer.trim()}`:"";this.failAllPending(Error(`Invalid MCP response from "${this.registration.name}": ${Wa(e)}.${n}`)),t.kill()}async request(e,t,n=this.requestTimeoutMs,r){let o=this.process;if(!o?.stdin.writable)throw Error(`MCP server "${this.registration.name}" is not connected.`);let i=this.nextRequestId++,s={jsonrpc:"2.0",id:i,method:e,...t?{params:t}:{}},a=new Promise((d,l)=>{let c=setTimeout(()=>{this.takePending(i),l(this.createTimeoutError(e,n))},n),u=r?()=>{let h=this.takePending(i);if(!h)return;let p=r.reason instanceof Error?r.reason:Object.assign(Error(`MCP request aborted for "${this.registration.name}" (${e}).`),{name:"AbortError"});h.reject(p)}:void 0;if(this.pending.set(i,{resolve:d,reject:l,timeout:c,signal:r,onAbort:u}),r&&u){if(r.addEventListener("abort",u,{once:!0}),r.aborted)u()}});if(!this.pending.has(i))return a;try{o.stdin.write(this.protocolMode==="framed"?q8(s):j8(s))}catch(d){let l=this.takePending(i);if(l)l.reject(d instanceof Error?d:Error(String(d)))}return a}createTimeoutError(e,t){return Error(qLe(this.registration.name,t,e)+this.describeStdinFailure())}clearStdinFailureTimer(){if(this.stdinFailureTimer!==void 0)clearTimeout(this.stdinFailureTimer),this.stdinFailureTimer=void 0}describeStdinFailure(){return this.stdinFailure===void 0?"":` The server stopped reading its input before the request was fully delivered (${this.stdinFailure}).`}notify(e,t){let n=this.process;if(!n?.stdin.writable)return;let r={jsonrpc:"2.0",method:e,...t?{params:t}:{}};n.stdin.write(this.protocolMode==="framed"?q8(r):j8(r))}failAllPending(e){for(let t of[...this.pending.keys()]){let n=this.takePending(t);if(!n)continue;n.reject(e)}}takePending(e){let t=this.pending.get(e);if(!t)return;if(this.pending.delete(e),clearTimeout(t.timeout),t.signal&&t.onAbort)t.signal.removeEventListener("abort",t.onAbort);return t}}class Y8{registration;options;client;authContext;requestTimeoutMs;connectAttemptTimeoutMs;constructor(e,t){this.registration=e;this.options=t;this.requestTimeoutMs=hv(e.timeoutSeconds),this.connectAttemptTimeoutMs=G8(e.timeoutSeconds)?this.requestTimeoutMs:KLe}async connect(){if(this.client)return;if(this.registration.transport.type==="stdio")throw Error(`Unsupported MCP transport for "${this.registration.name}": ${this.registration.transport.type}`);let e=DC({settingsPath:this.options.settingsPath,serverName:this.registration.name,redirectUrl:this.registration.oauth?.redirectUrl??H8,clientInformation:NC(this.registration.oauthClient)});this.authContext=e;let t=await e.provider.tokens()?e.provider:void 0,n;try{n=new zLe({name:this.options.clientName?.trim()||"@cerebriline/core",version:this.options.clientVersion?.trim()||"0.0.0"});let r=B8({registration:this.registration,oauthProvider:t,fetch:this.options.fetch,restrictConfiguredHeadersToOrigin:this.options.restrictConfiguredHeadersToOrigin});await n.connect(r,{timeout:this.connectAttemptTimeoutMs}),await e.clearError(),this.client=n}catch(r){await n?.close().catch(()=>{});let o=om(r,this.registration.name,this.connectAttemptTimeoutMs),i=$C(r),s=i?this.formatUnauthorizedMessage(e.getLastAuthorizationUrl()):Wa(o);if(i&&!this.hasStaticAuthorizationHeader())await e.markAuthorizationRequired(s);else await e.markConnectionError(s);throw Error(s)}}async disconnect(){let e=this.client;this.client=void 0,await e?.close()}async listTools(){let e=await this.ensureConnectedClient();try{return(await e.listTools(void 0,{timeout:this.requestTimeoutMs})).tools.map((n)=>({name:n.name,description:n.description,inputSchema:n.inputSchema&&typeof n.inputSchema==="object"&&!Array.isArray(n.inputSchema)?n.inputSchema:{},...n.annotations?.readOnlyHint===!0?{readOnlyHint:!0}:{}}))}catch(t){return await this.handleOperationError(t)}}async callTool(e){let t=await this.ensureConnectedClient();try{return await t.callTool({name:e.name,arguments:e.arguments??{}},void 0,{timeout:this.requestTimeoutMs,signal:e.context?.signal})}catch(n){return await this.handleOperationError(n)}}async ensureConnectedClient(){if(!this.client)await this.connect();if(!this.client)throw Error(`MCP server "${this.registration.name}" is not connected.`);return this.client}formatUnauthorizedMessage(e){if(this.hasStaticAuthorizationHeader())return`MCP server "${this.registration.name}" rejected its configured Authorization header. Update or remove that header before connecting with OAuth.`;let t=`MCP server "${this.registration.name}" requires OAuth authorization.`;if(!e)return`${t} Run authorizeMcpServerOAuth for this server.`;return`${t} Run authorizeMcpServerOAuth for this server and complete this URL: ${e}`}hasStaticAuthorizationHeader(){let e=this.registration.transport;if(e.type==="stdio")return!1;return Object.keys(e.headers??{}).some((t)=>t.toLowerCase()==="authorization")}async handleOperationError(e){let t=this.authContext??DC({settingsPath:this.options.settingsPath,serverName:this.registration.name,redirectUrl:this.registration.oauth?.redirectUrl??H8,clientInformation:NC(this.registration.oauthClient)}),n=om(e,this.registration.name,this.requestTimeoutMs),r=$C(e),o=r?this.formatUnauthorizedMessage(t.getLastAuthorizationUrl()):Wa(n);if(r&&!this.hasStaticAuthorizationHeader())await t.markAuthorizationRequired(o);else await t.markConnectionError(o);throw Error(o)}}function fv(e={}){return(t)=>t.transport.type==="stdio"?new V8(t):new Y8(t,e)}LC();import{isMcpTimeoutConfigured as X8,resolveMcpTimeoutSeconds as J8}from"@cerebriline/shared";var YLe=5000;function gr(){return Date.now()}function XLe(e){return e.map((t)=>({name:t.name,description:t.description,inputSchema:t.inputSchema,...t.readOnlyHint?{readOnlyHint:!0}:{}}))}class gv{toolsCacheTtlMs;clientFactory;servers=new Map;operationLocks=new Map;constructor(e){this.clientFactory=e.clientFactory,this.toolsCacheTtlMs=e.toolsCacheTtlMs??YLe}async registerServer(e){await this.runExclusive(e.name,async()=>{let t=this.servers.get(e.name);if(!t){this.servers.set(e.name,{registration:{...e},status:"disconnected",updatedAt:gr()});return}let n=JSON.stringify(t.registration.transport)!==JSON.stringify(e.transport),r=X8(t.registration.timeoutSeconds)!==X8(e.timeoutSeconds)||J8(t.registration.timeoutSeconds)!==J8(e.timeoutSeconds);if(t.registration={...e},t.updatedAt=gr(),n||r)await this.disconnectState(t),t.client=void 0,t.toolCache=void 0,t.toolCacheUpdatedAt=void 0})}async unregisterServer(e){await this.runExclusive(e,async()=>{let t=this.requireServer(e);await this.disconnectState(t),this.servers.delete(e)})}async connectServer(e){await this.runExclusive(e,async()=>{let t=this.requireServer(e);await this.connectState(t)})}async disconnectServer(e){await this.runExclusive(e,async()=>{let t=this.requireServer(e);await this.disconnectState(t)})}async setServerDisabled(e,t){await this.runExclusive(e,async()=>{let n=this.requireServer(e);if(n.registration={...n.registration,disabled:t},n.updatedAt=gr(),t)await this.disconnectState(n)})}listServers(){return[...this.servers.values()].map((e)=>({name:e.registration.name,status:e.status,disabled:e.registration.disabled===!0,lastError:e.lastError,toolCount:e.toolCache?.length??0,updatedAt:e.updatedAt,metadata:e.registration.metadata})).sort((e,t)=>e.name.localeCompare(t.name))}async listTools(e){let t=this.requireServer(e),n=t.toolCacheUpdatedAt??0;if(t.toolCache&&gr()-n<=this.toolsCacheTtlMs)return t.toolCache;return this.refreshTools(e)}async refreshTools(e){return this.runExclusive(e,async()=>{let t=this.requireServer(e),r=await(await this.ensureConnectedClient(t)).listTools(),o=XLe(r);return t.toolCache=o,t.toolCacheUpdatedAt=gr(),t.updatedAt=gr(),o})}async callTool(e){return this.runExclusive(e.serverName,async()=>{let t=this.requireServer(e.serverName),n=await this.ensureConnectedClient(t);return t.updatedAt=gr(),n.callTool({name:e.toolName,arguments:e.arguments,context:e.context})})}async dispose(){let e=[...this.servers.keys()],t=[];for(let n of e)try{await this.unregisterServer(n)}catch(r){t.push(r)}if(t.length>0)throw AggregateError(t,"MCP manager dispose failed")}async ensureConnectedClient(e){if(await this.connectState(e),!e.client)throw Error(`MCP server "${e.registration.name}" does not have an initialized client.`);return e.client}async connectState(e){if(e.registration.disabled)throw Error(`MCP server "${e.registration.name}" is disabled and cannot be connected.`);if(e.status==="connected"&&e.client)return;e.status="connecting",e.updatedAt=gr();let t=e.client;try{t??=await this.clientFactory(e.registration),e.client=t,await t.connect(),e.status="connected",e.lastError=void 0,e.updatedAt=gr()}catch(n){throw await t?.disconnect().catch(()=>{}),e.status="disconnected",e.lastError=n instanceof Error?n.message:String(n),e.updatedAt=gr(),n}}async disconnectState(e){if(!e.client){e.status="disconnected",e.updatedAt=gr();return}try{await e.client.disconnect()}finally{e.status="disconnected",e.updatedAt=gr()}}requireServer(e){let t=this.servers.get(e);if(!t)throw Error(`Unknown MCP server: ${e}`);return t}async runExclusive(e,t){let n=this.operationLocks.get(e)??Promise.resolve(),r,o=new Promise((s)=>{r=s}),i=n.catch(()=>{return}).then(()=>o);this.operationLocks.set(e,i),await n.catch(()=>{return});try{return await t()}finally{if(r?.(),this.operationLocks.get(e)===i)this.operationLocks.delete(e)}}}import{createHash as JLe}from"node:crypto";var Q8=64,QLe=/[^a-zA-Z0-9_-]+/g,Z8=8,ZLe=1,eNe="mcp_tool";function tNe(e){return JLe("sha1").update(e).digest("hex").slice(0,Z8)}function nNe(e){return e.replace(QLe,"_")}var yv=({serverName:e,toolName:t})=>{let n=`${e}__${t}`,r=nNe(n);if(r===n&&n.length<=Q8)return n;let o=tNe(n),i=Q8-ZLe-Z8;return`${r.slice(0,i)||eNe}_${o}`};import{createTool as rNe}from"@cerebriline/shared";function oNe(e,t){let n=t.description?.trim(),r=`From the "${e}" MCP server.`;return n?`${n}
1287
1287
 
1288
- ${r}`:`Execute MCP tool "${t.name}". ${r}`}async function HC(e){let t=await e.provider.listTools(e.serverName),n=e.nameTransform??yv;return t.map((r)=>{let o=n({serverName:e.serverName,toolName:r.name});return rNe({name:o,resultPolicy:"cache-oversized",description:oNe(e.serverName,r),inputSchema:r.inputSchema,source:"mcp",readOnly:r.readOnlyHint===!0,timeoutMs:e.timeoutMs,retryable:e.retryable,maxRetries:e.maxRetries,execute:async(i,s)=>e.provider.callTool({serverName:e.serverName,toolName:r.name,arguments:i&&typeof i==="object"&&!Array.isArray(i)?i:void 0,context:s})})})}import{isCodeIndexWorkspace as aht}from"@cerebriline/shared";import{DEFAULT_LIBRARY_SETTINGS as Qut}from"@cerebriline/shared";import{resolveClineDataDir as eht}from"@cerebriline/shared/storage";function wv(e,t){if(!e)return;if(!t)return e;return{available:(n)=>e.available(n),search:(n,r,o)=>e.search(n,r,o,{readFile:async(i)=>(await t.read(i)).toString("utf8")})}}function bv(e){if(!e)return;return{canAdmit:e.can_admit!==!1,headroomSessions:typeof e.headroom_sessions==="number"?e.headroom_sessions:-1,reason:e.reason??""}}var iNe=2000;function sNe(e,t){return new Promise((n)=>{if(e<=0||t?.aborted){n();return}let r=()=>{clearTimeout(o),n()},o=setTimeout(()=>{t?.removeEventListener("abort",r),n()},e);t?.addEventListener("abort",r,{once:!0})})}function eV(e){let t=Math.max(0,e.holdRetryMs??iNe),n=e.sleep??sNe,r=e.logger,o,i=!0,s="",a=0,d=[],l=()=>{d.shift()?.()},c=async(u)=>{let h,p=new Promise((m)=>{if(h=m,h)d.push(h)});await Promise.race([p,n(t,u)]);let f=h?d.indexOf(h):-1;if(f>=0)d.splice(f,1)};return{acquire:async(u)=>{for(;;){if(u?.aborted)throw Error("Admission wait cancelled");if(o===void 0){i=!1;let h;try{h=await e.capacity()}catch(p){r?.log?.("PolyKV capacity could not be read; admitting without it",{severity:"warn",error:p instanceof Error?p.message:String(p)}),h=void 0}if(h===void 0)o=Number.POSITIVE_INFINITY,s="capacity unavailable; not holding";else if(!h.canAdmit){s=h.reason,r?.log?.("PolyKV is holding the round",{severity:"info",reason:h.reason,headroomSessions:h.headroomSessions}),await c(u);continue}else s=h.reason,o=h.headroomSessions<0?Number.POSITIVE_INFINITY:Math.max(1,h.headroomSessions)}if(o>0)return o-=1,a+=1,{reason:s};o=void 0,await c(u)}},canAdmitMore:async()=>{if(o!==void 0&&o>0)return!0;if(!i)return!1;i=!1;let u;try{u=await e.capacity()}catch{return o=Number.POSITIVE_INFINITY,!0}if(u===void 0)return o=Number.POSITIVE_INFINITY,s="capacity unavailable; not holding",!0;if(!u.canAdmit)return s=u.reason,o=void 0,!1;return s=u.reason,o=u.headroomSessions<0?Number.POSITIVE_INFINITY:Math.max(1,u.headroomSessions),o>0},tryAcquire:async()=>{if(o!==void 0&&o>0)return o-=1,a+=1,{reason:s};if(!i)return;i=!1;let u;try{u=await e.capacity()}catch(h){r?.log?.("PolyKV capacity could not be read; admitting without it",{severity:"warn",error:h instanceof Error?h.message:String(h)}),u=void 0}if(u===void 0)o=Number.POSITIVE_INFINITY,s="capacity unavailable; not holding";else if(!u.canAdmit){s=u.reason,o=void 0;return}else s=u.reason,o=u.headroomSessions<0?Number.POSITIVE_INFINITY:Math.max(1,u.headroomSessions);if(o>0)return o-=1,a+=1,{reason:s};o=void 0;return},release:()=>{if(a>0)a-=1;i=!0,l()}}}import{access as fNe}from"node:fs/promises";import{createTool as gNe,validateWithZod as yNe,zodToJsonSchema as wNe}from"@cerebriline/shared";import{resolveAgentConfigSearchPaths as bNe}from"@cerebriline/shared/storage";import{z as On}from"zod";import{mkdir as aNe,writeFile as dNe}from"node:fs/promises";import{basename as lNe,dirname as cNe,join as uNe,resolve as tV}from"node:path";import{agentFileName as hNe,renderAgentFile as pNe,validateAgentFields as mNe}from"@cerebriline/shared";async function nV(e){mNe(e.agent);let t=uNe(e.directory,hNe(e.agent.name));if(cNe(tV(t))!==tV(e.directory))throw Error(`"${e.agent.name}" is not a usable agent name.`);let n=await e.fileExists(t);if(n&&!e.overwrite)throw Error(`An agent already exists at ${lNe(t)}. Pass overwrite to replace it, or choose another name.`);return await aNe(e.directory,{recursive:!0}),await dNe(t,pNe(e.agent),"utf-8"),{path:t,overwritten:n}}var rV=On.object({name:On.string().trim().min(1).describe("Short identifier for the agent, e.g. 'network-troubleshooting'. Becomes the file name and the name the lead model refers to it by."),description:On.string().trim().min(1).describe("One line saying what this agent is for. This is the only thing read when choosing which agent to hand work to, so say when to use it, not just what it is."),systemPrompt:On.string().trim().min(1).describe("The agent's own system prompt: who it is, how it works, what it must not do. Written to the body of the file."),scope:On.enum(["workspace","global"]).optional().describe("'workspace' writes to .cline/agents in this project (default); 'global' writes to the Cline data directory so every project sees it."),profile:On.string().trim().optional().describe("A saved API configuration profile the agent runs on, by name. Use this to run an agent on a different model from the session's."),providerId:On.string().trim().optional(),modelId:On.string().trim().optional(),tools:On.array(On.string()).optional().describe("Restrict the agent to these tools. Omit to give it the session's toolset."),skills:On.array(On.string()).optional().describe("Restrict the agent to these skills, by name. Omit to give it all of them."),maxIterations:On.number().int().positive().optional(),overwrite:On.boolean().optional().describe("Replace an agent of the same name. Without this, an existing agent is left alone and an error says so.")});async function vNe(e){try{return await fNe(e),!0}catch{return!1}}function oV(e){return gNe({name:"create_agent",description:"Create a Cline agent the user can delegate work to. Agents are markdown files with YAML frontmatter; each one becomes a subagent_<name> tool and can run on its own model. Use this when the user asks for an agent, a specialist, or a helper for a kind of task.",inputSchema:wNe(rV),execute:async(n)=>{let r=yNe(rV,n),o=r.scope??"workspace",i=bNe(e.workspaceRoot),s=e.workspaceRoot&&i.length>1?i[0]:void 0,a=i[i.length-1],d=o==="global"?a:s;if(!d)throw Error("There is no workspace open, so a workspace agent has nowhere to go. Use scope 'global' instead.");let l={name:r.name,description:r.description,systemPrompt:r.systemPrompt,profile:r.profile,providerId:r.providerId,modelId:r.modelId,tools:r.tools,skills:r.skills,maxIterations:r.maxIterations},c=await nV({directory:d,agent:l,overwrite:r.overwrite,fileExists:vNe});return{path:c.path,name:r.name.trim(),scope:o,overwritten:c.overwritten,note:"Agent files are loaded when a session starts, so this agent becomes available in the next session rather than this one."}},timeoutMs:15000,retryable:!1})}import{validateWithZod as kNe,zodToJsonSchema as TNe}from"@cerebriline/shared";var SNe=new Set(["check_file","ask_lsp","list_files"]),iV="ask_question";function xNe(e,t){let n=["This agent stopped to ask a question instead of finishing its task. Nothing was asked of the user.","",`Question: ${e.trim()}`];if(t.length>0)n.push("Options:",...t.map((r)=>`- ${r}`));return n.push("","Answer it by running the agent again with the answer in its task, answer it yourself if you can, or ask the user with `ask_question` if only they know."),n.join(`
1288
+ ${r}`:`Execute MCP tool "${t.name}". ${r}`}async function HC(e){let t=await e.provider.listTools(e.serverName),n=e.nameTransform??yv;return t.map((r)=>{let o=n({serverName:e.serverName,toolName:r.name});return rNe({name:o,resultPolicy:"cache-oversized",description:oNe(e.serverName,r),inputSchema:r.inputSchema,source:"mcp",readOnly:r.readOnlyHint===!0,timeoutMs:e.timeoutMs,retryable:e.retryable,maxRetries:e.maxRetries,execute:async(i,s)=>e.provider.callTool({serverName:e.serverName,toolName:r.name,arguments:i&&typeof i==="object"&&!Array.isArray(i)?i:void 0,context:s})})})}import{isCodeIndexWorkspace as lht}from"@cerebriline/shared";import{DEFAULT_LIBRARY_SETTINGS as eht}from"@cerebriline/shared";import{resolveClineDataDir as nht}from"@cerebriline/shared/storage";function wv(e,t){if(!e)return;if(!t)return e;return{available:(n)=>e.available(n),search:(n,r,o)=>e.search(n,r,o,{readFile:async(i)=>(await t.read(i)).toString("utf8")})}}function bv(e){if(!e)return;return{canAdmit:e.can_admit!==!1,headroomSessions:typeof e.headroom_sessions==="number"?e.headroom_sessions:-1,reason:e.reason??""}}var iNe=2000;function sNe(e,t){return new Promise((n)=>{if(e<=0||t?.aborted){n();return}let r=()=>{clearTimeout(o),n()},o=setTimeout(()=>{t?.removeEventListener("abort",r),n()},e);t?.addEventListener("abort",r,{once:!0})})}function eV(e){let t=Math.max(0,e.holdRetryMs??iNe),n=e.sleep??sNe,r=e.logger,o,i=!0,s="",a=0,d=[],l=()=>{d.shift()?.()},c=async(u)=>{let h,p=new Promise((m)=>{if(h=m,h)d.push(h)});await Promise.race([p,n(t,u)]);let f=h?d.indexOf(h):-1;if(f>=0)d.splice(f,1)};return{acquire:async(u)=>{for(;;){if(u?.aborted)throw Error("Admission wait cancelled");if(o===void 0){i=!1;let h;try{h=await e.capacity()}catch(p){r?.log?.("PolyKV capacity could not be read; admitting without it",{severity:"warn",error:p instanceof Error?p.message:String(p)}),h=void 0}if(h===void 0)o=Number.POSITIVE_INFINITY,s="capacity unavailable; not holding";else if(!h.canAdmit){s=h.reason,r?.log?.("PolyKV is holding the round",{severity:"info",reason:h.reason,headroomSessions:h.headroomSessions}),await c(u);continue}else s=h.reason,o=h.headroomSessions<0?Number.POSITIVE_INFINITY:Math.max(1,h.headroomSessions)}if(o>0)return o-=1,a+=1,{reason:s};o=void 0,await c(u)}},canAdmitMore:async()=>{if(o!==void 0&&o>0)return!0;if(!i)return!1;i=!1;let u;try{u=await e.capacity()}catch{return o=Number.POSITIVE_INFINITY,!0}if(u===void 0)return o=Number.POSITIVE_INFINITY,s="capacity unavailable; not holding",!0;if(!u.canAdmit)return s=u.reason,o=void 0,!1;return s=u.reason,o=u.headroomSessions<0?Number.POSITIVE_INFINITY:Math.max(1,u.headroomSessions),o>0},tryAcquire:async()=>{if(o!==void 0&&o>0)return o-=1,a+=1,{reason:s};if(!i)return;i=!1;let u;try{u=await e.capacity()}catch(h){r?.log?.("PolyKV capacity could not be read; admitting without it",{severity:"warn",error:h instanceof Error?h.message:String(h)}),u=void 0}if(u===void 0)o=Number.POSITIVE_INFINITY,s="capacity unavailable; not holding";else if(!u.canAdmit){s=u.reason,o=void 0;return}else s=u.reason,o=u.headroomSessions<0?Number.POSITIVE_INFINITY:Math.max(1,u.headroomSessions);if(o>0)return o-=1,a+=1,{reason:s};o=void 0;return},release:()=>{if(a>0)a-=1;i=!0,l()}}}import{access as fNe}from"node:fs/promises";import{createTool as gNe,validateWithZod as yNe,zodToJsonSchema as wNe}from"@cerebriline/shared";import{resolveAgentConfigSearchPaths as bNe}from"@cerebriline/shared/storage";import{z as On}from"zod";import{mkdir as aNe,writeFile as dNe}from"node:fs/promises";import{basename as lNe,dirname as cNe,join as uNe,resolve as tV}from"node:path";import{agentFileName as hNe,renderAgentFile as pNe,validateAgentFields as mNe}from"@cerebriline/shared";async function nV(e){mNe(e.agent);let t=uNe(e.directory,hNe(e.agent.name));if(cNe(tV(t))!==tV(e.directory))throw Error(`"${e.agent.name}" is not a usable agent name.`);let n=await e.fileExists(t);if(n&&!e.overwrite)throw Error(`An agent already exists at ${lNe(t)}. Pass overwrite to replace it, or choose another name.`);return await aNe(e.directory,{recursive:!0}),await dNe(t,pNe(e.agent),"utf-8"),{path:t,overwritten:n}}var rV=On.object({name:On.string().trim().min(1).describe("Short identifier for the agent, e.g. 'network-troubleshooting'. Becomes the file name and the name the lead model refers to it by."),description:On.string().trim().min(1).describe("One line saying what this agent is for. This is the only thing read when choosing which agent to hand work to, so say when to use it, not just what it is."),systemPrompt:On.string().trim().min(1).describe("The agent's own system prompt: who it is, how it works, what it must not do. Written to the body of the file."),scope:On.enum(["workspace","global"]).optional().describe("'workspace' writes to .cline/agents in this project (default); 'global' writes to the Cline data directory so every project sees it."),profile:On.string().trim().optional().describe("A saved API configuration profile the agent runs on, by name. Use this to run an agent on a different model from the session's."),providerId:On.string().trim().optional(),modelId:On.string().trim().optional(),tools:On.array(On.string()).optional().describe("Restrict the agent to these tools. Omit to give it the session's toolset."),skills:On.array(On.string()).optional().describe("Restrict the agent to these skills, by name. Omit to give it all of them."),maxIterations:On.number().int().positive().optional(),overwrite:On.boolean().optional().describe("Replace an agent of the same name. Without this, an existing agent is left alone and an error says so.")});async function vNe(e){try{return await fNe(e),!0}catch{return!1}}function oV(e){return gNe({name:"create_agent",description:"Create a Cline agent the user can delegate work to. Agents are markdown files with YAML frontmatter; each one becomes a subagent_<name> tool and can run on its own model. Use this when the user asks for an agent, a specialist, or a helper for a kind of task.",inputSchema:wNe(rV),execute:async(n)=>{let r=yNe(rV,n),o=r.scope??"workspace",i=bNe(e.workspaceRoot),s=e.workspaceRoot&&i.length>1?i[0]:void 0,a=i[i.length-1],d=o==="global"?a:s;if(!d)throw Error("There is no workspace open, so a workspace agent has nowhere to go. Use scope 'global' instead.");let l={name:r.name,description:r.description,systemPrompt:r.systemPrompt,profile:r.profile,providerId:r.providerId,modelId:r.modelId,tools:r.tools,skills:r.skills,maxIterations:r.maxIterations},c=await nV({directory:d,agent:l,overwrite:r.overwrite,fileExists:vNe});return{path:c.path,name:r.name.trim(),scope:o,overwritten:c.overwritten,note:"Agent files are loaded when a session starts, so this agent becomes available in the next session rather than this one."}},timeoutMs:15000,retryable:!1})}import{validateWithZod as kNe,zodToJsonSchema as TNe}from"@cerebriline/shared";var SNe=new Set(["check_file","ask_lsp","list_files"]),iV="ask_question";function xNe(e,t){let n=["This agent stopped to ask a question instead of finishing its task. Nothing was asked of the user.","",`Question: ${e.trim()}`];if(t.length>0)n.push("Options:",...t.map((r)=>`- ${r}`));return n.push("","Answer it by running the agent again with the answer in its task, answer it yourself if you can, or ask the user with `ask_question` if only they know."),n.join(`
1289
1289
  `)}function _Ne(){return{name:iV,description:"Ask the agent that started you a question, when you cannot finish the task without an answer. This ends your run: your question, with 2-5 options, is your report, and the lead decides what happens next -- it may run you again with the answer. Ask only what you cannot find out with your tools. Output: none you will see; the call is the last thing you do.",inputSchema:TNe(Fs),lifecycle:{completesRun:!0},retryable:!1,maxRetries:0,execute:async(e)=>{let t=kNe(Fs,e);return xNe(t.question,t.options)}}}function sm(e,t){let n=(t??[]).filter((i)=>SNe.has(i.name)),r=new Set(n.map((i)=>i.name));return[...e.filter((i)=>!r.has(i.name)),...n].map((i)=>i.name===iV?_Ne():i)}import{appendFileSync as NNe,existsSync as Fc,mkdirSync as uV,readdirSync as DNe,readFileSync as jC,renameSync as hV,statSync as $Ne,writeFileSync as pV}from"node:fs";import{join as qC}from"node:path";import{resolveTeamDataDir as FNe}from"@cerebriline/shared/storage";import{existsSync as ENe,mkdirSync as ANe}from"node:fs";import{join as RNe}from"node:path";import{safeJsonParse as cV}from"@cerebriline/shared";import{loadSqliteDb as INe,nowIso as Dc}from"@cerebriline/shared/db";import{resolveDbDataDir as CNe}from"@cerebriline/shared/storage";function PNe(){return CNe()}function MNe(e){let t=cV(e);if(!Array.isArray(t))return[];let n=[];for(let r of t){if(!r||typeof r!=="object")continue;let o=r,{agentId:i,rolePrompt:s}=o;if(typeof i!=="string"||!i.trim())continue;if(typeof s!=="string"||!s.trim())continue;let a={agentId:i.trim(),rolePrompt:s};if(typeof o.modelId==="string"&&o.modelId.trim())a.modelId=o.modelId.trim();if(typeof o.maxIterations==="number"&&Number.isFinite(o.maxIterations))a.maxIterations=Math.max(1,Math.floor(o.maxIterations));if(typeof o.temperature==="number"&&Number.isFinite(o.temperature)&&o.temperature>=0)a.temperature=o.temperature;if(typeof o.seed==="number"&&Number.isInteger(o.seed))a.seed=o.seed;if(o.seedRandom===!0)a.seedRandom=!0;if(typeof o.temperatureBase==="number"&&Number.isFinite(o.temperatureBase)&&o.temperatureBase>=0)a.temperatureBase=o.temperatureBase;if(typeof o.temperatureRange==="number"&&Number.isFinite(o.temperatureRange)&&o.temperatureRange>=0&&o.temperatureRange<=100)a.temperatureRange=o.temperatureRange;n.push(a)}return n}var sV=ts,WC=2000,ONe=2592000000,aV=["agent_event","run_progress"],dV=2,LNe=["team_tasks","team_runs","team_outcomes","team_outcome_fragments","team_mailbox","team_mission_log"];function $c(e){if(e===void 0||e===null)return null;let t=e instanceof Date?e:new Date(e);return Number.isNaN(t.getTime())?null:t.toISOString()}function am(e,t){if(typeof e!=="string"||e.length===0)return t;return cV(e)??t}var dm=(e)=>typeof e==="string"?e:"";function lV(e){return{teamId:e.teamId,teamName:e.teamName,reset:!0,members:e.members,tasks:e.tasks,mailbox:e.mailbox,missionLog:e.missionLog,runs:e.runs,outcomes:e.outcomes,outcomeFragments:e.outcomeFragments}}class vv{teamDirPath;db;retentionPerTeam;retentionMs;constructor(e={}){this.teamDirPath=e.teamDir??PNe(),this.retentionPerTeam=e.eventRetentionPerTeam??WC,this.retentionMs=e.eventRetentionMs??ONe}init(){this.getRawDb()}close(){this.db?.close?.(),this.db=void 0}ensureTeamDir(){if(!ENe(this.teamDirPath))ANe(this.teamDirPath,{recursive:!0});return this.teamDirPath}dbPath(){return RNe(this.ensureTeamDir(),"teams.db")}getRawDb(){if(this.db)return this.db;let e=INe(this.dbPath());return this.ensureSchema(e),this.db=e,e}ensureSchema(e){if(e.exec("PRAGMA journal_mode = WAL;"),e.exec("PRAGMA busy_timeout = 5000;"),e.exec(`
1290
1290
  CREATE TABLE IF NOT EXISTS team_store_schema_version (
1291
1291
  lock INTEGER PRIMARY KEY CHECK (lock = 1),
@@ -1459,7 +1459,7 @@ ${r}`:`Execute MCP tool "${t.name}". ${r}`}async function HC(e){let t=await e.pr
1459
1459
  `).filter(Boolean),r=[],o=0;for(let s=n.length-1;s>=0&&r.length<WC;s--){let a=n[s];if(o+=Buffer.byteLength(a,"utf8")+1,o>mV/2&&r.length>0)break;r.push(a)}r.reverse();let i=`${e}.tmp`;pV(i,`${r.join(`
1460
1460
  `)}
1461
1461
  `,"utf8"),hV(i,e)}persistRuntime(e,t,n){this.ensureTeamSubdir(e);let r={version:1,updatedAt:fV(),teamState:{...t,runs:t.runs.map((s)=>({...s,result:Ao(s.result)}))},teammates:n},o=this.statePath(e),i=`${o}.tmp`;pV(i,`${JSON.stringify(r,null,2)}
1462
- `,"utf8"),hV(i,o)}markInProgressRunsInterrupted(e,t){let n=this.readEnvelope(e);if(!n?.teamState?.runs?.length)return[];let r=n.teamState.runs.filter((i)=>i.status==="queued"||i.status==="running").map((i)=>i.id);if(r.length===0)return[];let o=new Date;return n.teamState={...n.teamState,runs:n.teamState.runs.map((i)=>i.status==="queued"||i.status==="running"?{...i,status:"interrupted",error:t,endedAt:o}:i)},this.persistRuntime(e,n.teamState,n.teammates),r}ensureTeamDir(){if(!Fc(this.teamDirPath))uV(this.teamDirPath,{recursive:!0});return this.teamDirPath}ensureTeamSubdir(e){let t=qC(this.ensureTeamDir(),gn(e));if(!Fc(t))uV(t,{recursive:!0});return t}statePath(e){return qC(this.ensureTeamDir(),gn(e),"state.json")}historyPath(e){return qC(this.ensureTeamDir(),gn(e),"task-history.jsonl")}readEnvelope(e){let t=this.statePath(e);if(!Fc(t))return;try{let n=JSON.parse(jC(t,"utf8"));if(n?.version===1&&n.teamState)return n}catch{}return}}function gV(e={}){try{let t=new vv(e);return t.init(),t}catch{let t=new kv({teamDir:e.teamDir});return t.init(),t}}import{chmodSync as UNe,existsSync as zC}from"node:fs";import{join as GC}from"node:path";function Tv(e){if(!e)return;if(process.platform==="win32"){let t=GC(e,"cerebriline-sandbox.exe"),n=GC(e,"hook.dll");if(!zC(t)||!zC(n))return;return{launcher:t,hook:n,platforms:["win32"]}}if(process.platform==="linux")return yV(e,"","linux");if(process.platform==="darwin")return yV(e,"darwin-","darwin");return}function yV(e,t,n){let r={x64:"x64",arm64:"arm64"}[process.arch],i=(r?[`cerebriline-sandbox-${t}${r}`,"cerebriline-sandbox"]:["cerebriline-sandbox"]).map((s)=>GC(e,s)).find(zC);if(!i)return;try{UNe(i,493)}catch{}return{launcher:i,hook:i,platforms:[n]}}var BNe=300,HNe=60000,wV=5000;class KC{opts;pendingEvents=[];teammatesDirty=!1;timer;lastFlushAt=0;disposed=!1;constructor(e){this.opts={batchMs:BNe,telemetryFlushMs:HNe,now:Date.now,...e}}onEvent(e){if(this.disposed)return;if(!pi(e)){if(this.opts.now()-this.lastFlushAt>=this.opts.telemetryFlushMs)this.schedule();return}if(this.pendingEvents.push({type:e.type,payload:is(e)}),NI(e)){this.flush();return}this.schedule()}markTeammatesDirty(){this.teammatesDirty=!0}markStateDirty(){if(this.disposed)return;this.schedule()}flush(){this.clearTimer();let e=this.opts.source();if(!e)return;if(!e.hasPendingStateDelta()&&this.pendingEvents.length===0&&!this.teammatesDirty)return;let n=this.pendingEvents,r=this.teammatesDirty;this.pendingEvents=[],this.teammatesDirty=!1;let o=e.drainStateDelta();try{this.opts.store.persistBatch(this.opts.teamKey,{events:n,delta:o,teammates:this.opts.teammates(),getFullState:()=>e.exportState()}),this.lastFlushAt=this.opts.now()}catch(i){e.requeueStateDelta(o);let s=n.concat(this.pendingEvents);if(this.pendingEvents=s.length>wV?s.slice(-wV):s,this.teammatesDirty=this.teammatesDirty||r,!this.disposed)this.schedule();try{this.opts.onError?.(i)}catch{}}}dispose(){if(this.disposed)return;this.disposed=!0,this.flush()}schedule(){if(this.timer)return;this.timer=setTimeout(()=>{this.timer=void 0,this.flush()},this.opts.batchMs),this.timer.unref?.()}clearTimer(){if(this.timer)clearTimeout(this.timer),this.timer=void 0}}function Sv(e,t){return GNe(e,t)}function vV(e,t){let n=t?.["*"]??{},r=t?.[e]??{};return{...n,...r}.enabled!==!1}function YNe(e,t){return e.filter((n)=>vV(n.name,t))}function _v(e,t){return Ji(YNe(e,t))}function XNe(e){if(e?.readLimitEnabled===!1)return Number.POSITIVE_INFINITY;let t=e?.readLimitChars;return typeof t==="number"&&Number.isFinite(t)&&t>0?Math.floor(t):void 0}function JNe(e,t){if(!t?.length)return e;let n={...e??{}};for(let r of t){let o=r.trim();if(!o)continue;n[o]={...n[o]??{},enabled:!1}}return n}var QNe={apply_diff:"editor",attempt_completion:"submit_and_exit",bash:"run_commands",execute_command:"run_commands",list_code_definition_names:"search_codebase",list_files:"run_commands",read_file:"read_files",replace_in_file:"editor",search_files:"search_codebase",use_skill:"skills",write_to_file:"editor"};function ZNe(e){let t=e.trim().toLowerCase();return QNe[t]??t}function eDe(e,t){if(t.tools===void 0)return e;let n=new Set(t.tools.map(ZNe));if(t.skills!==void 0)n.add("skills");return e.filter((r)=>n.has(r.name))}function tDe(){return`team-${VNe(5)}`}function Ev(e,t,n,r,o,i,s,a,d,l,c,u,h,p,f,m){let g=go[yo({mode:n})],y=Gy(t,r,n,o??zy);return _v(dp({cwd:e,telemetry:d,qaCredentials:l,executorOptions:p?.workspace?{...p.workspace.executorOptions,...f?{extractDocument:f}:{},...h!==void 0?{fileRead:{maxReadChars:h}}:{}}:{bash:{executionController:c,...m?{wrapSpawn:m}:{}},...u?{receipts:u}:{},...f?{extractDocument:f}:{},...h!==void 0?{fileRead:{maxReadChars:h}}:{}},...g,enableSkills:!!s,...y,enableExtractDocument:g.enableExtractDocument===!0&&vV(le.EXTRACT_DOCUMENT,i),...p&&!p.workspace?.allowCommands?{enableBash:!1}:{},executors:{...s?{skills:s}:{},...p?.workspace?a?.semanticSearch?{semanticSearch:wv(a.semanticSearch,p.workspace.executorOptions.overlay)}:{}:a??{}}}),i)}function nDe(e){return Ev(e.cwd,e.providerId,e.mode,e.modelId,e.toolRoutingRules,e.toolPolicies,rDe,e.toolExecutors).some((t)=>t.name==="skills")}var rDe=async()=>"";async function oDe(e){let t=jr(),n=e.includeSettings&&nm({filePath:t});if(!n&&!e.agentPluginServers?.length)return{tools:[]};let r=fv({settingsPath:t}),o=fv({restrictConfiguredHeadersToOrigin:!0}),i=new gv({clientFactory:(u)=>u.metadata?.source==="agent-plugin"?o(u):r(u)}),s=[];if(n)try{s=await OC(i,{filePath:t})}catch(u){let h=u instanceof Error?u.message:String(u);e.logger?.log(`[mcp] Failed to load MCP settings, skipping settings-backed MCP tools: ${h}`)}let a=new Set(s.map((u)=>u.name));for(let u of e.agentPluginServers??[]){let h=u.registration;if(a.has(h.name)){e.logger?.log(`[agent-plugins] MCP server '${h.name}' conflicts with an existing server and was skipped.`,{severity:"error"});continue}try{await i.registerServer(h),s.push(h),a.add(h.name)}catch(p){let f=p instanceof Error?p.message:String(p);e.logger?.log(`[agent-plugins] Failed to register MCP server '${h.name}', skipping: ${f}`,{severity:"error"})}}if(s.length===0)return await i.dispose().catch(()=>{}),{tools:[]};let d=s.filter((u)=>u.disabled!==!0),l=await Promise.allSettled(d.map((u)=>HC({serverName:u.name,provider:i,timeoutMs:KNe(u.timeoutSeconds)*1000}))),c=[];for(let[u,h]of l.entries())if(h.status==="fulfilled")c.push(...h.value);else{let p=h.reason instanceof Error?h.reason.message:String(h.reason);e.logger?.log(`[mcp] Failed to load tools from MCP server "${d[u].name}", skipping: ${p}`)}return{tools:c,shutdown:async()=>{await i.dispose()}}}function xv(e){return`configured:${e}`}function VC(e){return`teammate:${e}`}function iDe(e){return{handBack:(t)=>e().handBack(VC(t),t),release:async(t)=>{await e().close(VC(t),t)}}}function sDe(e,t){if(!e)return;try{e.cancelOutstandingWork(`${YC}${t}`)}catch{}for(let n of e.getTeammateIds())try{e.shutdownTeammate(n,`${YC}${t}`)}catch{}}var YC="runtime_shutdown:";function aDe(e){if(e===void 0)return!1;if(e.startsWith(YC))return!0;switch(e){case"session_stop":case"session_complete":case"session_error":case"session_manager_dispose":case"cli_run_shutdown":case"cli_interactive_shutdown":case"cli_interactive_startup_cancelled":case"provider_change":case"acp_shutdown":case"hub_server_stop":case"vscode_webview_dispose":return!0;default:return!1}}function cs(e){return CI({providerId:e.providerId,modelId:e.modelId,agentNodes:(e.agentNodes??[]).map((t)=>({...t,connection:t.connection})),polykvAgentsPriorityZero:e.polykvAgentsPriorityZero,overflowCapacity:e.maxConcurrentAgents,lead:{apiKey:e.apiKey,baseUrl:e.baseUrl,headers:e.headers,providerConfig:e.providerConfig,knownModels:e.knownModels,thinking:e.thinking,reasoningEffort:e.reasoningEffort,thinkingBudgetTokens:e.thinkingBudgetTokens,maxTokensPerTurn:e.maxTokensPerTurn,maxToolResultChars:e.maxToolResultChars,staleReadRewrites:e.staleReadRewrites,toolResultFormat:e.toolResultFormat,temperature:e.temperature}})}function dDe(e){let t=new Set(e.offered),n=["spawn_agent","spawn_swarm"].filter((d)=>!t.has(d));if(n.length===0)return{};let r;if(!e.subagentsEnabled)r="sub-agents are switched off in this session's settings.";else if(e.serialised)r=`${e.multipleNodes?"every configured node serves 1 request at a time":"this endpoint serves 1 request at a time"}, so a spawned agent would run after you rather than beside you.`;else return{};let o=e.offered.filter((d)=>d.startsWith("subagent_")),i=o.length>0?`Do the work yourself, or hand one job at a time to a configured agent: ${o.join(", ")}.`:"Do the work yourself.",s=e.subagentsEnabled?`Only the user can change this, by raising the profile's parallel sessions${e.multipleNodes?" or a node's capacity":""}.`:"Only the user can change this, in the settings.",a={};for(let d of n)a[d]=`${r} ${i} Do not call ${d} again in this session; it will be refused the same way. ${s}`;return a}function lDe(e){let t=go[yo({mode:e.mode})];return{sessionId:e.sessionId||"",mode:e.mode==="plan"?"plan":e.mode==="yolo"?"yolo":"act",enableTools:e.enableTools!==!1,enableSpawnAgent:e.enableSpawnAgent??t.enableSpawnAgent??!0,enableAgentTeams:ns({maxConcurrentAgents:e.maxConcurrentAgents,nodes:cs(e)})&&e.enableAgentTeams===!0,disableMcpSettingsTools:e.disableMcpSettingsTools===!0,yolo:e.yolo===!0,missionLogIntervalSteps:typeof e.missionLogIntervalSteps==="number"&&Number.isFinite(e.missionLogIntervalSteps)?e.missionLogIntervalSteps:3,missionLogIntervalMs:typeof e.missionLogIntervalMs==="number"&&Number.isFinite(e.missionLogIntervalMs)?e.missionLogIntervalMs:120000}}class XC{teamRuntimeEntries=new Map;async build(e){let{config:t,hooks:n,extensions:r,logger:o,telemetry:i,createSpawnTool:s,createSwarmTool:a,onTeamRestored:d,userInstructionService:l,configExtensions:c,toolExecutors:u}=e,h=e.onTeamEvent??(()=>{}),p=lDe(t),f=[];if(p.enableTools&&p.mode!=="yolo"&&SA("web_search")&&bV({providerId:t.providerId,modelId:t.modelId},"web_search"))f.push({name:"web_search"});if(p.enableTools&&bV({providerId:t.providerId,modelId:t.modelId},"image_generation"))f.push({name:"image_generation",outputFormat:"png"});let m=t.workspaceRoot??t.cwd,g=JNe(e.toolPolicies??t.toolPolicies,t.enableExtractDocument===!0?t.providerConfig?.tools?.disabled:[...t.providerConfig?.tools?.disabled??[],le.EXTRACT_DOCUMENT]),y=XNe(t.providerConfig?.tools),w=Ta(),k=[],b=t.teamName?.trim()||tDe(),v=t.sessionId?.trim()||b,E=p.enableSpawnAgent?MI({workspaceRoot:m}):{configs:[],errors:[],searchPaths:[]},S=E.configs.some((Y)=>Y.skills!==void 0),x=Sv(c,"rules"),T=Sv(c,"skills"),A=T||S,R=Sv(c,"workflows"),C=Sv(c,"plugins"),L=x||T||R,N=!1,W=[],D=l,G;for(let Y of E.errors)(o??t.logger)?.log?.(`[agents] Failed to load agent config at ${Y.path}: ${Y.error.message}`);if(p.enableSpawnAgent){(o??t.logger)?.log?.(E.configs.length>0?`[agents] ${E.configs.length} configured agent(s): ${E.configs.map((Q)=>Q.name).join(", ")}`:`[agents] No configured agents found. Looked in: ${E.searchPaths.join(", ")||"(no search path)"}`);let Y=E.configs.filter((Q)=>Q.profile!==void 0&&t.resolveProfileConnection?.(Q.profile)===void 0);for(let Q of Y){let ee=t.listProfileNames?.()??[];(o??t.logger)?.log?.(`[agents] "${Q.name}" names the API configuration profile "${Q.profile}", which no longer exists, and will fail when called. `+(ee.length>0?`Available profiles: ${ee.join(", ")}.`:"This host has no saved profiles."),{severity:"warn"})}}if(!D&&(L||S))D=Lc({skills:A?{workspacePath:m,includePluginSkills:C,pluginSkillDirectories:C?e.pluginSkillDirectories:void 0,pluginPaths:t.pluginPaths,cwd:t.cwd,agentPluginSkills:C?e.agentPluginSkills:void 0}:{workspacePath:m},rules:{workspacePath:t.cwd},workflows:{workspacePath:t.cwd}}),W.push(D);else if(D&&C&&e.agentPluginSkills?.length&&(L||S)){let Y=Lc({skills:{directories:[],agentPluginSkills:e.agentPluginSkills},rules:{directories:[]},workflows:{directories:[]}});W.push(Y),D=kC([D,Y])}if(D)await D.start().catch(()=>{});let V=p.enableTools&&T&&Boolean(D)&&D?.hasConfiguredSkills(t.skills)===!0&&nDe({cwd:t.cwd,providerId:t.providerId,mode:p.mode,modelId:t.modelId,toolRoutingRules:t.toolRoutingRules,toolPolicies:g,toolExecutors:u}),B=D&&L?D.createExtension({includeRules:x,includeSkills:T,includeWorkflows:R,registerSkillsTool:V,allowedSkillNames:t.skills}):void 0,j=p.mode==="plan"&&p.enableTools?XT({telemetry:i??t.telemetry}):void 0,K=[B,j].filter((Y)=>Y!==void 0),z=K.length>0?[...r??t.extensions??[],...K]:r??t.extensions;if(p.enableTools){k.push(...Ev(t.cwd,t.providerId,p.mode,t.modelId,t.toolRoutingRules,g,void 0,u,i??t.telemetry,t.qaCredentials,e.runCommandExecutionController,e.readReceipts,y,void 0,oa(t),mG({enabled:t.leadSandboxConfine===!0,workspaceRoot:t.workspaceRoot??t.cwd,binaries:Tv(t.sandboxBinariesDir),tempRoot:jNe(WNe(),"cerebriline-sandbox-tmp")})));let Y=C?e.agentPluginMcpServers:void 0;if(!p.disableMcpSettingsTools||Y?.length){let Q=await oDe({logger:t.logger,includeSettings:!p.disableMcpSettingsTools,agentPluginServers:Y});k.push(...Q.tools),G=Q.shutdown}}let M,X=p.enableAgentTeams?gV():void 0,oe=X?.loadRuntime(v),H=oe?.state,J=oe?.teammates??[],he=new Map(J.map((Y)=>[Y.agentId,Y])),se=X?new KC({teamKey:v,store:X,source:()=>M,teammates:()=>Array.from(he.values()),onError:(Y)=>(o??t.logger)?.log?.(`[team] failed to persist team state: ${Y instanceof Error?Y.message:String(Y)}`)}):void 0,re=t.sessionId||b,Ke,I=[],_=!1,F=t.delegatedAgentConnection,O=Nr({providerId:F?.providerId??t.providerId,baseUrl:F?.baseUrl??t.baseUrl}),ue=t.providerConfig,ne=ue&&$o(ue)?eV({capacity:async()=>bv(await Sd({sessionId:t.sessionId,providerConfig:ue,logger:o??t.logger})),...o??t.logger?{logger:o??t.logger}:{}}):void 0,fe=hR(t.maxConcurrentAgents,uR(t.agentSlotLimits),ne?(Y)=>Y===O?ne:void 0:void 0,ue&&$o(ue)?(Y)=>Y===O?()=>tT(ue):void 0:void 0),Ce=F?{...F}:{},We=cs(t).map((Y)=>({...Y,connection:Y.connection})),Se=oi({providerId:t.providerId,modelId:t.modelId,distinctId:e.distinctId,sessionId:t.sessionId,cwd:t.cwd,apiKey:t.apiKey??"",baseUrl:t.baseUrl,headers:t.headers,providerConfig:t.providerConfig,knownModels:t.knownModels,thinking:t.thinking,reasoningEffort:t.reasoningEffort,thinkingBudgetTokens:t.thinkingBudgetTokens,maxTokensPerTurn:t.maxTokensPerTurn,maxToolResultChars:t.maxToolResultChars,staleReadRewrites:t.staleReadRewrites,toolResultFormat:t.toolResultFormat,temperature:t.temperature,maxIterations:t.maxIterations,...t.compaction?.cappedThinkingBudgetMessage?{thinkingBudgetMessage:t.compaction.cappedThinkingBudgetMessage}:{},hooks:n,extensions:z,logger:o??t.logger,telemetry:e.telemetry??t.telemetry,workspaceMetadata:t.workspaceMetadata,createPrepareTurn:e.createDelegatedPrepareTurn,condenseDiscardedReasoning:e.condenseDiscardedReasoning,onLoopCut:e.onDelegatedLoopCut,slotGate:fe.for(Nr({providerId:Ce.providerId??t.providerId,baseUrl:Ce.baseUrl??t.baseUrl})),slotGates:fe,...Ce},Object.keys(Ce)),Le=PI({nodes:We,base:Se});if(Le)Se.setNodePlacement?.(Le),(o??t.logger)?.log(`[Agents] ${We.length} agent node(s): ${We.map((Y)=>`${Y.id} p${Y.priority} x${Number.isFinite(Y.capacity)?Y.capacity:"uncapped"} ${Y.connection.providerId??t.providerId}/${Y.connection.modelId??t.modelId}`).join(", ")}`);if(F)(o??t.logger)?.log(`[Agents] Delegated agents run on provider=${F.providerId} model=${F.modelId}, not the session's`);let it=!ns({maxConcurrentAgents:t.maxConcurrentAgents,nodes:cs(t)});if(!ns({maxConcurrentAgents:t.maxConcurrentAgents,nodes:cs(t)})&&(t.enableSpawnAgent!==!1||t.enableAgentTeams!==!1))(o??t.logger)?.log(`[Agents] spawn_agent and the team tools are withheld: ${(t.agentNodes?.length??0)>1?"every configured node serves 1 request at a time":"this endpoint serves 1 request at a time"}, so a delegated agent would run after the agent that spawned it rather than beside it. Raise the profile's parallel sessions${(t.agentNodes?.length??0)>1?" or a node's capacity":""} to offer them.`);let dt=[],_e=new Map;if(p.enableSpawnAgent){if(k.push(..._v([oV({workspaceRoot:m})],g)),E.configs.length>0)dt=_v(yR({configProvider:Se,agents:E.configs,...t.sessionId?{sessionId:t.sessionId}:{},logger:o??t.logger,resolveProviderConnection:t.resolveProviderConnection,resolveProfileConnection:t.resolveProfileConnection,listProfileNames:t.listProfileNames,createSubAgentTools:async(Y,Q,ee)=>{if(!p.enableTools)return[];let be=e.delegatedSandboxes?.(),ge=ee.toolCallId?xv(ee.toolCallId):void 0,Ee=be&&ge?await be.open(ge):void 0;if(ge&&Ee)_e.set(ge,Y.name);return eDe(sm(Ev(t.cwd,Y.providerId??t.providerId,p.mode,Y.modelId??t.modelId,t.toolRoutingRules,g,Y.skills!==void 0&&D?.createSkillsExecutor?D.createSkillsExecutor(Y.skills):void 0,u,i??t.telemetry,t.qaCredentials,e.runCommandExecutionController,e.readReceipts,y,{workspace:Ee},oa(t)),t.extraTools),Y)},hookErrorMode:t.hookErrorMode,toolPolicies:g,requestToolApproval:e.requestToolApproval,commandSandboxFor:(Y)=>Y?ab(e.delegatedSandboxes?.(),xv(Y)):void 0,onSubAgentEvent:e.onSubAgentEvent,onSubAgentStart:e.onSubAgentStart,onSubAgentEnd:async(Y)=>{let Q=Y.toolCallId?xv(Y.toolCallId):void 0,ee=e.delegatedSandboxes?.();if(Q&&ee?.has(Q)){let be=_e.get(Q)??"agent";_e.delete(Q);let ge=await ee.close(Q,be);if(Y.result&&typeof Y.result.text==="string")Y.result.text+=Ia(Y.result.text,Y.result.finishReason,be,ge)}await e.onSubAgentEnd?.(Y)},onSubAgentSettled:async(Y)=>{if(!Y.toolCallId)return;let Q=xv(Y.toolCallId);_e.delete(Q),await e.delegatedSandboxes?.().close(Q,Y.name)}}),g),k.push(...dt)}if(!this.teamRuntimeEntries.has(re))this.teamRuntimeEntries.set(re,{delegatedAgentConfigProvider:Se});let Ue=()=>{if(!p.enableAgentTeams)return;let Y=this.teamRuntimeEntries.get(re)??{delegatedAgentConfigProvider:Se};if(this.teamRuntimeEntries.set(re,Y),M=Y.runtime,!M){if(M=new Ub({teamName:b,leadAgentId:t.sessionId||"lead",sessionId:t.sessionId,maxConcurrentRuns:t.maxConcurrentAgents===0?Number.POSITIVE_INFINITY:t.maxConcurrentAgents,missionLogIntervalSteps:p.missionLogIntervalSteps,missionLogIntervalMs:p.missionLogIntervalMs,acceptTeammateConnectionUpdates:(Q)=>Se.acceptedConnectionUpdates?.(Q)??Q,...e.delegatedSandboxes?{teammateWorkspaces:iDe(e.delegatedSandboxes)}:{},onStateDirty:()=>se?.markStateDirty(),onTeamEvent:(Q)=>{if(h(Q),se){if(Q.type==="teammate_spawned"&&Q.teammate?.rolePrompt){let ee={agentId:Q.agentId,rolePrompt:Q.teammate.rolePrompt,modelId:Q.teammate.modelId,maxIterations:Q.teammate.maxIterations,...Q.teammate.temperature!==void 0?{temperature:Q.teammate.temperature}:{},...Q.teammate.seed!==void 0?{seed:Q.teammate.seed}:{},...Q.teammate.seedRandom?{seedRandom:!0}:{},...Q.teammate.temperatureBase!==void 0?{temperatureBase:Q.teammate.temperatureBase}:{},...Q.teammate.temperatureRange!==void 0?{temperatureRange:Q.teammate.temperatureRange}:{}};he.set(ee.agentId,ee),se.markTeammatesDirty()}if(Q.type==="teammate_shutdown"&&!aDe(Q.reason))he.delete(Q.agentId),se.markTeammatesDirty();if(Q.type==="team_cleaned")he.clear(),se.markTeammatesDirty();se.onEvent(Q)}}}),H)M.hydrateState(H),_=!0;Y.runtime=M}if(!N){if(!M)return;N=!0;let Q=QA({runtime:M,leadAgentId:t.sessionId||"lead",restoredFromPersistence:Boolean(H),restoredTeammates:J,includeLeadSpawnTool:!0,includeLeadManagementTools:!0,onLeadToolsUnlocked:(ee)=>{I=ee,Ke?.addTools(ee)},createBaseTools:p.enableTools?(ee)=>Ev(t.cwd,t.providerId,p.mode,t.modelId,t.toolRoutingRules,g,void 0,u,i??t.telemetry,t.qaCredentials,e.runCommandExecutionController,e.readReceipts,y,{workspace:e.delegatedSandboxes?.().openSync(VC(ee))},oa(t)):void 0,teammateConfigProvider:Se});if(_)M.recoverActiveRuns("runtime_recovered");if(Q.restoredFromPersistence)d?.();k.push(...Q.tools)}return M};if(p.enableSpawnAgent&&s&&ns({maxConcurrentAgents:t.maxConcurrentAgents,nodes:cs(t)})){let Y=[t.providerConfig,t.delegatedAgentConnection?.providerConfig,...cs(t).map((Ee)=>Ee.connection.providerConfig)].filter((Ee)=>Ee?.polykv?.swarm===!0),Q;if(a&&Y.length>0){if((await Promise.all(Y.map((vt)=>tT(vt).catch(()=>!1)))).some(Boolean))Q=a()}let ee=new Map(dt.map((Ee)=>[si(Ee.name),Ee])),be=new Map(E.configs.map((Ee)=>[si(Ee.name),Ee])),ge=s({...Q?{swarm:Q}:{},...p.enableAgentTeams?{teammates:!0}:{},...ee.size>0?{configuredAgents:()=>ee,configuredAgentConfigs:()=>be}:{}});k.push({...ge,execute:async(Ee,vt)=>(Ue(),ge.execute(Ee,vt))}),k.push(Dh())}if(p.enableAgentTeams){if(Ue(),!k.some((Y)=>Y.name===wo))k.push(Dh())}let xt=dt.length>0||k.some((Y)=>Y.name==="spawn_agent");if(t.sessionId&&xt)k.push(...Aw({sessionId:t.sessionId}));else if(t.sessionId&&p.enableAgentTeams)k.push(...Aw({sessionId:t.sessionId}).filter((Y)=>rj.has(Y.name)));if(t.sessionId&&(p.enableAgentTeams||xt))k.push(JE({sessionId:t.sessionId,configProvider:()=>this.teamRuntimeEntries.get(re)?.delegatedAgentConfigProvider??Se,teammates:()=>{let Y=this.teamRuntimeEntries.get(re)?.runtime?.exportState();return Y?{members:Y.members,runs:Y.runs}:void 0}}));let Jt=_v(k,g),Zn=Jt.some((Y)=>Y.name==="submit_and_exit"&&Y.lifecycle?.completesRun===!0),Ze=p.enableAgentTeams?()=>{let Y=this.teamRuntimeEntries.get(re)?.runtime;if(!Y)return;let Q=Y.listTasks(),ee=Q.some((Ee)=>Ee.status==="in_progress"||Ee.status==="pending"),be=Y.listRuns({}),ge=be.some((Ee)=>Ee.status==="running"||Ee.status==="queued");if(ee||ge){let Ee=Q.filter((kt)=>kt.status==="in_progress"||kt.status==="pending").map((kt)=>`${kt.id} (${kt.status}): ${kt.title}`).join(", "),vt=be.filter((kt)=>kt.status==="running"||kt.status==="queued").map((kt)=>`${kt.id} (${kt.status})`).join(", "),Nt=[];if(Ee)Nt.push(`Unfinished tasks: ${Ee}`);if(vt)Nt.push(`Active runs: ${vt}`);return`[SYSTEM] You still have team obligations. ${Nt.join(". ")}. Use team_run_task to delegate work, or team_task with action=complete to mark tasks done, or team_await_runs to wait for active runs. Do NOT stop until all tasks are completed.`}return}:void 0,un=t.sessionId&&xt?C2(t.sessionId):void 0,Kr=Ze&&un?()=>Ze()??un():Ze??un;zNe(t.toolIntentGuard!==!1);let kr={...Zn?{requireCompletionTool:!0}:{},...Kr?{completionGuard:Kr}:{},maxNoToolCallNudges:qNe,...t.strongNudges===!1?{strongNudges:!1}:{}},Tr=dDe({offered:Jt.map((Y)=>Y.name),subagentsEnabled:p.enableSpawnAgent,serialised:it,multipleNodes:(t.agentNodes?.length??0)>1});return{tools:Jt,modelTools:f,...Object.keys(Tr).length>0?{unavailableToolReasons:Tr}:{},configuredAgents:E.configs,logger:o??t.logger,telemetry:i??t.telemetry,teamRuntime:M,teamRestoredFromPersistence:Boolean(H),delegatedAgentConfigProvider:this.teamRuntimeEntries.get(re)?.delegatedAgentConfigProvider??Se,extensions:z,completionPolicy:kr,registerLeadAgent:(Y)=>{if(Ke=Y,I.length>0)Y.addTools(Ji(I,[...w]))},shutdown:async(Y)=>{sDe(M,Y),se?.dispose(),X?.close(),this.teamRuntimeEntries.delete(re),await G?.();for(let Q of W)Q.stop()}}}}import{normalizeUserInput as cDe}from"@cerebriline/shared";import{nanoid as uDe}from"nanoid";class TV{list(e){return e?Jn(e):[]}update(e,t){if(!e)return{sessionId:t.sessionId,prompts:[],updated:!1};let n=t.promptId.trim(),r=e.pendingPrompts.findIndex((d)=>d.id===n);if(r<0)return{sessionId:t.sessionId,prompts:Jn(e),updated:!1};let o=e.pendingPrompts[r];if(!o)return{sessionId:t.sessionId,prompts:Jn(e),updated:!1};let i=t.prompt===void 0?o.prompt:cDe(t.prompt).trim();if(!i)throw Error("prompt cannot be empty");let s=t.delivery??o.delivery,a={...o,prompt:i,mode:t.mode??o.mode,delivery:s};return e.pendingPrompts.splice(r,1),pDe(e,a,r,o.delivery),{sessionId:t.sessionId,prompts:Jn(e),prompt:Av(a),updated:!0}}delete(e,t){if(!e)return{sessionId:t.sessionId,prompts:[],removed:!1};let n=t.promptId.trim(),r=e.pendingPrompts.findIndex((i)=>i.id===n);if(r<0)return{sessionId:t.sessionId,prompts:Jn(e),removed:!1};let[o]=e.pendingPrompts.splice(r,1);return{sessionId:t.sessionId,prompts:Jn(e),prompt:o?Av(o):void 0,removed:!0}}enqueue(e,t){let{prompt:n,mode:r,delivery:o,userImages:i,userFiles:s,origin:a,noteKind:d,refresh:l}=t;if(a==="harness"&&d){let u=e.pendingPrompts.find((h)=>h.origin==="harness"&&h.noteKind===d);if(u)return u.prompt=d==="recap"?KW(u.prompt,n):n,u.refresh=l,Jn(e)}let c=e.pendingPrompts.findIndex((u)=>u.prompt===n);if(c>=0){let[u]=e.pendingPrompts.splice(c,1),h={...u,prompt:n,mode:r??u.mode,userImages:i??u.userImages,userFiles:s??u.userFiles};if(o==="steer"||u.delivery==="steer")e.pendingPrompts.unshift({...h,delivery:"steer"});else e.pendingPrompts.push(h)}else{let u={id:`pending_${Date.now()}_${uDe(5)}`,prompt:n,mode:r,delivery:o,userImages:i,userFiles:s,...a==="harness"?{origin:a}:{},...a==="harness"&&d?{noteKind:d}:{},...a==="harness"&&l?{refresh:l}:{}};if(o==="steer")e.pendingPrompts.unshift(u);else e.pendingPrompts.push(u)}return Jn(e)}consumeSteer(e){for(;;){let t=e.pendingPrompts.findIndex((r)=>r.delivery==="steer");if(t<0)return{prompts:Jn(e)};let[n]=e.pendingPrompts.splice(t,1);if(n&&kV(n))return{entry:n,prompts:Jn(e)}}}shiftNext(e){for(;;){let t=e.pendingPrompts.shift();if(!t||kV(t))return{entry:t,prompts:Jn(e)}}}requeueFront(e,t){return e.pendingPrompts.unshift(t),Jn(e)}clear(e){return e.pendingPrompts.length=0,[]}dropHarnessNotes(e){let t=e.pendingPrompts.length,n=e.pendingPrompts.filter((r)=>r.origin!=="harness");return e.pendingPrompts.length=0,e.pendingPrompts.push(...n),t-n.length}}class JC{deps;service=new TV;constructor(e){this.deps=e}list(e){return this.service.list(this.deps.getSession(e))}steerFirst(e){let t=this.deps.getSession(e),n=t?.pendingPrompts[0];if(!n||n.delivery==="steer")return{sessionId:e,prompts:this.service.list(t),updated:!1};return this.update({sessionId:e,promptId:n.id,delivery:"steer"})}update(e){let t=this.deps.getSession(e.sessionId);if(!t)return{sessionId:e.sessionId,prompts:[],updated:!1};let n=this.service.update(t,e);if(this.emitPrompts(t),n.updated&&n.prompt?.delivery==="steer"&&!t.aborting)t.agent.notifyPendingUserMessage();return this.scheduleDrain(e.sessionId,t),n}delete(e){let t=this.deps.getSession(e.sessionId);if(!t)return{sessionId:e.sessionId,prompts:[],removed:!1};let n=this.service.delete(t,e);return this.emitPrompts(t),this.scheduleDrain(e.sessionId,t),n}enqueue(e,t){let n=this.deps.getSession(e);if(!n)return;if(this.service.enqueue(n,t),this.emitPrompts(n),t.delivery==="steer"&&!n.aborting)n.agent.notifyPendingUserMessage();this.scheduleDrain(e,n)}consumeSteer(e){let t=this.deps.getSession(e);if(!t)return;let n=t.pendingPrompts.length,{entry:r}=this.service.consumeSteer(t);if(!r){if(t.pendingPrompts.length!==n)this.emitPrompts(t);return}return this.emitPrompts(t),this.emitSubmitted(t,r),r}discardQueue(e){if(e.pendingPrompts.length===0)return;this.service.clear(e),this.emitPrompts(e)}dropHarnessNotes(e){if(this.service.dropHarnessNotes(e)>0)this.emitPrompts(e)}emitPrompts(e){this.deps.emit({type:"pending_prompts",payload:{sessionId:e.sessionId,prompts:Jn(e)}})}scheduleDrain(e,t){if(t.pendingPrompts.length===0||t.aborting||t.drainingPendingPrompts||!t.agent.canStartRun())return;queueMicrotask(()=>{this.drain(e)})}async drain(e){let t=this.deps.getSession(e);if(!t)return;if(t.aborting||t.drainingPendingPrompts)return;if(!t.agent.canStartRun())return;let n=t.pendingPrompts.length,{entry:r}=this.service.shiftNext(t);if(!r){if(t.pendingPrompts.length!==n)this.emitPrompts(t);return}this.emitPrompts(t),this.emitSubmitted(t,r),t.drainingPendingPrompts=!0;let o=!0;try{let i=await this.deps.send({sessionId:e,prompt:r.prompt,...r.mode?{mode:r.mode}:{},userImages:r.userImages,userFiles:r.userFiles});if(hDe(i))o=!1}catch{o=!1,this.service.requeueFront(t,r),this.emitPrompts(t)}finally{if(t.drainingPendingPrompts=!1,o&&t.pendingPrompts.length>0&&t.status!=="failed"&&t.status!=="cancelled")queueMicrotask(()=>{this.drain(e)})}}emitSubmitted(e,t){let n=Av(t);this.deps.emit({type:"pending_prompt_submitted",payload:{sessionId:e.sessionId,id:n.id,prompt:n.prompt,delivery:n.delivery,attachmentCount:n.attachmentCount,userImages:n.userImages,userFiles:n.userFiles,...n.origin?{origin:n.origin}:{}}})}}function kV(e){if(!e.refresh)return!0;let t;try{t=e.refresh()}catch{return!0}if(t===void 0||t.trim()==="")return!1;return e.prompt=t,!0}function hDe(e){return typeof e==="object"&&e!==null&&"finishReason"in e&&e.finishReason==="error"}function Av(e){return{id:e.id,prompt:e.prompt,delivery:e.delivery,attachmentCount:(e.userImages?.length??0)+(e.userFiles?.length??0),userImages:e.userImages,userFiles:e.userFiles,...e.origin==="harness"?{origin:e.origin}:{}}}function Jn(e){return e.pendingPrompts.map(Av)}function pDe(e,t,n,r){if(t.delivery==="steer")e.pendingPrompts.unshift(t);else if(r==="steer")e.pendingPrompts.push(t);else e.pendingPrompts.splice(n,0,t)}import{formatDisplayUserInput as Fpt,normalizeUserInput as Upt}from"@cerebriline/shared";import{resolveSessionDataDir as Hpt}from"@cerebriline/shared/storage";import{existsSync as QC}from"node:fs";import{readFile as mDe}from"node:fs/promises";import{join as fDe}from"node:path";class ZC{listeners=new Set;subscribe(e,t){let n={listener:e,sessionId:t?.sessionId?.trim()||void 0};return this.listeners.add(n),()=>{this.listeners.delete(n)}}emit(e){let t=e.payload.sessionId?.trim();for(let n of this.listeners){if(n.sessionId&&n.sessionId!==t)continue;n.listener(e)}}get size(){return this.listeners.size}}function SV(e,t,n){let r=e?.trim();if(r&&QC(r))return r;let o=n?.trim();if(o){let i=fDe(o,t,`${t}.messages.json`);if(QC(i))return i}return r||void 0}async function Uc(e){let t=e?.trim();if(!t||!QC(t))return[];try{let n=(await mDe(t,"utf8")).trim();if(!n)return[];let r=JSON.parse(n);if(Array.isArray(r))return r;if(r&&typeof r==="object"&&!Array.isArray(r)){let o=r.messages;if(Array.isArray(o))return o}return[]}catch{return[]}}function eP(e){return e?{...e}:void 0}async function xV(e,t){if(!(e.hookName==="tool_call"||!!e.parent_agent_id))return;await t.queueSpawnRequest(e);let r=await t.upsertSubagentSessionFromHook(e);if(!r)return;await t.appendSubagentHookAudit(r,e),await t.applySubagentStatus(r,e)}function _V(e){let t=Ca(e.session_id)?.rootSessionId??mc(e.session_id)?.rootSessionId;return{sessionId:e.session_id,source:e.source,pid:e.pid,startedAt:e.started_at,endedAt:e.ended_at??null,exitCode:e.exit_code??null,status:e.status,interactive:e.interactive,provider:e.provider,model:e.model,cwd:e.cwd,workspaceRoot:e.workspace_root,teamName:e.team_name,enableTools:e.enable_tools,enableSpawn:e.enable_spawn,enableTeams:e.enable_teams,isSubagent:t!==void 0,...t!==void 0?{parentSessionId:t}:{},prompt:e.prompt,metadata:e.metadata,messagesPath:e.messages_path,updatedAt:e.ended_at??e.started_at}}class Rv{deps;constructor(e){this.deps=e}lastKnownIdentityBySession=new Map;static MAX_IDENTITY_SNAPSHOTS=512;dispatchAgentEvent(e,t,n){let r=this.deps.getSession(e),o={sessionId:e,config:t,liveSession:r,usageBySession:this.deps.usageBySession,aggregateUsageBySession:this.deps.aggregateUsageBySession,persistMessages:this.deps.persistMessages,emit:this.deps.emit},i=CR(n);if(!!r&&(!i.agentId||i.agentId===tP(r.agent))){let a={agentId:tP(r.agent),conversationId:r.agent.getConversationId(),...r?.runtime.teamRuntime?{teamRole:"lead"}:{}};this.rememberSessionIdentity(e,a),pb(o,n,{...a,isPrimaryAgentEvent:!0});return}pb(o,n,{...r?{}:this.lastKnownIdentityBySession.get(e),isPrimaryAgentEvent:!1})}rememberSessionIdentity(e,t){if(this.lastKnownIdentityBySession.delete(e),this.lastKnownIdentityBySession.set(e,t),this.lastKnownIdentityBySession.size>Rv.MAX_IDENTITY_SNAPSHOTS){let n=this.lastKnownIdentityBySession.keys().next().value;if(n!==void 0)this.lastKnownIdentityBySession.delete(n)}}async handleTeamEvent(e,t){let n=this.deps.getSession(e);if(n){if(WI(n,t),t.type==="agent_event"){let r={sessionId:e,config:n.config,liveSession:n,usageBySession:this.deps.usageBySession,aggregateUsageBySession:this.deps.aggregateUsageBySession,persistMessages:this.deps.persistMessages,emit:this.deps.emit};pb(r,t.event,{agentId:t.agentId,teamRole:"teammate",teamAgentId:t.agentId,isPrimaryAgentEvent:!1})}if(t.type==="teammate_spawned"){let r=ui({agentId:t.teammate.runtimeAgentId??t.agentId,conversationId:t.teammate.conversationId,parentAgentId:t.teammate.parentAgentId,createdByAgentId:tP(n.agent),teamId:n.runtime.teamRuntime?.getTeamId(),teamName:n.runtime.teamRuntime?.getTeamName(),teamRole:"teammate",teamAgentId:t.agentId});if(r)ld(n.config.telemetry,{ulid:e,modelId:t.teammate.modelId??n.config.modelId,provider:n.config.providerId,...r})}}if(await jI(e,t,this.deps.invokeBackendOptional),n&&(t.type!=="agent_event"||t.activityChanged===!0))qI(n,e,t,this.deps.emit)}async handlePluginEvent(e,t,n,r){if(t.name==="plugin_log"){this.handlePluginLog(e,t.payload);return}if(t.name==="plugin_telemetry"){this.handlePluginTelemetry(e,t.payload,r);return}if(t.name==="automation_event"){let l=this.deps.getSession(e)?.config.extensionContext?.automation??n;if(!l)return;let c=t.payload&&typeof t.payload==="object"?t.payload:void 0;if(!c)return;await l.ingestEvent(c);return}if(t.name!=="steer_message"&&t.name!=="queue_message"&&t.name!=="pending_prompt")return;let o=t.payload&&typeof t.payload==="object"?t.payload:void 0,i=typeof o?.sessionId==="string"&&o.sessionId.trim().length>0?o.sessionId.trim():e,s=typeof o?.prompt==="string"?o.prompt.trim():"";if(!s)return;let a=t.name==="steer_message"?"steer":t.name==="queue_message"?"queue":o?.delivery==="steer"?"steer":"queue";this.deps.enqueuePendingPrompt(i,{prompt:s,delivery:a})}handlePluginTelemetry(e,t,n){let o=this.deps.getSession(e)?.config.telemetry??n;if(!o||!t||typeof t!=="object")return;let i=t,s=typeof i.pluginName==="string"&&i.pluginName?i.pluginName:"unknown";if(i.kind==="event"){let a=typeof i.event==="string"?i.event.trim():"";if(!a)return;let d={...i.properties&&typeof i.properties==="object"?i.properties:{},plugin_name:s,session_id:e};if(i.required===!0)o.captureRequired(`plugin.${a}`,d);else o.capture({event:`plugin.${a}`,properties:d});return}if(i.kind==="metric"){let a=typeof i.name==="string"?i.name.trim():"",d=typeof i.value==="number"?i.value:NaN;if(!a||Number.isNaN(d))return;let l={...i.attributes&&typeof i.attributes==="object"?i.attributes:{},plugin_name:s},c=typeof i.description==="string"?i.description:void 0,u=i.required===!0,h=`plugin.${a}`;if(i.metric==="counter")o.recordCounter(h,d,l,c,u);else if(i.metric==="histogram")o.recordHistogram(h,d,l,c,u);else if(i.metric==="gauge")o.recordGauge(h,d,l,c,u)}}handlePluginLog(e,t,n){let r=this.deps.getSession(e),o=n??r?.config.extensionContext?.logger??r?.config.logger;if(!o||!t||typeof t!=="object")return;let i=t,s=typeof i.message==="string"?i.message:"";if(!s)return;let a=i.metadata&&typeof i.metadata==="object"?{...i.metadata}:{};if(a.sessionId??=e,typeof i.pluginName==="string"&&i.pluginName)a.pluginName=i.pluginName;if(i.level==="debug"){o.debug(s,a);return}if(i.level==="error"){if(o.error)o.error(s,a);else o.log(s,{...a,severity:"error"});return}o.log(s,a)}}function tP(e){return e.getAgentId()}function nP(e){return{sessionId:e.sessionId,source:e.source,pid:process.pid,startedAt:e.startedAt,endedAt:e.endedAt??null,exitCode:e.exitCode??null,status:e.status,interactive:e.interactive,provider:e.config.providerId,model:e.config.modelId,cwd:e.config.cwd,workspaceRoot:hi(e.config),teamName:e.config.teamName?.trim()||void 0,enableTools:e.config.enableTools,enableSpawn:e.config.enableSpawnAgent,enableTeams:e.config.enableAgentTeams,parentSessionId:typeof e.sessionMetadata?.parentSessionId==="string"?e.sessionMetadata.parentSessionId:void 0,parentAgentId:typeof e.sessionMetadata?.parentAgentId==="string"?e.sessionMetadata.parentAgentId:void 0,agentId:typeof e.sessionMetadata?.agentId==="string"?e.sessionMetadata.agentId:void 0,conversationId:typeof e.sessionMetadata?.conversationId==="string"?e.sessionMetadata.conversationId:void 0,isSubagent:typeof e.sessionMetadata?.isSubagent==="boolean"?e.sessionMetadata.isSubagent:!1,prompt:e.pendingPrompt,metadata:e.sessionMetadata,messagesPath:e.artifacts?.messagesPath,updatedAt:e.updatedAt??e.endedAt??e.startedAt}}function rP(e,t){let n=e[t];return typeof n==="function"?n:null}async function EV(e,t,...n){let r=rP(e,t);if(!r)throw Error(`session service method not available: ${t}`);return Promise.resolve(r.apply(e,n))}async function AV(e,t,...n){let r=rP(e,t);if(!r)return;await Promise.resolve(r.apply(e,n))}async function RV(e,t,...n){let r=rP(e,t);if(!r)return;return await Promise.resolve(r.apply(e,n))}import{clearPolykvSession as Iv,releasePolykvAgent as oP,setPolykvSession as gDe}from"@cerebriline/llms";function CV(e,t,n){let r=n?{extractDocument:n}:{};if(!e)return{executors:t,enableBash:!1,...n?{executorOptions:r}:{}};let o=wv(t?.semanticSearch,e.executorOptions.overlay);return{executorOptions:{...e.executorOptions,...r},...o?{executors:{semanticSearch:o}}:{},...e.allowCommands?{}:{enableBash:!1}}}function Cv(e,t,n){return{onSubAgentEvent:(r)=>e.onAgentEvent(n,t,r),onSubAgentStart:(r)=>{let o=e.getSession(n)?.runtime.teamRuntime;e.subAgentStarts.set(r.subAgentId,{startedAt:Date.now(),rootSessionId:n});let i=ui({agentId:r.subAgentId,conversationId:r.conversationId,parentAgentId:r.parentAgentId,teamId:o?.getTeamId(),teamName:o?.getTeamName(),createdByAgentId:r.parentAgentId});if(i)ld(t.telemetry,{ulid:n,modelId:t.modelId,provider:t.providerId,...i});vk(t.telemetry,{event:"started",ulid:n,durationMs:0,parentId:r.parentAgentId,agentId:r.subAgentId,...i}),e.invokeBackendOptional("handleSubAgentStart",n,r)},onSubAgentEnd:async(r)=>{let o=e.getSession(n)?.runtime.teamRuntime,i=e.subAgentStarts.get(r.subAgentId),s=i?Date.now()-i.startedAt:0,a=r.result?.text?r.result.text.split(`
1462
+ `,"utf8"),hV(i,o)}markInProgressRunsInterrupted(e,t){let n=this.readEnvelope(e);if(!n?.teamState?.runs?.length)return[];let r=n.teamState.runs.filter((i)=>i.status==="queued"||i.status==="running").map((i)=>i.id);if(r.length===0)return[];let o=new Date;return n.teamState={...n.teamState,runs:n.teamState.runs.map((i)=>i.status==="queued"||i.status==="running"?{...i,status:"interrupted",error:t,endedAt:o}:i)},this.persistRuntime(e,n.teamState,n.teammates),r}ensureTeamDir(){if(!Fc(this.teamDirPath))uV(this.teamDirPath,{recursive:!0});return this.teamDirPath}ensureTeamSubdir(e){let t=qC(this.ensureTeamDir(),gn(e));if(!Fc(t))uV(t,{recursive:!0});return t}statePath(e){return qC(this.ensureTeamDir(),gn(e),"state.json")}historyPath(e){return qC(this.ensureTeamDir(),gn(e),"task-history.jsonl")}readEnvelope(e){let t=this.statePath(e);if(!Fc(t))return;try{let n=JSON.parse(jC(t,"utf8"));if(n?.version===1&&n.teamState)return n}catch{}return}}function gV(e={}){try{let t=new vv(e);return t.init(),t}catch{let t=new kv({teamDir:e.teamDir});return t.init(),t}}import{chmodSync as UNe,existsSync as zC}from"node:fs";import{join as GC}from"node:path";function Tv(e){if(!e)return;if(process.platform==="win32"){let t=GC(e,"cerebriline-sandbox.exe"),n=GC(e,"hook.dll");if(!zC(t)||!zC(n))return;return{launcher:t,hook:n,platforms:["win32"]}}if(process.platform==="linux")return yV(e,"","linux");if(process.platform==="darwin")return yV(e,"darwin-","darwin");return}function yV(e,t,n){let r={x64:"x64",arm64:"arm64"}[process.arch],i=(r?[`cerebriline-sandbox-${t}${r}`,"cerebriline-sandbox"]:["cerebriline-sandbox"]).map((s)=>GC(e,s)).find(zC);if(!i)return;try{UNe(i,493)}catch{}return{launcher:i,hook:i,platforms:[n]}}var BNe=300,HNe=60000,wV=5000;class KC{opts;pendingEvents=[];teammatesDirty=!1;timer;lastFlushAt=0;disposed=!1;constructor(e){this.opts={batchMs:BNe,telemetryFlushMs:HNe,now:Date.now,...e}}onEvent(e){if(this.disposed)return;if(!pi(e)){if(this.opts.now()-this.lastFlushAt>=this.opts.telemetryFlushMs)this.schedule();return}if(this.pendingEvents.push({type:e.type,payload:is(e)}),NI(e)){this.flush();return}this.schedule()}markTeammatesDirty(){this.teammatesDirty=!0}markStateDirty(){if(this.disposed)return;this.schedule()}flush(){this.clearTimer();let e=this.opts.source();if(!e)return;if(!e.hasPendingStateDelta()&&this.pendingEvents.length===0&&!this.teammatesDirty)return;let n=this.pendingEvents,r=this.teammatesDirty;this.pendingEvents=[],this.teammatesDirty=!1;let o=e.drainStateDelta();try{this.opts.store.persistBatch(this.opts.teamKey,{events:n,delta:o,teammates:this.opts.teammates(),getFullState:()=>e.exportState()}),this.lastFlushAt=this.opts.now()}catch(i){e.requeueStateDelta(o);let s=n.concat(this.pendingEvents);if(this.pendingEvents=s.length>wV?s.slice(-wV):s,this.teammatesDirty=this.teammatesDirty||r,!this.disposed)this.schedule();try{this.opts.onError?.(i)}catch{}}}dispose(){if(this.disposed)return;this.disposed=!0,this.flush()}schedule(){if(this.timer)return;this.timer=setTimeout(()=>{this.timer=void 0,this.flush()},this.opts.batchMs),this.timer.unref?.()}clearTimer(){if(this.timer)clearTimeout(this.timer),this.timer=void 0}}function Sv(e,t){return GNe(e,t)}function vV(e,t){let n=t?.["*"]??{},r=t?.[e]??{};return{...n,...r}.enabled!==!1}function YNe(e,t){return e.filter((n)=>vV(n.name,t))}function _v(e,t){return Ji(YNe(e,t))}function XNe(e){if(e?.readLimitEnabled===!1)return Number.POSITIVE_INFINITY;let t=e?.readLimitChars;return typeof t==="number"&&Number.isFinite(t)&&t>0?Math.floor(t):void 0}function JNe(e,t){if(!t?.length)return e;let n={...e??{}};for(let r of t){let o=r.trim();if(!o)continue;n[o]={...n[o]??{},enabled:!1}}return n}var QNe={apply_diff:"editor",attempt_completion:"submit_and_exit",bash:"run_commands",execute_command:"run_commands",list_code_definition_names:"search_codebase",list_files:"run_commands",read_file:"read_files",replace_in_file:"editor",search_files:"search_codebase",use_skill:"skills",write_to_file:"editor"};function ZNe(e){let t=e.trim().toLowerCase();return QNe[t]??t}function eDe(e,t){if(t.tools===void 0)return e;let n=new Set(t.tools.map(ZNe));if(t.skills!==void 0)n.add("skills");return e.filter((r)=>n.has(r.name))}function tDe(){return`team-${VNe(5)}`}function Ev(e,t,n,r,o,i,s,a,d,l,c,u,h,p,f,m){let g=go[yo({mode:n})],y=Gy(t,r,n,o??zy);return _v(dp({cwd:e,telemetry:d,qaCredentials:l,executorOptions:p?.workspace?{...p.workspace.executorOptions,...f?{extractDocument:f}:{},...h!==void 0?{fileRead:{maxReadChars:h}}:{}}:{bash:{executionController:c,...m?{wrapSpawn:m}:{}},...u?{receipts:u}:{},...f?{extractDocument:f}:{},...h!==void 0?{fileRead:{maxReadChars:h}}:{}},...g,enableSkills:!!s,...y,enableExtractDocument:g.enableExtractDocument===!0&&vV(le.EXTRACT_DOCUMENT,i),...p&&!p.workspace?.allowCommands?{enableBash:!1}:{},executors:{...s?{skills:s}:{},...p?.workspace?a?.semanticSearch?{semanticSearch:wv(a.semanticSearch,p.workspace.executorOptions.overlay)}:{}:a??{}}}),i)}function nDe(e){return Ev(e.cwd,e.providerId,e.mode,e.modelId,e.toolRoutingRules,e.toolPolicies,rDe,e.toolExecutors).some((t)=>t.name==="skills")}var rDe=async()=>"";async function oDe(e){let t=jr(),n=e.includeSettings&&nm({filePath:t});if(!n&&!e.agentPluginServers?.length)return{tools:[]};let r=fv({settingsPath:t}),o=fv({restrictConfiguredHeadersToOrigin:!0}),i=new gv({clientFactory:(u)=>u.metadata?.source==="agent-plugin"?o(u):r(u)}),s=[];if(n)try{s=await OC(i,{filePath:t})}catch(u){let h=u instanceof Error?u.message:String(u);e.logger?.log(`[mcp] Failed to load MCP settings, skipping settings-backed MCP tools: ${h}`)}let a=new Set(s.map((u)=>u.name));for(let u of e.agentPluginServers??[]){let h=u.registration;if(a.has(h.name)){e.logger?.log(`[agent-plugins] MCP server '${h.name}' conflicts with an existing server and was skipped.`,{severity:"error"});continue}try{await i.registerServer(h),s.push(h),a.add(h.name)}catch(p){let f=p instanceof Error?p.message:String(p);e.logger?.log(`[agent-plugins] Failed to register MCP server '${h.name}', skipping: ${f}`,{severity:"error"})}}if(s.length===0)return await i.dispose().catch(()=>{}),{tools:[]};let d=s.filter((u)=>u.disabled!==!0),l=await Promise.allSettled(d.map((u)=>HC({serverName:u.name,provider:i,timeoutMs:KNe(u.timeoutSeconds)*1000}))),c=[];for(let[u,h]of l.entries())if(h.status==="fulfilled")c.push(...h.value);else{let p=h.reason instanceof Error?h.reason.message:String(h.reason);e.logger?.log(`[mcp] Failed to load tools from MCP server "${d[u].name}", skipping: ${p}`)}return{tools:c,shutdown:async()=>{await i.dispose()}}}function xv(e){return`configured:${e}`}function VC(e){return`teammate:${e}`}function iDe(e){return{handBack:(t)=>e().handBack(VC(t),t),release:async(t)=>{await e().close(VC(t),t)}}}function sDe(e,t){if(!e)return;try{e.cancelOutstandingWork(`${YC}${t}`)}catch{}for(let n of e.getTeammateIds())try{e.shutdownTeammate(n,`${YC}${t}`)}catch{}}var YC="runtime_shutdown:";function aDe(e){if(e===void 0)return!1;if(e.startsWith(YC))return!0;switch(e){case"session_stop":case"session_complete":case"session_error":case"session_manager_dispose":case"cli_run_shutdown":case"cli_interactive_shutdown":case"cli_interactive_startup_cancelled":case"provider_change":case"acp_shutdown":case"hub_server_stop":case"vscode_webview_dispose":return!0;default:return!1}}function cs(e){return CI({providerId:e.providerId,modelId:e.modelId,agentNodes:(e.agentNodes??[]).map((t)=>({...t,connection:t.connection})),polykvAgentsPriorityZero:e.polykvAgentsPriorityZero,overflowCapacity:e.maxConcurrentAgents,lead:{apiKey:e.apiKey,baseUrl:e.baseUrl,headers:e.headers,providerConfig:e.providerConfig,knownModels:e.knownModels,thinking:e.thinking,reasoningEffort:e.reasoningEffort,thinkingBudgetTokens:e.thinkingBudgetTokens,maxTokensPerTurn:e.maxTokensPerTurn,maxToolResultChars:e.maxToolResultChars,staleReadRewrites:e.staleReadRewrites,toolResultFormat:e.toolResultFormat,temperature:e.temperature}})}function dDe(e){let t=new Set(e.offered),n=["spawn_agent","spawn_swarm"].filter((d)=>!t.has(d));if(n.length===0)return{};let r;if(!e.subagentsEnabled)r="sub-agents are switched off in this session's settings.";else if(e.serialised)r=`${e.multipleNodes?"every configured node serves 1 request at a time":"this endpoint serves 1 request at a time"}, so a spawned agent would run after you rather than beside you.`;else return{};let o=e.offered.filter((d)=>d.startsWith("subagent_")),i=o.length>0?`Do the work yourself, or hand one job at a time to a configured agent: ${o.join(", ")}.`:"Do the work yourself.",s=e.subagentsEnabled?`Only the user can change this, by raising the profile's parallel sessions${e.multipleNodes?" or a node's capacity":""}.`:"Only the user can change this, in the settings.",a={};for(let d of n)a[d]=`${r} ${i} Do not call ${d} again in this session; it will be refused the same way. ${s}`;return a}function lDe(e){let t=go[yo({mode:e.mode})];return{sessionId:e.sessionId||"",mode:e.mode==="plan"?"plan":e.mode==="yolo"?"yolo":"act",enableTools:e.enableTools!==!1,enableSpawnAgent:e.enableSpawnAgent??t.enableSpawnAgent??!0,enableAgentTeams:ns({maxConcurrentAgents:e.maxConcurrentAgents,nodes:cs(e)})&&e.enableAgentTeams===!0,disableMcpSettingsTools:e.disableMcpSettingsTools===!0,yolo:e.yolo===!0,missionLogIntervalSteps:typeof e.missionLogIntervalSteps==="number"&&Number.isFinite(e.missionLogIntervalSteps)?e.missionLogIntervalSteps:3,missionLogIntervalMs:typeof e.missionLogIntervalMs==="number"&&Number.isFinite(e.missionLogIntervalMs)?e.missionLogIntervalMs:120000}}class XC{teamRuntimeEntries=new Map;async build(e){let{config:t,hooks:n,extensions:r,logger:o,telemetry:i,createSpawnTool:s,createSwarmTool:a,onTeamRestored:d,userInstructionService:l,configExtensions:c,toolExecutors:u}=e,h=e.onTeamEvent??(()=>{}),p=lDe(t),f=[];if(p.enableTools&&p.mode!=="yolo"&&SA("web_search")&&bV({providerId:t.providerId,modelId:t.modelId},"web_search"))f.push({name:"web_search"});if(p.enableTools&&bV({providerId:t.providerId,modelId:t.modelId},"image_generation"))f.push({name:"image_generation",outputFormat:"png"});let m=t.workspaceRoot??t.cwd,g=JNe(e.toolPolicies??t.toolPolicies,t.enableExtractDocument===!0?t.providerConfig?.tools?.disabled:[...t.providerConfig?.tools?.disabled??[],le.EXTRACT_DOCUMENT]),y=XNe(t.providerConfig?.tools),w=Ta(),k=[],b=t.teamName?.trim()||tDe(),v=t.sessionId?.trim()||b,E=p.enableSpawnAgent?MI({workspaceRoot:m}):{configs:[],errors:[],searchPaths:[]},S=E.configs.some((Y)=>Y.skills!==void 0),x=Sv(c,"rules"),T=Sv(c,"skills"),A=T||S,R=Sv(c,"workflows"),C=Sv(c,"plugins"),L=x||T||R,N=!1,W=[],D=l,G;for(let Y of E.errors)(o??t.logger)?.log?.(`[agents] Failed to load agent config at ${Y.path}: ${Y.error.message}`);if(p.enableSpawnAgent){(o??t.logger)?.log?.(E.configs.length>0?`[agents] ${E.configs.length} configured agent(s): ${E.configs.map((Q)=>Q.name).join(", ")}`:`[agents] No configured agents found. Looked in: ${E.searchPaths.join(", ")||"(no search path)"}`);let Y=E.configs.filter((Q)=>Q.profile!==void 0&&t.resolveProfileConnection?.(Q.profile)===void 0);for(let Q of Y){let ee=t.listProfileNames?.()??[];(o??t.logger)?.log?.(`[agents] "${Q.name}" names the API configuration profile "${Q.profile}", which no longer exists, and will fail when called. `+(ee.length>0?`Available profiles: ${ee.join(", ")}.`:"This host has no saved profiles."),{severity:"warn"})}}if(!D&&(L||S))D=Lc({skills:A?{workspacePath:m,includePluginSkills:C,pluginSkillDirectories:C?e.pluginSkillDirectories:void 0,pluginPaths:t.pluginPaths,cwd:t.cwd,agentPluginSkills:C?e.agentPluginSkills:void 0}:{workspacePath:m},rules:{workspacePath:t.cwd},workflows:{workspacePath:t.cwd}}),W.push(D);else if(D&&C&&e.agentPluginSkills?.length&&(L||S)){let Y=Lc({skills:{directories:[],agentPluginSkills:e.agentPluginSkills},rules:{directories:[]},workflows:{directories:[]}});W.push(Y),D=kC([D,Y])}if(D)await D.start().catch(()=>{});let V=p.enableTools&&T&&Boolean(D)&&D?.hasConfiguredSkills(t.skills)===!0&&nDe({cwd:t.cwd,providerId:t.providerId,mode:p.mode,modelId:t.modelId,toolRoutingRules:t.toolRoutingRules,toolPolicies:g,toolExecutors:u}),B=D&&L?D.createExtension({includeRules:x,includeSkills:T,includeWorkflows:R,registerSkillsTool:V,allowedSkillNames:t.skills}):void 0,j=p.mode==="plan"&&p.enableTools?XT({telemetry:i??t.telemetry}):void 0,K=[B,j].filter((Y)=>Y!==void 0),z=K.length>0?[...r??t.extensions??[],...K]:r??t.extensions;if(p.enableTools){k.push(...Ev(t.cwd,t.providerId,p.mode,t.modelId,t.toolRoutingRules,g,void 0,u,i??t.telemetry,t.qaCredentials,e.runCommandExecutionController,e.readReceipts,y,void 0,oa(t),mG({enabled:t.leadSandboxConfine===!0,workspaceRoot:t.workspaceRoot??t.cwd,binaries:Tv(t.sandboxBinariesDir),tempRoot:jNe(WNe(),"cerebriline-sandbox-tmp")})));let Y=C?e.agentPluginMcpServers:void 0;if(!p.disableMcpSettingsTools||Y?.length){let Q=await oDe({logger:t.logger,includeSettings:!p.disableMcpSettingsTools,agentPluginServers:Y});k.push(...Q.tools),G=Q.shutdown}}let M,X=p.enableAgentTeams?gV():void 0,oe=X?.loadRuntime(v),H=oe?.state,J=oe?.teammates??[],he=new Map(J.map((Y)=>[Y.agentId,Y])),se=X?new KC({teamKey:v,store:X,source:()=>M,teammates:()=>Array.from(he.values()),onError:(Y)=>(o??t.logger)?.log?.(`[team] failed to persist team state: ${Y instanceof Error?Y.message:String(Y)}`)}):void 0,re=t.sessionId||b,Ke,I=[],_=!1,F=t.delegatedAgentConnection,O=Nr({providerId:F?.providerId??t.providerId,baseUrl:F?.baseUrl??t.baseUrl}),ue=t.providerConfig,ne=ue&&$o(ue)?eV({capacity:async()=>bv(await Sd({sessionId:t.sessionId,providerConfig:ue,logger:o??t.logger})),...o??t.logger?{logger:o??t.logger}:{}}):void 0,fe=hR(t.maxConcurrentAgents,uR(t.agentSlotLimits),ne?(Y)=>Y===O?ne:void 0:void 0,ue&&$o(ue)?(Y)=>Y===O?()=>tT(ue):void 0:void 0),Ce=F?{...F}:{},We=cs(t).map((Y)=>({...Y,connection:Y.connection})),Se=oi({providerId:t.providerId,modelId:t.modelId,distinctId:e.distinctId,sessionId:t.sessionId,cwd:t.cwd,apiKey:t.apiKey??"",baseUrl:t.baseUrl,headers:t.headers,providerConfig:t.providerConfig,knownModels:t.knownModels,thinking:t.thinking,reasoningEffort:t.reasoningEffort,thinkingBudgetTokens:t.thinkingBudgetTokens,maxTokensPerTurn:t.maxTokensPerTurn,maxToolResultChars:t.maxToolResultChars,staleReadRewrites:t.staleReadRewrites,toolResultFormat:t.toolResultFormat,temperature:t.temperature,maxIterations:t.maxIterations,...t.compaction?.cappedThinkingBudgetMessage?{thinkingBudgetMessage:t.compaction.cappedThinkingBudgetMessage}:{},hooks:n,extensions:z,logger:o??t.logger,telemetry:e.telemetry??t.telemetry,workspaceMetadata:t.workspaceMetadata,createPrepareTurn:e.createDelegatedPrepareTurn,condenseDiscardedReasoning:e.condenseDiscardedReasoning,onLoopCut:e.onDelegatedLoopCut,slotGate:fe.for(Nr({providerId:Ce.providerId??t.providerId,baseUrl:Ce.baseUrl??t.baseUrl})),slotGates:fe,...Ce},Object.keys(Ce)),Le=PI({nodes:We,base:Se});if(Le)Se.setNodePlacement?.(Le),(o??t.logger)?.log(`[Agents] ${We.length} agent node(s): ${We.map((Y)=>`${Y.id} p${Y.priority} x${Number.isFinite(Y.capacity)?Y.capacity:"uncapped"} ${Y.connection.providerId??t.providerId}/${Y.connection.modelId??t.modelId}`).join(", ")}`);if(F)(o??t.logger)?.log(`[Agents] Delegated agents run on provider=${F.providerId} model=${F.modelId}, not the session's`);let it=!ns({maxConcurrentAgents:t.maxConcurrentAgents,nodes:cs(t)});if(!ns({maxConcurrentAgents:t.maxConcurrentAgents,nodes:cs(t)})&&(t.enableSpawnAgent!==!1||t.enableAgentTeams!==!1))(o??t.logger)?.log(`[Agents] spawn_agent and the team tools are withheld: ${(t.agentNodes?.length??0)>1?"every configured node serves 1 request at a time":"this endpoint serves 1 request at a time"}, so a delegated agent would run after the agent that spawned it rather than beside it. Raise the profile's parallel sessions${(t.agentNodes?.length??0)>1?" or a node's capacity":""} to offer them.`);let dt=[],_e=new Map;if(p.enableSpawnAgent){if(k.push(..._v([oV({workspaceRoot:m})],g)),E.configs.length>0)dt=_v(yR({configProvider:Se,agents:E.configs,...t.sessionId?{sessionId:t.sessionId}:{},logger:o??t.logger,resolveProviderConnection:t.resolveProviderConnection,resolveProfileConnection:t.resolveProfileConnection,listProfileNames:t.listProfileNames,createSubAgentTools:async(Y,Q,ee)=>{if(!p.enableTools)return[];let be=e.delegatedSandboxes?.(),ge=ee.toolCallId?xv(ee.toolCallId):void 0,Ee=be&&ge?await be.open(ge):void 0;if(ge&&Ee)_e.set(ge,Y.name);return eDe(sm(Ev(t.cwd,Y.providerId??t.providerId,p.mode,Y.modelId??t.modelId,t.toolRoutingRules,g,Y.skills!==void 0&&D?.createSkillsExecutor?D.createSkillsExecutor(Y.skills):void 0,u,i??t.telemetry,t.qaCredentials,e.runCommandExecutionController,e.readReceipts,y,{workspace:Ee},oa(t)),t.extraTools),Y)},hookErrorMode:t.hookErrorMode,toolPolicies:g,requestToolApproval:e.requestToolApproval,commandSandboxFor:(Y)=>Y?ab(e.delegatedSandboxes?.(),xv(Y)):void 0,onSubAgentEvent:e.onSubAgentEvent,onSubAgentStart:e.onSubAgentStart,onSubAgentEnd:async(Y)=>{let Q=Y.toolCallId?xv(Y.toolCallId):void 0,ee=e.delegatedSandboxes?.();if(Q&&ee?.has(Q)){let be=_e.get(Q)??"agent";_e.delete(Q);let ge=await ee.close(Q,be);if(Y.result&&typeof Y.result.text==="string")Y.result.text+=Ia(Y.result.text,Y.result.finishReason,be,ge)}await e.onSubAgentEnd?.(Y)},onSubAgentSettled:async(Y)=>{if(!Y.toolCallId)return;let Q=xv(Y.toolCallId);_e.delete(Q),await e.delegatedSandboxes?.().close(Q,Y.name)}}),g),k.push(...dt)}if(!this.teamRuntimeEntries.has(re))this.teamRuntimeEntries.set(re,{delegatedAgentConfigProvider:Se});let Ue=()=>{if(!p.enableAgentTeams)return;let Y=this.teamRuntimeEntries.get(re)??{delegatedAgentConfigProvider:Se};if(this.teamRuntimeEntries.set(re,Y),M=Y.runtime,!M){if(M=new Ub({teamName:b,leadAgentId:t.sessionId||"lead",sessionId:t.sessionId,maxConcurrentRuns:t.maxConcurrentAgents===0?Number.POSITIVE_INFINITY:t.maxConcurrentAgents,missionLogIntervalSteps:p.missionLogIntervalSteps,missionLogIntervalMs:p.missionLogIntervalMs,acceptTeammateConnectionUpdates:(Q)=>Se.acceptedConnectionUpdates?.(Q)??Q,...e.delegatedSandboxes?{teammateWorkspaces:iDe(e.delegatedSandboxes)}:{},onStateDirty:()=>se?.markStateDirty(),onTeamEvent:(Q)=>{if(h(Q),se){if(Q.type==="teammate_spawned"&&Q.teammate?.rolePrompt){let ee={agentId:Q.agentId,rolePrompt:Q.teammate.rolePrompt,modelId:Q.teammate.modelId,maxIterations:Q.teammate.maxIterations,...Q.teammate.temperature!==void 0?{temperature:Q.teammate.temperature}:{},...Q.teammate.seed!==void 0?{seed:Q.teammate.seed}:{},...Q.teammate.seedRandom?{seedRandom:!0}:{},...Q.teammate.temperatureBase!==void 0?{temperatureBase:Q.teammate.temperatureBase}:{},...Q.teammate.temperatureRange!==void 0?{temperatureRange:Q.teammate.temperatureRange}:{}};he.set(ee.agentId,ee),se.markTeammatesDirty()}if(Q.type==="teammate_shutdown"&&!aDe(Q.reason))he.delete(Q.agentId),se.markTeammatesDirty();if(Q.type==="team_cleaned")he.clear(),se.markTeammatesDirty();se.onEvent(Q)}}}),H)M.hydrateState(H),_=!0;Y.runtime=M}if(!N){if(!M)return;N=!0;let Q=QA({runtime:M,leadAgentId:t.sessionId||"lead",restoredFromPersistence:Boolean(H),restoredTeammates:J,includeLeadSpawnTool:!0,includeLeadManagementTools:!0,onLeadToolsUnlocked:(ee)=>{I=ee,Ke?.addTools(ee)},createBaseTools:p.enableTools?(ee)=>Ev(t.cwd,t.providerId,p.mode,t.modelId,t.toolRoutingRules,g,void 0,u,i??t.telemetry,t.qaCredentials,e.runCommandExecutionController,e.readReceipts,y,{workspace:e.delegatedSandboxes?.().openSync(VC(ee))},oa(t)):void 0,teammateConfigProvider:Se});if(_)M.recoverActiveRuns("runtime_recovered");if(Q.restoredFromPersistence)d?.();k.push(...Q.tools)}return M};if(p.enableSpawnAgent&&s&&ns({maxConcurrentAgents:t.maxConcurrentAgents,nodes:cs(t)})){let Y=[t.providerConfig,t.delegatedAgentConnection?.providerConfig,...cs(t).map((Ee)=>Ee.connection.providerConfig)].filter((Ee)=>Ee?.polykv?.swarm===!0),Q;if(a&&Y.length>0){if((await Promise.all(Y.map((vt)=>tT(vt).catch(()=>!1)))).some(Boolean))Q=a()}let ee=new Map(dt.map((Ee)=>[si(Ee.name),Ee])),be=new Map(E.configs.map((Ee)=>[si(Ee.name),Ee])),ge=s({...Q?{swarm:Q}:{},...p.enableAgentTeams?{teammates:!0}:{},...ee.size>0?{configuredAgents:()=>ee,configuredAgentConfigs:()=>be}:{}});k.push({...ge,execute:async(Ee,vt)=>(Ue(),ge.execute(Ee,vt))}),k.push(Dh())}if(p.enableAgentTeams){if(Ue(),!k.some((Y)=>Y.name===wo))k.push(Dh())}let xt=dt.length>0||k.some((Y)=>Y.name==="spawn_agent");if(t.sessionId&&xt)k.push(...Aw({sessionId:t.sessionId}));else if(t.sessionId&&p.enableAgentTeams)k.push(...Aw({sessionId:t.sessionId}).filter((Y)=>rj.has(Y.name)));if(t.sessionId&&(p.enableAgentTeams||xt))k.push(JE({sessionId:t.sessionId,configProvider:()=>this.teamRuntimeEntries.get(re)?.delegatedAgentConfigProvider??Se,teammates:()=>{let Y=this.teamRuntimeEntries.get(re)?.runtime?.exportState();return Y?{members:Y.members,runs:Y.runs}:void 0}}));let Jt=_v(k,g),Zn=Jt.some((Y)=>Y.name==="submit_and_exit"&&Y.lifecycle?.completesRun===!0),Ze=p.enableAgentTeams?()=>{let Y=this.teamRuntimeEntries.get(re)?.runtime;if(!Y)return;let Q=Y.listTasks(),ee=Q.some((Ee)=>Ee.status==="in_progress"||Ee.status==="pending"),be=Y.listRuns({}),ge=be.some((Ee)=>Ee.status==="running"||Ee.status==="queued");if(ee||ge){let Ee=Q.filter((kt)=>kt.status==="in_progress"||kt.status==="pending").map((kt)=>`${kt.id} (${kt.status}): ${kt.title}`).join(", "),vt=be.filter((kt)=>kt.status==="running"||kt.status==="queued").map((kt)=>`${kt.id} (${kt.status})`).join(", "),Nt=[];if(Ee)Nt.push(`Unfinished tasks: ${Ee}`);if(vt)Nt.push(`Active runs: ${vt}`);return`[SYSTEM] You still have team obligations. ${Nt.join(". ")}. Use team_run_task to delegate work, or team_task with action=complete to mark tasks done, or team_await_runs to wait for active runs. Do NOT stop until all tasks are completed.`}return}:void 0,un=t.sessionId&&xt?C2(t.sessionId):void 0,Kr=Ze&&un?()=>Ze()??un():Ze??un;zNe(t.toolIntentGuard!==!1);let kr={...Zn?{requireCompletionTool:!0}:{},...Kr?{completionGuard:Kr}:{},maxNoToolCallNudges:qNe,...t.strongNudges===!1?{strongNudges:!1}:{}},Tr=dDe({offered:Jt.map((Y)=>Y.name),subagentsEnabled:p.enableSpawnAgent,serialised:it,multipleNodes:(t.agentNodes?.length??0)>1});return{tools:Jt,modelTools:f,...Object.keys(Tr).length>0?{unavailableToolReasons:Tr}:{},configuredAgents:E.configs,logger:o??t.logger,telemetry:i??t.telemetry,teamRuntime:M,teamRestoredFromPersistence:Boolean(H),delegatedAgentConfigProvider:this.teamRuntimeEntries.get(re)?.delegatedAgentConfigProvider??Se,extensions:z,completionPolicy:kr,registerLeadAgent:(Y)=>{if(Ke=Y,I.length>0)Y.addTools(Ji(I,[...w]))},shutdown:async(Y)=>{sDe(M,Y),se?.dispose(),X?.close(),this.teamRuntimeEntries.delete(re),await G?.();for(let Q of W)Q.stop()}}}}import{normalizeUserInput as cDe}from"@cerebriline/shared";import{nanoid as uDe}from"nanoid";class TV{list(e){return e?Jn(e):[]}update(e,t){if(!e)return{sessionId:t.sessionId,prompts:[],updated:!1};let n=t.promptId.trim(),r=e.pendingPrompts.findIndex((d)=>d.id===n);if(r<0)return{sessionId:t.sessionId,prompts:Jn(e),updated:!1};let o=e.pendingPrompts[r];if(!o)return{sessionId:t.sessionId,prompts:Jn(e),updated:!1};let i=t.prompt===void 0?o.prompt:cDe(t.prompt).trim();if(!i)throw Error("prompt cannot be empty");let s=t.delivery??o.delivery,a={...o,prompt:i,mode:t.mode??o.mode,delivery:s};return e.pendingPrompts.splice(r,1),pDe(e,a,r,o.delivery),{sessionId:t.sessionId,prompts:Jn(e),prompt:Av(a),updated:!0}}delete(e,t){if(!e)return{sessionId:t.sessionId,prompts:[],removed:!1};let n=t.promptId.trim(),r=e.pendingPrompts.findIndex((i)=>i.id===n);if(r<0)return{sessionId:t.sessionId,prompts:Jn(e),removed:!1};let[o]=e.pendingPrompts.splice(r,1);return{sessionId:t.sessionId,prompts:Jn(e),prompt:o?Av(o):void 0,removed:!0}}enqueue(e,t){let{prompt:n,mode:r,delivery:o,userImages:i,userFiles:s,origin:a,noteKind:d,refresh:l}=t;if(a==="harness"&&d){let u=e.pendingPrompts.find((h)=>h.origin==="harness"&&h.noteKind===d);if(u)return u.prompt=d==="recap"?KW(u.prompt,n):n,u.refresh=l,Jn(e)}let c=e.pendingPrompts.findIndex((u)=>u.prompt===n);if(c>=0){let[u]=e.pendingPrompts.splice(c,1),h={...u,prompt:n,mode:r??u.mode,userImages:i??u.userImages,userFiles:s??u.userFiles};if(o==="steer"||u.delivery==="steer")e.pendingPrompts.unshift({...h,delivery:"steer"});else e.pendingPrompts.push(h)}else{let u={id:`pending_${Date.now()}_${uDe(5)}`,prompt:n,mode:r,delivery:o,userImages:i,userFiles:s,...a==="harness"?{origin:a}:{},...a==="harness"&&d?{noteKind:d}:{},...a==="harness"&&l?{refresh:l}:{}};if(o==="steer")e.pendingPrompts.unshift(u);else e.pendingPrompts.push(u)}return Jn(e)}consumeSteer(e){for(;;){let t=e.pendingPrompts.findIndex((r)=>r.delivery==="steer");if(t<0)return{prompts:Jn(e)};let[n]=e.pendingPrompts.splice(t,1);if(n&&kV(n))return{entry:n,prompts:Jn(e)}}}shiftNext(e){for(;;){let t=e.pendingPrompts.shift();if(!t||kV(t))return{entry:t,prompts:Jn(e)}}}requeueFront(e,t){return e.pendingPrompts.unshift(t),Jn(e)}clear(e){return e.pendingPrompts.length=0,[]}dropHarnessNotes(e){let t=e.pendingPrompts.length,n=e.pendingPrompts.filter((r)=>r.origin!=="harness");return e.pendingPrompts.length=0,e.pendingPrompts.push(...n),t-n.length}}class JC{deps;service=new TV;constructor(e){this.deps=e}list(e){return this.service.list(this.deps.getSession(e))}steerFirst(e){let t=this.deps.getSession(e),n=t?.pendingPrompts[0];if(!n||n.delivery==="steer")return{sessionId:e,prompts:this.service.list(t),updated:!1};return this.update({sessionId:e,promptId:n.id,delivery:"steer"})}update(e){let t=this.deps.getSession(e.sessionId);if(!t)return{sessionId:e.sessionId,prompts:[],updated:!1};let n=this.service.update(t,e);if(this.emitPrompts(t),n.updated&&n.prompt?.delivery==="steer"&&!t.aborting)t.agent.notifyPendingUserMessage();return this.scheduleDrain(e.sessionId,t),n}delete(e){let t=this.deps.getSession(e.sessionId);if(!t)return{sessionId:e.sessionId,prompts:[],removed:!1};let n=this.service.delete(t,e);return this.emitPrompts(t),this.scheduleDrain(e.sessionId,t),n}enqueue(e,t){let n=this.deps.getSession(e);if(!n)return;if(this.service.enqueue(n,t),this.emitPrompts(n),t.delivery==="steer"&&!n.aborting)n.agent.notifyPendingUserMessage();this.scheduleDrain(e,n)}consumeSteer(e){let t=this.deps.getSession(e);if(!t)return;let n=t.pendingPrompts.length,{entry:r}=this.service.consumeSteer(t);if(!r){if(t.pendingPrompts.length!==n)this.emitPrompts(t);return}return this.emitPrompts(t),this.emitSubmitted(t,r),r}discardQueue(e){if(e.pendingPrompts.length===0)return;this.service.clear(e),this.emitPrompts(e)}dropHarnessNotes(e){if(this.service.dropHarnessNotes(e)>0)this.emitPrompts(e)}emitPrompts(e){this.deps.emit({type:"pending_prompts",payload:{sessionId:e.sessionId,prompts:Jn(e)}})}scheduleDrain(e,t){if(t.pendingPrompts.length===0||t.aborting||t.drainingPendingPrompts||!t.agent.canStartRun())return;queueMicrotask(()=>{this.drain(e)})}async drain(e){let t=this.deps.getSession(e);if(!t)return;if(t.aborting||t.drainingPendingPrompts)return;if(!t.agent.canStartRun())return;let n=t.pendingPrompts.length,{entry:r}=this.service.shiftNext(t);if(!r){if(t.pendingPrompts.length!==n)this.emitPrompts(t);return}this.emitPrompts(t),this.emitSubmitted(t,r),t.drainingPendingPrompts=!0;let o=!0;try{let i=await this.deps.send({sessionId:e,prompt:r.prompt,...r.mode?{mode:r.mode}:{},userImages:r.userImages,userFiles:r.userFiles});if(hDe(i))o=!1}catch{o=!1,this.service.requeueFront(t,r),this.emitPrompts(t)}finally{if(t.drainingPendingPrompts=!1,o&&t.pendingPrompts.length>0&&t.status!=="failed"&&t.status!=="cancelled")queueMicrotask(()=>{this.drain(e)})}}emitSubmitted(e,t){let n=Av(t);this.deps.emit({type:"pending_prompt_submitted",payload:{sessionId:e.sessionId,id:n.id,prompt:n.prompt,delivery:n.delivery,attachmentCount:n.attachmentCount,userImages:n.userImages,userFiles:n.userFiles,...n.origin?{origin:n.origin}:{}}})}}function kV(e){if(!e.refresh)return!0;let t;try{t=e.refresh()}catch{return!0}if(t===void 0||t.trim()==="")return!1;return e.prompt=t,!0}function hDe(e){return typeof e==="object"&&e!==null&&"finishReason"in e&&e.finishReason==="error"}function Av(e){return{id:e.id,prompt:e.prompt,delivery:e.delivery,attachmentCount:(e.userImages?.length??0)+(e.userFiles?.length??0),userImages:e.userImages,userFiles:e.userFiles,...e.origin==="harness"?{origin:e.origin}:{}}}function Jn(e){return e.pendingPrompts.map(Av)}function pDe(e,t,n,r){if(t.delivery==="steer")e.pendingPrompts.unshift(t);else if(r==="steer")e.pendingPrompts.push(t);else e.pendingPrompts.splice(n,0,t)}import{formatDisplayUserInput as Bpt,normalizeUserInput as Hpt}from"@cerebriline/shared";import{resolveSessionDataDir as jpt}from"@cerebriline/shared/storage";import{existsSync as QC}from"node:fs";import{readFile as mDe}from"node:fs/promises";import{join as fDe}from"node:path";class ZC{listeners=new Set;subscribe(e,t){let n={listener:e,sessionId:t?.sessionId?.trim()||void 0};return this.listeners.add(n),()=>{this.listeners.delete(n)}}emit(e){let t=e.payload.sessionId?.trim();for(let n of this.listeners){if(n.sessionId&&n.sessionId!==t)continue;n.listener(e)}}get size(){return this.listeners.size}}function SV(e,t,n){let r=e?.trim();if(r&&QC(r))return r;let o=n?.trim();if(o){let i=fDe(o,t,`${t}.messages.json`);if(QC(i))return i}return r||void 0}async function Uc(e){let t=e?.trim();if(!t||!QC(t))return[];try{let n=(await mDe(t,"utf8")).trim();if(!n)return[];let r=JSON.parse(n);if(Array.isArray(r))return r;if(r&&typeof r==="object"&&!Array.isArray(r)){let o=r.messages;if(Array.isArray(o))return o}return[]}catch{return[]}}function eP(e){return e?{...e}:void 0}async function xV(e,t){if(!(e.hookName==="tool_call"||!!e.parent_agent_id))return;await t.queueSpawnRequest(e);let r=await t.upsertSubagentSessionFromHook(e);if(!r)return;await t.appendSubagentHookAudit(r,e),await t.applySubagentStatus(r,e)}function _V(e){let t=Ca(e.session_id)?.rootSessionId??mc(e.session_id)?.rootSessionId;return{sessionId:e.session_id,source:e.source,pid:e.pid,startedAt:e.started_at,endedAt:e.ended_at??null,exitCode:e.exit_code??null,status:e.status,interactive:e.interactive,provider:e.provider,model:e.model,cwd:e.cwd,workspaceRoot:e.workspace_root,teamName:e.team_name,enableTools:e.enable_tools,enableSpawn:e.enable_spawn,enableTeams:e.enable_teams,isSubagent:t!==void 0,...t!==void 0?{parentSessionId:t}:{},prompt:e.prompt,metadata:e.metadata,messagesPath:e.messages_path,updatedAt:e.ended_at??e.started_at}}class Rv{deps;constructor(e){this.deps=e}lastKnownIdentityBySession=new Map;static MAX_IDENTITY_SNAPSHOTS=512;dispatchAgentEvent(e,t,n){let r=this.deps.getSession(e),o={sessionId:e,config:t,liveSession:r,usageBySession:this.deps.usageBySession,aggregateUsageBySession:this.deps.aggregateUsageBySession,persistMessages:this.deps.persistMessages,emit:this.deps.emit},i=CR(n);if(!!r&&(!i.agentId||i.agentId===tP(r.agent))){let a={agentId:tP(r.agent),conversationId:r.agent.getConversationId(),...r?.runtime.teamRuntime?{teamRole:"lead"}:{}};this.rememberSessionIdentity(e,a),pb(o,n,{...a,isPrimaryAgentEvent:!0});return}pb(o,n,{...r?{}:this.lastKnownIdentityBySession.get(e),isPrimaryAgentEvent:!1})}rememberSessionIdentity(e,t){if(this.lastKnownIdentityBySession.delete(e),this.lastKnownIdentityBySession.set(e,t),this.lastKnownIdentityBySession.size>Rv.MAX_IDENTITY_SNAPSHOTS){let n=this.lastKnownIdentityBySession.keys().next().value;if(n!==void 0)this.lastKnownIdentityBySession.delete(n)}}async handleTeamEvent(e,t){let n=this.deps.getSession(e);if(n){if(WI(n,t),t.type==="agent_event"){let r={sessionId:e,config:n.config,liveSession:n,usageBySession:this.deps.usageBySession,aggregateUsageBySession:this.deps.aggregateUsageBySession,persistMessages:this.deps.persistMessages,emit:this.deps.emit};pb(r,t.event,{agentId:t.agentId,teamRole:"teammate",teamAgentId:t.agentId,isPrimaryAgentEvent:!1})}if(t.type==="teammate_spawned"){let r=ui({agentId:t.teammate.runtimeAgentId??t.agentId,conversationId:t.teammate.conversationId,parentAgentId:t.teammate.parentAgentId,createdByAgentId:tP(n.agent),teamId:n.runtime.teamRuntime?.getTeamId(),teamName:n.runtime.teamRuntime?.getTeamName(),teamRole:"teammate",teamAgentId:t.agentId});if(r)ld(n.config.telemetry,{ulid:e,modelId:t.teammate.modelId??n.config.modelId,provider:n.config.providerId,...r})}}if(await jI(e,t,this.deps.invokeBackendOptional),n&&(t.type!=="agent_event"||t.activityChanged===!0))qI(n,e,t,this.deps.emit)}async handlePluginEvent(e,t,n,r){if(t.name==="plugin_log"){this.handlePluginLog(e,t.payload);return}if(t.name==="plugin_telemetry"){this.handlePluginTelemetry(e,t.payload,r);return}if(t.name==="automation_event"){let l=this.deps.getSession(e)?.config.extensionContext?.automation??n;if(!l)return;let c=t.payload&&typeof t.payload==="object"?t.payload:void 0;if(!c)return;await l.ingestEvent(c);return}if(t.name!=="steer_message"&&t.name!=="queue_message"&&t.name!=="pending_prompt")return;let o=t.payload&&typeof t.payload==="object"?t.payload:void 0,i=typeof o?.sessionId==="string"&&o.sessionId.trim().length>0?o.sessionId.trim():e,s=typeof o?.prompt==="string"?o.prompt.trim():"";if(!s)return;let a=t.name==="steer_message"?"steer":t.name==="queue_message"?"queue":o?.delivery==="steer"?"steer":"queue";this.deps.enqueuePendingPrompt(i,{prompt:s,delivery:a})}handlePluginTelemetry(e,t,n){let o=this.deps.getSession(e)?.config.telemetry??n;if(!o||!t||typeof t!=="object")return;let i=t,s=typeof i.pluginName==="string"&&i.pluginName?i.pluginName:"unknown";if(i.kind==="event"){let a=typeof i.event==="string"?i.event.trim():"";if(!a)return;let d={...i.properties&&typeof i.properties==="object"?i.properties:{},plugin_name:s,session_id:e};if(i.required===!0)o.captureRequired(`plugin.${a}`,d);else o.capture({event:`plugin.${a}`,properties:d});return}if(i.kind==="metric"){let a=typeof i.name==="string"?i.name.trim():"",d=typeof i.value==="number"?i.value:NaN;if(!a||Number.isNaN(d))return;let l={...i.attributes&&typeof i.attributes==="object"?i.attributes:{},plugin_name:s},c=typeof i.description==="string"?i.description:void 0,u=i.required===!0,h=`plugin.${a}`;if(i.metric==="counter")o.recordCounter(h,d,l,c,u);else if(i.metric==="histogram")o.recordHistogram(h,d,l,c,u);else if(i.metric==="gauge")o.recordGauge(h,d,l,c,u)}}handlePluginLog(e,t,n){let r=this.deps.getSession(e),o=n??r?.config.extensionContext?.logger??r?.config.logger;if(!o||!t||typeof t!=="object")return;let i=t,s=typeof i.message==="string"?i.message:"";if(!s)return;let a=i.metadata&&typeof i.metadata==="object"?{...i.metadata}:{};if(a.sessionId??=e,typeof i.pluginName==="string"&&i.pluginName)a.pluginName=i.pluginName;if(i.level==="debug"){o.debug(s,a);return}if(i.level==="error"){if(o.error)o.error(s,a);else o.log(s,{...a,severity:"error"});return}o.log(s,a)}}function tP(e){return e.getAgentId()}function nP(e){return{sessionId:e.sessionId,source:e.source,pid:process.pid,startedAt:e.startedAt,endedAt:e.endedAt??null,exitCode:e.exitCode??null,status:e.status,interactive:e.interactive,provider:e.config.providerId,model:e.config.modelId,cwd:e.config.cwd,workspaceRoot:hi(e.config),teamName:e.config.teamName?.trim()||void 0,enableTools:e.config.enableTools,enableSpawn:e.config.enableSpawnAgent,enableTeams:e.config.enableAgentTeams,parentSessionId:typeof e.sessionMetadata?.parentSessionId==="string"?e.sessionMetadata.parentSessionId:void 0,parentAgentId:typeof e.sessionMetadata?.parentAgentId==="string"?e.sessionMetadata.parentAgentId:void 0,agentId:typeof e.sessionMetadata?.agentId==="string"?e.sessionMetadata.agentId:void 0,conversationId:typeof e.sessionMetadata?.conversationId==="string"?e.sessionMetadata.conversationId:void 0,isSubagent:typeof e.sessionMetadata?.isSubagent==="boolean"?e.sessionMetadata.isSubagent:!1,prompt:e.pendingPrompt,metadata:e.sessionMetadata,messagesPath:e.artifacts?.messagesPath,updatedAt:e.updatedAt??e.endedAt??e.startedAt}}function rP(e,t){let n=e[t];return typeof n==="function"?n:null}async function EV(e,t,...n){let r=rP(e,t);if(!r)throw Error(`session service method not available: ${t}`);return Promise.resolve(r.apply(e,n))}async function AV(e,t,...n){let r=rP(e,t);if(!r)return;await Promise.resolve(r.apply(e,n))}async function RV(e,t,...n){let r=rP(e,t);if(!r)return;return await Promise.resolve(r.apply(e,n))}import{clearPolykvSession as Iv,releasePolykvAgent as oP,setPolykvSession as gDe}from"@cerebriline/llms";function CV(e,t,n){let r=n?{extractDocument:n}:{};if(!e)return{executors:t,enableBash:!1,...n?{executorOptions:r}:{}};let o=wv(t?.semanticSearch,e.executorOptions.overlay);return{executorOptions:{...e.executorOptions,...r},...o?{executors:{semanticSearch:o}}:{},...e.allowCommands?{}:{enableBash:!1}}}function Cv(e,t,n){return{onSubAgentEvent:(r)=>e.onAgentEvent(n,t,r),onSubAgentStart:(r)=>{let o=e.getSession(n)?.runtime.teamRuntime;e.subAgentStarts.set(r.subAgentId,{startedAt:Date.now(),rootSessionId:n});let i=ui({agentId:r.subAgentId,conversationId:r.conversationId,parentAgentId:r.parentAgentId,teamId:o?.getTeamId(),teamName:o?.getTeamName(),createdByAgentId:r.parentAgentId});if(i)ld(t.telemetry,{ulid:n,modelId:t.modelId,provider:t.providerId,...i});vk(t.telemetry,{event:"started",ulid:n,durationMs:0,parentId:r.parentAgentId,agentId:r.subAgentId,...i}),e.invokeBackendOptional("handleSubAgentStart",n,r)},onSubAgentEnd:async(r)=>{let o=e.getSession(n)?.runtime.teamRuntime,i=e.subAgentStarts.get(r.subAgentId),s=i?Date.now()-i.startedAt:0,a=r.result?.text?r.result.text.split(`
1463
1463
  `).length:0;if(vk(t.telemetry,{event:"ended",ulid:n,durationMs:s,outputLines:a,errorMessage:r.error?String(r.error):void 0,agentId:r.subAgentId,parentId:r.parentAgentId,...ui({agentId:r.subAgentId,conversationId:r.conversationId,parentAgentId:r.parentAgentId,teamId:o?.getTeamId(),teamName:o?.getTeamName(),createdByAgentId:r.parentAgentId})}),e.subAgentStarts.delete(r.subAgentId),r.toolCallId&&e.sandboxes?.has(r.toolCallId)){let d=r.input.name??"agent",l=await e.sandboxes.close(r.toolCallId,d);yDe(r,d,l)}e.invokeBackendOptional("handleSubAgentEnd",n,r)},onSubAgentSettled:async(r)=>{if(r.toolCallId)await e.sandboxes?.close(r.toolCallId,r.name)}}}function yDe(e,t,n){if(!e.result||typeof e.result.text!=="string")return;e.result.text+=Ia(e.result.text,e.result.finishReason,t,n)}function iP(e,t,n,r,o){let i=Cv(e,t,n),s=async(a,d)=>{let l=d?.toolCallId,c=e.sandboxes&&l&&t.enableTools?await e.sandboxes.open(l):void 0,u=t.enableTools?sm(dp({cwd:t.cwd,telemetry:t.telemetry,...go[yo({mode:t.mode})],enableExtractDocument:t.enableExtractDocument===!0&&go[yo({mode:t.mode})].enableExtractDocument,...CV(c,r,oa(t))}),t.extraTools):[];if(t.enableSpawnAgent)u.push(iP(e,t,n,r));return Ji(u)};return sc({...o?{sessionId:n}:{},...o?.swarm?{swarm:o.swarm}:{},...o?.teammates?{teammates:!0}:{},...o?.configuredAgents?{configuredAgents:o.configuredAgents}:{},...o?.configuredAgentConfigs?{configuredAgentConfigs:o.configuredAgentConfigs}:{},configProvider:{getRuntimeConfig:()=>e.getSession(n)?.runtime.delegatedAgentConfigProvider?.getRuntimeConfig()??{providerId:t.providerId,modelId:t.modelId,cwd:t.cwd,apiKey:t.apiKey,baseUrl:t.baseUrl,headers:t.headers,providerConfig:t.providerConfig,knownModels:t.knownModels,thinking:t.thinking,maxIterations:t.maxIterations,hooks:t.hooks,extensions:t.extensions,logger:t.logger,telemetry:t.telemetry},getConnectionConfig:()=>e.getSession(n)?.runtime.delegatedAgentConfigProvider?.getConnectionConfig()??{providerId:t.providerId,modelId:t.modelId,apiKey:t.apiKey,baseUrl:t.baseUrl,headers:t.headers,providerConfig:t.providerConfig,knownModels:t.knownModels,thinking:t.thinking},updateConnectionDefaults:()=>{}},createSubAgentTools:s,commandSandboxFor:(a)=>ab(e.sandboxes,a),...i})}function wDe(e,t){if(e&&typeof e==="object")e.handback=t}function IV(e,t){let n=t&&typeof t==="object"?t.handback:void 0;if(n)e?.handedBack("reducer",n)}function PV(e,t,n,r){let o=Cv(e,t,n),i={providerId:t.providerId,...t.baseUrl!==void 0?{baseUrl:t.baseUrl}:{},...t.headers!==void 0?{headers:t.headers}:{},...t.providerConfig?.polykv!==void 0?{polykv:t.providerConfig.polykv}:{}},s=()=>e.getSession(n)?.runtime.delegatedAgentConfigProvider??{getRuntimeConfig:()=>({providerId:t.providerId,modelId:t.modelId,cwd:t.cwd,apiKey:t.apiKey,baseUrl:t.baseUrl,headers:t.headers,providerConfig:t.providerConfig,knownModels:t.knownModels,thinking:t.thinking,maxIterations:t.maxIterations,hooks:t.hooks,extensions:t.extensions,logger:t.logger,telemetry:t.telemetry}),getConnectionConfig:()=>({providerId:t.providerId,modelId:t.modelId,apiKey:t.apiKey,baseUrl:t.baseUrl,headers:t.headers,providerConfig:t.providerConfig,knownModels:t.knownModels,thinking:t.thinking}),updateConnectionDefaults:()=>{}},a=(u,h)=>({...u,getRuntimeConfig:()=>({...u.getRuntimeConfig(),sessionId:h})}),d,l=(u,h)=>u.providerId===h.providerId&&u.baseUrl===h.baseUrl,c=async(u)=>{let h=u.control,p=()=>h?.signal??u.signal,f=s(),m=`${n}:swarm:${u.name}:${Date.now().toString(36)}`,g=`${m}:${Math.random().toString(36).slice(2,8)}`,y=e.sandboxes&&t.enableTools?await e.sandboxes.open(g):void 0,w=t.enableTools?Ji(sm(dp({cwd:t.cwd,telemetry:t.telemetry,...go[yo({mode:t.mode})],enableExtractDocument:t.enableExtractDocument===!0&&go[yo({mode:t.mode})].enableExtractDocument,...CV(y,r,oa(t))}),t.extraTools)).filter((B)=>u.tools===void 0||u.tools.includes(B.name)):[],k=fa(u.emitUpdate,(B)=>o.onSubAgentEvent?.(B),Date.now,{onCompaction:Vl(`swarm worker ${u.name}`,t.logger),...h?.id?{outputId:h.id}:{}}),b=Hl(Fl({sessionId:n,name:u.name,...t.logger?.log?{logger:{log:(B)=>t.logger?.log?.(B)}}:{}}),u.emitUpdate,h),v=Kl(m,u.emitUpdate,t.logger,(B)=>b.waiting($l(B))),E=u.maxIterations??t.maxIterations,S=u.check?TR(y):void 0,x=u.check?`${u.task}
1464
1464
 
1465
1465
  ${Hi(u.check,S!==void 0)}`:u.task,T=Gi(),A,R,C=Mr(u.sampling),L,N=async(B,j,K,z,M)=>{let X=l(f.getRuntimeConfig(),B.getRuntimeConfig());Iv(m);let oe=Boolean(u.poolId&&X),H=B.getConnectionConfig();Wl(u.emitUpdate,{providerId:H.providerId,modelId:H.modelId,knownModels:H.knownModels,maxIterations:t.maxIterations});let J=!oe&&$o({providerId:H.providerId,baseUrl:H.baseUrl,polykv:H.providerConfig?.polykv}),he=await rp({instructions:u.systemPrompt,task:qi(x,h?.instructions),pooled:J,cwd:B.getRuntimeConfig().cwd});if(await es(C,H),oe&&u.poolId)gDe(m,{poolId:u.poolId,prefixTokens:0,layout:"borrowed"});let se=cA({...lA(E),...t.compaction?.cappedThinkingBudgetMessage?{thinkingBudgetMessage:t.compaction.cappedThinkingBudgetMessage}:{},onTransition:(_,F)=>t.logger?.log?.(`[swarm] ${u.name}: worker ${_} (${F})`)}),re=u.check?Wi({check:u.check,cwd:e.sandboxes?.workspaceRoot??t.cwd,...S?{wrapSpawn:S}:{}}):void 0,Ke=ii({kind:"subagent",struggle:se,...re?{check:re}:{},...u.takeMessage||h?{consumePendingUserMessage:async()=>(h?.takeMessage??u.takeMessage)?.()}:{},prompt:he.systemPrompt,engineSessionId:m,...J?{polykvWorker:{group:n,layers:he.layers}}:{},pinnedHead:he.pinnedHead,configProvider:a(B,m),...C?{sampling:C,onSampling:(_)=>{L=_,jl(u.emitUpdate,_)}}:{},tools:w,maxIterations:E,parentAgentId:n,...p()?{abortSignal:p()}:{},onEvent:(_)=>{if(Yl(_))j(),b.progressed();k.observe(_)},recoverTurnFault:K??ur({label:`swarm worker ${u.name}`,onWaiting:b.waiting,baseUrl:()=>H.baseUrl,headers:()=>H.headers,...p()?{signal:p()}:{},...u.emitUpdate?{emitUpdate:u.emitUpdate}:{},...t.logger?.log?{logger:{log:(_)=>t.logger?.log?.(_)}}:{}})});R=Ke.getAgentId?.(),h?.track(Ke);let I=await Ki({agent:Ke,start:async()=>{if(z&&z.messages.length>0)return Ke.restore(z.messages),await Ke.continue(op(z.reason));return he.pinnedHead.length>0?await Ke.runWithHead(he.pinnedHead,he.task):await Ke.run(he.task)},name:u.name,supervisor:se,...E!==void 0?{maxIterations:E}:{},sessionId:n,...h?.id?{cancelId:h.id}:{},...p()?{signal:p()}:{},...u.emitUpdate?{emitUpdate:u.emitUpdate}:{},...re?{check:re}:{},releaseEngineSession:async()=>{Iv(m),await oP(m)},lifetime:T,resumeThrough:Jl({...M&&f.getRuntimeConfig().nodePlacement?{placement:f.getRuntimeConfig().nodePlacement,nodeId:M}:{},...!M&&f.getRuntimeConfig().slotGate?{slotGate:f.getRuntimeConfig().slotGate}:{},signal:p})});return A=I,I.result},W=(B)=>({...B,...R?{agentId:R}:{},...A?.maxIterations!==void 0?{maxIterations:A.maxIterations}:{},...A?.stopReason?{stopReason:A.stopReason}:{},...A?.state?{state:A.state}:{},...A?.oracle?{oracle:A.oracle}:{}}),D,G,V=(B)=>h?h.continuable(B,async(j)=>{Iv(m),await Gl(u.emitUpdate,m,j.reason)}):B(void 0);try{let B=f.getRuntimeConfig().nodePlacement;if(B){let z=await V((M)=>Xl({placement:B,...p()?{signal:p()}:{},...u.emitUpdate?{emitUpdate:u.emitUpdate}:{},...t.logger?{logger:t.logger}:{},label:`swarm worker ${u.name}`,onWaiting:b.waiting,...h?{relocate:(X,oe)=>h.requeue({reason:oe,avoidNodeId:X})}:{},...M?{requeued:M.avoidNodeId?{avoidNodeId:M.avoidNodeId}:{}}:{},run:(X,oe,H)=>N(X.configProvider,oe,H,M,X.nodeId),beforeRetry:async()=>{await oP(m)}}));return D=W({...z.result,placed:z.placed,...L?{sampling:L}:{}}),D}let j=f.getRuntimeConfig().slotGate,K=(z,M)=>HI(()=>N(f,M,void 0,z),{onRetry:(X,oe)=>t.logger?.log?.(`[PolyKV] ${u.name} refused: the session's window is full; waiting ${oe/1000}s for a worker to finish (attempt ${X})`)});if(D=W(await V((z)=>{let M=(X)=>(u.emitUpdate?.({queued:!1}),K(z,X));return j?j.run(M):M(()=>{})})),L)D={...D,sampling:L};return D}catch(B){throw G=B,B}finally{await T.end(async()=>{if(y){let j=await e.sandboxes?.close(g,u.name).catch(()=>[]);wDe(D??G,j??[])}Iv(m),v(),b.dispose();let B=await oP(m).catch(()=>{return});ql(t.logger?.log?(j)=>t.logger?.log?.(j):void 0,B,"[PolyKV]")})}};return ip({sessionId:n,pools:{snapshot:async()=>{let u=await iL({sessionId:n,providerConfig:i,logger:t.logger});if(!u)return;return{poolId:u.poolId,release:u.borrowed?async()=>{return}:()=>sL({poolId:u.poolId,providerConfig:i,logger:t.logger})}},headroom:async()=>bv(await Sd({sessionId:n,providerConfig:i,logger:t.logger}))?.headroomSessions,admit:async()=>{let u=s().getRuntimeConfig();if(u.nodePlacement)return u.nodePlacement.waiting===0;let h=u.slotGate;return h?await h.canAdmitMore():!0}},reduce:async(u,h)=>{if(!d)return;let p;try{p=await c({name:"reducer",systemPrompt:XA,task:u.map(qw).join(`
@@ -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 R$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 I$e(e){return e.mode==="plan"?"plan":e.mode==="yolo"?"yolo":"act"}function XV(e={}){let t=async(r)=>r,n=new um({sessionService:new fm(new mm),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:Kt.CORE,mode:"automation",sessionMetadata:Kn(o?.sessionMetadata,{mode:"automation",trigger:r.source}),interactive:!1,config:{providerId:A$e(r.provider),modelId:r.model,apiKey:r.apiKey?.trim()||void 0,cwd:i,workspaceRoot:r.workspaceRoot,systemPrompt:r.systemPrompt??"",mode:I$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:R$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 C$e,CLINE_HUB_PORT as P$e,resolveClineBuildEnv as M$e}from"@cerebriline/shared";var O$e="CLINE_HUB_HOST",L$e="CLINE_HUB_PORT",N$e="CLINE_HUB_PATHNAME",D$e="127.0.0.1",$$e=P$e,F$e="/hub";function JV(e){return M$e(e)==="development"?C$e:$$e}function U$e(e={}){return(e.env??process.env)[O$e]?.trim()||D$e}function gP(e={}){let n=(e.env??process.env)[L$e]?.trim();if(!n)return JV(e);let r=Number.parseInt(n,10);if(!Number.isInteger(r)||r<1||r>65535)return JV(e);return r}function B$e(e={}){return(e.env??process.env)[N$e]?.trim()||F$e}function yP(e={},t={}){return{host:e.host??U$e(t),port:e.port??gP(t),pathname:e.pathname??B$e(t)}}import{chmodSync as H$e,existsSync as W$e,mkdirSync as j$e}from"node:fs";import{dirname as q$e}from"node:path";import{loadSqliteDb as z$e}from"@cerebriline/shared/db";var QV=3;class ZV 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 gm(e){return e instanceof Error&&e.name==="HubLockHeldError"}function e5(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{j$e(q$e(e),{recursive:!0}),t=W$e(e),n=z$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?.(),G$e(r))throw new ZV(e);return new Hc(e,void 0)}if(!t)try{H$e(e,384)}catch{}return new Hc(e,n)}}function G$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 lFe}from"node:path";import{createHash as K$e,randomBytes as o5}from"node:crypto";import{mkdir as bP,open as t5,readFile as i5,rename as V$e,rm as vP,writeFile as Y$e}from"node:fs/promises";import{dirname as s5,join as kP}from"node:path";import{ensureLoopbackProxyBypass as X$e,isHubProtocolCompatible as Tyt}from"@cerebriline/shared";import{resolveClineDataDir as Ov,resolveClineDir as xyt}from"@cerebriline/shared/storage";var J$e="CLINE_HUB_DISCOVERY_PATH",Q$e="CLINE_HUB_BUILD_ID",Z$e="CLINE_HUB_BUILD_EPOCH_MS",eFe=30000,tFe=15000,n5=100;function nFe(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function rFe(e){return K$e("sha256").update(e).digest("hex").slice(0,12)}function oFe(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 a5(){return o5(32).toString("hex")}function r5(e){return new Promise((t)=>setTimeout(t,e))}function iFe(e){return`${e}.lock`}async function sFe(e){try{let t=JSON.parse(await i5(kP(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 wP(e){await vP(e,{recursive:!0,force:!0}).catch(()=>{return})}function ym(){let e=process.env[Q$e]?.trim();if(e)return e;return"sdk-v1-53775de0d2fd28896f283d6a0b352b1849403c4306c8f9e8a4a256efd67e5186".trim()||`source-${String(nc.version)}`}function d5(){let e=Number(process.env[Z$e]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1793571532443)?1793571532443:void 0}function Lv(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${rFe(e)}`,n=process.env[J$e]?.trim()||kP(Ov(),"locks","hub","owners",`${nFe(t)}.json`);return{ownerId:t,discoveryPath:n}}async function Nv(e){try{let t=JSON.parse(await i5(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 TP(e,t,n){await c5(e,async()=>{let r=s5(e);await bP(r,{recursive:!0});let o=`${e}.${process.pid}.${o5(6).toString("hex")}.tmp`,i;try{i=await t5(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 R$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 I$e(e){return e.mode==="plan"?"plan":e.mode==="yolo"?"yolo":"act"}function XV(e={}){let t=async(r)=>r,n=new um({sessionService:new fm(new mm),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:Kt.CORE,mode:"automation",sessionMetadata:Kn(o?.sessionMetadata,{mode:"automation",trigger:r.source}),interactive:!1,config:{providerId:A$e(r.provider),modelId:r.model,apiKey:r.apiKey?.trim()||void 0,cwd:i,workspaceRoot:r.workspaceRoot,systemPrompt:r.systemPrompt??"",mode:I$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:R$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 C$e,CLINE_HUB_PORT as P$e,resolveClineBuildEnv as M$e}from"@cerebriline/shared";var O$e="CLINE_HUB_HOST",L$e="CLINE_HUB_PORT",N$e="CLINE_HUB_PATHNAME",D$e="127.0.0.1",$$e=P$e,F$e="/hub";function JV(e){return M$e(e)==="development"?C$e:$$e}function U$e(e={}){return(e.env??process.env)[O$e]?.trim()||D$e}function gP(e={}){let n=(e.env??process.env)[L$e]?.trim();if(!n)return JV(e);let r=Number.parseInt(n,10);if(!Number.isInteger(r)||r<1||r>65535)return JV(e);return r}function B$e(e={}){return(e.env??process.env)[N$e]?.trim()||F$e}function yP(e={},t={}){return{host:e.host??U$e(t),port:e.port??gP(t),pathname:e.pathname??B$e(t)}}import{chmodSync as H$e,existsSync as W$e,mkdirSync as j$e}from"node:fs";import{dirname as q$e}from"node:path";import{loadSqliteDb as z$e}from"@cerebriline/shared/db";var QV=3;class ZV 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 gm(e){return e instanceof Error&&e.name==="HubLockHeldError"}function e5(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{j$e(q$e(e),{recursive:!0}),t=W$e(e),n=z$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?.(),G$e(r))throw new ZV(e);return new Hc(e,void 0)}if(!t)try{H$e(e,384)}catch{}return new Hc(e,n)}}function G$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 lFe}from"node:path";import{createHash as K$e,randomBytes as o5}from"node:crypto";import{mkdir as bP,open as t5,readFile as i5,rename as V$e,rm as vP,writeFile as Y$e}from"node:fs/promises";import{dirname as s5,join as kP}from"node:path";import{ensureLoopbackProxyBypass as X$e,isHubProtocolCompatible as xyt}from"@cerebriline/shared";import{resolveClineDataDir as Ov,resolveClineDir as Eyt}from"@cerebriline/shared/storage";var J$e="CLINE_HUB_DISCOVERY_PATH",Q$e="CLINE_HUB_BUILD_ID",Z$e="CLINE_HUB_BUILD_EPOCH_MS",eFe=30000,tFe=15000,n5=100;function nFe(e){return e.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function rFe(e){return K$e("sha256").update(e).digest("hex").slice(0,12)}function oFe(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 a5(){return o5(32).toString("hex")}function r5(e){return new Promise((t)=>setTimeout(t,e))}function iFe(e){return`${e}.lock`}async function sFe(e){try{let t=JSON.parse(await i5(kP(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 wP(e){await vP(e,{recursive:!0,force:!0}).catch(()=>{return})}function ym(){let e=process.env[Q$e]?.trim();if(e)return e;return"sdk-v1-9bddedd25140e23b59f323e1be32195661b948d1b05998eef4e40b70f7e54c6a".trim()||`source-${String(nc.version)}`}function d5(){let e=Number(process.env[Z$e]);if(Number.isFinite(e)&&e>0)return e;return Number.isFinite(1793814281879)?1793814281879:void 0}function Lv(e=process.argv[1]?.trim()||process.cwd()){let t=`hub-${rFe(e)}`,n=process.env[J$e]?.trim()||kP(Ov(),"locks","hub","owners",`${nFe(t)}.json`);return{ownerId:t,discoveryPath:n}}async function Nv(e){try{let t=JSON.parse(await i5(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 TP(e,t,n){await c5(e,async()=>{let r=s5(e);await bP(r,{recursive:!0});let o=`${e}.${process.pid}.${o5(6).toString("hex")}.tmp`,i;try{i=await t5(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 V$e(o,e);let s;try{s=await t5(r,"r"),await s.sync()}catch{}finally{await s?.close().catch(()=>{return})}}catch(s){throw await i?.close().catch(()=>{return}),await vP(o,{force:!0}).catch(()=>{return}),s}})}async function l5(e,t){return await c5(e,async()=>{if((await Nv(e))?.hubId!==t)return!1;return await vP(e,{force:!0}),!0})}async function aFe(e,t,n){let r=iFe(e);await bP(s5(r),{recursive:!0});let o=Date.now()+tFe;while(!0){try{await bP(r,{recursive:!1})}catch(i){if((i instanceof Error&&"code"in i?String(i.code):"")!=="EEXIST")throw i;let a=await sFe(r);if(!a){if(Date.now()>=o){await wP(r);continue}await r5(n5);continue}let d=Date.now()-Date.parse(a.acquiredAt);if(!oFe(a.pid)||d>eFe){await wP(r);continue}if(Date.now()>=o)throw Error(`Timed out waiting for hub ${t} lock ${r}`);await r5(n5);continue}try{return await Y$e(kP(r,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
1556
1556
  `,"utf8"),await n()}finally{await wP(r)}}}function c5(e,t){return aFe(`${e}.mutation`,"discovery mutation",t)}async function wm(e,t){X$e();try{let n=await fetch(t?.authToken?dFe(e):u5(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 u5(e){let t=new URL(e);return t.protocol=t.protocol==="wss:"?"https:":"http:",t.pathname="/health",t.search="",t.toString()}function dFe(e){let t=new URL(u5(e));return t.pathname="/status",t.toString()}var cFe="shared:cline",uFe="CLINE_HUB_DISCOVERY_PATH",hFe="hub-production";function Dv(e=cFe){return Lv(`${e}@${ym()}`)}function $v(){return{ownerId:hFe,discoveryPath:process.env[uFe]?.trim()||lFe(Ov(),"locks","hub","production.json")}}function pFe(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 h5=120,SP="...";function xP(e){let t=e.trim();if(!t)return"";if(Buffer.byteLength(t,"utf8")<=h5)return t;let n=h5-Buffer.byteLength(SP,"utf8");if(n<=0)return SP;let r="";for(let o of t){if(Buffer.byteLength(r+o,"utf8")>n)break;r+=o}return`${r}${SP}`}async function p5(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?pFe(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:xP(i&&i.length>0?i:a.length>0?a:s),severity:"info"}}import{resolve as FHe}from"node:path";import{CLINE_DEFAULT_MODEL_ID as UHe,captureSdkError as rk,createSessionId as M0,HUB_CLIENT_TOOL_APPROVAL_CAPABILITY as BHe}from"@cerebriline/shared";import{isChatWorkspacePath as HHe}from"@cerebriline/shared/storage";function bm(e){return!!e&&typeof e==="object"&&!Array.isArray(e)}function _P(e){let t=e?.trim();return t?t:void 0}function mFe(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 m5(e,t){return new Date(new Date(e).getTime()+Math.max(0,Math.floor(t))*1000).toISOString()}function f5(e,t){return new Date(new Date(e).getTime()-Math.max(0,Math.floor(t))*1000).toISOString()}function fFe(e,t){if(!e)return t;return new Date(e).getTime()>=new Date(t).getTime()?e:t}function gFe(e,t){let n=e.eventId.trim(),r=e.eventType.trim(),o=e.source.trim(),i=_P(e.subject),s=_P(e.dedupeKey)??`${r}:${o}:${i??n}`;return{eventId:n,eventType:r,source:o,subject:i,occurredAt:mFe(e.occurredAt,t),workspaceRoot:_P(e.workspaceRoot),payload:bm(e.payload)?e.payload:void 0,attributes:bm(e.attributes)?e.attributes:void 0,dedupeKey:s}}function EP(e,t){if(!t)return;let n=t.split("."),r=e;for(let o of n){if(!bm(r))return;r=r[o]}return r}function yFe(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=EP(n,t);if(r!==void 0)return r;if(e.attributes){let o=EP(e.attributes,t);if(o!==void 0)return o}if(e.payload)return EP(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(bm(t)){if(!bm(e))return!1;return Object.entries(t).every(([n,r])=>Fv(e[n],r))}return Object.is(e,t)}function wFe(e,t){if(!t||Object.keys(t).length===0)return!0;return Object.entries(t).every(([n,r])=>Fv(yFe(e,n),r))}class AP{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=gFe(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(!wFe(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=fFe(d.scheduledFor,m5(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:f5(n,i)}))return{reason:"dedupe_window"};let s=e.cooldownSeconds??0;if(s>0&&this.store.hasRecentEventRunForSpec({specId:e.specId,sinceIso:f5(n,s)}))return{reason:"cooldown"};return{run:this.store.enqueueRun({specId:e.specId,specRevision:e.revision,triggerKind:"event",triggerEventId:t.eventId,scheduledFor:o>0?m5(n,o):n}),reason:"dedupe_window"}}}class vm{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 IFe}from"node:path";import{buildClineSystemPrompt as CFe}from"@cerebriline/shared";import{nowIso as v5}from"@cerebriline/shared/db";import{mkdirSync as bFe,writeFileSync as vFe}from"node:fs";import{isAbsolute as kFe,join as y5}from"node:path";import{resolveCronReportsDir as TFe,resolveCronSpecsDir as SFe}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 w5(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,7 +2080,7 @@ ${e.instructions.trim()}
2080
2080
  ${t.length?`WHERE ${t.join(" AND ")}`:""}
2081
2081
  ORDER BY accepted_seq DESC LIMIT ?;`).all(...n).map(Fm)}recoverOnStartup(){let e=this.db.prepare("SELECT * FROM hub_runs WHERE state = 'running' ORDER BY accepted_seq;").all().map(Fm);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(Fm);return this.db.prepare("DELETE FROM hub_runs WHERE ended_at IS NOT NULL AND ended_at < ?;").run(Date.now()-sHe),{interrupted:e.map((n)=>({...n,state:"interrupted"})),requeued:t}}close(){if(this.closed)return;this.closed=!0,this.db.close?.()}}function Fm(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 dHe="hub_draining",lHe=new Set(["session.create","session.restore","session.fork","run.start","session.send_input","run.enqueue"]);function bX(e){return lHe.has(e)}function vX(e){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:dHe,message:"Hub is draining and refuses new mutating work; retry once a hub is serving again.",details:{retryable:!0}}}}class x0{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 $m(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 kX(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 TX(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 SX(e,t){switch(t.type){case"chunk":return;case"agent_event":await cHe(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 hHe(e,t);return;default:return}}async function cHe(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 uHe(e,t)}async function uHe(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 hHe(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 p5(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 IX,parseRuntimeConfigExtensions as CX,ReasoningEffortSchema as SHe}from"@cerebriline/shared";import{HUB_CHECKPOINT_CAPABILITY as ukt,HUB_COMPACTION_CAPABILITY as hkt,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as pkt,HUB_HOOK_CAPABILITY_PREFIX as mkt,HUB_MISTAKE_LIMIT_CAPABILITY as fkt,HUB_REASONING_LOOP_LIMIT_CAPABILITY as gkt,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as ykt,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as wkt,isHubToolExecutorName as pHe}from"@cerebriline/shared";import{HUB_CHECKPOINT_CAPABILITY as _kt,HUB_COMPACTION_CAPABILITY as Ekt,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as Akt,HUB_HOOK_CAPABILITY_PREFIX as Rkt,HUB_MISTAKE_LIMIT_CAPABILITY as Ikt,HUB_REASONING_LOOP_LIMIT_CAPABILITY as Ckt,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as Pkt,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as Mkt}from"@cerebriline/shared";var mHe=["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 fHe(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 E0(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=fHe(o,n);if(a)t.push(a);continue}if(i==="toolExecutor"){let a=o.executor;if(!pHe(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 _X(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 EX(e){return Object.hasOwn(e,"update")?e.update:e}function Um(e){return e.trim().replace(/^\/+/,"").toLowerCase()}function gHe(e){let t=(e??[]).map(Um).filter(Boolean);return t.length>0?new Set(t):void 0}function yHe(e,t,n){if(!n)return!0;let r=Um(e),o=Um(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 _0(e,t){let n=gHe(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)=>yHe(r.id,r.name,n))}function xX(e,t){let n=async(r,o)=>{let i=Um(r),a=_0(e,t).filter((l)=>l.id===i||Um(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 bC(d,o)};return Object.defineProperty(n,"configuredSkills",{get:()=>_0(e,t).map(({skill:r,...o})=>o),enumerable:!0}),n}function wHe(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)=>_0(o,s).some((a)=>!a.disabled),createSkillsExecutor:(s)=>xX(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(xX(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(Fm);return this.db.prepare("DELETE FROM hub_runs WHERE ended_at IS NOT NULL AND ended_at < ?;").run(Date.now()-sHe),{interrupted:e.map((n)=>({...n,state:"interrupted"})),requeued:t}}close(){if(this.closed)return;this.closed=!0,this.db.close?.()}}function Fm(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 dHe="hub_draining",lHe=new Set(["session.create","session.restore","session.fork","run.start","session.send_input","run.enqueue"]);function bX(e){return lHe.has(e)}function vX(e){return{version:e.version,requestId:e.requestId,ok:!1,error:{code:dHe,message:"Hub is draining and refuses new mutating work; retry once a hub is serving again.",details:{retryable:!0}}}}class x0{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 $m(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 kX(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 TX(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 SX(e,t){switch(t.type){case"chunk":return;case"agent_event":await cHe(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 hHe(e,t);return;default:return}}async function cHe(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 uHe(e,t)}async function uHe(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 hHe(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 p5(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 IX,parseRuntimeConfigExtensions as CX,ReasoningEffortSchema as SHe}from"@cerebriline/shared";import{HUB_CHECKPOINT_CAPABILITY as pkt,HUB_COMPACTION_CAPABILITY as mkt,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as fkt,HUB_HOOK_CAPABILITY_PREFIX as gkt,HUB_MISTAKE_LIMIT_CAPABILITY as ykt,HUB_REASONING_LOOP_LIMIT_CAPABILITY as wkt,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as bkt,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as vkt,isHubToolExecutorName as pHe}from"@cerebriline/shared";import{HUB_CHECKPOINT_CAPABILITY as Akt,HUB_COMPACTION_CAPABILITY as Rkt,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as Ikt,HUB_HOOK_CAPABILITY_PREFIX as Ckt,HUB_MISTAKE_LIMIT_CAPABILITY as Pkt,HUB_REASONING_LOOP_LIMIT_CAPABILITY as Mkt,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as Okt,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as Lkt}from"@cerebriline/shared";var mHe=["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 fHe(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 E0(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=fHe(o,n);if(a)t.push(a);continue}if(i==="toolExecutor"){let a=o.executor;if(!pHe(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 _X(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 EX(e){return Object.hasOwn(e,"update")?e.update:e}function Um(e){return e.trim().replace(/^\/+/,"").toLowerCase()}function gHe(e){let t=(e??[]).map(Um).filter(Boolean);return t.length>0?new Set(t):void 0}function yHe(e,t,n){if(!n)return!0;let r=Um(e),o=Um(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 _0(e,t){let n=gHe(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)=>yHe(r.id,r.name,n))}function xX(e,t){let n=async(r,o)=>{let i=Um(r),a=_0(e,t).filter((l)=>l.id===i||Um(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 bC(d,o)};return Object.defineProperty(n,"configuredSkills",{get:()=>_0(e,t).map(({skill:r,...o})=>o),enumerable:!0}),n}function wHe(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)=>_0(o,s).some((a)=>!a.disabled),createSkillsExecutor:(s)=>xX(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(xX(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
2085
  ${c}`:d.instructions}})}})}}function bHe(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:_X(a)},t,a.emitUpdate?(c)=>{a.emitUpdate?.(EX(c))}:void 0))?.result}]);return o.length>0?Object.fromEntries(o):void 0}function vHe(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:_X(s)},t,s.emitUpdate?(d)=>{s.emitUpdate?.(EX(d))}:void 0))?.result}}))}var kHe=new Set(["assistant-text-delta","assistant-reasoning-delta","tool-updated"]);function THe(e,t,n,r){let o=new Map(n.map((s)=>[s.name,s])),i={};for(let s of mHe){let a=o.get(s);if(!a)continue;i[s]=async(d)=>{if(s==="onEvent"&&kHe.has(d.type))return;return(await r(e,a.capabilityName,{context:d},t))?.control}}return Object.keys(i).length>0?i:void 0}function A0(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:bHe(e.sessionId,e.targetClientId,t,e.requestCapability),localRuntime:{...r.length>0?{hooks:THe(e.sessionId,e.targetClientId,r,e.requestCapability)}:{},...n.length>0?{extraTools:vHe(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:wHe(e.sessionId,e.targetClientId,d,e.requestCapability)}:{}}}}var AX="hubCapabilityOwnerClientId";function nd(e,t){let n=e?.[t];return typeof n==="string"&&n.trim()?n.trim():void 0}function PX(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 MX(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 OX(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 LX(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 xHe(e){if(e===null)return null;let t=SHe.safeParse(e);return t.success?t.data:void 0}function _He(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=xHe(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 EHe(e,t){return e.sessionState.get(t)?.createdByClientId}function RX(e){return typeof e==="string"||e===null?e:void 0}function AHe(e){if(!e||!("autoApproveTools"in e)&&!(AX in e))return e;let t={...e};return delete t[AX],delete t.autoApproveTools,t}function NX(e,t){let n=No(e),r=No(n?.["*"]);if(typeof r?.autoApprove==="boolean")return r.autoApprove;return t.autoApproveTools===!0}function DX(e){let t=EHe(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 R0(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=PX(d.clientContext),c=MX(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=NX(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=E0(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():"")||IX(),w=CX(d.configExtensions);ke("info","session.create.runtime_build.begin",{...o,sessionId:y,configExtensionCount:w?.length??0});let k=A0({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:LX([...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}),y0(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 $X(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=PX(l.clientContext),u=MX(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=NX(r.toolPolicies,l);let f=r.modelSelection&&typeof r.modelSelection==="object"?r.modelSelection:{},m=t.clientId?.trim()||"hub-client",g=E0(l.clientContributions),w=(typeof d?.sessionId==="string"?d.sessionId.trim():"")||IX(),k=CX(l.configExtensions),b=A0({sessionId:w,targetClientId:m,contributions:g,sessionConfig:d,requestCapability:e.requestCapability}),E=await new Dp().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:LX([...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 OX(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");y0(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 FX(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}`);eX(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 UX(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 BX(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 HX(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 WX(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=DX({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 jX(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 qX(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 zX(e,t){let n=Rt(t),r=AHe(No(t.payload?.metadata)),o=RX(t.payload?.prompt),i=RX(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 GX(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=_He(o?.updates);return await r.call(e.sessionHost,n,i),ie(t,{sessionId:n,updated:!0})}async function KX(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=DX({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 VX(e,t){let n=Rt(t),r=await OX(e,n);return ie(t,{deleted:r})}async function YX(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 XX(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 JX(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 QX(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 RHe}from"node:path";import{loadSqliteDb as IHe}from"@cerebriline/shared/db";import{resolveDbDataDir as CHe}from"@cerebriline/shared/storage";var PHe=604800000,MHe=200000,OHe=67108864,LHe=16777216;function NHe(e){let t=e?.replace(/[^a-zA-Z0-9_-]/g,"-");return RHe(CHe(),t?`hub-events-${t}.db`:"hub-events.db")}class I0{db;retentionMs;maxRows;maxTotalBytes;appendedBytesSincePrune=0;closed=!1;constructor(e={}){this.db=IHe(e.dbPath??NHe(e.ownerId)),this.retentionMs=e.retentionMs??PHe,this.maxRows=e.maxRows??MHe,this.maxTotalBytes=e.maxTotalBytes??OHe,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 (
@@ -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 $m(this.ctx,{version:"v1",command:"run.start",requestId:M0("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 I0({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 S0({ownerId:this.options.owner?.ownerId,...this.options.runQueue??{}}),this.runExecutor=new x0(this.ctx,this.runQueue);let e=this.runQueue.recoverOnStartup();for(let n of e.interrupted)this.publish(Gr("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())w0(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&&bX(e.command))return vX(e);if(tJ(e.command))return await this.taskCommands.handleCommand(e,t);switch(e.command){case"client.register":{let n=dX(this.ctx,e);return this.tasks.notifyAutomationReadinessChanged(),n}case"client.update":{let n=lX(this.ctx,e);return this.tasks.notifyAutomationReadinessChanged(),n}case"client.unregister":{let n=cX(this.ctx,e,(r)=>{this.listeners.delete(r),this.detachClientFromSessions(r)});return this.tasks.notifyAutomationReadinessChanged(),n}case"client.list":return uX(this.ctx,e);case"session.create":return await R0(this.ctx,e,(n)=>Qv(this.ctx,n));case"session.restore":return await $X(this.ctx,e,(n)=>Qv(this.ctx,n));case"session.attach":return await FX(this.ctx,e);case"session.detach":return await UX(this.ctx,e);case"session.get":return await BX(this.ctx,e);case"session.messages":return await HX(this.ctx,e);case"session.compaction.get":return await WX(this.ctx,e);case"session.list":return await jX(this.ctx,e);case"session.search":return await qX(this.ctx,e);case"session.update":return await zX(this.ctx,e);case"session.update_connection":return await GX(this.ctx,e);case"session.compaction.update":return await KX(this.ctx,e);case"session.pending_prompts":return await YX(this.ctx,e);case"session.steer_first_pending_prompt":return await XX(this.ctx,e);case"session.update_pending_prompt":return await JX(this.ctx,e);case"session.remove_pending_prompt":return await QX(this.ctx,e);case"session.delete":return await VX(this.ctx,e);case"session.hook":return await wX(this.ctx,e);case"run.start":case"session.send_input":return await $m(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 kX(this.ctx,e,this.runQueue,this.runExecutor)}case"run.list":{if(!this.runQueue)return ie(e,{runs:[]});return TX(e,this.runQueue)}case"hub.drain":return this.handleHubDrain(e);case"hub.status":return this.handleHubStatus(e);case"run.abort":return await gX(this.ctx,e);case"run.proceed_while_running":return await yX(this.ctx,e);case"capability.request":return await sX(this.ctx,e);case"approval.respond":return await nX(this.ctx,e);case"capability.respond":return aX(this.ctx,e);case"capability.progress":return iX(this.ctx,e);case"ui.notify":return this.publish(Gr("ui.notify",e.payload??{})),ie(e);case"ui.show_window":return this.publish(Gr("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 mX(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=ZX(e.command);if(r)this.publish(Gr(r,n.payload))}return n}}}captureFailedReply(e,t){if(t.ok||!t.error||!zHe(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(rJ(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(qHe(e.payload));return this.publish(Gr("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(Gr("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=tX(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 zHe(e){return e==="session_not_found"||e==="session_messages_not_found"||e==="hub_command_timeout"||e.endsWith("_failed")}import{timingSafeEqual as iWe}from"node:crypto";import sWe from"node:http";import{URL as H0}from"node:url";import{CURRENT_HUB_PROTOCOL_VERSION as F0,HUB_CAPABILITIES as aWe,MAX_CLIENT_HUB_PROTOCOL_VERSION as aJ,MIN_CLIENT_HUB_PROTOCOL_VERSION as dJ}from"@cerebriline/shared";import{WebSocketServer as dWe}from"ws";import{createSessionId as VTt,ensureLoopbackProxyBypass as YTt,isHubProtocolCompatible as XTt,resolveClineBuildEnv as JTt,resolveHubCommandTimeoutMs as QTt}from"@cerebriline/shared";import eSt from"ws";import{CLINE_RUN_AS_HUB_DAEMON_ENV as MTt,isBunEmbeddedModulePath as OTt,isHubDaemonProcess as LTt,resolveClineBuildEnv as NTt,withResolvedClineBuildEnv as DTt}from"@cerebriline/shared";import{isAbsolute as XHe,relative as JHe,resolve as L0,sep as QHe}from"node:path";import{captureSdkError as sJ,HUB_COMMAND_SLOW_LOG_MS as ZHe,resolveHubCommandTimeoutMs as eWe,safeJsonParse as tWe}from"@cerebriline/shared";var nWe=200,rWe=1000;function N0(e){return{command:e.envelope.command,requestId:e.envelope.requestId,clientId:e.envelope.clientId,sessionId:e.envelope.sessionId}}function Hm(e,t,n){return{version:e.envelope.version,requestId:e.envelope.requestId,ok:!1,error:{code:t,message:n}}}function oWe(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=L0(a);if(!n&&s&&L0(s)!==d)throw Error("Registration workspace must match the Hub-authorized workspace");let l=L0(r.workspaceContext?.cwd?.trim()||d),c=JHe(d,l);if(c===".."||c.startsWith(`..${QHe}`)||XHe(c))throw Error("Registration cwd must be inside its workspace");return{clientId:i,workspaceContext:{workspaceRoot:d,cwd:l},...n?{crossWorkspace:!0}:{}}}class D0{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:Hm(u,"client_already_registered","This connection already owns a registered client.")});break}if(o&&u.envelope.clientId?.trim()!==o.clientId){s({kind:"reply",envelope:Hm(u,"client_authority_mismatch","Command clientId does not belong to this connection.")});break}if(u.envelope.command==="client.register")try{h=oWe(u,this.workspaceRoot,t.allowRegisteredWorkspace)}catch(S){s({kind:"reply",envelope:Hm(u,"invalid_client_registration",S instanceof Error?S.message:String(S))});break}let p=performance.now(),f=!1,m=N0(u);ke("info","command.start",m);let g=setTimeout(()=>{if(f)return;ke("warn","command.slow",{...m,elapsedMs:Math.round(performance.now()-p)})},ZHe),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=eWe(u.envelope.command,u.envelope.timeoutMs);try{b=v===null?await y:await Promise.race([y,new Promise((S)=>{k=setTimeout(()=>{w=!0,sJ(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(Hm(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<rWe){let E=m,S=this.transport.replayEventsAfter(m,{sessionId:u.sessionId,limit:nWe});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"?tWe(c.data):void 0;if(!h||h.kind!=="command"){ke("error","rejected malformed websocket frame",{error:u});return}ke("error","command.error",{...N0(h),error:u}),sJ(this.telemetry,{component:"core",operation:"hub.websocket_command",error:u,severity:"error",handled:!0,context:N0(h)}),s({kind:"reply",envelope:Hm(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 $0{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 mJ(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 lWe(e){return{send(t){e.send(t)},addEventListener(t,n){if(t==="message"){e.on("message",(r)=>{n({data:mJ(r)})});return}e.on("close",n)},removeEventListener(){}}}function cWe(e){try{e.write(`HTTP/1.1 400 Bad Request\r
2121
+ ${t.instructions}${r}`,s=await $m(this.ctx,{version:"v1",command:"run.start",requestId:M0("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 I0({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 S0({ownerId:this.options.owner?.ownerId,...this.options.runQueue??{}}),this.runExecutor=new x0(this.ctx,this.runQueue);let e=this.runQueue.recoverOnStartup();for(let n of e.interrupted)this.publish(Gr("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())w0(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&&bX(e.command))return vX(e);if(tJ(e.command))return await this.taskCommands.handleCommand(e,t);switch(e.command){case"client.register":{let n=dX(this.ctx,e);return this.tasks.notifyAutomationReadinessChanged(),n}case"client.update":{let n=lX(this.ctx,e);return this.tasks.notifyAutomationReadinessChanged(),n}case"client.unregister":{let n=cX(this.ctx,e,(r)=>{this.listeners.delete(r),this.detachClientFromSessions(r)});return this.tasks.notifyAutomationReadinessChanged(),n}case"client.list":return uX(this.ctx,e);case"session.create":return await R0(this.ctx,e,(n)=>Qv(this.ctx,n));case"session.restore":return await $X(this.ctx,e,(n)=>Qv(this.ctx,n));case"session.attach":return await FX(this.ctx,e);case"session.detach":return await UX(this.ctx,e);case"session.get":return await BX(this.ctx,e);case"session.messages":return await HX(this.ctx,e);case"session.compaction.get":return await WX(this.ctx,e);case"session.list":return await jX(this.ctx,e);case"session.search":return await qX(this.ctx,e);case"session.update":return await zX(this.ctx,e);case"session.update_connection":return await GX(this.ctx,e);case"session.compaction.update":return await KX(this.ctx,e);case"session.pending_prompts":return await YX(this.ctx,e);case"session.steer_first_pending_prompt":return await XX(this.ctx,e);case"session.update_pending_prompt":return await JX(this.ctx,e);case"session.remove_pending_prompt":return await QX(this.ctx,e);case"session.delete":return await VX(this.ctx,e);case"session.hook":return await wX(this.ctx,e);case"run.start":case"session.send_input":return await $m(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 kX(this.ctx,e,this.runQueue,this.runExecutor)}case"run.list":{if(!this.runQueue)return ie(e,{runs:[]});return TX(e,this.runQueue)}case"hub.drain":return this.handleHubDrain(e);case"hub.status":return this.handleHubStatus(e);case"run.abort":return await gX(this.ctx,e);case"run.proceed_while_running":return await yX(this.ctx,e);case"capability.request":return await sX(this.ctx,e);case"approval.respond":return await nX(this.ctx,e);case"capability.respond":return aX(this.ctx,e);case"capability.progress":return iX(this.ctx,e);case"ui.notify":return this.publish(Gr("ui.notify",e.payload??{})),ie(e);case"ui.show_window":return this.publish(Gr("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 mX(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=ZX(e.command);if(r)this.publish(Gr(r,n.payload))}return n}}}captureFailedReply(e,t){if(t.ok||!t.error||!zHe(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(rJ(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(qHe(e.payload));return this.publish(Gr("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(Gr("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=tX(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 zHe(e){return e==="session_not_found"||e==="session_messages_not_found"||e==="hub_command_timeout"||e.endsWith("_failed")}import{timingSafeEqual as iWe}from"node:crypto";import sWe from"node:http";import{URL as H0}from"node:url";import{CURRENT_HUB_PROTOCOL_VERSION as F0,HUB_CAPABILITIES as aWe,MAX_CLIENT_HUB_PROTOCOL_VERSION as aJ,MIN_CLIENT_HUB_PROTOCOL_VERSION as dJ}from"@cerebriline/shared";import{WebSocketServer as dWe}from"ws";import{createSessionId as XTt,ensureLoopbackProxyBypass as JTt,isHubProtocolCompatible as QTt,resolveClineBuildEnv as ZTt,resolveHubCommandTimeoutMs as eSt}from"@cerebriline/shared";import nSt from"ws";import{CLINE_RUN_AS_HUB_DAEMON_ENV as LTt,isBunEmbeddedModulePath as NTt,isHubDaemonProcess as DTt,resolveClineBuildEnv as $Tt,withResolvedClineBuildEnv as FTt}from"@cerebriline/shared";import{isAbsolute as XHe,relative as JHe,resolve as L0,sep as QHe}from"node:path";import{captureSdkError as sJ,HUB_COMMAND_SLOW_LOG_MS as ZHe,resolveHubCommandTimeoutMs as eWe,safeJsonParse as tWe}from"@cerebriline/shared";var nWe=200,rWe=1000;function N0(e){return{command:e.envelope.command,requestId:e.envelope.requestId,clientId:e.envelope.clientId,sessionId:e.envelope.sessionId}}function Hm(e,t,n){return{version:e.envelope.version,requestId:e.envelope.requestId,ok:!1,error:{code:t,message:n}}}function oWe(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=L0(a);if(!n&&s&&L0(s)!==d)throw Error("Registration workspace must match the Hub-authorized workspace");let l=L0(r.workspaceContext?.cwd?.trim()||d),c=JHe(d,l);if(c===".."||c.startsWith(`..${QHe}`)||XHe(c))throw Error("Registration cwd must be inside its workspace");return{clientId:i,workspaceContext:{workspaceRoot:d,cwd:l},...n?{crossWorkspace:!0}:{}}}class D0{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:Hm(u,"client_already_registered","This connection already owns a registered client.")});break}if(o&&u.envelope.clientId?.trim()!==o.clientId){s({kind:"reply",envelope:Hm(u,"client_authority_mismatch","Command clientId does not belong to this connection.")});break}if(u.envelope.command==="client.register")try{h=oWe(u,this.workspaceRoot,t.allowRegisteredWorkspace)}catch(S){s({kind:"reply",envelope:Hm(u,"invalid_client_registration",S instanceof Error?S.message:String(S))});break}let p=performance.now(),f=!1,m=N0(u);ke("info","command.start",m);let g=setTimeout(()=>{if(f)return;ke("warn","command.slow",{...m,elapsedMs:Math.round(performance.now()-p)})},ZHe),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=eWe(u.envelope.command,u.envelope.timeoutMs);try{b=v===null?await y:await Promise.race([y,new Promise((S)=>{k=setTimeout(()=>{w=!0,sJ(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(Hm(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<rWe){let E=m,S=this.transport.replayEventsAfter(m,{sessionId:u.sessionId,limit:nWe});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"?tWe(c.data):void 0;if(!h||h.kind!=="command"){ke("error","rejected malformed websocket frame",{error:u});return}ke("error","command.error",{...N0(h),error:u}),sJ(this.telemetry,{component:"core",operation:"hub.websocket_command",error:u,severity:"error",handled:!0,context:N0(h)}),s({kind:"reply",envelope:Hm(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 $0{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 mJ(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 lWe(e){return{send(t){e.send(t)},addEventListener(t,n){if(t==="message"){e.on("message",(r)=>{n({data:mJ(r)})});return}e.on("close",n)},removeEventListener(){}}}function cWe(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