@clinebot/core 0.0.0 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +7 -7
  2. package/dist/default-tools/definitions.d.ts +1 -1
  3. package/dist/default-tools/executors/index.d.ts +1 -1
  4. package/dist/default-tools/index.d.ts +2 -1
  5. package/dist/default-tools/model-tool-routing.d.ts +33 -0
  6. package/dist/default-tools/schemas.d.ts +13 -7
  7. package/dist/index.browser.d.ts +1 -0
  8. package/dist/index.browser.js +220 -0
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.js +47 -47
  11. package/dist/index.node.d.ts +36 -0
  12. package/dist/index.node.js +622 -0
  13. package/dist/providers/local-provider-service.d.ts +37 -0
  14. package/dist/session/default-session-manager.d.ts +3 -1
  15. package/dist/session/session-host.d.ts +2 -2
  16. package/dist/session/session-manager.d.ts +8 -0
  17. package/dist/session/unified-session-persistence-service.d.ts +1 -1
  18. package/dist/session/utils/helpers.d.ts +11 -0
  19. package/dist/session/utils/types.d.ts +42 -0
  20. package/dist/session/utils/usage.d.ts +9 -0
  21. package/dist/storage/provider-settings-manager.d.ts +2 -0
  22. package/dist/types/config.d.ts +8 -1
  23. package/dist/types.d.ts +1 -1
  24. package/package.json +11 -32
  25. package/src/default-tools/definitions.test.ts +130 -1
  26. package/src/default-tools/definitions.ts +7 -3
  27. package/src/default-tools/executors/editor.ts +10 -9
  28. package/src/default-tools/executors/file-read.test.ts +1 -1
  29. package/src/default-tools/executors/file-read.ts +11 -6
  30. package/src/default-tools/executors/index.ts +1 -1
  31. package/src/default-tools/index.ts +6 -1
  32. package/src/default-tools/model-tool-routing.test.ts +86 -0
  33. package/src/default-tools/model-tool-routing.ts +132 -0
  34. package/src/default-tools/schemas.ts +49 -52
  35. package/src/index.browser.ts +1 -0
  36. package/src/{server/index.ts → index.node.ts} +51 -109
  37. package/src/index.ts +41 -2
  38. package/src/input/file-indexer.ts +28 -2
  39. package/src/providers/local-provider-service.ts +591 -0
  40. package/src/runtime/runtime-builder.test.ts +69 -0
  41. package/src/runtime/runtime-builder.ts +20 -0
  42. package/src/runtime/runtime-parity.test.ts +20 -9
  43. package/src/session/default-session-manager.e2e.test.ts +11 -1
  44. package/src/session/default-session-manager.test.ts +270 -0
  45. package/src/session/default-session-manager.ts +109 -191
  46. package/src/session/index.ts +7 -2
  47. package/src/session/session-host.ts +30 -18
  48. package/src/session/session-manager.ts +11 -0
  49. package/src/session/unified-session-persistence-service.ts +11 -5
  50. package/src/session/utils/helpers.ts +148 -0
  51. package/src/session/utils/types.ts +46 -0
  52. package/src/session/utils/usage.ts +32 -0
  53. package/src/storage/provider-settings-legacy-migration.test.ts +3 -3
  54. package/src/storage/provider-settings-manager.test.ts +34 -0
  55. package/src/storage/provider-settings-manager.ts +22 -1
  56. package/src/types/config.ts +13 -0
  57. package/src/types.ts +1 -0
  58. package/dist/server/index.d.ts +0 -47
  59. package/dist/server/index.js +0 -641
package/README.md CHANGED
@@ -10,7 +10,7 @@ session lifecycle into a host-ready runtime.
10
10
  - provider settings and account services
11
11
  - default runtime tools and MCP integration
12
12
  - storage-backed session and team state helpers
13
- - host-facing Node helpers through `@clinebot/core/server`
13
+ - host-facing Node helpers through `@clinebot/core/node`
14
14
 
15
15
  ## Installation
16
16
 
@@ -20,15 +20,15 @@ npm install @clinebot/core
20
20
 
21
21
  ## Entry Points
22
22
 
23
- - `@clinebot/core`: runtime-agnostic core contracts and shared utilities
24
- - `@clinebot/core/server`: Node/server helpers for building hosts and runtimes
23
+ - `@clinebot/core`: core contracts, shared utilities, and RPC helper re-exports (`RpcSessionClient`, `getRpcServerHealth`, runtime bridge helpers)
24
+ - `@clinebot/core/node`: Node/server helpers for building hosts and runtimes
25
25
 
26
26
  ## Typical Usage
27
27
 
28
- Most host apps should start with `@clinebot/core/server`.
28
+ Most host apps should start with `@clinebot/core/node`.
29
29
 
30
30
  ```ts
31
- import { createSessionHost } from "@clinebot/core/server";
31
+ import { createSessionHost } from "@clinebot/core/node";
32
32
 
33
33
  const host = await createSessionHost({});
34
34
 
@@ -53,7 +53,7 @@ await host.dispose();
53
53
 
54
54
  ### Runtime and Sessions
55
55
 
56
- Use `@clinebot/core/server` for host-facing runtime assembly:
56
+ Use `@clinebot/core/node` for host-facing runtime assembly:
57
57
 
58
58
  - `createSessionHost(...)`
59
59
  - `DefaultSessionManager`
@@ -73,7 +73,7 @@ The package also exports storage and settings helpers such as:
73
73
 
74
74
  - `ProviderSettingsManager`
75
75
  - `SqliteTeamStore`
76
- - SQLite RPC session backend helpers from `@clinebot/core/server`
76
+ - SQLite RPC session backend helpers from `@clinebot/core/node`
77
77
 
78
78
  ## Related Packages
79
79
 
@@ -64,7 +64,7 @@ export declare function createAskQuestionTool(executor: AskQuestionExecutor, con
64
64
  * @example
65
65
  * ```typescript
66
66
  * import { Agent } from "@clinebot/agents"
67
- * import { createDefaultTools } from "@clinebot/core/server"
67
+ * import { createDefaultTools } from "@clinebot/core/node"
68
68
  * import * as fs from "fs/promises"
69
69
  * import { exec } from "child_process"
70
70
  *
