@clinebot/core 0.0.0 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/dist/default-tools/definitions.d.ts +1 -1
- package/dist/default-tools/executors/index.d.ts +1 -1
- package/dist/default-tools/index.d.ts +2 -1
- package/dist/default-tools/model-tool-routing.d.ts +33 -0
- package/dist/default-tools/schemas.d.ts +13 -7
- package/dist/index.browser.d.ts +1 -0
- package/dist/index.browser.js +220 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +47 -47
- package/dist/index.node.d.ts +36 -0
- package/dist/index.node.js +622 -0
- package/dist/providers/local-provider-service.d.ts +37 -0
- package/dist/session/default-session-manager.d.ts +3 -1
- package/dist/session/session-host.d.ts +2 -2
- package/dist/session/session-manager.d.ts +8 -0
- package/dist/session/unified-session-persistence-service.d.ts +1 -1
- package/dist/session/utils/helpers.d.ts +11 -0
- package/dist/session/utils/types.d.ts +42 -0
- package/dist/session/utils/usage.d.ts +9 -0
- package/dist/storage/provider-settings-manager.d.ts +2 -0
- package/dist/types/config.d.ts +8 -1
- package/dist/types.d.ts +1 -1
- package/package.json +11 -32
- package/src/default-tools/definitions.test.ts +130 -1
- package/src/default-tools/definitions.ts +7 -3
- package/src/default-tools/executors/editor.ts +10 -9
- package/src/default-tools/executors/file-read.test.ts +1 -1
- package/src/default-tools/executors/file-read.ts +11 -6
- package/src/default-tools/executors/index.ts +1 -1
- package/src/default-tools/index.ts +6 -1
- package/src/default-tools/model-tool-routing.test.ts +86 -0
- package/src/default-tools/model-tool-routing.ts +132 -0
- package/src/default-tools/schemas.ts +49 -52
- package/src/index.browser.ts +1 -0
- package/src/{server/index.ts → index.node.ts} +51 -109
- package/src/index.ts +41 -2
- package/src/input/file-indexer.ts +28 -2
- package/src/providers/local-provider-service.ts +591 -0
- package/src/runtime/runtime-builder.test.ts +69 -0
- package/src/runtime/runtime-builder.ts +20 -0
- package/src/runtime/runtime-parity.test.ts +20 -9
- package/src/session/default-session-manager.e2e.test.ts +11 -1
- package/src/session/default-session-manager.test.ts +270 -0
- package/src/session/default-session-manager.ts +109 -191
- package/src/session/index.ts +7 -2
- package/src/session/session-host.ts +30 -18
- package/src/session/session-manager.ts +11 -0
- package/src/session/unified-session-persistence-service.ts +11 -5
- package/src/session/utils/helpers.ts +148 -0
- package/src/session/utils/types.ts +46 -0
- package/src/session/utils/usage.ts +32 -0
- package/src/storage/provider-settings-legacy-migration.test.ts +3 -3
- package/src/storage/provider-settings-manager.test.ts +34 -0
- package/src/storage/provider-settings-manager.ts +22 -1
- package/src/types/config.ts +13 -0
- package/src/types.ts +1 -0
- package/dist/server/index.d.ts +0 -47
- package/dist/server/index.js +0 -641
|
@@ -0,0 +1,622 @@
|
|
|
1
|
+
import{createRequire as t_}from"node:module";var B_=t_(import.meta.url);import{existsSync as eg,mkdirSync as sg}from"node:fs";import{dirname as og,join as t}from"node:path";var $T="agents",Sn="hooks",o="skills",cn="rules",In="workflows",Xm="plugins",nf="cline_mcp_settings.json",$n=process?.env?.HOME||"~",Tf=!1;function mf(n){let T=n.trim();if(!T)return;$n=T,Tf=!0}function hT(n){if(Tf)return;let T=n.trim();if(!T)return;$n=T}function xn(){return t($n,"Documents","Cline")}function DT(){return t(xn(),"Agents")}function wn(){return t(xn(),"Hooks")}function an(){return t(xn(),"Rules")}function ln(){return t(xn(),"Workflows")}function c(){let n=process.env.CLINE_DATA_DIR?.trim();if(n)return n;return t($n,".cline","data")}function Nn(){let n=process.env.CLINE_SESSION_DATA_DIR?.trim();if(n)return n;return t(c(),"sessions")}function LT(){let n=process.env.CLINE_TEAM_DATA_DIR?.trim();if(n)return n;return t(c(),"teams")}function Vm(){let n=process.env.CLINE_PROVIDER_SETTINGS_PATH?.trim();if(n)return n;return t(c(),"settings","providers.json")}function Km(){let n=process.env.CLINE_MCP_SETTINGS_PATH?.trim();if(n)return n;return t(c(),"settings",nf)}function pn(n){let T=new Set,m=[];for(let g of n){if(!g||T.has(g))continue;T.add(g),m.push(g)}return m}function Q_(n){if(!n)return[];return[t(n,".clinerules",o),t(n,".cline",o),t(n,".claude",o),t(n,".agents",o)]}function jm(){return t(c(),"settings",$T)}function Jm(){return[DT(),jm()]}function tm(n){return pn([n?t(n,".clinerules",Sn):"",wn()])}function dn(n){return pn([...Q_(n),t(c(),"settings",o),t($n,".cline",o),t($n,".agents",o)])}function Bm(n){return pn([n?t(n,".clinerules"):"",t(c(),"settings",cn),an()])}function Qm(n){return pn([n?t(n,".clinerules","workflows"):"",t(c(),"settings",In),ln()])}function Zm(n){return pn([n?t(n,".clinerules",Xm):"",t($n,".cline",Xm),t($n,".agents",Xm)])}function en(n){let T=og(n);if(!eg(T))sg(T,{recursive:!0})}function gf(n){if(n?.trim())return en(n),og(n);let T=t(c(),"hooks");if(!eg(T))sg(T,{recursive:!0});return T}import XA from"yaml";import{z as p}from"zod";import{z as hn}from"zod";var ff=hn.enum(["connector.started","connector.stopping","message.received","message.completed","message.failed","session.started","session.reused","thread.reset","schedule.delivery.started","schedule.delivery.sent","schedule.delivery.failed"]),Z_=hn.object({adapter:hn.string(),botUserName:hn.string().optional(),event:ff,payload:hn.record(hn.string(),hn.unknown()),ts:hn.string()});var _f=[{modelsDevKey:"openai",generatedProviderId:"openai",runtimeProviderId:"openai-native"},{modelsDevKey:"openai",generatedProviderId:"openai",runtimeProviderId:"openai-codex"},{modelsDevKey:"anthropic",generatedProviderId:"anthropic"},{modelsDevKey:"anthropic",generatedProviderId:"anthropic",runtimeProviderId:"claude-code"},{modelsDevKey:"google",generatedProviderId:"gemini"},{modelsDevKey:"deepseek",generatedProviderId:"deepseek"},{modelsDevKey:"xai",generatedProviderId:"xai"},{modelsDevKey:"togetherai",runtimeProviderId:"together",generatedProviderId:"together"},{modelsDevKey:"sap-ai-core",runtimeProviderId:"sapaicore",generatedProviderId:"sapaicore"},{modelsDevKey:"fireworks-ai",runtimeProviderId:"fireworks",generatedProviderId:"fireworks"},{modelsDevKey:"groq",runtimeProviderId:"groq",generatedProviderId:"groq"},{modelsDevKey:"cerebras",runtimeProviderId:"cerebras",generatedProviderId:"cerebras"},{modelsDevKey:"sambanova",runtimeProviderId:"sambanova",generatedProviderId:"sambanova"},{modelsDevKey:"nebius",runtimeProviderId:"nebius",generatedProviderId:"nebius"},{modelsDevKey:"huggingface",runtimeProviderId:"huggingface",generatedProviderId:"huggingface"},{modelsDevKey:"openrouter",runtimeProviderId:"cline",generatedProviderId:"openrouter"},{modelsDevKey:"ollama",runtimeProviderId:"ollama-cloud"},{modelsDevKey:"ollama-cloud",generatedProviderId:"ollama"},{modelsDevKey:"vercel",runtimeProviderId:"dify",generatedProviderId:"vercel-ai-gateway"},{modelsDevKey:"vercel",generatedProviderId:"vercel-ai-gateway"},{modelsDevKey:"aihubmix",runtimeProviderId:"aihubmix",generatedProviderId:"aihubmix"},{modelsDevKey:"hicap",runtimeProviderId:"hicap"},{modelsDevKey:"nous-research",runtimeProviderId:"nousResearch"},{modelsDevKey:"huawei-cloud-maas",runtimeProviderId:"huawei-cloud-maas"},{modelsDevKey:"baseten",runtimeProviderId:"baseten",generatedProviderId:"baseten"},{modelsDevKey:"google-vertex-anthropic",generatedProviderId:"vertex"},{modelsDevKey:"lmstudio",generatedProviderId:"lmstudio"},{modelsDevKey:"zai",generatedProviderId:"zai"},{modelsDevKey:"requesty",generatedProviderId:"requesty"},{modelsDevKey:"amazon-bedrock",generatedProviderId:"bedrock"},{modelsDevKey:"moonshotai",generatedProviderId:"moonshot"},{modelsDevKey:"minimax",generatedProviderId:"minimax"}];function z_(n){return Object.fromEntries(_f.flatMap((T)=>{let m=n==="modelsDevKey"?T.modelsDevKey:T.generatedProviderId;return m?[[T.modelsDevKey,m]]:[]}))}var F_=z_("generatedProviderId");import{z as u}from"zod";var q_=u.object({agentId:u.string(),conversationId:u.string(),iteration:u.number(),abortSignal:u.custom().optional(),metadata:u.record(u.string(),u.unknown()).optional()}),H_=u.object({id:u.string(),name:u.string(),input:u.unknown(),output:u.unknown(),error:u.string().optional(),durationMs:u.number(),startedAt:u.date(),endedAt:u.date()});import{z as Af}from"zod";function nn(n,T){let m=n.safeParse(T);if(!m.success)throw Error(Af.prettifyError(m.error));return m.data}function Tn(n){return Af.toJSONSchema(n)}function WT(n,T="act"){return`<user_input mode="${T}">${n}</user_input>`}function OT(n){if(!n?.trim())return"";return Rf(n,"user_input")}function Rf(n,T){if(!n?.trim())return"";if(!T)return n;let m=new RegExp(`<${T}.*?>(.*?)</${T}>`,"g");return n.replace(m,"$1")}var rf="runtime.team.progress.v1",Mf="runtime.team.lifecycle.v1";function Uf(n){let T=n?.trim();return T?T:void 0}function CT(n){return Uf(n?.rootSessionId)}function yf(n){return Uf(n?.hookLogPath)}var zm=["running","completed","failed","cancelled"];var fn={READ_FILES:"read_files",SEARCH_CODEBASE:"search_codebase",RUN_COMMANDS:"run_commands",FETCH_WEB_CONTENT:"fetch_web_content",APPLY_PATCH:"apply_patch",EDITOR:"editor",SKILLS:"skills",ASK:"ask_question"},Yn=[fn.READ_FILES,fn.SEARCH_CODEBASE,fn.RUN_COMMANDS,fn.FETCH_WEB_CONTENT,fn.APPLY_PATCH,fn.EDITOR,fn.SKILLS,fn.ASK];import{createTool as Dn}from"@clinebot/agents";import{z as X}from"zod";var P_=X.string().describe("The absolute file path of a text file to read content from"),NT=X.object({file_paths:X.array(P_).describe("Array of absolute file paths to get full content from. Prefer this tool over running terminal command to get file content for better performance and reliability.")}),Ef=X.union([NT,X.array(X.string()),X.string()]),YT=X.object({queries:X.array(X.string()).describe("Array of regex search queries to execute")}),Fm=X.string(),XT=X.object({commands:X.array(Fm).describe("Array of shell commands to execute.")}),$f=X.union([XT,X.array(Fm),Fm]),hf=X.object({url:X.string().describe("The URL to fetch"),prompt:X.string().min(2).describe("Analysis prompt for the fetched content")}),VT=X.object({requests:X.array(hf).describe("Array of the URLs for the web fetch requests")}),KT=X.object({command:X.enum(["create","str_replace","insert"]).describe("Editor command to execute: create, str_replace, insert"),path:X.string().min(1).describe("Absolute file path"),file_text:X.string().nullish().describe("Full file content required for 'create' command"),old_str:X.string().nullish().describe("Exact text to replace (must match exactly once) for 'str_replace' command"),new_str:X.string().nullish().describe("Replacement text for 'str_replace' or 'insert' commands"),insert_line:X.number().int().nullish().describe("Optional one-based line index for 'insert' command")}).refine((n)=>n.command!=="create"||n.file_text!=null,{path:["file_text"],message:"file_text is required for command=create"}).refine((n)=>n.command!=="str_replace"||n.old_str!=null,{path:["old_str"],message:"old_str is required for command=str_replace"}).refine((n)=>n.command!=="insert"||n.insert_line!=null,{path:["insert_line"],message:"insert_line is required for command=insert"}).refine((n)=>n.command!=="insert"||n.new_str!=null,{path:["new_str"],message:"new_str is required for command=insert"}),jT=X.object({input:X.string().min(1).describe("The apply_patch text payload, including patch instructions")}),Df=X.union([jT,X.string()]),JT=X.object({skill:X.string().min(1).describe('The skill name. E.g., "commit", "review-pr", "pdf", or "ms-office-suite:pdf"'),args:X.string().nullable().optional().describe("Arguments for the skill; use null when omitted")}),tT=X.object({question:X.string().min(1).describe('The single question to ask the user. E.g. "How can I help you?"'),options:X.array(X.string().min(1)).min(2).max(5).describe("Array of 2-5 user-selectable answer options for the single question")});function Bn(n){if(n instanceof Error)return n.message;return String(n)}function Ln(n,T,m){return Promise.race([n,new Promise((g,f)=>{setTimeout(()=>f(Error(m)),T)})])}var b_=`This is a custom utility that makes it more convenient to add, remove, move, or edit code in a single file. \`apply_patch\` effectively allows you to execute a diff/patch against a file, but the format of the diff specification is unique to this task, so pay careful attention to these instructions. To use the \`apply_patch\` command, you should pass a message of the following structure as "input":
|
|
2
|
+
|
|
3
|
+
%%bash
|
|
4
|
+
apply_patch <<"EOF"
|
|
5
|
+
*** Begin Patch
|
|
6
|
+
[YOUR_PATCH]
|
|
7
|
+
*** End Patch
|
|
8
|
+
EOF
|
|
9
|
+
|
|
10
|
+
Where [YOUR_PATCH] is the actual content of your patch, specified in the following V4A diff format.
|
|
11
|
+
|
|
12
|
+
*** [ACTION] File: [path/to/file] -> ACTION can be one of Add, Update, or Delete.
|
|
13
|
+
|
|
14
|
+
In a Add File section, every line of the new file (including blank/empty lines) MUST start with a \`+\` prefix. Do not include any unprefixed lines inside an Add section
|
|
15
|
+
In a Update/Delete section, repeat the following for each snippet of code that needs to be changed:
|
|
16
|
+
[context_before] -> See below for further instructions on context.
|
|
17
|
+
- [old_code] -> Precede the old code with a minus sign.
|
|
18
|
+
+ [new_code] -> Precede the new, replacement code with a plus sign.
|
|
19
|
+
[context_after] -> See below for further instructions on context.
|
|
20
|
+
|
|
21
|
+
For instructions on [context_before] and [context_after]:
|
|
22
|
+
- By default, show 3 lines of code immediately above and 3 lines immediately below each change. If a change is within 3 lines of a previous change, do NOT duplicate the first change’s [context_after] lines in the second change’s [context_before] lines.
|
|
23
|
+
- If 3 lines of context is insufficient to uniquely identify the snippet of code within the file, use the @@ operator to indicate the class or function to which the snippet belongs. For instance, we might have:
|
|
24
|
+
@@ class BaseClass
|
|
25
|
+
[3 lines of pre-context]
|
|
26
|
+
- [old_code]
|
|
27
|
+
+ [new_code]
|
|
28
|
+
[3 lines of post-context]
|
|
29
|
+
|
|
30
|
+
- If a code block is repeated so many times in a class or function such that even a single @@ statement and 3 lines of context cannot uniquely identify the snippet of code, you can use multiple \`@@\` statements to jump to the right context. For instance:
|
|
31
|
+
|
|
32
|
+
@@ class BaseClass
|
|
33
|
+
@@ def method():
|
|
34
|
+
[3 lines of pre-context]
|
|
35
|
+
- [old_code]
|
|
36
|
+
+ [new_code]
|
|
37
|
+
[3 lines of post-context]
|
|
38
|
+
|
|
39
|
+
Note, then, that we do not use line numbers in this diff format, as the context is enough to uniquely identify code. An example of a message that you might pass as "input" to this function, in order to apply a patch, is shown below.
|
|
40
|
+
|
|
41
|
+
%%bash
|
|
42
|
+
apply_patch <<"EOF"
|
|
43
|
+
*** Begin Patch
|
|
44
|
+
*** Update File: pygorithm/searching/binary_search.py
|
|
45
|
+
@@ class BaseClass
|
|
46
|
+
@@ def search():
|
|
47
|
+
- pass
|
|
48
|
+
+ raise NotImplementedError()
|
|
49
|
+
|
|
50
|
+
@@ class Subclass
|
|
51
|
+
@@ def search():
|
|
52
|
+
- pass
|
|
53
|
+
+ raise NotImplementedError()
|
|
54
|
+
|
|
55
|
+
*** End Patch
|
|
56
|
+
EOF`;function Lf(n,T={}){let m=T.fileReadTimeoutMs??1e4;return Dn({name:"read_files",description:"Read the FULL content of text file at the provided absolute paths. Returns file contents or error messages for each path. ",inputSchema:Tn(NT),timeoutMs:m*2,retryable:!0,maxRetries:1,execute:async(g,f)=>{let _=nn(Ef,g),A=Array.isArray(_)?_:typeof _==="object"?_.file_paths:[_];return Promise.all(A.map(async(R)=>{try{let r=await Ln(n(R,f),m,`File read timed out after ${m}ms`);return{query:R,result:r,success:!0}}catch(r){let M=Bn(r);return{query:R,result:"",error:`Error reading file: ${M}`,success:!1}}}))}})}function Wf(n,T={}){let m=T.searchTimeoutMs??30000,g=T.cwd??process.cwd();return Dn({name:"search_codebase",description:"Perform regex pattern searches across the codebase. Supports multiple parallel searches. Use for finding code patterns, function definitions, class names, imports, etc.",inputSchema:Tn(YT),timeoutMs:m*2,retryable:!0,maxRetries:1,execute:async(f,_)=>{let A=nn(YT,f);return Promise.all(A.queries.map(async(R)=>{try{let r=await Ln(n(R,g,_),m,`Search timed out after ${m}ms`),M=r.length>0&&!r.includes("No results found");return{query:R,result:r,success:M}}catch(r){let M=Bn(r);return{query:R,result:"",error:`Search failed: ${M}`,success:!1}}}))}})}function Of(n,T={}){let m=T.bashTimeoutMs??30000,g=T.cwd??process.cwd();return Dn({name:"run_commands",description:"Run shell commands at the root of the project. Use for listing files, checking git status, running builds, executing tests, etc. Commands should be properly shell-escaped.",inputSchema:Tn(XT),timeoutMs:m*2,retryable:!1,maxRetries:0,execute:async(f,_)=>{let A=nn($f,f),R=Array.isArray(A)?A:typeof A==="object"?A.commands:[A];return Promise.all(R.map(async(r)=>{try{let M=await Ln(n(r,g,_),m,`Command timed out after ${m}ms`);return{query:r,result:M,success:!0}}catch(M){let U=Bn(M);return{query:r,result:"",error:`Command failed: ${U}`,success:!1}}}))}})}function Cf(n,T={}){let m=T.webFetchTimeoutMs??30000;return Dn({name:"fetch_web_content",description:"Fetch content from URLs and analyze them using the provided prompts. Use for retrieving documentation, API references, or any web content. Each request includes a URL and a prompt describing what information to extract.",inputSchema:Tn(VT),timeoutMs:m*2,retryable:!0,maxRetries:2,execute:async(g,f)=>{let _=nn(VT,g);return Promise.all(_.requests.map(async(A)=>{try{let R=await Ln(n(A.url,A.prompt,f),m,`Web fetch timed out after ${m}ms`);return{query:A.url,result:R,success:!0}}catch(R){let r=Bn(R);return{query:A.url,result:"",error:`Error fetching web content: ${r}`,success:!1}}}))}})}function Nf(n,T={}){let m=T.applyPatchTimeoutMs??30000,g=T.cwd??process.cwd();return Dn({name:"apply_patch",description:b_,inputSchema:Tn(jT),timeoutMs:m,retryable:!1,maxRetries:0,execute:async(f,_)=>{let A=nn(Df,f),R=typeof A==="string"?A:A.input;try{return{query:"apply_patch",result:await Ln(n({input:R},g,_),m,`apply_patch timed out after ${m}ms`),success:!0}}catch(r){return{query:"apply_patch",result:"",error:`apply_patch failed: ${Bn(r)}`,success:!1}}}})}function Yf(n,T={}){let m=T.editorTimeoutMs??30000,g=T.cwd??process.cwd();return Dn({name:"editor",description:"Edit file using absolute path with create, string replacement, and line insert operations. Supported commands: create, str_replace, insert.",inputSchema:Tn(KT),timeoutMs:m,retryable:!1,maxRetries:0,execute:async(f,_)=>{let A=nn(KT,f);try{let R=await Ln(n(A,g,_),m,`Editor operation timed out after ${m}ms`);return{query:`${A.command}:${A.path}`,result:R,success:!0}}catch(R){let r=Bn(R);return{query:`${A.command}:${A.path}`,result:"",error:`Editor operation failed: ${r}`,success:!1}}}})}function Xf(n,T={}){let m=T.skillsTimeoutMs??15000;return Dn({name:"skills",description:'Execute a skill within the main conversation. When users ask you to perform tasks, check if any available skills match. When users reference a slash command (for example "/commit" or "/review-pr"), invoke this tool. Input: `skill` (required) and optional `args`. Example: `skill: "pdf"`, `skill: "commit", args: "-m \\"Fix bug\\""`, `skill: "review-pr", args: "123"`, `skill: "ms-office-suite:pdf"`. Available skills are listed in system-reminder messages in the conversation. When a skill matches the user\'s request, invoking this tool is a blocking requirement before any other response. Never mention a skill without invoking this tool.',inputSchema:Tn(JT),timeoutMs:m,retryable:!1,maxRetries:0,execute:async(g,f)=>{let _=nn(JT,g);return Ln(n(_.skill,_.args||void 0,f),m,`Skills operation timed out after ${m}ms`)}})}function Vf(n,T={}){let m=T.askQuestionTimeoutMs??15000;return Dn({name:"ask_question",description:"Ask user a question for clarifying or gathering information needed to complete the task. For example, ask the user clarifying questions about a key implementation decision. You should only ask one question. Provide an array of 2-5 options for the user to choose from. Never include an option to toggle to Act mode.",inputSchema:Tn(tT),timeoutMs:m,retryable:!1,maxRetries:0,execute:async(g,f)=>{let _=nn(tT,g);return Ln(n(_.question,_.options,f),m,`ask_question timed out after ${m}ms`)}})}function Qn(n){let{executors:T,enableReadFiles:m=!0,enableSearch:g=!0,enableBash:f=!0,enableWebFetch:_=!0,enableApplyPatch:A=!1,enableEditor:R=!0,enableSkills:r=!0,enableAskQuestion:M=!0,...U}=n,y=[];if(m&&T.readFile)y.push(Lf(T.readFile,U));if(g&&T.search)y.push(Wf(T.search,U));if(f&&T.bash)y.push(Of(T.bash,U));if(_&&T.webFetch)y.push(Cf(T.webFetch,U));if(R&&T.editor)y.push(Yf(T.editor,U));else if(A&&T.applyPatch)y.push(Nf(T.applyPatch,U));if(r&&T.skills)y.push(Xf(T.skills,U));if(M&&T.askQuestion)y.push(Vf(T.askQuestion,U));return y}import*as i from"node:fs/promises";import*as l from"node:path";var N={BEGIN:"*** Begin Patch",END:"*** End Patch",ADD:"*** Add File: ",UPDATE:"*** Update File: ",DELETE:"*** Delete File: ",MOVE:"*** Move to: ",SECTION:"@@",END_FILE:"*** End of File"},jf=["%%bash","apply_patch","EOF","```"];class P extends Error{constructor(n){super(n);this.name="DiffError"}}function a(n){let T={"‐":"-","‑":"-","‒":"-","–":"-","—":"-","−":"-","“":'"',"”":'"',"„":'"',"«":'"',"»":'"',"‘":"'","’":"'","‛":"'"," ":" "," ":" "};return n.normalize("NFC").replace(/./gu,(m)=>T[m]??m).replace(/\\`/g,"`").replace(/\\'/g,"'").replace(/\\"/g,'"')}class qm{lines;currentFiles;patch={actions:{},warnings:[]};index=0;fuzz=0;currentPath;constructor(n,T){this.lines=n;this.currentFiles=T}parse(){this.skipBeginSentinel();while(this.hasMoreLines()&&!this.isEndMarker())this.parseNextAction();if(this.patch.warnings?.length===0)delete this.patch.warnings;return{patch:this.patch,fuzz:this.fuzz}}addWarning(n){if(!this.patch.warnings)this.patch.warnings=[];this.patch.warnings.push(n)}skipBeginSentinel(){if(this.lines[this.index]?.startsWith(N.BEGIN))this.index++}hasMoreLines(){return this.index<this.lines.length}isEndMarker(){return this.lines[this.index]?.startsWith(N.END)??!1}parseNextAction(){let n=this.lines[this.index];if(n?.startsWith(N.UPDATE)){this.parseUpdate(n.substring(N.UPDATE.length).trim());return}if(n?.startsWith(N.DELETE)){this.parseDelete(n.substring(N.DELETE.length).trim());return}if(n?.startsWith(N.ADD)){this.parseAdd(n.substring(N.ADD.length).trim());return}throw new P(`Unknown line while parsing: ${n}`)}checkDuplicate(n,T){if(n in this.patch.actions)throw new P(`Duplicate ${T} for file: ${n}`)}parseUpdate(n){this.checkDuplicate(n,"update"),this.currentPath=n,this.index++;let T=this.lines[this.index]?.startsWith(N.MOVE)?(this.lines[this.index++]??"").substring(N.MOVE.length).trim():void 0;if(!(n in this.currentFiles))throw new P(`Update File Error: Missing File: ${n}`);let m=this.currentFiles[n]??"",g=this.parseUpdateFile(m,n);g.movePath=T,this.patch.actions[n]=g,this.currentPath=void 0}parseUpdateFile(n,T){let m={type:"update",chunks:[]},g=n.split(`
|
|
57
|
+
`),f=0,_=[N.END,N.UPDATE,N.DELETE,N.ADD,N.END_FILE];while(!_.some((A)=>this.lines[this.index]?.startsWith(A.trim()))){let A=this.lines[this.index],R=A?.startsWith("@@ ")?A.substring(3):void 0;if(R!==void 0||(A==="@@"?A:void 0)!==void 0)this.index++;else if(f!==0)throw new P(`Invalid Line:
|
|
58
|
+
${this.lines[this.index]}`);if(R?.trim()){let E=a(R.trim());for(let Y=f;Y<g.length;Y++){let D=g[Y];if(D&&(a(D)===E||a(D.trim())===E)){if(f=Y+1,a(D.trim())===E&&a(D)!==E)this.fuzz++;break}}}let[M,U,y,$]=G_(this.lines,this.index),[h,L,W]=v_(g,M,f,$);if(h===-1){let E=M.join(`
|
|
59
|
+
`);this.addWarning({path:this.currentPath||T,chunkIndex:m.chunks.length,message:`Could not find matching context (similarity: ${W.toFixed(2)}). Chunk skipped.`,context:E.length>200?`${E.substring(0,200)}...`:E}),this.index=y}else{this.fuzz+=L;for(let E of U)E.origIndex+=h,m.chunks.push(E);f=h+M.length,this.index=y}}return m}parseDelete(n){if(this.checkDuplicate(n,"delete"),!(n in this.currentFiles))throw new P(`Delete File Error: Missing File: ${n}`);this.patch.actions[n]={type:"delete",chunks:[]},this.index++}parseAdd(n){if(this.checkDuplicate(n,"add"),n in this.currentFiles)throw new P(`Add File Error: File already exists: ${n}`);this.index++;let T=[],m=[N.END,N.UPDATE,N.DELETE,N.ADD];while(this.hasMoreLines()&&!m.some((g)=>this.lines[this.index]?.startsWith(g.trim()))){let g=this.lines[this.index++];if(g===void 0)break;if(!g.startsWith("+"))throw new P(`Invalid Add File line (missing '+'): ${g}`);T.push(g.substring(1))}this.patch.actions[n]={type:"add",newFile:T.join(`
|
|
60
|
+
`),chunks:[]}}}function Kf(n,T){let m=n.length>T.length?n:T,g=n.length>T.length?T:n;if(m.length===0)return 1;let f=u_(g,m);return(m.length-f)/m.length}function u_(n,T){let m=T.length+1,g=n.length+1,f=Array(m*g).fill(0),_=(R,r)=>f[R*g+r]??0,A=(R,r,M)=>{f[R*g+r]=M};for(let R=0;R<=T.length;R++)A(R,0,R);for(let R=0;R<=n.length;R++)A(0,R,R);for(let R=1;R<=T.length;R++)for(let r=1;r<=n.length;r++)if(T[R-1]===n[r-1])A(R,r,_(R-1,r-1));else A(R,r,1+Math.min(_(R-1,r-1),_(R,r-1),_(R-1,r)));return _(T.length,n.length)}function v_(n,T,m,g){if(T.length===0)return[m,0,1];let f=0,_=(A)=>{let R=a(T.join(`
|
|
61
|
+
`));for(let M=A;M<n.length;M++){let U=a(n.slice(M,M+T.length).join(`
|
|
62
|
+
`));if(U===R)return[M,0,1];let y=Kf(U,R);if(y>f)f=y}for(let M=A;M<n.length;M++){let U=a(n.slice(M,M+T.length).map(($)=>$.trimEnd()).join(`
|
|
63
|
+
`)),y=a(T.map(($)=>$.trimEnd()).join(`
|
|
64
|
+
`));if(U===y)return[M,1,1]}for(let M=A;M<n.length;M++){let U=a(n.slice(M,M+T.length).map(($)=>$.trim()).join(`
|
|
65
|
+
`)),y=a(T.map(($)=>$.trim()).join(`
|
|
66
|
+
`));if(U===y)return[M,100,1]}let r=0.66;for(let M=A;M<n.length;M++){let U=a(n.slice(M,M+T.length).join(`
|
|
67
|
+
`)),y=Kf(U,R);if(y>=r)return[M,1000,y];if(y>f)f=y}return[-1,0,f]};if(g){let[A,R,r]=_(n.length-T.length);if(A!==-1)return[A,R,r];return[A,R,r]=_(m),[A,R+1e4,r]}return _(m)}function G_(n,T){let m=T,g=[],f=[],_=[],A=[],R="keep",r=["@@",N.END,N.UPDATE,N.DELETE,N.ADD,N.END_FILE];while(m<n.length){let M=n[m];if(!M||r.some(($)=>M.startsWith($.trim())))break;if(M==="***")break;if(M.startsWith("***"))throw new P(`Invalid line: ${M}`);m++;let U=R,y=M;if(y[0]==="+")R="add";else if(y[0]==="-")R="delete";else if(y[0]===" ")R="keep";else R="keep",y=` ${y}`;if(y=y.slice(1),R==="keep"&&U!==R){if(_.length||f.length)A.push({origIndex:g.length-f.length,delLines:f,insLines:_});f=[],_=[]}if(R==="delete")f.push(y),g.push(y);else if(R==="add")_.push(y);else g.push(y)}if(_.length||f.length)A.push({origIndex:g.length-f.length,delLines:f,insLines:_});if(m<n.length&&n[m]===N.END_FILE)return m++,[g,A,m,!0];return[g,A,m,!1]}function Hm(n,T,m){let g=l.isAbsolute(T),f=g?l.normalize(T):l.resolve(n,T);if(!m||g)return f;let _=l.relative(n,f);if(_.startsWith("..")||l.isAbsolute(_))throw new P(`Path must stay within cwd: ${T}`);return f}function Jf(n){let T=[],m=!1,g=!1,f=!1;for(let _=0;_<n.length;_++){let A=n[_];if(!m&&jf.some((r)=>A.startsWith(r)))continue;if(A.startsWith(N.BEGIN)){m=!0,g=!0,T.push(A);continue}if(A===N.END){m=!1,T.push(A);continue}let R=A.startsWith(N.ADD)||A.startsWith(N.UPDATE)||A.startsWith(N.DELETE)||A.startsWith(N.MOVE)||A.startsWith(N.SECTION)||A.startsWith("+")||A.startsWith("-")||A.startsWith(" ")||A==="***";if(R&&_!==n.length-1)f=!0;if(m||!g&&R||A===""&&f)T.push(A)}while(T.length>0&&T[T.length-1]==="")T.pop();return!g&&!f?n:T}function k_(n){let T=n.split(`
|
|
68
|
+
`).map((f)=>f.replace(/\r$/,""));T=Jf(T);let m=T.length>0&&T[0].startsWith(N.BEGIN),g=T.length>0&&T[T.length-1]===N.END;if(!m&&!g)return[N.BEGIN,...T,N.END];if(m&&g)return T;throw new P("Invalid patch text - incomplete sentinels. Try breaking it into smaller patches.")}function S_(n,T){let m=Jf(n.split(`
|
|
69
|
+
`)),g=[];for(let f of m)for(let _ of T){if(!f.startsWith(_))continue;let A=f.substring(_.length).trim();if(!n.trim().endsWith(A))g.push(A);break}return g}function c_(n,T,m){if(T.length===0)return n;let g=n.split(`
|
|
70
|
+
`),f=[],_=0;for(let A of T){if(A.origIndex>g.length)throw new P(`${m}: chunk.origIndex ${A.origIndex} > lines.length ${g.length}`);if(_>A.origIndex)throw new P(`${m}: currentIndex ${_} > chunk.origIndex ${A.origIndex}`);f.push(...g.slice(_,A.origIndex)),f.push(...A.insLines),_=A.origIndex+A.delLines.length}return f.push(...g.slice(_)),f.join(`
|
|
71
|
+
`)}async function I_(n,T,m,g){let f=S_(n,[N.UPDATE,N.DELETE]),_={};for(let A of f){let R=Hm(T,A,g),r;try{r=await i.readFile(R,m)}catch{throw new P(`File not found: ${A}`)}_[A]=r.replace(/\r\n/g,`
|
|
72
|
+
`)}return _}function x_(n,T){let m={};for(let[g,f]of Object.entries(n.actions))switch(f.type){case"delete":m[g]={type:"delete",oldContent:T[g]};break;case"add":if(f.newFile===void 0)throw new P("ADD action without file content");m[g]={type:"add",newContent:f.newFile};break;case"update":m[g]={type:"update",oldContent:T[g],newContent:c_(T[g]??"",f.chunks,g),movePath:f.movePath};break}return m}async function w_(n,T,m,g){let f=[];for(let[_,A]of Object.entries(n)){let R=Hm(T,_,g);switch(A.type){case"delete":await i.rm(R,{force:!0}),f.push(`${_}: [deleted]`);break;case"add":if(A.newContent===void 0)throw new P(`Cannot create ${_} with no content`);await i.mkdir(l.dirname(R),{recursive:!0}),await i.writeFile(R,A.newContent,{encoding:m}),f.push(_);break;case"update":{if(A.newContent===void 0)throw new P(`UPDATE change for ${_} has no new content`);if(A.movePath){let r=Hm(T,A.movePath,g);await i.mkdir(l.dirname(r),{recursive:!0}),await i.writeFile(r,A.newContent,{encoding:m}),await i.rm(R,{force:!0}),f.push(`${_} -> ${A.movePath}`)}else await i.writeFile(R,A.newContent,{encoding:m}),f.push(_);break}}}return f}function BT(n={}){let{encoding:T="utf-8",restrictToCwd:m=!0}=n;return async(g,f,_)=>{let A=k_(g.input),R=await I_(g.input,f,T,m),r=new qm(A,R),{patch:M,fuzz:U}=r.parse(),y=x_(M,R),$=await w_(y,f,T,m),h=["Successfully applied patch to the following files:"];for(let L of $)h.push(L);if(U>0)h.push(`Note: Patch applied with fuzz factor ${U}`);if(M.warnings&&M.warnings.length>0)for(let L of M.warnings)h.push(`Warning (${L.path}): ${L.message}`);return h.join(`
|
|
73
|
+
`)}}import{spawn as tf}from"node:child_process";function QT(n={}){let{shell:T=process.platform==="win32"?"cmd.exe":"/bin/bash",timeoutMs:m=30000,maxOutputBytes:g=1e6,env:f={},combineOutput:_=!0}=n;return async(A,R,r)=>{return new Promise((M,U)=>{let y=process.platform==="win32"?["/c",A]:["-c",A],$=process.platform==="win32",h=tf(T,y,{cwd:R,env:{...process.env,...f},stdio:["pipe","pipe","pipe"],detached:!$}),L=h.pid,W="",E="",Y=0,D=!1,j=!1,Q=(J)=>{if(j)return;j=!0,U(J)},b=(J)=>{if(j)return;j=!0,M(J)},v=()=>{if(!L)return;if($){tf("taskkill",["/pid",String(L),"/T","/F"],{stdio:"ignore",windowsHide:!0}).unref();return}try{process.kill(-L,"SIGKILL")}catch{h.kill("SIGKILL")}},Z=setTimeout(()=>{D=!0,v(),Q(Error(`Command timed out after ${m}ms`))},m),k=()=>{D=!0,v(),Q(Error("Command was aborted"))};if(r.abortSignal)r.abortSignal.addEventListener("abort",k);h.stdout?.on("data",(J)=>{if(Y+=J.length,Y<=g)W+=J.toString()}),h.stderr?.on("data",(J)=>{if(Y+=J.length,Y<=g)E+=J.toString()}),h.on("close",(J)=>{if(clearTimeout(Z),r.abortSignal)r.abortSignal.removeEventListener("abort",k);if(D)return;let V=_?W+(E?`
|
|
74
|
+
[stderr]
|
|
75
|
+
${E}`:""):W;if(Y>g)V+=`
|
|
76
|
+
|
|
77
|
+
[Output truncated: ${Y} bytes total, showing first ${g} bytes]`;if(J!==0){let s=E||`Command exited with code ${J}`;Q(Error(s))}else b(V)}),h.on("error",(J)=>{if(clearTimeout(Z),r.abortSignal)r.abortSignal.removeEventListener("abort",k);Q(Error(`Failed to execute command: ${J.message}`))})})}}import*as rn from"node:fs/promises";import*as mn from"node:path";function a_(n,T,m){let g=mn.isAbsolute(T),f=g?mn.normalize(T):mn.resolve(n,T);if(!m)return f;if(g)return f;let _=mn.relative(n,f);if(_.startsWith("..")||mn.isAbsolute(_))throw Error(`Path must stay within cwd: ${T}`);return f}function i_(n,T){if(T.length===0)return 0;return n.split(T).length-1}function l_(n,T,m){let g=n.split(`
|
|
78
|
+
`),f=T.split(`
|
|
79
|
+
`),_=Math.max(g.length,f.length),A=["```diff"],R=0;for(let r=0;r<_;r++){if(R>=m){A.push("... diff truncated ...");break}let M=g[r],U=f[r];if(M===U)continue;let y=r+1;if(M!==void 0)A.push(`-${y}: ${M}`),R++;if(U!==void 0&&R<m)A.push(`+${y}: ${U}`),R++}return A.push("```"),A.join(`
|
|
80
|
+
`)}async function p_(n,T,m){return await rn.mkdir(mn.dirname(n),{recursive:!0}),await rn.writeFile(n,T,{encoding:m}),`File created successfully at: ${n}`}async function d_(n,T,m,g,f){let _=await rn.readFile(n,g),A=i_(_,T);if(A===0)throw Error(`No replacement performed: text not found in ${n}.`);if(A>1)throw Error(`No replacement performed: multiple occurrences of text found in ${n}.`);let R=_.replace(T,m??"");await rn.writeFile(n,R,{encoding:g});let r=l_(_,R,f);return`Edited ${n}
|
|
81
|
+
${r}`}async function e_(n,T,m,g){let _=(await rn.readFile(n,g)).split(`
|
|
82
|
+
`),A=T-1;if(A<0||A>_.length)throw Error(`Invalid line number: ${T}. Valid range: 1-${_.length}`);return _.splice(A,0,...m.split(`
|
|
83
|
+
`)),await rn.writeFile(n,_.join(`
|
|
84
|
+
`),{encoding:g}),`Inserted content at line ${T} in ${n}.`}function ZT(n={}){let{encoding:T="utf-8",restrictToCwd:m=!0,maxDiffLines:g=200}=n;return async(f,_,A)=>{let R=a_(_,f.path,m);switch(f.command){case"create":if(f.file_text==null)throw Error("Parameter `file_text` is required for command: create");return p_(R,f.file_text,T);case"str_replace":if(f.old_str==null)throw Error("Parameter `old_str` is required for command: str_replace");return d_(R,f.old_str,f.new_str,T,g);case"insert":if(f.insert_line==null)throw Error("Parameter `insert_line` is required for insert command.");if(f.new_str==null)throw Error("Parameter `new_str` is required for insert command.");return e_(R,f.insert_line,f.new_str,T);default:throw Error(`Unrecognized command ${f.command}. Allowed commands are: create, str_replace, insert`)}}}import*as zT from"node:fs/promises";import*as Zn from"node:path";var s_={maxFileSizeBytes:1e7,encoding:"utf-8",includeLineNumbers:!0};function FT(n={}){let{maxFileSizeBytes:T,encoding:m,includeLineNumbers:g}={...s_,...n};return async(f,_)=>{let A=Zn.isAbsolute(f)?Zn.normalize(f):Zn.resolve(process.cwd(),f),R=await zT.stat(A);if(!R.isFile())throw Error(`Path is not a file: ${A}`);if(R.size>T)throw Error(`File too large: ${R.size} bytes (max: ${T} bytes). Consider reading specific sections or using a different approach.`);let r=await zT.readFile(A,m);if(g){let M=r.split(`
|
|
85
|
+
`),U=String(M.length).length;return M.map((y,$)=>`${String($+1).padStart(U," ")} | ${y}`).join(`
|
|
86
|
+
`)}return r}}import*as qf from"node:fs/promises";import*as HT from"node:path";import{spawn as o_}from"node:child_process";import{readdir as nA}from"node:fs/promises";import um from"node:path";import{isMainThread as Qf,parentPort as Bf,Worker as TA}from"node:worker_threads";var mA=15000,gA=1000,fA=new Set([".git","node_modules","dist","build",".next","coverage",".turbo",".cache","target","out"]),Pm=new Map;function _A(n,T){return um.relative(n,T).split(um.sep).join("/")}async function AA(n){let m=(await new Promise((g,f)=>{let _=o_("rg",["--files","--hidden","-g","!.git"],{cwd:n,stdio:["ignore","pipe","pipe"]}),A="",R="";_.stdout.on("data",(r)=>{A+=r.toString()}),_.stderr.on("data",(r)=>{R+=r.toString()}),_.on("error",f),_.on("close",(r)=>{if(r===0){g(A);return}f(Error(R||`rg exited with code ${r}`))})})).split(/\r?\n/).map((g)=>g.trim()).filter((g)=>g.length>0).map((g)=>g.replace(/\\/g,"/"));return new Set(m)}async function Zf(n,T,m){let g=await nA(T,{withFileTypes:!0});for(let f of g){let _=um.join(T,f.name);if(f.isDirectory()){if(fA.has(f.name))continue;await Zf(n,_,m);continue}if(f.isFile())m.add(_A(n,_))}}async function RA(n){let T=new Set;return await Zf(n,n,T),T}async function vm(n){try{return await AA(n)}catch{return RA(n)}}function rA(){if(Qf||!Bf)return;let n=Bf;n.on("message",(T)=>{if(T.type!=="index")return;vm(T.cwd).then((m)=>{let g={type:"indexResult",requestId:T.requestId,files:Array.from(m)};n.postMessage(g)}).catch((m)=>{let g={type:"indexResult",requestId:T.requestId,error:m instanceof Error?m.message:"Failed to build file index"};n.postMessage(g)})})}class zf{worker=new TA(new URL(import.meta.url));nextRequestId=0;pending=new Map;constructor(){this.worker.unref(),this.worker.on("message",(n)=>{if(n.type!=="indexResult")return;let T=this.pending.get(n.requestId);if(!T)return;if(this.pending.delete(n.requestId),n.error){T.reject(Error(n.error));return}T.resolve(n.files??[])}),this.worker.on("error",(n)=>{this.flushPending(n)}),this.worker.on("exit",(n)=>{if(n!==0)this.flushPending(Error(`File index worker exited with code ${n}`))})}requestIndex(n){let T=++this.nextRequestId,m=new Promise((f,_)=>{let A=setTimeout(()=>{this.pending.delete(T),_(Error("Timed out waiting for file index worker response"))},gA);A.unref(),this.pending.set(T,{resolve:(R)=>{clearTimeout(A),f(R)},reject:(R)=>{clearTimeout(A),_(R)}})}),g={type:"index",requestId:T,cwd:n};return this.worker.postMessage(g),m}flushPending(n){for(let[T,m]of this.pending.entries())m.reject(n),this.pending.delete(T)}}rA();var bm;function MA(){if(!Qf)return null;if(bm===void 0)bm=new zf;return bm}async function UA(n){let T=MA();if(!T)return vm(n);try{let m=await T.requestIndex(n);return new Set(m)}catch{return vm(n)}}async function Xn(n,T={}){let m=T.ttlMs??mA,g=Date.now(),f=Pm.get(n);if(f&&m>0&&g-f.lastBuiltAt<=m&&f.files.size>0)return f.files;if(f?.pending)return f.pending;let _=UA(n).then((A)=>{return Pm.set(n,{files:A,lastBuiltAt:Date.now(),pending:null}),A});return Pm.set(n,{files:f?.files??new Set,lastBuiltAt:f?.lastBuiltAt??0,pending:_}),_}async function Ff(n,T={}){await Xn(n,{...T,ttlMs:0})}import{stat as yA}from"node:fs/promises";import Vn from"node:path";var EA=/[),.:;!?`'"]+$/,$A=/^[(`'"]+/;function hA(n){let T=n.matchAll(/(^|[\s])@([^\s]+)/g),m=[];for(let g of T){let f=(g[2]??"").trim();if(f.length===0)continue;let _=f.replace($A,"").replace(EA,"");if(_.length===0||_.includes("@"))continue;m.push(_)}return Array.from(new Set(m))}function DA(n,T){let m=n.replace(/\\/g,"/"),g=Vn.isAbsolute(m)?Vn.resolve(m):Vn.resolve(T,m),f=Vn.relative(T,g);if(f.startsWith("..")||Vn.isAbsolute(f))return;return f.split(Vn.sep).join("/")}async function qT(n,T,m={}){let g=hA(n);if(g.length===0)return{prompt:n,matchedFiles:[],ignoredMentions:[]};let{maxFiles:f,maxFileBytes:_,maxTotalBytes:A}=m,R=await Xn(T,{ttlMs:m.ttlMs}),r=[],M=[],U=[],y=0;for(let $ of g){if(f&&U.length>=f){M.push($);continue}let h=DA($,T);if(!h||!R.has(h)){M.push($);continue}if(!_||!A){r.push(h);continue}let L=Vn.join(T,h);try{if(!(await yA(L)).isFile()){M.push($);continue}let E=y+_;if(E>A){M.push($);continue}y+=E,r.push(h)}catch{M.push($)}}return{prompt:n,matchedFiles:r,ignoredMentions:M}}var LA=["ts","tsx","js","jsx","mjs","cjs","json","md","mdx","txt","yaml","yml","toml","py","rb","go","rs","java","kt","swift","c","cpp","h","hpp","css","scss","less","html","vue","svelte","sql","sh","bash","zsh","fish","ps1","env","gitignore","dockerignore","editorconfig"],WA=["node_modules",".git","dist","build",".next","coverage","__pycache__",".venv","venv",".cache",".turbo",".output","out","target","bin","obj"];function OA(n,T,m,g){let f=n.split("/"),_=f[f.length-1]??"";if(f.length-1>g)return!1;for(let r=0;r<f.length-1;r++)if(T.has(f[r]??""))return!1;let R=HT.posix.extname(_).slice(1).toLowerCase();return m.has(R)||!R&&!_.startsWith(".")}function PT(n={}){let{includeExtensions:T=LA,excludeDirs:m=WA,maxResults:g=100,contextLines:f=2,maxDepth:_=20}=n,A=new Set(m),R=new Set(T.map((r)=>r.toLowerCase()));return async(r,M,U)=>{let y;try{y=new RegExp(r,"gim")}catch(E){throw Error(`Invalid regex pattern: ${r}. ${E instanceof Error?E.message:""}`)}let $=[],h=0,L=await Xn(M);for(let E of L){if(!OA(E,A,R,_))continue;if($.length>=g)break;h++;let Y=HT.join(M,E);try{let j=(await qf.readFile(Y,"utf-8")).split(`
|
|
87
|
+
`);for(let Q=0;Q<j.length;Q++){let b=j[Q];y.lastIndex=0;let v;while((v=y.exec(b))!==null){if($.length>=g)break;let Z=Math.max(0,Q-f),k=Math.min(j.length-1,Q+f),J=[];for(let V=Z;V<=k;V++){let s=V===Q?">":" ";J.push(`${s} ${V+1}: ${j[V]}`)}if($.push({file:E,line:Q+1,column:v.index+1,match:v[0],context:J}),v.index===y.lastIndex)y.lastIndex++}}}catch{}}if($.length===0)return`No results found for pattern: ${r}
|
|
88
|
+
Searched ${h} files.`;let W=[`Found ${$.length} result${$.length===1?"":"s"} for pattern: ${r}`,`Searched ${h} files.`,""];for(let E of $)W.push(`${E.file}:${E.line}:${E.column}`),W.push(...E.context),W.push("");if($.length>=g)W.push(`(Showing first ${g} results. Refine your search for more specific results.)`);return W.join(`
|
|
89
|
+
`)}}function CA(n){return n.replace(/<script[^>]*>[\s\S]*?<\/script>/gi,"").replace(/<style[^>]*>[\s\S]*?<\/style>/gi,"").replace(/<!--[\s\S]*?-->/g,"").replace(/<(p|div|br|hr|h[1-6]|li|tr)[^>]*>/gi,`
|
|
90
|
+
`).replace(/<[^>]+>/g," ").replace(/ /g," ").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/&#(\d+);/g,(T,m)=>String.fromCharCode(parseInt(m,10))).replace(/\s+/g," ").replace(/\n\s+/g,`
|
|
91
|
+
`).replace(/\n{3,}/g,`
|
|
92
|
+
|
|
93
|
+
`).trim()}function bT(n={}){let{timeoutMs:T=30000,maxResponseBytes:m=5000000,userAgent:g="Mozilla/5.0 (compatible; AgentBot/1.0)",headers:f={},followRedirects:_=!0}=n;return async(A,R,r)=>{let M;try{M=new URL(A)}catch{throw Error(`Invalid URL: ${A}`)}if(!["http:","https:"].includes(M.protocol))throw Error(`Invalid protocol: ${M.protocol}. Only http and https are supported.`);let U=new AbortController,y=setTimeout(()=>U.abort(),T),$;if(r.abortSignal)$=()=>U.abort(),r.abortSignal.addEventListener("abort",$);try{let h=await fetch(A,{method:"GET",headers:{"User-Agent":g,Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7","Accept-Language":"en-US,en;q=0.9",...f},redirect:_?"follow":"manual",signal:U.signal});if(clearTimeout(y),!_&&h.status>=300&&h.status<400)return`Redirect to: ${h.headers.get("location")}`;if(!h.ok)throw Error(`HTTP ${h.status}: ${h.statusText}`);let L=h.headers.get("content-type")||"",W=h.body?.getReader();if(!W)throw Error("Failed to read response body");let E=[],Y=0;while(!0){let{done:Z,value:k}=await W.read();if(Z)break;if(Y+=k.length,Y>m)throw W.cancel(),Error(`Response too large: exceeded ${m} bytes`);E.push(k)}let D=new Uint8Array(Y),j=0;for(let Z of E)D.set(Z,j),j+=Z.length;let Q=new TextDecoder("utf-8").decode(D),b;if(L.includes("text/html")||L.includes("application/xhtml"))b=CA(Q);else if(L.includes("application/json"))try{let Z=JSON.parse(Q);b=JSON.stringify(Z,null,2)}catch{b=Q}else b=Q;let v=[`URL: ${A}`,`Content-Type: ${L}`,`Size: ${Y} bytes`,"","--- Content ---",b.slice(0,50000)];if(b.length>50000)v.push(`
|
|
94
|
+
[Content truncated: showing first 50000 of ${b.length} characters]`);return v.push("","--- Analysis Request ---",`Prompt: ${R}`),v.join(`
|
|
95
|
+
`)}catch(h){if(clearTimeout(y),h instanceof Error){if(h.name==="AbortError")throw Error(`Request timed out after ${T}ms`);throw h}throw Error(`Fetch failed: ${String(h)}`)}finally{if(r.abortSignal&&$)r.abortSignal.removeEventListener("abort",$)}}}function uT(n={}){return{readFile:FT(n.fileRead),search:PT(n.search),bash:QT(n.bash),webFetch:bT(n.webFetch),applyPatch:BT(n.applyPatch),editor:ZT(n.editor)}}var NA={read_files:"enableReadFiles",search_codebase:"enableSearch",run_commands:"enableBash",fetch_web_content:"enableWebFetch",apply_patch:"enableApplyPatch",editor:"enableEditor",skills:"enableSkills",ask_question:"enableAskQuestion"},Gm=[{name:"openai-native-use-apply-patch",mode:"act",providerIdIncludes:["openai-native"],enableTools:["apply_patch"],disableTools:["editor"]},{name:"codex-and-gpt-use-apply-patch",mode:"act",modelIdIncludes:["codex","gpt"],enableTools:["apply_patch"],disableTools:["editor"]}];function Hf(n,T){if(!T||T.length===0)return!0;let m=n.toLowerCase();return T.some((g)=>m.includes(g.toLowerCase()))}function YA(n,T,m,g){if(n.mode&&n.mode!=="any"&&n.mode!==g)return!1;return Hf(T,n.providerIdIncludes)&&Hf(m,n.modelIdIncludes)}function km(n,T,m,g){if(!g||g.length===0)return{};let f=new Map;for(let A of g){if(!YA(A,n,T,m))continue;for(let R of A.disableTools??[])f.set(R,!1);for(let R of A.enableTools??[])f.set(R,!0)}let _={};for(let[A,R]of f.entries())_[NA[A]]=R;return _}var Mn={browser:{enableReadFiles:!1,enableSearch:!1,enableBash:!1,enableWebFetch:!1,enableApplyPatch:!1,enableEditor:!1,enableSkills:!0,enableAskQuestion:!0},search:{enableReadFiles:!0,enableSearch:!0,enableBash:!1,enableWebFetch:!1,enableApplyPatch:!1,enableEditor:!1,enableSkills:!1,enableAskQuestion:!1},development:{enableReadFiles:!0,enableSearch:!0,enableBash:!0,enableWebFetch:!0,enableApplyPatch:!1,enableEditor:!0,enableSkills:!0,enableAskQuestion:!0},readonly:{enableReadFiles:!0,enableSearch:!0,enableBash:!0,enableWebFetch:!0,enableApplyPatch:!1,enableEditor:!1,enableSkills:!0,enableAskQuestion:!0},minimal:{enableReadFiles:!1,enableSearch:!1,enableBash:!1,enableWebFetch:!1,enableApplyPatch:!1,enableEditor:!1,enableSkills:!1,enableAskQuestion:!0},yolo:{enableReadFiles:!0,enableSearch:!0,enableBash:!0,enableWebFetch:!0,enableApplyPatch:!1,enableEditor:!0,enableSkills:!0,enableAskQuestion:!0}};function Pf(n){if(n!=="yolo")return{};let T={enabled:!0,autoApprove:!0},m={"*":T};for(let g of Yn)m[g]=T;return m}function bf(n,T){let m=Mn[n];return Qn({...m,...T})}function sn(n={}){let{executorOptions:T={},executors:m,...g}=n,f={...uT(T),...m??{}};return Qn({...g,executors:f})}var VA=p.object({name:p.string().trim().min(1),description:p.string().trim().min(1),modelId:p.string().trim().min(1).optional(),tools:p.union([p.string(),p.array(p.string())]).optional(),skills:p.union([p.string(),p.array(p.string())]).optional()}),KA=new Set(Yn);function uf(n){return/\.(yaml|yml)$/i.test(n)}function vf(n){return n.trim().toLowerCase()}function jA(n){let T=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/,m=n.match(T);if(!m)return{data:{},body:n,hadFrontmatter:!1};let[,g,f]=m;try{let _=XA.parse(g);return{data:_&&typeof _==="object"&&!Array.isArray(_)?_:{},body:f,hadFrontmatter:!0}}catch(_){let A=_ instanceof Error?_.message:String(_);return{data:{},body:n,hadFrontmatter:!0,parseError:A}}}function JA(n){let T=n.trim();if(!T)throw Error("Tool name cannot be empty.");if(!KA.has(T))throw Error(`Unknown tool '${T}'. Expected one of: ${Yn.join(", ")}.`);return T}function tA(n){if(!n)return[];let T=Array.isArray(n)?n:n.split(",");return Array.from(new Set(T.map(JA)))}function BA(n){let T=n.trim();if(!T)throw Error("Skill name cannot be empty.");return T}function QA(n){if(n===void 0)return;let T=Array.isArray(n)?n:n.split(",");return Array.from(new Set(T.map(BA)))}function zn(n){let{data:T,body:m,hadFrontmatter:g,parseError:f}=jA(n);if(f)throw Error(`Failed to parse YAML frontmatter: ${f}`);if(!g)throw Error("Missing YAML frontmatter block in agent config file.");let _=VA.parse(T),A=m.trim();if(!A)throw Error("Missing system prompt body in agent config file.");return{name:_.name,description:_.description,modelId:_.modelId,tools:tA(_.tools),skills:QA(_.skills),systemPrompt:A}}function vT(n,T){if(n.length===0)return[];let m=new Map(T.map((g)=>[g.name,g]));return n.map((g)=>{let f=m.get(g);if(!f)throw Error(`Configured tool '${g}' is unavailable. Available tools: ${T.map((_)=>_.name).join(", ")}.`);return f})}function GT(n,T){let m={systemPrompt:n.systemPrompt};if(n.modelId)m.modelId=n.modelId;if(n.tools.length>0){if(!T?.availableTools)throw Error("Configured tools cannot be converted into AgentConfig.tools without availableTools.");m.tools=vT(n.tools,T.availableTools)}return m}function Sm(n,T){let m=zn(n);return GT(m,T)}import{createHash as ZA}from"node:crypto";import{watch as zA}from"node:fs";import{readdir as FA,readFile as qA}from"node:fs/promises";import{join as HA}from"node:path";function PA(n){return ZA("sha1").update(n).digest("hex")}function bA(n){return Boolean(n&&typeof n==="object"&&"code"in n)}function Gf(n){return bA(n)&&n.code==="ENOENT"}class Kn{definitions;debounceMs;emitParseErrors;listeners=new Set;recordsByType=new Map;watchersByDirectory=new Map;baseTypesByDirectory=new Map;watchedTypesByDirectory=new Map;discoveredDirectoriesByType=new Map;definitionsByType=new Map;pendingTypes=new Set;flushTimer;refreshQueue=Promise.resolve();started=!1;constructor(n,T){if(n.length===0)throw Error("UnifiedConfigFileWatcher requires at least one definition.");this.definitions=n,this.debounceMs=T?.debounceMs??75,this.emitParseErrors=T?.emitParseErrors??!1;for(let m of n){if(this.definitionsByType.has(m.type))throw Error(`Duplicate unified config definition type '${m.type}'.`);this.definitionsByType.set(m.type,m),this.recordsByType.set(m.type,new Map),this.discoveredDirectoriesByType.set(m.type,new Set);for(let g of m.directories){let f=this.baseTypesByDirectory.get(g);if(f)f.add(m.type);else this.baseTypesByDirectory.set(g,new Set([m.type]))}}}subscribe(n){return this.listeners.add(n),()=>{this.listeners.delete(n)}}async start(){if(this.started)return;this.started=!0,await this.refreshAll(),this.startDirectoryWatchers()}stop(){if(this.started=!1,this.flushTimer)clearTimeout(this.flushTimer),this.flushTimer=void 0;this.pendingTypes.clear();for(let n of this.watchersByDirectory.values())n.close();this.watchersByDirectory.clear(),this.watchedTypesByDirectory=new Map}async refreshAll(){await this.enqueueRefresh(async()=>{for(let n of this.definitions)await this.refreshTypeInternal(n)})}async refreshType(n){let T=this.definitionsByType.get(n);if(!T)throw Error(`Unknown unified config type '${n}'.`);await this.enqueueRefresh(async()=>{await this.refreshTypeInternal(T)})}getSnapshot(n){let T=this.recordsByType.get(n);return new Map([...T?.entries()??[]].map(([m,g])=>[m,{...g}]))}getAllSnapshots(){let n=new Map;for(let[T,m]of this.recordsByType.entries())n.set(T,new Map([...m.entries()].map(([g,f])=>[g,{...f}])));return n}emit(n){for(let T of this.listeners)T(n)}enqueueRefresh(n){return this.refreshQueue=this.refreshQueue.then(n,n),this.refreshQueue}startDirectoryWatchers(){this.syncDirectoryWatchers()}syncDirectoryWatchers(){let n=this.buildDesiredTypesByDirectory();for(let[T,m]of this.watchersByDirectory.entries()){if(n.has(T))continue;m.close(),this.watchersByDirectory.delete(T)}this.watchedTypesByDirectory=n;for(let T of n.keys()){if(this.watchersByDirectory.has(T))continue;try{let m=zA(T,()=>{let g=this.watchedTypesByDirectory.get(T);if(!g)return;for(let f of g)this.pendingTypes.add(f);this.scheduleFlush()});this.watchersByDirectory.set(T,m),m.on("error",(g)=>{let f=this.watchedTypesByDirectory.get(T);if(!f)return;for(let _ of f)this.emit({kind:"error",type:_,error:g,filePath:T})})}catch(m){if(!Gf(m)){let g=n.get(T);if(!g)continue;for(let f of g)this.emit({kind:"error",type:f,error:m,filePath:T})}}}}scheduleFlush(){if(this.flushTimer)clearTimeout(this.flushTimer);this.flushTimer=setTimeout(()=>{this.flushTimer=void 0;let n=[...this.pendingTypes];this.pendingTypes.clear(),this.enqueueRefresh(async()=>{for(let T of n){let m=this.definitionsByType.get(T);if(!m)continue;await this.refreshTypeInternal(m)}})},this.debounceMs)}async refreshTypeInternal(n){let{records:T,discoveredDirectories:m}=await this.loadDefinition(n),g=this.recordsByType.get(n.type)??new Map;for(let[f,_]of g.entries()){if(T.has(f))continue;this.emit({kind:"remove",type:n.type,id:f,filePath:_.filePath})}for(let[f,_]of T.entries()){let A=g.get(f);if(A&&A.filePath===_.filePath&&A.fingerprint===_.fingerprint)continue;this.emit({kind:"upsert",record:{type:_.type,id:f,item:_.item,filePath:_.filePath}})}if(this.recordsByType.set(n.type,T),this.discoveredDirectoriesByType.set(n.type,m),this.started)this.syncDirectoryWatchers()}async loadDefinition(n){let T=new Map,m=new Set;for(let g of n.directories){m.add(g);let f=n.discoverFiles?await n.discoverFiles(g):await this.readDirectoryFileCandidates(g);for(let _ of f){let{fileName:A,filePath:R}=_;if(m.add(_.directoryPath),n.includeFile&&!n.includeFile(A,R))continue;try{let r=await qA(R,"utf8"),M={type:n.type,directoryPath:_.directoryPath,fileName:A,filePath:R,content:r},U=n.parseFile(M),y=n.resolveId(U,M).trim();if(!y)continue;T.set(y,{type:n.type,id:y,item:U,filePath:R,fingerprint:PA(r)})}catch(r){if(this.emitParseErrors)this.emit({kind:"error",type:n.type,error:r,filePath:R})}}}return{records:T,discoveredDirectories:m}}buildDesiredTypesByDirectory(){let n=new Map;for(let[T,m]of this.baseTypesByDirectory.entries())n.set(T,new Set(m));for(let[T,m]of this.discoveredDirectoriesByType.entries())for(let g of m){let f=n.get(g);if(f)f.add(T);else n.set(g,new Set([T]))}return n}async readDirectoryFileCandidates(n){try{return(await FA(n,{withFileTypes:!0})).filter((m)=>m.isFile()).map((m)=>({directoryPath:n,fileName:m.name,filePath:HA(n,m.name)})).sort((m,g)=>m.fileName.localeCompare(g.fileName))}catch(T){if(Gf(T))return[];throw T}}}function kf(){return Jm()}function uA(n){if(Array.isArray(n))return[...n];if(typeof n==="string")return[n];return kf()}function cm(n){return{type:"agent",directories:uA(n),includeFile:(T)=>uf(T),parseFile:(T)=>zn(T.content),resolveId:(T)=>vf(T.name)}}function Sf(n){return new Kn([cm(n?.directoryPathOrPaths)],{debounceMs:n?.debounceMs,emitParseErrors:n?.emitParseErrors})}import{existsSync as vA,readdirSync as GA}from"node:fs";import{basename as kA,extname as SA,join as cA}from"node:path";function Im(n){return tm(n)}var kT;((M)=>{M.TaskStart="TaskStart";M.TaskResume="TaskResume";M.TaskCancel="TaskCancel";M.TaskComplete="TaskComplete";M.PreToolUse="PreToolUse";M.PostToolUse="PostToolUse";M.UserPromptSubmit="UserPromptSubmit";M.PreCompact="PreCompact";M.SessionShutdown="SessionShutdown"})(kT||={});var xm={["TaskStart"]:"agent_start",["TaskResume"]:"agent_resume",["TaskCancel"]:"agent_abort",["TaskComplete"]:"agent_end",["PreToolUse"]:"tool_call",["PostToolUse"]:"tool_result",["UserPromptSubmit"]:"prompt_submit",["PreCompact"]:void 0,["SessionShutdown"]:"session_shutdown"},IA=new Map(Object.values(kT).map((n)=>[n.toLowerCase(),n]));function wm(n){let T=kA(n,SA(n)).trim().toLowerCase();return IA.get(T)}function ST(n){let T=[],m=new Set,g=Im(n).filter((f)=>vA(f));for(let f of g)try{for(let _ of GA(f,{withFileTypes:!0})){if(!_.isFile())continue;let A=wm(_.name);if(!A)continue;let R=cA(f,_.name);if(m.has(R))continue;m.add(R),T.push({fileName:A,hookEventName:xm[A],path:R})}}catch{}return T.sort((f,_)=>f.path.localeCompare(_.path))}import{existsSync as lm,readdirSync as dA,statSync as eA}from"node:fs";import{join as sA,resolve as af}from"node:path";import{resolve as xA}from"node:path";import{pathToFileURL as wA}from"node:url";function If(n){return typeof n==="object"&&n!==null}function cf(n){return Array.isArray(n)&&n.every((T)=>typeof T==="string")}function aA(n,T){if(!If(n.manifest))throw Error(`Invalid plugin module at ${T}: missing required "manifest"`);if(!cf(n.manifest.capabilities))throw Error(`Invalid plugin module at ${T}: manifest.capabilities must be a string array`);if(n.manifest.capabilities.length===0)throw Error(`Invalid plugin module at ${T}: manifest.capabilities cannot be empty`);if(Object.hasOwn(n.manifest,"hookStages")&&!cf(n.manifest.hookStages))throw Error(`Invalid plugin module at ${T}: manifest.hookStages must be a string array when provided`)}function iA(n,T){if(!If(n))throw Error(`Invalid plugin module at ${T}: expected object export`);if(typeof n.name!=="string"||n.name.length===0)throw Error(`Invalid plugin module at ${T}: expected non-empty "name"`);if(!Object.hasOwn(n,"manifest"))throw Error(`Invalid plugin module at ${T}: missing required "manifest"`);aA(n,T)}async function am(n,T={}){let m=xA(T.cwd??process.cwd(),n),g=await import(wA(m).href),f=T.exportName??"plugin",_=g.default??g[f];return iA(_,m),_}async function cT(n,T={}){let m=[];for(let g of n)m.push(await am(g,T));return m}import{spawn as lA}from"node:child_process";function xf(n){if(n instanceof Error)return n;return Error(String(n))}class IT{options;process=null;requestCounter=0;pending=new Map;constructor(n){this.options=n}start(){if(this.process&&this.process.exitCode===null)return;let n=lA(process.execPath,["-e",this.options.bootstrapScript],{stdio:["ignore","ignore","ignore","ipc"]});this.process=n,n.on("message",(T)=>{this.onMessage(T)}),n.on("error",(T)=>{this.failPending(Error(`${this.options.name??"sandbox"} process error: ${xf(T).message}`))}),n.on("exit",(T,m)=>{this.process=null,this.failPending(Error(`${this.options.name??"sandbox"} process exited (code=${String(T)}, signal=${String(m)})`))})}async call(n,T,m={}){this.start();let g=this.process;if(!g||g.exitCode!==null)throw Error(`${this.options.name??"sandbox"} process is not available`);let f=`req_${++this.requestCounter}`,_={type:"call",id:f,method:n,args:T};return await new Promise((A,R)=>{let r={resolve:(M)=>A(M),reject:R};if((m.timeoutMs??0)>0)r.timeout=setTimeout(()=>{this.pending.delete(f),this.shutdown().catch(()=>{}),R(Error(`${this.options.name??"sandbox"} call timed out after ${m.timeoutMs}ms: ${n}`))},m.timeoutMs);this.pending.set(f,r),g.send(_,(M)=>{if(!M)return;let U=this.pending.get(f);if(!U)return;if(this.pending.delete(f),U.timeout)clearTimeout(U.timeout);U.reject(Error(`${this.options.name??"sandbox"} failed to send call "${n}": ${xf(M).message}`))})})}async shutdown(){let n=this.process;if(this.process=null,!n||n.exitCode!==null){this.failPending(Error(`${this.options.name??"sandbox"} shutdown`));return}await new Promise((T)=>{let m=setTimeout(()=>{try{n.kill("SIGKILL")}catch{}T()},300);n.once("exit",()=>{clearTimeout(m),T()});try{n.kill("SIGTERM")}catch{clearTimeout(m),T()}}),this.failPending(Error(`${this.options.name??"sandbox"} shutdown`))}onMessage(n){if(!n||n.type!=="response"||!n.id)return;let T=this.pending.get(n.id);if(!T)return;if(this.pending.delete(n.id),T.timeout)clearTimeout(T.timeout);if(n.ok){T.resolve(n.result);return}T.reject(Error(n.error?.message||`${this.options.name??"sandbox"} call failed`))}failPending(n){for(let[T,m]of this.pending.entries()){if(this.pending.delete(T),m.timeout)clearTimeout(m.timeout);m.reject(n)}}}var pA=`
|
|
96
|
+
const { pathToFileURL } = require("node:url");
|
|
97
|
+
let pluginCounter = 0;
|
|
98
|
+
const pluginState = new Map();
|
|
99
|
+
|
|
100
|
+
function toErrorPayload(error) {
|
|
101
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
102
|
+
const stack = error instanceof Error ? error.stack : undefined;
|
|
103
|
+
return { message, stack };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function sendResponse(id, ok, result, error) {
|
|
107
|
+
if (!process.send) return;
|
|
108
|
+
process.send({ type: "response", id, ok, result, error });
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function sanitizeObject(value) {
|
|
112
|
+
if (!value || typeof value !== "object") return {};
|
|
113
|
+
return value;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function initialize(args) {
|
|
117
|
+
const descriptors = [];
|
|
118
|
+
const exportName = (args && args.exportName) || "plugin";
|
|
119
|
+
for (const pluginPath of args.pluginPaths || []) {
|
|
120
|
+
const moduleExports = await import(pathToFileURL(pluginPath).href);
|
|
121
|
+
const plugin = moduleExports.default || moduleExports[exportName];
|
|
122
|
+
if (!plugin || typeof plugin !== "object") {
|
|
123
|
+
throw new Error(\`Invalid plugin module: \${pluginPath}\`);
|
|
124
|
+
}
|
|
125
|
+
if (typeof plugin.name !== "string" || !plugin.name) {
|
|
126
|
+
throw new Error(\`Invalid plugin name: \${pluginPath}\`);
|
|
127
|
+
}
|
|
128
|
+
if (!plugin.manifest || typeof plugin.manifest !== "object") {
|
|
129
|
+
throw new Error(\`Invalid plugin manifest: \${pluginPath}\`);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const pluginId = \`plugin_\${++pluginCounter}\`;
|
|
133
|
+
const contributions = {
|
|
134
|
+
tools: [],
|
|
135
|
+
commands: [],
|
|
136
|
+
shortcuts: [],
|
|
137
|
+
flags: [],
|
|
138
|
+
messageRenderers: [],
|
|
139
|
+
providers: [],
|
|
140
|
+
};
|
|
141
|
+
const handlers = {
|
|
142
|
+
tools: new Map(),
|
|
143
|
+
commands: new Map(),
|
|
144
|
+
messageRenderers: new Map(),
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
const makeId = (prefix) => \`\${pluginId}_\${prefix}_\${Math.random().toString(36).slice(2, 10)}\`;
|
|
148
|
+
const api = {
|
|
149
|
+
registerTool: (tool) => {
|
|
150
|
+
const id = makeId("tool");
|
|
151
|
+
handlers.tools.set(id, tool.execute);
|
|
152
|
+
contributions.tools.push({
|
|
153
|
+
id,
|
|
154
|
+
name: tool.name,
|
|
155
|
+
description: tool.description,
|
|
156
|
+
inputSchema: tool.inputSchema,
|
|
157
|
+
timeoutMs: tool.timeoutMs,
|
|
158
|
+
retryable: tool.retryable,
|
|
159
|
+
});
|
|
160
|
+
},
|
|
161
|
+
registerCommand: (command) => {
|
|
162
|
+
const id = makeId("command");
|
|
163
|
+
if (typeof command.handler === "function") {
|
|
164
|
+
handlers.commands.set(id, command.handler);
|
|
165
|
+
}
|
|
166
|
+
contributions.commands.push({
|
|
167
|
+
id,
|
|
168
|
+
name: command.name,
|
|
169
|
+
description: command.description,
|
|
170
|
+
});
|
|
171
|
+
},
|
|
172
|
+
registerShortcut: (shortcut) => {
|
|
173
|
+
contributions.shortcuts.push({
|
|
174
|
+
id: makeId("shortcut"),
|
|
175
|
+
name: shortcut.name,
|
|
176
|
+
value: shortcut.value,
|
|
177
|
+
description: shortcut.description,
|
|
178
|
+
});
|
|
179
|
+
},
|
|
180
|
+
registerFlag: (flag) => {
|
|
181
|
+
contributions.flags.push({
|
|
182
|
+
id: makeId("flag"),
|
|
183
|
+
name: flag.name,
|
|
184
|
+
description: flag.description,
|
|
185
|
+
defaultValue: flag.defaultValue,
|
|
186
|
+
});
|
|
187
|
+
},
|
|
188
|
+
registerMessageRenderer: (renderer) => {
|
|
189
|
+
const id = makeId("renderer");
|
|
190
|
+
handlers.messageRenderers.set(id, renderer.render);
|
|
191
|
+
contributions.messageRenderers.push({ id, name: renderer.name });
|
|
192
|
+
},
|
|
193
|
+
registerProvider: (provider) => {
|
|
194
|
+
contributions.providers.push({
|
|
195
|
+
id: makeId("provider"),
|
|
196
|
+
name: provider.name,
|
|
197
|
+
description: provider.description,
|
|
198
|
+
metadata: sanitizeObject(provider.metadata),
|
|
199
|
+
});
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
if (typeof plugin.setup === "function") {
|
|
204
|
+
await plugin.setup(api);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
pluginState.set(pluginId, { plugin, handlers });
|
|
208
|
+
descriptors.push({
|
|
209
|
+
pluginId,
|
|
210
|
+
name: plugin.name,
|
|
211
|
+
manifest: plugin.manifest,
|
|
212
|
+
contributions,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
return descriptors;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function getPlugin(pluginId) {
|
|
219
|
+
const state = pluginState.get(pluginId);
|
|
220
|
+
if (!state) {
|
|
221
|
+
throw new Error(\`Unknown sandbox plugin id: \${pluginId}\`);
|
|
222
|
+
}
|
|
223
|
+
return state;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
async function invokeHook(args) {
|
|
227
|
+
const state = getPlugin(args.pluginId);
|
|
228
|
+
const handler = state.plugin[args.hookName];
|
|
229
|
+
if (typeof handler !== "function") {
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
return await handler(args.payload);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
async function executeTool(args) {
|
|
236
|
+
const state = getPlugin(args.pluginId);
|
|
237
|
+
const handler = state.handlers.tools.get(args.contributionId);
|
|
238
|
+
if (typeof handler !== "function") {
|
|
239
|
+
throw new Error("Unknown sandbox tool contribution");
|
|
240
|
+
}
|
|
241
|
+
return await handler(args.input, args.context);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
async function executeCommand(args) {
|
|
245
|
+
const state = getPlugin(args.pluginId);
|
|
246
|
+
const handler = state.handlers.commands.get(args.contributionId);
|
|
247
|
+
if (typeof handler !== "function") {
|
|
248
|
+
return "";
|
|
249
|
+
}
|
|
250
|
+
return await handler(args.input);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
async function renderMessage(args) {
|
|
254
|
+
const state = getPlugin(args.pluginId);
|
|
255
|
+
const handler = state.handlers.messageRenderers.get(args.contributionId);
|
|
256
|
+
if (typeof handler !== "function") {
|
|
257
|
+
return "";
|
|
258
|
+
}
|
|
259
|
+
return await handler(args.message);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
const methods = { initialize, invokeHook, executeTool, executeCommand, renderMessage };
|
|
263
|
+
|
|
264
|
+
process.on("message", async (message) => {
|
|
265
|
+
if (!message || message.type !== "call") {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
const method = methods[message.method];
|
|
269
|
+
if (!method) {
|
|
270
|
+
sendResponse(message.id, false, undefined, { message: \`Unknown method: \${String(message.method)}\` });
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
try {
|
|
274
|
+
const result = await method(message.args || {});
|
|
275
|
+
sendResponse(message.id, true, result);
|
|
276
|
+
} catch (error) {
|
|
277
|
+
sendResponse(message.id, false, undefined, toErrorPayload(error));
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
`;function Un(n,T){return n.manifest.hookStages?.includes(T)===!0}function im(n,T){return typeof n==="number"&&n>0?n:T}async function wf(n){let T=new IT({name:"plugin-sandbox",bootstrapScript:pA}),m=im(n.importTimeoutMs,4000),g=im(n.hookTimeoutMs,3000),f=im(n.contributionTimeoutMs,5000),_;try{_=await T.call("initialize",{pluginPaths:n.pluginPaths,exportName:n.exportName},{timeoutMs:m})}catch(R){throw await T.shutdown().catch(()=>{}),R}return{extensions:_.map((R)=>{let r={name:R.name,manifest:R.manifest,setup:(M)=>{for(let U of R.contributions.tools){let y={name:U.name,description:U.description??"",inputSchema:U.inputSchema??{type:"object",properties:{}},timeoutMs:U.timeoutMs,retryable:U.retryable,execute:async($,h)=>await T.call("executeTool",{pluginId:R.pluginId,contributionId:U.id,input:$,context:h},{timeoutMs:f})};M.registerTool(y)}for(let U of R.contributions.commands)M.registerCommand({name:U.name,description:U.description,handler:async(y)=>await T.call("executeCommand",{pluginId:R.pluginId,contributionId:U.id,input:y},{timeoutMs:f})});for(let U of R.contributions.shortcuts)M.registerShortcut({name:U.name,value:U.value??"",description:U.description});for(let U of R.contributions.flags)M.registerFlag({name:U.name,description:U.description,defaultValue:U.defaultValue});for(let U of R.contributions.messageRenderers)M.registerMessageRenderer({name:U.name,render:()=>`[sandbox renderer ${U.name} requires async bridge]`});for(let U of R.contributions.providers)M.registerProvider({name:U.name,description:U.description,metadata:U.metadata})}};if(Un(r,"input"))r.onInput=async(M)=>await T.call("invokeHook",{pluginId:R.pluginId,hookName:"onInput",payload:M},{timeoutMs:g});if(Un(r,"session_start"))r.onSessionStart=async(M)=>await T.call("invokeHook",{pluginId:R.pluginId,hookName:"onSessionStart",payload:M},{timeoutMs:g});if(Un(r,"before_agent_start"))r.onBeforeAgentStart=async(M)=>await T.call("invokeHook",{pluginId:R.pluginId,hookName:"onBeforeAgentStart",payload:M},{timeoutMs:g});if(Un(r,"tool_call_before"))r.onToolCall=async(M)=>await T.call("invokeHook",{pluginId:R.pluginId,hookName:"onToolCall",payload:M},{timeoutMs:g});if(Un(r,"tool_call_after"))r.onToolResult=async(M)=>await T.call("invokeHook",{pluginId:R.pluginId,hookName:"onToolResult",payload:M},{timeoutMs:g});if(Un(r,"turn_end"))r.onAgentEnd=async(M)=>await T.call("invokeHook",{pluginId:R.pluginId,hookName:"onAgentEnd",payload:M},{timeoutMs:g});if(Un(r,"session_shutdown"))r.onSessionShutdown=async(M)=>await T.call("invokeHook",{pluginId:R.pluginId,hookName:"onSessionShutdown",payload:M},{timeoutMs:g});if(Un(r,"runtime_event"))r.onRuntimeEvent=async(M)=>{await T.call("invokeHook",{pluginId:R.pluginId,hookName:"onRuntimeEvent",payload:M},{timeoutMs:g})};if(Un(r,"error"))r.onError=async(M)=>{await T.call("invokeHook",{pluginId:R.pluginId,hookName:"onError",payload:M},{timeoutMs:g})};return r}),shutdown:async()=>{await T.shutdown()}}}var lf=new Set([".js",".mjs",".cjs",".ts",".mts",".cts"]);function pm(n){return Zm(n)}function pf(n){let T=n.lastIndexOf(".");if(T===-1)return!1;return lf.has(n.slice(T))}function xT(n){let T=af(n);if(!lm(T))return[];let m=[],g=[T];while(g.length>0){let f=g.pop();if(!f)continue;for(let _ of dA(f,{withFileTypes:!0})){let A=sA(f,_.name);if(_.isDirectory()){g.push(A);continue}if(_.isFile()&&pf(A))m.push(A)}}return m.sort((f,_)=>f.localeCompare(_))}function oA(n,T){let m=[];for(let g of n){let f=g.trim();if(!f)continue;let _=af(T,f);if(!lm(_))throw Error(`Plugin path does not exist: ${_}`);if(eA(_).isDirectory()){m.push(...xT(_));continue}if(!pf(_))throw Error(`Plugin file must use a supported extension (${[...lf].join(", ")}): ${_}`);m.push(_)}return m}function dm(n={}){let T=n.cwd??process.cwd(),m=pm(n.workspacePath).flatMap((A)=>xT(A)).filter((A)=>lm(A)),g=oA(n.pluginPaths??[],T),f=[],_=new Set;for(let A of[...g,...m]){if(_.has(A))continue;_.add(A),f.push(A)}return f}async function wT(n={}){let T=dm(n);if(T.length===0)return{extensions:[]};if(n.mode==="in_process")return{extensions:await cT(T,{cwd:n.cwd,exportName:n.exportName})};let m=await wf({pluginPaths:T,exportName:n.exportName,importTimeoutMs:n.importTimeoutMs,hookTimeoutMs:n.hookTimeoutMs,contributionTimeoutMs:n.contributionTimeoutMs});return{extensions:m.extensions??[],shutdown:m.shutdown}}import{readdir as df,stat as nR}from"node:fs/promises";import{basename as dT,dirname as TR,extname as em,join as aT}from"node:path";import mR from"yaml";var iT="SKILL.md",gR=new Set([".md",".markdown",".txt"]);function sm(n){return n.trim().toLowerCase()}function lT(n){return gR.has(em(n).toLowerCase())}function om(n){let T=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/,m=n.match(T);if(!m)return{data:{},body:n,hadFrontmatter:!1};let[,g,f]=m;try{let _=mR.parse(g);return{data:_&&typeof _==="object"&&!Array.isArray(_)?_:{},body:f,hadFrontmatter:!0}}catch(_){let A=_ instanceof Error?_.message:String(_);return{data:{},body:n,hadFrontmatter:!0,parseError:A}}}function pT(n,T,m){if(n===void 0||n===null){if(m)throw Error(`Missing required frontmatter field '${T}'.`);return}if(typeof n!=="string")throw Error(`Frontmatter field '${T}' must be a string.`);let g=n.trim();if(!g&&m)throw Error(`Frontmatter field '${T}' cannot be empty.`);return g||void 0}function Fn(n,T){if(n===void 0||n===null)return;if(typeof n!=="boolean")throw Error(`Frontmatter field '${T}' must be a boolean.`);return n}function ng(n,T){let{data:m,body:g,parseError:f}=om(n);if(f)throw Error(`Failed to parse YAML frontmatter: ${f}`);let _=g.trim();if(!_)throw Error("Missing instructions body in skill file.");let R=pT(m.name,"name",!1)??T.trim();if(!R)throw Error("Missing skill name.");return{name:R,description:pT(m.description,"description",!1),disabled:Fn(m.disabled,"disabled")??(Fn(m.enabled,"enabled")===!1?!0:void 0),instructions:_,frontmatter:m}}function Tg(n,T){let{data:m,body:g,parseError:f}=om(n);if(f)throw Error(`Failed to parse YAML frontmatter: ${f}`);let _=g.trim();if(!_)throw Error("Missing instructions body in rule file.");let A=pT(m.name,"name",!1)??T.trim();if(!A)throw Error("Missing rule name.");return{name:A,disabled:Fn(m.disabled,"disabled")??(Fn(m.enabled,"enabled")===!1?!0:void 0),instructions:_,frontmatter:m}}function mg(n,T){let{data:m,body:g,parseError:f}=om(n);if(f)throw Error(`Failed to parse YAML frontmatter: ${f}`);let _=g.trim();if(!_)throw Error("Missing instructions body in workflow file.");let A=pT(m.name,"name",!1)??T.trim();if(!A)throw Error("Missing workflow name.");return{name:A,disabled:Fn(m.disabled,"disabled")??(Fn(m.enabled,"enabled")===!1?!0:void 0),instructions:_,frontmatter:m}}function gg(n){return dn(n)}function fg(n){return Bm(n)}function _g(n){return Qm(n)}async function fR(n){try{let T=await df(n,{withFileTypes:!0}),m=[];for(let g of T){if(g.isFile()&&g.name===iT){m.push({directoryPath:n,fileName:g.name,filePath:aT(n,g.name)});continue}if(g.isDirectory())m.push({directoryPath:aT(n,g.name),fileName:iT,filePath:aT(n,g.name,iT)})}return m}catch(T){if(T.code==="ENOENT")return[];throw T}}async function ef(n){try{if((await nR(n)).isFile())return[{directoryPath:TR(n),fileName:dT(n),filePath:n}]}catch(T){if(T.code!=="ENOENT")throw T}try{return(await df(n,{withFileTypes:!0})).filter((m)=>m.isFile()&&lT(m.name)).map((m)=>({directoryPath:n,fileName:m.name,filePath:aT(n,m.name)}))}catch(T){if(T.code==="ENOENT")return[];throw T}}function Ag(n){return{type:"skill",directories:n?.directories??gg(n?.workspacePath),discoverFiles:fR,includeFile:(m)=>m===iT,parseFile:(m)=>ng(m.content,dT(m.directoryPath)),resolveId:(m)=>sm(m.name)}}function Rg(n){return{type:"rule",directories:n?.directories??fg(n?.workspacePath),discoverFiles:ef,includeFile:(m,g)=>m===".clinerules"||lT(m)||lT(g),parseFile:(m)=>Tg(m.content,dT(m.filePath,em(m.filePath))),resolveId:(m)=>sm(m.name)}}function rg(n){return{type:"workflow",directories:n?.directories??_g(n?.workspacePath),discoverFiles:ef,includeFile:(m)=>lT(m),parseFile:(m)=>mg(m.content,dT(m.filePath,em(m.filePath))),resolveId:(m)=>sm(m.name)}}function eT(n){let T=[Ag(n?.skills),Rg(n?.rules),rg(n?.workflows)];return new Kn(T,{debounceMs:n?.debounceMs,emitParseErrors:n?.emitParseErrors})}function Mg(n){return{onAuth:({url:T,instructions:m})=>{if(n.onOutput?.(m??"Complete sign-in in your browser."),n.openUrl)Promise.resolve(n.openUrl(T)).catch((g)=>{n.onOpenUrlError?.({url:T,error:g})});n.onOutput?.(T)},onPrompt:n.onPrompt}}function _R(){let n;return{promise:new Promise((m)=>{n=m}),resolve:n}}async function jn(n){let T=await import("node:http"),m=n.host??"127.0.0.1",g=n.timeoutMs??300000,f=n.successHtml??AR,_=_R(),A=!1,R=null,r=null,M=($)=>{if(A)return;A=!0,_.resolve($)},U=()=>{if(R)clearTimeout(R),R=null;if(r)r.close(),r=null},y=async()=>{return R=setTimeout(()=>{U(),M(null)},g),_.promise};for(let $ of n.ports){let h=T.createServer((W,E)=>{try{let Y=new URL(W.url||"",`http://${m}:${$}`);if(Y.pathname!==n.callbackPath){E.statusCode=404,E.end("Not found");return}let D={url:Y,code:Y.searchParams.get("code")??void 0,state:Y.searchParams.get("state")??void 0,provider:Y.searchParams.get("provider")??void 0,error:Y.searchParams.get("error")??void 0};if(D.error){E.statusCode=400,E.end(`Authentication failed: ${D.error}`),U(),M(D);return}if(!D.code){E.statusCode=400,E.end("Missing authorization code");return}if(n.expectedState&&D.state!==n.expectedState){E.statusCode=400,E.end("State mismatch");return}E.statusCode=200,E.setHeader("Content-Type","text/html; charset=utf-8"),E.end(f),U(),M(D)}catch{E.statusCode=500,E.end("Internal error")}}),L=await new Promise((W)=>{let E=(Y)=>{h.off("error",E),W({bound:!1,error:Y})};h.once("error",E),h.listen($,m,()=>{h.off("error",E),r=h,W({bound:!0})})});if(L.error){if(L.error.code==="EADDRINUSE")continue;throw U(),L.error}if(L.bound)return{callbackUrl:`http://${m}:${$}${n.callbackPath}`,waitForCallback:y,cancelWait:()=>{U(),M(null)},close:()=>{U(),M(null)}}}return{callbackUrl:"",waitForCallback:async()=>null,cancelWait:()=>{},close:()=>{}}}var AR=`<!DOCTYPE html>
|
|
281
|
+
<html lang="en">
|
|
282
|
+
<head>
|
|
283
|
+
<meta charset="utf-8">
|
|
284
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
285
|
+
<title>Authentication Successful</title>
|
|
286
|
+
<style>
|
|
287
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
288
|
+
body {
|
|
289
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
|
|
290
|
+
min-height: 100vh;
|
|
291
|
+
display: flex;
|
|
292
|
+
align-items: center;
|
|
293
|
+
justify-content: center;
|
|
294
|
+
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
|
|
295
|
+
color: #fff;
|
|
296
|
+
}
|
|
297
|
+
.container { text-align: center; padding: 48px; max-width: 420px; }
|
|
298
|
+
.icon {
|
|
299
|
+
width: 72px; height: 72px; margin: 0 auto 24px;
|
|
300
|
+
background: linear-gradient(135deg, #10a37f 0%, #1a7f64 100%);
|
|
301
|
+
border-radius: 50%;
|
|
302
|
+
display: flex; align-items: center; justify-content: center;
|
|
303
|
+
}
|
|
304
|
+
.icon svg { width: 36px; height: 36px; stroke: #fff; stroke-width: 3; fill: none; }
|
|
305
|
+
h1 { font-size: 24px; font-weight: 600; margin-bottom: 12px; }
|
|
306
|
+
p { font-size: 15px; color: rgba(255,255,255,0.7); line-height: 1.5; }
|
|
307
|
+
.closing { margin-top: 32px; font-size: 13px; color: rgba(255,255,255,0.5); }
|
|
308
|
+
</style>
|
|
309
|
+
</head>
|
|
310
|
+
<body>
|
|
311
|
+
<div class="container">
|
|
312
|
+
<div class="icon">
|
|
313
|
+
<svg viewBox="0 0 24 24"><polyline points="20 6 9 17 4 12"></polyline></svg>
|
|
314
|
+
</div>
|
|
315
|
+
<h1>Authentication Successful</h1>
|
|
316
|
+
<p>You're now signed in. You can close this window.</p>
|
|
317
|
+
<p class="closing">This window will close automatically...</p>
|
|
318
|
+
</div>
|
|
319
|
+
<script>setTimeout(() => window.close(), 3000);</script>
|
|
320
|
+
</body>
|
|
321
|
+
</html>`;function sf(n){let T="";for(let m=0;m<n.length;m+=1)T+=String.fromCharCode(n[m]??0);return btoa(T).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}async function RR(n){let m=new TextEncoder().encode(n),g=await crypto.subtle.digest("SHA-256",m);return new Uint8Array(g)}function rR(n=32){let T=new Uint8Array(n);return crypto.getRandomValues(T),sf(T)}async function sT(){let n=rR(),T=sf(await RR(n));return{verifier:n,challenge:T}}function oT(n){return n.endsWith("/")?n.slice(0,-1):n}function nm(n,T){return new URL(T,`${oT(n)}/`).toString()}function qn(n,T={}){let m=n.trim();if(!m)return{};try{let g=new URL(m);return{code:g.searchParams.get("code")??void 0,state:g.searchParams.get("state")??void 0,provider:T.includeProvider?g.searchParams.get("provider")??void 0:void 0}}catch{}if(T.allowHashCodeState&&m.includes("#")){let[g,f]=m.split("#",2);return{code:g||void 0,state:f||void 0}}if(m.includes("code=")){let g=new URLSearchParams(m);return{code:g.get("code")??void 0,state:g.get("state")??void 0,provider:T.includeProvider?g.get("provider")??void 0:void 0}}return{code:m}}function MR(n){if(typeof atob==="function")try{return atob(n)}catch{return null}if(typeof Buffer<"u")try{return Buffer.from(n,"base64").toString("utf8")}catch{return null}return null}function d(n){if(!n)return null;try{let T=n.split(".");if(T.length!==3)return null;let m=T[1];if(!m)return null;let g=m.replace(/-/g,"+").replace(/_/g,"/"),f=g.padEnd(g.length+(4-g.length%4)%4,"="),_=MR(f);if(!_)return null;return JSON.parse(_)}catch{return null}}function on(n){try{let T=JSON.parse(n),m=T.error,g=typeof m==="string"?m:m&&typeof m==="object"&&typeof m.type==="string"?m.type:void 0,f=typeof T.error_description==="string"?T.error_description:typeof T.message==="string"?T.message:m&&typeof m==="object"&&typeof m.message==="string"?m.message:void 0;return{code:g,message:f}}catch{return{}}}function Jn(n,T){return Date.now()>=n.expires-T}async function Hn(n){if(!n.onManualCodeInput){let _=await n.waitForCallback();return{code:_?.code,state:_?.state,provider:_?.provider,error:_?.error}}let T,m,g=n.onManualCodeInput().then((_)=>{T=_,n.cancelWait()}).catch((_)=>{m=_ instanceof Error?_:Error(String(_)),n.cancelWait()}),f=await n.waitForCallback();if(m)throw m;if(f?.code||f?.error)return{code:f.code,state:f.state,provider:f.provider,error:f.error};if(T)return qn(T,n.parseOptions);if(await g,m)throw m;if(T)return qn(T,n.parseOptions);return{}}var Ug={authorize:"/api/v1/auth/authorize",token:"/api/v1/auth/token",refresh:"/api/v1/auth/refresh"},UR="/auth",of=Array.from({length:11},(n,T)=>48801+T),yR=300000,ER=30000,yg=30000;class Tm extends Error{status;errorCode;constructor(n,T){super(n);this.name="ClineOAuthTokenError",this.status=T?.status,this.errorCode=T?.errorCode}isLikelyInvalidGrant(){if(this.errorCode&&/invalid_grant|invalid_token|unauthorized/i.test(this.errorCode))return!0;if(this.status===400||this.status===401||this.status===403)return/invalid|expired|revoked|unauthorized/i.test(this.message);return!1}}function $R(){let n=globalThis.crypto;if(!n)return Math.random().toString(16).slice(2);let T=new Uint8Array(16);return n.getRandomValues(T),Array.from(T,(m)=>m.toString(16).padStart(2,"0")).join("")}function hR(n){let T=Date.parse(n);if(Number.isNaN(T))throw Error(`Invalid expiresAt value: ${n}`);return T}function n0(n,T,m={}){let g=n.userInfo.clineUserId??m.accountId,f=n.refreshToken??m.refresh;if(!f)throw Error("Token response did not include a refresh token");return{access:n.accessToken,refresh:f,expires:hR(n.expiresAt),accountId:g??void 0,email:n.userInfo.email||m.email,metadata:{provider:T,tokenType:n.tokenType,userInfo:n.userInfo}}}async function Eg(n){if(!n)return{};return typeof n==="function"?await n():n}async function DR(n,T){let m=new URL(nm(n.apiBaseUrl,Ug.authorize));m.searchParams.set("client_type","extension"),m.searchParams.set("callback_url",T.callbackUrl),m.searchParams.set("redirect_uri",T.callbackUrl),m.searchParams.set("state",T.state);let g=await fetch(m.toString(),{method:"GET",redirect:"manual",headers:await Eg(n.headers),signal:AbortSignal.timeout(n.requestTimeoutMs??yg)});if(g.status>=300&&g.status<400){let _=g.headers.get("location");if(_)return _}if(!g.ok){let _=await g.text().catch(()=>"");throw Error(`Authentication request failed: ${g.status} ${_}`)}let f=await g.json();if(typeof f.redirect_url==="string"&&f.redirect_url.length>0)return f.redirect_url;throw Error("Authentication request did not return a redirect URL")}async function LR(n,T,m,g){let f={grant_type:"authorization_code",code:n,client_type:"extension",redirect_uri:T,provider:g??m.provider},_=await fetch(nm(m.apiBaseUrl,Ug.token),{method:"POST",headers:{"Content-Type":"application/json",...await Eg(m.headers)},body:JSON.stringify(f),signal:AbortSignal.timeout(m.requestTimeoutMs??yg)});if(!_.ok){let R=await _.text().catch(()=>""),r=on(R);throw new Tm(`Token exchange failed: ${_.status}${r.message?` - ${r.message}`:""}`,{status:_.status,errorCode:r.code})}let A=await _.json();if(!A.success||!A.data?.accessToken)throw Error("Invalid token exchange response");return n0(A.data,g??m.provider)}async function mm(n){let T=n.callbackPorts?.length?n.callbackPorts:of,m=n.callbackPath??UR,g=$R(),f=await jn({ports:T,callbackPath:m}),_=f.callbackUrl||`http://127.0.0.1:${T[0]??of[0]}${m}`,A=await DR(n,{callbackUrl:_,state:g});n.callbacks.onAuth({url:A,instructions:"Continue the authentication process in your browser."});try{let R,r=n.provider,M=await Hn({waitForCallback:f.waitForCallback,cancelWait:f.cancelWait,onManualCodeInput:n.callbacks.onManualCodeInput,parseOptions:{includeProvider:!0}});if(M.error)throw Error(`OAuth error: ${M.error}`);if(M.state&&M.state!==g)throw Error("State mismatch");if(R=M.code,r=M.provider??r,!R){let U=await n.callbacks.onPrompt({message:"Paste the authorization code (or full redirect URL):"}),y=qn(U,{includeProvider:!0});if(y.state&&y.state!==g)throw Error("State mismatch");R=y.code,r=y.provider??r}if(!R)throw Error("Missing authorization code");return LR(R,_,n,r)}finally{f.close()}}async function $g(n,T){let m=await fetch(nm(T.apiBaseUrl,Ug.refresh),{method:"POST",headers:{"Content-Type":"application/json",...await Eg(T.headers)},body:JSON.stringify({refreshToken:n.refresh,grantType:"refresh_token"}),signal:AbortSignal.timeout(T.requestTimeoutMs??yg)});if(!m.ok){let _=await m.text().catch(()=>""),A=on(_);throw new Tm(`Token refresh failed: ${m.status}${A.message?` - ${A.message}`:""}`,{status:m.status,errorCode:A.code})}let g=await m.json();if(!g.success||!g.data?.accessToken)throw Error("Invalid token refresh response");let f=n.metadata?.provider??T.provider;return n0(g.data,f,n)}async function hg(n,T,m){if(!n)return null;let g=m?.refreshBufferMs??yR,f=m?.retryableTokenGraceMs??ER;if(m?.forceRefresh!==!0&&!Jn(n,g))return n;try{return await $g(n,T)}catch(A){if(A instanceof Tm&&A.isLikelyInvalidGrant())return null;if(n.expires-Date.now()>f)return n;return null}}function WR(n){return{id:"cline",name:"Cline Account",usesCallbackServer:!0,async login(T){return mm({...n,callbacks:T})},async refreshToken(T){return $g(T,n)},getApiKey(T){return`workos:${T.access}`}}}import{nanoid as OR}from"nanoid";var H={authorizationEndpoint:"https://auth.openai.com/oauth/authorize",tokenEndpoint:"https://auth.openai.com/oauth/token",clientId:"app_EMoamEEZ73f0CkXaXp7hrann",redirectUri:"http://localhost:1455/auth/callback",scopes:"openid profile email offline_access",callbackPort:1455,jwtClaimPath:"https://api.openai.com/auth",refreshBufferMs:300000,retryableTokenGraceMs:30000,httpTimeoutMs:30000};class gm extends Error{status;errorCode;constructor(n,T){super(n);this.name="OpenAICodexOAuthTokenError",this.status=T?.status,this.errorCode=T?.errorCode}isLikelyInvalidGrant(){if(this.errorCode&&/invalid_grant/i.test(this.errorCode))return!0;if(this.status===400||this.status===401||this.status===403)return/invalid_grant|revoked|expired|invalid refresh/i.test(this.message);return!1}}async function CR(n,T,m=H.redirectUri){let g=await fetch(H.tokenEndpoint,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",client_id:H.clientId,code:n,code_verifier:T,redirect_uri:m}),signal:AbortSignal.timeout(H.httpTimeoutMs)});if(!g.ok)return{type:"failed"};let f=await g.json();if(!f.access_token||!f.refresh_token||typeof f.expires_in!=="number")return{type:"failed"};return{type:"success",access:f.access_token,refresh:f.refresh_token,expires:Date.now()+f.expires_in*1000,email:f.email,idToken:f.id_token}}async function NR(n){try{let T=await fetch(H.tokenEndpoint,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:n,client_id:H.clientId}),signal:AbortSignal.timeout(H.httpTimeoutMs)});if(!T.ok){let g=await T.text().catch(()=>""),f=on(g);throw new gm(`Token refresh failed: ${T.status}${f.message?` - ${f.message}`:""}`,{status:T.status,errorCode:f.code})}let m=await T.json();if(!m.access_token||!m.refresh_token||typeof m.expires_in!=="number")return{type:"failed"};return{type:"success",access:m.access_token,refresh:m.refresh_token,expires:Date.now()+m.expires_in*1000,email:m.email,idToken:m.id_token}}catch(T){if(T instanceof gm)throw T;return{type:"failed"}}}async function YR(n="pi"){let{verifier:T,challenge:m}=await sT(),g=OR(32),f=new URL(H.authorizationEndpoint);return f.searchParams.set("response_type","code"),f.searchParams.set("client_id",H.clientId),f.searchParams.set("redirect_uri",H.redirectUri),f.searchParams.set("scope",H.scopes),f.searchParams.set("code_challenge",m),f.searchParams.set("code_challenge_method","S256"),f.searchParams.set("state",g),f.searchParams.set("id_token_add_organizations","true"),f.searchParams.set("codex_cli_simplified_flow","true"),f.searchParams.set("originator",n),{verifier:T,state:g,url:f.toString()}}function XR(){try{let n=new URL(H.redirectUri),T=n.port.length>0?Number.parseInt(n.port,10):H.callbackPort;return{host:n.hostname||"localhost",port:Number.isFinite(T)?T:H.callbackPort,callbackPath:n.pathname||"/auth/callback",redirectUri:n.toString()}}catch{return{host:"localhost",port:H.callbackPort,callbackPath:"/auth/callback",redirectUri:H.redirectUri}}}function T0(n,T){let m=T?d(T):d(n),g=m?m:d(n),_=g?.[H.jwtClaimPath]?.chatgpt_account_id;if(typeof _==="string"&&_.length>0)return _;let A=g?.organizations;if(Array.isArray(A)&&A.length>0){let r=A[0];if(typeof r?.id==="string"&&r.id.length>0)return r.id}let R=g?.chatgpt_account_id;if(typeof R==="string"&&R.length>0)return R;return null}function m0(n,T){let m=T0(n.access,n.idToken)??T?.accountId;if(!m)throw Error("Failed to extract accountId from token");return{access:n.access,refresh:n.refresh||T?.refresh||"",expires:n.expires,accountId:m,email:n.email??T?.email,metadata:{...T?.metadata??{},provider:"openai-codex"}}}async function fm(n){let T=XR(),{verifier:m,state:g,url:f}=await YR(n.originator),_=await jn({host:T.host,ports:[T.port],callbackPath:T.callbackPath,expectedState:g});n.onAuth({url:f,instructions:"Continue the authentication process in your browser."});let A;try{let R=await Hn({waitForCallback:_.waitForCallback,cancelWait:_.cancelWait,onManualCodeInput:n.onManualCodeInput,parseOptions:{allowHashCodeState:!0}});if(R.state&&R.state!==g)throw Error("State mismatch");if(A=R.code,!A){let M=await n.onPrompt({message:"Paste the authorization code (or full redirect URL):"}),U=qn(M,{allowHashCodeState:!0});if(U.state&&U.state!==g)throw Error("State mismatch");A=U.code}if(!A)throw Error("Missing authorization code");let r=await CR(A,m,T.redirectUri);if(r.type!=="success")throw Error("Token exchange failed");return m0(r)}finally{_.close()}}async function Dg(n,T){let m=await NR(n);if(m.type!=="success")throw Error("Failed to refresh OpenAI Codex token");let g=m0(m,T);if(!g.refresh)throw Error("Failed to refresh OpenAI Codex token: missing refresh token");return g}async function Lg(n,T){if(!n)return null;let m=T?.refreshBufferMs??H.refreshBufferMs,g=T?.retryableTokenGraceMs??H.retryableTokenGraceMs;if(T?.forceRefresh!==!0&&!Jn(n,m))return n;try{return await Dg(n.refresh,n)}catch(_){if(_ instanceof gm&&_.isLikelyInvalidGrant())return null;if(n.expires-Date.now()>g)return n;return null}}function VR(n,T=H.refreshBufferMs){return Jn(n,T)}function KR(n){let T=n.accountId??T0(n.access);if(!T)throw Error("Failed to extract accountId from token");return{...n,accountId:T,metadata:{...n.metadata??{},provider:"openai-codex"}}}var jR={id:"openai-codex",name:"ChatGPT Plus/Pro (ChatGPT Subscription)",usesCallbackServer:!0,async login(n){return fm({onAuth:n.onAuth,onPrompt:n.onPrompt,onProgress:n.onProgress,onManualCodeInput:n.onManualCodeInput})},async refreshToken(n){return Dg(n.refresh,n)},getApiKey(n){return n.access}};import{nanoid as g0}from"nanoid";var f0="a8331954c0cf48ba99b5dd223a14c6ea",_0="https://idcs-9dc693e80d9b469480d7afe00e743931.identity.oraclecloud.com",A0="openid offline_access",R0="https://code-internal.aiservice.us-chicago-1.oci.oraclecloud.com/20250206/app/litellm",r0="c1aba3deed5740659981a752714eba33",M0="https://login-ext.identity.oraclecloud.com",U0="openid offline_access",y0="https://code.aiservice.us-chicago-1.oci.oraclecloud.com/20250206/app/litellm",E0="opc-request-id",JR="/auth/oca",tR=Array.from({length:11},(n,T)=>48801+T),BR=300000,QR=30000,$0=30000,ZR=600000;class _m extends Error{status;errorCode;constructor(n,T){super(n);this.name="OcaOAuthTokenError",this.status=T?.status,this.errorCode=T?.errorCode}isLikelyInvalidGrant(){if(this.errorCode&&/invalid_grant|invalid_token|unauthorized/i.test(this.errorCode))return!0;return this.status===400||this.status===401||this.status===403}}var Wn={internal:{clientId:f0,idcsUrl:_0,scopes:A0,baseUrl:R0},external:{clientId:r0,idcsUrl:M0,scopes:U0,baseUrl:y0}},nT=new Map,Wg=new Map;function h0(n){if(typeof n==="function")return n();return n??"internal"}function D0(n){return{internal:{clientId:n?.internal?.clientId??Wn.internal.clientId,idcsUrl:n?.internal?.idcsUrl??Wn.internal.idcsUrl,scopes:n?.internal?.scopes??Wn.internal.scopes,baseUrl:n?.internal?.baseUrl??Wn.internal.baseUrl},external:{clientId:n?.external?.clientId??Wn.external.clientId,idcsUrl:n?.external?.idcsUrl??Wn.external.idcsUrl,scopes:n?.external?.scopes??Wn.external.scopes,baseUrl:n?.external?.baseUrl??Wn.external.baseUrl}}}function zR(n=Date.now()){let T=n-ZR;for(let[m,g]of nT.entries())if(g.createdAt<T)nT.delete(m)}function FR(n,T,m){if(typeof n.expires_in==="number"&&n.expires_in>0)return Date.now()+n.expires_in*1000;let f=d(T)?.exp;if(typeof f==="number"&&f>0)return f*1000;let A=d(m)?.exp;if(typeof A==="number"&&A>0)return A*1000;return Date.now()+3600000}function L0(n,T,m){let g=n.access_token;if(!g)throw Error("Token response did not include an access token");let f=n.refresh_token??m?.refresh;if(!f)throw Error("Token response did not include a refresh token");let _=d(n.id_token),A=d(g),R=_?.sub??A?.sub,r=_?.email??A?.email;return{access:g,refresh:f,expires:FR(n,g,n.id_token),accountId:R??m?.accountId,email:r??m?.email,metadata:{...m?.metadata??{},provider:"oca",mode:T,subject:R,idToken:n.id_token}}}async function W0(n,T){let m=oT(n),g=Wg.get(m);if(g)return g;let f=`${m}/.well-known/openid-configuration`,_=await fetch(f,{method:"GET",signal:AbortSignal.timeout(T)});if(!_.ok){let r=`${m}/oauth2/v1/token`;return Wg.set(m,r),r}let R=(await _.json()).token_endpoint||`${m}/oauth2/v1/token`;return Wg.set(m,R),R}function O0(n){return{code:n.error,message:n.error_description}}async function qR(n){let T=nT.get(n.state);if(!T)throw Error("No PKCE verifier found for this state");nT.delete(n.state);let m=n.mode==="external"?n.config.external:n.config.internal,g=await W0(m.idcsUrl,n.requestTimeoutMs),f=new URLSearchParams({grant_type:"authorization_code",code:n.code,redirect_uri:T.redirectUri,client_id:m.clientId,code_verifier:T.verifier}),_=await fetch(g,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:f,signal:AbortSignal.timeout(n.requestTimeoutMs)}),A=await _.json();if(!_.ok){let r=O0(A);throw new _m(`Token exchange failed: ${_.status}${r.message?` - ${r.message}`:""}`,{status:_.status,errorCode:r.code})}let R=d(A.id_token);if(!A.id_token||!R)throw Error("No ID token received from OCA");if(R.nonce!==T.nonce)throw Error("OIDC nonce verification failed");return L0(A,n.mode)}function HR(n){let T=n.mode==="external"?n.config.external:n.config.internal,m=new URL(`${oT(T.idcsUrl)}/oauth2/v1/authorize`);return m.searchParams.set("client_id",T.clientId),m.searchParams.set("response_type","code"),m.searchParams.set("scope",T.scopes),m.searchParams.set("code_challenge",n.challenge),m.searchParams.set("code_challenge_method","S256"),m.searchParams.set("redirect_uri",n.callbackUrl),m.searchParams.set("state",n.state),m.searchParams.set("nonce",n.nonce),m.toString()}async function Am(n){let T=D0(n.config),m=h0(n.mode),g=n.callbackPorts?.length?n.callbackPorts:tR,f=n.callbackPath??JR,_=n.requestTimeoutMs??$0,A=await jn({ports:g,callbackPath:f}),R=A.callbackUrl;if(!R)throw Error("Unable to bind local OAuth callback server");let r=g0(16),M=g0(16),{verifier:U,challenge:y}=await sT();zR(),nT.set(r,{verifier:U,nonce:M,mode:m,redirectUri:R,createdAt:Date.now()});let $=HR({callbackUrl:R,mode:m,state:r,nonce:M,challenge:y,config:T});n.callbacks.onAuth({url:$,instructions:"Continue the authentication process in your browser."});try{let h=await Hn({waitForCallback:A.waitForCallback,cancelWait:A.cancelWait,onManualCodeInput:n.callbacks.onManualCodeInput}),L=h.code,W=h.state;if(h.error)throw Error(`OAuth error: ${h.error}`);if(!L){if(!n.callbacks.onManualCodeInput)throw Error("Timed out waiting for OCA callback");throw Error("Missing authorization code")}if(!W||W!==r)throw Error("State mismatch");return await qR({code:L,state:W,mode:m,config:T,requestTimeoutMs:_})}finally{A.close()}}async function Og(n,T={}){let m=D0(T.config),g=T.requestTimeoutMs??$0,f=n.metadata?.mode,_=f==="internal"||f==="external"?f:h0(T.mode),A=_==="external"?m.external:m.internal,R=await W0(A.idcsUrl,g),r=new URLSearchParams({grant_type:"refresh_token",refresh_token:n.refresh,client_id:A.clientId}),M=await fetch(R,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:r,signal:AbortSignal.timeout(g)}),U=await M.json();if(!M.ok){let y=O0(U);throw new _m(`Token refresh failed: ${M.status}${y.message?` - ${y.message}`:""}`,{status:M.status,errorCode:y.code})}return L0(U,_,n)}async function Cg(n,T,m){if(!n)return null;let g=T?.refreshBufferMs??m?.refreshBufferMs??BR,f=T?.retryableTokenGraceMs??m?.retryableTokenGraceMs??QR;if(T?.forceRefresh!==!0&&!Jn(n,g))return n;try{return await Og(n,m)}catch(A){if(A instanceof _m&&A.isLikelyInvalidGrant())return null;if(n.expires-Date.now()>f)return n;return null}}function PR(n={}){return{id:"oca",name:"Oracle Code Assist",usesCallbackServer:!0,async login(T){return Am({...n,callbacks:T})},async refreshToken(T){return Og(T,n)},getApiKey(T){return T.access}}}async function C0(n,T){let m=new TextEncoder,g=async(M)=>{let U=await crypto.subtle.digest("SHA-256",m.encode(M));return Array.from(new Uint8Array(U).slice(0,4),(y)=>y.toString(16).padStart(2,"0")).join("")},[f,_]=await Promise.all([g(T),g(n)]),A=Math.floor(Date.now()/1000).toString(16).padStart(8,"0"),R=new Uint32Array(1);crypto.getRandomValues(R);let r=(R[0]??0).toString(16).padStart(8,"0");return f+_+A+r}async function bR(n){let T=await C0(n.taskId,n.accessToken);return{Authorization:`Bearer ${n.accessToken}`,"Content-Type":"application/json",client:n.metadata?.client??"Cline","client-version":n.metadata?.clientVersion??"unknown","client-ide":n.metadata?.clientIde??"unknown","client-ide-version":n.metadata?.clientIdeVersion??"unknown",[E0]:T}}class Ng{apiBaseUrl;getAuthTokenFn;getCurrentUserIdFn;getOrganizationMemberIdFn;getHeadersFn;requestTimeoutMs;fetchImpl;constructor(n){let T=n.apiBaseUrl.trim();if(!T)throw Error("apiBaseUrl is required");this.apiBaseUrl=T,this.getAuthTokenFn=n.getAuthToken,this.getCurrentUserIdFn=n.getCurrentUserId,this.getOrganizationMemberIdFn=n.getOrganizationMemberId,this.getHeadersFn=n.getHeaders,this.requestTimeoutMs=n.requestTimeoutMs??30000,this.fetchImpl=n.fetchImpl??fetch}async fetchMe(){return this.request("/api/v1/users/me")}async fetchBalance(n){let T=await this.resolveUserId(n);return this.request(`/api/v1/users/${encodeURIComponent(T)}/balance`)}async fetchUsageTransactions(n){let T=await this.resolveUserId(n);return(await this.request(`/api/v1/users/${encodeURIComponent(T)}/usages`)).items??[]}async fetchPaymentTransactions(n){let T=await this.resolveUserId(n);return(await this.request(`/api/v1/users/${encodeURIComponent(T)}/payments`)).paymentTransactions??[]}async fetchUserOrganizations(){return(await this.fetchMe()).organizations??[]}async fetchOrganizationBalance(n){let T=n.trim();if(!T)throw Error("organizationId is required");return this.request(`/api/v1/organizations/${encodeURIComponent(T)}/balance`)}async fetchOrganizationUsageTransactions(n){let T=n.organizationId.trim();if(!T)throw Error("organizationId is required");let m=await this.resolveOrganizationMemberId(T,n.memberId);return(await this.request(`/api/v1/organizations/${encodeURIComponent(T)}/members/${encodeURIComponent(m)}/usages`)).items??[]}async switchAccount(n){await this.request("/api/v1/users/active-account",{method:"PUT",body:{organizationId:n?.trim()||null},expectNoContent:!0})}async resolveUserId(n){let T=n?.trim();if(T)return T;let g=(this.getCurrentUserIdFn?await this.getCurrentUserIdFn():void 0)?.trim();if(g)return g;let f=await this.fetchMe();if(!f.id?.trim())throw Error("Unable to resolve current user id");return f.id}async resolveOrganizationMemberId(n,T){let m=T?.trim();if(m)return m;let f=(this.getOrganizationMemberIdFn?await this.getOrganizationMemberIdFn(n):void 0)?.trim();if(f)return f;let A=(await this.fetchUserOrganizations()).find((R)=>R.organizationId===n)?.memberId;if(!A?.trim())throw Error(`Unable to resolve memberId for organization ${n}`);return A}async request(n,T){let m=(await this.getAuthTokenFn())?.trim();if(!m)throw Error("No Cline account auth token found");let g=this.getHeadersFn?await this.getHeadersFn():{},f=new AbortController,_=setTimeout(()=>f.abort(),this.requestTimeoutMs);try{let A=await this.fetchImpl(new URL(n,this.apiBaseUrl),{method:T?.method??"GET",headers:{Authorization:`Bearer ${m}`,"Content-Type":"application/json",...g??{}},body:T?.body!==void 0?JSON.stringify(T.body):void 0,signal:f.signal});if(A.status===204||T?.expectNoContent){if(!A.ok)throw Error(`Cline account request failed with status ${A.status}`);return}let R=await A.text(),r;if(R.trim())r=JSON.parse(R);if(!A.ok){let M=typeof r==="object"&&r!==null&&"error"in r?String(r.error):`Cline account request failed with status ${A.status}`;throw Error(M)}if(typeof r==="object"&&r!==null){let M=r;if(typeof M.success==="boolean"){if(!M.success)throw Error(M.error||"Cline account request failed");if(M.data!==void 0)return M.data}}if(r===void 0||r===null)throw Error("Cline account response payload was empty");return r}finally{clearTimeout(_)}}}function N0(n){return n.action==="clineAccount"}async function Y0(n,T){switch(n.operation){case"fetchMe":return T.fetchMe();case"fetchBalance":return T.fetchBalance(n.userId);case"fetchUsageTransactions":return T.fetchUsageTransactions(n.userId);case"fetchPaymentTransactions":return T.fetchPaymentTransactions(n.userId);case"fetchUserOrganizations":return T.fetchUserOrganizations();case"fetchOrganizationBalance":return T.fetchOrganizationBalance(n.organizationId);case"fetchOrganizationUsageTransactions":return T.fetchOrganizationUsageTransactions({organizationId:n.organizationId,memberId:n.memberId});case"switchAccount":return await T.switchAccount(n.organizationId),{updated:!0};default:throw Error(`Unsupported Cline account operation: ${String(n)}`)}}class Yg{executor;constructor(n){this.executor=n}async fetchMe(){return this.request({action:"clineAccount",operation:"fetchMe"})}async fetchBalance(n){return this.request({action:"clineAccount",operation:"fetchBalance",...n?.trim()?{userId:n.trim()}:{}})}async fetchUsageTransactions(n){return this.request({action:"clineAccount",operation:"fetchUsageTransactions",...n?.trim()?{userId:n.trim()}:{}})}async fetchPaymentTransactions(n){return this.request({action:"clineAccount",operation:"fetchPaymentTransactions",...n?.trim()?{userId:n.trim()}:{}})}async fetchUserOrganizations(){return this.request({action:"clineAccount",operation:"fetchUserOrganizations"})}async fetchOrganizationBalance(n){let T=n.trim();if(!T)throw Error("organizationId is required");return this.request({action:"clineAccount",operation:"fetchOrganizationBalance",organizationId:T})}async fetchOrganizationUsageTransactions(n){let T=n.organizationId.trim();if(!T)throw Error("organizationId is required");return this.request({action:"clineAccount",operation:"fetchOrganizationUsageTransactions",organizationId:T,...n.memberId?.trim()?{memberId:n.memberId.trim()}:{}})}async switchAccount(n){await this.request({action:"clineAccount",operation:"switchAccount",organizationId:n?.trim()||null})}async request(n){return(await this.executor.runProviderAction(n)).result}}import{z as O}from"zod";var X0=O.object({workspaceRoot:O.string().min(1),cwd:O.string().optional(),provider:O.string().min(1),model:O.string().min(1),mode:O.enum(["act","plan"]).default("act"),apiKey:O.string(),systemPrompt:O.string().optional(),rules:O.string().optional(),maxIterations:O.number().int().positive().optional(),enableTools:O.boolean(),enableSpawn:O.boolean(),enableTeams:O.boolean(),autoApproveTools:O.boolean().optional(),teamName:O.string().min(1),missionStepInterval:O.number().int().positive(),missionTimeIntervalMs:O.number().int().positive()}),V0=O.enum(["idle","starting","running","stopping","completed","cancelled","failed","error"]),K0=O.enum(["user","assistant","tool","system","status","error"]),j0=O.object({id:O.string().min(1),sessionId:O.string().nullable(),role:K0,content:O.string(),createdAt:O.number().int().nonnegative(),meta:O.object({stream:O.enum(["stdout","stderr"]).optional(),toolName:O.string().optional(),iteration:O.number().int().nonnegative().optional(),agentId:O.string().optional(),conversationId:O.string().optional(),hookEventName:O.string().optional(),inputTokens:O.number().int().nonnegative().optional(),outputTokens:O.number().int().nonnegative().optional()}).optional()}),J0=O.object({toolCalls:O.number().int().nonnegative(),tokensIn:O.number().int().nonnegative(),tokensOut:O.number().int().nonnegative()}),uR=O.object({sessionId:O.string().nullable(),status:V0,config:X0,messages:O.array(j0),rawTranscript:O.string(),error:O.string().nullable(),summary:J0});import{existsSync as vR,readFileSync as GR}from"node:fs";import{z as K}from"zod";var TT=K.record(K.string(),K.string()),t0=K.record(K.string(),K.unknown()),kR=K.object({type:K.literal("stdio"),command:K.string().min(1),args:K.array(K.string()).optional(),cwd:K.string().min(1).optional(),env:TT.optional()}),SR=K.object({type:K.literal("sse"),url:K.string().url(),headers:TT.optional()}),cR=K.object({type:K.literal("streamableHttp"),url:K.string().url(),headers:TT.optional()}),IR=K.discriminatedUnion("type",[kR,SR,cR]),xR=K.object({transport:IR,disabled:K.boolean().optional(),metadata:t0.optional()}),wR=K.enum(["stdio","sse","http","streamableHttp"]).optional(),B0=K.object({type:K.enum(["stdio","sse","streamableHttp"]).optional(),transportType:wR,disabled:K.boolean().optional(),metadata:t0.optional()});function Xg(n){if(!n)return;if(n==="http")return"streamableHttp";return n}var aR=B0.extend({command:K.string().min(1),args:K.array(K.string()).optional(),cwd:K.string().min(1).optional(),env:TT.optional()}).superRefine((n,T)=>{let m=n.type??Xg(n.transportType);if(m&&m!=="stdio")T.addIssue({code:K.ZodIssueCode.custom,message:'Expected type "stdio" for command-based MCP server',path:["type"]})}).transform((n)=>({transport:{type:"stdio",command:n.command,args:n.args,cwd:n.cwd,env:n.env},disabled:n.disabled,metadata:n.metadata})),iR=B0.extend({url:K.string().url(),headers:TT.optional()}).superRefine((n,T)=>{let m=n.type??Xg(n.transportType)??"sse";if(m!=="sse"&&m!=="streamableHttp")T.addIssue({code:K.ZodIssueCode.custom,message:'Expected type "sse" or "streamableHttp" for URL-based MCP server',path:["type"]})}).transform((n)=>{if((n.type??Xg(n.transportType)??"sse")==="streamableHttp")return{transport:{type:"streamableHttp",url:n.url,headers:n.headers},disabled:n.disabled,metadata:n.metadata};return{transport:{type:"sse",url:n.url,headers:n.headers},disabled:n.disabled,metadata:n.metadata}}),lR=K.union([xR,aR,iR]),pR=K.object({mcpServers:K.record(K.string(),lR)}).strict();function Rm(){return Km()}function Vg(n={}){let T=n.filePath??Rm(),m=GR(T,"utf8"),g;try{g=JSON.parse(m)}catch(_){let A=_ instanceof Error?_.message:String(_);throw Error(`Failed to parse MCP settings JSON at "${T}": ${A}`)}let f=pR.safeParse(g);if(!f.success){let _=f.error.issues.map((A)=>{let R=A.path.join(".");return R?`${R}: ${A.message}`:A.message}).join("; ");throw Error(`Invalid MCP settings at "${T}": ${_}`)}return f.data}function Q0(n={}){let T=n.filePath??Rm();return vR(T)}function Kg(n={}){let T=Vg(n);return Object.entries(T.mcpServers).map(([m,g])=>({name:m,transport:g.transport,disabled:g.disabled,metadata:g.metadata}))}async function Z0(n,T={}){let m=Kg(T);for(let g of m)await n.registerServer(g);return m}function e(){return Date.now()}function dR(n){return n.map((T)=>({name:T.name,description:T.description,inputSchema:T.inputSchema}))}class jg{toolsCacheTtlMs;clientFactory;servers=new Map;operationLocks=new Map;constructor(n){this.clientFactory=n.clientFactory,this.toolsCacheTtlMs=n.toolsCacheTtlMs??5000}async registerServer(n){await this.runExclusive(n.name,async()=>{let T=this.servers.get(n.name);if(!T){this.servers.set(n.name,{registration:{...n},status:"disconnected",updatedAt:e()});return}let m=JSON.stringify(T.registration.transport)!==JSON.stringify(n.transport);if(T.registration={...n},T.updatedAt=e(),m)await this.disconnectState(T),T.client=void 0,T.toolCache=void 0,T.toolCacheUpdatedAt=void 0})}async unregisterServer(n){await this.runExclusive(n,async()=>{let T=this.requireServer(n);await this.disconnectState(T),this.servers.delete(n)})}async connectServer(n){await this.runExclusive(n,async()=>{let T=this.requireServer(n);await this.connectState(T)})}async disconnectServer(n){await this.runExclusive(n,async()=>{let T=this.requireServer(n);await this.disconnectState(T)})}async setServerDisabled(n,T){await this.runExclusive(n,async()=>{let m=this.requireServer(n);if(m.registration={...m.registration,disabled:T},m.updatedAt=e(),T)await this.disconnectState(m)})}listServers(){return[...this.servers.values()].map((n)=>({name:n.registration.name,status:n.status,disabled:n.registration.disabled===!0,lastError:n.lastError,toolCount:n.toolCache?.length??0,updatedAt:n.updatedAt,metadata:n.registration.metadata})).sort((n,T)=>n.name.localeCompare(T.name))}async listTools(n){let T=this.requireServer(n),m=T.toolCacheUpdatedAt??0;if(T.toolCache&&e()-m<=this.toolsCacheTtlMs)return T.toolCache;return this.refreshTools(n)}async refreshTools(n){return this.runExclusive(n,async()=>{let T=this.requireServer(n),g=await(await this.ensureConnectedClient(T)).listTools(),f=dR(g);return T.toolCache=f,T.toolCacheUpdatedAt=e(),T.updatedAt=e(),f})}async callTool(n){return this.runExclusive(n.serverName,async()=>{let T=this.requireServer(n.serverName),m=await this.ensureConnectedClient(T);return T.updatedAt=e(),m.callTool({name:n.toolName,arguments:n.arguments,context:n.context})})}async dispose(){let n=[...this.servers.keys()];for(let T of n)await this.unregisterServer(T)}async ensureConnectedClient(n){if(await this.connectState(n),!n.client)throw Error(`MCP server "${n.registration.name}" does not have an initialized client.`);return n.client}async connectState(n){if(n.registration.disabled)throw Error(`MCP server "${n.registration.name}" is disabled and cannot be connected.`);if(n.status==="connected"&&n.client)return;n.status="connecting",n.updatedAt=e();try{let T=n.client??await this.clientFactory(n.registration);await T.connect(),n.client=T,n.status="connected",n.lastError=void 0,n.updatedAt=e()}catch(T){throw n.status="disconnected",n.lastError=T instanceof Error?T.message:String(T),n.updatedAt=e(),T}}async disconnectState(n){if(!n.client){n.status="disconnected",n.updatedAt=e();return}try{await n.client.disconnect()}finally{n.status="disconnected",n.updatedAt=e()}}requireServer(n){let T=this.servers.get(n);if(!T)throw Error(`Unknown MCP server: ${n}`);return T}async runExclusive(n,T){let m=this.operationLocks.get(n)??Promise.resolve(),g,f=new Promise((A)=>{g=A}),_=m.catch(()=>{return}).then(()=>f);this.operationLocks.set(n,_),await m.catch(()=>{return});try{return await T()}finally{if(g?.(),this.operationLocks.get(n)===_)this.operationLocks.delete(n)}}}import{existsSync as P0,mkdirSync as r1,readFileSync as M1,writeFileSync as U1}from"node:fs";import{basename as b0,dirname as Bg}from"node:path";import{providers as Jg}from"@clinebot/llms";import{z as On}from"zod";var z0=Jg.ProviderSettingsSchema,mT=Jg.toProviderConfig,F0=On.object({settings:Jg.ProviderSettingsSchema,updatedAt:On.string().datetime(),tokenSource:On.enum(["manual","oauth","migration"]).default("manual")}),rm=On.object({version:On.literal(1),lastUsedProvider:On.string().min(1).optional(),providers:On.record(On.string(),F0)});function Pn(){return{version:1,providers:{}}}import{existsSync as eR,readFileSync as sR}from"node:fs";import{join as q0}from"node:path";import{models as oR,providers as n1}from"@clinebot/llms";function C(n){let T=n?.trim();return T?T:void 0}function H0(n){if(!eR(n))return;try{let T=sR(n,"utf8"),m=JSON.parse(T);if(m&&typeof m==="object"&&!Array.isArray(m))return m}catch{}return}function T1(n){let T=n.dataDir??c(),m=n.globalStatePath??q0(T,"globalState.json"),g=n.secretsPath??q0(T,"secrets.json"),f=H0(m),_=H0(g);if(!f&&!_)return;return{globalState:f??{},secrets:_??{}}}function m1(n,T,m,g){let f=m==="plan"?"planMode":"actMode",_=T===g?C(m==="plan"?n.planModeApiModelId:n.actModeApiModelId):void 0,R={openrouter:`${f}OpenRouterModelId`,cline:`${f}ClineModelId`,openai:`${f}OpenAiModelId`,ollama:`${f}OllamaModelId`,lmstudio:`${f}LmStudioModelId`,litellm:`${f}LiteLlmModelId`,requesty:`${f}RequestyModelId`,together:`${f}TogetherModelId`,fireworks:`${f}FireworksModelId`,sapaicore:`${f}SapAiCoreModelId`,groq:`${f}GroqModelId`,baseten:`${f}BasetenModelId`,huggingface:`${f}HuggingFaceModelId`,"huawei-cloud-maas":`${f}HuaweiCloudMaasModelId`,oca:`${f}OcaModelId`,aihubmix:`${f}AihubmixModelId`,hicap:`${f}HicapModelId`,nousResearch:`${f}NousResearchModelId`,"vercel-ai-gateway":`${f}VercelAiGatewayModelId`}[T];return(R?C(typeof n[R]==="string"?n[R]:void 0):void 0)??_}function g1(n,T,m){let g=m==="plan"?n.planModeReasoningEffort:n.actModeReasoningEffort,f=m==="plan"?n.geminiPlanModeThinkingLevel:n.geminiActModeThinkingLevel,_=m==="plan"?n.planModeThinkingBudgetTokens:n.actModeThinkingBudgetTokens,A=(T==="gemini"?f:void 0)??g,R=A==="none"||A==="low"||A==="medium"||A==="high"?A:void 0,r=typeof _==="number"&&Number.isInteger(_)&&_>0?_:void 0;if(!R&&r===void 0)return;return{...R?{effort:R}:{},...r!==void 0?{budgetTokens:r}:{}}}function f1(n){let T=n["openai-codex-oauth-credentials"];if(!T)return;try{let m=JSON.parse(T),g=C(m.access_token),f=C(m.refresh_token),_=C(m.accountId);if(!g&&!f&&!_)return;return{...g?{apiKey:g}:{},auth:{...g?{accessToken:g}:{},...f?{refreshToken:f}:{},..._?{accountId:_}:{}}}}catch{return}}function _1(n){let T=oR.getGeneratedModelsForProvider(n);return Object.keys(T)[0]??void 0}function A1(n,T,m,g){let f=C(g==="plan"?T.planModeApiProvider:T.actModeApiProvider),_=m1(T,n,g,f)??_1(n),A=g1(T,n,g),R=typeof T.requestTimeoutMs==="number"&&Number.isInteger(T.requestTimeoutMs)&&T.requestTimeoutMs>0?T.requestTimeoutMs:void 0,r={anthropic:m.apiKey,cline:m.clineApiKey,openai:m.openAiApiKey,"openai-native":m.openAiNativeApiKey,openrouter:m.openRouterApiKey,bedrock:m.awsBedrockApiKey,gemini:m.geminiApiKey,ollama:m.ollamaApiKey,deepseek:m.deepSeekApiKey,requesty:m.requestyApiKey,together:m.togetherApiKey,fireworks:m.fireworksApiKey,qwen:m.qwenApiKey,doubao:m.doubaoApiKey,mistral:m.mistralApiKey,litellm:m.liteLlmApiKey,asksage:m.asksageApiKey,xai:m.xaiApiKey,moonshot:m.moonshotApiKey,zai:m.zaiApiKey,huggingface:m.huggingFaceApiKey,nebius:m.nebiusApiKey,sambanova:m.sambanovaApiKey,cerebras:m.cerebrasApiKey,groq:m.groqApiKey,"huawei-cloud-maas":m.huaweiCloudMaasApiKey,baseten:m.basetenApiKey,"vercel-ai-gateway":m.vercelAiGatewayApiKey,dify:m.difyApiKey,minimax:m.minimaxApiKey,hicap:m.hicapApiKey,aihubmix:m.aihubmixApiKey,nousResearch:m.nousResearchApiKey,oca:m.ocaApiKey,sapaicore:m.sapAiCoreClientId},M={};if(n==="openai-codex")Object.assign(M,f1(m));if(n==="cline"){let E=C(m["cline:clineAccountId"]??m.clineAccountId);if(E)M.auth={...M.auth??{},accountId:E}}if(n==="openai"&&T.openAiHeaders)M.headers=T.openAiHeaders;if(n==="bedrock")M.aws={accessKey:C(m.awsAccessKey),secretKey:C(m.awsSecretKey),sessionToken:C(m.awsSessionToken),region:C(T.awsRegion),authentication:T.awsAuthentication,profile:T.awsUseProfile?C(T.awsProfile):void 0,usePromptCache:T.awsBedrockUsePromptCache,useCrossRegionInference:T.awsUseCrossRegionInference,useGlobalInference:T.awsUseGlobalInference,endpoint:C(T.awsBedrockEndpoint),customModelBaseId:C(g==="plan"?T.planModeAwsBedrockCustomModelBaseId:T.actModeAwsBedrockCustomModelBaseId)};if(n==="vertex")M.gcp={projectId:C(T.vertexProjectId),region:C(T.vertexRegion)};if(n==="openai"&&(T.azureApiVersion||T.azureIdentity!==void 0))M.azure={apiVersion:C(T.azureApiVersion),useIdentity:T.azureIdentity};if(n==="sapaicore")M.sap={clientId:C(m.sapAiCoreClientId),clientSecret:C(m.sapAiCoreClientSecret),tokenUrl:C(T.sapAiCoreTokenUrl),resourceGroup:C(T.sapAiResourceGroup),deploymentId:C(g==="plan"?T.planModeSapAiCoreDeploymentId:T.actModeSapAiCoreDeploymentId),useOrchestrationMode:T.sapAiCoreUseOrchestrationMode};if(n==="oca"){M.oca={mode:T.ocaMode};let E=C(m.ocaRefreshToken);if(E)M.auth={...M.auth??{},refreshToken:E}}if(n==="qwen")M.apiLine=T.qwenApiLine;if(n==="moonshot")M.apiLine=T.moonshotApiLine;if(n==="zai")M.apiLine=T.zaiApiLine;if(n==="minimax")M.apiLine=T.minimaxApiLine;let U={anthropic:T.anthropicBaseUrl,openai:T.openAiBaseUrl,ollama:T.ollamaBaseUrl,lmstudio:T.lmStudioBaseUrl,litellm:T.liteLlmBaseUrl,gemini:T.geminiBaseUrl,requesty:T.requestyBaseUrl,asksage:T.asksageApiUrl,dify:T.difyBaseUrl,oca:T.ocaBaseUrl,aihubmix:T.aihubmixBaseUrl,sapaicore:T.sapAiCoreBaseUrl},y=C(r[n]),$=C(U[n]),h={provider:n,...y?{apiKey:y}:{},..._?{model:_}:{},...$?{baseUrl:$}:{},...A?{reasoning:A}:{},...R?{timeout:R}:{},...M},L=n1.ProviderSettingsSchema.safeParse(h);if(!L.success)return;return Object.keys(h).filter((E)=>E!=="provider").length>0?L.data:void 0}function R1(n,T){let m=new Set;for(let g of[n.actModeApiProvider,n.planModeApiProvider]){let f=C(g);if(f)m.add(f)}if(C(T.apiKey))m.add("anthropic");if(C(T.openRouterApiKey))m.add("openrouter");if(C(T.openAiApiKey))m.add("openai");if(C(T.openAiNativeApiKey))m.add("openai-native");if(C(T["openai-codex-oauth-credentials"]))m.add("openai-codex");if(C(T.geminiApiKey))m.add("gemini");if(C(T.ollamaApiKey))m.add("ollama");if(C(T.awsAccessKey)||C(T.awsBedrockApiKey))m.add("bedrock");if(C(n.vertexProjectId)||C(n.vertexRegion))m.add("vertex");if(C(T.clineApiKey))m.add("cline");if(C(T.ocaApiKey))m.add("oca");return m}function tg(n){let T=n.providerSettingsManager.read(),m=T1(n);if(!m)return{migrated:!1,providerCount:Object.keys(T.providers).length,lastUsedProvider:T.lastUsedProvider};let{globalState:g,secrets:f}=m,_=g.mode==="plan"?"plan":"act",A=R1(g,f),R=Pn();R.providers={...T.providers},R.lastUsedProvider=T.lastUsedProvider;let r=new Date().toISOString(),M=0;for(let y of A){if(R.providers[y])continue;let $=A1(y,g,f,_);if(!$)continue;R.providers[y]={settings:$,updatedAt:r,tokenSource:"migration"},M+=1}if(M===0)return{migrated:!1,providerCount:Object.keys(T.providers).length,lastUsedProvider:T.lastUsedProvider};let U=C(_==="plan"?g.planModeApiProvider:g.actModeApiProvider);return R.lastUsedProvider=T.lastUsedProvider??(U&&R.providers[U]?U:Object.keys(R.providers)[0]),n.providerSettingsManager.write(R),{migrated:!0,providerCount:Object.keys(R.providers).length,lastUsedProvider:R.lastUsedProvider}}function y1(){return new Date().toISOString()}function E1(n){if(b0(n)!=="providers.json")return;let T=Bg(n);if(b0(T)!=="settings")return;return Bg(T)}class tn{filePath;dataDir;constructor(n={}){if(this.filePath=n.filePath??Vm(),this.dataDir=n.dataDir??E1(this.filePath),this.dataDir||!n.filePath)tg({providerSettingsManager:this,dataDir:this.dataDir})}getFilePath(){return this.filePath}read(){if(!P0(this.filePath))return Pn();try{let n=M1(this.filePath,"utf8"),T=JSON.parse(n),m=rm.safeParse(T);if(m.success)return m.data}catch{}return Pn()}write(n){let T=rm.parse(n),m=Bg(this.filePath);if(!P0(m))r1(m,{recursive:!0});U1(this.filePath,`${JSON.stringify(T,null,2)}
|
|
322
|
+
`,"utf8")}saveProviderSettings(n,T={}){let m=z0.parse(n),g=this.read(),f=m.provider,_=T.setLastUsed!==!1,A=g.providers[f],R=T.tokenSource??A?.tokenSource??"manual",r={...g,providers:{...g.providers,[f]:{settings:m,updatedAt:y1(),tokenSource:R}},lastUsedProvider:_?f:g.lastUsedProvider};return this.write(r),r}getProviderSettings(n){return this.read().providers[n]?.settings}getLastUsedProviderSettings(){let n=this.read(),T=n.lastUsedProvider;if(!T)return;return n.providers[T]?.settings}getProviderConfig(n){let T=this.getProviderSettings(n);if(!T)return;return mT(T)}getLastUsedProviderConfig(){let n=this.getLastUsedProviderSettings();if(!n)return;return mT(n)}}import{existsSync as h1,mkdirSync as D1}from"node:fs";import{join as L1}from"node:path";import{createRequire as $1}from"node:module";function G(){return new Date().toISOString()}function I(n){return n?1:0}function B(n){return typeof n==="string"?n:""}function z(n){if(typeof n!=="string")return;let T=n.trim();return T.length>0?T:void 0}function x(n){return n===1||n===!0}function gT(n){let T=$1(import.meta.url);if(typeof globalThis.Bun<"u"){let{Database:_}=T("bun:sqlite"),A=new _(n,{create:!0});return{prepare:(R)=>{let r=A.query(R);return{run:(...M)=>r.run(...M),get:(...M)=>r.get(...M),all:(...M)=>r.all(...M)}},exec:(R)=>A.exec(R)}}try{let _=["node",":sqlite"].join(""),{DatabaseSync:A}=T(_),R=new A(n);return{prepare:(r)=>{let M=R.prepare(r);return{run:(...U)=>M.run(...U),get:(...U)=>M.get(...U)??null,all:(...U)=>M.all(...U)}},exec:(r)=>R.exec(r)}}catch{}let g=["better","-sqlite3"].join("");return new(T(g))(n)}function Qg(n,T={}){if(n.exec("PRAGMA journal_mode = WAL;"),n.exec("PRAGMA busy_timeout = 5000;"),n.exec(`
|
|
323
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
324
|
+
session_id TEXT PRIMARY KEY,
|
|
325
|
+
source TEXT NOT NULL,
|
|
326
|
+
pid INTEGER NOT NULL,
|
|
327
|
+
started_at TEXT NOT NULL,
|
|
328
|
+
ended_at TEXT,
|
|
329
|
+
exit_code INTEGER,
|
|
330
|
+
status TEXT NOT NULL,
|
|
331
|
+
status_lock INTEGER NOT NULL DEFAULT 0,
|
|
332
|
+
interactive INTEGER NOT NULL,
|
|
333
|
+
provider TEXT NOT NULL,
|
|
334
|
+
model TEXT NOT NULL,
|
|
335
|
+
cwd TEXT NOT NULL,
|
|
336
|
+
workspace_root TEXT NOT NULL,
|
|
337
|
+
team_name TEXT,
|
|
338
|
+
enable_tools INTEGER NOT NULL,
|
|
339
|
+
enable_spawn INTEGER NOT NULL,
|
|
340
|
+
enable_teams INTEGER NOT NULL,
|
|
341
|
+
parent_session_id TEXT,
|
|
342
|
+
parent_agent_id TEXT,
|
|
343
|
+
agent_id TEXT,
|
|
344
|
+
conversation_id TEXT,
|
|
345
|
+
is_subagent INTEGER NOT NULL DEFAULT 0,
|
|
346
|
+
prompt TEXT,
|
|
347
|
+
metadata_json TEXT,
|
|
348
|
+
transcript_path TEXT NOT NULL,
|
|
349
|
+
hook_path TEXT NOT NULL,
|
|
350
|
+
messages_path TEXT,
|
|
351
|
+
updated_at TEXT NOT NULL
|
|
352
|
+
);
|
|
353
|
+
`),n.exec(`
|
|
354
|
+
CREATE TABLE IF NOT EXISTS subagent_spawn_queue (
|
|
355
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
356
|
+
root_session_id TEXT NOT NULL,
|
|
357
|
+
parent_agent_id TEXT NOT NULL,
|
|
358
|
+
task TEXT,
|
|
359
|
+
system_prompt TEXT,
|
|
360
|
+
created_at TEXT NOT NULL,
|
|
361
|
+
consumed_at TEXT
|
|
362
|
+
);
|
|
363
|
+
`),n.exec(`
|
|
364
|
+
CREATE TABLE IF NOT EXISTS schedules (
|
|
365
|
+
schedule_id TEXT PRIMARY KEY,
|
|
366
|
+
name TEXT NOT NULL,
|
|
367
|
+
cron_pattern TEXT NOT NULL,
|
|
368
|
+
prompt TEXT NOT NULL,
|
|
369
|
+
provider TEXT NOT NULL,
|
|
370
|
+
model TEXT NOT NULL,
|
|
371
|
+
mode TEXT NOT NULL DEFAULT 'act',
|
|
372
|
+
workspace_root TEXT,
|
|
373
|
+
cwd TEXT,
|
|
374
|
+
system_prompt TEXT,
|
|
375
|
+
max_iterations INTEGER,
|
|
376
|
+
timeout_seconds INTEGER,
|
|
377
|
+
max_parallel INTEGER NOT NULL DEFAULT 1,
|
|
378
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
379
|
+
created_at TEXT NOT NULL,
|
|
380
|
+
updated_at TEXT NOT NULL,
|
|
381
|
+
last_run_at TEXT,
|
|
382
|
+
next_run_at TEXT,
|
|
383
|
+
claim_token TEXT,
|
|
384
|
+
claim_started_at TEXT,
|
|
385
|
+
claim_until_at TEXT,
|
|
386
|
+
created_by TEXT,
|
|
387
|
+
tags TEXT,
|
|
388
|
+
metadata_json TEXT
|
|
389
|
+
);
|
|
390
|
+
`),n.exec(`
|
|
391
|
+
CREATE TABLE IF NOT EXISTS schedule_executions (
|
|
392
|
+
execution_id TEXT PRIMARY KEY,
|
|
393
|
+
schedule_id TEXT NOT NULL,
|
|
394
|
+
session_id TEXT,
|
|
395
|
+
triggered_at TEXT NOT NULL,
|
|
396
|
+
started_at TEXT,
|
|
397
|
+
ended_at TEXT,
|
|
398
|
+
status TEXT NOT NULL,
|
|
399
|
+
exit_code INTEGER,
|
|
400
|
+
error_message TEXT,
|
|
401
|
+
iterations INTEGER,
|
|
402
|
+
tokens_used INTEGER,
|
|
403
|
+
cost_usd REAL,
|
|
404
|
+
FOREIGN KEY (schedule_id) REFERENCES schedules(schedule_id) ON DELETE CASCADE,
|
|
405
|
+
FOREIGN KEY (session_id) REFERENCES sessions(session_id) ON DELETE SET NULL
|
|
406
|
+
);
|
|
407
|
+
`),n.exec(`
|
|
408
|
+
CREATE INDEX IF NOT EXISTS idx_schedule_executions_schedule
|
|
409
|
+
ON schedule_executions(schedule_id, triggered_at DESC);
|
|
410
|
+
`),n.exec(`
|
|
411
|
+
CREATE INDEX IF NOT EXISTS idx_schedules_next_run
|
|
412
|
+
ON schedules(enabled, next_run_at);
|
|
413
|
+
`),!T.includeLegacyMigrations)return;let m=n.prepare("PRAGMA table_info(sessions);").all(),g=(A)=>m.some((R)=>R.name===A);if(!g("workspace_root"))n.exec("ALTER TABLE sessions ADD COLUMN workspace_root TEXT;"),n.exec("UPDATE sessions SET workspace_root = cwd WHERE workspace_root IS NULL OR workspace_root = '';");if(!g("parent_session_id"))n.exec("ALTER TABLE sessions ADD COLUMN parent_session_id TEXT;");if(!g("parent_agent_id"))n.exec("ALTER TABLE sessions ADD COLUMN parent_agent_id TEXT;");if(!g("agent_id"))n.exec("ALTER TABLE sessions ADD COLUMN agent_id TEXT;");if(!g("conversation_id"))n.exec("ALTER TABLE sessions ADD COLUMN conversation_id TEXT;");if(!g("is_subagent"))n.exec("ALTER TABLE sessions ADD COLUMN is_subagent INTEGER NOT NULL DEFAULT 0;");if(!g("messages_path"))n.exec("ALTER TABLE sessions ADD COLUMN messages_path TEXT;");if(!g("metadata_json"))n.exec("ALTER TABLE sessions ADD COLUMN metadata_json TEXT;");let f=n.prepare("PRAGMA table_info(schedules);").all(),_=(A)=>f.some((R)=>R.name===A);if(!_("claim_token"))n.exec("ALTER TABLE schedules ADD COLUMN claim_token TEXT;");if(!_("claim_started_at"))n.exec("ALTER TABLE schedules ADD COLUMN claim_started_at TEXT;");if(!_("claim_until_at"))n.exec("ALTER TABLE schedules ADD COLUMN claim_until_at TEXT;")}function W1(){return LT()}function bn(n){return n.toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")}function O1(n){return{...n,tasks:n.tasks.map((T)=>({...T,createdAt:new Date(T.createdAt),updatedAt:new Date(T.updatedAt)})),mailbox:n.mailbox.map((T)=>({...T,sentAt:new Date(T.sentAt),readAt:T.readAt?new Date(T.readAt):void 0})),missionLog:n.missionLog.map((T)=>({...T,ts:new Date(T.ts)})),runs:(n.runs??[]).map((T)=>({...T,startedAt:new Date(T.startedAt),endedAt:T.endedAt?new Date(T.endedAt):void 0,nextAttemptAt:T.nextAttemptAt?new Date(T.nextAttemptAt):void 0,heartbeatAt:T.heartbeatAt?new Date(T.heartbeatAt):void 0})),outcomes:(n.outcomes??[]).map((T)=>({...T,createdAt:new Date(T.createdAt),finalizedAt:T.finalizedAt?new Date(T.finalizedAt):void 0})),outcomeFragments:(n.outcomeFragments??[]).map((T)=>({...T,createdAt:new Date(T.createdAt),reviewedAt:T.reviewedAt?new Date(T.reviewedAt):void 0}))}}class fT{teamDirPath;db;constructor(n={}){this.teamDirPath=n.teamDir??W1()}init(){this.getRawDb()}ensureTeamDir(){if(!h1(this.teamDirPath))D1(this.teamDirPath,{recursive:!0});return this.teamDirPath}dbPath(){return L1(this.ensureTeamDir(),"teams.db")}getRawDb(){if(this.db)return this.db;let n=gT(this.dbPath());return this.ensureSchema(n),this.db=n,n}ensureSchema(n){n.exec(`
|
|
414
|
+
CREATE TABLE IF NOT EXISTS team_events (
|
|
415
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
416
|
+
team_name TEXT NOT NULL,
|
|
417
|
+
ts TEXT NOT NULL,
|
|
418
|
+
event_type TEXT NOT NULL,
|
|
419
|
+
payload_json TEXT NOT NULL,
|
|
420
|
+
causation_id TEXT,
|
|
421
|
+
correlation_id TEXT
|
|
422
|
+
);
|
|
423
|
+
CREATE INDEX IF NOT EXISTS idx_team_events_name_ts
|
|
424
|
+
ON team_events(team_name, ts DESC);
|
|
425
|
+
|
|
426
|
+
CREATE TABLE IF NOT EXISTS team_runtime_snapshot (
|
|
427
|
+
team_name TEXT PRIMARY KEY,
|
|
428
|
+
state_json TEXT NOT NULL,
|
|
429
|
+
teammates_json TEXT NOT NULL,
|
|
430
|
+
updated_at TEXT NOT NULL
|
|
431
|
+
);
|
|
432
|
+
|
|
433
|
+
CREATE TABLE IF NOT EXISTS team_tasks (
|
|
434
|
+
team_name TEXT NOT NULL,
|
|
435
|
+
task_id TEXT NOT NULL,
|
|
436
|
+
title TEXT NOT NULL,
|
|
437
|
+
description TEXT NOT NULL,
|
|
438
|
+
status TEXT NOT NULL,
|
|
439
|
+
assignee TEXT,
|
|
440
|
+
depends_on_json TEXT NOT NULL,
|
|
441
|
+
summary TEXT,
|
|
442
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
443
|
+
updated_at TEXT NOT NULL,
|
|
444
|
+
PRIMARY KEY(team_name, task_id)
|
|
445
|
+
);
|
|
446
|
+
|
|
447
|
+
CREATE TABLE IF NOT EXISTS team_runs (
|
|
448
|
+
team_name TEXT NOT NULL,
|
|
449
|
+
run_id TEXT NOT NULL,
|
|
450
|
+
agent_id TEXT NOT NULL,
|
|
451
|
+
task_id TEXT,
|
|
452
|
+
status TEXT NOT NULL,
|
|
453
|
+
message TEXT NOT NULL,
|
|
454
|
+
started_at TEXT,
|
|
455
|
+
ended_at TEXT,
|
|
456
|
+
error TEXT,
|
|
457
|
+
lease_owner TEXT,
|
|
458
|
+
heartbeat_at TEXT,
|
|
459
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
460
|
+
PRIMARY KEY(team_name, run_id)
|
|
461
|
+
);
|
|
462
|
+
CREATE INDEX IF NOT EXISTS idx_team_runs_status
|
|
463
|
+
ON team_runs(team_name, status);
|
|
464
|
+
|
|
465
|
+
CREATE TABLE IF NOT EXISTS team_outcomes (
|
|
466
|
+
team_name TEXT NOT NULL,
|
|
467
|
+
outcome_id TEXT NOT NULL,
|
|
468
|
+
title TEXT NOT NULL,
|
|
469
|
+
status TEXT NOT NULL,
|
|
470
|
+
schema_json TEXT NOT NULL,
|
|
471
|
+
finalized_at TEXT,
|
|
472
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
473
|
+
PRIMARY KEY(team_name, outcome_id)
|
|
474
|
+
);
|
|
475
|
+
|
|
476
|
+
CREATE TABLE IF NOT EXISTS team_outcome_fragments (
|
|
477
|
+
team_name TEXT NOT NULL,
|
|
478
|
+
outcome_id TEXT NOT NULL,
|
|
479
|
+
fragment_id TEXT NOT NULL,
|
|
480
|
+
section TEXT NOT NULL,
|
|
481
|
+
source_agent_id TEXT NOT NULL,
|
|
482
|
+
source_run_id TEXT,
|
|
483
|
+
content TEXT NOT NULL,
|
|
484
|
+
status TEXT NOT NULL,
|
|
485
|
+
reviewed_by TEXT,
|
|
486
|
+
reviewed_at TEXT,
|
|
487
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
488
|
+
PRIMARY KEY(team_name, fragment_id)
|
|
489
|
+
);
|
|
490
|
+
`)}run(n,T=[]){return this.getRawDb().prepare(n).run(...T)}queryOne(n,T=[]){return this.getRawDb().prepare(n).get(...T)??void 0}queryAll(n,T=[]){return this.getRawDb().prepare(n).all(...T)}listTeamNames(){return this.queryAll("SELECT team_name FROM team_runtime_snapshot ORDER BY team_name ASC").map((n)=>n.team_name)}readState(n){let T=this.queryOne("SELECT team_name, state_json, teammates_json, updated_at FROM team_runtime_snapshot WHERE team_name = ?",[bn(n)]);if(!T)return;return O1(JSON.parse(T.state_json))}readHistory(n,T=200){return this.queryAll("SELECT event_type, payload_json, ts FROM team_events WHERE team_name = ? ORDER BY id DESC LIMIT ?",[bn(n),T]).map((m)=>({eventType:m.event_type,payload:JSON.parse(m.payload_json),ts:m.ts}))}loadRuntime(n){let T=bn(n),m=this.readState(T),g=this.queryOne("SELECT team_name, state_json, teammates_json, updated_at FROM team_runtime_snapshot WHERE team_name = ?",[T]),f=g?JSON.parse(g.teammates_json):[],_=this.markInProgressRunsInterrupted(T,"runtime_recovered");return{state:m,teammates:f,interruptedRunIds:_}}appendTeamEvent(n,T,m,g){this.run(`INSERT INTO team_events (team_name, ts, event_type, payload_json, causation_id, correlation_id)
|
|
491
|
+
VALUES (?, ?, ?, ?, NULL, ?)`,[bn(n),G(),T,JSON.stringify(m),g??null])}persistRuntime(n,T,m){let g=bn(n),f=G();this.run(`INSERT INTO team_runtime_snapshot (team_name, state_json, teammates_json, updated_at)
|
|
492
|
+
VALUES (?, ?, ?, ?)
|
|
493
|
+
ON CONFLICT(team_name) DO UPDATE SET
|
|
494
|
+
state_json = excluded.state_json,
|
|
495
|
+
teammates_json = excluded.teammates_json,
|
|
496
|
+
updated_at = excluded.updated_at`,[g,JSON.stringify(T),JSON.stringify(m),f]);for(let _ of T.tasks)this.run(`INSERT INTO team_tasks (team_name, task_id, title, description, status, assignee, depends_on_json, summary, version, updated_at)
|
|
497
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1, ?)
|
|
498
|
+
ON CONFLICT(team_name, task_id) DO UPDATE SET
|
|
499
|
+
title = excluded.title,
|
|
500
|
+
description = excluded.description,
|
|
501
|
+
status = excluded.status,
|
|
502
|
+
assignee = excluded.assignee,
|
|
503
|
+
depends_on_json = excluded.depends_on_json,
|
|
504
|
+
summary = excluded.summary,
|
|
505
|
+
version = team_tasks.version + 1,
|
|
506
|
+
updated_at = excluded.updated_at`,[g,_.id,_.title,_.description,_.status,_.assignee??null,JSON.stringify(_.dependsOn??[]),_.summary??null,_.updatedAt.toISOString()]);for(let _ of T.runs??[])this.run(`INSERT INTO team_runs (team_name, run_id, agent_id, task_id, status, message, started_at, ended_at, error, lease_owner, heartbeat_at, version)
|
|
507
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)
|
|
508
|
+
ON CONFLICT(team_name, run_id) DO UPDATE SET
|
|
509
|
+
agent_id = excluded.agent_id,
|
|
510
|
+
task_id = excluded.task_id,
|
|
511
|
+
status = excluded.status,
|
|
512
|
+
message = excluded.message,
|
|
513
|
+
started_at = excluded.started_at,
|
|
514
|
+
ended_at = excluded.ended_at,
|
|
515
|
+
error = excluded.error,
|
|
516
|
+
lease_owner = excluded.lease_owner,
|
|
517
|
+
heartbeat_at = excluded.heartbeat_at,
|
|
518
|
+
version = team_runs.version + 1`,[g,_.id,_.agentId,_.taskId??null,_.status,_.message,_.startedAt?_.startedAt.toISOString():null,_.endedAt?_.endedAt.toISOString():null,_.error??null,_.leaseOwner??null,_.heartbeatAt?_.heartbeatAt.toISOString():null]);for(let _ of T.outcomes??[])this.run(`INSERT INTO team_outcomes (team_name, outcome_id, title, status, schema_json, finalized_at, version)
|
|
519
|
+
VALUES (?, ?, ?, ?, ?, ?, 1)
|
|
520
|
+
ON CONFLICT(team_name, outcome_id) DO UPDATE SET
|
|
521
|
+
title = excluded.title,
|
|
522
|
+
status = excluded.status,
|
|
523
|
+
schema_json = excluded.schema_json,
|
|
524
|
+
finalized_at = excluded.finalized_at,
|
|
525
|
+
version = team_outcomes.version + 1`,[g,_.id,_.title,_.status,JSON.stringify({requiredSections:_.requiredSections}),_.finalizedAt?_.finalizedAt.toISOString():null]);for(let _ of T.outcomeFragments??[])this.run(`INSERT INTO team_outcome_fragments (team_name, outcome_id, fragment_id, section, source_agent_id, source_run_id, content, status, reviewed_by, reviewed_at, version)
|
|
526
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)
|
|
527
|
+
ON CONFLICT(team_name, fragment_id) DO UPDATE SET
|
|
528
|
+
outcome_id = excluded.outcome_id,
|
|
529
|
+
section = excluded.section,
|
|
530
|
+
source_agent_id = excluded.source_agent_id,
|
|
531
|
+
source_run_id = excluded.source_run_id,
|
|
532
|
+
content = excluded.content,
|
|
533
|
+
status = excluded.status,
|
|
534
|
+
reviewed_by = excluded.reviewed_by,
|
|
535
|
+
reviewed_at = excluded.reviewed_at,
|
|
536
|
+
version = team_outcome_fragments.version + 1`,[g,_.outcomeId,_.id,_.section,_.sourceAgentId,_.sourceRunId??null,_.content,_.status,_.reviewedBy??null,_.reviewedAt?_.reviewedAt.toISOString():null])}markInProgressRunsInterrupted(n,T){let m=bn(n),g=this.queryAll("SELECT run_id FROM team_runs WHERE team_name = ? AND status IN ('queued', 'running')",[m]);if(g.length===0)return[];let f=G();return this.run(`UPDATE team_runs SET status = 'interrupted', error = ?, ended_at = ?, version = version + 1
|
|
537
|
+
WHERE team_name = ? AND status IN ('queued', 'running')`,[T,f,m]),g.map((_)=>_.run_id)}handleTeamEvent(n,T){this.appendTeamEvent(n,T.type,T)}}function _n(){return new Date().toISOString()}function u0(n,T){if(T<=0)return 0;return Math.round(n/T*100)}function C1(n,T){let m=new Set;for(let f of T)if(f.status==="reviewed")m.add(`${f.outcomeId}:${f.section}`);let g=new Set;for(let f of n){if(f.status==="finalized")continue;for(let _ of f.requiredSections)if(!m.has(`${f.id}:${_}`))g.add(`${f.id}:${_}`)}return[...g].sort((f,_)=>f.localeCompare(_))}function Mm(n,T){let m={idle:0,running:0,stopped:0},g={pending:0,in_progress:0,blocked:0,completed:0},f={queued:0,running:0,completed:0,failed:0,cancelled:0,interrupted:0},_={draft:0,in_review:0,finalized:0},A={draft:0,reviewed:0,rejected:0},R=0,r=0;for(let E of T.members)if(m[E.status]+=1,E.role==="lead")R+=1;else r+=1;let M=[],U=[],y=T.tasks.filter((E)=>E.status==="completed").length,$=new Map(T.tasks.map((E)=>[E.id,E]));for(let E of T.tasks){if(g[E.status]+=1,E.status==="blocked"){M.push(E.id);continue}if(E.status!=="pending")continue;if(E.dependsOn.every((D)=>{return $.get(D)?.status==="completed"}))U.push(E.id)}let h=[],L,W=0;for(let E of T.runs){if(f[E.status]+=1,E.status==="queued"||E.status==="running")h.push(E.id);let Y=E.startedAt.getTime();if(Y>=W)W=Y,L=E.id}for(let E of T.outcomes)_[E.status]+=1;for(let E of T.outcomeFragments)A[E.status]+=1;return{teamName:n,updatedAt:_n(),members:{total:T.members.length,byStatus:m,leadCount:R,teammateCount:r},tasks:{total:T.tasks.length,byStatus:g,blockedTaskIds:M,readyTaskIds:U,completionPct:u0(y,T.tasks.length)},runs:{total:T.runs.length,byStatus:f,activeRunIds:h,latestRunId:L},outcomes:{total:T.outcomes.length,byStatus:_,finalizedPct:u0(_.finalized,T.outcomes.length),missingRequiredSections:C1(T.outcomes,T.outcomeFragments)},fragments:{total:T.outcomeFragments.length,byStatus:A}}}function Um(n){let{event:T}=n;switch(T.type){case"team_task_updated":return{teamName:n.teamName,sessionId:n.sessionId,eventType:T.type,ts:_n(),taskId:T.task.id,agentId:T.task.assignee??T.task.createdBy};case"run_queued":case"run_started":case"run_completed":case"run_failed":case"run_cancelled":case"run_interrupted":return{teamName:n.teamName,sessionId:n.sessionId,eventType:T.type,ts:_n(),runId:T.run.id,taskId:T.run.taskId,agentId:T.run.agentId,message:T.run.error};case"run_progress":return{teamName:n.teamName,sessionId:n.sessionId,eventType:T.type,ts:_n(),runId:T.run.id,taskId:T.run.taskId,agentId:T.run.agentId,message:T.message};case"outcome_created":case"outcome_finalized":return{teamName:n.teamName,sessionId:n.sessionId,eventType:T.type,ts:_n(),outcomeId:T.outcome.id};case"outcome_fragment_attached":case"outcome_fragment_reviewed":return{teamName:n.teamName,sessionId:n.sessionId,eventType:T.type,ts:_n(),outcomeId:T.fragment.outcomeId,fragmentId:T.fragment.id,agentId:T.fragment.sourceAgentId};case"team_message":return{teamName:n.teamName,sessionId:n.sessionId,eventType:T.type,ts:_n(),taskId:T.message.taskId,agentId:T.message.fromAgentId,message:T.message.subject};case"team_mission_log":return{teamName:n.teamName,sessionId:n.sessionId,eventType:T.type,ts:_n(),taskId:T.entry.taskId,agentId:T.entry.agentId,message:T.entry.summary};case"teammate_spawned":case"teammate_shutdown":case"task_start":case"task_end":case"agent_event":return{teamName:n.teamName,sessionId:n.sessionId,eventType:T.type,ts:_n(),agentId:T.agentId}}return{teamName:n.teamName,sessionId:n.sessionId,eventType:T.type,ts:_n()}}var Zg=zm,_T;((A)=>{A.CLI="cli";A.CLI_SUBAGENT="cli-subagent";A.CORE="core";A.CORE_SUBAGENT="core-subagent";A.DESKTOP="desktop";A.DESKTOP_CHAT="desktop-chat"})(_T||={});import{mkdir as N1,readFile as Y1,writeFile as X1}from"node:fs/promises";import{dirname as G0,join as V1}from"node:path";import{models as AT}from"@clinebot/llms";function K1(n){return n.apiKey??n.auth?.apiKey}function j1(n){return(n.auth?.accessToken?.trim()??"").length>0}function k0(n){return n.split(/[-_]/).filter(Boolean).map((T)=>T.charAt(0).toUpperCase()+T.slice(1)).join(" ")}function J1(n){let T=n.split(/\s+/).map((m)=>m.trim()).filter(Boolean);if(T.length===0)return"?";if(T.length===1)return T[0].slice(0,2).toUpperCase();return`${T[0][0]}${T[1][0]}`.toUpperCase()}function t1(n){let T=["#c4956a","#6b8aad","#e8963a","#5b9bd5","#6bbd7b","#9b7dd4","#d07f68","#57a6a1"],m=0;for(let g of n)m=m*31+g.charCodeAt(0)>>>0;return T[m%T.length]}function S0(n){return V1(G0(n.getFilePath()),"models.json")}function B1(){return{version:1,providers:{}}}async function c0(n){try{let T=await Y1(n,"utf8"),m=JSON.parse(T);if(m&&m.version===1&&m.providers&&typeof m.providers==="object")return{version:1,providers:m.providers}}catch{}return B1()}async function Q1(n,T){await N1(G0(n),{recursive:!0}),await X1(n,`${JSON.stringify(T,null,2)}
|
|
538
|
+
`,"utf8")}function Z1(n){if(!n||n.length===0)return;let T=new Set;if(n.includes("reasoning"))T.add("reasoning");if(n.includes("prompt-cache"))T.add("prompt-cache");if(n.includes("tools"))T.add("tools");return T.size>0?[...T]:void 0}function z1(n){let T=new Set;if(!n||n.length===0)return[...T];if(n.includes("streaming"))T.add("streaming");if(n.includes("tools"))T.add("tools");if(n.includes("reasoning"))T.add("reasoning");if(n.includes("prompt-cache"))T.add("prompt-cache");if(n.includes("vision"))T.add("images"),T.add("files");return[...T]}function I0(n,T){let m=z1(T.provider.capabilities),g=Object.values(T.models).map((A)=>A.id.trim()).filter((A)=>A.length>0),f=T.provider.defaultModelId?.trim()||g[0]||"default",_=Object.fromEntries(g.map((A)=>[A,{id:A,name:T.models[A]?.name??A,capabilities:m.length>0?m:void 0,status:"active"}]));AT.registerProvider({provider:{id:n,name:T.provider.name.trim()||k0(n),protocol:"openai-chat",baseUrl:T.provider.baseUrl,defaultModelId:f,capabilities:Z1(T.provider.capabilities)},models:_})}var v0=!1;async function F1(n){if(v0)return;let T=S0(n),m=await c0(T);for(let[g,f]of Object.entries(m.providers))I0(g,f);v0=!0}function zg(n){if(Array.isArray(n))return n.map((T)=>{if(typeof T==="string")return T.trim();if(T&&typeof T==="object"&&"id"in T){let m=T.id;return typeof m==="string"?m.trim():""}return""}).filter((T)=>T.length>0);return[]}function q1(n,T){let m=zg(n);if(m.length>0)return m;if(!n||typeof n!=="object")return[];let g=n,f=zg(g.data??g.models);if(f.length>0)return f;if(g.models&&typeof g.models==="object"&&!Array.isArray(g.models)){let A=Object.keys(g.models).filter((R)=>R.trim().length>0);if(A.length>0)return A}let _=g.providers?.[T];if(_&&typeof _==="object"){let R=zg(_.models??_);if(R.length>0)return R}return[]}async function H1(n,T){let m=await fetch(n,{method:"GET"});if(!m.ok)throw Error(`failed to fetch models from ${n}: HTTP ${m.status}`);let g=await m.json();return q1(g,T)}async function P1(n,T){let m=T.providerId.trim().toLowerCase();if(!m)throw Error("providerId is required");if(AT.hasProvider(m))throw Error(`provider "${m}" already exists`);let g=T.name.trim();if(!g)throw Error("name is required");let f=T.baseUrl.trim();if(!f)throw Error("baseUrl is required");let _=(T.models??[]).map((E)=>E.trim()).filter((E)=>E.length>0),A=T.modelsSourceUrl?.trim(),R=A?await H1(A,m):[],r=[...new Set([..._,...R])];if(r.length===0)throw Error("at least one model is required (manual or via modelsSourceUrl)");let M=T.defaultModelId?.trim()&&r.includes(T.defaultModelId.trim())?T.defaultModelId.trim():r[0],U=T.capabilities?.length?[...new Set(T.capabilities)]:void 0,y=Object.entries(T.headers??{}).filter(([E])=>E.trim().length>0);n.saveProviderSettings({provider:m,apiKey:T.apiKey?.trim()?T.apiKey:void 0,baseUrl:f,headers:y.length>0?Object.fromEntries(y):void 0,timeout:T.timeoutMs,model:M},{setLastUsed:!1});let $=S0(n),h=await c0($),L=U?.includes("vision")??!1,W=L;return h.providers[m]={provider:{name:g,baseUrl:f,defaultModelId:M,capabilities:U,modelsSourceUrl:A},models:Object.fromEntries(r.map((E)=>[E,{id:E,name:E,supportsVision:L,supportsAttachments:W}]))},await Q1($,h),I0(m,h.providers[m]),{providerId:m,settingsPath:n.getFilePath(),modelsPath:$,modelsCount:r.length}}async function b1(n){let T=n.read(),m=AT.getProviderIds().sort((f,_)=>f.localeCompare(_));return{providers:await Promise.all(m.map(async(f)=>{let _=await AT.getProvider(f),A=T.providers[f]?.settings,R=_?.name??k0(f);return{id:f,name:R,models:null,color:t1(f),letter:J1(R),enabled:Boolean(A),apiKey:A?K1(A):void 0,oauthAccessTokenPresent:A?j1(A):void 0,baseUrl:A?.baseUrl??_?.baseUrl,defaultModelId:_?.defaultModelId,authDescription:"This provider uses API keys for authentication.",baseUrlDescription:"The base endpoint to use for provider requests."}})),settingsPath:n.getFilePath()}}async function u1(n){let T=n.trim(),m=await AT.getModelsForProvider(T),g=Object.entries(m).sort(([f],[_])=>f.localeCompare(_)).map(([f,_])=>({id:f,name:_.name??f,supportsAttachments:_.capabilities?.includes("files"),supportsVision:_.capabilities?.includes("images")}));return{providerId:T,models:g}}function v1(n,T){let m=T.providerId.trim(),g=n.read();if(T.enabled===!1){if(delete g.providers[m],g.lastUsedProvider===m)delete g.lastUsedProvider;return n.write(g),{providerId:m,enabled:!1,settingsPath:n.getFilePath()}}let _={...n.getProviderSettings(m)??{},provider:m};if(Object.hasOwn(T,"apiKey")&&typeof T.apiKey==="string")if((T.apiKey?.trim()??"").length===0)delete _.apiKey;else _.apiKey=T.apiKey;if(Object.hasOwn(T,"baseUrl")&&typeof T.baseUrl==="string")if((T.baseUrl?.trim()??"").length===0)delete _.baseUrl;else _.baseUrl=T.baseUrl;return n.saveProviderSettings(_,{setLastUsed:!1}),{providerId:m,enabled:!0,settingsPath:n.getFilePath()}}function G1(n){let T=n.trim().toLowerCase();if(T==="codex"||T==="openai-codex")return"openai-codex";if(T==="cline"||T==="oca")return T;throw Error(`provider "${n}" does not support OAuth login (supported: cline, oca, openai-codex)`)}function k1(n,T){if(n==="cline")return`workos:${T.access}`;return T.access}async function S1(n,T,m){let g=Mg({onPrompt:async(f)=>f.defaultValue??"",openUrl:m,onOpenUrlError:({error:f})=>{throw f instanceof Error?f:Error(String(f))}});if(n==="cline")return mm({apiBaseUrl:T?.baseUrl?.trim()||"https://api.cline.bot",callbacks:g});if(n==="oca")return Am({mode:T?.oca?.mode,callbacks:g});return fm(g)}function c1(n,T,m,g){let f={...m?.auth??{},accessToken:k1(T,g),refreshToken:g.refresh,accountId:g.accountId};f.expiresAt=g.expires;let _={...m??{provider:T},provider:T,auth:f};return n.saveProviderSettings(_,{tokenSource:"oauth"}),_}function I1(n){let T=n?.auth?.accessToken?.trim()||n?.apiKey?.trim();return T&&T.length>0?T:void 0}function x0(n){return n.disabled!==!0}function w0(n){if(n.length===0)return"";return`
|
|
539
|
+
|
|
540
|
+
# Rules
|
|
541
|
+
${n.map((m)=>`## ${m.name}
|
|
542
|
+
${m.instructions}`).join(`
|
|
543
|
+
|
|
544
|
+
`)}`}function a0(n){return[...n.getSnapshot("rule").values()].map((m)=>m.item).filter(x0).sort((m,g)=>m.name.localeCompare(g.name))}function x1(n){return w0(a0(n))}import{existsSync as Fg,readdirSync as w1}from"node:fs";import{join as i0}from"node:path";import{AgentTeamsRuntime as a1,bootstrapAgentTeams as i1}from"@clinebot/agents";import{nanoid as l1}from"nanoid";var p1="# Workspace Configuration";function e0(){return`agent-team-${l1(5)}`}function l0(n,T,m,g,f,_,A){let R=m==="plan"?Mn.readonly:Mn.development,r=km(T,g,m,f??Gm);return sn({cwd:n,...R,...r,enableSkills:!!_,executors:{..._?{skills:_}:{},...A??{}}})}var p0="SKILL.md";function d1(n){return qg(n).filter((T)=>!T.disabled).map((T)=>T.name.trim()).filter((T)=>T.length>0).sort((T,m)=>T.localeCompare(m))}function qg(n){return[...n.getSnapshot("skill").entries()].map(([m,g])=>{let f=g.item;return{id:m,name:f.name.trim(),description:f.description?.trim(),disabled:f.disabled===!0}})}function d0(n){for(let T of dn(n)){if(!Fg(T))continue;let m=i0(T,p0);if(Fg(m))return!0;try{let g=w1(T,{withFileTypes:!0});for(let f of g){if(!f.isDirectory())continue;if(Fg(i0(T,f.name,p0)))return!0}}catch{}}return!1}function e1(n,T){let m=T.trim().replace(/^\/+/,"").toLowerCase();if(!m)return{error:"Missing skill name."};let g=n.getSnapshot("skill"),f=g.get(m);if(f){let r=f.item;if(r.disabled===!0)return{error:`Skill "${r.name}" is configured but disabled.`};return{id:m,skill:r}}let _=m.includes(":")?m.split(":").at(-1)??m:m,A=[...g.entries()].filter(([r])=>{if(r===_)return!0;return r.endsWith(`:${_}`)});if(A.length===1){let[r,M]=A[0],U=M.item;if(U.disabled===!0)return{error:`Skill "${U.name}" is configured but disabled.`};return{id:r,skill:U}}if(A.length>1)return{error:`Skill "${T}" is ambiguous. Use one of: ${A.map(([r])=>r).join(", ")}`};let R=d1(n);return{error:R.length>0?`Skill "${T}" not found. Available skills: ${R.join(", ")}`:"No skills are currently available."}}function s1(n,T){let m=new Set,g=async(f,_)=>{await T;let A=e1(n,f);if("error"in A)return A.error;let{id:R,skill:r}=A;if(m.has(R))return`Skill "${r.name}" is already running.`;m.add(R);try{let M=_?.trim(),U=M?`
|
|
545
|
+
<command-args>${M}</command-args>`:"",y=r.description?.trim()?`Description: ${r.description.trim()}
|
|
546
|
+
|
|
547
|
+
`:"";return`<command-name>${r.name}</command-name>${U}
|
|
548
|
+
<command-instructions>
|
|
549
|
+
${y}${r.instructions}
|
|
550
|
+
</command-instructions>`}finally{m.delete(R)}};return Object.defineProperty(g,"configuredSkills",{get:()=>qg(n),enumerable:!0,configurable:!1}),g}function o1(n,T){if(!n)return;for(let m of n.getTeammateIds())try{n.shutdownTeammate(m,T)}catch{}}function nr(n){let T=n.lastIndexOf(p1);if(T<0)return;let m=n.slice(T).trim();return m.length>0?m:void 0}function Tr(n){return{mode:n.mode==="plan"?"plan":"act",enableTools:n.enableTools!==!1,enableSpawnAgent:n.enableSpawnAgent!==!1,enableAgentTeams:n.enableAgentTeams!==!1,missionLogIntervalSteps:typeof n.missionLogIntervalSteps==="number"&&Number.isFinite(n.missionLogIntervalSteps)?n.missionLogIntervalSteps:3,missionLogIntervalMs:typeof n.missionLogIntervalMs==="number"&&Number.isFinite(n.missionLogIntervalMs)?n.missionLogIntervalMs:120000}}class ym{build(n){let{config:T,hooks:m,extensions:g,logger:f,createSpawnTool:_,onTeamRestored:A,userInstructionWatcher:R,defaultToolExecutors:r}=n,M=n.onTeamEvent??(()=>{}),U=Tr(T),y=[],$=T.teamName?.trim()||e0(),h=!1,L=Boolean(R),W=R,E=Promise.resolve(),Y;if(!W&&U.enableTools&&d0(T.cwd))W=eT({skills:{workspacePath:T.cwd},rules:{workspacePath:T.cwd},workflows:{workspacePath:T.cwd}}),E=W.start().catch(()=>{});if(U.enableTools&&W&&(L||d0(T.cwd)||qg(W).length>0))Y=s1(W,E);if(U.enableTools)y.push(...l0(T.cwd,T.providerId,U.mode,T.modelId,T.toolRoutingRules,Y,r));let D,j=U.enableAgentTeams?new fT:void 0;j?.init();let Q=j?.loadRuntime($),b=Q?.state,v=Q?.teammates??[],Z=new Map(v.map((V)=>[V.agentId,V])),k=()=>{if(!U.enableAgentTeams)return;if(!D){if(D=new a1({teamName:$,leadAgentId:"lead",missionLogIntervalSteps:U.missionLogIntervalSteps,missionLogIntervalMs:U.missionLogIntervalMs,onTeamEvent:(V)=>{if(M(V),D&&j){if(V.type==="teammate_spawned"&&V.teammate?.rolePrompt){let s={agentId:V.agentId,rolePrompt:V.teammate.rolePrompt,modelId:V.teammate.modelId,maxIterations:V.teammate.maxIterations};Z.set(s.agentId,s)}if(V.type==="teammate_shutdown")Z.delete(V.agentId);j.handleTeamEvent($,V),j.persistRuntime($,D.exportState(),Array.from(Z.values()))}}}),b)D.hydrateState(b),D.markStaleRunsInterrupted("runtime_recovered")}if(!h){if(!D)return;h=!0;let V=i1({runtime:D,leadAgentId:"lead",restoredFromPersistence:Boolean(b),restoredTeammates:v,createBaseTools:U.enableTools?()=>l0(T.cwd,T.providerId,U.mode,T.modelId,T.toolRoutingRules,Y,r):void 0,teammateRuntime:{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,clineWorkspaceMetadata:T.providerId==="cline"?nr(T.systemPrompt):void 0,maxIterations:T.maxIterations,hooks:m,extensions:g??T.extensions,logger:f??T.logger}});if(V.restoredFromPersistence)A?.();y.push(...V.tools)}return D};if(U.enableSpawnAgent&&_){let V=_();y.push({...V,execute:async(s,Nm)=>{return k(),V.execute(s,Nm)}})}if(U.enableAgentTeams)k();let J=D?()=>{let V=D;if(!V)return;let s=V.listTasks(),Nm=s.some((En)=>En.status==="in_progress"||En.status==="pending"),pg=V.listRuns({}),J_=pg.some((En)=>En.status==="running"||En.status==="queued");if(Nm||J_){let En=s.filter((w)=>w.status==="in_progress"||w.status==="pending").map((w)=>`${w.id} (${w.status}): ${w.title}`).join(", "),dg=pg.filter((w)=>w.status==="running"||w.status==="queued").map((w)=>`${w.id} (${w.status})`).join(", "),Ym=[];if(En)Ym.push(`Unfinished tasks: ${En}`);if(dg)Ym.push(`Active runs: ${dg}`);return`[SYSTEM] You still have team obligations. ${Ym.join(". ")}. Use team_run_task to delegate work, or team_complete_task to mark tasks done, or team_await_run / team_await_all_runs to wait for active runs. Do NOT stop until all tasks are completed.`}return}:void 0;return{tools:y,logger:f??T.logger,teamRuntime:D,completionGuard:J,shutdown:(V)=>{if(o1(D,V),!L)W?.stop()}}}}import{mkdir as mr,readFile as gr,unlink as Hg,writeFile as fr}from"node:fs/promises";import{join as s0}from"node:path";function _r(n){return n.replace(/[^a-zA-Z0-9._-]+/g,"_")}function Ar(n){return new Promise((T)=>setTimeout(T,n))}async function Rr(n,T={}){let m=T.approvalDir?.trim(),g=T.sessionId?.trim();if(!m||!g)return{approved:!1,reason:"Desktop tool approval IPC is not configured"};await mr(m,{recursive:!0});let f=_r(`${n.toolCallId}`),_=s0(m,`${g}.request.${f}.json`),A=s0(m,`${g}.decision.${f}.json`),R=T.nowIso??(()=>new Date().toISOString());await fr(_,`${JSON.stringify({requestId:f,sessionId:g,createdAt:R(),toolCallId:n.toolCallId,toolName:n.toolName,input:n.input,iteration:n.iteration,agentId:n.agentId,conversationId:n.conversationId},null,2)}
|
|
551
|
+
`,"utf8");let r=T.timeoutMs??300000,M=T.pollIntervalMs??200,U=Date.now();while(Date.now()-U<r){try{let y=await gr(A,"utf8"),$=JSON.parse(y),h={approved:$.approved===!0,reason:typeof $.reason==="string"?$.reason:void 0};try{await Hg(A)}catch{}try{await Hg(_)}catch{}return h}catch{}await Ar(M)}try{await Hg(_)}catch{}return{approved:!1,reason:"Tool approval request timed out"}}function rr(n){return n.disabled!==!0}function o0(n){return[...n.getSnapshot("workflow").entries()].map(([m,g])=>({id:m,workflow:g.item})).filter(({workflow:m})=>rr(m)).map(({id:m,workflow:g})=>({id:m,name:g.name,instructions:g.instructions})).sort((m,g)=>m.name.localeCompare(g.name))}function Mr(n,T){if(!n.startsWith("/")||n.length<2)return n;let m=n.match(/^\/(\S+)/);if(!m)return n;let g=m[1];if(!g)return n;let f=g.length+1,_=n.slice(f),A=o0(T).find((R)=>R.name===g);return A?`${A.instructions}${_}`:n}import{existsSync as cg,readFileSync as Ig}from"node:fs";import{readFile as Pr,stat as br}from"node:fs/promises";import{homedir as ur}from"node:os";import{isAbsolute as vr,join as RT,resolve as Gr}from"node:path";import{Agent as kr,createSpawnAgentTool as Sr}from"@clinebot/agents";import{nanoid as cr}from"nanoid";import{spawn as Ur}from"node:child_process";import{appendFileSync as yr,readFileSync as Er}from"node:fs";function $m(n){if(!n||typeof n!=="object")return{};let T={};for(let[m,g]of Object.entries(n))T[m]=typeof g==="string"?g:JSON.stringify(g);return T}function Em(n,T,m){let g=m instanceof Error?`: ${m.message}`:"",f=`${T}${g}`;if(n?.warn){n.warn(f);return}console.warn(f)}function n_(n,T){if(!T)return n;if(!n)return{...T};let m=[n.context,T.context].filter((f)=>typeof f==="string"&&f.length>0).join(`
|
|
552
|
+
`),g=[...n.appendMessages??[],...T.appendMessages??[]];return{cancel:n.cancel===!0||T.cancel===!0?!0:void 0,review:n.review===!0||T.review===!0?!0:void 0,context:m||void 0,overrideInput:T.overrideInput!==void 0?T.overrideInput:n.overrideInput,systemPrompt:T.systemPrompt!==void 0?T.systemPrompt:n.systemPrompt,appendMessages:g.length>0?g:void 0}}function $r(n){if(!n||typeof n!=="object")return;let T=n,m=typeof T.context==="string"?T.context:typeof T.contextModification==="string"?T.contextModification:typeof T.errorMessage==="string"?T.errorMessage:void 0;return{cancel:typeof T.cancel==="boolean"?T.cancel:void 0,review:typeof T.review==="boolean"?T.review:void 0,context:m,overrideInput:Object.hasOwn(T,"overrideInput")?T.overrideInput:void 0}}function T_(n){let T=String(n??"").toLowerCase();return T.includes("cancel")||T.includes("abort")||T.includes("interrupt")}function hr(n){en(n)}function S(n,T){let m=process.env.CLINE_USER_ID?.trim()||process.env.USER?.trim()||"unknown",g={rootSessionId:T.rootSessionId||n.conversationId,hookLogPath:T.hookLogPath};return{clineVersion:process.env.CLINE_VERSION?.trim()||"",timestamp:new Date().toISOString(),taskId:n.conversationId,sessionContext:g,workspaceRoots:T.workspacePath?[T.workspacePath]:[],userId:m,agent_id:n.agentId,parent_agent_id:n.parentAgentId}}function Dr(n){let T=n.trim();if(!T)return{};let g=T.split(`
|
|
553
|
+
`).map((_)=>_.trim()).filter(Boolean).filter((_)=>_.startsWith("HOOK_CONTROL\t")).map((_)=>_.slice(13)),f=g.length>0?g[g.length-1]:T;try{return{parsedJson:JSON.parse(f)}}catch(_){return{parseError:_ instanceof Error?_.message:"Failed to parse hook stdout JSON"}}}async function m_(n,T){if(T.command.length===0)throw Error("runHookCommand requires non-empty command");let m=Ur(T.command[0],T.command.slice(1),{cwd:T.cwd,env:T.env,stdio:T.detached?["pipe","ignore","ignore"]:["pipe","pipe","pipe"],detached:T.detached}),g=JSON.stringify(n);if(!m.stdin)throw Error("hook command failed to create stdin");if(m.stdin.write(g),m.stdin.end(),T.detached){await new Promise((r,M)=>{m.once("error",M),m.once("spawn",()=>r())}),m.unref();return}if(!m.stdout||!m.stderr)throw Error("hook command failed to create stdout/stderr");let f="",_="",A=!1,R;return m.stdout.on("data",(r)=>{f+=r.toString()}),m.stderr.on("data",(r)=>{_+=r.toString()}),await new Promise((r,M)=>{if(m.once("error",M),(T.timeoutMs??0)>0)R=setTimeout(()=>{A=!0,m.kill("SIGKILL")},T.timeoutMs);m.once("close",(U)=>{if(R)clearTimeout(R);let{parsedJson:y,parseError:$}=Dr(f);r({exitCode:U,stdout:f,stderr:_,parsedJson:y,parseError:$,timedOut:A})})})}function Lr(n){try{let m=Er(n,"utf8").split(/\r?\n/,1)[0]?.trim();if(!m?.startsWith("#!"))return;let g=m.slice(2).trim();if(!g)return;let f=g.split(/\s+/).filter(Boolean);return f.length>0?f:void 0}catch{return}}function Wr(n){let T=Lr(n);if(T&&T.length>0)return[...T,n];let m=n.toLowerCase();if(m.endsWith(".sh")||m.endsWith(".bash")||m.endsWith(".zsh"))return["/bin/bash",n];if(m.endsWith(".js")||m.endsWith(".mjs")||m.endsWith(".cjs"))return["node",n];if(m.endsWith(".ts")||m.endsWith(".mts")||m.endsWith(".cts"))return["bun","run",n];return["/bin/bash",n]}function Or(n){let T={};for(let m of ST(n)){if(!m.hookEventName)continue;let g=T[m.hookEventName]??[];g.push(Wr(m.path)),T[m.hookEventName]=g}return T}async function Cr(n){let T;for(let m of n.commands){let g=m.join(" ");try{let f=await m_(n.payload,{command:m,cwd:n.cwd,env:process.env,detached:!1,timeoutMs:n.timeoutMs});if(f?.timedOut){Em(n.logger,`hook command timed out: ${g}`);continue}if(f?.parseError){Em(n.logger,`hook command returned invalid JSON control output: ${g} (${f.parseError})`);continue}T=n_(T,$r(f?.parsedJson))}catch(f){Em(n.logger,`hook command failed: ${g}`,f)}}return T}function un(n){for(let T of n.commands){let m=T.join(" ");m_(n.payload,{command:T,cwd:n.cwd,env:process.env,detached:!0}).catch((g)=>{Em(n.logger,`hook command failed: ${m}`,g)})}}function g_(n){let T={cwd:n.workspacePath,workspacePath:n.workspacePath,hookLogPath:n.hookLogPath,rootSessionId:n.rootSessionId},m=(g)=>{let f=`${JSON.stringify({ts:new Date().toISOString(),...g})}
|
|
554
|
+
`;hr(n.hookLogPath),yr(n.hookLogPath,f,"utf8")};return{onRunStart:async(g)=>{m({...S(g,T),hookName:"agent_start",taskStart:{taskMetadata:{}}}),m({...S(g,T),hookName:"prompt_submit",userPromptSubmit:{prompt:g.userMessage,attachments:[]}});return},onToolCallStart:async(g)=>{m({...S(g,T),hookName:"tool_call",iteration:g.iteration,tool_call:{id:g.call.id,name:g.call.name,input:g.call.input},preToolUse:{toolName:g.call.name,parameters:$m(g.call.input)}});return},onToolCallEnd:async(g)=>{m({...S(g,T),hookName:"tool_result",iteration:g.iteration,tool_result:g.record,postToolUse:{toolName:g.record.name,parameters:$m(g.record.input),result:typeof g.record.output==="string"?g.record.output:JSON.stringify(g.record.output),success:!g.record.error,executionTimeMs:g.record.durationMs}});return},onTurnEnd:async(g)=>{m({...S(g,T),hookName:"agent_end",iteration:g.iteration,turn:g.turn,taskComplete:{taskMetadata:{}}});return},onSessionShutdown:async(g)=>{if(T_(g.reason))m({...S(g,T),hookName:"agent_abort",reason:g.reason,taskCancel:{taskMetadata:{}}});m({...S(g,T),hookName:"session_shutdown",reason:g.reason});return}}}function f_(n){let T=Or(n.workspacePath);if(!Object.values(T).some((r)=>(r?.length??0)>0))return;let g=async(r)=>{let M=T.agent_start??[];if(M.length>0)un({commands:M,cwd:n.cwd,logger:n.logger,payload:{...S(r,n),hookName:"agent_start",taskStart:{taskMetadata:{}}}});let U=T.prompt_submit??[];if(U.length>0)un({commands:U,cwd:n.cwd,logger:n.logger,payload:{...S(r,n),hookName:"prompt_submit",userPromptSubmit:{prompt:r.userMessage,attachments:[]}}})},f=async(r)=>{let M=T.tool_call??[];if(M.length===0)return;return Cr({commands:M,cwd:n.cwd,logger:n.logger,timeoutMs:n.toolCallTimeoutMs??120000,payload:{...S(r,n),hookName:"tool_call",iteration:r.iteration,tool_call:{id:r.call.id,name:r.call.name,input:r.call.input},preToolUse:{toolName:r.call.name,parameters:$m(r.call.input)}}})},_=async(r)=>{let M=T.tool_result??[];if(M.length===0)return;un({commands:M,cwd:n.cwd,logger:n.logger,payload:{...S(r,n),hookName:"tool_result",iteration:r.iteration,tool_result:r.record,postToolUse:{toolName:r.record.name,parameters:$m(r.record.input),result:typeof r.record.output==="string"?r.record.output:JSON.stringify(r.record.output),success:!r.record.error,executionTimeMs:r.record.durationMs}}})},A=async(r)=>{let M=T.agent_end??[];if(M.length===0)return;un({commands:M,cwd:n.cwd,logger:n.logger,payload:{...S(r,n),hookName:"agent_end",iteration:r.iteration,turn:r.turn,taskComplete:{taskMetadata:{}}}})},R=async(r)=>{if(T_(r.reason)){let U=T.agent_abort??[];if(U.length>0)un({commands:U,cwd:n.cwd,logger:n.logger,payload:{...S(r,n),hookName:"agent_abort",reason:r.reason,taskCancel:{taskMetadata:{}}}})}let M=T.session_shutdown??[];if(M.length===0)return;un({commands:M,cwd:n.cwd,logger:n.logger,payload:{...S(r,n),hookName:"session_shutdown",reason:r.reason}})};return{onRunStart:async(r)=>{await g(r);return},onToolCallStart:async(r)=>f(r),onToolCallEnd:async(r)=>{await _(r);return},onTurnEnd:async(r)=>{await A(r);return},onSessionShutdown:async(r)=>{await R(r);return}}}function An(n,T){let m=n.map((g)=>g[T]).filter((g)=>typeof g==="function");if(m.length===0)return;return async(g)=>{let f;for(let _ of m){let A=await _(g);f=n_(f,A)}return f}}function __(n){let T=n.filter((m)=>m!==void 0);if(T.length===0)return;return{onRunStart:An(T,"onRunStart"),onRunEnd:An(T,"onRunEnd"),onIterationStart:An(T,"onIterationStart"),onIterationEnd:An(T,"onIterationEnd"),onTurnStart:An(T,"onTurnStart"),onTurnEnd:An(T,"onTurnEnd"),onToolCallStart:An(T,"onToolCallStart"),onToolCallEnd:An(T,"onToolCallEnd"),onSessionShutdown:An(T,"onSessionShutdown"),onError:An(T,"onError")}}var Nr="https://api.cline.bot",Pg="workos:",Yr=["cline","oca","openai-codex"];function Xr(n){return Yr.includes(n)}function Vr(n,T){if(n==="cline")return`${Pg}${T}`;return T}function Kr(n,T){if(n==="cline"&&T.toLowerCase().startsWith(Pg))return T.slice(Pg.length);return T}function jr(n){let m=d(n)?.exp;if(typeof m==="number"&&m>0)return m*1000;return null}function Jr(n,T){let m=n.auth?.expiresAt;if(typeof m==="number"&&Number.isFinite(m)&&m>0)return m;let g=jr(T);if(g)return g;return Date.now()-1}function tr(n,T){let m=T.auth?.accessToken?.trim(),g=T.auth?.refreshToken?.trim();if(!m||!g)return null;let f=Kr(n,m);if(!f)return null;return{access:f,refresh:g,expires:Jr(T,f),accountId:T.auth?.accountId}}function Br(n,T){let m=n?.expiresAt,g=T?.expiresAt;return n?.accessToken===T?.accessToken&&n?.refreshToken===T?.refreshToken&&n?.accountId===T?.accountId&&m===g}class hm extends Error{providerId;constructor(n){super(`OAuth credentials for provider "${n}" are no longer valid. Re-run authentication for this provider.`);this.name="OAuthReauthRequiredError",this.providerId=n}}class bg{providerSettingsManager;refreshInFlight=new Map;constructor(n){this.providerSettingsManager=n?.providerSettingsManager??new tn}async resolveProviderApiKey(n){if(!Xr(n.providerId))return null;return this.resolveWithSingleFlight(n.providerId,n.forceRefresh)}async resolveWithSingleFlight(n,T=!1){let m=this.refreshInFlight.get(n);if(m)return m;let g=this.resolveProviderApiKeyInternal(n,T).catch((f)=>{throw f}).finally(()=>{this.refreshInFlight.delete(n)});return this.refreshInFlight.set(n,g),g}async resolveProviderApiKeyInternal(n,T){let m=this.providerSettingsManager.getProviderSettings(n);if(!m)return null;let g=tr(n,m);if(!g)return null;let f=await this.resolveCredentials(n,m,g,T);if(!f)throw new hm(n);let _=Vr(n,f.access),A={...m.auth??{},accessToken:_,refreshToken:f.refresh,accountId:f.accountId};A.expiresAt=f.expires;let R={...m,auth:A},r=!Br(m.auth,R.auth);if(r)this.providerSettingsManager.saveProviderSettings(R,{setLastUsed:!1,tokenSource:"oauth"});return{providerId:n,apiKey:_,accountId:f.accountId,refreshed:r}}async resolveCredentials(n,T,m,g){if(n==="cline")return hg(m,{apiBaseUrl:T.baseUrl?.trim()||Nr},{forceRefresh:g});if(n==="oca")return Cg(m,{forceRefresh:g},{mode:T.oca?.mode});return Lg(m,{forceRefresh:g})}}import{existsSync as ug,mkdirSync as Qr,readdirSync as Zr,rmdirSync as zr,unlinkSync as Fr}from"node:fs";import{dirname as A_,join as Cn}from"node:path";function F(){return new Date().toISOString()}function yn(n){if(!n||!ug(n))return;try{Fr(n)}catch{}}class vg{ensureSessionsDir;constructor(n){this.ensureSessionsDir=n}sessionArtifactsDir(n){return Cn(this.ensureSessionsDir(),n)}ensureSessionArtifactsDir(n){let T=this.sessionArtifactsDir(n);if(!ug(T))Qr(T,{recursive:!0});return T}sessionTranscriptPath(n){return Cn(this.ensureSessionArtifactsDir(n),`${n}.log`)}sessionHookPath(n){return Cn(this.ensureSessionArtifactsDir(n),`${n}.hooks.jsonl`)}sessionMessagesPath(n){return Cn(this.ensureSessionArtifactsDir(n),`${n}.messages.json`)}sessionManifestPath(n,T=!0){let m=T?this.ensureSessionArtifactsDir(n):this.sessionArtifactsDir(n);return Cn(m,`${n}.json`)}removeSessionDirIfEmpty(n){let T=this.sessionArtifactsDir(n),m=this.ensureSessionsDir();while(T.startsWith(m)&&T!==m){if(!ug(T)){T=A_(T);continue}try{if(Zr(T).length>0)break;zr(T)}catch{break}T=A_(T)}}subagentArtifactPaths(n,T,m){let g=this.ensureSessionArtifactsDir(n);return{transcriptPath:Cn(g,`${n}.log`),hookPath:Cn(g,`${n}.hooks.jsonl`),messagesPath:Cn(g,`${n}.messages.json`)}}}import{z as q}from"zod";var qr=q.enum(Zg),vn=q.object({version:q.literal(1),session_id:q.string().min(1),source:q.enum(_T),pid:q.number().int(),started_at:q.string().min(1),ended_at:q.string().min(1).optional(),exit_code:q.number().int().nullable().optional(),status:qr,interactive:q.boolean(),provider:q.string().min(1),model:q.string().min(1),cwd:q.string().min(1),workspace_root:q.string().min(1),team_name:q.string().min(1).optional(),enable_tools:q.boolean(),enable_spawn:q.boolean(),enable_teams:q.boolean(),prompt:q.string().optional(),metadata:q.record(q.string(),q.unknown()).optional(),messages_path:q.string().min(1).optional()});var Hr="# Workspace Configuration";function R_(n){let T=n.lastIndexOf(Hr);if(T<0)return;let m=n.slice(T).trim();return m.length>0?m:void 0}function r_(n){if(!n)return!1;return Object.values(n).some((T)=>typeof T==="function")}function M_(n,T){let m=[...n??[],...T??[]];if(m.length===0)return;let g=[],f=new Set;for(let _ of m){if(f.has(_.name))continue;f.add(_.name),g.push(_)}return g}function U_(n){return JSON.stringify(n,(T,m)=>{if(m instanceof Error)return{name:m.name,message:m.message,stack:m.stack};return m})}function y_(n,T){let m=n.map((R)=>({...R})),g=[...m].reverse().findIndex((R)=>R.role==="assistant");if(g===-1)return m;let f=m.length-1-g,_=m[f],A=T.usage;return m[f]={..._,providerId:_.providerId??T.model.provider,modelId:_.modelId??T.model.id,modelInfo:_.modelInfo??{id:T.model.id,provider:T.model.provider},metrics:{..._.metrics??{},inputTokens:A.inputTokens,outputTokens:A.outputTokens,cacheReadTokens:A.cacheReadTokens,cacheWriteTokens:A.cacheWriteTokens,cost:A.totalCost},ts:_.ts??T.endedAt.getTime()},m}function Gg(n){let T=typeof n.metadata_json==="string"&&n.metadata_json.trim().length>0?(()=>{try{let m=JSON.parse(n.metadata_json);if(m&&typeof m==="object"&&!Array.isArray(m))return m}catch{}return})():void 0;return{sessionId:n.session_id,source:n.source,pid:n.pid,startedAt:n.started_at,endedAt:n.ended_at??null,exitCode:n.exit_code??null,status:n.status,interactive:n.interactive===1,provider:n.provider,model:n.model,cwd:n.cwd,workspaceRoot:n.workspace_root,teamName:n.team_name??void 0,enableTools:n.enable_tools===1,enableSpawn:n.enable_spawn===1,enableTeams:n.enable_teams===1,parentSessionId:n.parent_session_id??void 0,parentAgentId:n.parent_agent_id??void 0,agentId:n.agent_id??void 0,conversationId:n.conversation_id??void 0,isSubagent:n.is_subagent===1,prompt:n.prompt??void 0,metadata:T,transcriptPath:n.transcript_path,hookPath:n.hook_path,messagesPath:n.messages_path??void 0,updatedAt:n.updated_at??F()}}function kg(){return{inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,totalCost:0}}function Sg(n,T){return{inputTokens:n.inputTokens+Math.max(0,T.inputTokens??0),outputTokens:n.outputTokens+Math.max(0,T.outputTokens??0),cacheReadTokens:n.cacheReadTokens+Math.max(0,T.cacheReadTokens??0),cacheWriteTokens:n.cacheWriteTokens+Math.max(0,T.cacheWriteTokens??0),totalCost:n.totalCost+Math.max(0,T.totalCost??0)}}var E_=5000,Ir=20480000;async function xr(n){let T=await br(n);if(!T.isFile())throw Error("Path is not a file");if(T.size>Ir)throw Error("File is too large to read into context.");let m=await Pr(n,"utf8");if(m.includes("\x00"))throw Error("Cannot read binary file into context.");return m}class Dm{sessionService;runtimeBuilder;createAgentInstance;defaultToolExecutors;defaultToolPolicies;providerSettingsManager;oauthTokenManager;defaultRequestToolApproval;listeners=new Set;sessions=new Map;usageBySession=new Map;constructor(n){let T=ur();if(T)hT(T);this.sessionService=n.sessionService,this.runtimeBuilder=n.runtimeBuilder??new ym,this.createAgentInstance=n.createAgent??((m)=>new kr(m)),this.defaultToolExecutors=n.defaultToolExecutors,this.defaultToolPolicies=n.toolPolicies,this.providerSettingsManager=n.providerSettingsManager??new tn,this.oauthTokenManager=n.oauthTokenManager??new bg({providerSettingsManager:this.providerSettingsManager}),this.defaultRequestToolApproval=n.requestToolApproval}resolveStoredProviderSettings(n){let T=this.providerSettingsManager.getProviderSettings(n);if(T)return T;return{provider:n}}buildResolvedProviderConfig(n){let T=this.resolveStoredProviderSettings(n.providerId),m={...T,provider:n.providerId,model:n.modelId,apiKey:n.apiKey??T.apiKey,baseUrl:n.baseUrl??T.baseUrl,headers:n.headers??T.headers,reasoning:typeof n.thinking==="boolean"||typeof n.reasoningEffort==="string"?{...T.reasoning??{},...typeof n.thinking==="boolean"?{enabled:n.thinking}:{},...typeof n.reasoningEffort==="string"?{effort:n.reasoningEffort}:{}}:T.reasoning},g=mT(m);if(n.knownModels)g.knownModels=n.knownModels;return g}async start(n){let T=n.source??"cli",m=F(),g=n.config.sessionId?.trim()??"",f=g.length>0?g:`${Date.now()}_${cr(5)}`;this.usageBySession.set(f,kg());let _=await this.invokeOptionalValue("ensureSessionsDir")??"";if(!_)throw Error("session service method not available: ensureSessionsDir");let A=RT(_,f),R=RT(A,`${f}.log`),r=RT(A,`${f}.hooks.jsonl`),M=RT(A,`${f}.messages.json`),U=RT(A,`${f}.json`),y=vn.parse({version:1,session_id:f,source:T,pid:process.pid,started_at:m,status:"running",interactive:n.interactive===!0,provider:n.config.providerId,model:n.config.modelId,cwd:n.config.cwd,workspace_root:n.config.workspaceRoot??n.config.cwd,team_name:n.config.teamName,enable_tools:n.config.enableTools,enable_spawn:n.config.enableSpawnAgent,enable_teams:n.config.enableAgentTeams,prompt:n.prompt?.trim()||void 0,messages_path:M}),$=f_({cwd:n.config.cwd,workspacePath:n.config.workspaceRoot??n.config.cwd,rootSessionId:f,hookLogPath:r,logger:n.config.logger}),h=r_(n.config.hooks)?void 0:g_({hookLogPath:r,rootSessionId:f,workspacePath:n.config.workspaceRoot??n.config.cwd}),L=__([n.config.hooks,$,h]),W=await wT({pluginPaths:n.config.pluginPaths,workspacePath:n.config.workspaceRoot??n.config.cwd,cwd:n.config.cwd}),E=M_(n.config.extensions,W.extensions),Y={...n.config,hooks:L,extensions:E},D=this.buildResolvedProviderConfig(Y),j={...Y,providerConfig:D},Q=this.runtimeBuilder.build({config:j,hooks:L,extensions:E,logger:j.logger,onTeamEvent:(J)=>{this.handleTeamEvent(f,J),j.onTeamEvent?.(J)},createSpawnTool:()=>this.createSpawnTool(j,f),onTeamRestored:n.onTeamRestored,userInstructionWatcher:n.userInstructionWatcher,defaultToolExecutors:n.defaultToolExecutors??this.defaultToolExecutors}),b=[...Q.tools,...j.extraTools??[]],v=this.createAgentInstance({providerId:D.providerId,modelId:D.modelId,apiKey:D.apiKey,baseUrl:D.baseUrl,headers:D.headers,knownModels:D.knownModels,providerConfig:D,thinking:j.thinking,reasoningEffort:j.reasoningEffort??D.reasoningEffort,systemPrompt:j.systemPrompt,maxIterations:j.maxIterations,maxConsecutiveMistakes:j.maxConsecutiveMistakes,tools:b,hooks:L,extensions:E,hookErrorMode:j.hookErrorMode,initialMessages:n.initialMessages,userFileContentLoader:xr,toolPolicies:n.toolPolicies??this.defaultToolPolicies,requestToolApproval:n.requestToolApproval??this.defaultRequestToolApproval,onConsecutiveMistakeLimitReached:j.onConsecutiveMistakeLimitReached,completionGuard:Q.completionGuard,logger:Q.logger??j.logger,onEvent:(J)=>{let V=this.sessions.get(f);if(J.type==="usage"&&V?.turnUsageBaseline)this.usageBySession.set(f,Sg(V.turnUsageBaseline,{inputTokens:J.totalInputTokens,outputTokens:J.totalOutputTokens,totalCost:J.totalCost}));this.emit({type:"agent_event",payload:{sessionId:f,event:J}}),this.emit({type:"chunk",payload:{sessionId:f,stream:"agent",chunk:U_(J),ts:Date.now()}})}}),Z={sessionId:f,config:j,source:T,startedAt:m,pendingPrompt:y.prompt,runtime:Q,agent:v,started:!1,aborting:!1,interactive:n.interactive===!0,activeTeamRunIds:new Set,pendingTeamRunUpdates:[],teamRunWaiters:[],pluginSandboxShutdown:W.shutdown};this.sessions.set(Z.sessionId,Z),this.emitStatus(Z.sessionId,"running");let k;try{if(n.prompt?.trim()){if(k=await this.runTurn(Z,{prompt:n.prompt,userImages:n.userImages,userFiles:n.userFiles}),!Z.interactive)await this.finalizeSingleRun(Z,k.finishReason)}}catch(J){throw await this.failSession(Z),J}return{sessionId:f,manifest:y,manifestPath:U,transcriptPath:R,hookPath:r,messagesPath:M,result:k}}async send(n){let T=this.sessions.get(n.sessionId);if(!T)throw Error(`session not found: ${n.sessionId}`);try{let m=await this.runTurn(T,{prompt:n.prompt,userImages:n.userImages,userFiles:n.userFiles});if(!T.interactive)await this.finalizeSingleRun(T,m.finishReason);return m}catch(m){throw await this.failSession(T),m}}async getAccumulatedUsage(n){let T=this.usageBySession.get(n);if(!T)return;return{...T}}async abort(n){let T=this.sessions.get(n);if(!T)return;T.aborting=!0,T.agent.abort()}async stop(n){let T=this.sessions.get(n);if(!T)return;await this.shutdownSession(T,{status:"cancelled",exitCode:null,shutdownReason:"session_stop",endReason:"stopped"})}async dispose(n="session_manager_dispose"){let T=[...this.sessions.values()];if(T.length===0)return;await Promise.allSettled(T.map(async(m)=>{await this.shutdownSession(m,{status:"cancelled",exitCode:null,shutdownReason:n,endReason:"disposed"})})),this.usageBySession.clear()}async get(n){let T=await this.getRow(n);return T?Gg(T):void 0}async list(n=200){return(await this.listRows(n)).map((m)=>Gg(m))}async delete(n){if(this.sessions.has(n))await this.stop(n);let T=await this.invoke("deleteSession",n);if(T.deleted)this.usageBySession.delete(n);return T.deleted}async readTranscript(n,T){let m=await this.getRow(n);if(!m?.transcript_path||!cg(m.transcript_path))return"";let g=Ig(m.transcript_path,"utf8");if(typeof T==="number"&&Number.isFinite(T))return g.slice(-Math.max(0,Math.floor(T)));return g}async readMessages(n){let m=(await this.getRow(n))?.messages_path?.trim();if(!m||!cg(m))return[];try{let g=Ig(m,"utf8");if(!g.trim())return[];let f=JSON.parse(g);return Array.isArray(f)?f:Array.isArray(f.messages)?f.messages??[]:[]}catch{return[]}}async readHooks(n,T=200){let m=await this.getRow(n);if(!m?.hook_path||!cg(m.hook_path))return[];return Ig(m.hook_path,"utf8").split(`
|
|
555
|
+
`).map((_)=>_.trim()).filter((_)=>_.length>0).slice(-Math.max(1,Math.floor(T))).map((_)=>{try{return JSON.parse(_)}catch{return{raw:_}}})}subscribe(n){return this.listeners.add(n),()=>{this.listeners.delete(n)}}async runTurn(n,T){let m=await this.prepareTurnInput(n,T),g=m.prompt.trim();if(!g)throw Error("prompt cannot be empty");await this.ensureSessionPersisted(n),await this.syncOAuthCredentials(n);let f=await this.executeAgentTurn(n,g,m.userImages,m.userFiles);while(this.shouldAutoContinueTeamRuns(n,f.finishReason)){let _=await this.waitForTeamRunUpdates(n);if(_.length===0)break;let A=this.buildTeamRunContinuationPrompt(n,_);f=await this.executeAgentTurn(n,A)}return f}async executeAgentTurn(n,T,m,g){let f=n.started||n.agent.getMessages().length>0,_=n.agent.getMessages(),A=this.usageBySession.get(n.sessionId)??kg();n.turnUsageBaseline=A;try{let R=f?await this.runWithAuthRetry(n,()=>n.agent.continue(T,m,g),_):await this.runWithAuthRetry(n,()=>n.agent.run(T,m,g),_);n.started=!0;let r=y_(R.messages,R);return this.usageBySession.set(n.sessionId,Sg(A,R.usage)),await this.invoke("persistSessionMessages",n.sessionId,r,n.config.systemPrompt),R}catch(R){throw await this.invoke("persistSessionMessages",n.sessionId,n.agent.getMessages(),n.config.systemPrompt),R}finally{n.turnUsageBaseline=void 0}}async prepareTurnInput(n,T){let m=n.config.workspaceRoot??n.config.cwd,g=OT(T.prompt).trim();if(!g)return{prompt:"",userImages:T.userImages,userFiles:this.resolveAbsoluteFilePaths(n.config.cwd,T.userFiles)};let f=await qT(g,m),_=WT(f.prompt,n.config.mode==="plan"?"plan":"act"),A=this.resolveAbsoluteFilePaths(n.config.cwd,T.userFiles),R=this.resolveAbsoluteFilePaths(m,f.matchedFiles),r=Array.from(new Set([...A,...R]));return{prompt:_,userImages:T.userImages,userFiles:r.length>0?r:void 0}}resolveAbsoluteFilePaths(n,T){if(!T||T.length===0)return[];let m=T.map((g)=>g.trim()).filter((g)=>g.length>0).map((g)=>vr(g)?g:Gr(n,g));return Array.from(new Set(m))}async ensureSessionPersisted(n){if(n.artifacts)return;n.artifacts=await this.invoke("createRootSessionWithArtifacts",{sessionId:n.sessionId,source:n.source,pid:process.pid,interactive:n.interactive,provider:n.config.providerId,model:n.config.modelId,cwd:n.config.cwd,workspaceRoot:n.config.workspaceRoot??n.config.cwd,teamName:n.config.teamName,enableTools:n.config.enableTools,enableSpawn:n.config.enableSpawnAgent,enableTeams:n.config.enableAgentTeams,prompt:n.pendingPrompt,startedAt:n.startedAt})}async finalizeSingleRun(n,T){if(this.hasPendingTeamRunWork(n))return;if(T==="aborted"||n.aborting)await this.shutdownSession(n,{status:"cancelled",exitCode:null,shutdownReason:"session_complete",endReason:T});else await this.shutdownSession(n,{status:"completed",exitCode:0,shutdownReason:"session_complete",endReason:T})}async failSession(n){await this.shutdownSession(n,{status:"failed",exitCode:1,shutdownReason:"session_error",endReason:"error"})}async shutdownSession(n,T){if(this.notifyTeamRunWaiters(n),n.artifacts)await this.updateStatus(n,T.status,T.exitCode);if(n.artifacts)await n.agent.shutdown(T.shutdownReason);if(await Promise.resolve(n.runtime.shutdown(T.shutdownReason)),n.pluginSandboxShutdown)await n.pluginSandboxShutdown();this.sessions.delete(n.sessionId),this.emit({type:"ended",payload:{sessionId:n.sessionId,reason:T.endReason,ts:Date.now()}})}async updateStatus(n,T,m){if(!n.artifacts)return;let g=await this.invoke("updateSessionStatus",n.sessionId,T,m);if(!g.updated)return;n.artifacts.manifest.status=T,n.artifacts.manifest.ended_at=g.endedAt??F(),n.artifacts.manifest.exit_code=typeof m==="number"?m:null,await this.invoke("writeSessionManifest",n.artifacts.manifestPath,n.artifacts.manifest),this.emitStatus(n.sessionId,T)}emitStatus(n,T){this.emit({type:"status",payload:{sessionId:n,status:T}})}async listRows(n){let T=Math.max(1,Math.floor(n));return this.invoke("listSessions",Math.min(T,E_))}async getRow(n){let T=n.trim();if(!T)return;return(await this.listRows(E_)).find((g)=>g.session_id===T)}createSpawnTool(n,T){let m=()=>{if(!n.enableTools)return[];let f=n.mode==="plan"?Mn.readonly:Mn.development;return sn({cwd:n.cwd,...f,executors:this.defaultToolExecutors})},g=()=>{let f=m();if(n.enableSpawnAgent)f.push(this.createSpawnTool(n,T));return f};return Sr({providerId:n.providerId,modelId:n.modelId,cwd:n.cwd,apiKey:n.apiKey,baseUrl:n.baseUrl,providerConfig:n.providerConfig,knownModels:n.knownModels,clineWorkspaceMetadata:n.providerId==="cline"?R_(n.systemPrompt):void 0,createSubAgentTools:g,hooks:n.hooks,extensions:n.extensions,toolPolicies:this.defaultToolPolicies,requestToolApproval:this.defaultRequestToolApproval,logger:n.logger,onSubAgentStart:(f)=>{this.invokeOptional("handleSubAgentStart",T,f)},onSubAgentEnd:(f)=>{this.invokeOptional("handleSubAgentEnd",T,f)}})}async handleTeamEvent(n,T){let m=this.sessions.get(n);if(m)switch(T.type){case"run_queued":case"run_started":m.activeTeamRunIds.add(T.run.id);break;case"run_completed":case"run_failed":case"run_cancelled":case"run_interrupted":{let f;if(T.type==="run_failed")f=T.run.error;else if(T.type==="run_cancelled")f=T.run.error??T.reason;else if(T.type==="run_interrupted")f=T.run.error??T.reason;m.activeTeamRunIds.delete(T.run.id),m.pendingTeamRunUpdates.push({runId:T.run.id,agentId:T.run.agentId,taskId:T.run.taskId,status:T.type.replace("run_",""),error:f,iterations:T.run.result?.iterations}),this.notifyTeamRunWaiters(m);break}default:break}switch(T.type){case"task_start":await this.invokeOptional("onTeamTaskStart",n,T.agentId,T.message);break;case"task_end":if(T.error){await this.invokeOptional("onTeamTaskEnd",n,T.agentId,"failed",`[error] ${T.error.message}`,T.messages);break}if(T.result?.finishReason==="aborted"){await this.invokeOptional("onTeamTaskEnd",n,T.agentId,"cancelled","[done] aborted",T.result.messages);break}await this.invokeOptional("onTeamTaskEnd",n,T.agentId,"completed",`[done] ${T.result?.finishReason??"completed"}`,T.result?.messages);break;default:break}if(!m?.runtime.teamRuntime)return;let g=m.config.teamName?.trim()||"team";this.emit({type:"team_progress",payload:{sessionId:n,teamName:g,lifecycle:Um({teamName:g,sessionId:n,event:T}),summary:Mm(g,m.runtime.teamRuntime.exportState())}})}hasPendingTeamRunWork(n){return n.activeTeamRunIds.size>0||n.pendingTeamRunUpdates.length>0}shouldAutoContinueTeamRuns(n,T){if(n.aborting||T==="aborted"||T==="error")return!1;if(!n.config.enableAgentTeams)return!1;return this.hasPendingTeamRunWork(n)}notifyTeamRunWaiters(n){let T=n.teamRunWaiters.splice(0);for(let m of T)m()}async waitForTeamRunUpdates(n){while(!0){if(n.aborting)return[];if(n.pendingTeamRunUpdates.length>0){let T=[...n.pendingTeamRunUpdates];return n.pendingTeamRunUpdates.length=0,T}if(n.activeTeamRunIds.size===0)return[];await new Promise((T)=>{n.teamRunWaiters.push(T)})}}buildTeamRunContinuationPrompt(n,T){let m=T.map((_)=>{let A=`- ${_.runId} (${_.agentId}) -> ${_.status}`,R=_.taskId?` task=${_.taskId}`:"",r=typeof _.iterations==="number"?` iterations=${_.iterations}`:"",M=_.error?` error=${_.error}`:"";return`${A}${R}${r}${M}`}),g=n.activeTeamRunIds.size,f=g>0?`There are still ${g} teammate run(s) in progress. Continue coordination and decide whether to wait for more updates.`:"No teammate runs are currently in progress. Continue coordination using these updates.";return WT(`System-delivered teammate async run updates:
|
|
556
|
+
${m.join(`
|
|
557
|
+
`)}
|
|
558
|
+
|
|
559
|
+
${f}`,n.config.mode==="plan"?"plan":"act")}emit(n){for(let T of this.listeners)T(n)}async invoke(n,...T){let m=this.sessionService[n];if(typeof m!=="function")throw Error(`session service method not available: ${n}`);return Promise.resolve(m.apply(this.sessionService,T))}async invokeOptional(n,...T){let m=this.sessionService[n];if(typeof m!=="function")return;await Promise.resolve(m.apply(this.sessionService,T))}async invokeOptionalValue(n,...T){let m=this.sessionService[n];if(typeof m!=="function")return;return await Promise.resolve(m.apply(this.sessionService,T))}async runWithAuthRetry(n,T,m){try{return await T()}catch(g){if(!this.isLikelyAuthError(g,n.config.providerId))throw g;return await this.syncOAuthCredentials(n,{forceRefresh:!0}),n.agent.restore(m),T()}}isLikelyAuthError(n,T){if(T!=="cline"&&T!=="oca"&&T!=="openai-codex")return!1;let m=n instanceof Error?n.message.toLowerCase():String(n);return m.includes("401")||m.includes("403")||m.includes("unauthorized")||m.includes("forbidden")||m.includes("invalid token")||m.includes("expired token")||m.includes("authentication")}async syncOAuthCredentials(n,T){let m=null;try{m=await this.oauthTokenManager.resolveProviderApiKey({providerId:n.config.providerId,forceRefresh:T?.forceRefresh})}catch(f){if(f instanceof hm)throw Error(`OAuth session for "${f.providerId}" requires re-authentication. Run "clite auth ${f.providerId}" and retry.`);throw f}if(!m?.apiKey)return;if(n.config.apiKey===m.apiKey)return;n.config.apiKey=m.apiKey,n.agent.updateConnection?.({apiKey:m.apiKey}),n.runtime.teamRuntime?.updateTeammateConnections({apiKey:m.apiKey})}}import{existsSync as dr,mkdirSync as er}from"node:fs";import{RpcSessionClient as sr}from"@clinebot/rpc";import{appendFileSync as $_,existsSync as ar,readFileSync as ir,writeFileSync as MT}from"node:fs";import{nanoid as lr}from"nanoid";import{z as ag}from"zod";import{nanoid as wr}from"nanoid";function rT(n){return n.replace(/[^a-zA-Z0-9._-]+/g,"_")}function Lm(n,T){let m=rT(n),g=rT(T),f=`${m}__${g}`;return f.length>180?f.slice(0,180):f}function xg(n,T){let m=rT(n),g=rT(T);return`${m}__teamtask__${g}__${wr(6)}`}function wg(n){switch(n.hookName){case"agent_end":return"completed";case"session_shutdown":{let T=String(n.reason??"").toLowerCase();if(T.includes("cancel")||T.includes("abort")||T.includes("interrupt"))return"cancelled";if(T.includes("fail")||T.includes("error"))return"failed";return"completed"}default:return"running"}}var h_="cli_subagent",pr=ag.object({task:ag.string().optional(),systemPrompt:ag.string().optional()}).passthrough();function D_(n){if(!n||Object.keys(n).length===0)return null;return JSON.stringify(n)}class UT{adapter;teamTaskSessionsByAgent=new Map;artifacts;constructor(n){this.adapter=n;this.artifacts=new vg(()=>this.ensureSessionsDir())}teamTaskQueueKey(n,T){return`${n}::${T}`}ensureSessionsDir(){return this.adapter.ensureSessionsDir()}sessionTranscriptPath(n){return this.artifacts.sessionTranscriptPath(n)}sessionHookPath(n){return this.artifacts.sessionHookPath(n)}sessionMessagesPath(n){return this.artifacts.sessionMessagesPath(n)}sessionManifestPath(n,T=!0){return this.artifacts.sessionManifestPath(n,T)}async sessionPathFromStore(n,T){let g=(await this.adapter.getSession(n))?.[T];return typeof g==="string"&&g.trim().length>0?g:void 0}activeTeamTaskSessionId(n,T){let m=this.teamTaskSessionsByAgent.get(this.teamTaskQueueKey(n,T));if(!m||m.length===0)return;return m[m.length-1]}subagentArtifactPaths(n,T,m,g){return this.artifacts.subagentArtifactPaths(T,g,this.activeTeamTaskSessionId(n,m))}writeSessionManifestFile(n,T){let m=vn.parse(T);MT(n,`${JSON.stringify(m,null,2)}
|
|
560
|
+
`,"utf8")}createRootSessionId(){return`${Date.now()}_${lr(5)}`}async createRootSessionWithArtifacts(n){let T=n.startedAt??F(),m=n.sessionId.trim(),g=m.length>0?m:this.createRootSessionId(),f=this.sessionTranscriptPath(g),_=this.sessionHookPath(g),A=this.sessionMessagesPath(g),R=this.sessionManifestPath(g),r=vn.parse({version:1,session_id:g,source:n.source,pid:n.pid,started_at:T,status:"running",interactive:n.interactive,provider:n.provider,model:n.model,cwd:n.cwd,workspace_root:n.workspaceRoot,team_name:n.teamName,enable_tools:n.enableTools,enable_spawn:n.enableSpawn,enable_teams:n.enableTeams,prompt:n.prompt?.trim()||void 0,metadata:n.metadata,messages_path:A});return await this.adapter.upsertSession({session_id:g,source:n.source,pid:n.pid,started_at:T,ended_at:null,exit_code:null,status:"running",status_lock:0,interactive:n.interactive?1:0,provider:n.provider,model:n.model,cwd:n.cwd,workspace_root:n.workspaceRoot,team_name:n.teamName??null,enable_tools:n.enableTools?1:0,enable_spawn:n.enableSpawn?1:0,enable_teams:n.enableTeams?1:0,parent_session_id:null,parent_agent_id:null,agent_id:null,conversation_id:null,is_subagent:0,prompt:r.prompt??null,metadata_json:D_(r.metadata),transcript_path:f,hook_path:_,messages_path:A,updated_at:F()}),MT(A,`${JSON.stringify({version:1,updated_at:T,messages:[]},null,2)}
|
|
561
|
+
`,"utf8"),this.writeSessionManifestFile(R,r),{manifestPath:R,transcriptPath:f,hookPath:_,messagesPath:A,manifest:r}}writeSessionManifest(n,T){this.writeSessionManifestFile(n,T)}async updateSessionStatus(n,T,m){for(let g=0;g<4;g++){let f=await this.adapter.getSession(n);if(!f||typeof f.status_lock!=="number")return{updated:!1};let _=F();if((await this.adapter.updateSession({sessionId:n,status:T,endedAt:_,exitCode:typeof m==="number"?m:null,expectedStatusLock:f.status_lock})).updated){if(T==="cancelled")await this.applyStatusToRunningChildSessions(n,"cancelled");return{updated:!0,endedAt:_}}}return{updated:!1}}async updateSession(n){for(let T=0;T<4;T++){let m=await this.adapter.getSession(n.sessionId);if(!m||typeof m.status_lock!=="number")return{updated:!1};if(!(await this.adapter.updateSession({sessionId:n.sessionId,prompt:n.prompt,metadataJson:n.metadata===void 0?void 0:D_(n.metadata),expectedStatusLock:m.status_lock})).updated)continue;let f=this.sessionManifestPath(n.sessionId,!1);if(ar(f))try{let _=vn.parse(JSON.parse(ir(f,"utf8")));if(n.prompt!==void 0)_.prompt=n.prompt??void 0;if(n.metadata!==void 0)_.metadata=n.metadata??void 0;this.writeSessionManifestFile(f,_)}catch{}return{updated:!0}}return{updated:!1}}async queueSpawnRequest(n){if(n.hookName!=="tool_call"||n.parent_agent_id!==null)return;if(n.tool_call?.name!=="spawn_agent")return;let T=CT(n.sessionContext);if(!T)return;let m=pr.safeParse(n.tool_call.input),g=m.success?m.data.task:void 0,f=m.success?m.data.systemPrompt:void 0;await this.adapter.enqueueSpawnRequest({rootSessionId:T,parentAgentId:n.agent_id,task:g,systemPrompt:f})}async readRootSession(n){return await this.adapter.getSession(n)??null}async claimQueuedSpawnTask(n,T){return await this.adapter.claimSpawnRequest(n,T)}async upsertSubagentSession(n){let T=n.rootSessionId;if(!T)return;let m=await this.readRootSession(T);if(!m)return;let g=Lm(T,n.agentId),f=await this.adapter.getSession(g),_=F(),A=this.subagentArtifactPaths(T,g,n.parentAgentId,n.agentId),R=n.prompt??f?.prompt??void 0;if(!R)R=await this.claimQueuedSpawnTask(T,n.parentAgentId)??`Subagent run by ${n.parentAgentId}`;if(!f)return await this.adapter.upsertSession({session_id:g,source:h_,pid:process.ppid,started_at:_,ended_at:null,exit_code:null,status:"running",status_lock:0,interactive:0,provider:m.provider,model:m.model,cwd:m.cwd,workspace_root:m.workspace_root,team_name:m.team_name??null,enable_tools:m.enable_tools,enable_spawn:m.enable_spawn,enable_teams:m.enable_teams,parent_session_id:T,parent_agent_id:n.parentAgentId,agent_id:n.agentId,conversation_id:n.conversationId,is_subagent:1,prompt:R,metadata_json:null,transcript_path:A.transcriptPath,hook_path:A.hookPath,messages_path:A.messagesPath,updated_at:_}),MT(A.messagesPath,`${JSON.stringify({version:1,updated_at:_,messages:[]},null,2)}
|
|
562
|
+
`,"utf8"),g;return await this.adapter.updateSession({sessionId:g,setRunning:!0,parentSessionId:T,parentAgentId:n.parentAgentId,agentId:n.agentId,conversationId:n.conversationId,prompt:f.prompt??R??null,expectedStatusLock:f.status_lock}),g}async upsertSubagentSessionFromHook(n){if(!n.parent_agent_id)return;let T=CT(n.sessionContext);if(!T)return;if(n.hookName==="session_shutdown"){let m=Lm(T,n.agent_id);return await this.adapter.getSession(m)?m:void 0}return await this.upsertSubagentSession({agentId:n.agent_id,parentAgentId:n.parent_agent_id,conversationId:n.taskId,rootSessionId:T})}async appendSubagentHookAudit(n,T){let m=`${JSON.stringify({ts:F(),...T})}
|
|
563
|
+
`,g=await this.sessionPathFromStore(n,"hook_path")??this.sessionHookPath(n);$_(g,m,"utf8")}async appendSubagentTranscriptLine(n,T){if(!T.trim())return;let m=await this.sessionPathFromStore(n,"transcript_path")??this.sessionTranscriptPath(n);$_(m,`${T}
|
|
564
|
+
`,"utf8")}async persistSessionMessages(n,T,m){let g=await this.sessionPathFromStore(n,"messages_path")??this.sessionMessagesPath(n),f={version:1,updated_at:F(),messages:T};if(m!==void 0&&m!=="")f.systemPrompt=m;MT(g,`${JSON.stringify(f,null,2)}
|
|
565
|
+
`,"utf8")}async applySubagentStatus(n,T){await this.applySubagentStatusBySessionId(n,wg(T))}async applySubagentStatusBySessionId(n,T){let m=await this.adapter.getSession(n);if(!m||typeof m.status_lock!=="number")return;let g=F(),f=T==="running"?null:g,_=T==="failed"?1:0;await this.adapter.updateSession({sessionId:n,status:T,endedAt:f,exitCode:T==="running"?null:_,expectedStatusLock:m.status_lock})}async applyStatusToRunningChildSessions(n,T){if(!n)return;let m=await this.adapter.listSessions({limit:2000,parentSessionId:n,status:"running"});for(let g of m)await this.applySubagentStatusBySessionId(g.session_id,T)}async createTeamTaskSubSession(n,T,m){let g=await this.readRootSession(n);if(!g)return;let f=xg(n,T),_=F(),A=this.sessionTranscriptPath(f),R=this.sessionHookPath(f),r=this.sessionMessagesPath(f);return await this.adapter.upsertSession({session_id:f,source:h_,pid:process.ppid,started_at:_,ended_at:null,exit_code:null,status:"running",status_lock:0,interactive:0,provider:g.provider,model:g.model,cwd:g.cwd,workspace_root:g.workspace_root,team_name:g.team_name??null,enable_tools:g.enable_tools,enable_spawn:g.enable_spawn,enable_teams:g.enable_teams,parent_session_id:n,parent_agent_id:"lead",agent_id:T,conversation_id:null,is_subagent:1,prompt:m||`Team task for ${T}`,metadata_json:null,transcript_path:A,hook_path:R,messages_path:r,updated_at:_}),MT(r,`${JSON.stringify({version:1,updated_at:_,messages:[]},null,2)}
|
|
566
|
+
`,"utf8"),await this.appendSubagentTranscriptLine(f,`[start] ${m}`),f}async onTeamTaskStart(n,T,m){let g=await this.createTeamTaskSubSession(n,T,m);if(!g)return;let f=this.teamTaskQueueKey(n,T),_=this.teamTaskSessionsByAgent.get(f)??[];_.push(g),this.teamTaskSessionsByAgent.set(f,_)}async onTeamTaskEnd(n,T,m,g,f){let _=this.teamTaskQueueKey(n,T),A=this.teamTaskSessionsByAgent.get(_);if(!A||A.length===0)return;let R=A.shift();if(A.length===0)this.teamTaskSessionsByAgent.delete(_);else this.teamTaskSessionsByAgent.set(_,A);if(!R)return;if(f)await this.persistSessionMessages(R,f);await this.appendSubagentTranscriptLine(R,g??`[done] ${m}`),await this.applySubagentStatusBySessionId(R,m)}async handleSubAgentStart(n,T){let m=await this.upsertSubagentSession({agentId:T.subAgentId,parentAgentId:T.parentAgentId,conversationId:T.conversationId,prompt:T.input.task,rootSessionId:n});if(!m)return;await this.appendSubagentTranscriptLine(m,`[start] ${T.input.task}`),await this.applySubagentStatusBySessionId(m,"running")}async handleSubAgentEnd(n,T){let m=await this.upsertSubagentSession({agentId:T.subAgentId,parentAgentId:T.parentAgentId,conversationId:T.conversationId,prompt:T.input.task,rootSessionId:n});if(!m)return;if(T.error){await this.appendSubagentTranscriptLine(m,`[error] ${T.error.message}`),await this.applySubagentStatusBySessionId(m,"failed");return}if(await this.appendSubagentTranscriptLine(m,`[done] ${T.result?.finishReason??"completed"}`),T.result?.finishReason==="aborted"){await this.applySubagentStatusBySessionId(m,"cancelled");return}await this.applySubagentStatusBySessionId(m,"completed")}isPidAlive(n){if(!Number.isFinite(n)||n<=0)return!1;try{return process.kill(Math.floor(n),0),!0}catch(T){return typeof T==="object"&&T!==null&&"code"in T&&T.code==="EPERM"}}async listSessions(n=200){let T=Math.max(1,Math.floor(n)),m=Math.min(T*5,2000),g=await this.adapter.listSessions({limit:m}),f=g.filter((_)=>_.status==="running"&&!this.isPidAlive(_.pid));if(f.length>0){for(let _ of f)await this.updateSessionStatus(_.session_id,"failed",1);g=await this.adapter.listSessions({limit:m})}return g.slice(0,T)}async deleteSession(n){let T=n.trim();if(!T)throw Error("session id is required");let m=await this.adapter.getSession(T);if(!m)return{deleted:!1};if(await this.adapter.deleteSession(T,!1),!m.is_subagent){let g=await this.adapter.listSessions({limit:2000,parentSessionId:T});await this.adapter.deleteSession(T,!0);for(let f of g)yn(f.transcript_path),yn(f.hook_path),yn(f.messages_path),yn(this.sessionManifestPath(f.session_id,!1)),this.artifacts.removeSessionDirIfEmpty(f.session_id)}return yn(m.transcript_path),yn(m.hook_path),yn(m.messages_path),yn(this.sessionManifestPath(T,!1)),this.artifacts.removeSessionDirIfEmpty(T),{deleted:!0}}}function L_(n){return{session_id:n.sessionId,source:n.source,pid:n.pid,started_at:n.startedAt,ended_at:n.endedAt??null,exit_code:n.exitCode??null,status:n.status,status_lock:n.statusLock,interactive:n.interactive?1:0,provider:n.provider,model:n.model,cwd:n.cwd,workspace_root:n.workspaceRoot,team_name:n.teamName??null,enable_tools:n.enableTools?1:0,enable_spawn:n.enableSpawn?1:0,enable_teams:n.enableTeams?1:0,parent_session_id:n.parentSessionId??null,parent_agent_id:n.parentAgentId??null,agent_id:n.agentId??null,conversation_id:n.conversationId??null,is_subagent:n.isSubagent?1:0,prompt:n.prompt??null,metadata_json:n.metadata?JSON.stringify(n.metadata):null,transcript_path:n.transcriptPath,hook_path:n.hookPath,messages_path:n.messagesPath??null,updated_at:n.updatedAt}}function or(n){return{sessionId:n.session_id,source:n.source,pid:n.pid,startedAt:n.started_at,endedAt:n.ended_at??null,exitCode:n.exit_code??null,status:n.status,statusLock:n.status_lock??0,interactive:n.interactive===1,provider:n.provider,model:n.model,cwd:n.cwd,workspaceRoot:n.workspace_root,teamName:n.team_name??void 0,enableTools:n.enable_tools===1,enableSpawn:n.enable_spawn===1,enableTeams:n.enable_teams===1,parentSessionId:n.parent_session_id??void 0,parentAgentId:n.parent_agent_id??void 0,agentId:n.agent_id??void 0,conversationId:n.conversation_id??void 0,isSubagent:n.is_subagent===1,prompt:n.prompt??void 0,metadata:(()=>{if(!n.metadata_json)return;try{let T=JSON.parse(n.metadata_json);if(T&&typeof T==="object"&&!Array.isArray(T))return T}catch{}return})(),transcriptPath:n.transcript_path,hookPath:n.hook_path,messagesPath:n.messages_path??void 0,updatedAt:n.updated_at??F()}}class W_{client;constructor(n){this.client=n}ensureSessionsDir(){return""}async upsertSession(n){await this.client.upsertSession(or(n))}async getSession(n){let T=await this.client.getSession(n);return T?L_(T):void 0}async listSessions(n){return(await this.client.listSessions(n)).map((m)=>L_(m))}async updateSession(n){return await this.client.updateSession({sessionId:n.sessionId,status:n.status,endedAt:n.endedAt,exitCode:n.exitCode,prompt:n.prompt,metadata:n.metadataJson===void 0?void 0:n.metadataJson?JSON.parse(n.metadataJson):null,parentSessionId:n.parentSessionId,parentAgentId:n.parentAgentId,agentId:n.agentId,conversationId:n.conversationId,expectedStatusLock:n.expectedStatusLock,setRunning:n.setRunning})}async deleteSession(n,T){return await this.client.deleteSession(n,T)}async enqueueSpawnRequest(n){await this.client.enqueueSpawnRequest(n)}async claimSpawnRequest(n,T){return await this.client.claimSpawnRequest(n,T)}}class Wm extends UT{sessionsDirPath;client;constructor(n){let T=new sr({address:n.address?.trim()||"127.0.0.1:4317"});super(new W_(T));this.sessionsDirPath=n.sessionsDir,this.client=T}ensureSessionsDir(){if(!dr(this.sessionsDirPath))er(this.sessionsDirPath,{recursive:!0});return this.sessionsDirPath}close(){this.client.close()}}import{spawn as fM}from"node:child_process";import{existsSync as Y_,mkdirSync as _M,readFileSync as AM,writeFileSync as RM}from"node:fs";import{resolve as X_}from"node:path";import{getRpcServerDefaultAddress as rM,getRpcServerHealth as MM}from"@clinebot/rpc";import{nanoid as UM}from"nanoid";import{existsSync as nM,mkdirSync as TM}from"node:fs";import{join as mM}from"node:path";function gM(){return Nn()}class Gn{sessionsDirPath;db;constructor(n={}){this.sessionsDirPath=n.sessionsDir??gM()}init(){this.getRawDb()}ensureSessionsDir(){if(!nM(this.sessionsDirPath))TM(this.sessionsDirPath,{recursive:!0});return this.sessionsDirPath}sessionDbPath(){return mM(this.ensureSessionsDir(),"sessions.db")}getRawDb(){if(this.db)return this.db;let n=gT(this.sessionDbPath());return Qg(n,{includeLegacyMigrations:!0}),this.db=n,n}run(n,T=[]){return this.getRawDb().prepare(n).run(...T)}queryOne(n,T=[]){return this.getRawDb().prepare(n).get(...T)??void 0}queryAll(n,T=[]){return this.getRawDb().prepare(n).all(...T)}create(n){let T=G();this.run(`INSERT OR REPLACE INTO sessions (
|
|
567
|
+
session_id, source, pid, started_at, ended_at, exit_code, status, status_lock, interactive,
|
|
568
|
+
provider, model, cwd, workspace_root, team_name, enable_tools, enable_spawn, enable_teams,
|
|
569
|
+
parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent, prompt,
|
|
570
|
+
metadata_json, transcript_path, hook_path, messages_path, updated_at
|
|
571
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[n.sessionId,n.source,n.pid,n.startedAt,n.endedAt??null,n.exitCode??null,n.status,0,I(n.interactive),n.provider,n.model,n.cwd,n.workspaceRoot,n.teamName??null,I(n.enableTools),I(n.enableSpawn),I(n.enableTeams),n.parentSessionId??null,n.parentAgentId??null,n.agentId??null,n.conversationId??null,I(n.isSubagent),n.prompt??null,n.metadata?JSON.stringify(n.metadata):null,n.transcriptPath??"",n.hookPath??"",n.messagesPath??null,T])}update(n){let T=[],m=[];if(n.endedAt!==void 0)T.push("ended_at = ?"),m.push(n.endedAt);if(n.exitCode!==void 0)T.push("exit_code = ?"),m.push(n.exitCode);if(n.status!==void 0)T.push("status = ?"),m.push(n.status);if(n.prompt!==void 0)T.push("prompt = ?"),m.push(n.prompt);if(n.metadata!==void 0)T.push("metadata_json = ?"),m.push(n.metadata?JSON.stringify(n.metadata):null);if(n.parentSessionId!==void 0)T.push("parent_session_id = ?"),m.push(n.parentSessionId);if(n.parentAgentId!==void 0)T.push("parent_agent_id = ?"),m.push(n.parentAgentId);if(n.agentId!==void 0)T.push("agent_id = ?"),m.push(n.agentId);if(n.conversationId!==void 0)T.push("conversation_id = ?"),m.push(n.conversationId);if(T.length===0)return;T.push("updated_at = ?"),m.push(G()),m.push(n.sessionId),this.run(`UPDATE sessions SET ${T.join(", ")} WHERE session_id = ?`,m)}updateStatus(n,T,m){this.update({sessionId:n,status:T,endedAt:T==="running"?null:G(),exitCode:T==="running"?null:m??(T==="failed"?1:0)})}get(n){let T=this.queryOne(`SELECT session_id, source, pid, started_at, ended_at, exit_code, status, interactive,
|
|
572
|
+
provider, model, cwd, workspace_root, team_name,
|
|
573
|
+
enable_tools, enable_spawn, enable_teams,
|
|
574
|
+
parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent,
|
|
575
|
+
prompt, metadata_json, transcript_path, hook_path, messages_path, updated_at
|
|
576
|
+
FROM sessions WHERE session_id = ?`,[n]);if(!T)return;return{sessionId:B(T.session_id),source:B(T.source),pid:Number(T.pid??0),startedAt:B(T.started_at),endedAt:T.ended_at??null,exitCode:T.exit_code??null,status:B(T.status),interactive:x(T.interactive),provider:B(T.provider),model:B(T.model),cwd:B(T.cwd),workspaceRoot:B(T.workspace_root),teamName:z(T.team_name),enableTools:x(T.enable_tools),enableSpawn:x(T.enable_spawn),enableTeams:x(T.enable_teams),parentSessionId:z(T.parent_session_id),parentAgentId:z(T.parent_agent_id),agentId:z(T.agent_id),conversationId:z(T.conversation_id),isSubagent:x(T.is_subagent),prompt:z(T.prompt),metadata:(()=>{let m=z(T.metadata_json);if(!m)return;try{let g=JSON.parse(m);if(g&&typeof g==="object"&&!Array.isArray(g))return g}catch{}return})(),transcriptPath:z(T.transcript_path),hookPath:z(T.hook_path),messagesPath:z(T.messages_path),updatedAt:z(T.updated_at)??G()}}list(n=200){let T=this.queryAll("SELECT session_id FROM sessions ORDER BY started_at DESC LIMIT ?",[n]),m=[];for(let g of T){let f=this.get(B(g.session_id));if(f)m.push(f)}return m}delete(n,T=!1){let m=this.run("DELETE FROM sessions WHERE session_id = ?",[n]).changes??0;if(T)this.run("DELETE FROM sessions WHERE parent_session_id = ?",[n]);return m>0}}class O_{store;constructor(n){this.store=n}ensureSessionsDir(){return this.store.ensureSessionsDir()}async upsertSession(n){this.store.run(`INSERT OR REPLACE INTO sessions (
|
|
577
|
+
session_id, source, pid, started_at, ended_at, exit_code, status, status_lock, interactive,
|
|
578
|
+
provider, model, cwd, workspace_root, team_name, enable_tools, enable_spawn, enable_teams,
|
|
579
|
+
parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent, prompt,
|
|
580
|
+
metadata_json, transcript_path, hook_path, messages_path, updated_at
|
|
581
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[n.session_id,n.source,n.pid,n.started_at,n.ended_at??null,n.exit_code??null,n.status,typeof n.status_lock==="number"?n.status_lock:0,n.interactive,n.provider,n.model,n.cwd,n.workspace_root,n.team_name??null,n.enable_tools,n.enable_spawn,n.enable_teams,n.parent_session_id??null,n.parent_agent_id??null,n.agent_id??null,n.conversation_id??null,n.is_subagent,n.prompt??null,n.metadata_json??null,n.transcript_path,n.hook_path,n.messages_path??null,n.updated_at??F()])}async getSession(n){return this.store.queryOne(`SELECT session_id, source, pid, started_at, ended_at, exit_code, status, status_lock, interactive,
|
|
582
|
+
provider, model, cwd, workspace_root, team_name, enable_tools, enable_spawn, enable_teams,
|
|
583
|
+
parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent, prompt,
|
|
584
|
+
metadata_json, transcript_path, hook_path, messages_path, updated_at
|
|
585
|
+
FROM sessions WHERE session_id = ?`,[n])??void 0}async listSessions(n){let T=[],m=[];if(n.parentSessionId)T.push("parent_session_id = ?"),m.push(n.parentSessionId);if(n.status)T.push("status = ?"),m.push(n.status);let g=T.length>0?`WHERE ${T.join(" AND ")}`:"";return this.store.queryAll(`SELECT session_id, source, pid, started_at, ended_at, exit_code, status, status_lock, interactive,
|
|
586
|
+
provider, model, cwd, workspace_root, team_name, enable_tools, enable_spawn, enable_teams,
|
|
587
|
+
parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent, prompt,
|
|
588
|
+
metadata_json, transcript_path, hook_path, messages_path, updated_at
|
|
589
|
+
FROM sessions
|
|
590
|
+
${g}
|
|
591
|
+
ORDER BY started_at DESC
|
|
592
|
+
LIMIT ?`,[...m,n.limit])}async updateSession(n){if(n.setRunning){if(n.expectedStatusLock===void 0)return{updated:!1,statusLock:0};return{updated:(this.store.run(`UPDATE sessions
|
|
593
|
+
SET status = 'running', ended_at = NULL, exit_code = NULL, updated_at = ?, status_lock = ?,
|
|
594
|
+
parent_session_id = ?, parent_agent_id = ?, agent_id = ?, conversation_id = ?, is_subagent = 1,
|
|
595
|
+
prompt = COALESCE(prompt, ?)
|
|
596
|
+
WHERE session_id = ? AND status_lock = ?`,[F(),n.expectedStatusLock+1,n.parentSessionId??null,n.parentAgentId??null,n.agentId??null,n.conversationId??null,n.prompt??null,n.sessionId,n.expectedStatusLock]).changes??0)>0,statusLock:n.expectedStatusLock+1}}let T=[],m=[];if(n.status!==void 0)T.push("status = ?"),m.push(n.status);if(n.endedAt!==void 0)T.push("ended_at = ?"),m.push(n.endedAt);if(n.exitCode!==void 0)T.push("exit_code = ?"),m.push(n.exitCode);if(n.prompt!==void 0)T.push("prompt = ?"),m.push(n.prompt??null);if(n.metadataJson!==void 0)T.push("metadata_json = ?"),m.push(n.metadataJson??null);if(n.parentSessionId!==void 0)T.push("parent_session_id = ?"),m.push(n.parentSessionId??null);if(n.parentAgentId!==void 0)T.push("parent_agent_id = ?"),m.push(n.parentAgentId??null);if(n.agentId!==void 0)T.push("agent_id = ?"),m.push(n.agentId??null);if(n.conversationId!==void 0)T.push("conversation_id = ?"),m.push(n.conversationId??null);if(T.length===0){let A=await this.getSession(n.sessionId);return{updated:!!A,statusLock:A?.status_lock??0}}let g=0;if(n.expectedStatusLock!==void 0)g=n.expectedStatusLock+1,T.push("status_lock = ?"),m.push(g);T.push("updated_at = ?"),m.push(F());let f=`UPDATE sessions SET ${T.join(", ")} WHERE session_id = ?`;if(m.push(n.sessionId),n.expectedStatusLock!==void 0)f+=" AND status_lock = ?",m.push(n.expectedStatusLock);if((this.store.run(f,m).changes??0)===0)return{updated:!1,statusLock:0};if(n.expectedStatusLock===void 0)g=(await this.getSession(n.sessionId))?.status_lock??0;return{updated:!0,statusLock:g}}async deleteSession(n,T){let m=this.store.run("DELETE FROM sessions WHERE session_id = ?",[n]).changes??0;if(T)this.store.run("DELETE FROM sessions WHERE parent_session_id = ?",[n]);return m>0}async enqueueSpawnRequest(n){this.store.run(`INSERT INTO subagent_spawn_queue (root_session_id, parent_agent_id, task, system_prompt, created_at, consumed_at)
|
|
597
|
+
VALUES (?, ?, ?, ?, ?, NULL)`,[n.rootSessionId,n.parentAgentId,n.task??null,n.systemPrompt??null,F()])}async claimSpawnRequest(n,T){let m=this.store.queryOne(`SELECT id, task FROM subagent_spawn_queue
|
|
598
|
+
WHERE root_session_id = ? AND parent_agent_id = ? AND consumed_at IS NULL
|
|
599
|
+
ORDER BY id ASC LIMIT 1`,[n,T]);if(!m||typeof m.id!=="number")return;return this.store.run("UPDATE subagent_spawn_queue SET consumed_at = ? WHERE id = ?",[F(),m.id]),m.task??void 0}}class Om extends UT{store;constructor(n){super(new O_(n));this.store=n}createRootSession(n){this.store.run(`INSERT OR REPLACE INTO sessions (
|
|
600
|
+
session_id, source, pid, started_at, ended_at, exit_code, status, status_lock, interactive,
|
|
601
|
+
provider, model, cwd, workspace_root, team_name, enable_tools, enable_spawn, enable_teams,
|
|
602
|
+
parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent, prompt,
|
|
603
|
+
metadata_json, transcript_path, hook_path, messages_path, updated_at
|
|
604
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[n.sessionId,n.source,n.pid,n.startedAt,null,null,"running",0,n.interactive?1:0,n.provider,n.model,n.cwd,n.workspaceRoot,n.teamName??null,n.enableTools?1:0,n.enableSpawn?1:0,n.enableTeams?1:0,null,null,null,null,0,n.prompt??null,n.metadata?JSON.stringify(n.metadata):null,n.transcriptPath,n.hookPath,n.messagesPath,F()])}}var yM=process.env.CLINE_RPC_ADDRESS?.trim()||rM(),Rn,yT;function EM(n){let T=process.execPath,m=process.argv[1]?.trim();if(!m)return;let g=X_(process.cwd(),m);if(!Y_(g))return;let f=process.execArgv.find((R)=>R.startsWith("--conditions=")),_=[...f?[f]:[],g,"rpc","start","--address",n];fM(T,_,{detached:!0,stdio:"ignore",env:{...process.env,CLINE_NO_INTERACTIVE:"1"},cwd:process.cwd()}).unref()}async function C_(n){try{if(!await MM(n))return;return new Wm({address:n,sessionsDir:Nn()})}catch{return}}function N_(){return new Om(new Gn)}function $M(n){if(typeof n==="string"&&n.trim().length>0)return n.trim();let T=Nn(),m=X_(T,"machine-id");try{if(Y_(m)){let f=AM(m,"utf8").trim();if(f.length>0)return f}}catch{}let g=UM();try{_M(T,{recursive:!0}),RM(m,g,"utf8")}catch{}return g}async function V_(n){if(Rn)return Rn;if(yT)return await yT;let T=n.backendMode??"auto",m=n.rpcAddress?.trim()||yM,g=Math.max(1,n.rpcConnectAttempts??5),f=Math.max(0,n.rpcConnectDelayMs??100),_=n.autoStartRpcServer!==!1;return yT=(async()=>{if(T==="local")return Rn=N_(),Rn;let A=await C_(m);if(A)return Rn=A,Rn;if(T==="rpc")throw Error(`RPC backend unavailable at ${m}`);if(_){try{EM(m)}catch{}for(let R=0;R<g;R+=1){let r=await C_(m);if(r)return Rn=r,Rn;if(f>0)await new Promise((M)=>setTimeout(M,f))}}return Rn=N_(),Rn})().finally(()=>{yT=void 0}),await yT}async function hM(n){let T=n.sessionService??await V_(n);return new Dm({sessionService:T,defaultToolExecutors:n.defaultToolExecutors,toolPolicies:n.toolPolicies,requestToolApproval:n.requestToolApproval,distinctId:$M(n.distinctId)})}class ig{store;constructor(n={}){this.store=new Gn({sessionsDir:n.sessionsDir})}init(){this.store.init()}upsertSession(n){this.store.run(`INSERT OR REPLACE INTO sessions (
|
|
605
|
+
session_id, source, pid, started_at, ended_at, exit_code, status, status_lock, interactive,
|
|
606
|
+
provider, model, cwd, workspace_root, team_name, enable_tools, enable_spawn, enable_teams,
|
|
607
|
+
parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent, prompt,
|
|
608
|
+
metadata_json, transcript_path, hook_path, messages_path, updated_at
|
|
609
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[n.sessionId,n.source,n.pid,n.startedAt,n.endedAt??null,n.exitCode??null,n.status,n.statusLock,I(n.interactive),n.provider,n.model,n.cwd,n.workspaceRoot,n.teamName??null,I(n.enableTools),I(n.enableSpawn),I(n.enableTeams),n.parentSessionId??null,n.parentAgentId??null,n.agentId??null,n.conversationId??null,I(n.isSubagent),n.prompt??null,n.metadata?JSON.stringify(n.metadata):null,n.transcriptPath,n.hookPath,n.messagesPath??null,n.updatedAt||G()])}getSession(n){let T=this.store.queryOne(`SELECT session_id, source, pid, started_at, ended_at, exit_code, status, status_lock, interactive,
|
|
610
|
+
provider, model, cwd, workspace_root, team_name, enable_tools, enable_spawn, enable_teams,
|
|
611
|
+
parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent, prompt,
|
|
612
|
+
metadata_json, transcript_path, hook_path, messages_path, updated_at
|
|
613
|
+
FROM sessions WHERE session_id = ?`,[n]);if(!T)return;return{sessionId:B(T.session_id),source:B(T.source),pid:Number(T.pid??0),startedAt:B(T.started_at),endedAt:T.ended_at??null,exitCode:T.exit_code??null,status:B(T.status),statusLock:Number(T.status_lock??0),interactive:x(T.interactive),provider:B(T.provider),model:B(T.model),cwd:B(T.cwd),workspaceRoot:B(T.workspace_root),teamName:z(T.team_name),enableTools:x(T.enable_tools),enableSpawn:x(T.enable_spawn),enableTeams:x(T.enable_teams),parentSessionId:z(T.parent_session_id),parentAgentId:z(T.parent_agent_id),agentId:z(T.agent_id),conversationId:z(T.conversation_id),isSubagent:x(T.is_subagent),prompt:z(T.prompt),metadata:(()=>{let m=z(T.metadata_json);if(!m)return;try{let g=JSON.parse(m);if(g&&typeof g==="object"&&!Array.isArray(g))return g}catch{}return})(),transcriptPath:B(T.transcript_path),hookPath:B(T.hook_path),messagesPath:z(T.messages_path),updatedAt:B(T.updated_at)||G()}}listSessions(n){let T=[],m=[];if(n.parentSessionId)T.push("parent_session_id = ?"),m.push(n.parentSessionId);if(n.status)T.push("status = ?"),m.push(n.status);let g=T.length>0?`WHERE ${T.join(" AND ")}`:"",f=Math.max(1,Math.floor(n.limit)),_=this.store.queryAll(`SELECT session_id FROM sessions ${g} ORDER BY started_at DESC LIMIT ?`,[...m,f]),A=[];for(let R of _){if(!R.session_id)continue;let r=this.getSession(R.session_id);if(r)A.push(r)}return A}updateSession(n){let T=this.getSession(n.sessionId);if(!T)return{updated:!1,statusLock:0};if(typeof n.expectedStatusLock==="number"&&T.statusLock!==n.expectedStatusLock)return{updated:!1,statusLock:T.statusLock};let m=T.statusLock+1,g=n.setRunning?"running":n.status??T.status,f=n.setRunning===!0?null:n.endedAt!==void 0?n.endedAt:T.endedAt??null,_=n.setRunning===!0?null:n.exitCode!==void 0?n.exitCode:T.exitCode??null,A=n.prompt!==void 0?n.prompt??void 0:T.prompt,R=n.metadata!==void 0?n.metadata??void 0:T.metadata;return this.store.run(`UPDATE sessions
|
|
614
|
+
SET status = ?, ended_at = ?, exit_code = ?, prompt = ?, metadata_json = ?,
|
|
615
|
+
parent_session_id = ?, parent_agent_id = ?, agent_id = ?, conversation_id = ?,
|
|
616
|
+
status_lock = ?, updated_at = ?
|
|
617
|
+
WHERE session_id = ?`,[g,f,_,A??null,R?JSON.stringify(R):null,n.parentSessionId!==void 0?n.parentSessionId??null:T.parentSessionId??null,n.parentAgentId!==void 0?n.parentAgentId??null:T.parentAgentId??null,n.agentId!==void 0?n.agentId??null:T.agentId??null,n.conversationId!==void 0?n.conversationId??null:T.conversationId??null,m,G(),n.sessionId]),{updated:!0,statusLock:m}}deleteSession(n){return(this.store.run("DELETE FROM sessions WHERE session_id = ?",[n]).changes??0)>0}deleteSessionsByParent(n){this.store.run("DELETE FROM sessions WHERE parent_session_id = ?",[n])}enqueueSpawnRequest(n){this.store.run(`INSERT INTO subagent_spawn_queue (root_session_id, parent_agent_id, task, system_prompt, created_at, consumed_at)
|
|
618
|
+
VALUES (?, ?, ?, ?, ?, NULL)`,[n.rootSessionId,n.parentAgentId,n.task??null,n.systemPrompt??null,G()])}claimSpawnRequest(n,T){let m=this.store.queryOne(`SELECT id, root_session_id, parent_agent_id, task, system_prompt, created_at, consumed_at
|
|
619
|
+
FROM subagent_spawn_queue
|
|
620
|
+
WHERE root_session_id = ? AND parent_agent_id = ? AND consumed_at IS NULL
|
|
621
|
+
ORDER BY id ASC LIMIT 1`,[n,T]);if(!m||typeof m.id!=="number")return;let g=G();return this.store.run("UPDATE subagent_spawn_queue SET consumed_at = ? WHERE id = ?",[g,m.id]),{id:m.id,rootSessionId:B(m.root_session_id),parentAgentId:B(m.parent_agent_id),task:z(m.task),systemPrompt:z(m.system_prompt),createdAt:B(m.created_at),consumedAt:g}}}function DM(n={}){return new ig(n)}import{basename as LM,resolve as WM}from"node:path";import OM from"simple-git";import{z as gn}from"zod";var K_=gn.object({rootPath:gn.string().min(1),hint:gn.string().min(1).optional(),associatedRemoteUrls:gn.array(gn.string().min(1)).optional(),latestGitCommitHash:gn.string().min(1).optional(),latestGitBranchName:gn.string().min(1).optional()}),kn=gn.object({currentWorkspacePath:gn.string().min(1).optional(),workspaces:gn.record(gn.string().min(1),K_)});function CM(){return{workspaces:{}}}function ET(n){return WM(n)}async function Cm(n){let T=ET(n),m={rootPath:T,hint:LM(T)};try{let g=OM({baseDir:T});if(!await g.checkIsRepo())return m;let _=await g.getRemotes(!0);if(_.length>0){let r=_.map((M)=>{let U=M.refs.fetch||M.refs.push;return`${M.name}: ${U}`});m.associatedRemoteUrls=r}let A=(await g.revparse(["HEAD"])).trim();if(A.length>0)m.latestGitCommitHash=A;let R=(await g.branch()).current.trim();if(R.length>0)m.latestGitBranchName=R}catch{}return m}function lg(n,T){let m={...n,workspaces:{...n.workspaces,[T.rootPath]:T}};if(!m.currentWorkspacePath)m.currentWorkspacePath=T.rootPath;return kn.parse(m)}async function NM(n){let T=await Cm(n),m={workspaces:{[T.rootPath]:{hint:T.hint,associatedRemoteUrls:T.associatedRemoteUrls,latestGitCommitHash:T.latestGitCommitHash,latestGitBranchName:T.latestGitBranchName}}};return`# Workspace Configuration
|
|
622
|
+
${JSON.stringify(m,null,2)}`}class j_{manifest;listeners=new Set;constructor(n){this.manifest=kn.parse(n??{workspaces:{}})}async addWorkspacePath(n){let T=await Cm(n);return this.manifest=lg(this.manifest,T),this.emit({type:"workspace_added",workspace:T}),T}async switchWorkspace(n){let T=ET(n),m=this.manifest.workspaces[T];if(m)return this.manifest=kn.parse({...this.manifest,currentWorkspacePath:T}),this.emit({type:"workspace_switched",workspace:m}),m;let g=await this.addWorkspacePath(T);return this.manifest=kn.parse({...this.manifest,currentWorkspacePath:g.rootPath}),this.emit({type:"workspace_switched",workspace:g}),g}subscribe(n){return this.listeners.add(n),()=>{this.listeners.delete(n)}}getCurrentWorkspace(){let n=this.manifest.currentWorkspacePath;if(!n)return;return this.manifest.workspaces[n]}getWorkspace(n){let T=ET(n);return this.manifest.workspaces[T]}listWorkspaces(){return Object.values(this.manifest.workspaces)}getManifest(){return this.manifest}emit(n){for(let T of this.listeners)T(n)}}export{lg as upsertWorkspaceInfo,Um as toTeamProgressLifecycleEvent,GT as toPartialAgentConfig,wm as toHookConfigFileName,jn as startLocalOAuthServer,hT as setHomeDirIfUnset,mf as setHomeDir,v1 as saveLocalProviderSettings,c1 as saveLocalProviderOAuthCredentials,rT as sanitizeSessionToken,_g as resolveWorkflowsConfigSearchPaths,Mr as resolveWorkflowSlashCommandFromWatcher,gg as resolveSkillsConfigSearchPaths,Nn as resolveSessionDataDir,V_ as resolveSessionBackend,fg as resolveRulesConfigSearchPaths,pm as resolvePluginConfigSearchPaths,Kg as resolveMcpServerRegistrations,I1 as resolveLocalClineAuthToken,Im as resolveHooksConfigSearchPaths,yf as resolveHookLogPath,ln as resolveDocumentsWorkflowsDirectoryPath,an as resolveDocumentsRulesDirectoryPath,wn as resolveDocumentsHooksDirectoryPath,Rm as resolveDefaultMcpSettingsPath,c as resolveClineDataDir,wT as resolveAndLoadAgentPlugins,vT as resolveAgentTools,dm as resolveAgentPluginPaths,Rr as requestDesktopToolApproval,Z0 as registerMcpServersFromSettingsFile,Dg as refreshOpenAICodexToken,Og as refreshOcaToken,$g as refreshClineToken,Ff as prewarmFileIndex,mg as parseWorkflowConfigFromMarkdown,ng as parseSkillConfigFromMarkdown,Tg as parseRuleConfigFromMarkdown,Sm as parsePartialAgentConfigFromYaml,zn as parseAgentConfigFromYaml,jR as openaiCodexOAuthProvider,ET as normalizeWorkspacePath,OT as normalizeUserInput,KR as normalizeOpenAICodexCredentials,G1 as normalizeOAuthProvider,tg as migrateLegacyProviderSettings,xg as makeTeamTaskSubSessionId,Lm as makeSubSessionId,fm as loginOpenAICodex,Am as loginOcaOAuth,S1 as loginLocalProvider,mm as loginClineOAuth,x1 as loadRulesForSystemPromptFromWatcher,Vg as loadMcpSettingsFile,cT as loadAgentPluginsFromPaths,am as loadAgentPluginFromPath,b1 as listLocalProviders,ST as listHookConfigFiles,a0 as listEnabledRulesFromWatcher,o0 as listAvailableWorkflowsFromWatcher,x0 as isRuleEnabled,N0 as isRpcClineAccountActionRequest,VR as isOpenAICodexTokenExpired,Q0 as hasMcpSettingsFile,Lg as getValidOpenAICodexCredentials,Cg as getValidOcaCredentials,hg as getValidClineCredentials,u1 as getLocalProviderModels,Xn as getFileIndex,Cm as generateWorkspaceInfo,C0 as generateOcaOpcRequestId,w0 as formatRulesForSystemPrompt,Y0 as executeRpcClineAccountAction,en as ensureParentDir,gf as ensureHookLogDir,F1 as ensureCustomProvidersLoaded,qT as enrichPromptWithMentions,CM as emptyWorkspaceManifest,Pn as emptyStoredProviderSettings,xT as discoverPluginModulePaths,wg as deriveSubsessionStatus,rg as createWorkflowsConfigDefinition,eT as createUserInstructionConfigWatcher,Pf as createToolPoliciesWithPreset,e0 as createTeamName,DM as createSqliteRpcSessionBackend,Ag as createSkillsConfigDefinition,hM as createSessionHost,Rg as createRulesConfigDefinition,bR as createOcaRequestHeaders,PR as createOcaOAuthProvider,Mg as createOAuthClientCallbacks,bf as createDefaultToolsWithPreset,Qn as createDefaultTools,uT as createDefaultExecutors,WR as createClineOAuthProvider,sn as createBuiltinTools,Sf as createAgentConfigWatcher,cm as createAgentConfigDefinition,NM as buildWorkspaceMetadata,Mm as buildTeamProgressSummary,P1 as addLocalProvider,kn as WorkspaceManifestSchema,K_ as WorkspaceInfoSchema,In as WORKFLOWS_CONFIG_DIRECTORY_NAME,Kn as UnifiedConfigFileWatcher,Mn as ToolPresets,IT as SubprocessSandbox,rm as StoredProviderSettingsSchema,F0 as StoredProviderSettingsEntrySchema,fT as SqliteTeamStore,Gn as SqliteSessionStore,ig as SqliteRpcSessionBackend,_T as SessionSource,o as SKILLS_CONFIG_DIRECTORY_NAME,Zg as SESSION_STATUSES,Wm as RpcCoreSessionService,Yg as RpcClineAccountService,cn as RULES_CONFIG_DIRECTORY_NAME,rf as RPC_TEAM_PROGRESS_EVENT_TYPE,Mf as RPC_TEAM_LIFECYCLE_EVENT_TYPE,tn as ProviderSettingsManager,E0 as OCI_HEADER_OPC_REQUEST_ID,j_ as InMemoryWorkspaceManager,jg as InMemoryMcpManager,kT as HookConfigFileName,xm as HOOK_CONFIG_FILE_EVENT_MAP,Sn as HOOKS_CONFIG_DIRECTORY_NAME,fn as DefaultToolNames,Dm as DefaultSessionManager,ym as DefaultRuntimeBuilder,R0 as DEFAULT_INTERNAL_OCA_BASE_URL,_0 as DEFAULT_INTERNAL_IDCS_URL,A0 as DEFAULT_INTERNAL_IDCS_SCOPES,f0 as DEFAULT_INTERNAL_IDCS_CLIENT_ID,y0 as DEFAULT_EXTERNAL_OCA_BASE_URL,M0 as DEFAULT_EXTERNAL_IDCS_URL,U0 as DEFAULT_EXTERNAL_IDCS_SCOPES,r0 as DEFAULT_EXTERNAL_IDCS_CLIENT_ID,Om as CoreSessionService,Ng as ClineAccountService,uR as ChatViewStateSchema,J0 as ChatSummarySchema,V0 as ChatSessionStatusSchema,X0 as ChatSessionConfigSchema,j0 as ChatMessageSchema,K0 as ChatMessageRoleSchema,Yn as ALL_DEFAULT_TOOL_NAMES};
|