@clinebot/core 0.0.0

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.
Files changed (200) hide show
  1. package/README.md +88 -0
  2. package/dist/account/cline-account-service.d.ts +34 -0
  3. package/dist/account/index.d.ts +3 -0
  4. package/dist/account/rpc.d.ts +38 -0
  5. package/dist/account/types.d.ts +74 -0
  6. package/dist/agents/agent-config-loader.d.ts +18 -0
  7. package/dist/agents/agent-config-parser.d.ts +25 -0
  8. package/dist/agents/hooks-config-loader.d.ts +23 -0
  9. package/dist/agents/index.d.ts +11 -0
  10. package/dist/agents/plugin-config-loader.d.ts +22 -0
  11. package/dist/agents/plugin-loader.d.ts +9 -0
  12. package/dist/agents/plugin-sandbox.d.ts +12 -0
  13. package/dist/agents/unified-config-file-watcher.d.ts +77 -0
  14. package/dist/agents/user-instruction-config-loader.d.ts +63 -0
  15. package/dist/auth/client.d.ts +11 -0
  16. package/dist/auth/cline.d.ts +41 -0
  17. package/dist/auth/codex.d.ts +39 -0
  18. package/dist/auth/oca.d.ts +22 -0
  19. package/dist/auth/server.d.ts +22 -0
  20. package/dist/auth/types.d.ts +72 -0
  21. package/dist/auth/utils.d.ts +32 -0
  22. package/dist/chat/chat-schema.d.ts +145 -0
  23. package/dist/default-tools/constants.d.ts +23 -0
  24. package/dist/default-tools/definitions.d.ts +96 -0
  25. package/dist/default-tools/executors/apply-patch-parser.d.ts +68 -0
  26. package/dist/default-tools/executors/apply-patch.d.ts +26 -0
  27. package/dist/default-tools/executors/bash.d.ts +49 -0
  28. package/dist/default-tools/executors/editor.d.ts +31 -0
  29. package/dist/default-tools/executors/file-read.d.ts +40 -0
  30. package/dist/default-tools/executors/index.d.ts +44 -0
  31. package/dist/default-tools/executors/search.d.ts +50 -0
  32. package/dist/default-tools/executors/web-fetch.d.ts +58 -0
  33. package/dist/default-tools/index.d.ts +57 -0
  34. package/dist/default-tools/presets.d.ts +124 -0
  35. package/dist/default-tools/schemas.d.ts +121 -0
  36. package/dist/default-tools/types.d.ts +237 -0
  37. package/dist/index.d.ts +23 -0
  38. package/dist/index.js +220 -0
  39. package/dist/input/file-indexer.d.ts +5 -0
  40. package/dist/input/index.d.ts +4 -0
  41. package/dist/input/mention-enricher.d.ts +12 -0
  42. package/dist/mcp/config-loader.d.ts +15 -0
  43. package/dist/mcp/index.d.ts +4 -0
  44. package/dist/mcp/manager.d.ts +24 -0
  45. package/dist/mcp/types.d.ts +66 -0
  46. package/dist/runtime/hook-file-hooks.d.ts +18 -0
  47. package/dist/runtime/rules.d.ts +5 -0
  48. package/dist/runtime/runtime-builder.d.ts +5 -0
  49. package/dist/runtime/sandbox/subprocess-sandbox.d.ts +19 -0
  50. package/dist/runtime/session-runtime.d.ts +36 -0
  51. package/dist/runtime/tool-approval.d.ts +9 -0
  52. package/dist/runtime/workflows.d.ts +13 -0
  53. package/dist/server/index.d.ts +47 -0
  54. package/dist/server/index.js +641 -0
  55. package/dist/session/default-session-manager.d.ts +77 -0
  56. package/dist/session/rpc-session-service.d.ts +12 -0
  57. package/dist/session/runtime-oauth-token-manager.d.ts +28 -0
  58. package/dist/session/session-artifacts.d.ts +19 -0
  59. package/dist/session/session-graph.d.ts +15 -0
  60. package/dist/session/session-host.d.ts +21 -0
  61. package/dist/session/session-manager.d.ts +50 -0
  62. package/dist/session/session-manifest.d.ts +30 -0
  63. package/dist/session/session-service.d.ts +113 -0
  64. package/dist/session/sqlite-rpc-session-backend.d.ts +30 -0
  65. package/dist/session/unified-session-persistence-service.d.ts +93 -0
  66. package/dist/session/workspace-manager.d.ts +28 -0
  67. package/dist/session/workspace-manifest.d.ts +25 -0
  68. package/dist/storage/provider-settings-legacy-migration.d.ts +13 -0
  69. package/dist/storage/provider-settings-manager.d.ts +20 -0
  70. package/dist/storage/sqlite-session-store.d.ts +29 -0
  71. package/dist/storage/sqlite-team-store.d.ts +31 -0
  72. package/dist/storage/team-store.d.ts +2 -0
  73. package/dist/team/index.d.ts +1 -0
  74. package/dist/team/projections.d.ts +8 -0
  75. package/dist/types/common.d.ts +10 -0
  76. package/dist/types/config.d.ts +37 -0
  77. package/dist/types/events.d.ts +54 -0
  78. package/dist/types/provider-settings.d.ts +20 -0
  79. package/dist/types/sessions.d.ts +9 -0
  80. package/dist/types/storage.d.ts +37 -0
  81. package/dist/types/workspace.d.ts +7 -0
  82. package/dist/types.d.ts +26 -0
  83. package/package.json +63 -0
  84. package/src/account/cline-account-service.test.ts +101 -0
  85. package/src/account/cline-account-service.ts +267 -0
  86. package/src/account/index.ts +20 -0
  87. package/src/account/rpc.test.ts +62 -0
  88. package/src/account/rpc.ts +172 -0
  89. package/src/account/types.ts +80 -0
  90. package/src/agents/agent-config-loader.test.ts +234 -0
  91. package/src/agents/agent-config-loader.ts +107 -0
  92. package/src/agents/agent-config-parser.ts +191 -0
  93. package/src/agents/hooks-config-loader.ts +97 -0
  94. package/src/agents/index.ts +84 -0
  95. package/src/agents/plugin-config-loader.test.ts +91 -0
  96. package/src/agents/plugin-config-loader.ts +160 -0
  97. package/src/agents/plugin-loader.test.ts +102 -0
  98. package/src/agents/plugin-loader.ts +105 -0
  99. package/src/agents/plugin-sandbox.test.ts +120 -0
  100. package/src/agents/plugin-sandbox.ts +471 -0
  101. package/src/agents/unified-config-file-watcher.test.ts +196 -0
  102. package/src/agents/unified-config-file-watcher.ts +483 -0
  103. package/src/agents/user-instruction-config-loader.test.ts +158 -0
  104. package/src/agents/user-instruction-config-loader.ts +438 -0
  105. package/src/auth/client.test.ts +40 -0
  106. package/src/auth/client.ts +25 -0
  107. package/src/auth/cline.test.ts +130 -0
  108. package/src/auth/cline.ts +414 -0
  109. package/src/auth/codex.test.ts +170 -0
  110. package/src/auth/codex.ts +466 -0
  111. package/src/auth/oca.test.ts +215 -0
  112. package/src/auth/oca.ts +546 -0
  113. package/src/auth/server.ts +216 -0
  114. package/src/auth/types.ts +78 -0
  115. package/src/auth/utils.test.ts +128 -0
  116. package/src/auth/utils.ts +247 -0
  117. package/src/chat/chat-schema.ts +82 -0
  118. package/src/default-tools/constants.ts +35 -0
  119. package/src/default-tools/definitions.test.ts +233 -0
  120. package/src/default-tools/definitions.ts +632 -0
  121. package/src/default-tools/executors/apply-patch-parser.ts +520 -0
  122. package/src/default-tools/executors/apply-patch.ts +359 -0
  123. package/src/default-tools/executors/bash.ts +205 -0
  124. package/src/default-tools/executors/editor.ts +231 -0
  125. package/src/default-tools/executors/file-read.test.ts +25 -0
  126. package/src/default-tools/executors/file-read.ts +94 -0
  127. package/src/default-tools/executors/index.ts +75 -0
  128. package/src/default-tools/executors/search.ts +278 -0
  129. package/src/default-tools/executors/web-fetch.ts +259 -0
  130. package/src/default-tools/index.ts +161 -0
  131. package/src/default-tools/presets.test.ts +63 -0
  132. package/src/default-tools/presets.ts +168 -0
  133. package/src/default-tools/schemas.ts +228 -0
  134. package/src/default-tools/types.ts +324 -0
  135. package/src/index.ts +119 -0
  136. package/src/input/file-indexer.d.ts +11 -0
  137. package/src/input/file-indexer.test.ts +87 -0
  138. package/src/input/file-indexer.ts +280 -0
  139. package/src/input/index.ts +7 -0
  140. package/src/input/mention-enricher.test.ts +82 -0
  141. package/src/input/mention-enricher.ts +119 -0
  142. package/src/mcp/config-loader.test.ts +238 -0
  143. package/src/mcp/config-loader.ts +219 -0
  144. package/src/mcp/index.ts +26 -0
  145. package/src/mcp/manager.test.ts +106 -0
  146. package/src/mcp/manager.ts +262 -0
  147. package/src/mcp/types.ts +88 -0
  148. package/src/runtime/hook-file-hooks.test.ts +106 -0
  149. package/src/runtime/hook-file-hooks.ts +736 -0
  150. package/src/runtime/index.ts +27 -0
  151. package/src/runtime/rules.ts +34 -0
  152. package/src/runtime/runtime-builder.team-persistence.test.ts +203 -0
  153. package/src/runtime/runtime-builder.test.ts +215 -0
  154. package/src/runtime/runtime-builder.ts +515 -0
  155. package/src/runtime/runtime-parity.test.ts +132 -0
  156. package/src/runtime/sandbox/subprocess-sandbox.ts +207 -0
  157. package/src/runtime/session-runtime.ts +44 -0
  158. package/src/runtime/tool-approval.ts +104 -0
  159. package/src/runtime/workflows.test.ts +119 -0
  160. package/src/runtime/workflows.ts +54 -0
  161. package/src/server/index.ts +282 -0
  162. package/src/session/default-session-manager.e2e.test.ts +354 -0
  163. package/src/session/default-session-manager.test.ts +816 -0
  164. package/src/session/default-session-manager.ts +1286 -0
  165. package/src/session/index.ts +37 -0
  166. package/src/session/rpc-session-service.ts +189 -0
  167. package/src/session/runtime-oauth-token-manager.test.ts +137 -0
  168. package/src/session/runtime-oauth-token-manager.ts +265 -0
  169. package/src/session/session-artifacts.ts +106 -0
  170. package/src/session/session-graph.ts +90 -0
  171. package/src/session/session-host.ts +190 -0
  172. package/src/session/session-manager.ts +56 -0
  173. package/src/session/session-manifest.ts +29 -0
  174. package/src/session/session-service.team-persistence.test.ts +48 -0
  175. package/src/session/session-service.ts +610 -0
  176. package/src/session/sqlite-rpc-session-backend.ts +303 -0
  177. package/src/session/unified-session-persistence-service.ts +781 -0
  178. package/src/session/workspace-manager.ts +98 -0
  179. package/src/session/workspace-manifest.ts +100 -0
  180. package/src/storage/artifact-store.ts +1 -0
  181. package/src/storage/index.ts +11 -0
  182. package/src/storage/provider-settings-legacy-migration.test.ts +175 -0
  183. package/src/storage/provider-settings-legacy-migration.ts +637 -0
  184. package/src/storage/provider-settings-manager.test.ts +111 -0
  185. package/src/storage/provider-settings-manager.ts +129 -0
  186. package/src/storage/session-store.ts +1 -0
  187. package/src/storage/sqlite-session-store.ts +270 -0
  188. package/src/storage/sqlite-team-store.ts +443 -0
  189. package/src/storage/team-store.ts +5 -0
  190. package/src/team/index.ts +4 -0
  191. package/src/team/projections.ts +285 -0
  192. package/src/types/common.ts +14 -0
  193. package/src/types/config.ts +64 -0
  194. package/src/types/events.ts +46 -0
  195. package/src/types/index.ts +24 -0
  196. package/src/types/provider-settings.ts +43 -0
  197. package/src/types/sessions.ts +16 -0
  198. package/src/types/storage.ts +64 -0
  199. package/src/types/workspace.ts +7 -0
  200. package/src/types.ts +127 -0