@@ -28,7 +28,7 @@ export interface DefaultExecutorsOptions {
28
28
  *
29
29
  * @example
30
30
  * ```typescript
31
- * import { createDefaultTools, createDefaultExecutors } from "@clinebot/core/server"
31
+ * import { createDefaultTools, createDefaultExecutors } from "@clinebot/core/node"
32
32
  *
33
33
  * const executors = createDefaultExecutors({
34
34
  * bash: { timeoutMs: 60000 },
@@ -7,6 +7,7 @@ export { validateWithZod, zodToJsonSchema } from "@clinebot/shared";
7
7
  export { ALL_DEFAULT_TOOL_NAMES, DefaultToolNames } from "./constants.js";
8
8
  export { createApplyPatchTool, createAskQuestionTool, createBashTool, createDefaultTools, createEditorTool, createReadFilesTool, createSearchTool, createSkillsTool, createWebFetchTool, } from "./definitions.js";
9
9
  export { type ApplyPatchExecutorOptions, type BashExecutorOptions, createApplyPatchExecutor, createBashExecutor, createDefaultExecutors, createEditorExecutor, createFileReadExecutor, createSearchExecutor, createWebFetchExecutor, type DefaultExecutorsOptions, type EditorExecutorOptions, type FileReadExecutorOptions, type SearchExecutorOptions, type WebFetchExecutorOptions, } from "./executors/index.js";
10
+ export { DEFAULT_MODEL_TOOL_ROUTING_RULES, resolveToolRoutingConfig, type ToolRoutingRule, } from "./model-tool-routing.js";
10
11
  export { createDefaultToolsWithPreset, createToolPoliciesWithPreset, type ToolPolicyPresetName, type ToolPresetName, ToolPresets, } from "./presets.js";
11
12
  export { type ApplyPatchInput, ApplyPatchInputSchema, type AskQuestionInput, AskQuestionInputSchema, type EditFileInput, EditFileInputSchema, type FetchWebContentInput, FetchWebContentInputSchema, type ReadFilesInput, ReadFilesInputSchema, type RunCommandsInput, RunCommandsInputSchema, type SearchCodebaseInput, SearchCodebaseInputSchema, type SkillsInput, SkillsInputSchema, type WebFetchRequest, WebFetchRequestSchema, } from "./schemas.js";
12
13
  export type { ApplyPatchExecutor, AskQuestionExecutor, BashExecutor, CreateDefaultToolsOptions, DefaultToolName, DefaultToolsConfig, EditorExecutor, FileReadExecutor, SearchExecutor, SkillsExecutor, SkillsExecutorSkillMetadata, SkillsExecutorWithMetadata, ToolExecutors, ToolOperationResult, WebFetchExecutor, } from "./types.js";
@@ -35,7 +36,7 @@ export interface CreateBuiltinToolsOptions extends Omit<CreateDefaultToolsOption
35
36
  * @example
36
37
  * ```typescript
37
38
  * import { Agent } from "@clinebot/agents"
38
- * import { createBuiltinTools } from "@clinebot/core/server"
39
+ * import { createBuiltinTools } from "@clinebot/core/node"
39
40
  *
40
41
  * const tools = createBuiltinTools({
41
42
  * cwd: "/path/to/project",
@@ -0,0 +1,33 @@
1
+ import type { CoreAgentMode } from "../types/config";
2
+ import type { DefaultToolName, DefaultToolsConfig } from "./types.js";
3
+ export interface ToolRoutingRule {
4
+ /**
5
+ * Optional rule label for debugging and logs.
6
+ */
7
+ name?: string;
8
+ /**
9
+ * Which mode the rule applies to.
10
+ * @default "any"
11
+ */
12
+ mode?: CoreAgentMode | "any";
13
+ /**
14
+ * Case-insensitive substrings that must match the model ID.
15
+ * When omitted/empty, the rule is not constrained by model ID.
16
+ */
17
+ modelIdIncludes?: string[];
18
+ /**
19
+ * Case-insensitive substrings that must match the provider ID.
20
+ * When omitted/empty, the rule is not constrained by provider ID.
21
+ */
22
+ providerIdIncludes?: string[];
23
+ /**
24
+ * Enable these tools when the rule matches.
25
+ */
26
+ enableTools?: DefaultToolName[];
27
+ /**
28
+ * Disable these tools when the rule matches.
29
+ */
30
+ disableTools?: DefaultToolName[];
31
+ }
32
+ export declare const DEFAULT_MODEL_TOOL_ROUTING_RULES: ToolRoutingRule[];
33
+ export declare function resolveToolRoutingConfig(providerId: string, modelId: string, mode: CoreAgentMode, rules: ToolRoutingRule[] | undefined): Partial<DefaultToolsConfig>;
@@ -11,6 +11,9 @@ import { z } from "zod";
11
11
  export declare const ReadFilesInputSchema: z.ZodObject<{
12
12
  file_paths: z.ZodArray<z.ZodString>;
13
13
  }, z.core.$strip>;
14
+ /**
15
+ * Union schema for read_files tool input, allowing either a single string, an array of strings, or the full object schema
16
+ */
14
17
  export declare const ReadFilesInputUnionSchema: z.ZodUnion<readonly [z.ZodObject<{
15
18
  file_paths: z.ZodArray<z.ZodString>;
16
19
  }, z.core.$strip>, z.ZodArray<z.ZodString>, z.ZodString]>;
@@ -26,6 +29,9 @@ export declare const SearchCodebaseInputSchema: z.ZodObject<{
26
29
  export declare const RunCommandsInputSchema: z.ZodObject<{
27
30
  commands: z.ZodArray<z.ZodString>;
28
31
  }, z.core.$strip>;
32
+ /**
33
+ * Union schema for run_commands tool input. More flexible.
34
+ */
29
35
  export declare const RunCommandsInputUnionSchema: z.ZodUnion<readonly [z.ZodObject<{
30
36
  commands: z.ZodArray<z.ZodString>;
31
37
  }, z.core.$strip>, z.ZodArray<z.ZodString>, z.ZodString]>;
@@ -33,7 +39,7 @@ export declare const RunCommandsInputUnionSchema: z.ZodUnion<readonly [z.ZodObje
33
39
  * Schema for a single web fetch request
34
40
  */
35
41
  export declare const WebFetchRequestSchema: z.ZodObject<{
36
- url: z.ZodURL;
42
+ url: z.ZodString;
37
43
  prompt: z.ZodString;
38
44
  }, z.core.$strip>;
39
45
  /**
@@ -41,7 +47,7 @@ export declare const WebFetchRequestSchema: z.ZodObject<{
41
47
  */
42
48
  export declare const FetchWebContentInputSchema: z.ZodObject<{
43
49
  requests: z.ZodArray<z.ZodObject<{
44
- url: z.ZodURL;
50
+ url: z.ZodString;
45
51
  prompt: z.ZodString;
46
52
  }, z.core.$strip>>;
47
53
  }, z.core.$strip>;
@@ -55,10 +61,10 @@ export declare const EditFileInputSchema: z.ZodObject<{
55
61
  insert: "insert";
56
62
  }>;
57
63
  path: z.ZodString;
58
- file_text: z.ZodOptional<z.ZodString>;
59
- old_str: z.ZodOptional<z.ZodString>;
60
- new_str: z.ZodOptional<z.ZodString>;
61
- insert_line: z.ZodOptional<z.ZodNumber>;
64
+ file_text: z.ZodOptional<z.ZodNullable<z.ZodString>>;
65
+ old_str: z.ZodOptional<z.ZodNullable<z.ZodString>>;
66
+ new_str: z.ZodOptional<z.ZodNullable<z.ZodString>>;
67
+ insert_line: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
62
68
  }, z.core.$strip>;
63
69
  /**
64
70
  * Schema for apply_patch tool input
@@ -74,7 +80,7 @@ export declare const ApplyPatchInputUnionSchema: z.ZodUnion<readonly [z.ZodObjec
74
80
  */
75
81
  export declare const SkillsInputSchema: z.ZodObject<{
76
82
  skill: z.ZodString;
77
- args: z.ZodOptional<z.ZodString>;
83
+ args: z.ZodOptional<z.ZodNullable<z.ZodString>>;
78
84
  }, z.core.$strip>;
79
85
  /**
80
86
  * Schema for ask_followup_question tool input
@@ -0,0 +1 @@
1
+ export * from "./index";
@@ -0,0 +1,220 @@
1
+ import{z as J}from"zod";var ee=J.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"]),mt=J.object({adapter:J.string(),botUserName:J.string().optional(),event:ee,payload:J.record(J.string(),J.unknown()),ts:J.string()});var te=[{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 ut(n){return Object.fromEntries(te.flatMap((e)=>{let t=n==="modelsDevKey"?e.modelsDevKey:e.generatedProviderId;return t?[[e.modelsDevKey,t]]:[]}))}var ct=ut("generatedProviderId");import{z as M}from"zod";var gt=M.object({agentId:M.string(),conversationId:M.string(),iteration:M.number(),abortSignal:M.custom().optional(),metadata:M.record(M.string(),M.unknown()).optional()}),dt=M.object({id:M.string(),name:M.string(),input:M.unknown(),output:M.unknown(),error:M.string().optional(),durationMs:M.number(),startedAt:M.date(),endedAt:M.date()});import{z as re}from"zod";function X(n,e){let t=n.safeParse(e);if(!t.success)throw Error(re.prettifyError(t.error));return t.data}function $(n){return re.toJSONSchema(n)}function se(n){if(!n?.trim())return"";return ie(n,"user_input")}function ie(n,e){if(!n?.trim())return"";if(!e)return n;let t=new RegExp(`<${e}.*?>(.*?)</${e}>`,"g");return n.replace(t,"$1")}var oe="runtime.team.progress.v1",ae="runtime.team.lifecycle.v1";function Tt(n){let e=n?.trim();return e?e:void 0}function me(n){return Tt(n?.hookLogPath)}var kn=["running","completed","failed","cancelled"];var{existsSync:ce,mkdirSync:ge}=(()=>({}));function y(n){if(typeof n!=="string")throw TypeError("Path must be a string. Received "+JSON.stringify(n))}function ue(n,e){var t="",i=0,s=-1,r=0,o;for(var a=0;a<=n.length;++a){if(a<n.length)o=n.charCodeAt(a);else if(o===47)break;else o=47;if(o===47){if(s===a-1||r===1);else if(s!==a-1&&r===2){if(t.length<2||i!==2||t.charCodeAt(t.length-1)!==46||t.charCodeAt(t.length-2)!==46){if(t.length>2){var m=t.lastIndexOf("/");if(m!==t.length-1){if(m===-1)t="",i=0;else t=t.slice(0,m),i=t.length-1-t.lastIndexOf("/");s=a,r=0;continue}}else if(t.length===2||t.length===1){t="",i=0,s=a,r=0;continue}}if(e){if(t.length>0)t+="/..";else t="..";i=2}}else{if(t.length>0)t+="/"+n.slice(s+1,a);else t=n.slice(s+1,a);i=a-s-1}s=a,r=0}else if(o===46&&r!==-1)++r;else r=-1}return t}function ft(n,e){var t=e.dir||e.root,i=e.base||(e.name||"")+(e.ext||"");if(!t)return i;if(t===e.root)return t+i;return t+n+i}function K(){var n="",e=!1,t;for(var i=arguments.length-1;i>=-1&&!e;i--){var s;if(i>=0)s=arguments[i];else{if(t===void 0)t=process.cwd();s=t}if(y(s),s.length===0)continue;n=s+"/"+n,e=s.charCodeAt(0)===47}if(n=ue(n,!e),e)if(n.length>0)return"/"+n;else return"/";else if(n.length>0)return n;else return"."}function l(n){if(y(n),n.length===0)return".";var e=n.charCodeAt(0)===47,t=n.charCodeAt(n.length-1)===47;if(n=ue(n,!e),n.length===0&&!e)n=".";if(n.length>0&&t)n+="/";if(e)return"/"+n;return n}function x(n){return y(n),n.length>0&&n.charCodeAt(0)===47}function N(){if(arguments.length===0)return".";var n;for(var e=0;e<arguments.length;++e){var t=arguments[e];if(y(t),t.length>0)if(n===void 0)n=t;else n+="/"+t}if(n===void 0)return".";return l(n)}function rn(n,e){if(y(n),y(e),n===e)return"";if(n=K(n),e=K(e),n===e)return"";var t=1;for(;t<n.length;++t)if(n.charCodeAt(t)!==47)break;var i=n.length,s=i-t,r=1;for(;r<e.length;++r)if(e.charCodeAt(r)!==47)break;var o=e.length,a=o-r,m=s<a?s:a,u=-1,c=0;for(;c<=m;++c){if(c===m){if(a>m){if(e.charCodeAt(r+c)===47)return e.slice(r+c+1);else if(c===0)return e.slice(r+c)}else if(s>m){if(n.charCodeAt(t+c)===47)u=c;else if(c===0)u=0}break}var g=n.charCodeAt(t+c),f=e.charCodeAt(r+c);if(g!==f)break;else if(g===47)u=c}var T="";for(c=t+u+1;c<=i;++c)if(c===i||n.charCodeAt(c)===47)if(T.length===0)T+="..";else T+="/..";if(T.length>0)return T+e.slice(r+u);else{if(r+=u,e.charCodeAt(r)===47)++r;return e.slice(r)}}function pt(n){return n}function S(n){if(y(n),n.length===0)return".";var e=n.charCodeAt(0),t=e===47,i=-1,s=!0;for(var r=n.length-1;r>=1;--r)if(e=n.charCodeAt(r),e===47){if(!s){i=r;break}}else s=!1;if(i===-1)return t?"/":".";if(t&&i===1)return"//";return n.slice(0,i)}function mn(n,e){if(e!==void 0&&typeof e!=="string")throw TypeError('"ext" argument must be a string');y(n);var t=0,i=-1,s=!0,r;if(e!==void 0&&e.length>0&&e.length<=n.length){if(e.length===n.length&&e===n)return"";var o=e.length-1,a=-1;for(r=n.length-1;r>=0;--r){var m=n.charCodeAt(r);if(m===47){if(!s){t=r+1;break}}else{if(a===-1)s=!1,a=r+1;if(o>=0)if(m===e.charCodeAt(o)){if(--o===-1)i=r}else o=-1,i=a}}if(t===i)i=a;else if(i===-1)i=n.length;return n.slice(t,i)}else{for(r=n.length-1;r>=0;--r)if(n.charCodeAt(r)===47){if(!s){t=r+1;break}}else if(i===-1)s=!1,i=r+1;if(i===-1)return"";return n.slice(t,i)}}function At(n){y(n);var e=-1,t=0,i=-1,s=!0,r=0;for(var o=n.length-1;o>=0;--o){var a=n.charCodeAt(o);if(a===47){if(!s){t=o+1;break}continue}if(i===-1)s=!1,i=o+1;if(a===46){if(e===-1)e=o;else if(r!==1)r=1}else if(e!==-1)r=-1}if(e===-1||i===-1||r===0||r===1&&e===i-1&&e===t+1)return"";return n.slice(e,i)}function ht(n){if(n===null||typeof n!=="object")throw TypeError('The "pathObject" argument must be of type Object. Received type '+typeof n);return ft("/",n)}function _t(n){y(n);var e={root:"",dir:"",base:"",ext:"",name:""};if(n.length===0)return e;var t=n.charCodeAt(0),i=t===47,s;if(i)e.root="/",s=1;else s=0;var r=-1,o=0,a=-1,m=!0,u=n.length-1,c=0;for(;u>=s;--u){if(t=n.charCodeAt(u),t===47){if(!m){o=u+1;break}continue}if(a===-1)m=!1,a=u+1;if(t===46){if(r===-1)r=u;else if(c!==1)c=1}else if(r!==-1)c=-1}if(r===-1||a===-1||c===0||c===1&&r===a-1&&r===o+1){if(a!==-1)if(o===0&&i)e.base=e.name=n.slice(1,a);else e.base=e.name=n.slice(o,a)}else{if(o===0&&i)e.name=n.slice(1,r),e.base=n.slice(1,a);else e.name=n.slice(o,r),e.base=n.slice(o,a);e.ext=n.slice(r,a)}if(o>0)e.dir=n.slice(0,o-1);else if(i)e.dir="/";return e}var vt="/",Ct=":",Pn=((n)=>(n.posix=n,n))({resolve:K,normalize:l,isAbsolute:x,join:N,relative:rn,_makeLong:pt,dirname:S,basename:mn,extname:At,format:ht,parse:_t,sep:vt,delimiter:Ct,win32:null,posix:null}),sn=Pn;var de="cline_mcp_settings.json",wn=process?.env?.HOME||"~",Te=!1;function fe(n){let e=n.trim();if(!e)return;wn=e,Te=!0}function pe(n){if(Te)return;let e=n.trim();if(!e)return;wn=e}function H(){let n=process.env.CLINE_DATA_DIR?.trim();if(n)return n;return N(wn,".cline","data")}function Ae(){let n=process.env.CLINE_SESSION_DATA_DIR?.trim();if(n)return n;return N(H(),"sessions")}function Fn(){let n=process.env.CLINE_TEAM_DATA_DIR?.trim();if(n)return n;return N(H(),"teams")}function bn(){let n=process.env.CLINE_PROVIDER_SETTINGS_PATH?.trim();if(n)return n;return N(H(),"settings","providers.json")}function Bn(){let n=process.env.CLINE_MCP_SETTINGS_PATH?.trim();if(n)return n;return N(H(),"settings",de)}function Xn(n){let e=S(n);if(!ce(e))ge(e,{recursive:!0})}function he(n){if(n?.trim())return Xn(n),S(n);let e=N(H(),"hooks");if(!ce(e))ge(e,{recursive:!0});return e}class $n{apiBaseUrl;getAuthTokenFn;getCurrentUserIdFn;getOrganizationMemberIdFn;getHeadersFn;requestTimeoutMs;fetchImpl;constructor(n){let e=n.apiBaseUrl.trim();if(!e)throw Error("apiBaseUrl is required");this.apiBaseUrl=e,this.getAuthTokenFn=n.getAuthToken,this.getCurrentUserIdFn=n.getCurrentUserId,this.getOrganizationMemberIdFn=n.getOrganizationMemberId,this.getHeadersFn=n.getHeaders,this.requestTimeoutMs=n.requestTimeoutMs??30000,this.fetchImpl=n.fetchImpl??fetch}async fetchMe(){return this.request("/api/v1/users/me")}async fetchBalance(n){let e=await this.resolveUserId(n);return this.request(`/api/v1/users/${encodeURIComponent(e)}/balance`)}async fetchUsageTransactions(n){let e=await this.resolveUserId(n);return(await this.request(`/api/v1/users/${encodeURIComponent(e)}/usages`)).items??[]}async fetchPaymentTransactions(n){let e=await this.resolveUserId(n);return(await this.request(`/api/v1/users/${encodeURIComponent(e)}/payments`)).paymentTransactions??[]}async fetchUserOrganizations(){return(await this.fetchMe()).organizations??[]}async fetchOrganizationBalance(n){let e=n.trim();if(!e)throw Error("organizationId is required");return this.request(`/api/v1/organizations/${encodeURIComponent(e)}/balance`)}async fetchOrganizationUsageTransactions(n){let e=n.organizationId.trim();if(!e)throw Error("organizationId is required");let t=await this.resolveOrganizationMemberId(e,n.memberId);return(await this.request(`/api/v1/organizations/${encodeURIComponent(e)}/members/${encodeURIComponent(t)}/usages`)).items??[]}async switchAccount(n){await this.request("/api/v1/users/active-account",{method:"PUT",body:{organizationId:n?.trim()||null},expectNoContent:!0})}async resolveUserId(n){let e=n?.trim();if(e)return e;let i=(this.getCurrentUserIdFn?await this.getCurrentUserIdFn():void 0)?.trim();if(i)return i;let s=await this.fetchMe();if(!s.id?.trim())throw Error("Unable to resolve current user id");return s.id}async resolveOrganizationMemberId(n,e){let t=e?.trim();if(t)return t;let s=(this.getOrganizationMemberIdFn?await this.getOrganizationMemberIdFn(n):void 0)?.trim();if(s)return s;let o=(await this.fetchUserOrganizations()).find((a)=>a.organizationId===n)?.memberId;if(!o?.trim())throw Error(`Unable to resolve memberId for organization ${n}`);return o}async request(n,e){let t=(await this.getAuthTokenFn())?.trim();if(!t)throw Error("No Cline account auth token found");let i=this.getHeadersFn?await this.getHeadersFn():{},s=new AbortController,r=setTimeout(()=>s.abort(),this.requestTimeoutMs);try{let o=await this.fetchImpl(new URL(n,this.apiBaseUrl),{method:e?.method??"GET",headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json",...i??{}},body:e?.body!==void 0?JSON.stringify(e.body):void 0,signal:s.signal});if(o.status===204||e?.expectNoContent){if(!o.ok)throw Error(`Cline account request failed with status ${o.status}`);return}let a=await o.text(),m;if(a.trim())m=JSON.parse(a);if(!o.ok){let u=typeof m==="object"&&m!==null&&"error"in m?String(m.error):`Cline account request failed with status ${o.status}`;throw Error(u)}if(typeof m==="object"&&m!==null){let u=m;if(typeof u.success==="boolean"){if(!u.success)throw Error(u.error||"Cline account request failed");if(u.data!==void 0)return u.data}}if(m===void 0||m===null)throw Error("Cline account response payload was empty");return m}finally{clearTimeout(r)}}}function _e(n){return n.action==="clineAccount"}async function ve(n,e){switch(n.operation){case"fetchMe":return e.fetchMe();case"fetchBalance":return e.fetchBalance(n.userId);case"fetchUsageTransactions":return e.fetchUsageTransactions(n.userId);case"fetchPaymentTransactions":return e.fetchPaymentTransactions(n.userId);case"fetchUserOrganizations":return e.fetchUserOrganizations();case"fetchOrganizationBalance":return e.fetchOrganizationBalance(n.organizationId);case"fetchOrganizationUsageTransactions":return e.fetchOrganizationUsageTransactions({organizationId:n.organizationId,memberId:n.memberId});case"switchAccount":return await e.switchAccount(n.organizationId),{updated:!0};default:throw Error(`Unsupported Cline account operation: ${String(n)}`)}}class yn{executor;constructor(n){this.executor=n}async fetchMe(){return this.request({action:"clineAccount",operation:"fetchMe"})}async fetchBalance(n){return this.request({action:"clineAccount",operation:"fetchBalance",...n?.trim()?{userId:n.trim()}:{}})}async fetchUsageTransactions(n){return this.request({action:"clineAccount",operation:"fetchUsageTransactions",...n?.trim()?{userId:n.trim()}:{}})}async fetchPaymentTransactions(n){return this.request({action:"clineAccount",operation:"fetchPaymentTransactions",...n?.trim()?{userId:n.trim()}:{}})}async fetchUserOrganizations(){return this.request({action:"clineAccount",operation:"fetchUserOrganizations"})}async fetchOrganizationBalance(n){let e=n.trim();if(!e)throw Error("organizationId is required");return this.request({action:"clineAccount",operation:"fetchOrganizationBalance",organizationId:e})}async fetchOrganizationUsageTransactions(n){let e=n.organizationId.trim();if(!e)throw Error("organizationId is required");return this.request({action:"clineAccount",operation:"fetchOrganizationUsageTransactions",organizationId:e,...n.memberId?.trim()?{memberId:n.memberId.trim()}:{}})}async switchAccount(n){await this.request({action:"clineAccount",operation:"switchAccount",organizationId:n?.trim()||null})}async request(n){return(await this.executor.runProviderAction(n)).result}}import{z as p}from"zod";var Ce=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()}),Ee=p.enum(["idle","starting","running","stopping","completed","cancelled","failed","error"]),Re=p.enum(["user","assistant","tool","system","status","error"]),Oe=p.object({id:p.string().min(1),sessionId:p.string().nullable(),role:Re,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()}),Ie=p.object({toolCalls:p.number().int().nonnegative(),tokensIn:p.number().int().nonnegative(),tokensOut:p.number().int().nonnegative()}),Et=p.object({sessionId:p.string().nullable(),status:Ee,config:Ce,messages:p.array(Oe),rawTranscript:p.string(),error:p.string().nullable(),summary:Ie});var z={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"},cn=[z.READ_FILES,z.SEARCH_CODEBASE,z.RUN_COMMANDS,z.FETCH_WEB_CONTENT,z.APPLY_PATCH,z.EDITOR,z.SKILLS,z.ASK];import{createTool as W}from"@clinebot/agents";import{z as _}from"zod";var Rt=_.string().describe("The absolute file path of a text file to read content from"),gn=_.object({file_paths:_.array(Rt).describe("Array of absolute file paths to get full content from. Prefer this tool over running terminal command to get file content for better performance and reliability.")}),Ue=_.union([gn,_.array(_.string()),_.string()]),dn=_.object({queries:_.array(_.string()).describe("Array of regex search queries to execute")}),zn=_.string(),Tn=_.object({commands:_.array(zn).describe("Array of shell commands to execute.")}),Me=_.union([Tn,_.array(zn),zn]),De=_.object({url:_.string().describe("The URL to fetch"),prompt:_.string().min(2).describe("Analysis prompt for the fetched content")}),fn=_.object({requests:_.array(De).describe("Array of the URLs for the web fetch requests")}),pn=_.object({command:_.enum(["create","str_replace","insert"]).describe("Editor command to execute: create, str_replace, insert"),path:_.string().min(1).describe("Absolute file path"),file_text:_.string().nullish().describe("Full file content required for 'create' command"),old_str:_.string().nullish().describe("Exact text to replace (must match exactly once) for 'str_replace' command"),new_str:_.string().nullish().describe("Replacement text for 'str_replace' or 'insert' commands"),insert_line:_.number().int().nullish().describe("Optional one-based line index for 'insert' command")}).refine((n)=>n.command!=="create"||n.file_text!=null,{path:["file_text"],message:"file_text is required for command=create"}).refine((n)=>n.command!=="str_replace"||n.old_str!=null,{path:["old_str"],message:"old_str is required for command=str_replace"}).refine((n)=>n.command!=="insert"||n.insert_line!=null,{path:["insert_line"],message:"insert_line is required for command=insert"}).refine((n)=>n.command!=="insert"||n.new_str!=null,{path:["new_str"],message:"new_str is required for command=insert"}),An=_.object({input:_.string().min(1).describe("The apply_patch text payload, including patch instructions")}),Ne=_.union([An,_.string()]),hn=_.object({skill:_.string().min(1).describe('The skill name. E.g., "commit", "review-pr", "pdf", or "ms-office-suite:pdf"'),args:_.string().nullable().optional().describe("Arguments for the skill; use null when omitted")}),_n=_.object({question:_.string().min(1).describe('The single question to ask the user. E.g. "How can I help you?"'),options:_.array(_.string().min(1)).min(2).max(5).describe("Array of 2-5 user-selectable answer options for the single question")});function G(n){if(n instanceof Error)return n.message;return String(n)}function Q(n,e,t){return Promise.race([n,new Promise((i,s)=>{setTimeout(()=>s(Error(t)),e)})])}var Ot=`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 Le(n,e={}){let t=e.fileReadTimeoutMs??1e4;return W({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:$(gn),timeoutMs:t*2,retryable:!0,maxRetries:1,execute:async(i,s)=>{let r=X(Ue,i),o=Array.isArray(r)?r:typeof r==="object"?r.file_paths:[r];return Promise.all(o.map(async(a)=>{try{let m=await Q(n(a,s),t,`File read timed out after ${t}ms`);return{query:a,result:m,success:!0}}catch(m){let u=G(m);return{query:a,result:"",error:`Error reading file: ${u}`,success:!1}}}))}})}function Se(n,e={}){let t=e.searchTimeoutMs??30000,i=e.cwd??process.cwd();return W({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:$(dn),timeoutMs:t*2,retryable:!0,maxRetries:1,execute:async(s,r)=>{let o=X(dn,s);return Promise.all(o.queries.map(async(a)=>{try{let m=await Q(n(a,i,r),t,`Search timed out after ${t}ms`),u=m.length>0&&!m.includes("No results found");return{query:a,result:m,success:u}}catch(m){let u=G(m);return{query:a,result:"",error:`Search failed: ${u}`,success:!1}}}))}})}function ke(n,e={}){let t=e.bashTimeoutMs??30000,i=e.cwd??process.cwd();return W({name:"run_commands",description:"Run shell commands at the root of the project. Use for listing files, checking git status, running builds, executing tests, etc. Commands should be properly shell-escaped.",inputSchema:$(Tn),timeoutMs:t*2,retryable:!1,maxRetries:0,execute:async(s,r)=>{let o=X(Me,s),a=Array.isArray(o)?o:typeof o==="object"?o.commands:[o];return Promise.all(a.map(async(m)=>{try{let u=await Q(n(m,i,r),t,`Command timed out after ${t}ms`);return{query:m,result:u,success:!0}}catch(u){let c=G(u);return{query:m,result:"",error:`Command failed: ${c}`,success:!1}}}))}})}function Pe(n,e={}){let t=e.webFetchTimeoutMs??30000;return W({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:$(fn),timeoutMs:t*2,retryable:!0,maxRetries:2,execute:async(i,s)=>{let r=X(fn,i);return Promise.all(r.requests.map(async(o)=>{try{let a=await Q(n(o.url,o.prompt,s),t,`Web fetch timed out after ${t}ms`);return{query:o.url,result:a,success:!0}}catch(a){let m=G(a);return{query:o.url,result:"",error:`Error fetching web content: ${m}`,success:!1}}}))}})}function we(n,e={}){let t=e.applyPatchTimeoutMs??30000,i=e.cwd??process.cwd();return W({name:"apply_patch",description:Ot,inputSchema:$(An),timeoutMs:t,retryable:!1,maxRetries:0,execute:async(s,r)=>{let o=X(Ne,s),a=typeof o==="string"?o:o.input;try{return{query:"apply_patch",result:await Q(n({input:a},i,r),t,`apply_patch timed out after ${t}ms`),success:!0}}catch(m){return{query:"apply_patch",result:"",error:`apply_patch failed: ${G(m)}`,success:!1}}}})}function Fe(n,e={}){let t=e.editorTimeoutMs??30000,i=e.cwd??process.cwd();return W({name:"editor",description:"Edit file using absolute path with create, string replacement, and line insert operations. Supported commands: create, str_replace, insert.",inputSchema:$(pn),timeoutMs:t,retryable:!1,maxRetries:0,execute:async(s,r)=>{let o=X(pn,s);try{let a=await Q(n(o,i,r),t,`Editor operation timed out after ${t}ms`);return{query:`${o.command}:${o.path}`,result:a,success:!0}}catch(a){let m=G(a);return{query:`${o.command}:${o.path}`,result:"",error:`Editor operation failed: ${m}`,success:!1}}}})}function be(n,e={}){let t=e.skillsTimeoutMs??15000;return W({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:$(hn),timeoutMs:t,retryable:!1,maxRetries:0,execute:async(i,s)=>{let r=X(hn,i);return Q(n(r.skill,r.args||void 0,s),t,`Skills operation timed out after ${t}ms`)}})}function Be(n,e={}){let t=e.askQuestionTimeoutMs??15000;return W({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:$(_n),timeoutMs:t,retryable:!1,maxRetries:0,execute:async(i,s)=>{let r=X(_n,i);return Q(n(r.question,r.options,s),t,`ask_question timed out after ${t}ms`)}})}function nn(n){let{executors:e,enableReadFiles:t=!0,enableSearch:i=!0,enableBash:s=!0,enableWebFetch:r=!0,enableApplyPatch:o=!1,enableEditor:a=!0,enableSkills:m=!0,enableAskQuestion:u=!0,...c}=n,g=[];if(t&&e.readFile)g.push(Le(e.readFile,c));if(i&&e.search)g.push(Se(e.search,c));if(s&&e.bash)g.push(ke(e.bash,c));if(r&&e.webFetch)g.push(Pe(e.webFetch,c));if(a&&e.editor)g.push(Fe(e.editor,c));else if(o&&e.applyPatch)g.push(we(e.applyPatch,c));if(m&&e.skills)g.push(be(e.skills,c));if(u&&e.askQuestion)g.push(Be(e.askQuestion,c));return g}var w=(()=>({}));var h={BEGIN:"*** Begin Patch",END:"*** End Patch",ADD:"*** Add File: ",UPDATE:"*** Update File: ",DELETE:"*** Delete File: ",MOVE:"*** Move to: ",SECTION:"@@",END_FILE:"*** End of File"},$e=["%%bash","apply_patch","EOF","```"];class I extends Error{constructor(n){super(n);this.name="DiffError"}}function P(n){let e={"‐":"-","‑":"-","‒":"-","–":"-","—":"-","−":"-","“":'"',"”":'"',"„":'"',"«":'"',"»":'"',"‘":"'","’":"'","‛":"'"," ":" "," ":" "};return n.normalize("NFC").replace(/./gu,(t)=>e[t]??t).replace(/\\`/g,"`").replace(/\\'/g,"'").replace(/\\"/g,'"')}class qn{lines;currentFiles;patch={actions:{},warnings:[]};index=0;fuzz=0;currentPath;constructor(n,e){this.lines=n;this.currentFiles=e}parse(){this.skipBeginSentinel();while(this.hasMoreLines()&&!this.isEndMarker())this.parseNextAction();if(this.patch.warnings?.length===0)delete this.patch.warnings;return{patch:this.patch,fuzz:this.fuzz}}addWarning(n){if(!this.patch.warnings)this.patch.warnings=[];this.patch.warnings.push(n)}skipBeginSentinel(){if(this.lines[this.index]?.startsWith(h.BEGIN))this.index++}hasMoreLines(){return this.index<this.lines.length}isEndMarker(){return this.lines[this.index]?.startsWith(h.END)??!1}parseNextAction(){let n=this.lines[this.index];if(n?.startsWith(h.UPDATE)){this.parseUpdate(n.substring(h.UPDATE.length).trim());return}if(n?.startsWith(h.DELETE)){this.parseDelete(n.substring(h.DELETE.length).trim());return}if(n?.startsWith(h.ADD)){this.parseAdd(n.substring(h.ADD.length).trim());return}throw new I(`Unknown line while parsing: ${n}`)}checkDuplicate(n,e){if(n in this.patch.actions)throw new I(`Duplicate ${e} for file: ${n}`)}parseUpdate(n){this.checkDuplicate(n,"update"),this.currentPath=n,this.index++;let e=this.lines[this.index]?.startsWith(h.MOVE)?(this.lines[this.index++]??"").substring(h.MOVE.length).trim():void 0;if(!(n in this.currentFiles))throw new I(`Update File Error: Missing File: ${n}`);let t=this.currentFiles[n]??"",i=this.parseUpdateFile(t,n);i.movePath=e,this.patch.actions[n]=i,this.currentPath=void 0}parseUpdateFile(n,e){let t={type:"update",chunks:[]},i=n.split(`
57
+ `),s=0,r=[h.END,h.UPDATE,h.DELETE,h.ADD,h.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(s!==0)throw new I(`Invalid Line:
58
+ ${this.lines[this.index]}`);if(a?.trim()){let d=P(a.trim());for(let E=s;E<i.length;E++){let D=i[E];if(D&&(P(D)===d||P(D.trim())===d)){if(s=E+1,P(D.trim())===d&&P(D)!==d)this.fuzz++;break}}}let[u,c,g,f]=Mt(this.lines,this.index),[T,C,R]=Ut(i,u,s,f);if(T===-1){let d=u.join(`
59
+ `);this.addWarning({path:this.currentPath||e,chunkIndex:t.chunks.length,message:`Could not find matching context (similarity: ${R.toFixed(2)}). Chunk skipped.`,context:d.length>200?`${d.substring(0,200)}...`:d}),this.index=g}else{this.fuzz+=C;for(let d of c)d.origIndex+=T,t.chunks.push(d);s=T+u.length,this.index=g}}return t}parseDelete(n){if(this.checkDuplicate(n,"delete"),!(n in this.currentFiles))throw new I(`Delete File Error: Missing File: ${n}`);this.patch.actions[n]={type:"delete",chunks:[]},this.index++}parseAdd(n){if(this.checkDuplicate(n,"add"),n in this.currentFiles)throw new I(`Add File Error: File already exists: ${n}`);this.index++;let e=[],t=[h.END,h.UPDATE,h.DELETE,h.ADD];while(this.hasMoreLines()&&!t.some((i)=>this.lines[this.index]?.startsWith(i.trim()))){let i=this.lines[this.index++];if(i===void 0)break;if(!i.startsWith("+"))throw new I(`Invalid Add File line (missing '+'): ${i}`);e.push(i.substring(1))}this.patch.actions[n]={type:"add",newFile:e.join(`
60
+ `),chunks:[]}}}function Xe(n,e){let t=n.length>e.length?n:e,i=n.length>e.length?e:n;if(t.length===0)return 1;let s=It(i,t);return(t.length-s)/t.length}function It(n,e){let t=e.length+1,i=n.length+1,s=Array(t*i).fill(0),r=(a,m)=>s[a*i+m]??0,o=(a,m,u)=>{s[a*i+m]=u};for(let a=0;a<=e.length;a++)o(a,0,a);for(let a=0;a<=n.length;a++)o(0,a,a);for(let a=1;a<=e.length;a++)for(let m=1;m<=n.length;m++)if(e[a-1]===n[m-1])o(a,m,r(a-1,m-1));else o(a,m,1+Math.min(r(a-1,m-1),r(a,m-1),r(a-1,m)));return r(e.length,n.length)}function Ut(n,e,t,i){if(e.length===0)return[t,0,1];let s=0,r=(o)=>{let a=P(e.join(`
61
+ `));for(let u=o;u<n.length;u++){let c=P(n.slice(u,u+e.length).join(`
62
+ `));if(c===a)return[u,0,1];let g=Xe(c,a);if(g>s)s=g}for(let u=o;u<n.length;u++){let c=P(n.slice(u,u+e.length).map((f)=>f.trimEnd()).join(`
63
+ `)),g=P(e.map((f)=>f.trimEnd()).join(`
64
+ `));if(c===g)return[u,1,1]}for(let u=o;u<n.length;u++){let c=P(n.slice(u,u+e.length).map((f)=>f.trim()).join(`
65
+ `)),g=P(e.map((f)=>f.trim()).join(`
66
+ `));if(c===g)return[u,100,1]}let m=0.66;for(let u=o;u<n.length;u++){let c=P(n.slice(u,u+e.length).join(`
67
+ `)),g=Xe(c,a);if(g>=m)return[u,1000,g];if(g>s)s=g}return[-1,0,s]};if(i){let[o,a,m]=r(n.length-e.length);if(o!==-1)return[o,a,m];return[o,a,m]=r(t),[o,a+1e4,m]}return r(t)}function Mt(n,e){let t=e,i=[],s=[],r=[],o=[],a="keep",m=["@@",h.END,h.UPDATE,h.DELETE,h.ADD,h.END_FILE];while(t<n.length){let u=n[t];if(!u||m.some((f)=>u.startsWith(f.trim())))break;if(u==="***")break;if(u.startsWith("***"))throw new I(`Invalid line: ${u}`);t++;let c=a,g=u;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"&&c!==a){if(r.length||s.length)o.push({origIndex:i.length-s.length,delLines:s,insLines:r});s=[],r=[]}if(a==="delete")s.push(g),i.push(g);else if(a==="add")r.push(g);else i.push(g)}if(r.length||s.length)o.push({origIndex:i.length-s.length,delLines:s,insLines:r});if(t<n.length&&n[t]===h.END_FILE)return t++,[i,o,t,!0];return[i,o,t,!1]}function Kn(n,e,t){let i=x(e),s=i?l(e):K(n,e);if(!t||i)return s;let r=rn(n,s);if(r.startsWith("..")||x(r))throw new I(`Path must stay within cwd: ${e}`);return s}function ye(n){let e=[],t=!1,i=!1,s=!1;for(let r=0;r<n.length;r++){let o=n[r];if(!t&&$e.some((m)=>o.startsWith(m)))continue;if(o.startsWith(h.BEGIN)){t=!0,i=!0,e.push(o);continue}if(o===h.END){t=!1,e.push(o);continue}let a=o.startsWith(h.ADD)||o.startsWith(h.UPDATE)||o.startsWith(h.DELETE)||o.startsWith(h.MOVE)||o.startsWith(h.SECTION)||o.startsWith("+")||o.startsWith("-")||o.startsWith(" ")||o==="***";if(a&&r!==n.length-1)s=!0;if(t||!i&&a||o===""&&s)e.push(o)}while(e.length>0&&e[e.length-1]==="")e.pop();return!i&&!s?n:e}function Dt(n){let e=n.split(`
68
+ `).map((s)=>s.replace(/\r$/,""));e=ye(e);let t=e.length>0&&e[0].startsWith(h.BEGIN),i=e.length>0&&e[e.length-1]===h.END;if(!t&&!i)return[h.BEGIN,...e,h.END];if(t&&i)return e;throw new I("Invalid patch text - incomplete sentinels. Try breaking it into smaller patches.")}function Nt(n,e){let t=ye(n.split(`
69
+ `)),i=[];for(let s of t)for(let r of e){if(!s.startsWith(r))continue;let o=s.substring(r.length).trim();if(!n.trim().endsWith(o))i.push(o);break}return i}function Lt(n,e,t){if(e.length===0)return n;let i=n.split(`
70
+ `),s=[],r=0;for(let o of e){if(o.origIndex>i.length)throw new I(`${t}: chunk.origIndex ${o.origIndex} > lines.length ${i.length}`);if(r>o.origIndex)throw new I(`${t}: currentIndex ${r} > chunk.origIndex ${o.origIndex}`);s.push(...i.slice(r,o.origIndex)),s.push(...o.insLines),r=o.origIndex+o.delLines.length}return s.push(...i.slice(r)),s.join(`
71
+ `)}async function St(n,e,t,i){let s=Nt(n,[h.UPDATE,h.DELETE]),r={};for(let o of s){let a=Kn(e,o,i),m;try{m=await w.readFile(a,t)}catch{throw new I(`File not found: ${o}`)}r[o]=m.replace(/\r\n/g,`
72
+ `)}return r}function kt(n,e){let t={};for(let[i,s]of Object.entries(n.actions))switch(s.type){case"delete":t[i]={type:"delete",oldContent:e[i]};break;case"add":if(s.newFile===void 0)throw new I("ADD action without file content");t[i]={type:"add",newContent:s.newFile};break;case"update":t[i]={type:"update",oldContent:e[i],newContent:Lt(e[i]??"",s.chunks,i),movePath:s.movePath};break}return t}async function Pt(n,e,t,i){let s=[];for(let[r,o]of Object.entries(n)){let a=Kn(e,r,i);switch(o.type){case"delete":await w.rm(a,{force:!0}),s.push(`${r}: [deleted]`);break;case"add":if(o.newContent===void 0)throw new I(`Cannot create ${r} with no content`);await w.mkdir(S(a),{recursive:!0}),await w.writeFile(a,o.newContent,{encoding:t}),s.push(r);break;case"update":{if(o.newContent===void 0)throw new I(`UPDATE change for ${r} has no new content`);if(o.movePath){let m=Kn(e,o.movePath,i);await w.mkdir(S(m),{recursive:!0}),await w.writeFile(m,o.newContent,{encoding:t}),await w.rm(a,{force:!0}),s.push(`${r} -> ${o.movePath}`)}else await w.writeFile(a,o.newContent,{encoding:t}),s.push(r);break}}}return s}function vn(n={}){let{encoding:e="utf-8",restrictToCwd:t=!0}=n;return async(i,s,r)=>{let o=Dt(i.input),a=await St(i.input,s,e,t),m=new qn(o,a),{patch:u,fuzz:c}=m.parse(),g=kt(u,a),f=await Pt(g,s,e,t),T=["Successfully applied patch to the following files:"];for(let C of f)T.push(C);if(c>0)T.push(`Note: Patch applied with fuzz factor ${c}`);if(u.warnings&&u.warnings.length>0)for(let C of u.warnings)T.push(`Warning (${C.path}): ${C.message}`);return T.join(`
73
+ `)}}var{spawn:ze}=(()=>({}));function Cn(n={}){let{shell:e=process.platform==="win32"?"cmd.exe":"/bin/bash",timeoutMs:t=30000,maxOutputBytes:i=1e6,env:s={},combineOutput:r=!0}=n;return async(o,a,m)=>{return new Promise((u,c)=>{let g=process.platform==="win32"?["/c",o]:["-c",o],f=process.platform==="win32",T=ze(e,g,{cwd:a,env:{...process.env,...s},stdio:["pipe","pipe","pipe"],detached:!f}),C=T.pid,R="",d="",E=0,D=!1,L=!1,U=(O)=>{if(L)return;L=!0,c(O)},b=(O)=>{if(L)return;L=!0,u(O)},B=()=>{if(!C)return;if(f){ze("taskkill",["/pid",String(C),"/T","/F"],{stdio:"ignore",windowsHide:!0}).unref();return}try{process.kill(-C,"SIGKILL")}catch{T.kill("SIGKILL")}},k=setTimeout(()=>{D=!0,B(),U(Error(`Command timed out after ${t}ms`))},t),Y=()=>{D=!0,B(),U(Error("Command was aborted"))};if(m.abortSignal)m.abortSignal.addEventListener("abort",Y);T.stdout?.on("data",(O)=>{if(E+=O.length,E<=i)R+=O.toString()}),T.stderr?.on("data",(O)=>{if(E+=O.length,E<=i)d+=O.toString()}),T.on("close",(O)=>{if(clearTimeout(k),m.abortSignal)m.abortSignal.removeEventListener("abort",Y);if(D)return;let j=r?R+(d?`
74
+ [stderr]
75
+ ${d}`:""):R;if(E>i)j+=`
76
+
77
+ [Output truncated: ${E} bytes total, showing first ${i} bytes]`;if(O!==0){let Sn=d||`Command exited with code ${O}`;U(Error(Sn))}else b(j)}),T.on("error",(O)=>{if(clearTimeout(k),m.abortSignal)m.abortSignal.removeEventListener("abort",Y);U(Error(`Failed to execute command: ${O.message}`))})})}}var V=(()=>({}));function wt(n,e,t){let i=x(e),s=i?l(e):K(n,e);if(!t)return s;if(i)return s;let r=rn(n,s);if(r.startsWith("..")||x(r))throw Error(`Path must stay within cwd: ${e}`);return s}function Ft(n,e){if(e.length===0)return 0;return n.split(e).length-1}function bt(n,e,t){let i=n.split(`
78
+ `),s=e.split(`
79
+ `),r=Math.max(i.length,s.length),o=["```diff"],a=0;for(let m=0;m<r;m++){if(a>=t){o.push("... diff truncated ...");break}let u=i[m],c=s[m];if(u===c)continue;let g=m+1;if(u!==void 0)o.push(`-${g}: ${u}`),a++;if(c!==void 0&&a<t)o.push(`+${g}: ${c}`),a++}return o.push("```"),o.join(`
80
+ `)}async function Bt(n,e,t){return await V.mkdir(S(n),{recursive:!0}),await V.writeFile(n,e,{encoding:t}),`File created successfully at: ${n}`}async function Xt(n,e,t,i,s){let r=await V.readFile(n,i),o=Ft(r,e);if(o===0)throw Error(`No replacement performed: text not found in ${n}.`);if(o>1)throw Error(`No replacement performed: multiple occurrences of text found in ${n}.`);let a=r.replace(e,t??"");await V.writeFile(n,a,{encoding:i});let m=bt(r,a,s);return`Edited ${n}
81
+ ${m}`}async function $t(n,e,t,i){let r=(await V.readFile(n,i)).split(`
82
+ `),o=e-1;if(o<0||o>r.length)throw Error(`Invalid line number: ${e}. Valid range: 1-${r.length}`);return r.splice(o,0,...t.split(`
83
+ `)),await V.writeFile(n,r.join(`
84
+ `),{encoding:i}),`Inserted content at line ${e} in ${n}.`}function En(n={}){let{encoding:e="utf-8",restrictToCwd:t=!0,maxDiffLines:i=200}=n;return async(s,r,o)=>{let a=wt(r,s.path,t);switch(s.command){case"create":if(s.file_text==null)throw Error("Parameter `file_text` is required for command: create");return Bt(a,s.file_text,e);case"str_replace":if(s.old_str==null)throw Error("Parameter `old_str` is required for command: str_replace");return Xt(a,s.old_str,s.new_str,e,i);case"insert":if(s.insert_line==null)throw Error("Parameter `insert_line` is required for insert command.");if(s.new_str==null)throw Error("Parameter `new_str` is required for insert command.");return $t(a,s.insert_line,s.new_str,e);default:throw Error(`Unrecognized command ${s.command}. Allowed commands are: create, str_replace, insert`)}}}var Rn=(()=>({}));var yt={maxFileSizeBytes:1e7,encoding:"utf-8",includeLineNumbers:!0};function On(n={}){let{maxFileSizeBytes:e,encoding:t,includeLineNumbers:i}={...yt,...n};return async(s,r)=>{let o=x(s)?l(s):K(process.cwd(),s),a=await Rn.stat(o);if(!a.isFile())throw Error(`Path is not a file: ${o}`);if(a.size>e)throw Error(`File too large: ${a.size} bytes (max: ${e} bytes). Consider reading specific sections or using a different approach.`);let m=await Rn.readFile(o,t);if(i){let u=m.split(`
85
+ `),c=String(u.length).length;return u.map((g,f)=>`${String(f+1).padStart(c," ")} | ${g}`).join(`
86
+ `)}return m}}var Ve=(()=>({}));var{spawn:zt}=(()=>({}));var{readdir:qt}=(()=>({}));var{isMainThread:Ke,parentPort:qe,Worker:Kt}=(()=>({}));var xt=15000,Ht=1000,Vt=new Set([".git","node_modules","dist","build",".next","coverage",".turbo",".cache","target","out"]),xn=new Map;function Yt(n,e){return sn.relative(n,e).split(sn.sep).join("/")}async function jt(n){let t=(await new Promise((i,s)=>{let r=zt("rg",["--files","--hidden","-g","!.git"],{cwd:n,stdio:["ignore","pipe","pipe"]}),o="",a="";r.stdout.on("data",(m)=>{o+=m.toString()}),r.stderr.on("data",(m)=>{a+=m.toString()}),r.on("error",s),r.on("close",(m)=>{if(m===0){i(o);return}s(Error(a||`rg exited with code ${m}`))})})).split(/\r?\n/).map((i)=>i.trim()).filter((i)=>i.length>0).map((i)=>i.replace(/\\/g,"/"));return new Set(t)}async function xe(n,e,t){let i=await qt(e,{withFileTypes:!0});for(let s of i){let r=sn.join(e,s.name);if(s.isDirectory()){if(Vt.has(s.name))continue;await xe(n,r,t);continue}if(s.isFile())t.add(Yt(n,r))}}async function Jt(n){let e=new Set;return await xe(n,n,e),e}async function Vn(n){try{return await jt(n)}catch{return Jt(n)}}function lt(){if(Ke||!qe)return;let n=qe;n.on("message",(e)=>{if(e.type!=="index")return;Vn(e.cwd).then((t)=>{let i={type:"indexResult",requestId:e.requestId,files:Array.from(t)};n.postMessage(i)}).catch((t)=>{let i={type:"indexResult",requestId:e.requestId,error:t instanceof Error?t.message:"Failed to build file index"};n.postMessage(i)})})}class He{worker=new Kt(new URL(import.meta.url));nextRequestId=0;pending=new Map;constructor(){this.worker.unref(),this.worker.on("message",(n)=>{if(n.type!=="indexResult")return;let e=this.pending.get(n.requestId);if(!e)return;if(this.pending.delete(n.requestId),n.error){e.reject(Error(n.error));return}e.resolve(n.files??[])}),this.worker.on("error",(n)=>{this.flushPending(n)}),this.worker.on("exit",(n)=>{if(n!==0)this.flushPending(Error(`File index worker exited with code ${n}`))})}requestIndex(n){let e=++this.nextRequestId,t=new Promise((s,r)=>{let o=setTimeout(()=>{this.pending.delete(e),r(Error("Timed out waiting for file index worker response"))},Ht);o.unref(),this.pending.set(e,{resolve:(a)=>{clearTimeout(o),s(a)},reject:(a)=>{clearTimeout(o),r(a)}})}),i={type:"index",requestId:e,cwd:n};return this.worker.postMessage(i),t}flushPending(n){for(let[e,t]of this.pending.entries())t.reject(n),this.pending.delete(e)}}lt();var Hn;function Wt(){if(!Ke)return null;if(Hn===void 0)Hn=new He;return Hn}async function Qt(n){let e=Wt();if(!e)return Vn(n);try{let t=await e.requestIndex(n);return new Set(t)}catch{return Vn(n)}}async function In(n,e={}){let t=e.ttlMs??xt,i=Date.now(),s=xn.get(n);if(s&&t>0&&i-s.lastBuiltAt<=t&&s.files.size>0)return s.files;if(s?.pending)return s.pending;let r=Qt(n).then((o)=>{return xn.set(n,{files:o,lastBuiltAt:Date.now(),pending:null}),o});return xn.set(n,{files:s?.files??new Set,lastBuiltAt:s?.lastBuiltAt??0,pending:r}),r}var{stat:ci}=(()=>({}));var Zt=["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"],Gt=["node_modules",".git","dist","build",".next","coverage","__pycache__",".venv","venv",".cache",".turbo",".output","out","target","bin","obj"];function nr(n,e,t,i){let s=n.split("/"),r=s[s.length-1]??"";if(s.length-1>i)return!1;for(let m=0;m<s.length-1;m++)if(e.has(s[m]??""))return!1;let a=Pn.extname(r).slice(1).toLowerCase();return t.has(a)||!a&&!r.startsWith(".")}function Un(n={}){let{includeExtensions:e=Zt,excludeDirs:t=Gt,maxResults:i=100,contextLines:s=2,maxDepth:r=20}=n,o=new Set(t),a=new Set(e.map((m)=>m.toLowerCase()));return async(m,u,c)=>{let g;try{g=new RegExp(m,"gim")}catch(d){throw Error(`Invalid regex pattern: ${m}. ${d instanceof Error?d.message:""}`)}let f=[],T=0,C=await In(u);for(let d of C){if(!nr(d,o,a,r))continue;if(f.length>=i)break;T++;let E=N(u,d);try{let L=(await Ve.readFile(E,"utf-8")).split(`
87
+ `);for(let U=0;U<L.length;U++){let b=L[U];g.lastIndex=0;let B;while((B=g.exec(b))!==null){if(f.length>=i)break;let k=Math.max(0,U-s),Y=Math.min(L.length-1,U+s),O=[];for(let j=k;j<=Y;j++){let Sn=j===U?">":" ";O.push(`${Sn} ${j+1}: ${L[j]}`)}if(f.push({file:d,line:U+1,column:B.index+1,match:B[0],context:O}),B.index===g.lastIndex)g.lastIndex++}}}catch{}}if(f.length===0)return`No results found for pattern: ${m}
88
+ Searched ${T} files.`;let R=[`Found ${f.length} result${f.length===1?"":"s"} for pattern: ${m}`,`Searched ${T} files.`,""];for(let d of f)R.push(`${d.file}:${d.line}:${d.column}`),R.push(...d.context),R.push("");if(f.length>=i)R.push(`(Showing first ${i} results. Refine your search for more specific results.)`);return R.join(`
89
+ `)}}function er(n){return n.replace(/<script[^>]*>[\s\S]*?<\/script>/gi,"").replace(/<style[^>]*>[\s\S]*?<\/style>/gi,"").replace(/<!--[\s\S]*?-->/g,"").replace(/<(p|div|br|hr|h[1-6]|li|tr)[^>]*>/gi,`
90
+ `).replace(/<[^>]+>/g," ").replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#(\d+);/g,(e,t)=>String.fromCharCode(parseInt(t,10))).replace(/\s+/g," ").replace(/\n\s+/g,`
91
+ `).replace(/\n{3,}/g,`
92
+
93
+ `).trim()}function Mn(n={}){let{timeoutMs:e=30000,maxResponseBytes:t=5000000,userAgent:i="Mozilla/5.0 (compatible; AgentBot/1.0)",headers:s={},followRedirects:r=!0}=n;return async(o,a,m)=>{let u;try{u=new URL(o)}catch{throw Error(`Invalid URL: ${o}`)}if(!["http:","https:"].includes(u.protocol))throw Error(`Invalid protocol: ${u.protocol}. Only http and https are supported.`);let c=new AbortController,g=setTimeout(()=>c.abort(),e),f;if(m.abortSignal)f=()=>c.abort(),m.abortSignal.addEventListener("abort",f);try{let T=await fetch(o,{method:"GET",headers:{"User-Agent":i,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",...s},redirect:r?"follow":"manual",signal:c.signal});if(clearTimeout(g),!r&&T.status>=300&&T.status<400)return`Redirect to: ${T.headers.get("location")}`;if(!T.ok)throw Error(`HTTP ${T.status}: ${T.statusText}`);let C=T.headers.get("content-type")||"",R=T.body?.getReader();if(!R)throw Error("Failed to read response body");let d=[],E=0;while(!0){let{done:k,value:Y}=await R.read();if(k)break;if(E+=Y.length,E>t)throw R.cancel(),Error(`Response too large: exceeded ${t} bytes`);d.push(Y)}let D=new Uint8Array(E),L=0;for(let k of d)D.set(k,L),L+=k.length;let U=new TextDecoder("utf-8").decode(D),b;if(C.includes("text/html")||C.includes("application/xhtml"))b=er(U);else if(C.includes("application/json"))try{let k=JSON.parse(U);b=JSON.stringify(k,null,2)}catch{b=U}else b=U;let B=[`URL: ${o}`,`Content-Type: ${C}`,`Size: ${E} bytes`,"","--- Content ---",b.slice(0,50000)];if(b.length>50000)B.push(`
94
+ [Content truncated: showing first 50000 of ${b.length} characters]`);return B.push("","--- Analysis Request ---",`Prompt: ${a}`),B.join(`
95
+ `)}catch(T){if(clearTimeout(g),T instanceof Error){if(T.name==="AbortError")throw Error(`Request timed out after ${e}ms`);throw T}throw Error(`Fetch failed: ${String(T)}`)}finally{if(m.abortSignal&&f)m.abortSignal.removeEventListener("abort",f)}}}function Dn(n={}){return{readFile:On(n.fileRead),search:Un(n.search),bash:Cn(n.bash),webFetch:Mn(n.webFetch),applyPatch:vn(n.applyPatch),editor:En(n.editor)}}var Yn={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 Ye(n){if(n!=="yolo")return{};let e={enabled:!0,autoApprove:!0},t={"*":e};for(let i of cn)t[i]=e;return t}function je(n,e){let t=Yn[n];return nn({...t,...e})}function tr(n={}){let{executorOptions:e={},executors:t,...i}=n,s={...Dn(e),...t??{}};return nn({...i,executors:s})}var{existsSync:rr,readFileSync:sr}=(()=>({}));import{z as v}from"zod";var on=v.record(v.string(),v.string()),Je=v.record(v.string(),v.unknown()),ir=v.object({type:v.literal("stdio"),command:v.string().min(1),args:v.array(v.string()).optional(),cwd:v.string().min(1).optional(),env:on.optional()}),or=v.object({type:v.literal("sse"),url:v.string().url(),headers:on.optional()}),ar=v.object({type:v.literal("streamableHttp"),url:v.string().url(),headers:on.optional()}),mr=v.discriminatedUnion("type",[ir,or,ar]),ur=v.object({transport:mr,disabled:v.boolean().optional(),metadata:Je.optional()}),cr=v.enum(["stdio","sse","http","streamableHttp"]).optional(),le=v.object({type:v.enum(["stdio","sse","streamableHttp"]).optional(),transportType:cr,disabled:v.boolean().optional(),metadata:Je.optional()});function jn(n){if(!n)return;if(n==="http")return"streamableHttp";return n}var gr=le.extend({command:v.string().min(1),args:v.array(v.string()).optional(),cwd:v.string().min(1).optional(),env:on.optional()}).superRefine((n,e)=>{let t=n.type??jn(n.transportType);if(t&&t!=="stdio")e.addIssue({code:v.ZodIssueCode.custom,message:'Expected type "stdio" for command-based MCP server',path:["type"]})}).transform((n)=>({transport:{type:"stdio",command:n.command,args:n.args,cwd:n.cwd,env:n.env},disabled:n.disabled,metadata:n.metadata})),dr=le.extend({url:v.string().url(),headers:on.optional()}).superRefine((n,e)=>{let t=n.type??jn(n.transportType)??"sse";if(t!=="sse"&&t!=="streamableHttp")e.addIssue({code:v.ZodIssueCode.custom,message:'Expected type "sse" or "streamableHttp" for URL-based MCP server',path:["type"]})}).transform((n)=>{if((n.type??jn(n.transportType)??"sse")==="streamableHttp")return{transport:{type:"streamableHttp",url:n.url,headers:n.headers},disabled:n.disabled,metadata:n.metadata};return{transport:{type:"sse",url:n.url,headers:n.headers},disabled:n.disabled,metadata:n.metadata}}),Tr=v.union([ur,gr,dr]),fr=v.object({mcpServers:v.record(v.string(),Tr)}).strict();function Nn(){return Bn()}function Jn(n={}){let e=n.filePath??Nn(),t=sr(e,"utf8"),i;try{i=JSON.parse(t)}catch(r){let o=r instanceof Error?r.message:String(r);throw Error(`Failed to parse MCP settings JSON at "${e}": ${o}`)}let s=fr.safeParse(i);if(!s.success){let r=s.error.issues.map((o)=>{let a=o.path.join(".");return a?`${a}: ${o.message}`:o.message}).join("; ");throw Error(`Invalid MCP settings at "${e}": ${r}`)}return s.data}function We(n={}){let e=n.filePath??Nn();return rr(e)}function ln(n={}){let e=Jn(n);return Object.entries(e.mcpServers).map(([t,i])=>({name:t,transport:i.transport,disabled:i.disabled,metadata:i.metadata}))}async function Qe(n,e={}){let t=ln(e);for(let i of t)await n.registerServer(i);return t}function F(){return Date.now()}function pr(n){return n.map((e)=>({name:e.name,description:e.description,inputSchema:e.inputSchema}))}class Wn{toolsCacheTtlMs;clientFactory;servers=new Map;operationLocks=new Map;constructor(n){this.clientFactory=n.clientFactory,this.toolsCacheTtlMs=n.toolsCacheTtlMs??5000}async registerServer(n){await this.runExclusive(n.name,async()=>{let e=this.servers.get(n.name);if(!e){this.servers.set(n.name,{registration:{...n},status:"disconnected",updatedAt:F()});return}let t=JSON.stringify(e.registration.transport)!==JSON.stringify(n.transport);if(e.registration={...n},e.updatedAt=F(),t)await this.disconnectState(e),e.client=void 0,e.toolCache=void 0,e.toolCacheUpdatedAt=void 0})}async unregisterServer(n){await this.runExclusive(n,async()=>{let e=this.requireServer(n);await this.disconnectState(e),this.servers.delete(n)})}async connectServer(n){await this.runExclusive(n,async()=>{let e=this.requireServer(n);await this.connectState(e)})}async disconnectServer(n){await this.runExclusive(n,async()=>{let e=this.requireServer(n);await this.disconnectState(e)})}async setServerDisabled(n,e){await this.runExclusive(n,async()=>{let t=this.requireServer(n);if(t.registration={...t.registration,disabled:e},t.updatedAt=F(),e)await this.disconnectState(t)})}listServers(){return[...this.servers.values()].map((n)=>({name:n.registration.name,status:n.status,disabled:n.registration.disabled===!0,lastError:n.lastError,toolCount:n.toolCache?.length??0,updatedAt:n.updatedAt,metadata:n.registration.metadata})).sort((n,e)=>n.name.localeCompare(e.name))}async listTools(n){let e=this.requireServer(n),t=e.toolCacheUpdatedAt??0;if(e.toolCache&&F()-t<=this.toolsCacheTtlMs)return e.toolCache;return this.refreshTools(n)}async refreshTools(n){return this.runExclusive(n,async()=>{let e=this.requireServer(n),i=await(await this.ensureConnectedClient(e)).listTools(),s=pr(i);return e.toolCache=s,e.toolCacheUpdatedAt=F(),e.updatedAt=F(),s})}async callTool(n){return this.runExclusive(n.serverName,async()=>{let e=this.requireServer(n.serverName),t=await this.ensureConnectedClient(e);return e.updatedAt=F(),t.callTool({name:n.toolName,arguments:n.arguments,context:n.context})})}async dispose(){let n=[...this.servers.keys()];for(let e of n)await this.unregisterServer(e)}async ensureConnectedClient(n){if(await this.connectState(n),!n.client)throw Error(`MCP server "${n.registration.name}" does not have an initialized client.`);return n.client}async connectState(n){if(n.registration.disabled)throw Error(`MCP server "${n.registration.name}" is disabled and cannot be connected.`);if(n.status==="connected"&&n.client)return;n.status="connecting",n.updatedAt=F();try{let e=n.client??await this.clientFactory(n.registration);await e.connect(),n.client=e,n.status="connected",n.lastError=void 0,n.updatedAt=F()}catch(e){throw n.status="disconnected",n.lastError=e instanceof Error?e.message:String(e),n.updatedAt=F(),e}}async disconnectState(n){if(!n.client){n.status="disconnected",n.updatedAt=F();return}try{await n.client.disconnect()}finally{n.status="disconnected",n.updatedAt=F()}}requireServer(n){let e=this.servers.get(n);if(!e)throw Error(`Unknown MCP server: ${n}`);return e}async runExclusive(n,e){let t=this.operationLocks.get(n)??Promise.resolve(),i,s=new Promise((o)=>{i=o}),r=t.catch(()=>{return}).then(()=>s);this.operationLocks.set(n,r),await t.catch(()=>{return});try{return await e()}finally{if(i?.(),this.operationLocks.get(n)===r)this.operationLocks.delete(n)}}}var{existsSync:tt,mkdirSync:Dr,readFileSync:Nr,writeFileSync:Lr}=(()=>({}));import{providers as Qn}from"@clinebot/llms";import{z as Z}from"zod";var Ze=Qn.ProviderSettingsSchema,Zn=Qn.toProviderConfig,Ge=Z.object({settings:Qn.ProviderSettingsSchema,updatedAt:Z.string().datetime(),tokenSource:Z.enum(["manual","oauth","migration"]).default("manual")}),Ln=Z.object({version:Z.literal(1),lastUsedProvider:Z.string().min(1).optional(),providers:Z.record(Z.string(),Ge)});function en(){return{version:1,providers:{}}}var{existsSync:Ar,readFileSync:hr}=(()=>({}));import{models as _r,providers as vr}from"@clinebot/llms";function A(n){let e=n?.trim();return e?e:void 0}function nt(n){if(!Ar(n))return;try{let e=hr(n,"utf8"),t=JSON.parse(e);if(t&&typeof t==="object"&&!Array.isArray(t))return t}catch{}return}function Cr(n){let e=n.dataDir??H(),t=n.globalStatePath??N(e,"globalState.json"),i=n.secretsPath??N(e,"secrets.json"),s=nt(t),r=nt(i);if(!s&&!r)return;return{globalState:s??{},secrets:r??{}}}function Er(n,e,t,i){let s=t==="plan"?"planMode":"actMode",r=e===i?A(t==="plan"?n.planModeApiModelId:n.actModeApiModelId):void 0,a={openrouter:`${s}OpenRouterModelId`,cline:`${s}ClineModelId`,openai:`${s}OpenAiModelId`,ollama:`${s}OllamaModelId`,lmstudio:`${s}LmStudioModelId`,litellm:`${s}LiteLlmModelId`,requesty:`${s}RequestyModelId`,together:`${s}TogetherModelId`,fireworks:`${s}FireworksModelId`,sapaicore:`${s}SapAiCoreModelId`,groq:`${s}GroqModelId`,baseten:`${s}BasetenModelId`,huggingface:`${s}HuggingFaceModelId`,"huawei-cloud-maas":`${s}HuaweiCloudMaasModelId`,oca:`${s}OcaModelId`,aihubmix:`${s}AihubmixModelId`,hicap:`${s}HicapModelId`,nousResearch:`${s}NousResearchModelId`,"vercel-ai-gateway":`${s}VercelAiGatewayModelId`}[e];return(a?A(typeof n[a]==="string"?n[a]:void 0):void 0)??r}function Rr(n,e,t){let i=t==="plan"?n.planModeReasoningEffort:n.actModeReasoningEffort,s=t==="plan"?n.geminiPlanModeThinkingLevel:n.geminiActModeThinkingLevel,r=t==="plan"?n.planModeThinkingBudgetTokens:n.actModeThinkingBudgetTokens,o=(e==="gemini"?s:void 0)??i,a=o==="none"||o==="low"||o==="medium"||o==="high"?o:void 0,m=typeof r==="number"&&Number.isInteger(r)&&r>0?r:void 0;if(!a&&m===void 0)return;return{...a?{effort:a}:{},...m!==void 0?{budgetTokens:m}:{}}}function Or(n){let e=n["openai-codex-oauth-credentials"];if(!e)return;try{let t=JSON.parse(e),i=A(t.access_token),s=A(t.refresh_token),r=A(t.accountId);if(!i&&!s&&!r)return;return{...i?{apiKey:i}:{},auth:{...i?{accessToken:i}:{},...s?{refreshToken:s}:{},...r?{accountId:r}:{}}}}catch{return}}function Ir(n){let e=_r.getGeneratedModelsForProvider(n);return Object.keys(e)[0]??void 0}function Ur(n,e,t,i){let s=A(i==="plan"?e.planModeApiProvider:e.actModeApiProvider),r=Er(e,n,i,s)??Ir(n),o=Rr(e,n,i),a=typeof e.requestTimeoutMs==="number"&&Number.isInteger(e.requestTimeoutMs)&&e.requestTimeoutMs>0?e.requestTimeoutMs:void 0,m={anthropic:t.apiKey,cline:t.clineApiKey,openai:t.openAiApiKey,"openai-native":t.openAiNativeApiKey,openrouter:t.openRouterApiKey,bedrock:t.awsBedrockApiKey,gemini:t.geminiApiKey,ollama:t.ollamaApiKey,deepseek:t.deepSeekApiKey,requesty:t.requestyApiKey,together:t.togetherApiKey,fireworks:t.fireworksApiKey,qwen:t.qwenApiKey,doubao:t.doubaoApiKey,mistral:t.mistralApiKey,litellm:t.liteLlmApiKey,asksage:t.asksageApiKey,xai:t.xaiApiKey,moonshot:t.moonshotApiKey,zai:t.zaiApiKey,huggingface:t.huggingFaceApiKey,nebius:t.nebiusApiKey,sambanova:t.sambanovaApiKey,cerebras:t.cerebrasApiKey,groq:t.groqApiKey,"huawei-cloud-maas":t.huaweiCloudMaasApiKey,baseten:t.basetenApiKey,"vercel-ai-gateway":t.vercelAiGatewayApiKey,dify:t.difyApiKey,minimax:t.minimaxApiKey,hicap:t.hicapApiKey,aihubmix:t.aihubmixApiKey,nousResearch:t.nousResearchApiKey,oca:t.ocaApiKey,sapaicore:t.sapAiCoreClientId},u={};if(n==="openai-codex")Object.assign(u,Or(t));if(n==="cline"){let d=A(t["cline:clineAccountId"]??t.clineAccountId);if(d)u.auth={...u.auth??{},accountId:d}}if(n==="openai"&&e.openAiHeaders)u.headers=e.openAiHeaders;if(n==="bedrock")u.aws={accessKey:A(t.awsAccessKey),secretKey:A(t.awsSecretKey),sessionToken:A(t.awsSessionToken),region:A(e.awsRegion),authentication:e.awsAuthentication,profile:e.awsUseProfile?A(e.awsProfile):void 0,usePromptCache:e.awsBedrockUsePromptCache,useCrossRegionInference:e.awsUseCrossRegionInference,useGlobalInference:e.awsUseGlobalInference,endpoint:A(e.awsBedrockEndpoint),customModelBaseId:A(i==="plan"?e.planModeAwsBedrockCustomModelBaseId:e.actModeAwsBedrockCustomModelBaseId)};if(n==="vertex")u.gcp={projectId:A(e.vertexProjectId),region:A(e.vertexRegion)};if(n==="openai"&&(e.azureApiVersion||e.azureIdentity!==void 0))u.azure={apiVersion:A(e.azureApiVersion),useIdentity:e.azureIdentity};if(n==="sapaicore")u.sap={clientId:A(t.sapAiCoreClientId),clientSecret:A(t.sapAiCoreClientSecret),tokenUrl:A(e.sapAiCoreTokenUrl),resourceGroup:A(e.sapAiResourceGroup),deploymentId:A(i==="plan"?e.planModeSapAiCoreDeploymentId:e.actModeSapAiCoreDeploymentId),useOrchestrationMode:e.sapAiCoreUseOrchestrationMode};if(n==="oca"){u.oca={mode:e.ocaMode};let d=A(t.ocaRefreshToken);if(d)u.auth={...u.auth??{},refreshToken:d}}if(n==="qwen")u.apiLine=e.qwenApiLine;if(n==="moonshot")u.apiLine=e.moonshotApiLine;if(n==="zai")u.apiLine=e.zaiApiLine;if(n==="minimax")u.apiLine=e.minimaxApiLine;let c={anthropic:e.anthropicBaseUrl,openai:e.openAiBaseUrl,ollama:e.ollamaBaseUrl,lmstudio:e.lmStudioBaseUrl,litellm:e.liteLlmBaseUrl,gemini:e.geminiBaseUrl,requesty:e.requestyBaseUrl,asksage:e.asksageApiUrl,dify:e.difyBaseUrl,oca:e.ocaBaseUrl,aihubmix:e.aihubmixBaseUrl,sapaicore:e.sapAiCoreBaseUrl},g=A(m[n]),f=A(c[n]),T={provider:n,...g?{apiKey:g}:{},...r?{model:r}:{},...f?{baseUrl:f}:{},...o?{reasoning:o}:{},...a?{timeout:a}:{},...u},C=vr.ProviderSettingsSchema.safeParse(T);if(!C.success)return;return Object.keys(T).filter((d)=>d!=="provider").length>0?C.data:void 0}function Mr(n,e){let t=new Set;for(let i of[n.actModeApiProvider,n.planModeApiProvider]){let s=A(i);if(s)t.add(s)}if(A(e.apiKey))t.add("anthropic");if(A(e.openRouterApiKey))t.add("openrouter");if(A(e.openAiApiKey))t.add("openai");if(A(e.openAiNativeApiKey))t.add("openai-native");if(A(e["openai-codex-oauth-credentials"]))t.add("openai-codex");if(A(e.geminiApiKey))t.add("gemini");if(A(e.ollamaApiKey))t.add("ollama");if(A(e.awsAccessKey)||A(e.awsBedrockApiKey))t.add("bedrock");if(A(n.vertexProjectId)||A(n.vertexRegion))t.add("vertex");if(A(e.clineApiKey))t.add("cline");if(A(e.ocaApiKey))t.add("oca");return t}function et(n){let e=n.providerSettingsManager.read(),t=Cr(n);if(!t)return{migrated:!1,providerCount:Object.keys(e.providers).length,lastUsedProvider:e.lastUsedProvider};let{globalState:i,secrets:s}=t,r=i.mode==="plan"?"plan":"act",o=Mr(i,s),a=en();a.providers={...e.providers},a.lastUsedProvider=e.lastUsedProvider;let m=new Date().toISOString(),u=0;for(let g of o){if(a.providers[g])continue;let f=Ur(g,i,s,r);if(!f)continue;a.providers[g]={settings:f,updatedAt:m,tokenSource:"migration"},u+=1}if(u===0)return{migrated:!1,providerCount:Object.keys(e.providers).length,lastUsedProvider:e.lastUsedProvider};let c=A(r==="plan"?i.planModeApiProvider:i.actModeApiProvider);return a.lastUsedProvider=e.lastUsedProvider??(c&&a.providers[c]?c:Object.keys(a.providers)[0]),n.providerSettingsManager.write(a),{migrated:!0,providerCount:Object.keys(a.providers).length,lastUsedProvider:a.lastUsedProvider}}function Sr(){return new Date().toISOString()}function kr(n){if(mn(n)!=="providers.json")return;let e=S(n);if(mn(e)!=="settings")return;return S(e)}class rt{filePath;dataDir;constructor(n={}){if(this.filePath=n.filePath??bn(),this.dataDir=n.dataDir??kr(this.filePath),this.dataDir||!n.filePath)et({providerSettingsManager:this,dataDir:this.dataDir})}getFilePath(){return this.filePath}read(){if(!tt(this.filePath))return en();try{let n=Nr(this.filePath,"utf8"),e=JSON.parse(n),t=Ln.safeParse(e);if(t.success)return t.data}catch{}return en()}write(n){let e=Ln.parse(n),t=S(this.filePath);if(!tt(t))Dr(t,{recursive:!0});Lr(this.filePath,`${JSON.stringify(e,null,2)}
96
+ `,"utf8")}saveProviderSettings(n,e={}){let t=Ze.parse(n),i=this.read(),s=t.provider,r=e.setLastUsed!==!1,o=i.providers[s],a=e.tokenSource??o?.tokenSource??"manual",m={...i,providers:{...i.providers,[s]:{settings:t,updatedAt:Sr(),tokenSource:a}},lastUsedProvider:r?s:i.lastUsedProvider};return this.write(m),m}getProviderSettings(n){return this.read().providers[n]?.settings}getLastUsedProviderSettings(){let n=this.read(),e=n.lastUsedProvider;if(!e)return;return n.providers[e]?.settings}getProviderConfig(n){let e=this.getProviderSettings(n);if(!e)return;return Zn(e)}getLastUsedProviderConfig(){let n=this.getLastUsedProviderSettings();if(!n)return;return Zn(n)}}var{existsSync:wr,mkdirSync:Fr}=(()=>({}));var{createRequire:Pr}=(()=>({}));function an(){return new Date().toISOString()}function Gn(n){let e=Pr(import.meta.url);if(typeof globalThis.Bun<"u"){let{Database:r}=e("bun:sqlite"),o=new r(n,{create:!0});return{prepare:(a)=>{let m=o.query(a);return{run:(...u)=>m.run(...u),get:(...u)=>m.get(...u),all:(...u)=>m.all(...u)}},exec:(a)=>o.exec(a)}}try{let r=["node",":sqlite"].join(""),{DatabaseSync:o}=e(r),a=new o(n);return{prepare:(m)=>{let u=a.prepare(m);return{run:(...c)=>u.run(...c),get:(...c)=>u.get(...c)??null,all:(...c)=>u.all(...c)}},exec:(m)=>a.exec(m)}}catch{}let i=["better","-sqlite3"].join("");return new(e(i))(n)}function br(){return Fn()}function tn(n){return n.toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")}function Br(n){return{...n,tasks:n.tasks.map((e)=>({...e,createdAt:new Date(e.createdAt),updatedAt:new Date(e.updatedAt)})),mailbox:n.mailbox.map((e)=>({...e,sentAt:new Date(e.sentAt),readAt:e.readAt?new Date(e.readAt):void 0})),missionLog:n.missionLog.map((e)=>({...e,ts:new Date(e.ts)})),runs:(n.runs??[]).map((e)=>({...e,startedAt:new Date(e.startedAt),endedAt:e.endedAt?new Date(e.endedAt):void 0,nextAttemptAt:e.nextAttemptAt?new Date(e.nextAttemptAt):void 0,heartbeatAt:e.heartbeatAt?new Date(e.heartbeatAt):void 0})),outcomes:(n.outcomes??[]).map((e)=>({...e,createdAt:new Date(e.createdAt),finalizedAt:e.finalizedAt?new Date(e.finalizedAt):void 0})),outcomeFragments:(n.outcomeFragments??[]).map((e)=>({...e,createdAt:new Date(e.createdAt),reviewedAt:e.reviewedAt?new Date(e.reviewedAt):void 0}))}}class ne{teamDirPath;db;constructor(n={}){this.teamDirPath=n.teamDir??br()}init(){this.getRawDb()}ensureTeamDir(){if(!wr(this.teamDirPath))Fr(this.teamDirPath,{recursive:!0});return this.teamDirPath}dbPath(){return N(this.ensureTeamDir(),"teams.db")}getRawDb(){if(this.db)return this.db;let n=Gn(this.dbPath());return this.ensureSchema(n),this.db=n,n}ensureSchema(n){n.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(n,e=[]){return this.getRawDb().prepare(n).run(...e)}queryOne(n,e=[]){return this.getRawDb().prepare(n).get(...e)??void 0}queryAll(n,e=[]){return this.getRawDb().prepare(n).all(...e)}listTeamNames(){return this.queryAll("SELECT team_name FROM team_runtime_snapshot ORDER BY team_name ASC").map((n)=>n.team_name)}readState(n){let e=this.queryOne("SELECT team_name, state_json, teammates_json, updated_at FROM team_runtime_snapshot WHERE team_name = ?",[tn(n)]);if(!e)return;return Br(JSON.parse(e.state_json))}readHistory(n,e=200){return this.queryAll("SELECT event_type, payload_json, ts FROM team_events WHERE team_name = ? ORDER BY id DESC LIMIT ?",[tn(n),e]).map((t)=>({eventType:t.event_type,payload:JSON.parse(t.payload_json),ts:t.ts}))}loadRuntime(n){let e=tn(n),t=this.readState(e),i=this.queryOne("SELECT team_name, state_json, teammates_json, updated_at FROM team_runtime_snapshot WHERE team_name = ?",[e]),s=i?JSON.parse(i.teammates_json):[],r=this.markInProgressRunsInterrupted(e,"runtime_recovered");return{state:t,teammates:s,interruptedRunIds:r}}appendTeamEvent(n,e,t,i){this.run(`INSERT INTO team_events (team_name, ts, event_type, payload_json, causation_id, correlation_id)
174
+ VALUES (?, ?, ?, ?, NULL, ?)`,[tn(n),an(),e,JSON.stringify(t),i??null])}persistRuntime(n,e,t){let i=tn(n),s=an();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`,[i,JSON.stringify(e),JSON.stringify(t),s]);for(let r of e.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`,[i,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 e.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`,[i,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 e.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`,[i,r.id,r.title,r.status,JSON.stringify({requiredSections:r.requiredSections}),r.finalizedAt?r.finalizedAt.toISOString():null]);for(let r of e.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`,[i,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(n,e){let t=tn(n),i=this.queryAll("SELECT run_id FROM team_runs WHERE team_name = ? AND status IN ('queued', 'running')",[t]);if(i.length===0)return[];let s=an();return this.run(`UPDATE team_runs SET status = 'interrupted', error = ?, ended_at = ?, version = version + 1
220
+ WHERE team_name = ? AND status IN ('queued', 'running')`,[e,s,t]),i.map((r)=>r.run_id)}handleTeamEvent(n,e){this.appendTeamEvent(n,e.type,e)}}function q(){return new Date().toISOString()}function st(n,e){if(e<=0)return 0;return Math.round(n/e*100)}function Xr(n,e){let t=new Set;for(let s of e)if(s.status==="reviewed")t.add(`${s.outcomeId}:${s.section}`);let i=new Set;for(let s of n){if(s.status==="finalized")continue;for(let r of s.requiredSections)if(!t.has(`${s.id}:${r}`))i.add(`${s.id}:${r}`)}return[...i].sort((s,r)=>s.localeCompare(r))}function it(n,e){let t={idle:0,running:0,stopped:0},i={pending:0,in_progress:0,blocked:0,completed:0},s={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,m=0;for(let d of e.members)if(t[d.status]+=1,d.role==="lead")a+=1;else m+=1;let u=[],c=[],g=e.tasks.filter((d)=>d.status==="completed").length,f=new Map(e.tasks.map((d)=>[d.id,d]));for(let d of e.tasks){if(i[d.status]+=1,d.status==="blocked"){u.push(d.id);continue}if(d.status!=="pending")continue;if(d.dependsOn.every((D)=>{return f.get(D)?.status==="completed"}))c.push(d.id)}let T=[],C,R=0;for(let d of e.runs){if(s[d.status]+=1,d.status==="queued"||d.status==="running")T.push(d.id);let E=d.startedAt.getTime();if(E>=R)R=E,C=d.id}for(let d of e.outcomes)r[d.status]+=1;for(let d of e.outcomeFragments)o[d.status]+=1;return{teamName:n,updatedAt:q(),members:{total:e.members.length,byStatus:t,leadCount:a,teammateCount:m},tasks:{total:e.tasks.length,byStatus:i,blockedTaskIds:u,readyTaskIds:c,completionPct:st(g,e.tasks.length)},runs:{total:e.runs.length,byStatus:s,activeRunIds:T,latestRunId:C},outcomes:{total:e.outcomes.length,byStatus:r,finalizedPct:st(r.finalized,e.outcomes.length),missingRequiredSections:Xr(e.outcomes,e.outcomeFragments)},fragments:{total:e.outcomeFragments.length,byStatus:o}}}function ot(n){let{event:e}=n;switch(e.type){case"team_task_updated":return{teamName:n.teamName,sessionId:n.sessionId,eventType:e.type,ts:q(),taskId:e.task.id,agentId:e.task.assignee??e.task.createdBy};case"run_queued":case"run_started":case"run_completed":case"run_failed":case"run_cancelled":case"run_interrupted":return{teamName:n.teamName,sessionId:n.sessionId,eventType:e.type,ts:q(),runId:e.run.id,taskId:e.run.taskId,agentId:e.run.agentId,message:e.run.error};case"run_progress":return{teamName:n.teamName,sessionId:n.sessionId,eventType:e.type,ts:q(),runId:e.run.id,taskId:e.run.taskId,agentId:e.run.agentId,message:e.message};case"outcome_created":case"outcome_finalized":return{teamName:n.teamName,sessionId:n.sessionId,eventType:e.type,ts:q(),outcomeId:e.outcome.id};case"outcome_fragment_attached":case"outcome_fragment_reviewed":return{teamName:n.teamName,sessionId:n.sessionId,eventType:e.type,ts:q(),outcomeId:e.fragment.outcomeId,fragmentId:e.fragment.id,agentId:e.fragment.sourceAgentId};case"team_message":return{teamName:n.teamName,sessionId:n.sessionId,eventType:e.type,ts:q(),taskId:e.message.taskId,agentId:e.message.fromAgentId,message:e.message.subject};case"team_mission_log":return{teamName:n.teamName,sessionId:n.sessionId,eventType:e.type,ts:q(),taskId:e.entry.taskId,agentId:e.entry.agentId,message:e.entry.summary};case"teammate_spawned":case"teammate_shutdown":case"task_start":case"task_end":case"agent_event":return{teamName:n.teamName,sessionId:n.sessionId,eventType:e.type,ts:q(),agentId:e.agentId}}return{teamName:n.teamName,sessionId:n.sessionId,eventType:e.type,ts:q()}}var $r=kn,at;((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"})(at||={});export{ot as toTeamProgressLifecycleEvent,pe as setHomeDirIfUnset,fe as setHomeDir,Ae as resolveSessionDataDir,ln as resolveMcpServerRegistrations,me as resolveHookLogPath,Nn as resolveDefaultMcpSettingsPath,H as resolveClineDataDir,Qe as registerMcpServersFromSettingsFile,se as normalizeUserInput,Jn as loadMcpSettingsFile,_e as isRpcClineAccountActionRequest,We as hasMcpSettingsFile,ve as executeRpcClineAccountAction,Xn as ensureParentDir,he as ensureHookLogDir,en as emptyStoredProviderSettings,Ye as createToolPoliciesWithPreset,je as createDefaultToolsWithPreset,nn as createDefaultTools,Dn as createDefaultExecutors,tr as createBuiltinTools,it as buildTeamProgressSummary,Yn as ToolPresets,Ln as StoredProviderSettingsSchema,Ge as StoredProviderSettingsEntrySchema,ne as SqliteTeamStore,at as SessionSource,$r as SESSION_STATUSES,yn as RpcClineAccountService,oe as RPC_TEAM_PROGRESS_EVENT_TYPE,ae as RPC_TEAM_LIFECYCLE_EVENT_TYPE,rt as ProviderSettingsManager,Wn as InMemoryMcpManager,z as DefaultToolNames,$n as ClineAccountService,Et as ChatViewStateSchema,Ie as ChatSummarySchema,Ee as ChatSessionStatusSchema,Ce as ChatSessionConfigSchema,Oe as ChatMessageSchema,Re as ChatMessageRoleSchema,cn as ALL_DEFAULT_TOOL_NAMES};
package/dist/index.d.ts CHANGED
@@ -3,6 +3,9 @@
3
3
  *
4
4
  * Runtime-agnostic core contracts and shared state utilities.
5
5
  */
6
+ export type { AgentMode, BasicLogger, ConnectorHookEvent, HookSessionContext, RpcAddProviderActionRequest, RpcChatMessage, RpcChatRunTurnRequest, RpcChatRuntimeConfigBase, RpcChatRuntimeLoggerConfig, RpcChatStartSessionArtifacts, RpcChatStartSessionRequest, RpcChatTurnResult, RpcClineAccountActionRequest, RpcOAuthProviderId, RpcProviderActionRequest, RpcProviderCapability, RpcProviderCatalogResponse, RpcProviderListItem, RpcProviderModel, RpcProviderOAuthLoginResponse, RpcSaveProviderSettingsActionRequest, SessionLineage, TeamProgressProjectionEvent, ToolPolicy, } from "@clinebot/shared";
7
+ export { normalizeUserInput, RPC_TEAM_LIFECYCLE_EVENT_TYPE, RPC_TEAM_PROGRESS_EVENT_TYPE, resolveHookLogPath, } from "@clinebot/shared";
8
+ export { ensureHookLogDir, ensureParentDir, resolveClineDataDir, resolveSessionDataDir, setHomeDir, setHomeDirIfUnset, } from "@clinebot/shared/storage";
6
9
  export { type ClineAccountBalance, type ClineAccountOperations, type ClineAccountOrganization, type ClineAccountOrganizationBalance, type ClineAccountOrganizationUsageTransaction, type ClineAccountPaymentTransaction, ClineAccountService, type ClineAccountServiceOptions, type ClineAccountUsageTransaction, type ClineAccountUser, executeRpcClineAccountAction, isRpcClineAccountActionRequest, RpcClineAccountService, type RpcProviderActionExecutor, } from "./account";
7
10
  export type { ChatMessage, ChatSessionConfig, ChatSessionStatus, ChatSummary, ChatViewState, } from "./chat/chat-schema";
8
11
  export { ChatMessageRoleSchema, ChatMessageSchema, ChatSessionConfigSchema, ChatSessionStatusSchema, ChatSummarySchema, ChatViewStateSchema, } from "./chat/chat-schema";