@cline/shared 0.0.65 → 0.0.66-nightly.1785294853

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.
@@ -10,10 +10,16 @@ export interface ConnectorPlatformDef {
10
10
  type: "polling" | "webhook" | "hybrid";
11
11
  hint: string;
12
12
  fields: ConnectorFieldDef[];
13
+ /**
14
+ * Adapter-derived flags that may be persisted for fast reconnects but must
15
+ * be regenerated whenever dashboard-managed configuration changes.
16
+ */
17
+ derivedReconnectFlags?: string[];
13
18
  security?: ConnectorSecurityDef;
14
19
  }
15
20
  export interface ConnectorFieldDef {
16
21
  flag: string;
22
+ aliases?: string[];
17
23
  label: string;
18
24
  placeholder?: string;
19
25
  required?: boolean;
@@ -42,6 +48,7 @@ export interface ConnectorSecurityFieldDef {
42
48
  export interface ConnectorSecurityDef {
43
49
  prompt: string;
44
50
  fields: ConnectorSecurityFieldDef[];
51
+ argumentFlags: string[];
45
52
  buildArgs: (values: Record<string, string>) => string[];
46
53
  }
47
54
  export type ConnectorChannel = {
@@ -58,6 +65,7 @@ export type ConnectorChannel = {
58
65
  export type ActiveConnectorRecord = {
59
66
  id: string;
60
67
  type: string;
68
+ instanceId: string;
61
69
  pid: number;
62
70
  hubUrl: string;
63
71
  startedAt?: string;
@@ -81,6 +89,22 @@ export type ConnectorChannelsResponse = {
81
89
  configured: ConfiguredConnectorRecord[];
82
90
  };
83
91
  export declare function shouldIncludeConnectorField(field: ConnectorFieldDef, values: Record<string, string>): boolean;
92
+ /**
93
+ * Build the non-interactive CLI arguments for a validated connector
94
+ * configuration. The channel name itself is intentionally omitted so the
95
+ * arguments can be persisted and reused by any host.
96
+ */
97
+ export declare function buildConnectorConnectArgs(platform: ConnectorPlatformDef, values: Record<string, string>, security?: {
98
+ enabled: boolean;
99
+ values: Record<string, string>;
100
+ }): string[];
101
+ /**
102
+ * Replace dashboard-owned connector and security flags while retaining
103
+ * CLI-only runtime options such as provider, model, cwd, and tool settings.
104
+ */
105
+ export declare function mergeConnectorConnectArgs(platform: ConnectorPlatformDef, existingArgs: string[], configuredArgs: string[], options: {
106
+ replaceSecurityArgs: boolean;
107
+ }): string[];
84
108
  export declare function connectorChannelsFromPlatforms(platforms?: ConnectorPlatformDef[]): ConnectorChannel[];
85
109
  export declare const CONNECTOR_PLATFORMS: ConnectorPlatformDef[];
86
110
  export declare const PLATFORMS: ConnectorPlatformDef[];
@@ -0,0 +1,89 @@
1
+ import { type SqliteDb } from "./sqlite-db";
2
+ export interface ConnectorSecurityConfig {
3
+ enabled: boolean;
4
+ values: Record<string, string>;
5
+ }
6
+ /** Dashboard-managed configuration for a connector channel. */
7
+ export interface ConnectorConfigRecord {
8
+ channel: string;
9
+ type: string;
10
+ values: Record<string, string>;
11
+ security?: ConnectorSecurityConfig;
12
+ configuredAt: string;
13
+ updatedAt: string;
14
+ }
15
+ /** A successfully launched connector instance eligible for auto-reconnect. */
16
+ export interface ConnectorConnectionRecord {
17
+ channel: string;
18
+ instanceId: string;
19
+ connectArgs: string[];
20
+ lastSuccessfulArgs: string[];
21
+ enabled: boolean;
22
+ updatedAt: string;
23
+ lastConnectedAt: string;
24
+ }
25
+ export declare function ensureConnectorSchema(db: SqliteDb): void;
26
+ export interface SqliteConnectorStoreOptions {
27
+ dbPath?: string;
28
+ }
29
+ /**
30
+ * SQLite-backed store for connector configuration and credentials.
31
+ * Replaces the legacy `~/.cline/data/connectors/settings.json` file; any
32
+ * existing legacy file is imported on first open and renamed so the two
33
+ * stores cannot diverge.
34
+ */
35
+ export declare class SqliteConnectorStore {
36
+ private readonly dbPath;
37
+ private db;
38
+ constructor(options?: SqliteConnectorStoreOptions);
39
+ private getRawDb;
40
+ close(): void;
41
+ getConfig(channel: string): ConnectorConfigRecord | undefined;
42
+ listConfigs(): ConnectorConfigRecord[];
43
+ getConnection(channel: string, instanceId: string): ConnectorConnectionRecord | undefined;
44
+ listConnections(channel?: string): ConnectorConnectionRecord[];
45
+ /**
46
+ * Create or update dashboard configuration. If exactly one persisted
47
+ * instance exists, its desired reconnect arguments may be updated
48
+ * atomically. With multiple instances, only the channel-wide dashboard
49
+ * configuration is updated because choosing reconnect args is ambiguous.
50
+ */
51
+ upsertConfig(entry: {
52
+ channel: string;
53
+ type?: string;
54
+ values: Record<string, string>;
55
+ security?: ConnectorSecurityConfig;
56
+ updateConnectArgs?: (existing: {
57
+ config?: ConnectorConfigRecord;
58
+ connection: ConnectorConnectionRecord;
59
+ }) => string[];
60
+ configuredAt?: string;
61
+ updatedAt?: string;
62
+ }): void;
63
+ /**
64
+ * Record a successful `cline connect <channel>` start: keep the exact args
65
+ * (auth flags included) for auto-reconnect and re-enable the channel.
66
+ */
67
+ recordConnected(channel: string, instanceId: string, connectArgs: string[]): void;
68
+ /** Toggle auto-reconnect for one instance or every instance in a channel. */
69
+ setEnabled(channel: string, enabled: boolean, instanceId?: string): void;
70
+ deleteConnection(channel: string, instanceId: string): boolean;
71
+ disableAll(): void;
72
+ /**
73
+ * Remove only dashboard-managed configuration. Persisted CLI instances live
74
+ * in a separate table and are intentionally unaffected.
75
+ */
76
+ deleteConfig(channel: string): boolean;
77
+ /**
78
+ * One-time import of the legacy JSON settings file. Existing DB rows win;
79
+ * the file is renamed (not deleted) afterwards so older builds cannot keep
80
+ * writing to a store that is no longer read.
81
+ */
82
+ private importLegacyJsonSettings;
83
+ }
84
+ /**
85
+ * Convenience wrapper that opens the store, runs `fn`, and always closes the
86
+ * DB handle. Suitable for the infrequent configure/connect/stop operations;
87
+ * long-lived processes that poll the store should hold their own instance.
88
+ */
89
+ export declare function withConnectorStore<T>(fn: (store: SqliteConnectorStore) => T): T;
@@ -1,2 +1,4 @@
1
+ export type { ConnectorConfigRecord, ConnectorConnectionRecord, ConnectorSecurityConfig, SqliteConnectorStoreOptions, } from "./connector-store";
2
+ export { ensureConnectorSchema, SqliteConnectorStore, withConnectorStore, } from "./connector-store";
1
3
  export type { SessionSchemaOptions, SqliteDb, SqliteStatement, } from "./sqlite-db";
2
4
  export { asBool, asOptionalString, asString, ensureSessionSchema, loadSqliteDb, nowIso, toBoolInt, } from "./sqlite-db";
package/dist/db/index.js CHANGED
@@ -1,4 +1,4 @@
1
- var V=Object.defineProperty;var X=(x)=>x;function Z(x,f){this[x]=X.bind(null,f)}var S=(x,f)=>{for(var j in f)V(x,j,{get:f[j],enumerable:!0,configurable:!0,set:Z.bind(f,j)})};import{mkdirSync as $}from"node:fs";import{createRequire as H}from"node:module";import{dirname as W}from"node:path";function J(x){if(x instanceof Error)return x.message;return String(x)}function K(x){if(x&&typeof x==="object"&&"code"in x&&typeof x.code==="string")return x.code;return""}var G=3,U=50;function D(){return new Date().toISOString()}function Q(x){return x?1:0}function I(x){return typeof x==="string"?x:""}function N(x){if(typeof x!=="string")return;let f=x.trim();return f.length>0?f:void 0}function A(x){return x===1||x===!0}function L(x){if(x<=0)return;try{let f=new SharedArrayBuffer(4),j=new Int32Array(f);Atomics.wait(j,0,0,x)}catch{}}function M(x){if(!x||typeof x!=="object")return!1;let f=J(x),j=K(x);return j==="SQLITE_BUSY"||j==="SQLITE_LOCKED"||f.includes("SQLITE_BUSY")||f.includes("SQLITE_LOCKED")||f.includes("database is locked")}function z(x){let f=0;for(;;)try{return x()}catch(j){if(!M(j)||f>=G)throw j;f+=1,L(U*2**(f-1))}}function P(x){return{prepare:(f)=>{let j=x.query(f);return{run:(...k)=>z(()=>j.run(...k)),get:(...k)=>z(()=>j.get(...k)),all:(...k)=>z(()=>j.all(...k))}},exec:(f)=>z(()=>x.exec(f)),close:()=>x.close?.()}}function Y(x){return{prepare:(f)=>{let j=x.prepare(f);return{run:(...k)=>z(()=>j.run(...k)),get:(...k)=>z(()=>j.get(...k)??null),all:(...k)=>z(()=>j.all(...k))}},exec:(f)=>z(()=>x.exec(f)),close:()=>x.close?.()}}function C(x){$(W(x),{recursive:!0});let f=H(import.meta.url);if(typeof globalThis.Bun<"u"){let{Database:k}=f("bun:sqlite");return P(new k(x,{create:!0}))}let j=process.emitWarning;process.emitWarning=(k,...O)=>{if((typeof k==="string"?k:k?.message??"").includes("SQLite"))return;return j.call(process,k,...O)};try{let{DatabaseSync:k}=f(["node",":sqlite"].join(""));return Y(new k(x))}finally{process.emitWarning=j}}var c=[`CREATE TABLE IF NOT EXISTS sessions (
1
+ var UK=Object.defineProperty;var FK=(K)=>K;function GK(K,Z){this[K]=FK.bind(null,Z)}var rK=(K,Z)=>{for(var $ in Z)UK(K,$,{get:Z[$],enumerable:!0,configurable:!0,set:GK.bind(Z,$)})};import{existsSync as lK,readFileSync as cK,renameSync as iK}from"node:fs";import{appendFileSync as YK,existsSync as U,mkdirSync as v,readdirSync as OK,readFileSync as HK,statSync as A}from"node:fs";import{homedir as LK}from"node:os";import{dirname as g,join as Q,resolve as T}from"node:path";var I="workspaces",S="chat";function JK(K){let Z=K.trim(),$=/^[A-Za-z]:[\\/]/.test(Z)||Z.startsWith("\\\\"),j=Z.startsWith("/");if(!$&&!j)return!1;let X=Z.split($?/[\\/]+/:/\/+/).filter(Boolean),W=X.at(-1)??"",V=X.at(-2)??"",z=X.at(-3)??"";return(X.at(-4)??"")===".cline"&&z==="data"&&V==="workspaces"&&W==="chat"}var b=".clinerules",C=".cline",m=".agents",i="agents",E="hooks",k="skills",h="rules",R="workflows",l="plugins",o="AGENTS.md";function jZ(){return Q(G(),I,S)}var BK="cline_mcp_settings.json",MK="settings.json";function qK(){let K=process?.env?.HOME?.trim();if(K&&K!=="~")return K;let Z=process?.env?.USERPROFILE?.trim();if(Z)return Z;let $=process?.env?.HOMEDRIVE?.trim(),j=process?.env?.HOMEPATH?.trim();if($&&j)return`${$}${j}`;let X=LK().trim();if(X&&X!=="~")return X;return"~"}var M=qK(),s=!1;function XZ(K){let Z=K.trim();if(!Z)return;M=Z,s=!0}function QZ(K){if(s)return;let Z=K.trim();if(!Z)return;M=Z}var _,n=!1;function WZ(K){let Z=K.trim();if(!Z)return;_=Z,n=!0}function zZ(K){if(n)return;let Z=K.trim();if(!Z)return;_=Z}function J(){if(_)return _;let K=process.env.CLINE_DIR?.trim();if(K)return K;return Q(M,".cline")}function NK(){return Q(M,"Documents","Cline")}function D(K){return Q(NK(),K)}function G(){let K=process.env.CLINE_DATA_DIR?.trim();if(K)return K;return Q(J(),"data")}function VZ(){let K=process.env.CLINE_SESSION_DATA_DIR?.trim();if(K)return K;return Q(G(),"sessions")}function UZ(){let K=process.env.CLINE_TEAM_DATA_DIR?.trim();if(K)return K;return Q(G(),"teams")}function AK(){let K=process.env.CLINE_CONNECTOR_DATA_DIR?.trim();if(K)return K;return Q(G(),"connectors")}function r(){let K=process.env.CLINE_CONNECTOR_SETTINGS_PATH?.trim();if(K)return K;return Q(AK(),MK)}function t(){let K=process.env.CLINE_DB_DATA_DIR?.trim();if(K)return K;return Q(G(),"db")}function a(){let K=process.env.CLINE_CONNECTORS_DB_PATH?.trim();if(K)return K;return Q(t(),"connectors.db")}function FZ(){let K=process.env.CLINE_CRON_DB_PATH?.trim();if(K)return K;return Q(t(),"cron.db")}function TK(){return Q(J(),"cron")}function c(K){return Q(K,".cline","cron")}function e(K){if(typeof K==="string")return c(K);if(K?.cronSpecsDir?.trim())return K.cronSpecsDir.trim();if(K?.scope==="workspace"){let Z=K.workspaceRoot?.trim();if(!Z)throw Error("workspaceRoot is required for workspace cron scope");return c(Z)}return TK()}function GZ(K){return Q(e(K),"reports")}function JZ(K){return Q(e(K),"events")}function YZ(){let K=process.env.CLINE_PROVIDER_SETTINGS_PATH?.trim();if(K)return K;return Q(G(),"settings","providers.json")}function OZ(){let K=process.env.CLINE_GLOBAL_SETTINGS_PATH?.trim();if(K)return K;return Q(G(),"settings","global-settings.json")}function HZ(){let K=process.env.CLINE_MCP_SETTINGS_PATH?.trim();if(K)return K;return Q(G(),"settings",BK)}function q(K){let Z=new Set,$=[];for(let j of K){if(!j||Z.has(j))continue;Z.add(j),$.push(j)}return $}function xK(K){if(!K)return[];return[b,C,m].map((Z)=>Q(K,Z,k))}function _K(){return Q(J(),i)}function LZ(K){return q([K?Q(K,C,i):"",_K()])}function BZ(K){let Z=[D("Hooks"),Q(J(),E)];if(K)Z.push(Q(K,b,E),Q(K,C,E));return q(Z)}function MZ(K){return q([...xK(K),Q(J(),k),Q(M,m,k)])}function fK(){return Q(M,m,o)}function qZ(K){let Z=K?[Q(K,b),Q(K,C,h)]:[],$=K?[Q(K,o)]:[];return q([...$,...Z,fK(),Q(J(),h),D("Rules")])}function NZ(K){return q([K?Q(K,".clinerules",R):"",D("Workflows"),Q(J(),R),K?Q(K,".cline",R):""])}function AZ(K){return q([K?Q(K,".cline",l):"",Q(J(),l),D("Plugins")])}var KK=new Set([".js",".ts"]),ZK="package.json",CK=["index.ts","index.js"];function f(K){let Z=K.lastIndexOf(".");if(Z===-1)return!1;return KK.has(K.slice(Z))}function $K(K){try{let Z=JSON.parse(HK(K,"utf8"));if(!Z.cline||typeof Z.cline!=="object")return null;return Z.cline}catch{return null}}function jK(K){let Z=K?.plugins;if(!Array.isArray(Z))return[];return Z.flatMap(($)=>$.paths??[])}function DK(K){let Z=T(K);if(!U(Z)||!A(Z).isDirectory())return null;let $=Q(Z,ZK);if(U($)){let j=$K($),X=jK(j).map((W)=>T(Z,W)).filter((W)=>U(W)&&A(W).isFile()&&f(W));if(X.length>0)return X}for(let j of CK){let X=Q(Z,j);if(U(X)&&A(X).isFile())return[X]}return null}function IK(K){let Z=T(K);if(!U(Z))return[];let $=[],j=[Z];while(j.length>0){let X=j.pop();if(!X)continue;let W;try{W=OK(X,{withFileTypes:!0})}catch{continue}for(let V of W){let z=Q(X,V.name);if(V.isDirectory()){let O=Q(z,ZK);if(U(O)){let H=$K(O),d=jK(H).map((N)=>T(z,N)).filter((N)=>U(N)&&A(N).isFile()&&f(N));if(d.length>0){$.push(...d);continue}}j.push(z);continue}if(V.name.startsWith("."))continue;if(V.isFile()&&f(z))$.push(z)}}return $.sort((X,W)=>X.localeCompare(W))}function TZ(K,Z){let $=[];for(let j of K){let X=j.trim();if(!X)continue;let W=T(Z,X);if(!U(W))throw Error(`Plugin path does not exist: ${W}`);if(A(W).isDirectory()){let z=DK(W);if(z){$.push(...z);continue}$.push(...IK(W));continue}if(!f(W))throw Error(`Plugin file must use a supported extension (${[...KK].join(", ")}): ${W}`);$.push(W)}return $}function SK(K){let Z=g(K);if(!U(Z))v(Z,{recursive:!0})}function xZ(K){v(g(K),{recursive:!0}),YK(K,"")}function _Z(K){if(K?.trim())return SK(K),g(K);let Z=Q(G(),"logs");if(!U(Z))v(Z,{recursive:!0});return Z}import{mkdirSync as EK}from"node:fs";import{createRequire as RK}from"node:module";import{dirname as kK}from"node:path";function XK(K){if(K instanceof Error)return K.message;return String(K)}function QK(K){if(K&&typeof K==="object"&&"code"in K&&typeof K.code==="string")return K.code;return""}var vK=3,gK=50;function L(){return new Date().toISOString()}function x(K){return K?1:0}function F(K){return typeof K==="string"?K:""}function y(K){if(typeof K!=="string")return;let Z=K.trim();return Z.length>0?Z:void 0}function bK(K){return K===1||K===!0}function mK(K){if(K<=0)return;try{let Z=new SharedArrayBuffer(4),$=new Int32Array(Z);Atomics.wait($,0,0,K)}catch{}}function yK(K){if(!K||typeof K!=="object")return!1;let Z=XK(K),$=QK(K);return $==="SQLITE_BUSY"||$==="SQLITE_LOCKED"||Z.includes("SQLITE_BUSY")||Z.includes("SQLITE_LOCKED")||Z.includes("database is locked")}function Y(K){let Z=0;for(;;)try{return K()}catch($){if(!yK($)||Z>=vK)throw $;Z+=1,mK(gK*2**(Z-1))}}function uK(K){return{prepare:(Z)=>{let $=K.query(Z);return{run:(...j)=>Y(()=>$.run(...j)),get:(...j)=>Y(()=>$.get(...j)),all:(...j)=>Y(()=>$.all(...j))}},exec:(Z)=>Y(()=>K.exec(Z)),close:()=>K.close?.()}}function PK(K){return{prepare:(Z)=>{let $=K.prepare(Z);return{run:(...j)=>Y(()=>$.run(...j)),get:(...j)=>Y(()=>$.get(...j)??null),all:(...j)=>Y(()=>$.all(...j))}},exec:(Z)=>Y(()=>K.exec(Z)),close:()=>K.close?.()}}function u(K){EK(kK(K),{recursive:!0});let Z=RK(import.meta.url);if(typeof globalThis.Bun<"u"){let{Database:j}=Z("bun:sqlite");return uK(new j(K,{create:!0}))}let $=process.emitWarning;process.emitWarning=(j,...X)=>{if((typeof j==="string"?j:j?.message??"").includes("SQLite"))return;return $.call(process,j,...X)};try{let{DatabaseSync:j}=Z(["node",":sqlite"].join(""));return PK(new j(K))}finally{process.emitWarning=$}}var wK=[`CREATE TABLE IF NOT EXISTS sessions (
2
2
  session_id TEXT PRIMARY KEY,
3
3
  source TEXT NOT NULL,
4
4
  pid INTEGER NOT NULL,
@@ -77,4 +77,51 @@ var V=Object.defineProperty;var X=(x)=>x;function Z(x,f){this[x]=X.bind(null,f)}
77
77
  FOREIGN KEY (session_id) REFERENCES sessions(session_id) ON DELETE SET NULL
78
78
  );`,`CREATE INDEX IF NOT EXISTS idx_schedule_executions_schedule
79
79
  ON schedule_executions(schedule_id, triggered_at DESC);`,`CREATE INDEX IF NOT EXISTS idx_schedules_next_run
80
- ON schedules(enabled, next_run_at);`],T=[{table:"sessions",column:"workspace_root",sql:"ALTER TABLE sessions ADD COLUMN workspace_root TEXT;"},{table:"sessions",column:"parent_session_id",sql:"ALTER TABLE sessions ADD COLUMN parent_session_id TEXT;"},{table:"sessions",column:"parent_agent_id",sql:"ALTER TABLE sessions ADD COLUMN parent_agent_id TEXT;"},{table:"sessions",column:"agent_id",sql:"ALTER TABLE sessions ADD COLUMN agent_id TEXT;"},{table:"sessions",column:"conversation_id",sql:"ALTER TABLE sessions ADD COLUMN conversation_id TEXT;"},{table:"sessions",column:"is_subagent",sql:"ALTER TABLE sessions ADD COLUMN is_subagent INTEGER NOT NULL DEFAULT 0;"},{table:"sessions",column:"messages_path",sql:"ALTER TABLE sessions ADD COLUMN messages_path TEXT;"},{table:"sessions",column:"metadata_json",sql:"ALTER TABLE sessions ADD COLUMN metadata_json TEXT;"},{table:"sessions",column:"transcript_path",sql:"ALTER TABLE sessions ADD COLUMN transcript_path TEXT NOT NULL DEFAULT '';"},{table:"schedules",column:"claim_token",sql:"ALTER TABLE schedules ADD COLUMN claim_token TEXT;"},{table:"schedules",column:"claim_started_at",sql:"ALTER TABLE schedules ADD COLUMN claim_started_at TEXT;"},{table:"schedules",column:"claim_until_at",sql:"ALTER TABLE schedules ADD COLUMN claim_until_at TEXT;"}];function _(x,f){return new Set(x.prepare(`PRAGMA table_info(${f});`).all().map((j)=>j.name))}function B(x,f={}){x.exec("PRAGMA journal_mode = WAL;"),x.exec("PRAGMA busy_timeout = 5000;");for(let O of c)x.exec(O);if(!f.includeLegacyMigrations)return;let j=new Map,k=(O)=>{let F=j.get(O);if(!F)F=_(x,O),j.set(O,F);return F};for(let O of T)if(!k(O.table).has(O.column)){if(x.exec(O.sql),O.column==="workspace_root")x.exec("UPDATE sessions SET workspace_root = cwd WHERE workspace_root IS NULL OR workspace_root = '';");j.delete(O.table)}}export{Q as toBoolInt,D as nowIso,C as loadSqliteDb,B as ensureSessionSchema,I as asString,N as asOptionalString,A as asBool};
80
+ ON schedules(enabled, next_run_at);`],pK=[{table:"sessions",column:"workspace_root",sql:"ALTER TABLE sessions ADD COLUMN workspace_root TEXT;"},{table:"sessions",column:"parent_session_id",sql:"ALTER TABLE sessions ADD COLUMN parent_session_id TEXT;"},{table:"sessions",column:"parent_agent_id",sql:"ALTER TABLE sessions ADD COLUMN parent_agent_id TEXT;"},{table:"sessions",column:"agent_id",sql:"ALTER TABLE sessions ADD COLUMN agent_id TEXT;"},{table:"sessions",column:"conversation_id",sql:"ALTER TABLE sessions ADD COLUMN conversation_id TEXT;"},{table:"sessions",column:"is_subagent",sql:"ALTER TABLE sessions ADD COLUMN is_subagent INTEGER NOT NULL DEFAULT 0;"},{table:"sessions",column:"messages_path",sql:"ALTER TABLE sessions ADD COLUMN messages_path TEXT;"},{table:"sessions",column:"metadata_json",sql:"ALTER TABLE sessions ADD COLUMN metadata_json TEXT;"},{table:"sessions",column:"transcript_path",sql:"ALTER TABLE sessions ADD COLUMN transcript_path TEXT NOT NULL DEFAULT '';"},{table:"schedules",column:"claim_token",sql:"ALTER TABLE schedules ADD COLUMN claim_token TEXT;"},{table:"schedules",column:"claim_started_at",sql:"ALTER TABLE schedules ADD COLUMN claim_started_at TEXT;"},{table:"schedules",column:"claim_until_at",sql:"ALTER TABLE schedules ADD COLUMN claim_until_at TEXT;"}];function dK(K,Z){return new Set(K.prepare(`PRAGMA table_info(${Z});`).all().map(($)=>$.name))}function hK(K,Z={}){K.exec("PRAGMA journal_mode = WAL;"),K.exec("PRAGMA busy_timeout = 5000;");for(let X of wK)K.exec(X);if(!Z.includeLegacyMigrations)return;let $=new Map,j=(X)=>{let W=$.get(X);if(!W)W=dK(K,X),$.set(X,W);return W};for(let X of pK)if(!j(X.table).has(X.column)){if(K.exec(X.sql),X.column==="workspace_root")K.exec("UPDATE sessions SET workspace_root = cwd WHERE workspace_root IS NULL OR workspace_root = '';");$.delete(X.table)}}var oK=`CREATE TABLE IF NOT EXISTS connector_configs (
81
+ channel TEXT PRIMARY KEY,
82
+ type TEXT NOT NULL,
83
+ values_json TEXT NOT NULL DEFAULT '{}',
84
+ security_enabled INTEGER NOT NULL DEFAULT 0,
85
+ security_values_json TEXT NOT NULL DEFAULT '{}',
86
+ configured_at TEXT NOT NULL,
87
+ updated_at TEXT NOT NULL
88
+ );`,sK=`CREATE TABLE IF NOT EXISTS connector_connections (
89
+ channel TEXT NOT NULL,
90
+ instance_id TEXT NOT NULL,
91
+ connect_args_json TEXT NOT NULL,
92
+ last_successful_args_json TEXT NOT NULL,
93
+ enabled INTEGER NOT NULL DEFAULT 1,
94
+ updated_at TEXT NOT NULL,
95
+ last_connected_at TEXT NOT NULL,
96
+ PRIMARY KEY (channel, instance_id)
97
+ );`;function VK(K){K.exec("PRAGMA journal_mode = WAL;"),K.exec("PRAGMA busy_timeout = 5000;"),K.exec(oK),K.exec(sK)}function B(K){return typeof K==="object"&&K!==null&&!Array.isArray(K)}function WK(K){if(typeof K!=="string"||!K)return{};try{let Z=JSON.parse(K);if(!B(Z))return{};let $={};for(let[j,X]of Object.entries(Z))if(typeof X==="string")$[j]=X;return $}catch{return{}}}function zK(K){if(typeof K!=="string"||!K)return;try{let Z=JSON.parse(K);if(!Array.isArray(Z))return;return Z.filter(($)=>typeof $==="string")}catch{return}}class p{dbPath;db;constructor(K={}){this.dbPath=K.dbPath??a()}getRawDb(){if(this.db)return this.db;let K=u(this.dbPath);return VK(K),this.db=K,this.importLegacyJsonSettings(),K}close(){this.db?.close?.(),this.db=void 0}getConfig(K){let Z=this.getRawDb().prepare("SELECT * FROM connector_configs WHERE channel = ?").get(K);return Z?P(Z):void 0}listConfigs(){return this.getRawDb().prepare("SELECT * FROM connector_configs ORDER BY channel ASC").all().map(P)}getConnection(K,Z){let $=this.getRawDb().prepare(`SELECT * FROM connector_connections
98
+ WHERE channel = ? AND instance_id = ?`).get(K,Z);return $?w($):void 0}listConnections(K){return(K?this.getRawDb().prepare(`SELECT * FROM connector_connections
99
+ WHERE channel = ?
100
+ ORDER BY instance_id ASC`).all(K):this.getRawDb().prepare(`SELECT * FROM connector_connections
101
+ ORDER BY channel ASC, instance_id ASC`).all()).map(w)}upsertConfig(K){let Z=L(),$=this.getRawDb();$.exec("BEGIN IMMEDIATE;");try{let j=$.prepare("SELECT * FROM connector_configs WHERE channel = ?").get(K.channel),X=j?P(j):void 0,V=$.prepare("SELECT * FROM connector_connections WHERE channel = ?").all(K.channel).map(w),z=K.updateConnectArgs&&V.length===1&&V[0]?K.updateConnectArgs({config:X,connection:V[0]}):void 0;if($.prepare(`INSERT INTO connector_configs (
102
+ channel, type, values_json, security_enabled,
103
+ security_values_json, configured_at, updated_at
104
+ ) VALUES (?, ?, ?, ?, ?, ?, ?)
105
+ ON CONFLICT(channel) DO UPDATE SET
106
+ type = excluded.type,
107
+ values_json = excluded.values_json,
108
+ security_enabled = excluded.security_enabled,
109
+ security_values_json = excluded.security_values_json,
110
+ configured_at = excluded.configured_at,
111
+ updated_at = excluded.updated_at`).run(K.channel,K.type??K.channel,JSON.stringify(K.values),x(K.security?.enabled===!0),JSON.stringify(K.security?.values??{}),K.configuredAt??X?.configuredAt??Z,K.updatedAt??Z),z&&V[0])$.prepare(`UPDATE connector_connections
112
+ SET connect_args_json = ?, updated_at = ?
113
+ WHERE channel = ? AND instance_id = ?`).run(JSON.stringify(z),Z,K.channel,V[0].instanceId);$.exec("COMMIT;")}catch(j){try{$.exec("ROLLBACK;")}catch{}throw j}}recordConnected(K,Z,$){let j=L();this.getRawDb().prepare(`INSERT INTO connector_connections (
114
+ channel, instance_id, connect_args_json,
115
+ last_successful_args_json, enabled, updated_at, last_connected_at
116
+ ) VALUES (?, ?, ?, ?, 1, ?, ?)
117
+ ON CONFLICT(channel, instance_id) DO UPDATE SET
118
+ connect_args_json = excluded.connect_args_json,
119
+ last_successful_args_json = excluded.last_successful_args_json,
120
+ enabled = 1,
121
+ updated_at = excluded.updated_at,
122
+ last_connected_at = excluded.last_connected_at`).run(K,Z,JSON.stringify($),JSON.stringify($),j,j)}setEnabled(K,Z,$){if($){this.getRawDb().prepare(`UPDATE connector_connections
123
+ SET enabled = ?, updated_at = ?
124
+ WHERE channel = ? AND instance_id = ?`).run(x(Z),L(),K,$);return}this.getRawDb().prepare(`UPDATE connector_connections
125
+ SET enabled = ?, updated_at = ?
126
+ WHERE channel = ?`).run(x(Z),L(),K)}deleteConnection(K,Z){return(this.getRawDb().prepare(`DELETE FROM connector_connections
127
+ WHERE channel = ? AND instance_id = ?`).run(K,Z).changes??0)>0}disableAll(){this.getRawDb().prepare("UPDATE connector_connections SET enabled = 0, updated_at = ?").run(L())}deleteConfig(K){return(this.getRawDb().prepare("DELETE FROM connector_configs WHERE channel = ?").run(K).changes??0)>0}importLegacyJsonSettings(){let K=r();if(!lK(K))return;try{let Z=JSON.parse(cK(K,"utf8")),$=B(Z)&&B(Z.connectors)?Z.connectors:{};for(let[j,X]of Object.entries($)){if(!B(X)||this.getConfig(j))continue;let W={};if(B(X.values)){for(let[O,H]of Object.entries(X.values))if(typeof H==="string")W[O]=H}let V={},z=B(X.security)?X.security:void 0;if(z&&B(z.values)){for(let[O,H]of Object.entries(z.values))if(typeof H==="string")V[O]=H}this.upsertConfig({channel:j,type:typeof X.type==="string"?X.type:j,values:W,security:z?{enabled:z.enabled===!0,values:V}:void 0,configuredAt:typeof X.configuredAt==="string"?X.configuredAt:void 0,updatedAt:typeof X.updatedAt==="string"?X.updatedAt:void 0})}iK(K,`${K}.migrated`)}catch{}}}function P(K){let Z=K.security_enabled===1,$=WK(K.security_values_json),j=Z||Object.keys($).length>0;return{channel:F(K.channel),type:F(K.type),values:WK(K.values_json),security:j?{enabled:Z,values:$}:void 0,configuredAt:F(K.configured_at),updatedAt:F(K.updated_at)}}function w(K){return{channel:F(K.channel),instanceId:F(K.instance_id),connectArgs:zK(K.connect_args_json)??[],lastSuccessfulArgs:zK(K.last_successful_args_json)??[],enabled:K.enabled===1,updatedAt:F(K.updated_at),lastConnectedAt:y(K.last_connected_at)??F(K.updated_at)}}function nK(K){let Z=new p;try{return K(Z)}finally{Z.close()}}export{nK as withConnectorStore,x as toBoolInt,L as nowIso,u as loadSqliteDb,hK as ensureSessionSchema,VK as ensureConnectorSchema,F as asString,y as asOptionalString,bK as asBool,p as SqliteConnectorStore};
package/dist/hub.d.ts CHANGED
@@ -219,6 +219,13 @@ export interface ScheduleExecutionRecord {
219
219
  tokensUsed?: number;
220
220
  costUsd?: number;
221
221
  }
222
+ export declare const ONE_TIME_SCHEDULE_CRON_PATTERN = "0";
223
+ export declare const ONE_TIME_SCHEDULE_RUN_AT_METADATA_KEY = "__hubScheduleRunAt";
224
+ export declare const HUB_SCHEDULE_MODES: readonly ["act", "plan", "yolo"];
225
+ export type HubScheduleMode = (typeof HUB_SCHEDULE_MODES)[number];
226
+ export declare function isHubScheduleMode(value: unknown): value is HubScheduleMode;
227
+ export declare function readHubScheduleMode(payload: Record<string, unknown> | undefined, defaultWhenAbsent: HubScheduleMode): HubScheduleMode;
228
+ export declare function readHubScheduleMode(payload: Record<string, unknown> | undefined): HubScheduleMode | undefined;
222
229
  export interface HubScheduleCreateInput {
223
230
  name: string;
224
231
  cronPattern: string;
@@ -227,7 +234,7 @@ export interface HubScheduleCreateInput {
227
234
  cwd?: string;
228
235
  modelSelection?: GatewayModelSelection;
229
236
  enabled?: boolean;
230
- mode?: "act" | "plan" | "yolo";
237
+ mode?: HubScheduleMode;
231
238
  systemPrompt?: string;
232
239
  maxIterations?: number;
233
240
  timeoutSeconds?: number;
@@ -246,7 +253,7 @@ export interface HubScheduleUpdateInput {
246
253
  cwd?: string;
247
254
  modelSelection?: GatewayModelSelection;
248
255
  enabled?: boolean;
249
- mode?: "act" | "plan" | "yolo";
256
+ mode?: HubScheduleMode;
250
257
  systemPrompt?: string | null;
251
258
  maxIterations?: number | null;
252
259
  timeoutSeconds?: number | null;
@@ -39,6 +39,7 @@ export type { ClineSystemPromptOptions } from "./prompt/cline";
39
39
  export { buildClineSystemPrompt, MODE_TAG_INSTRUCTIONS, PLAN_MODE_INSTRUCTIONS, } from "./prompt/cline";
40
40
  export type { ModeSwitchNotice, ModeSwitchNoticeTracker, } from "./prompt/format";
41
41
  export { createModeSwitchNoticeTracker, formatDisplayUserInput, formatFileContentBlock, formatModeSwitchNotice, formatUserCommandBlock, formatUserInputBlock, normalizeUserInput, parseUserCommandEnvelope, stripModeNotices, xmlTagsRemoval, } from "./prompt/format";
42
+ export { CLINE_DEFAULT_MODEL_ID } from "./providers/defaults";
42
43
  export { isClineProvider } from "./providers/utils";
43
44
  export { REMOTE_URI_SCHEME } from "./remote-config/constants";
44
45
  export type { AnthropicModel, AnthropicSettings, APIKeySettings, AwsBedrockCustomModel, AwsBedrockModel, AwsBedrockSettings, EnterpriseTelemetry, GlobalInstructionsFile, LiteLLMModel, LiteLLMSettings, MCPServer, OpenAiCompatible, OpenAiCompatibleModel, PromptUploading, ProviderSettings, RemoteConfig, RemoteMCPServer, S3AccessKeySettings, VertexModel, VertexSettings, } from "./remote-config/schema";
@@ -50,8 +51,8 @@ export type { TeamProgressCounts, TeamProgressLifecycleEvent, TeamProgressMember
50
51
  export { TEAM_LIFECYCLE_EVENT_TYPE, TEAM_PROGRESS_EVENT_TYPE, } from "./rpc/team-progress";
51
52
  export type { ClineEnvironment, ClineEnvironmentConfig, ResolveClineEnvironmentOptions, } from "./runtime/cline-environment";
52
53
  export { CLINE_ENVIRONMENT_ENV, CLINE_ENVIRONMENT_OVERRIDE_ENV, CLINE_ENVIRONMENTS, DEFAULT_CLINE_ENVIRONMENT, getClineEnvironmentConfig, resolveClineEnvironment, } from "./runtime/cline-environment";
53
- export type { CaptureAgentUnexpectedReasoningTokensInput, CaptureSdkErrorInput, ITelemetryService, OpenTelemetryClientConfig, SdkTelemetryErrorComponent, SdkTelemetryErrorSeverity, TelemetryArray, TelemetryMetadata, TelemetryObject, TelemetryPrimitive, TelemetryProperties, TelemetryValue, } from "./services/telemetry";
54
- export { AGENT_UNEXPECTED_REASONING_TOKENS_EVENT, buildSdkErrorProperties, captureAgentUnexpectedReasoningTokens, captureSdkError, normalizeSdkError, SDK_ERROR_TELEMETRY_EVENT, } from "./services/telemetry";
54
+ export type { CaptureAgentUnexpectedReasoningTokensInput, CaptureSdkErrorInput, CaptureTaskLifecycleEventInput, ITelemetryService, OpenTelemetryClientConfig, SdkTelemetryErrorComponent, SdkTelemetryErrorSeverity, TelemetryArray, TelemetryMetadata, TelemetryObject, TelemetryPrimitive, TelemetryProperties, TelemetryValue, } from "./services/telemetry";
55
+ export { AGENT_UNEXPECTED_REASONING_TOKENS_EVENT, buildSdkErrorProperties, captureAgentUnexpectedReasoningTokens, captureSdkError, captureTaskLifecycleEvent, normalizeSdkError, SDK_ERROR_TELEMETRY_EVENT, TASK_CANCELLED_EVENT, TASK_FIRST_CHUNK_RECEIVED_EVENT, TASK_PROVIDER_REQUEST_STARTED_EVENT, TASK_PROVIDER_STREAM_FAILED_EVENT, TASK_PROVIDER_STREAM_STARTED_EVENT, } from "./services/telemetry";
55
56
  export type { ClineTelemetryServiceConfig } from "./services/telemetry-config";
56
57
  export { createClineTelemetryServiceConfig, createClineTelemetryServiceMetadata, } from "./services/telemetry-config";
57
58
  export type { HookSessionContext, HookSessionContextLookup, HookSessionContextProvider, } from "./session/hook-context";
@@ -63,6 +64,7 @@ export type { AgentMode, RuntimeConfigExtensionKind, SessionExecutionConfig, Ses
63
64
  export { DEFAULT_RUNTIME_CONFIG_EXTENSIONS, hasRuntimeConfigExtension, isRuntimeConfigExtensionKind, parseRuntimeConfigExtensions, RUNTIME_CONFIG_EXTENSION_KINDS, } from "./session/runtime-config";
64
65
  export type { RuntimeEnv } from "./session/runtime-env";
65
66
  export * from "./session/workspace";
67
+ export { CLINE_CHAT_WORKSPACE_DIRECTORY_NAME, CLINE_WORKSPACES_DIRECTORY_NAME, isChatWorkspacePath, } from "./storage/chat-workspace-paths";
66
68
  export * from "./team";
67
69
  export { createTool } from "./tools/create";
68
70
  export { AUTH_ERROR_PATTERNS, isLikelyAuthError } from "./types/auth";