@cline/shared 0.0.42 → 0.0.43

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.
@@ -1,6 +1,6 @@
1
1
  import type { AgentMessage, AgentModelEvent, AgentToolDefinition } from "../agent";
2
2
  import type { BasicLogger } from "../logging/logger";
3
- import type { ProviderCapability } from "../rpc/runtime";
3
+ import type { ProviderCapability, ProviderConfigField } from "../rpc/runtime";
4
4
  import type { ITelemetryService } from "../services/telemetry";
5
5
  export type JsonValue = string | number | boolean | null | JsonValue[] | {
6
6
  [key: string]: JsonValue | undefined;
@@ -35,7 +35,8 @@ export interface GatewayProviderMetadata {
35
35
  promptCacheStrategy?: GatewayPromptCacheStrategy;
36
36
  usageCostDisplay?: GatewayUsageCostDisplay;
37
37
  routing?: GatewayProviderRouting;
38
- [key: string]: JsonValue | GatewayProviderRouting | undefined;
38
+ configFields?: readonly ProviderConfigField[];
39
+ [key: string]: JsonValue | GatewayProviderRouting | readonly ProviderConfigField[] | undefined;
39
40
  }
40
41
  export interface GatewayModelDefinition {
41
42
  id: string;
@@ -126,6 +126,23 @@ export interface ProviderModel {
126
126
  supportsVision?: boolean;
127
127
  supportsReasoning?: boolean;
128
128
  }
129
+ export type ProviderConfigFieldType = "text" | "password" | "url" | "number" | "select" | "boolean";
130
+ export type ProviderConfigFieldPrimitive = string | number | boolean | null;
131
+ export interface ProviderConfigFieldOption {
132
+ label: string;
133
+ value: Exclude<ProviderConfigFieldPrimitive, null>;
134
+ }
135
+ export interface ProviderConfigField {
136
+ path: string;
137
+ label: string;
138
+ type: ProviderConfigFieldType;
139
+ description?: string;
140
+ placeholder?: string;
141
+ required?: boolean;
142
+ secret?: boolean;
143
+ options?: ProviderConfigFieldOption[];
144
+ defaultValue?: ProviderConfigFieldPrimitive;
145
+ }
129
146
  export interface ProviderListItem {
130
147
  id: string;
131
148
  name: string;
@@ -142,6 +159,8 @@ export interface ProviderListItem {
142
159
  capabilities?: ProviderCapability[];
143
160
  authDescription: string;
144
161
  baseUrlDescription: string;
162
+ configFields?: ProviderConfigField[];
163
+ configValues?: Record<string, ProviderConfigFieldPrimitive>;
145
164
  modelList?: ProviderModel[];
146
165
  family?: string;
147
166
  }
@@ -1,2 +1,2 @@
1
1
  export { resolveExistingFilePath } from "./path-resolution";
2
- export { AGENT_CONFIG_DIRECTORY_NAME, CLINE_MCP_SETTINGS_FILE_NAME, type CronSpecsScope, discoverPluginModulePaths, ensureFileExists, ensureHookLogDir, ensureParentDir, HOOKS_CONFIG_DIRECTORY_NAME, isPluginModulePath, type ResolveCronSpecsDirOptions, RULES_CONFIG_DIRECTORY_NAME, resolveAgentConfigSearchPaths, resolveAgentsConfigDirPath, resolveClineDataDir, resolveClineDir, resolveConfiguredPluginModulePaths, resolveCronDbPath, resolveCronEventsDir, resolveCronReportsDir, resolveCronSpecsDir, resolveDbDataDir, resolveDocumentsClineDirectoryPath, resolveDocumentsExtensionPath, resolveGlobalCronSpecsDir, resolveGlobalSettingsPath, resolveHooksConfigSearchPaths, resolveMcpSettingsPath, resolvePluginConfigSearchPaths, resolvePluginModuleEntries, resolveProviderSettingsPath, resolveRulesConfigSearchPaths, resolveSessionDataDir, resolveSkillsConfigSearchPaths, resolveTeamDataDir, resolveWorkflowsConfigSearchPaths, resolveWorkspaceCronSpecsDir, SKILLS_CONFIG_DIRECTORY_NAME, setClineDir, setClineDirIfUnset, setHomeDir, setHomeDirIfUnset, WORKFLOWS_CONFIG_DIRECTORY_NAME, } from "./paths";
2
+ export { AGENT_CONFIG_DIRECTORY_NAME, AGENTS_RULES_FILE_NAME, CLINE_MCP_SETTINGS_FILE_NAME, type CronSpecsScope, discoverPluginModulePaths, ensureFileExists, ensureHookLogDir, ensureParentDir, HOOKS_CONFIG_DIRECTORY_NAME, isPluginModulePath, type ResolveCronSpecsDirOptions, RULES_CONFIG_DIRECTORY_NAME, resolveAgentConfigSearchPaths, resolveAgentsConfigDirPath, resolveClineDataDir, resolveClineDir, resolveConfiguredPluginModulePaths, resolveCronDbPath, resolveCronEventsDir, resolveCronReportsDir, resolveCronSpecsDir, resolveDbDataDir, resolveDocumentsClineDirectoryPath, resolveDocumentsExtensionPath, resolveGlobalAgentsRulesPath, resolveGlobalCronSpecsDir, resolveGlobalSettingsPath, resolveHooksConfigSearchPaths, resolveMcpSettingsPath, resolvePluginConfigSearchPaths, resolvePluginModuleEntries, resolveProviderSettingsPath, resolveRulesConfigSearchPaths, resolveSessionDataDir, resolveSkillsConfigSearchPaths, resolveTeamDataDir, resolveWorkflowsConfigSearchPaths, resolveWorkspaceCronSpecsDir, SKILLS_CONFIG_DIRECTORY_NAME, setClineDir, setClineDirIfUnset, setHomeDir, setHomeDirIfUnset, WORKFLOWS_CONFIG_DIRECTORY_NAME, } from "./paths";
@@ -1 +1 @@
1
- var GC=Object.defineProperty;var MC=(C)=>C;function OC(C,S){this[C]=MC.bind(null,S)}var lC=(C,S)=>{for(var M in S)GC(C,M,{get:S[M],enumerable:!0,configurable:!0,set:OC.bind(S,M)})};import{existsSync as L,readdirSync as FC}from"node:fs";import{basename as y,dirname as k,join as m}from"node:path";var KC=/[\u00A0\u2000-\u200A\u202F\u205F\u3000]/g,IC=" ";function u(C){return C.normalize("NFC").replace(KC," ")}function TC(C){let S=y(C),M=S.replace(/ (AM|PM)\./gi,`${IC}$1.`);return M===S?C:m(k(C),M)}function WC(C){return C.normalize("NFD")}function w(C){return C.replace(/'/g,"’")}function gC(C){let S=k(C),M=u(y(C));try{for(let O of FC(S))if(u(O)===M)return m(S,O)}catch{}return}function qC(C){if(L(C))return C;let S=TC(C);if(S!==C&&L(S))return S;let M=WC(C);if(M!==C&&L(M))return M;let O=w(C);if(O!==C&&L(O))return O;let F=w(M);if(F!==M&&F!==O&&L(F))return F;return gC(C)}import{appendFileSync as vC,existsSync as I,mkdirSync as R,readdirSync as DC,readFileSync as LC,statSync as Q}from"node:fs";import{homedir as QC}from"node:os";import{dirname as U,join as G,resolve as Y}from"node:path";var H=".clinerules",X=".cline",l=".agents",J="agents",B="hooks",j="skills",E="rules",_="workflows",f="plugins",s="cline_mcp_settings.json";function YC(){let C=process?.env?.HOME?.trim();if(C&&C!=="~")return C;let S=process?.env?.USERPROFILE?.trim();if(S)return S;let M=process?.env?.HOMEDRIVE?.trim(),O=process?.env?.HOMEPATH?.trim();if(M&&O)return`${M}${O}`;let F=QC().trim();if(F&&F!=="~")return F;return"~"}var $=YC(),d=!1;function ZC(C){let S=C.trim();if(!S)return;$=S,d=!0}function $C(C){if(d)return;let S=C.trim();if(!S)return;$=S}var N,o=!1;function zC(C){let S=C.trim();if(!S)return;N=S,o=!0}function BC(C){if(o)return;let S=C.trim();if(!S)return;N=S}function T(){if(N)return N;let C=process.env.CLINE_DIR?.trim();if(C)return C;return G($,".cline")}function p(){return G($,"Documents","Cline")}function z(C){return G(p(),C)}function g(){let C=process.env.CLINE_DATA_DIR?.trim();if(C)return C;return G(T(),"data")}function _C(){let C=process.env.CLINE_SESSION_DATA_DIR?.trim();if(C)return C;return G(g(),"sessions")}function jC(){let C=process.env.CLINE_TEAM_DATA_DIR?.trim();if(C)return C;return G(g(),"teams")}function c(){let C=process.env.CLINE_DB_DATA_DIR?.trim();if(C)return C;return G(g(),"db")}function NC(){let C=process.env.CLINE_CRON_DB_PATH?.trim();if(C)return C;return G(c(),"cron.db")}function P(){return G(T(),"cron")}function A(C){return G(C,".cline","cron")}function b(C){if(typeof C==="string")return A(C);if(C?.cronSpecsDir?.trim())return C.cronSpecsDir.trim();if(C?.scope==="workspace"){let S=C.workspaceRoot?.trim();if(!S)throw Error("workspaceRoot is required for workspace cron scope");return A(S)}return P()}function XC(C){return G(b(C),"reports")}function EC(C){return G(b(C),"events")}function AC(){let C=process.env.CLINE_PROVIDER_SETTINGS_PATH?.trim();if(C)return C;return G(g(),"settings","providers.json")}function RC(){let C=process.env.CLINE_GLOBAL_SETTINGS_PATH?.trim();if(C)return C;return G(g(),"settings","global-settings.json")}function UC(){let C=process.env.CLINE_MCP_SETTINGS_PATH?.trim();if(C)return C;return G(g(),"settings",s)}function q(C){let S=new Set,M=[];for(let O of C){if(!O||S.has(O))continue;S.add(O),M.push(O)}return M}function HC(C){if(!C)return[];return[H,X,l].map((S)=>G(C,S,j))}function h(){return G(T(),J)}function JC(C){return q([C?G(C,X,J):"",h()])}function bC(C){let S=[z("Hooks"),G(T(),B)];if(C)S.push(G(C,H,B),G(C,X,B));return q(S)}function VC(C){return q([...HC(C),G(T(),j),G($,l,j)])}function xC(C){let S=C?[G(C,H),G(C,X,E)]:[],M=C?[G(C,"AGENTS.md")]:[];return q([...M,...S,G(T(),E),z("Rules")])}function uC(C){return q([C?G(C,".clinerules",_):"",z("Workflows"),G(T(),_),C?G(C,".cline",_):""])}function wC(C){return q([C?G(C,".cline",f):"",G(T(),f),z("Plugins")])}var n=new Set([".js",".ts"]),r="package.json",yC=["index.ts","index.js"];function Z(C){let S=C.lastIndexOf(".");if(S===-1)return!1;return n.has(C.slice(S))}function i(C){try{let S=JSON.parse(LC(C,"utf8"));if(!S.cline||typeof S.cline!=="object")return null;return S.cline}catch{return null}}function e(C){let S=C?.plugins;if(!Array.isArray(S))return[];return S.flatMap((M)=>M.paths??[])}function t(C){let S=Y(C);if(!I(S)||!Q(S).isDirectory())return null;let M=G(S,r);if(I(M)){let O=i(M),F=e(O).map((K)=>Y(S,K)).filter((K)=>I(K)&&Q(K).isFile()&&Z(K));if(F.length>0)return F}for(let O of yC){let F=G(S,O);if(I(F)&&Q(F).isFile())return[F]}return null}function a(C){let S=Y(C);if(!I(S))return[];let M=[],O=[S];while(O.length>0){let F=O.pop();if(!F)continue;let K;try{K=DC(F,{withFileTypes:!0})}catch{continue}for(let v of K){let W=G(F,v.name);if(v.isDirectory()){let V=G(W,r);if(I(V)){let SC=i(V),x=e(SC).map((D)=>Y(W,D)).filter((D)=>I(D)&&Q(D).isFile()&&Z(D));if(x.length>0){M.push(...x);continue}}O.push(W);continue}if(v.name.startsWith("."))continue;if(v.isFile()&&Z(W))M.push(W)}}return M.sort((F,K)=>F.localeCompare(K))}function kC(C,S){let M=[];for(let O of C){let F=O.trim();if(!F)continue;let K=Y(S,F);if(!I(K))throw Error(`Plugin path does not exist: ${K}`);if(Q(K).isDirectory()){let W=t(K);if(W){M.push(...W);continue}M.push(...a(K));continue}if(!Z(K))throw Error(`Plugin file must use a supported extension (${[...n].join(", ")}): ${K}`);M.push(K)}return M}function CC(C){let S=U(C);if(!I(S))R(S,{recursive:!0})}function mC(C){R(U(C),{recursive:!0}),vC(C,"")}function fC(C){if(C?.trim())return CC(C),U(C);let S=G(g(),"logs");if(!I(S))R(S,{recursive:!0});return S}export{$C as setHomeDirIfUnset,ZC as setHomeDir,BC as setClineDirIfUnset,zC as setClineDir,A as resolveWorkspaceCronSpecsDir,uC as resolveWorkflowsConfigSearchPaths,jC as resolveTeamDataDir,VC as resolveSkillsConfigSearchPaths,_C as resolveSessionDataDir,xC as resolveRulesConfigSearchPaths,AC as resolveProviderSettingsPath,t as resolvePluginModuleEntries,wC as resolvePluginConfigSearchPaths,UC as resolveMcpSettingsPath,bC as resolveHooksConfigSearchPaths,RC as resolveGlobalSettingsPath,P as resolveGlobalCronSpecsDir,qC as resolveExistingFilePath,z as resolveDocumentsExtensionPath,p as resolveDocumentsClineDirectoryPath,c as resolveDbDataDir,b as resolveCronSpecsDir,XC as resolveCronReportsDir,EC as resolveCronEventsDir,NC as resolveCronDbPath,kC as resolveConfiguredPluginModulePaths,T as resolveClineDir,g as resolveClineDataDir,h as resolveAgentsConfigDirPath,JC as resolveAgentConfigSearchPaths,Z as isPluginModulePath,CC as ensureParentDir,fC as ensureHookLogDir,mC as ensureFileExists,a as discoverPluginModulePaths,_ as WORKFLOWS_CONFIG_DIRECTORY_NAME,j as SKILLS_CONFIG_DIRECTORY_NAME,E as RULES_CONFIG_DIRECTORY_NAME,B as HOOKS_CONFIG_DIRECTORY_NAME,s as CLINE_MCP_SETTINGS_FILE_NAME,J as AGENT_CONFIG_DIRECTORY_NAME};
1
+ var FC=Object.defineProperty;var OC=(C)=>C;function IC(C,S){this[C]=OC.bind(null,S)}var dC=(C,S)=>{for(var M in S)FC(C,M,{get:S[M],enumerable:!0,configurable:!0,set:IC.bind(S,M)})};import{existsSync as D,readdirSync as KC}from"node:fs";import{basename as m,dirname as f,join as l}from"node:path";var LC=/[\u00A0\u2000-\u200A\u202F\u205F\u3000]/g,TC=" ";function y(C){return C.normalize("NFC").replace(LC," ")}function _C(C){let S=m(C),M=S.replace(/ (AM|PM)\./gi,`${TC}$1.`);return M===S?C:l(f(C),M)}function WC(C){return C.normalize("NFD")}function k(C){return C.replace(/'/g,"’")}function gC(C){let S=f(C),M=y(m(C));try{for(let F of KC(S))if(y(F)===M)return l(S,F)}catch{}return}function qC(C){if(D(C))return C;let S=_C(C);if(S!==C&&D(S))return S;let M=WC(C);if(M!==C&&D(M))return M;let F=k(C);if(F!==C&&D(F))return F;let O=k(M);if(O!==M&&O!==F&&D(O))return O;return gC(C)}import{appendFileSync as vC,existsSync as K,mkdirSync as R,readdirSync as DC,readFileSync as EC,statSync as E}from"node:fs";import{homedir as NC}from"node:os";import{dirname as U,join as G,resolve as N}from"node:path";var H=".clinerules",j=".cline",J=".agents",b="agents",Z="hooks",z="skills",A="rules",$="workflows",s="plugins",V="AGENTS.md",d="cline_mcp_settings.json";function QC(){let C=process?.env?.HOME?.trim();if(C&&C!=="~")return C;let S=process?.env?.USERPROFILE?.trim();if(S)return S;let M=process?.env?.HOMEDRIVE?.trim(),F=process?.env?.HOMEPATH?.trim();if(M&&F)return`${M}${F}`;let O=NC().trim();if(O&&O!=="~")return O;return"~"}var W=QC(),o=!1;function YC(C){let S=C.trim();if(!S)return;W=S,o=!0}function ZC(C){if(o)return;let S=C.trim();if(!S)return;W=S}var B,p=!1;function $C(C){let S=C.trim();if(!S)return;B=S,p=!0}function zC(C){if(p)return;let S=C.trim();if(!S)return;B=S}function L(){if(B)return B;let C=process.env.CLINE_DIR?.trim();if(C)return C;return G(W,".cline")}function c(){return G(W,"Documents","Cline")}function Y(C){return G(c(),C)}function _(){let C=process.env.CLINE_DATA_DIR?.trim();if(C)return C;return G(L(),"data")}function BC(){let C=process.env.CLINE_SESSION_DATA_DIR?.trim();if(C)return C;return G(_(),"sessions")}function jC(){let C=process.env.CLINE_TEAM_DATA_DIR?.trim();if(C)return C;return G(_(),"teams")}function P(){let C=process.env.CLINE_DB_DATA_DIR?.trim();if(C)return C;return G(_(),"db")}function AC(){let C=process.env.CLINE_CRON_DB_PATH?.trim();if(C)return C;return G(P(),"cron.db")}function h(){return G(L(),"cron")}function X(C){return G(C,".cline","cron")}function x(C){if(typeof C==="string")return X(C);if(C?.cronSpecsDir?.trim())return C.cronSpecsDir.trim();if(C?.scope==="workspace"){let S=C.workspaceRoot?.trim();if(!S)throw Error("workspaceRoot is required for workspace cron scope");return X(S)}return h()}function XC(C){return G(x(C),"reports")}function RC(C){return G(x(C),"events")}function UC(){let C=process.env.CLINE_PROVIDER_SETTINGS_PATH?.trim();if(C)return C;return G(_(),"settings","providers.json")}function HC(){let C=process.env.CLINE_GLOBAL_SETTINGS_PATH?.trim();if(C)return C;return G(_(),"settings","global-settings.json")}function JC(){let C=process.env.CLINE_MCP_SETTINGS_PATH?.trim();if(C)return C;return G(_(),"settings",d)}function g(C){let S=new Set,M=[];for(let F of C){if(!F||S.has(F))continue;S.add(F),M.push(F)}return M}function bC(C){if(!C)return[];return[H,j,J].map((S)=>G(C,S,z))}function n(){return G(L(),b)}function VC(C){return g([C?G(C,j,b):"",n()])}function xC(C){let S=[Y("Hooks"),G(L(),Z)];if(C)S.push(G(C,H,Z),G(C,j,Z));return g(S)}function uC(C){return g([...bC(C),G(L(),z),G(W,J,z)])}function r(){return G(W,J,V)}function wC(C){let S=C?[G(C,H),G(C,j,A)]:[],M=C?[G(C,V)]:[];return g([...M,...S,r(),G(L(),A),Y("Rules")])}function yC(C){return g([C?G(C,".clinerules",$):"",Y("Workflows"),G(L(),$),C?G(C,".cline",$):""])}function kC(C){return g([C?G(C,".cline",s):"",G(L(),s),Y("Plugins")])}var i=new Set([".js",".ts"]),e="package.json",mC=["index.ts","index.js"];function Q(C){let S=C.lastIndexOf(".");if(S===-1)return!1;return i.has(C.slice(S))}function t(C){try{let S=JSON.parse(EC(C,"utf8"));if(!S.cline||typeof S.cline!=="object")return null;return S.cline}catch{return null}}function a(C){let S=C?.plugins;if(!Array.isArray(S))return[];return S.flatMap((M)=>M.paths??[])}function CC(C){let S=N(C);if(!K(S)||!E(S).isDirectory())return null;let M=G(S,e);if(K(M)){let F=t(M),O=a(F).map((I)=>N(S,I)).filter((I)=>K(I)&&E(I).isFile()&&Q(I));if(O.length>0)return O}for(let F of mC){let O=G(S,F);if(K(O)&&E(O).isFile())return[O]}return null}function SC(C){let S=N(C);if(!K(S))return[];let M=[],F=[S];while(F.length>0){let O=F.pop();if(!O)continue;let I;try{I=DC(O,{withFileTypes:!0})}catch{continue}for(let q of I){let T=G(O,q.name);if(q.isDirectory()){let u=G(T,e);if(K(u)){let MC=t(u),w=a(MC).map((v)=>N(T,v)).filter((v)=>K(v)&&E(v).isFile()&&Q(v));if(w.length>0){M.push(...w);continue}}F.push(T);continue}if(q.name.startsWith("."))continue;if(q.isFile()&&Q(T))M.push(T)}}return M.sort((O,I)=>O.localeCompare(I))}function fC(C,S){let M=[];for(let F of C){let O=F.trim();if(!O)continue;let I=N(S,O);if(!K(I))throw Error(`Plugin path does not exist: ${I}`);if(E(I).isDirectory()){let T=CC(I);if(T){M.push(...T);continue}M.push(...SC(I));continue}if(!Q(I))throw Error(`Plugin file must use a supported extension (${[...i].join(", ")}): ${I}`);M.push(I)}return M}function GC(C){let S=U(C);if(!K(S))R(S,{recursive:!0})}function lC(C){R(U(C),{recursive:!0}),vC(C,"")}function sC(C){if(C?.trim())return GC(C),U(C);let S=G(_(),"logs");if(!K(S))R(S,{recursive:!0});return S}export{ZC as setHomeDirIfUnset,YC as setHomeDir,zC as setClineDirIfUnset,$C as setClineDir,X as resolveWorkspaceCronSpecsDir,yC as resolveWorkflowsConfigSearchPaths,jC as resolveTeamDataDir,uC as resolveSkillsConfigSearchPaths,BC as resolveSessionDataDir,wC as resolveRulesConfigSearchPaths,UC as resolveProviderSettingsPath,CC as resolvePluginModuleEntries,kC as resolvePluginConfigSearchPaths,JC as resolveMcpSettingsPath,xC as resolveHooksConfigSearchPaths,HC as resolveGlobalSettingsPath,h as resolveGlobalCronSpecsDir,r as resolveGlobalAgentsRulesPath,qC as resolveExistingFilePath,Y as resolveDocumentsExtensionPath,c as resolveDocumentsClineDirectoryPath,P as resolveDbDataDir,x as resolveCronSpecsDir,XC as resolveCronReportsDir,RC as resolveCronEventsDir,AC as resolveCronDbPath,fC as resolveConfiguredPluginModulePaths,L as resolveClineDir,_ as resolveClineDataDir,n as resolveAgentsConfigDirPath,VC as resolveAgentConfigSearchPaths,Q as isPluginModulePath,GC as ensureParentDir,sC as ensureHookLogDir,lC as ensureFileExists,SC as discoverPluginModulePaths,$ as WORKFLOWS_CONFIG_DIRECTORY_NAME,z as SKILLS_CONFIG_DIRECTORY_NAME,A as RULES_CONFIG_DIRECTORY_NAME,Z as HOOKS_CONFIG_DIRECTORY_NAME,d as CLINE_MCP_SETTINGS_FILE_NAME,b as AGENT_CONFIG_DIRECTORY_NAME,V as AGENTS_RULES_FILE_NAME};
@@ -4,6 +4,7 @@ export declare const SKILLS_CONFIG_DIRECTORY_NAME = "skills";
4
4
  export declare const RULES_CONFIG_DIRECTORY_NAME = "rules";
5
5
  export declare const WORKFLOWS_CONFIG_DIRECTORY_NAME = "workflows";
6
6
  export declare const PLUGINS_DIRECTORY_NAME = "plugins";
7
+ export declare const AGENTS_RULES_FILE_NAME = "AGENTS.md";
7
8
  export declare const CLINE_MCP_SETTINGS_FILE_NAME = "cline_mcp_settings.json";
8
9
  export declare function setHomeDir(dir: string): void;
9
10
  export declare function setHomeDirIfUnset(dir: string): void;
@@ -73,6 +74,7 @@ export declare function resolveAgentsConfigDirPath(): string;
73
74
  export declare function resolveAgentConfigSearchPaths(workspacePath?: string): string[];
74
75
  export declare function resolveHooksConfigSearchPaths(workspacePath?: string): string[];
75
76
  export declare function resolveSkillsConfigSearchPaths(workspacePath?: string): string[];
77
+ export declare function resolveGlobalAgentsRulesPath(): string;
76
78
  export declare function resolveRulesConfigSearchPaths(workspacePath?: string): string[];
77
79
  export declare function resolveWorkflowsConfigSearchPaths(workspacePath?: string): string[];
78
80
  export declare function resolvePluginConfigSearchPaths(workspacePath?: string): string[];
@@ -1,9 +1,11 @@
1
- /** A single recorded HTTP interaction (nock-compatible shape). */
1
+ /** A single recorded HTTP interaction. */
2
2
  export interface VcrRecording {
3
3
  scope: string;
4
4
  method: string;
5
5
  path: string;
6
6
  body?: string;
7
+ /** Sanitized canonical request body used as an optional playback contract. */
8
+ requestBody?: string;
7
9
  status: number;
8
10
  response: unknown;
9
11
  responseIsBinary: boolean;
package/dist/vcr.d.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  * enabling deterministic testing without making real API calls.
6
6
  *
7
7
  * Unlike nock (which patches Node's `http` module), this works by wrapping
8
- * `globalThis.fetch` directly catching all HTTP traffic in this codebase
8
+ * `globalThis.fetch` directly, catching all HTTP traffic in this codebase
9
9
  * including calls made through the OpenAI, Anthropic, Gemini, and Vercel AI
10
10
  * SDKs (all of which delegate to the global fetch).
11
11
  *
@@ -17,6 +17,8 @@
17
17
  * contains this substring are recorded/replayed; all other
18
18
  * requests pass through to the real network.
19
19
  * When empty or unset, ALL requests are intercepted (no filter).
20
+ * CLINE_VCR_INCLUDE_REQUEST_BODY - "1" to save sanitized request bodies and
21
+ * assert them during playback.
20
22
  * CLINE_VCR_SSE_DELAY - Milliseconds between SSE chunks during playback (default: 100).
21
23
  * Set to 0 for instant delivery.
22
24
  *
@@ -24,7 +26,7 @@
24
26
  * # Record only inference requests
25
27
  * CLINE_VCR=record CLINE_VCR_CASSETTE=./fixtures/my-test.json cline task "hello"
26
28
  *
27
- * # Replay auth/S3/etc. requests go through normally, only inference is mocked
29
+ * # Replay: auth/S3/etc. requests go through normally, only inference is mocked
28
30
  * CLINE_VCR=playback CLINE_VCR_CASSETTE=./fixtures/my-test.json cline task "hello"
29
31
  *
30
32
  * # Record everything (no filter)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cline/shared",
3
- "version": "0.0.42",
3
+ "version": "0.0.43",
4
4
  "description": "Shared utilities, types, and schemas for Cline packages",
5
5
  "repository": {
6
6
  "type": "git",