package/dist/index.js ADDED
@@ -0,0 +1,220 @@
1
+ class be{apiBaseUrl;getAuthTokenFn;getCurrentUserIdFn;getOrganizationMemberIdFn;getHeadersFn;requestTimeoutMs;fetchImpl;constructor(e){let t=e.apiBaseUrl.trim();if(!t)throw Error("apiBaseUrl is required");this.apiBaseUrl=t,this.getAuthTokenFn=e.getAuthToken,this.getCurrentUserIdFn=e.getCurrentUserId,this.getOrganizationMemberIdFn=e.getOrganizationMemberId,this.getHeadersFn=e.getHeaders,this.requestTimeoutMs=e.requestTimeoutMs??30000,this.fetchImpl=e.fetchImpl??fetch}async fetchMe(){return this.request("/api/v1/users/me")}async fetchBalance(e){let t=await this.resolveUserId(e);return this.request(`/api/v1/users/${encodeURIComponent(t)}/balance`)}async fetchUsageTransactions(e){let t=await this.resolveUserId(e);return(await this.request(`/api/v1/users/${encodeURIComponent(t)}/usages`)).items??[]}async fetchPaymentTransactions(e){let t=await this.resolveUserId(e);return(await this.request(`/api/v1/users/${encodeURIComponent(t)}/payments`)).paymentTransactions??[]}async fetchUserOrganizations(){return(await this.fetchMe()).organizations??[]}async fetchOrganizationBalance(e){let t=e.trim();if(!t)throw Error("organizationId is required");return this.request(`/api/v1/organizations/${encodeURIComponent(t)}/balance`)}async fetchOrganizationUsageTransactions(e){let t=e.organizationId.trim();if(!t)throw Error("organizationId is required");let n=await this.resolveOrganizationMemberId(t,e.memberId);return(await this.request(`/api/v1/organizations/${encodeURIComponent(t)}/members/${encodeURIComponent(n)}/usages`)).items??[]}async switchAccount(e){await this.request("/api/v1/users/active-account",{method:"PUT",body:{organizationId:e?.trim()||null},expectNoContent:!0})}async resolveUserId(e){let t=e?.trim();if(t)return t;let s=(this.getCurrentUserIdFn?await this.getCurrentUserIdFn():void 0)?.trim();if(s)return s;let i=await this.fetchMe();if(!i.id?.trim())throw Error("Unable to resolve current user id");return i.id}async resolveOrganizationMemberId(e,t){let n=t?.trim();if(n)return n;let i=(this.getOrganizationMemberIdFn?await this.getOrganizationMemberIdFn(e):void 0)?.trim();if(i)return i;let o=(await this.fetchUserOrganizations()).find((a)=>a.organizationId===e)?.memberId;if(!o?.trim())throw Error(`Unable to resolve memberId for organization ${e}`);return o}async request(e,t){let n=(await this.getAuthTokenFn())?.trim();if(!n)throw Error("No Cline account auth token found");let s=this.getHeadersFn?await this.getHeadersFn():{},i=new AbortController,r=setTimeout(()=>i.abort(),this.requestTimeoutMs);try{let o=await this.fetchImpl(new URL(e,this.apiBaseUrl),{method:t?.method??"GET",headers:{Authorization:`Bearer ${n}`,"Content-Type":"application/json",...s??{}},body:t?.body!==void 0?JSON.stringify(t.body):void 0,signal:i.signal});if(o.status===204||t?.expectNoContent){if(!o.ok)throw Error(`Cline account request failed with status ${o.status}`);return}let a=await o.text(),c;if(a.trim())c=JSON.parse(a);if(!o.ok){let m=typeof c==="object"&&c!==null&&"error"in c?String(c.error):`Cline account request failed with status ${o.status}`;throw Error(m)}if(typeof c==="object"&&c!==null){let m=c;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(c===void 0||c===null)throw Error("Cline account response payload was empty");return c}finally{clearTimeout(r)}}}function Ge(e){return e.action==="clineAccount"}async function Je(e,t){switch(e.operation){case"fetchMe":return t.fetchMe();case"fetchBalance":return t.fetchBalance(e.userId);case"fetchUsageTransactions":return t.fetchUsageTransactions(e.userId);case"fetchPaymentTransactions":return t.fetchPaymentTransactions(e.userId);case"fetchUserOrganizations":return t.fetchUserOrganizations();case"fetchOrganizationBalance":return t.fetchOrganizationBalance(e.organizationId);case"fetchOrganizationUsageTransactions":return t.fetchOrganizationUsageTransactions({organizationId:e.organizationId,memberId:e.memberId});case"switchAccount":return await t.switchAccount(e.organizationId),{updated:!0};default:throw Error(`Unsupported Cline account operation: ${String(e)}`)}}class Ne{executor;constructor(e){this.executor=e}async fetchMe(){return this.request({action:"clineAccount",operation:"fetchMe"})}async fetchBalance(e){return this.request({action:"clineAccount",operation:"fetchBalance",...e?.trim()?{userId:e.trim()}:{}})}async fetchUsageTransactions(e){return this.request({action:"clineAccount",operation:"fetchUsageTransactions",...e?.trim()?{userId:e.trim()}:{}})}async fetchPaymentTransactions(e){return this.request({action:"clineAccount",operation:"fetchPaymentTransactions",...e?.trim()?{userId:e.trim()}:{}})}async fetchUserOrganizations(){return this.request({action:"clineAccount",operation:"fetchUserOrganizations"})}async fetchOrganizationBalance(e){let t=e.trim();if(!t)throw Error("organizationId is required");return this.request({action:"clineAccount",operation:"fetchOrganizationBalance",organizationId:t})}async fetchOrganizationUsageTransactions(e){let t=e.organizationId.trim();if(!t)throw Error("organizationId is required");return this.request({action:"clineAccount",operation:"fetchOrganizationUsageTransactions",organizationId:t,...e.memberId?.trim()?{memberId:e.memberId.trim()}:{}})}async switchAccount(e){await this.request({action:"clineAccount",operation:"switchAccount",organizationId:e?.trim()||null})}async request(e){return(await this.executor.runProviderAction(e)).result}}import{z as p}from"zod";var We=p.object({workspaceRoot:p.string().min(1),cwd:p.string().optional(),provider:p.string().min(1),model:p.string().min(1),mode:p.enum(["act","plan"]).default("act"),apiKey:p.string(),systemPrompt:p.string().optional(),rules:p.string().optional(),maxIterations:p.number().int().positive().optional(),enableTools:p.boolean(),enableSpawn:p.boolean(),enableTeams:p.boolean(),autoApproveTools:p.boolean().optional(),teamName:p.string().min(1),missionStepInterval:p.number().int().positive(),missionTimeIntervalMs:p.number().int().positive()}),Qe=p.enum(["idle","starting","running","stopping","completed","cancelled","failed","error"]),Ze=p.enum(["user","assistant","tool","system","status","error"]),et=p.object({id:p.string().min(1),sessionId:p.string().nullable(),role:Ze,content:p.string(),createdAt:p.number().int().nonnegative(),meta:p.object({stream:p.enum(["stdout","stderr"]).optional(),toolName:p.string().optional(),iteration:p.number().int().nonnegative().optional(),agentId:p.string().optional(),conversationId:p.string().optional(),hookEventName:p.string().optional(),inputTokens:p.number().int().nonnegative().optional(),outputTokens:p.number().int().nonnegative().optional()}).optional()}),tt=p.object({toolCalls:p.number().int().nonnegative(),tokensIn:p.number().int().nonnegative(),tokensOut:p.number().int().nonnegative()}),zt=p.object({sessionId:p.string().nullable(),status:Qe,config:We,messages:p.array(et),rawTranscript:p.string(),error:p.string().nullable(),summary:tt});import{z as V}from"zod";var nt=V.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"]),Kt=V.object({adapter:V.string(),botUserName:V.string().optional(),event:nt,payload:V.record(V.string(),V.unknown()),ts:V.string()});var rt=[{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 Ht(e){return Object.fromEntries(rt.flatMap((t)=>{let n=e==="modelsDevKey"?t.modelsDevKey:t.generatedProviderId;return n?[[t.modelsDevKey,n]]:[]}))}var Vt=Ht("generatedProviderId");import{z as I}from"zod";var jt=I.object({agentId:I.string(),conversationId:I.string(),iteration:I.number(),abortSignal:I.custom().optional(),metadata:I.record(I.string(),I.unknown()).optional()}),Yt=I.object({id:I.string(),name:I.string(),input:I.unknown(),output:I.unknown(),error:I.string().optional(),durationMs:I.number(),startedAt:I.date(),endedAt:I.date()});import{z as st}from"zod";function L(e,t){let n=e.safeParse(t);if(!n.success)throw Error(st.prettifyError(n.error));return n.data}function k(e){return st.toJSONSchema(e)}var Ue=["running","completed","failed","cancelled"];var w={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"},se=[w.READ_FILES,w.SEARCH_CODEBASE,w.RUN_COMMANDS,w.FETCH_WEB_CONTENT,w.APPLY_PATCH,w.EDITOR,w.SKILLS,w.ASK];import{createTool as j}from"@clinebot/agents";import{z as f}from"zod";var Gt=f.string().describe("The absolute file path of a text file to read content from"),ie=f.object({file_paths:f.array(Gt).describe("Array of absolute file paths")}),it=f.union([ie,f.array(f.string()),f.string()]),oe=f.object({queries:f.array(f.string()).describe("Array of regex search queries to execute")}),Me=f.string(),ae=f.object({commands:f.array(Me).describe("Array of shell commands to execute")}),ot=f.union([ae,f.array(Me),Me]),at=f.object({url:f.url().describe("The URL to fetch"),prompt:f.string().min(2).describe("Analysis prompt for the fetched content")}),ce=f.object({requests:f.array(at).describe("Array of web fetch requests")}),me=f.object({command:f.enum(["create","str_replace","insert"]).describe("Editor command to execute: create, str_replace, insert, or undo_edit"),path:f.string().min(1).describe("Absolute file path"),file_text:f.string().optional().describe("Full file content used with create"),old_str:f.string().optional().describe("Exact text to replace (must match exactly once)"),new_str:f.string().optional().describe("Replacement or inserted text"),insert_line:f.number().int().optional().describe("Zero-based line index for insert")}).superRefine((e,t)=>{switch(e.command){case"create":if(e.file_text===void 0)t.addIssue({code:f.ZodIssueCode.custom,path:["file_text"],message:"file_text is required for command=create"});break;case"str_replace":if(e.old_str===void 0)t.addIssue({code:f.ZodIssueCode.custom,path:["old_str"],message:"old_str is required for command=str_replace"});break;case"insert":if(e.insert_line===void 0)t.addIssue({code:f.ZodIssueCode.custom,path:["insert_line"],message:"insert_line is required for command=insert"});if(e.new_str===void 0)t.addIssue({code:f.ZodIssueCode.custom,path:["new_str"],message:"new_str is required for command=insert"});break}}),de=f.object({input:f.string().min(1).describe("The apply_patch text payload, including patch instructions")}),ct=f.union([de,f.string()]),ge=f.object({skill:f.string().min(1).describe('The skill name. E.g., "commit", "review-pr", "pdf", or "ms-office-suite:pdf"'),args:f.string().optional().describe("Optional arguments for the skill")}),ue=f.object({question:f.string().min(1).describe('The single question to ask the user. E.g. "How can I help you?"'),options:f.array(f.string().min(1)).min(2).max(5).describe("Array of 2-5 user-selectable answer options for the single question")});function W(e){if(e instanceof Error)return e.message;return String(e)}function Y(e,t,n){return Promise.race([e,new Promise((s,i)=>{setTimeout(()=>i(Error(n)),t)})])}var Jt=`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 mt(e,t={}){let n=t.fileReadTimeoutMs??1e4;return j({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:k(ie),timeoutMs:n*2,retryable:!0,maxRetries:1,execute:async(s,i)=>{let r=L(it,s),o=Array.isArray(r)?r:typeof r==="object"?r.file_paths:[r];return Promise.all(o.map(async(a)=>{try{let c=await Y(e(a,i),n,`File read timed out after ${n}ms`);return{query:a,result:c,success:!0}}catch(c){let m=W(c);return{query:a,result:"",error:`Error reading file: ${m}`,success:!1}}}))}})}function dt(e,t={}){let n=t.searchTimeoutMs??30000,s=t.cwd??process.cwd();return j({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:k(oe),timeoutMs:n*2,retryable:!0,maxRetries:1,execute:async(i,r)=>{let o=L(oe,i);return Promise.all(o.queries.map(async(a)=>{try{let c=await Y(e(a,s,r),n,`Search timed out after ${n}ms`),m=c.length>0&&!c.includes("No results found");return{query:a,result:c,success:m}}catch(c){let m=W(c);return{query:a,result:"",error:`Search failed: ${m}`,success:!1}}}))}})}function gt(e,t={}){let n=t.bashTimeoutMs??30000,s=t.cwd??process.cwd();return j({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:k(ae),timeoutMs:n*2,retryable:!1,maxRetries:0,execute:async(i,r)=>{let o=L(ot,i),a=Array.isArray(o)?o:typeof o==="object"?o.commands:[o];return Promise.all(a.map(async(c)=>{try{let m=await Y(e(c,s,r),n,`Command timed out after ${n}ms`);return{query:c,result:m,success:!0}}catch(m){let d=W(m);return{query:c,result:"",error:`Command failed: ${d}`,success:!1}}}))}})}function ut(e,t={}){let n=t.webFetchTimeoutMs??30000;return j({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:k(ce),timeoutMs:n*2,retryable:!0,maxRetries:2,execute:async(s,i)=>{let r=L(ce,s);return Promise.all(r.requests.map(async(o)=>{try{let a=await Y(e(o.url,o.prompt,i),n,`Web fetch timed out after ${n}ms`);return{query:o.url,result:a,success:!0}}catch(a){let c=W(a);return{query:o.url,result:"",error:`Error fetching web content: ${c}`,success:!1}}}))}})}function lt(e,t={}){let n=t.applyPatchTimeoutMs??30000,s=t.cwd??process.cwd();return j({name:"apply_patch",description:Jt,inputSchema:k(de),timeoutMs:n,retryable:!1,maxRetries:0,execute:async(i,r)=>{let o=L(ct,i),a=typeof o==="string"?o:o.input;try{return{query:"apply_patch",result:await Y(e({input:a},s,r),n,`apply_patch timed out after ${n}ms`),success:!0}}catch(c){return{query:"apply_patch",result:"",error:`apply_patch failed: ${W(c)}`,success:!1}}}})}function pt(e,t={}){let n=t.editorTimeoutMs??30000,s=t.cwd??process.cwd();return j({name:"editor",description:"Edit file using absolute path with create, string replacement, and line insert operations. Supported commands: create, str_replace, insert, undo_edit.",inputSchema:k(me),timeoutMs:n,retryable:!1,maxRetries:0,execute:async(i,r)=>{let o=L(me,i);try{let a=await Y(e(o,s,r),n,`Editor operation timed out after ${n}ms`);return{query:`${o.command}:${o.path}`,result:a,success:!0}}catch(a){let c=W(a);return{query:`${o.command}:${o.path}`,result:"",error:`Editor operation failed: ${c}`,success:!1}}}})}function ft(e,t={}){let n=t.skillsTimeoutMs??15000;return j({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:k(ge),timeoutMs:n,retryable:!1,maxRetries:0,execute:async(s,i)=>{let r=L(ge,s);return Y(e(r.skill,r.args,i),n,`Skills operation timed out after ${n}ms`)}})}function Tt(e,t={}){let n=t.askQuestionTimeoutMs??15000;return j({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:k(ue),timeoutMs:n,retryable:!1,maxRetries:0,execute:async(s,i)=>{let r=L(ue,s);return Y(e(r.question,r.options,i),n,`ask_question timed out after ${n}ms`)}})}function Q(e){let{executors:t,enableReadFiles:n=!0,enableSearch:s=!0,enableBash:i=!0,enableWebFetch:r=!0,enableApplyPatch:o=!1,enableEditor:a=!0,enableSkills:c=!0,enableAskQuestion:m=!0,...d}=e,g=[];if(n&&t.readFile)g.push(mt(t.readFile,d));if(s&&t.search)g.push(dt(t.search,d));if(i&&t.bash)g.push(gt(t.bash,d));if(r&&t.webFetch)g.push(ut(t.webFetch,d));if(a&&t.editor)g.push(pt(t.editor,d));else if(o&&t.applyPatch)g.push(lt(t.applyPatch,d));if(c&&t.skills)g.push(ft(t.skills,d));if(m&&t.askQuestion)g.push(Tt(t.askQuestion,d));return g}var U=(()=>({}));function F(e){if(typeof e!=="string")throw TypeError("Path must be a string. Received "+JSON.stringify(e))}function vt(e,t){var n="",s=0,i=-1,r=0,o;for(var a=0;a<=e.length;++a){if(a<e.length)o=e.charCodeAt(a);else if(o===47)break;else o=47;if(o===47){if(i===a-1||r===1);else if(i!==a-1&&r===2){if(n.length<2||s!==2||n.charCodeAt(n.length-1)!==46||n.charCodeAt(n.length-2)!==46){if(n.length>2){var c=n.lastIndexOf("/");if(c!==n.length-1){if(c===-1)n="",s=0;else n=n.slice(0,c),s=n.length-1-n.lastIndexOf("/");i=a,r=0;continue}}else if(n.length===2||n.length===1){n="",s=0,i=a,r=0;continue}}if(t){if(n.length>0)n+="/..";else n="..";s=2}}else{if(n.length>0)n+="/"+e.slice(i+1,a);else n=e.slice(i+1,a);s=a-i-1}i=a,r=0}else if(o===46&&r!==-1)++r;else r=-1}return n}function Wt(e,t){var n=t.dir||t.root,s=t.base||(t.name||"")+(t.ext||"");if(!n)return s;if(n===t.root)return n+s;return n+e+s}function X(){var e="",t=!1,n;for(var s=arguments.length-1;s>=-1&&!t;s--){var i;if(s>=0)i=arguments[s];else{if(n===void 0)n=process.cwd();i=n}if(F(i),i.length===0)continue;e=i+"/"+e,t=i.charCodeAt(0)===47}if(e=vt(e,!t),t)if(e.length>0)return"/"+e;else return"/";else if(e.length>0)return e;else return"."}function G(e){if(F(e),e.length===0)return".";var t=e.charCodeAt(0)===47,n=e.charCodeAt(e.length-1)===47;if(e=vt(e,!t),e.length===0&&!t)e=".";if(e.length>0&&n)e+="/";if(t)return"/"+e;return e}function $(e){return F(e),e.length>0&&e.charCodeAt(0)===47}function B(){if(arguments.length===0)return".";var e;for(var t=0;t<arguments.length;++t){var n=arguments[t];if(F(n),n.length>0)if(e===void 0)e=n;else e+="/"+n}if(e===void 0)return".";return G(e)}function ee(e,t){if(F(e),F(t),e===t)return"";if(e=X(e),t=X(t),e===t)return"";var n=1;for(;n<e.length;++n)if(e.charCodeAt(n)!==47)break;var s=e.length,i=s-n,r=1;for(;r<t.length;++r)if(t.charCodeAt(r)!==47)break;var o=t.length,a=o-r,c=i<a?i:a,m=-1,d=0;for(;d<=c;++d){if(d===c){if(a>c){if(t.charCodeAt(r+d)===47)return t.slice(r+d+1);else if(d===0)return t.slice(r+d)}else if(i>c){if(e.charCodeAt(n+d)===47)m=d;else if(d===0)m=0}break}var g=e.charCodeAt(n+d),v=t.charCodeAt(r+d);if(g!==v)break;else if(g===47)m=d}var l="";for(d=n+m+1;d<=s;++d)if(d===s||e.charCodeAt(d)===47)if(l.length===0)l+="..";else l+="/..";if(l.length>0)return l+t.slice(r+m);else{if(r+=m,t.charCodeAt(r)===47)++r;return t.slice(r)}}function Qt(e){return e}function q(e){if(F(e),e.length===0)return".";var t=e.charCodeAt(0),n=t===47,s=-1,i=!0;for(var r=e.length-1;r>=1;--r)if(t=e.charCodeAt(r),t===47){if(!i){s=r;break}}else i=!1;if(s===-1)return n?"/":".";if(n&&s===1)return"//";return e.slice(0,s)}function Zt(e,t){if(t!==void 0&&typeof t!=="string")throw TypeError('"ext" argument must be a string');F(e);var n=0,s=-1,i=!0,r;if(t!==void 0&&t.length>0&&t.length<=e.length){if(t.length===e.length&&t===e)return"";var o=t.length-1,a=-1;for(r=e.length-1;r>=0;--r){var c=e.charCodeAt(r);if(c===47){if(!i){n=r+1;break}}else{if(a===-1)i=!1,a=r+1;if(o>=0)if(c===t.charCodeAt(o)){if(--o===-1)s=r}else o=-1,s=a}}if(n===s)s=a;else if(s===-1)s=e.length;return e.slice(n,s)}else{for(r=e.length-1;r>=0;--r)if(e.charCodeAt(r)===47){if(!i){n=r+1;break}}else if(s===-1)i=!1,s=r+1;if(s===-1)return"";return e.slice(n,s)}}function en(e){F(e);var t=-1,n=0,s=-1,i=!0,r=0;for(var o=e.length-1;o>=0;--o){var a=e.charCodeAt(o);if(a===47){if(!i){n=o+1;break}continue}if(s===-1)i=!1,s=o+1;if(a===46){if(t===-1)t=o;else if(r!==1)r=1}else if(t!==-1)r=-1}if(t===-1||s===-1||r===0||r===1&&t===s-1&&t===n+1)return"";return e.slice(t,s)}function tn(e){if(e===null||typeof e!=="object")throw TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return Wt("/",e)}function nn(e){F(e);var t={root:"",dir:"",base:"",ext:"",name:""};if(e.length===0)return t;var n=e.charCodeAt(0),s=n===47,i;if(s)t.root="/",i=1;else i=0;var r=-1,o=0,a=-1,c=!0,m=e.length-1,d=0;for(;m>=i;--m){if(n=e.charCodeAt(m),n===47){if(!c){o=m+1;break}continue}if(a===-1)c=!1,a=m+1;if(n===46){if(r===-1)r=m;else if(d!==1)d=1}else if(r!==-1)d=-1}if(r===-1||a===-1||d===0||d===1&&r===a-1&&r===o+1){if(a!==-1)if(o===0&&s)t.base=t.name=e.slice(1,a);else t.base=t.name=e.slice(o,a)}else{if(o===0&&s)t.name=e.slice(1,r),t.base=e.slice(1,a);else t.name=e.slice(o,r),t.base=e.slice(o,a);t.ext=e.slice(r,a)}if(o>0)t.dir=e.slice(0,o-1);else if(s)t.dir="/";return t}var rn="/",sn=":",De=((e)=>(e.posix=e,e))({resolve:X,normalize:G,isAbsolute:$,join:B,relative:ee,_makeLong:Qt,dirname:q,basename:Zt,extname:en,format:tn,parse:nn,sep:rn,delimiter:sn,win32:null,posix:null}),te=De;var T={BEGIN:"*** Begin Patch",END:"*** End Patch",ADD:"*** Add File: ",UPDATE:"*** Update File: ",DELETE:"*** Delete File: ",MOVE:"*** Move to: ",SECTION:"@@",END_FILE:"*** End of File"},yt=["%%bash","apply_patch","EOF","```"];class _ extends Error{constructor(e){super(e);this.name="DiffError"}}function N(e){let t={"‐":"-","‑":"-","‒":"-","–":"-","—":"-","−":"-","“":'"',"”":'"',"„":'"',"«":'"',"»":'"',"‘":"'","’":"'","‛":"'"," ":" "," ":" "};return e.normalize("NFC").replace(/./gu,(n)=>t[n]??n).replace(/\\`/g,"`").replace(/\\'/g,"'").replace(/\\"/g,'"')}class Pe{lines;currentFiles;patch={actions:{},warnings:[]};index=0;fuzz=0;currentPath;constructor(e,t){this.lines=e;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(e){if(!this.patch.warnings)this.patch.warnings=[];this.patch.warnings.push(e)}skipBeginSentinel(){if(this.lines[this.index]?.startsWith(T.BEGIN))this.index++}hasMoreLines(){return this.index<this.lines.length}isEndMarker(){return this.lines[this.index]?.startsWith(T.END)??!1}parseNextAction(){let e=this.lines[this.index];if(e?.startsWith(T.UPDATE)){this.parseUpdate(e.substring(T.UPDATE.length).trim());return}if(e?.startsWith(T.DELETE)){this.parseDelete(e.substring(T.DELETE.length).trim());return}if(e?.startsWith(T.ADD)){this.parseAdd(e.substring(T.ADD.length).trim());return}throw new _(`Unknown line while parsing: ${e}`)}checkDuplicate(e,t){if(e in this.patch.actions)throw new _(`Duplicate ${t} for file: ${e}`)}parseUpdate(e){this.checkDuplicate(e,"update"),this.currentPath=e,this.index++;let t=this.lines[this.index]?.startsWith(T.MOVE)?(this.lines[this.index++]??"").substring(T.MOVE.length).trim():void 0;if(!(e in this.currentFiles))throw new _(`Update File Error: Missing File: ${e}`);let n=this.currentFiles[e]??"",s=this.parseUpdateFile(n,e);s.movePath=t,this.patch.actions[e]=s,this.currentPath=void 0}parseUpdateFile(e,t){let n={type:"update",chunks:[]},s=e.split(`
57
+ `),i=0,r=[T.END,T.UPDATE,T.DELETE,T.ADD,T.END_FILE];while(!r.some((o)=>this.lines[this.index]?.startsWith(o.trim()))){let o=this.lines[this.index],a=o?.startsWith("@@ ")?o.substring(3):void 0;if(a!==void 0||(o==="@@"?o:void 0)!==void 0)this.index++;else if(i!==0)throw new _(`Invalid Line:
58
+ ${this.lines[this.index]}`);if(a?.trim()){let u=N(a.trim());for(let y=i;y<s.length;y++){let O=s[y];if(O&&(N(O)===u||N(O.trim())===u)){if(i=y+1,N(O.trim())===u&&N(O)!==u)this.fuzz++;break}}}let[m,d,g,v]=cn(this.lines,this.index),[l,h,E]=an(s,m,i,v);if(l===-1){let u=m.join(`
59
+ `);this.addWarning({path:this.currentPath||t,chunkIndex:n.chunks.length,message:`Could not find matching context (similarity: ${E.toFixed(2)}). Chunk skipped.`,context:u.length>200?`${u.substring(0,200)}...`:u}),this.index=g}else{this.fuzz+=h;for(let u of d)u.origIndex+=l,n.chunks.push(u);i=l+m.length,this.index=g}}return n}parseDelete(e){if(this.checkDuplicate(e,"delete"),!(e in this.currentFiles))throw new _(`Delete File Error: Missing File: ${e}`);this.patch.actions[e]={type:"delete",chunks:[]},this.index++}parseAdd(e){if(this.checkDuplicate(e,"add"),e in this.currentFiles)throw new _(`Add File Error: File already exists: ${e}`);this.index++;let t=[],n=[T.END,T.UPDATE,T.DELETE,T.ADD];while(this.hasMoreLines()&&!n.some((s)=>this.lines[this.index]?.startsWith(s.trim()))){let s=this.lines[this.index++];if(s===void 0)break;if(!s.startsWith("+"))throw new _(`Invalid Add File line (missing '+'): ${s}`);t.push(s.substring(1))}this.patch.actions[e]={type:"add",newFile:t.join(`
60
+ `),chunks:[]}}}function St(e,t){let n=e.length>t.length?e:t,s=e.length>t.length?t:e;if(n.length===0)return 1;let i=on(s,n);return(n.length-i)/n.length}function on(e,t){let n=t.length+1,s=e.length+1,i=Array(n*s).fill(0),r=(a,c)=>i[a*s+c]??0,o=(a,c,m)=>{i[a*s+c]=m};for(let a=0;a<=t.length;a++)o(a,0,a);for(let a=0;a<=e.length;a++)o(0,a,a);for(let a=1;a<=t.length;a++)for(let c=1;c<=e.length;c++)if(t[a-1]===e[c-1])o(a,c,r(a-1,c-1));else o(a,c,1+Math.min(r(a-1,c-1),r(a,c-1),r(a-1,c)));return r(t.length,e.length)}function an(e,t,n,s){if(t.length===0)return[n,0,1];let i=0,r=(o)=>{let a=N(t.join(`
61
+ `));for(let m=o;m<e.length;m++){let d=N(e.slice(m,m+t.length).join(`
62
+ `));if(d===a)return[m,0,1];let g=St(d,a);if(g>i)i=g}for(let m=o;m<e.length;m++){let d=N(e.slice(m,m+t.length).map((v)=>v.trimEnd()).join(`
63
+ `)),g=N(t.map((v)=>v.trimEnd()).join(`
64
+ `));if(d===g)return[m,1,1]}for(let m=o;m<e.length;m++){let d=N(e.slice(m,m+t.length).map((v)=>v.trim()).join(`
65
+ `)),g=N(t.map((v)=>v.trim()).join(`
66
+ `));if(d===g)return[m,100,1]}let c=0.66;for(let m=o;m<e.length;m++){let d=N(e.slice(m,m+t.length).join(`
67
+ `)),g=St(d,a);if(g>=c)return[m,1000,g];if(g>i)i=g}return[-1,0,i]};if(s){let[o,a,c]=r(e.length-t.length);if(o!==-1)return[o,a,c];return[o,a,c]=r(n),[o,a+1e4,c]}return r(n)}function cn(e,t){let n=t,s=[],i=[],r=[],o=[],a="keep",c=["@@",T.END,T.UPDATE,T.DELETE,T.ADD,T.END_FILE];while(n<e.length){let m=e[n];if(!m||c.some((v)=>m.startsWith(v.trim())))break;if(m==="***")break;if(m.startsWith("***"))throw new _(`Invalid line: ${m}`);n++;let d=a,g=m;if(g[0]==="+")a="add";else if(g[0]==="-")a="delete";else if(g[0]===" ")a="keep";else a="keep",g=` ${g}`;if(g=g.slice(1),a==="keep"&&d!==a){if(r.length||i.length)o.push({origIndex:s.length-i.length,delLines:i,insLines:r});i=[],r=[]}if(a==="delete")i.push(g),s.push(g);else if(a==="add")r.push(g);else s.push(g)}if(r.length||i.length)o.push({origIndex:s.length-i.length,delLines:i,insLines:r});if(n<e.length&&e[n]===T.END_FILE)return n++,[s,o,n,!0];return[s,o,n,!1]}function Le(e,t,n){let s=$(t),i=s?G(t):X(e,t);if(!n||s)return i;let r=ee(e,i);if(r.startsWith("..")||$(r))throw new _(`Path must stay within cwd: ${t}`);return i}function ht(e){let t=[],n=!1,s=!1,i=!1;for(let r=0;r<e.length;r++){let o=e[r];if(!n&&yt.some((c)=>o.startsWith(c)))continue;if(o.startsWith(T.BEGIN)){n=!0,s=!0,t.push(o);continue}if(o===T.END){n=!1,t.push(o);continue}let a=o.startsWith(T.ADD)||o.startsWith(T.UPDATE)||o.startsWith(T.DELETE)||o.startsWith(T.MOVE)||o.startsWith(T.SECTION)||o.startsWith("+")||o.startsWith("-")||o.startsWith(" ")||o==="***";if(a&&r!==e.length-1)i=!0;if(n||!s&&a||o===""&&i)t.push(o)}while(t.length>0&&t[t.length-1]==="")t.pop();return!s&&!i?e:t}function mn(e){let t=e.split(`
68
+ `).map((i)=>i.replace(/\r$/,""));t=ht(t);let n=t.length>0&&t[0].startsWith(T.BEGIN),s=t.length>0&&t[t.length-1]===T.END;if(!n&&!s)return[T.BEGIN,...t,T.END];if(n&&s)return t;throw new _("Invalid patch text - incomplete sentinels. Try breaking it into smaller patches.")}function dn(e,t){let n=ht(e.split(`
69
+ `)),s=[];for(let i of n)for(let r of t){if(!i.startsWith(r))continue;let o=i.substring(r.length).trim();if(!e.trim().endsWith(o))s.push(o);break}return s}function gn(e,t,n){if(t.length===0)return e;let s=e.split(`
70
+ `),i=[],r=0;for(let o of t){if(o.origIndex>s.length)throw new _(`${n}: chunk.origIndex ${o.origIndex} > lines.length ${s.length}`);if(r>o.origIndex)throw new _(`${n}: currentIndex ${r} > chunk.origIndex ${o.origIndex}`);i.push(...s.slice(r,o.origIndex)),i.push(...o.insLines),r=o.origIndex+o.delLines.length}return i.push(...s.slice(r)),i.join(`
71
+ `)}async function un(e,t,n,s){let i=dn(e,[T.UPDATE,T.DELETE]),r={};for(let o of i){let a=Le(t,o,s),c;try{c=await U.readFile(a,n)}catch{throw new _(`File not found: ${o}`)}r[o]=c.replace(/\r\n/g,`
72
+ `)}return r}function ln(e,t){let n={};for(let[s,i]of Object.entries(e.actions))switch(i.type){case"delete":n[s]={type:"delete",oldContent:t[s]};break;case"add":if(i.newFile===void 0)throw new _("ADD action without file content");n[s]={type:"add",newContent:i.newFile};break;case"update":n[s]={type:"update",oldContent:t[s],newContent:gn(t[s]??"",i.chunks,s),movePath:i.movePath};break}return n}async function pn(e,t,n,s){let i=[];for(let[r,o]of Object.entries(e)){let a=Le(t,r,s);switch(o.type){case"delete":await U.rm(a,{force:!0}),i.push(`${r}: [deleted]`);break;case"add":if(o.newContent===void 0)throw new _(`Cannot create ${r} with no content`);await U.mkdir(q(a),{recursive:!0}),await U.writeFile(a,o.newContent,{encoding:n}),i.push(r);break;case"update":{if(o.newContent===void 0)throw new _(`UPDATE change for ${r} has no new content`);if(o.movePath){let c=Le(t,o.movePath,s);await U.mkdir(q(c),{recursive:!0}),await U.writeFile(c,o.newContent,{encoding:n}),await U.rm(a,{force:!0}),i.push(`${r} -> ${o.movePath}`)}else await U.writeFile(a,o.newContent,{encoding:n}),i.push(r);break}}}return i}function pe(e={}){let{encoding:t="utf-8",restrictToCwd:n=!0}=e;return async(s,i,r)=>{let o=mn(s.input),a=await un(s.input,i,t,n),c=new Pe(o,a),{patch:m,fuzz:d}=c.parse(),g=ln(m,a),v=await pn(g,i,t,n),l=["Successfully applied patch to the following files:"];for(let h of v)l.push(h);if(d>0)l.push(`Note: Patch applied with fuzz factor ${d}`);if(m.warnings&&m.warnings.length>0)for(let h of m.warnings)l.push(`Warning (${h.path}): ${h.message}`);return l.join(`
73
+ `)}}var{spawn:Et}=(()=>({}));function fe(e={}){let{shell:t=process.platform==="win32"?"cmd.exe":"/bin/bash",timeoutMs:n=30000,maxOutputBytes:s=1e6,env:i={},combineOutput:r=!0}=e;return async(o,a,c)=>{return new Promise((m,d)=>{let g=process.platform==="win32"?["/c",o]:["-c",o],v=process.platform==="win32",l=Et(t,g,{cwd:a,env:{...process.env,...i},stdio:["pipe","pipe","pipe"],detached:!v}),h=l.pid,E="",u="",y=0,O=!1,R=!1,C=(A)=>{if(R)return;R=!0,d(A)},D=(A)=>{if(R)return;R=!0,m(A)},P=()=>{if(!h)return;if(v){Et("taskkill",["/pid",String(h),"/T","/F"],{stdio:"ignore",windowsHide:!0}).unref();return}try{process.kill(-h,"SIGKILL")}catch{l.kill("SIGKILL")}},b=setTimeout(()=>{O=!0,P(),C(Error(`Command timed out after ${n}ms`))},n),K=()=>{O=!0,P(),C(Error("Command was aborted"))};if(c.abortSignal)c.abortSignal.addEventListener("abort",K);l.stdout?.on("data",(A)=>{if(y+=A.length,y<=s)E+=A.toString()}),l.stderr?.on("data",(A)=>{if(y+=A.length,y<=s)u+=A.toString()}),l.on("close",(A)=>{if(clearTimeout(b),c.abortSignal)c.abortSignal.removeEventListener("abort",K);if(O)return;let H=r?E+(u?`
74
+ [stderr]
75
+ ${u}`:""):E;if(y>s)H+=`
76
+
77
+ [Output truncated: ${y} bytes total, showing first ${s} bytes]`;if(A!==0){let Re=u||`Command exited with code ${A}`;C(Error(Re))}else D(H)}),l.on("error",(A)=>{if(clearTimeout(b),c.abortSignal)c.abortSignal.removeEventListener("abort",K);C(Error(`Failed to execute command: ${A.message}`))})})}}var z=(()=>({}));function fn(e,t,n){let s=$(t),i=s?G(t):X(e,t);if(!n)return i;if(s)return i;let r=ee(e,i);if(r.startsWith("..")||$(r))throw Error(`Path must stay within cwd: ${t}`);return i}function Tn(e,t){if(t.length===0)return 0;return e.split(t).length-1}function vn(e,t,n){let s=e.split(`
78
+ `),i=t.split(`
79
+ `),r=Math.max(s.length,i.length),o=["```diff"],a=0;for(let c=0;c<r;c++){if(a>=n){o.push("... diff truncated ...");break}let m=s[c],d=i[c];if(m===d)continue;let g=c+1;if(m!==void 0)o.push(`-${g}: ${m}`),a++;if(d!==void 0&&a<n)o.push(`+${g}: ${d}`),a++}return o.push("```"),o.join(`
80
+ `)}async function Sn(e,t,n){return await z.mkdir(q(e),{recursive:!0}),await z.writeFile(e,t,{encoding:n}),`File created successfully at: ${e}`}async function yn(e,t,n,s,i){let r=await z.readFile(e,s),o=Tn(r,t);if(o===0)throw Error(`No replacement performed: text not found in ${e}.`);if(o>1)throw Error(`No replacement performed: multiple occurrences of text found in ${e}.`);let a=r.replace(t,n??"");await z.writeFile(e,a,{encoding:s});let c=vn(r,a,i);return`Edited ${e}
81
+ ${c}`}async function hn(e,t,n,s){let r=(await z.readFile(e,s)).split(`
82
+ `);if(t<0||t>r.length)throw Error(`Invalid line number: ${t}. Valid range: 0-${r.length}`);return r.splice(t,0,...n.split(`
83
+ `)),await z.writeFile(e,r.join(`
84
+ `),{encoding:s}),`Inserted content at line ${t} in ${e}.`}function Te(e={}){let{encoding:t="utf-8",restrictToCwd:n=!0,maxDiffLines:s=200}=e;return async(i,r,o)=>{let a=fn(r,i.path,n);switch(i.command){case"create":if(i.file_text===void 0)throw Error("Parameter `file_text` is required for command: create");return Sn(a,i.file_text,t);case"str_replace":if(i.old_str===void 0)throw Error("Parameter `old_str` is required for command: str_replace");return yn(a,i.old_str,i.new_str,t,s);case"insert":if(i.insert_line===void 0)throw Error("Parameter `insert_line` is required for insert command.");if(i.new_str===void 0)throw Error("Parameter `new_str` is required for insert command.");return hn(a,i.insert_line,i.new_str,t);default:throw Error(`Unrecognized command ${i.command}. Allowed commands are: create, str_replace, insert`)}}}var ve=(()=>({}));function Se(e={}){let{maxFileSizeBytes:t=1e7,encoding:n="utf-8",includeLineNumbers:s=!1}=e;return async(i,r)=>{let o=$(i)?G(i):X(process.cwd(),i),a=await ve.stat(o);if(!a.isFile())throw Error(`Path is not a file: ${o}`);if(a.size>t)throw Error(`File too large: ${a.size} bytes (max: ${t} bytes). Consider reading specific sections or using a different approach.`);let c=await ve.readFile(o,n);if(s){let m=c.split(`
85
+ `),d=String(m.length).length;return m.map((g,v)=>`${String(v+1).padStart(d," ")} | ${g}`).join(`
86
+ `)}return c}}var Rt=(()=>({}));var{spawn:En}=(()=>({}));var{readdir:An}=(()=>({}));var{isMainThread:Ct,parentPort:At,Worker:_n}=(()=>({}));var Cn=15000,In=new Set([".git","node_modules","dist","build",".next","coverage",".turbo",".cache","target","out"]),ke=new Map;function On(e,t){return te.relative(e,t).split(te.sep).join("/")}async function Rn(e){let n=(await new Promise((s,i)=>{let r=En("rg",["--files","--hidden","-g","!.git"],{cwd:e,stdio:["ignore","pipe","pipe"]}),o="",a="";r.stdout.on("data",(c)=>{o+=c.toString()}),r.stderr.on("data",(c)=>{a+=c.toString()}),r.on("error",i),r.on("close",(c)=>{if(c===0){s(o);return}i(Error(a||`rg exited with code ${c}`))})})).split(/\r?\n/).map((s)=>s.trim()).filter((s)=>s.length>0).map((s)=>s.replace(/\\/g,"/"));return new Set(n)}async function It(e,t,n){let s=await An(t,{withFileTypes:!0});for(let i of s){let r=te.join(t,i.name);if(i.isDirectory()){if(In.has(i.name))continue;await It(e,r,n);continue}if(i.isFile())n.add(On(e,r))}}async function bn(e){let t=new Set;return await It(e,e,t),t}async function we(e){try{return await Rn(e)}catch{return bn(e)}}function Nn(){if(Ct||!At)return;let e=At;e.on("message",(t)=>{if(t.type!=="index")return;we(t.cwd).then((n)=>{let s={type:"indexResult",requestId:t.requestId,files:Array.from(n)};e.postMessage(s)}).catch((n)=>{let s={type:"indexResult",requestId:t.requestId,error:n instanceof Error?n.message:"Failed to build file index"};e.postMessage(s)})})}class Ot{worker=new _n(new URL(import.meta.url));nextRequestId=0;pending=new Map;constructor(){this.worker.unref(),this.worker.on("message",(e)=>{if(e.type!=="indexResult")return;let t=this.pending.get(e.requestId);if(!t)return;if(this.pending.delete(e.requestId),e.error){t.reject(Error(e.error));return}t.resolve(e.files??[])}),this.worker.on("error",(e)=>{this.flushPending(e)}),this.worker.on("exit",(e)=>{if(e!==0)this.flushPending(Error(`File index worker exited with code ${e}`))})}requestIndex(e){let t=++this.nextRequestId,n=new Promise((i,r)=>{this.pending.set(t,{resolve:i,reject:r})}),s={type:"index",requestId:t,cwd:e};return this.worker.postMessage(s),n}flushPending(e){for(let[t,n]of this.pending.entries())n.reject(e),this.pending.delete(t)}}Nn();var _t=Ct?new Ot:null;async function Un(e){if(!_t)return we(e);try{let t=await _t.requestIndex(e);return new Set(t)}catch{return we(e)}}async function ye(e,t={}){let n=t.ttlMs??Cn,s=Date.now(),i=ke.get(e);if(i&&n>0&&s-i.lastBuiltAt<=n&&i.files.size>0)return i.files;if(i?.pending)return i.pending;let r=Un(e).then((o)=>{return ke.set(e,{files:o,lastBuiltAt:Date.now(),pending:null}),o});return ke.set(e,{files:i?.files??new Set,lastBuiltAt:i?.lastBuiltAt??0,pending:r}),r}var{stat:fs}=(()=>({}));var Mn=["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"],Dn=["node_modules",".git","dist","build",".next","coverage","__pycache__",".venv","venv",".cache",".turbo",".output","out","target","bin","obj"];function Pn(e,t,n,s){let i=e.split("/"),r=i[i.length-1]??"";if(i.length-1>s)return!1;for(let c=0;c<i.length-1;c++)if(t.has(i[c]??""))return!1;let a=De.extname(r).slice(1).toLowerCase();return n.has(a)||!a&&!r.startsWith(".")}function he(e={}){let{includeExtensions:t=Mn,excludeDirs:n=Dn,maxResults:s=100,contextLines:i=2,maxDepth:r=20}=e,o=new Set(n),a=new Set(t.map((c)=>c.toLowerCase()));return async(c,m,d)=>{let g;try{g=new RegExp(c,"gim")}catch(u){throw Error(`Invalid regex pattern: ${c}. ${u instanceof Error?u.message:""}`)}let v=[],l=0,h=await ye(m);for(let u of h){if(!Pn(u,o,a,r))continue;if(v.length>=s)break;l++;let y=B(m,u);try{let R=(await Rt.readFile(y,"utf-8")).split(`
87
+ `);for(let C=0;C<R.length;C++){let D=R[C];g.lastIndex=0;let P;while((P=g.exec(D))!==null){if(v.length>=s)break;let b=Math.max(0,C-i),K=Math.min(R.length-1,C+i),A=[];for(let H=b;H<=K;H++){let Re=H===C?">":" ";A.push(`${Re} ${H+1}: ${R[H]}`)}if(v.push({file:u,line:C+1,column:P.index+1,match:P[0],context:A}),P.index===g.lastIndex)g.lastIndex++}}}catch{}}if(v.length===0)return`No results found for pattern: ${c}
88
+ Searched ${l} files.`;let E=[`Found ${v.length} result${v.length===1?"":"s"} for pattern: ${c}`,`Searched ${l} files.`,""];for(let u of v)E.push(`${u.file}:${u.line}:${u.column}`),E.push(...u.context),E.push("");if(v.length>=s)E.push(`(Showing first ${s} results. Refine your search for more specific results.)`);return E.join(`
89
+ `)}}function Ln(e){return e.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(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#(\d+);/g,(t,n)=>String.fromCharCode(parseInt(n,10))).replace(/\s+/g," ").replace(/\n\s+/g,`
91
+ `).replace(/\n{3,}/g,`
92
+
93
+ `).trim()}function Ee(e={}){let{timeoutMs:t=30000,maxResponseBytes:n=5000000,userAgent:s="Mozilla/5.0 (compatible; AgentBot/1.0)",headers:i={},followRedirects:r=!0}=e;return async(o,a,c)=>{let m;try{m=new URL(o)}catch{throw Error(`Invalid URL: ${o}`)}if(!["http:","https:"].includes(m.protocol))throw Error(`Invalid protocol: ${m.protocol}. Only http and https are supported.`);let d=new AbortController,g=setTimeout(()=>d.abort(),t),v;if(c.abortSignal)v=()=>d.abort(),c.abortSignal.addEventListener("abort",v);try{let l=await fetch(o,{method:"GET",headers:{"User-Agent":s,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",...i},redirect:r?"follow":"manual",signal:d.signal});if(clearTimeout(g),!r&&l.status>=300&&l.status<400)return`Redirect to: ${l.headers.get("location")}`;if(!l.ok)throw Error(`HTTP ${l.status}: ${l.statusText}`);let h=l.headers.get("content-type")||"",E=l.body?.getReader();if(!E)throw Error("Failed to read response body");let u=[],y=0;while(!0){let{done:b,value:K}=await E.read();if(b)break;if(y+=K.length,y>n)throw E.cancel(),Error(`Response too large: exceeded ${n} bytes`);u.push(K)}let O=new Uint8Array(y),R=0;for(let b of u)O.set(b,R),R+=b.length;let C=new TextDecoder("utf-8").decode(O),D;if(h.includes("text/html")||h.includes("application/xhtml"))D=Ln(C);else if(h.includes("application/json"))try{let b=JSON.parse(C);D=JSON.stringify(b,null,2)}catch{D=C}else D=C;let P=[`URL: ${o}`,`Content-Type: ${h}`,`Size: ${y} bytes`,"","--- Content ---",D.slice(0,50000)];if(D.length>50000)P.push(`
94
+ [Content truncated: showing first 50000 of ${D.length} characters]`);return P.push("","--- Analysis Request ---",`Prompt: ${a}`),P.join(`
95
+ `)}catch(l){if(clearTimeout(g),l instanceof Error){if(l.name==="AbortError")throw Error(`Request timed out after ${t}ms`);throw l}throw Error(`Fetch failed: ${String(l)}`)}finally{if(c.abortSignal&&v)c.abortSignal.removeEventListener("abort",v)}}}function Ae(e={}){return{readFile:Se(e.fileRead),search:he(e.search),bash:fe(e.bash),webFetch:Ee(e.webFetch),applyPatch:pe(e.applyPatch),editor:Te(e.editor)}}var Fe={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 bt(e){if(e!=="yolo")return{};let t={enabled:!0,autoApprove:!0},n={"*":t};for(let s of se)n[s]=t;return n}function Nt(e,t){let n=Fe[e];return Q({...n,...t})}function kn(e={}){let{executorOptions:t={},executors:n,...s}=e,i={...Ae(t),...n??{}};return Q({...s,executors:i})}var{existsSync:Fn,readFileSync:Bn}=(()=>({}));var{existsSync:Zs,mkdirSync:ei}=(()=>({}));var Ut="cline_mcp_settings.json",wn=process?.env?.HOME||"~";function _e(){let e=process.env.CLINE_DATA_DIR?.trim();if(e)return e;return B(wn,".cline","data")}function Be(){let e=process.env.CLINE_TEAM_DATA_DIR?.trim();if(e)return e;return B(_e(),"teams")}function xe(){let e=process.env.CLINE_PROVIDER_SETTINGS_PATH?.trim();if(e)return e;return B(_e(),"settings","providers.json")}function Xe(){let e=process.env.CLINE_MCP_SETTINGS_PATH?.trim();if(e)return e;return B(_e(),"settings",Ut)}import{z as S}from"zod";var ne=S.record(S.string(),S.string()),Mt=S.record(S.string(),S.unknown()),xn=S.object({type:S.literal("stdio"),command:S.string().min(1),args:S.array(S.string()).optional(),cwd:S.string().min(1).optional(),env:ne.optional()}),Xn=S.object({type:S.literal("sse"),url:S.string().url(),headers:ne.optional()}),$n=S.object({type:S.literal("streamableHttp"),url:S.string().url(),headers:ne.optional()}),qn=S.discriminatedUnion("type",[xn,Xn,$n]),zn=S.object({transport:qn,disabled:S.boolean().optional(),metadata:Mt.optional()}),Kn=S.enum(["stdio","sse","http","streamableHttp"]).optional(),Dt=S.object({type:S.enum(["stdio","sse","streamableHttp"]).optional(),transportType:Kn,disabled:S.boolean().optional(),metadata:Mt.optional()});function $e(e){if(!e)return;if(e==="http")return"streamableHttp";return e}var Hn=Dt.extend({command:S.string().min(1),args:S.array(S.string()).optional(),cwd:S.string().min(1).optional(),env:ne.optional()}).superRefine((e,t)=>{let n=e.type??$e(e.transportType);if(n&&n!=="stdio")t.addIssue({code:S.ZodIssueCode.custom,message:'Expected type "stdio" for command-based MCP server',path:["type"]})}).transform((e)=>({transport:{type:"stdio",command:e.command,args:e.args,cwd:e.cwd,env:e.env},disabled:e.disabled,metadata:e.metadata})),Vn=Dt.extend({url:S.string().url(),headers:ne.optional()}).superRefine((e,t)=>{let n=e.type??$e(e.transportType)??"sse";if(n!=="sse"&&n!=="streamableHttp")t.addIssue({code:S.ZodIssueCode.custom,message:'Expected type "sse" or "streamableHttp" for URL-based MCP server',path:["type"]})}).transform((e)=>{if((e.type??$e(e.transportType)??"sse")==="streamableHttp")return{transport:{type:"streamableHttp",url:e.url,headers:e.headers},disabled:e.disabled,metadata:e.metadata};return{transport:{type:"sse",url:e.url,headers:e.headers},disabled:e.disabled,metadata:e.metadata}}),jn=S.union([zn,Hn,Vn]),Yn=S.object({mcpServers:S.record(S.string(),jn)}).strict();function Ce(){return Xe()}function qe(e={}){let t=e.filePath??Ce(),n=Bn(t,"utf8"),s;try{s=JSON.parse(n)}catch(r){let o=r instanceof Error?r.message:String(r);throw Error(`Failed to parse MCP settings JSON at "${t}": ${o}`)}let i=Yn.safeParse(s);if(!i.success){let r=i.error.issues.map((o)=>{let a=o.path.join(".");return a?`${a}: ${o.message}`:o.message}).join("; ");throw Error(`Invalid MCP settings at "${t}": ${r}`)}return i.data}function Pt(e={}){let t=e.filePath??Ce();return Fn(t)}function ze(e={}){let t=qe(e);return Object.entries(t.mcpServers).map(([n,s])=>({name:n,transport:s.transport,disabled:s.disabled,metadata:s.metadata}))}async function Lt(e,t={}){let n=ze(t);for(let s of n)await e.registerServer(s);return n}function M(){return Date.now()}function Gn(e){return e.map((t)=>({name:t.name,description:t.description,inputSchema:t.inputSchema}))}class Ke{toolsCacheTtlMs;clientFactory;servers=new Map;operationLocks=new Map;constructor(e){this.clientFactory=e.clientFactory,this.toolsCacheTtlMs=e.toolsCacheTtlMs??5000}async registerServer(e){await this.runExclusive(e.name,async()=>{let t=this.servers.get(e.name);if(!t){this.servers.set(e.name,{registration:{...e},status:"disconnected",updatedAt:M()});return}let n=JSON.stringify(t.registration.transport)!==JSON.stringify(e.transport);if(t.registration={...e},t.updatedAt=M(),n)await this.disconnectState(t),t.client=void 0,t.toolCache=void 0,t.toolCacheUpdatedAt=void 0})}async unregisterServer(e){await this.runExclusive(e,async()=>{let t=this.requireServer(e);await this.disconnectState(t),this.servers.delete(e)})}async connectServer(e){await this.runExclusive(e,async()=>{let t=this.requireServer(e);await this.connectState(t)})}async disconnectServer(e){await this.runExclusive(e,async()=>{let t=this.requireServer(e);await this.disconnectState(t)})}async setServerDisabled(e,t){await this.runExclusive(e,async()=>{let n=this.requireServer(e);if(n.registration={...n.registration,disabled:t},n.updatedAt=M(),t)await this.disconnectState(n)})}listServers(){return[...this.servers.values()].map((e)=>({name:e.registration.name,status:e.status,disabled:e.registration.disabled===!0,lastError:e.lastError,toolCount:e.toolCache?.length??0,updatedAt:e.updatedAt,metadata:e.registration.metadata})).sort((e,t)=>e.name.localeCompare(t.name))}async listTools(e){let t=this.requireServer(e),n=t.toolCacheUpdatedAt??0;if(t.toolCache&&M()-n<=this.toolsCacheTtlMs)return t.toolCache;return this.refreshTools(e)}async refreshTools(e){return this.runExclusive(e,async()=>{let t=this.requireServer(e),s=await(await this.ensureConnectedClient(t)).listTools(),i=Gn(s);return t.toolCache=i,t.toolCacheUpdatedAt=M(),t.updatedAt=M(),i})}async callTool(e){return this.runExclusive(e.serverName,async()=>{let t=this.requireServer(e.serverName),n=await this.ensureConnectedClient(t);return t.updatedAt=M(),n.callTool({name:e.toolName,arguments:e.arguments,context:e.context})})}async dispose(){let e=[...this.servers.keys()];for(let t of e)await this.unregisterServer(t)}async ensureConnectedClient(e){if(await this.connectState(e),!e.client)throw Error(`MCP server "${e.registration.name}" does not have an initialized client.`);return e.client}async connectState(e){if(e.registration.disabled)throw Error(`MCP server "${e.registration.name}" is disabled and cannot be connected.`);if(e.status==="connected"&&e.client)return;e.status="connecting",e.updatedAt=M();try{let t=e.client??await this.clientFactory(e.registration);await t.connect(),e.client=t,e.status="connected",e.lastError=void 0,e.updatedAt=M()}catch(t){throw e.status="disconnected",e.lastError=t instanceof Error?t.message:String(t),e.updatedAt=M(),t}}async disconnectState(e){if(!e.client){e.status="disconnected",e.updatedAt=M();return}try{await e.client.disconnect()}finally{e.status="disconnected",e.updatedAt=M()}}requireServer(e){let t=this.servers.get(e);if(!t)throw Error(`Unknown MCP server: ${e}`);return t}async runExclusive(e,t){let n=this.operationLocks.get(e)??Promise.resolve(),s,i=new Promise((o)=>{s=o}),r=n.catch(()=>{return}).then(()=>i);this.operationLocks.set(e,r),await n.catch(()=>{return});try{return await t()}finally{if(s?.(),this.operationLocks.get(e)===r)this.operationLocks.delete(e)}}}var{existsSync:Ft,mkdirSync:Jn,readFileSync:Wn,writeFileSync:Qn}=(()=>({}));import{providers as He}from"@clinebot/llms";import{z as J}from"zod";var kt=He.ProviderSettingsSchema,Ve=He.toProviderConfig,wt=J.object({settings:He.ProviderSettingsSchema,updatedAt:J.string().datetime(),tokenSource:J.enum(["manual","oauth","migration"]).default("manual")}),Ie=J.object({version:J.literal(1),lastUsedProvider:J.string().min(1).optional(),providers:J.record(J.string(),wt)});function Oe(){return{version:1,providers:{}}}function Zn(){return new Date().toISOString()}class Bt{filePath;constructor(e={}){this.filePath=e.filePath??xe()}getFilePath(){return this.filePath}read(){if(!Ft(this.filePath))return Oe();try{let e=Wn(this.filePath,"utf8"),t=JSON.parse(e),n=Ie.safeParse(t);if(n.success)return n.data}catch{}return Oe()}write(e){let t=Ie.parse(e),n=q(this.filePath);if(!Ft(n))Jn(n,{recursive:!0});Qn(this.filePath,`${JSON.stringify(t,null,2)}
96
+ `,"utf8")}saveProviderSettings(e,t={}){let n=kt.parse(e),s=this.read(),i=n.provider,r=t.setLastUsed!==!1,o=s.providers[i],a=t.tokenSource??o?.tokenSource??"manual",c={...s,providers:{...s.providers,[i]:{settings:n,updatedAt:Zn(),tokenSource:a}},lastUsedProvider:r?i:s.lastUsedProvider};return this.write(c),c}getProviderSettings(e){return this.read().providers[e]?.settings}getLastUsedProviderSettings(){let e=this.read(),t=e.lastUsedProvider;if(!t)return;return e.providers[t]?.settings}getProviderConfig(e){let t=this.getProviderSettings(e);if(!t)return;return Ve(t)}getLastUsedProviderConfig(){let e=this.getLastUsedProviderSettings();if(!e)return;return Ve(e)}}var{existsSync:tr,mkdirSync:nr}=(()=>({}));var{createRequire:er}=(()=>({}));function re(){return new Date().toISOString()}function je(e){let t=er(import.meta.url);if(typeof globalThis.Bun<"u"){let{Database:r}=t("bun:sqlite"),o=new r(e,{create:!0});return{prepare:(a)=>{let c=o.query(a);return{run:(...m)=>c.run(...m),get:(...m)=>c.get(...m),all:(...m)=>c.all(...m)}},exec:(a)=>o.exec(a)}}let s=["better","-sqlite3"].join("");return new(t(s))(e)}function rr(){return Be()}function Z(e){return e.toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")}function sr(e){return{...e,tasks:e.tasks.map((t)=>({...t,createdAt:new Date(t.createdAt),updatedAt:new Date(t.updatedAt)})),mailbox:e.mailbox.map((t)=>({...t,sentAt:new Date(t.sentAt),readAt:t.readAt?new Date(t.readAt):void 0})),missionLog:e.missionLog.map((t)=>({...t,ts:new Date(t.ts)})),runs:(e.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:(e.outcomes??[]).map((t)=>({...t,createdAt:new Date(t.createdAt),finalizedAt:t.finalizedAt?new Date(t.finalizedAt):void 0})),outcomeFragments:(e.outcomeFragments??[]).map((t)=>({...t,createdAt:new Date(t.createdAt),reviewedAt:t.reviewedAt?new Date(t.reviewedAt):void 0}))}}class Ye{teamDirPath;db;constructor(e={}){this.teamDirPath=e.teamDir??rr()}init(){this.getRawDb()}ensureTeamDir(){if(!tr(this.teamDirPath))nr(this.teamDirPath,{recursive:!0});return this.teamDirPath}dbPath(){return B(this.ensureTeamDir(),"teams.db")}getRawDb(){if(this.db)return this.db;let e=je(this.dbPath());return this.ensureSchema(e),this.db=e,e}ensureSchema(e){e.exec(`
97
+ CREATE TABLE IF NOT EXISTS team_events (
98
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
99
+ team_name TEXT NOT NULL,
100
+ ts TEXT NOT NULL,
101
+ event_type TEXT NOT NULL,
102
+ payload_json TEXT NOT NULL,
103
+ causation_id TEXT,
104
+ correlation_id TEXT
105
+ );
106
+ CREATE INDEX IF NOT EXISTS idx_team_events_name_ts
107
+ ON team_events(team_name, ts DESC);
108
+
109
+ CREATE TABLE IF NOT EXISTS team_runtime_snapshot (
110
+ team_name TEXT PRIMARY KEY,
111
+ state_json TEXT NOT NULL,
112
+ teammates_json TEXT NOT NULL,
113
+ updated_at TEXT NOT NULL
114
+ );
115
+
116
+ CREATE TABLE IF NOT EXISTS team_tasks (
117
+ team_name TEXT NOT NULL,
118
+ task_id TEXT NOT NULL,
119
+ title TEXT NOT NULL,
120
+ description TEXT NOT NULL,
121
+ status TEXT NOT NULL,
122
+ assignee TEXT,
123
+ depends_on_json TEXT NOT NULL,
124
+ summary TEXT,
125
+ version INTEGER NOT NULL DEFAULT 1,
126
+ updated_at TEXT NOT NULL,
127
+ PRIMARY KEY(team_name, task_id)
128
+ );
129
+
130
+ CREATE TABLE IF NOT EXISTS team_runs (
131
+ team_name TEXT NOT NULL,
132
+ run_id TEXT NOT NULL,
133
+ agent_id TEXT NOT NULL,
134
+ task_id TEXT,
135
+ status TEXT NOT NULL,
136
+ message TEXT NOT NULL,
137
+ started_at TEXT,
138
+ ended_at TEXT,
139
+ error TEXT,
140
+ lease_owner TEXT,
141
+ heartbeat_at TEXT,
142
+ version INTEGER NOT NULL DEFAULT 1,
143
+ PRIMARY KEY(team_name, run_id)
144
+ );
145
+ CREATE INDEX IF NOT EXISTS idx_team_runs_status
146
+ ON team_runs(team_name, status);
147
+
148
+ CREATE TABLE IF NOT EXISTS team_outcomes (
149
+ team_name TEXT NOT NULL,
150
+ outcome_id TEXT NOT NULL,
151
+ title TEXT NOT NULL,
152
+ status TEXT NOT NULL,
153
+ schema_json TEXT NOT NULL,
154
+ finalized_at TEXT,
155
+ version INTEGER NOT NULL DEFAULT 1,
156
+ PRIMARY KEY(team_name, outcome_id)
157
+ );
158
+
159
+ CREATE TABLE IF NOT EXISTS team_outcome_fragments (
160
+ team_name TEXT NOT NULL,
161
+ outcome_id TEXT NOT NULL,
162
+ fragment_id TEXT NOT NULL,
163
+ section TEXT NOT NULL,
164
+ source_agent_id TEXT NOT NULL,
165
+ source_run_id TEXT,
166
+ content TEXT NOT NULL,
167
+ status TEXT NOT NULL,
168
+ reviewed_by TEXT,
169
+ reviewed_at TEXT,
170
+ version INTEGER NOT NULL DEFAULT 1,
171
+ PRIMARY KEY(team_name, fragment_id)
172
+ );
173
+ `)}run(e,t=[]){return this.getRawDb().prepare(e).run(...t)}queryOne(e,t=[]){return this.getRawDb().prepare(e).get(...t)??void 0}queryAll(e,t=[]){return this.getRawDb().prepare(e).all(...t)}listTeamNames(){return this.queryAll("SELECT team_name FROM team_runtime_snapshot ORDER BY team_name ASC").map((e)=>e.team_name)}readState(e){let t=this.queryOne("SELECT team_name, state_json, teammates_json, updated_at FROM team_runtime_snapshot WHERE team_name = ?",[Z(e)]);if(!t)return;return sr(JSON.parse(t.state_json))}readHistory(e,t=200){return this.queryAll("SELECT event_type, payload_json, ts FROM team_events WHERE team_name = ? ORDER BY id DESC LIMIT ?",[Z(e),t]).map((n)=>({eventType:n.event_type,payload:JSON.parse(n.payload_json),ts:n.ts}))}loadRuntime(e){let t=Z(e),n=this.readState(t),s=this.queryOne("SELECT team_name, state_json, teammates_json, updated_at FROM team_runtime_snapshot WHERE team_name = ?",[t]),i=s?JSON.parse(s.teammates_json):[],r=this.markInProgressRunsInterrupted(t,"runtime_recovered");return{state:n,teammates:i,interruptedRunIds:r}}appendTeamEvent(e,t,n,s){this.run(`INSERT INTO team_events (team_name, ts, event_type, payload_json, causation_id, correlation_id)
174
+ VALUES (?, ?, ?, ?, NULL, ?)`,[Z(e),re(),t,JSON.stringify(n),s??null])}persistRuntime(e,t,n){let s=Z(e),i=re();this.run(`INSERT INTO team_runtime_snapshot (team_name, state_json, teammates_json, updated_at)
175
+ VALUES (?, ?, ?, ?)
176
+ ON CONFLICT(team_name) DO UPDATE SET
177
+ state_json = excluded.state_json,
178
+ teammates_json = excluded.teammates_json,
179
+ updated_at = excluded.updated_at`,[s,JSON.stringify(t),JSON.stringify(n),i]);for(let r of t.tasks)this.run(`INSERT INTO team_tasks (team_name, task_id, title, description, status, assignee, depends_on_json, summary, version, updated_at)
180
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1, ?)
181
+ ON CONFLICT(team_name, task_id) DO UPDATE SET
182
+ title = excluded.title,
183
+ description = excluded.description,
184
+ status = excluded.status,
185
+ assignee = excluded.assignee,
186
+ depends_on_json = excluded.depends_on_json,
187
+ summary = excluded.summary,
188
+ version = team_tasks.version + 1,
189
+ updated_at = excluded.updated_at`,[s,r.id,r.title,r.description,r.status,r.assignee??null,JSON.stringify(r.dependsOn??[]),r.summary??null,r.updatedAt.toISOString()]);for(let r 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)
190
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)
191
+ ON CONFLICT(team_name, run_id) DO UPDATE SET
192
+ agent_id = excluded.agent_id,
193
+ task_id = excluded.task_id,
194
+ status = excluded.status,
195
+ message = excluded.message,
196
+ started_at = excluded.started_at,
197
+ ended_at = excluded.ended_at,
198
+ error = excluded.error,
199
+ lease_owner = excluded.lease_owner,
200
+ heartbeat_at = excluded.heartbeat_at,
201
+ version = team_runs.version + 1`,[s,r.id,r.agentId,r.taskId??null,r.status,r.message,r.startedAt?r.startedAt.toISOString():null,r.endedAt?r.endedAt.toISOString():null,r.error??null,r.leaseOwner??null,r.heartbeatAt?r.heartbeatAt.toISOString():null]);for(let r of t.outcomes??[])this.run(`INSERT INTO team_outcomes (team_name, outcome_id, title, status, schema_json, finalized_at, version)
202
+ VALUES (?, ?, ?, ?, ?, ?, 1)
203
+ ON CONFLICT(team_name, outcome_id) DO UPDATE SET
204
+ title = excluded.title,
205
+ status = excluded.status,
206
+ schema_json = excluded.schema_json,
207
+ finalized_at = excluded.finalized_at,
208
+ version = team_outcomes.version + 1`,[s,r.id,r.title,r.status,JSON.stringify({requiredSections:r.requiredSections}),r.finalizedAt?r.finalizedAt.toISOString():null]);for(let r 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)
209
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)
210
+ ON CONFLICT(team_name, fragment_id) DO UPDATE SET
211
+ outcome_id = excluded.outcome_id,
212
+ section = excluded.section,
213
+ source_agent_id = excluded.source_agent_id,
214
+ source_run_id = excluded.source_run_id,
215
+ content = excluded.content,
216
+ status = excluded.status,
217
+ reviewed_by = excluded.reviewed_by,
218
+ reviewed_at = excluded.reviewed_at,
219
+ version = team_outcome_fragments.version + 1`,[s,r.outcomeId,r.id,r.section,r.sourceAgentId,r.sourceRunId??null,r.content,r.status,r.reviewedBy??null,r.reviewedAt?r.reviewedAt.toISOString():null])}markInProgressRunsInterrupted(e,t){let n=Z(e),s=this.queryAll("SELECT run_id FROM team_runs WHERE team_name = ? AND status IN ('queued', 'running')",[n]);if(s.length===0)return[];let i=re();return this.run(`UPDATE team_runs SET status = 'interrupted', error = ?, ended_at = ?, version = version + 1
220
+ WHERE team_name = ? AND status IN ('queued', 'running')`,[t,i,n]),s.map((r)=>r.run_id)}handleTeamEvent(e,t){this.appendTeamEvent(e,t.type,t)}}function x(){return new Date().toISOString()}function xt(e,t){if(t<=0)return 0;return Math.round(e/t*100)}function ir(e,t){let n=new Set;for(let i of t)if(i.status==="reviewed")n.add(`${i.outcomeId}:${i.section}`);let s=new Set;for(let i of e){if(i.status==="finalized")continue;for(let r of i.requiredSections)if(!n.has(`${i.id}:${r}`))s.add(`${i.id}:${r}`)}return[...s].sort((i,r)=>i.localeCompare(r))}function Xt(e,t){let n={idle:0,running:0,stopped:0},s={pending:0,in_progress:0,blocked:0,completed:0},i={queued:0,running:0,completed:0,failed:0,cancelled:0,interrupted:0},r={draft:0,in_review:0,finalized:0},o={draft:0,reviewed:0,rejected:0},a=0,c=0;for(let u of t.members)if(n[u.status]+=1,u.role==="lead")a+=1;else c+=1;let m=[],d=[],g=t.tasks.filter((u)=>u.status==="completed").length,v=new Map(t.tasks.map((u)=>[u.id,u]));for(let u of t.tasks){if(s[u.status]+=1,u.status==="blocked"){m.push(u.id);continue}if(u.status!=="pending")continue;if(u.dependsOn.every((O)=>{return v.get(O)?.status==="completed"}))d.push(u.id)}let l=[],h,E=0;for(let u of t.runs){if(i[u.status]+=1,u.status==="queued"||u.status==="running")l.push(u.id);let y=u.startedAt.getTime();if(y>=E)E=y,h=u.id}for(let u of t.outcomes)r[u.status]+=1;for(let u of t.outcomeFragments)o[u.status]+=1;return{teamName:e,updatedAt:x(),members:{total:t.members.length,byStatus:n,leadCount:a,teammateCount:c},tasks:{total:t.tasks.length,byStatus:s,blockedTaskIds:m,readyTaskIds:d,completionPct:xt(g,t.tasks.length)},runs:{total:t.runs.length,byStatus:i,activeRunIds:l,latestRunId:h},outcomes:{total:t.outcomes.length,byStatus:r,finalizedPct:xt(r.finalized,t.outcomes.length),missingRequiredSections:ir(t.outcomes,t.outcomeFragments)},fragments:{total:t.outcomeFragments.length,byStatus:o}}}function $t(e){let{event:t}=e;switch(t.type){case"team_task_updated":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:x(),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:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:x(),runId:t.run.id,taskId:t.run.taskId,agentId:t.run.agentId,message:t.run.error};case"run_progress":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:x(),runId:t.run.id,taskId:t.run.taskId,agentId:t.run.agentId,message:t.message};case"outcome_created":case"outcome_finalized":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:x(),outcomeId:t.outcome.id};case"outcome_fragment_attached":case"outcome_fragment_reviewed":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:x(),outcomeId:t.fragment.outcomeId,fragmentId:t.fragment.id,agentId:t.fragment.sourceAgentId};case"team_message":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:x(),taskId:t.message.taskId,agentId:t.message.fromAgentId,message:t.message.subject};case"team_mission_log":return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:x(),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:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:x(),agentId:t.agentId}}return{teamName:e.teamName,sessionId:e.sessionId,eventType:t.type,ts:x()}}var or=Ue,qt;((o)=>{o.CLI="cli";o.CLI_SUBAGENT="cli-subagent";o.CORE="core";o.CORE_SUBAGENT="core-subagent";o.DESKTOP="desktop";o.DESKTOP_CHAT="desktop-chat"})(qt||={});export{$t as toTeamProgressLifecycleEvent,ze as resolveMcpServerRegistrations,Ce as resolveDefaultMcpSettingsPath,Lt as registerMcpServersFromSettingsFile,qe as loadMcpSettingsFile,Ge as isRpcClineAccountActionRequest,Pt as hasMcpSettingsFile,Je as executeRpcClineAccountAction,Oe as emptyStoredProviderSettings,bt as createToolPoliciesWithPreset,Nt as createDefaultToolsWithPreset,Q as createDefaultTools,Ae as createDefaultExecutors,kn as createBuiltinTools,Xt as buildTeamProgressSummary,Fe as ToolPresets,Ie as StoredProviderSettingsSchema,wt as StoredProviderSettingsEntrySchema,Ye as SqliteTeamStore,qt as SessionSource,or as SESSION_STATUSES,Ne as RpcClineAccountService,Bt as ProviderSettingsManager,Ke as InMemoryMcpManager,w as DefaultToolNames,be as ClineAccountService,zt as ChatViewStateSchema,tt as ChatSummarySchema,Qe as ChatSessionStatusSchema,We as ChatSessionConfigSchema,et as ChatMessageSchema,Ze as ChatMessageRoleSchema,se as ALL_DEFAULT_TOOL_NAMES};
@@ -0,0 +1,5 @@
1
+ export interface FastFileIndexOptions {
2
+ ttlMs?: number;
3
+ }
4
+ export declare function getFileIndex(cwd: string, options?: FastFileIndexOptions): Promise<Set<string>>;
5
+ export declare function prewarmFileIndex(cwd: string, options?: FastFileIndexOptions): Promise<void>;
@@ -0,0 +1,4 @@
1
+ export type { FastFileIndexOptions } from "./file-indexer";
2
+ export { getFileIndex, prewarmFileIndex } from "./file-indexer";
3
+ export type { MentionEnricherOptions, MentionEnrichmentResult, } from "./mention-enricher";
4
+ export { enrichPromptWithMentions } from "./mention-enricher";
@@ -0,0 +1,12 @@
1
+ import { type FastFileIndexOptions } from "./file-indexer";
2
+ export interface MentionEnricherOptions extends FastFileIndexOptions {
3
+ maxFiles?: number;
4
+ maxFileBytes?: number;
5
+ maxTotalBytes?: number;
6
+ }
7
+ export interface MentionEnrichmentResult {
8
+ prompt: string;
9
+ matchedFiles: string[];
10
+ ignoredMentions: string[];
11
+ }
12
+ export declare function enrichPromptWithMentions(input: string, cwd: string, options?: MentionEnricherOptions): Promise<MentionEnrichmentResult>;
@@ -0,0 +1,15 @@
1
+ import type { McpManager, McpServerRegistration } from "./types";
2
+ export interface McpSettingsFile {
3
+ mcpServers: Record<string, Omit<McpServerRegistration, "name">>;
4
+ }
5
+ export interface LoadMcpSettingsOptions {
6
+ filePath?: string;
7
+ }
8
+ export interface RegisterMcpServersFromSettingsOptions {
9
+ filePath?: string;
10
+ }
11
+ export declare function resolveDefaultMcpSettingsPath(): string;
12
+ export declare function loadMcpSettingsFile(options?: LoadMcpSettingsOptions): McpSettingsFile;
13
+ export declare function hasMcpSettingsFile(options?: LoadMcpSettingsOptions): boolean;
14
+ export declare function resolveMcpServerRegistrations(options?: LoadMcpSettingsOptions): McpServerRegistration[];
15
+ export declare function registerMcpServersFromSettingsFile(manager: Pick<McpManager, "registerServer">, options?: RegisterMcpServersFromSettingsOptions): Promise<McpServerRegistration[]>;
@@ -0,0 +1,4 @@
1
+ export type { LoadMcpSettingsOptions, McpSettingsFile, RegisterMcpServersFromSettingsOptions, } from "./config-loader";
2
+ export { hasMcpSettingsFile, loadMcpSettingsFile, registerMcpServersFromSettingsFile, resolveDefaultMcpSettingsPath, resolveMcpServerRegistrations, } from "./config-loader";
3
+ export { InMemoryMcpManager } from "./manager";
4
+ export type { McpConnectionStatus, McpManager, McpManagerOptions, McpServerClient, McpServerClientFactory, McpServerRegistration, McpServerSnapshot, McpServerTransportConfig, McpSseTransportConfig, McpStdioTransportConfig, McpStreamableHttpTransportConfig, } from "./types";
@@ -0,0 +1,24 @@
1
+ import type { McpToolCallRequest, McpToolCallResult, McpToolDescriptor } from "@clinebot/agents";
2
+ import type { McpManager, McpManagerOptions, McpServerRegistration, McpServerSnapshot } from "./types";
3
+ export declare class InMemoryMcpManager implements McpManager {
4
+ private readonly toolsCacheTtlMs;
5
+ private readonly clientFactory;
6
+ private readonly servers;
7
+ private readonly operationLocks;
8
+ constructor(options: McpManagerOptions);
9
+ registerServer(registration: McpServerRegistration): Promise<void>;
10
+ unregisterServer(serverName: string): Promise<void>;
11
+ connectServer(serverName: string): Promise<void>;
12
+ disconnectServer(serverName: string): Promise<void>;
13
+ setServerDisabled(serverName: string, disabled: boolean): Promise<void>;
14
+ listServers(): readonly McpServerSnapshot[];
15
+ listTools(serverName: string): Promise<readonly McpToolDescriptor[]>;
16
+ refreshTools(serverName: string): Promise<readonly McpToolDescriptor[]>;
17
+ callTool(request: McpToolCallRequest): Promise<McpToolCallResult>;
18
+ dispose(): Promise<void>;
19
+ private ensureConnectedClient;
20
+ private connectState;
21
+ private disconnectState;
22
+ private requireServer;
23
+ private runExclusive;
24
+ }
@@ -0,0 +1,66 @@
1
+ import type { McpToolCallRequest, McpToolCallResult, McpToolDescriptor, McpToolProvider, ToolContext } from "@clinebot/agents";
2
+ export type McpConnectionStatus = "disconnected" | "connecting" | "connected";
3
+ export interface McpStdioTransportConfig {
4
+ type: "stdio";
5
+ command: string;
6
+ args?: string[];
7
+ cwd?: string;
8
+ env?: Record<string, string>;
9
+ }
10
+ export interface McpSseTransportConfig {
11
+ type: "sse";
12
+ url: string;
13
+ headers?: Record<string, string>;
14
+ }
15
+ export interface McpStreamableHttpTransportConfig {
16
+ type: "streamableHttp";
17
+ url: string;
18
+ headers?: Record<string, string>;
19
+ }
20
+ export type McpServerTransportConfig = McpStdioTransportConfig | McpSseTransportConfig | McpStreamableHttpTransportConfig;
21
+ export interface McpServerRegistration {
22
+ name: string;
23
+ transport: McpServerTransportConfig;
24
+ disabled?: boolean;
25
+ metadata?: Record<string, unknown>;
26
+ }
27
+ export interface McpServerSnapshot {
28
+ name: string;
29
+ status: McpConnectionStatus;
30
+ disabled: boolean;
31
+ lastError?: string;
32
+ toolCount: number;
33
+ updatedAt: number;
34
+ metadata?: Record<string, unknown>;
35
+ }
36
+ export interface McpServerClient {
37
+ connect(): Promise<void>;
38
+ disconnect(): Promise<void>;
39
+ listTools(): Promise<readonly McpToolDescriptor[]>;
40
+ callTool(request: {
41
+ name: string;
42
+ arguments?: Record<string, unknown>;
43
+ context?: ToolContext;
44
+ }): Promise<McpToolCallResult>;
45
+ }
46
+ export type McpServerClientFactory = (registration: McpServerRegistration) => Promise<McpServerClient> | McpServerClient;
47
+ export interface McpManagerOptions {
48
+ clientFactory: McpServerClientFactory;
49
+ /**
50
+ * Cache TTL for tools/list responses.
51
+ * A short cache avoids repeated list requests while keeping server metadata fresh.
52
+ * @default 5000
53
+ */
54
+ toolsCacheTtlMs?: number;
55
+ }
56
+ export interface McpManager extends McpToolProvider {
57
+ registerServer(registration: McpServerRegistration): Promise<void>;
58
+ unregisterServer(serverName: string): Promise<void>;
59
+ connectServer(serverName: string): Promise<void>;
60
+ disconnectServer(serverName: string): Promise<void>;
61
+ setServerDisabled(serverName: string, disabled: boolean): Promise<void>;
62
+ listServers(): readonly McpServerSnapshot[];
63
+ refreshTools(serverName: string): Promise<readonly McpToolDescriptor[]>;
64
+ callTool(request: McpToolCallRequest): Promise<McpToolCallResult>;
65
+ dispose(): Promise<void>;
66
+ }
@@ -0,0 +1,18 @@
1
+ import type { AgentHooks } from "@clinebot/agents";
2
+ import type { BasicLogger } from "@clinebot/shared";
3
+ type HookRuntimeOptions = {
4
+ cwd: string;
5
+ workspacePath: string;
6
+ hookLogPath?: string;
7
+ rootSessionId?: string;
8
+ logger?: BasicLogger;
9
+ toolCallTimeoutMs?: number;
10
+ };
11
+ export declare function createHookAuditHooks(options: {
12
+ hookLogPath: string;
13
+ rootSessionId?: string;
14
+ workspacePath: string;
15
+ }): AgentHooks;
16
+ export declare function createHookConfigFileHooks(options: HookRuntimeOptions): AgentHooks | undefined;
17
+ export declare function mergeAgentHooks(layers: Array<AgentHooks | undefined>): AgentHooks | undefined;
18
+ export {};
@@ -0,0 +1,5 @@
1
+ import type { RuleConfig, UserInstructionConfigWatcher } from "../agents";
2
+ export declare function isRuleEnabled(rule: RuleConfig): boolean;
3
+ export declare function formatRulesForSystemPrompt(rules: ReadonlyArray<RuleConfig>): string;
4
+ export declare function listEnabledRulesFromWatcher(watcher: UserInstructionConfigWatcher): RuleConfig[];
5
+ export declare function loadRulesForSystemPromptFromWatcher(watcher: UserInstructionConfigWatcher): string;
@@ -0,0 +1,5 @@
1
+ import type { RuntimeBuilder, RuntimeBuilderInput, BuiltRuntime as RuntimeEnvironment } from "./session-runtime";
2
+ export declare function createTeamName(): string;
3
+ export declare class DefaultRuntimeBuilder implements RuntimeBuilder {
4
+ build(input: RuntimeBuilderInput): RuntimeEnvironment;
5
+ }
@@ -0,0 +1,19 @@
1
+ export interface SubprocessSandboxOptions {
2
+ bootstrapScript: string;
3
+ name?: string;
4
+ }
5
+ export interface SandboxCallOptions {
6
+ timeoutMs?: number;
7
+ }
8
+ export declare class SubprocessSandbox {
9
+ private readonly options;
10
+ private process;
11
+ private requestCounter;
12
+ private readonly pending;
13
+ constructor(options: SubprocessSandboxOptions);
14
+ start(): void;
15
+ call<TResult = unknown>(method: string, args: unknown, options?: SandboxCallOptions): Promise<TResult>;
16
+ shutdown(): Promise<void>;
17
+ private onMessage;
18
+ private failPending;
19
+ }
@@ -0,0 +1,36 @@
1
+ import type { AgentConfig, AgentHooks, AgentResult, AgentTeamsRuntime, Tool } from "@clinebot/agents";
2
+ import type { BasicLogger } from "@clinebot/shared";
3
+ import type { UserInstructionConfigWatcher } from "../agents";
4
+ import type { ToolExecutors } from "../default-tools";
5
+ import type { CoreSessionConfig } from "../types/config";
6
+ export interface BuiltRuntime {
7
+ tools: Tool[];
8
+ hooks?: AgentHooks;
9
+ logger?: BasicLogger;
10
+ teamRuntime?: AgentTeamsRuntime;
11
+ completionGuard?: () => string | undefined;
12
+ shutdown: (reason: string) => Promise<void> | void;
13
+ }
14
+ export interface RuntimeBuilderInput {
15
+ config: CoreSessionConfig;
16
+ hooks?: AgentHooks;
17
+ extensions?: AgentConfig["extensions"];
18
+ onTeamEvent?: (event: import("@clinebot/agents").TeamEvent) => void;
19
+ createSpawnTool?: () => Tool;
20
+ onTeamRestored?: () => void;
21
+ userInstructionWatcher?: UserInstructionConfigWatcher;
22
+ defaultToolExecutors?: Partial<ToolExecutors>;
23
+ logger?: BasicLogger;
24
+ }
25
+ export interface RuntimeBuilder {
26
+ build(input: RuntimeBuilderInput): BuiltRuntime;
27
+ }
28
+ export interface SessionRuntime {
29
+ start(config: CoreSessionConfig): Promise<{
30
+ sessionId: string;
31
+ }>;
32
+ send(sessionId: string, prompt: string): Promise<AgentResult | undefined>;
33
+ abort(sessionId: string): Promise<void>;
34
+ stop(sessionId: string): Promise<void>;
35
+ poll(): Promise<string[]>;
36
+ }
@@ -0,0 +1,9 @@
1
+ import type { ToolApprovalRequest, ToolApprovalResult } from "@clinebot/agents";
2
+ export type DesktopToolApprovalOptions = {
3
+ approvalDir?: string;
4
+ sessionId?: string;
5
+ timeoutMs?: number;
6
+ pollIntervalMs?: number;
7
+ nowIso?: () => string;
8
+ };
9
+ export declare function requestDesktopToolApproval(request: ToolApprovalRequest, options?: DesktopToolApprovalOptions): Promise<ToolApprovalResult>;
@@ -0,0 +1,13 @@
1
+ import type { UserInstructionConfigWatcher } from "../agents";
2
+ export type AvailableWorkflow = {
3
+ id: string;
4
+ name: string;
5
+ instructions: string;
6
+ };
7
+ export declare function listAvailableWorkflowsFromWatcher(watcher: UserInstructionConfigWatcher): AvailableWorkflow[];
8
+ /**
9
+ * Expands a leading slash command (e.g. "/release") to workflow instructions.
10
+ * If the input starts with "/<workflow-name>", that prefix is replaced and the
11
+ * remaining input is preserved unchanged.
12
+ */
13
+ export declare function resolveWorkflowSlashCommandFromWatcher(input: string, watcher: UserInstructionConfigWatcher): string;