@clinebot/shared 0.0.8 → 0.0.10

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 +1 @@
1
- export { AGENT_CONFIG_DIRECTORY_NAME, CLINE_MCP_SETTINGS_FILE_NAME, ensureHookLogDir, ensureParentDir, HOOKS_CONFIG_DIRECTORY_NAME, RULES_CONFIG_DIRECTORY_NAME, resolveAgentConfigSearchPaths, resolveAgentsConfigDirPath, resolveClineDataDir, resolveDocumentsAgentConfigDirectoryPath, resolveDocumentsClineDirectoryPath, resolveDocumentsHooksDirectoryPath, resolveDocumentsRulesDirectoryPath, resolveDocumentsWorkflowsDirectoryPath, resolveHooksConfigSearchPaths, resolveMcpSettingsPath, resolvePluginConfigSearchPaths, resolveProviderSettingsPath, resolveRulesConfigSearchPaths, resolveSessionDataDir, resolveSkillsConfigSearchPaths, resolveTeamDataDir, resolveWorkflowsConfigSearchPaths, SKILLS_CONFIG_DIRECTORY_NAME, setHomeDir, setHomeDirIfUnset, WORKFLOWS_CONFIG_DIRECTORY_NAME, } from "./paths";
1
+ export { AGENT_CONFIG_DIRECTORY_NAME, CLINE_MCP_SETTINGS_FILE_NAME, ensureHookLogDir, ensureParentDir, HOOKS_CONFIG_DIRECTORY_NAME, RULES_CONFIG_DIRECTORY_NAME, resolveAgentConfigSearchPaths, resolveAgentsConfigDirPath, resolveClineDataDir, resolveClineDir, resolveDocumentsAgentConfigDirectoryPath, resolveDocumentsClineDirectoryPath, resolveDocumentsHooksDirectoryPath, resolveDocumentsRulesDirectoryPath, resolveDocumentsWorkflowsDirectoryPath, resolveHooksConfigSearchPaths, resolveMcpSettingsPath, resolvePluginConfigSearchPaths, resolveProviderSettingsPath, resolveRulesConfigSearchPaths, resolveSessionDataDir, resolveSkillsConfigSearchPaths, resolveTeamDataDir, resolveWorkflowsConfigSearchPaths, SKILLS_CONFIG_DIRECTORY_NAME, setClineDir, setClineDirIfUnset, setHomeDir, setHomeDirIfUnset, WORKFLOWS_CONFIG_DIRECTORY_NAME, } from "./paths";
@@ -1 +1 @@
1
- var L=Object.defineProperty;var U=(o)=>o;function W(o,n){this[o]=U.bind(null,n)}var x=(o,n)=>{for(var S in n)L(o,S,{get:n[S],enumerable:!0,configurable:!0,set:W.bind(n,S)})};import{existsSync as _,mkdirSync as O}from"node:fs";import{dirname as R,join as v}from"node:path";var l="agents",E="hooks",g="skills",G="rules",I="workflows",A="plugins",y="cline_mcp_settings.json",D=process?.env?.HOME||"~",F=!1;function Y(o){let n=o.trim();if(!n)return;D=n,F=!0}function b(o){if(F)return;let n=o.trim();if(!n)return;D=n}function N(){return v(D,"Documents","Cline")}function H(){return v(N(),"Agents")}function M(){return v(N(),"Hooks")}function T(){return v(N(),"Rules")}function e(){return v(N(),"Workflows")}function C(){let o=process.env.CLINE_DATA_DIR?.trim();if(o)return o;return v(D,".cline","data")}function j(){let o=process.env.CLINE_SESSION_DATA_DIR?.trim();if(o)return o;return v(C(),"sessions")}function m(){let o=process.env.CLINE_TEAM_DATA_DIR?.trim();if(o)return o;return v(C(),"teams")}function q(){let o=process.env.CLINE_PROVIDER_SETTINGS_PATH?.trim();if(o)return o;return v(C(),"settings","providers.json")}function z(){let o=process.env.CLINE_MCP_SETTINGS_PATH?.trim();if(o)return o;return v(C(),"settings",y)}function s(o){let n=new Set,S=[];for(let u of o){if(!u||n.has(u))continue;n.add(u),S.push(u)}return S}function B(o){if(!o)return[];return[v(o,".clinerules",g),v(o,".cline",g),v(o,".claude",g),v(o,".agents",g)]}function f(){return v(C(),"settings",l)}function J(){return[H(),f()]}function Q(o){return s([o?v(o,".clinerules",E):"",M()])}function V(o){return s([...B(o),v(C(),"settings",g),v(D,".cline",g),v(D,".agents",g)])}function Z(o){return s([o?v(o,".clinerules"):"",v(C(),"settings",G),T()])}function $(o){return s([o?v(o,".clinerules","workflows"):"",v(C(),"settings",I),e()])}function X(o){return s([o?v(o,".clinerules",A):"",v(D,".cline",A),v(D,".agents",A)])}function K(o){let n=R(o);if(!_(n))O(n,{recursive:!0})}function r(o){if(o?.trim())return K(o),R(o);let n=v(C(),"hooks");if(!_(n))O(n,{recursive:!0});return n}export{b as setHomeDirIfUnset,Y as setHomeDir,$ as resolveWorkflowsConfigSearchPaths,m as resolveTeamDataDir,V as resolveSkillsConfigSearchPaths,j as resolveSessionDataDir,Z as resolveRulesConfigSearchPaths,q as resolveProviderSettingsPath,X as resolvePluginConfigSearchPaths,z as resolveMcpSettingsPath,Q as resolveHooksConfigSearchPaths,e as resolveDocumentsWorkflowsDirectoryPath,T as resolveDocumentsRulesDirectoryPath,M as resolveDocumentsHooksDirectoryPath,N as resolveDocumentsClineDirectoryPath,H as resolveDocumentsAgentConfigDirectoryPath,C as resolveClineDataDir,f as resolveAgentsConfigDirPath,J as resolveAgentConfigSearchPaths,K as ensureParentDir,r as ensureHookLogDir,I as WORKFLOWS_CONFIG_DIRECTORY_NAME,g as SKILLS_CONFIG_DIRECTORY_NAME,G as RULES_CONFIG_DIRECTORY_NAME,E as HOOKS_CONFIG_DIRECTORY_NAME,y as CLINE_MCP_SETTINGS_FILE_NAME,l as AGENT_CONFIG_DIRECTORY_NAME};
1
+ var j=Object.defineProperty;var q=(o)=>o;function z(o,v){this[o]=q.bind(null,v)}var i=(o,v)=>{for(var S in v)j(o,S,{get:v[S],enumerable:!0,configurable:!0,set:z.bind(v,S)})};import{existsSync as G,mkdirSync as e}from"node:fs";import{dirname as y,join as n}from"node:path";var F="agents",H="hooks",g="skills",M="rules",f="workflows",O="plugins",T="cline_mcp_settings.json",s=process?.env?.HOME||"~",_=!1;function B(o){let v=o.trim();if(!v)return;s=v,_=!0}function J(o){if(_)return;let v=o.trim();if(!v)return;s=v}var A,K=!1;function Q(o){let v=o.trim();if(!v)return;A=v,K=!0}function V(o){if(K)return;let v=o.trim();if(!v)return;A=v}function N(){if(A)return A;let o=process.env.CLINE_DIR?.trim();if(o)return o;return n(s,".cline")}function D(){return n(s,"Documents","Cline")}function R(){return n(D(),"Agents")}function U(){return n(D(),"Hooks")}function E(){return n(D(),"Rules")}function W(){return n(D(),"Workflows")}function C(){let o=process.env.CLINE_DATA_DIR?.trim();if(o)return o;return n(N(),"data")}function Z(){let o=process.env.CLINE_SESSION_DATA_DIR?.trim();if(o)return o;return n(C(),"sessions")}function $(){let o=process.env.CLINE_TEAM_DATA_DIR?.trim();if(o)return o;return n(C(),"teams")}function I(){let o=process.env.CLINE_PROVIDER_SETTINGS_PATH?.trim();if(o)return o;return n(C(),"settings","providers.json")}function X(){let o=process.env.CLINE_MCP_SETTINGS_PATH?.trim();if(o)return o;return n(C(),"settings",T)}function l(o){let v=new Set,S=[];for(let u of o){if(!u||v.has(u))continue;v.add(u),S.push(u)}return S}function L(o){if(!o)return[];return[n(o,".clinerules",g),n(o,".cline",g),n(o,".claude",g),n(o,".agents",g)]}function Y(){return n(C(),"settings",F)}function m(){return[R(),Y()]}function r(o){return l([o?n(o,".clinerules",H):"",U()])}function x(o){return l([...L(o),n(C(),"settings",g),n(N(),g),n(s,".agents",g)])}function k(o){return l([o?n(o,".clinerules"):"",n(C(),"settings",M),E()])}function h(o){return l([o?n(o,".clinerules","workflows"):"",n(C(),"settings",f),W()])}function P(o){return l([o?n(o,".clinerules",O):"",n(N(),O),n(s,".agents",O)])}function b(o){let v=y(o);if(!G(v))e(v,{recursive:!0})}function c(o){if(o?.trim())return b(o),y(o);let v=n(C(),"hooks");if(!G(v))e(v,{recursive:!0});return v}export{J as setHomeDirIfUnset,B as setHomeDir,V as setClineDirIfUnset,Q as setClineDir,h as resolveWorkflowsConfigSearchPaths,$ as resolveTeamDataDir,x as resolveSkillsConfigSearchPaths,Z as resolveSessionDataDir,k as resolveRulesConfigSearchPaths,I as resolveProviderSettingsPath,P as resolvePluginConfigSearchPaths,X as resolveMcpSettingsPath,r as resolveHooksConfigSearchPaths,W as resolveDocumentsWorkflowsDirectoryPath,E as resolveDocumentsRulesDirectoryPath,U as resolveDocumentsHooksDirectoryPath,D as resolveDocumentsClineDirectoryPath,R as resolveDocumentsAgentConfigDirectoryPath,N as resolveClineDir,C as resolveClineDataDir,Y as resolveAgentsConfigDirPath,m as resolveAgentConfigSearchPaths,b as ensureParentDir,c as ensureHookLogDir,f as WORKFLOWS_CONFIG_DIRECTORY_NAME,g as SKILLS_CONFIG_DIRECTORY_NAME,M as RULES_CONFIG_DIRECTORY_NAME,H as HOOKS_CONFIG_DIRECTORY_NAME,T as CLINE_MCP_SETTINGS_FILE_NAME,F as AGENT_CONFIG_DIRECTORY_NAME};
@@ -7,6 +7,9 @@ export declare const PLUGINS_DIRECTORY_NAME = "plugins";
7
7
  export declare const CLINE_MCP_SETTINGS_FILE_NAME = "cline_mcp_settings.json";
8
8
  export declare function setHomeDir(dir: string): void;
9
9
  export declare function setHomeDirIfUnset(dir: string): void;
10
+ export declare function setClineDir(dir: string): void;
11
+ export declare function setClineDirIfUnset(dir: string): void;
12
+ export declare function resolveClineDir(): string;
10
13
  export declare function resolveDocumentsClineDirectoryPath(): string;
11
14
  export declare function resolveDocumentsAgentConfigDirectoryPath(): string;
12
15
  export declare function resolveDocumentsHooksDirectoryPath(): string;
package/package.json CHANGED
@@ -1,16 +1,22 @@
1
1
  {
2
2
  "name": "@clinebot/shared",
3
- "version": "0.0.8",
4
- "description": "[INTERNAL] Shared utilities, types, and schemas for Cline packages",
3
+ "version": "0.0.10",
4
+ "description": "Shared utilities, types, and schemas for Cline packages",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "exports": {
9
9
  ".": {
10
+ "browser": "./dist/index.browser.js",
10
11
  "development": "./src/index.ts",
11
12
  "types": "./dist/index.d.ts",
12
13
  "import": "./dist/index.js"
13
14
  },
15
+ "./browser": {
16
+ "development": "./src/index.browser.ts",
17
+ "types": "./dist/index.browser.d.ts",
18
+ "import": "./dist/index.browser.js"
19
+ },
14
20
  "./storage": {
15
21
  "development": "./src/storage/index.ts",
16
22
  "types": "./dist/storage/index.d.ts",
@@ -23,7 +29,8 @@
23
29
  }
24
30
  },
25
31
  "files": [
26
- "dist"
32
+ "dist",
33
+ "src"
27
34
  ],
28
35
  "scripts": {
29
36
  "build": "BUILD_MODE=package bun bun.mts",
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Canonical list of OAuth provider IDs managed by the platform.
3
+ * Derive sets, types, and guards from this single source of truth.
4
+ */
5
+ export const OAUTH_PROVIDER_IDS = ["cline", "oca", "openai-codex"] as const;
6
+
7
+ export type OAuthProviderId = (typeof OAUTH_PROVIDER_IDS)[number];
8
+
9
+ /**
10
+ * Check whether a provider ID is a managed OAuth provider.
11
+ */
12
+ export function isOAuthProviderId(
13
+ providerId: string,
14
+ ): providerId is OAuthProviderId {
15
+ return (OAUTH_PROVIDER_IDS as readonly string[]).includes(providerId);
16
+ }
17
+
18
+ /**
19
+ * Error‑message sub-strings that indicate an auth / credential failure.
20
+ * Used to decide whether a failed API call should trigger an OAuth refresh.
21
+ */
22
+ export const AUTH_ERROR_PATTERNS = [
23
+ "401",
24
+ "403",
25
+ "unauthorized",
26
+ "forbidden",
27
+ "invalid token",
28
+ "expired token",
29
+ "authentication",
30
+ ] as const;
31
+
32
+ /**
33
+ * Returns `true` when `error` looks like an authentication failure
34
+ * *and* the provider is a managed OAuth provider.
35
+ */
36
+ export function isLikelyAuthError(error: unknown, providerId: string): boolean {
37
+ if (!isOAuthProviderId(providerId)) return false;
38
+ const message =
39
+ error instanceof Error ? error.message.toLowerCase() : String(error);
40
+ return AUTH_ERROR_PATTERNS.some((pattern) => message.includes(pattern));
41
+ }
@@ -0,0 +1,29 @@
1
+ import { z } from "zod";
2
+
3
+ export const ConnectorHookEventNameSchema = z.enum([
4
+ "connector.started",
5
+ "connector.stopping",
6
+ "message.received",
7
+ "message.completed",
8
+ "message.failed",
9
+ "session.started",
10
+ "session.reused",
11
+ "thread.reset",
12
+ "schedule.delivery.started",
13
+ "schedule.delivery.sent",
14
+ "schedule.delivery.failed",
15
+ ]);
16
+
17
+ export type ConnectorHookEventName = z.infer<
18
+ typeof ConnectorHookEventNameSchema
19
+ >;
20
+
21
+ export const ConnectorHookEventSchema = z.object({
22
+ adapter: z.string(),
23
+ botUserName: z.string().optional(),
24
+ event: ConnectorHookEventNameSchema,
25
+ payload: z.record(z.string(), z.unknown()),
26
+ ts: z.string(),
27
+ });
28
+
29
+ export type ConnectorHookEvent = z.infer<typeof ConnectorHookEventSchema>;
@@ -0,0 +1,14 @@
1
+ export type {
2
+ SessionSchemaOptions,
3
+ SqliteDb,
4
+ SqliteStatement,
5
+ } from "./sqlite-db";
6
+ export {
7
+ asBool,
8
+ asOptionalString,
9
+ asString,
10
+ ensureSessionSchema,
11
+ loadSqliteDb,
12
+ nowIso,
13
+ toBoolInt,
14
+ } from "./sqlite-db";
@@ -0,0 +1,274 @@
1
+ import { mkdirSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { dirname } from "node:path";
4
+
5
+ export type SqliteStatement = {
6
+ run: (...params: unknown[]) => { changes?: number };
7
+ get: (...params: unknown[]) => Record<string, unknown> | null;
8
+ all: (...params: unknown[]) => Record<string, unknown>[];
9
+ };
10
+
11
+ export type SqliteDb = {
12
+ prepare: (sql: string) => SqliteStatement;
13
+ exec: (sql: string) => void;
14
+ };
15
+
16
+ type BunSqliteDb = {
17
+ query: (sql: string) => {
18
+ run: (...params: unknown[]) => { changes?: number };
19
+ get: (...params: unknown[]) => Record<string, unknown> | null;
20
+ all: (...params: unknown[]) => Record<string, unknown>[];
21
+ };
22
+ exec: (sql: string) => void;
23
+ };
24
+
25
+ type NodeSqliteStatement = {
26
+ run: (...params: unknown[]) => { changes?: number };
27
+ get: (...params: unknown[]) => Record<string, unknown> | undefined;
28
+ all: (...params: unknown[]) => Record<string, unknown>[];
29
+ };
30
+
31
+ type NodeSqliteDb = {
32
+ prepare: (sql: string) => NodeSqliteStatement;
33
+ exec: (sql: string) => void;
34
+ };
35
+
36
+ export function nowIso(): string {
37
+ return new Date().toISOString();
38
+ }
39
+
40
+ export function toBoolInt(value: boolean): number {
41
+ return value ? 1 : 0;
42
+ }
43
+
44
+ export function asString(value: unknown): string {
45
+ return typeof value === "string" ? value : "";
46
+ }
47
+
48
+ export function asOptionalString(value: unknown): string | undefined {
49
+ if (typeof value !== "string") {
50
+ return undefined;
51
+ }
52
+ const trimmed = value.trim();
53
+ return trimmed.length > 0 ? trimmed : undefined;
54
+ }
55
+
56
+ export function asBool(value: unknown): boolean {
57
+ return value === 1 || value === true;
58
+ }
59
+
60
+ export function loadSqliteDb(filePath: string): SqliteDb {
61
+ mkdirSync(dirname(filePath), { recursive: true });
62
+ const require = createRequire(import.meta.url);
63
+ const isBunRuntime =
64
+ typeof (globalThis as { Bun?: unknown }).Bun !== "undefined";
65
+
66
+ if (isBunRuntime) {
67
+ const { Database } = require("bun:sqlite") as {
68
+ Database: new (
69
+ path: string,
70
+ options?: { create?: boolean; strict?: boolean },
71
+ ) => BunSqliteDb;
72
+ };
73
+ const db = new Database(filePath, { create: true });
74
+
75
+ return {
76
+ prepare: (sql: string): SqliteStatement => {
77
+ const query = db.query(sql);
78
+ return {
79
+ run: (...params: unknown[]) => query.run(...params),
80
+ get: (...params: unknown[]) => query.get(...params),
81
+ all: (...params: unknown[]) => query.all(...params),
82
+ };
83
+ },
84
+ exec: (sql: string) => db.exec(sql),
85
+ };
86
+ }
87
+
88
+ try {
89
+ const nodeSqliteModuleName = ["node", ":sqlite"].join("");
90
+ const { DatabaseSync } = require(nodeSqliteModuleName) as {
91
+ DatabaseSync: new (path: string) => NodeSqliteDb;
92
+ };
93
+ const db = new DatabaseSync(filePath);
94
+ return {
95
+ prepare: (sql: string): SqliteStatement => {
96
+ const statement = db.prepare(sql);
97
+ return {
98
+ run: (...params: unknown[]) => statement.run(...params),
99
+ get: (...params: unknown[]) => statement.get(...params) ?? null,
100
+ all: (...params: unknown[]) => statement.all(...params),
101
+ };
102
+ },
103
+ exec: (sql: string) => db.exec(sql),
104
+ };
105
+ } catch {
106
+ // Fall through to better-sqlite3 for older Node runtimes without node:sqlite.
107
+ }
108
+
109
+ // Keep the module name non-literal so browser/SSR bundlers don't try to resolve
110
+ // better-sqlite3 when this Node-only path is not executed.
111
+ const betterSqlite3ModuleName = ["better", "-sqlite3"].join("");
112
+ const BetterSqlite3 = require(betterSqlite3ModuleName) as new (
113
+ path: string,
114
+ ) => SqliteDb;
115
+ return new BetterSqlite3(filePath);
116
+ }
117
+
118
+ export interface SessionSchemaOptions {
119
+ includeLegacyMigrations?: boolean;
120
+ }
121
+
122
+ export function ensureSessionSchema(
123
+ db: SqliteDb,
124
+ options: SessionSchemaOptions = {},
125
+ ): void {
126
+ db.exec("PRAGMA journal_mode = WAL;");
127
+ db.exec("PRAGMA busy_timeout = 5000;");
128
+ db.exec(`
129
+ CREATE TABLE IF NOT EXISTS sessions (
130
+ session_id TEXT PRIMARY KEY,
131
+ source TEXT NOT NULL,
132
+ pid INTEGER NOT NULL,
133
+ started_at TEXT NOT NULL,
134
+ ended_at TEXT,
135
+ exit_code INTEGER,
136
+ status TEXT NOT NULL,
137
+ status_lock INTEGER NOT NULL DEFAULT 0,
138
+ interactive INTEGER NOT NULL,
139
+ provider TEXT NOT NULL,
140
+ model TEXT NOT NULL,
141
+ cwd TEXT NOT NULL,
142
+ workspace_root TEXT NOT NULL,
143
+ team_name TEXT,
144
+ enable_tools INTEGER NOT NULL,
145
+ enable_spawn INTEGER NOT NULL,
146
+ enable_teams INTEGER NOT NULL,
147
+ parent_session_id TEXT,
148
+ parent_agent_id TEXT,
149
+ agent_id TEXT,
150
+ conversation_id TEXT,
151
+ is_subagent INTEGER NOT NULL DEFAULT 0,
152
+ prompt TEXT,
153
+ metadata_json TEXT,
154
+ transcript_path TEXT NOT NULL,
155
+ hook_path TEXT NOT NULL,
156
+ messages_path TEXT,
157
+ updated_at TEXT NOT NULL
158
+ );
159
+ `);
160
+ db.exec(`
161
+ CREATE TABLE IF NOT EXISTS subagent_spawn_queue (
162
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
163
+ root_session_id TEXT NOT NULL,
164
+ parent_agent_id TEXT NOT NULL,
165
+ task TEXT,
166
+ system_prompt TEXT,
167
+ created_at TEXT NOT NULL,
168
+ consumed_at TEXT
169
+ );
170
+ `);
171
+ db.exec(`
172
+ CREATE TABLE IF NOT EXISTS schedules (
173
+ schedule_id TEXT PRIMARY KEY,
174
+ name TEXT NOT NULL,
175
+ cron_pattern TEXT NOT NULL,
176
+ prompt TEXT NOT NULL,
177
+ provider TEXT NOT NULL,
178
+ model TEXT NOT NULL,
179
+ mode TEXT NOT NULL DEFAULT 'act',
180
+ workspace_root TEXT,
181
+ cwd TEXT,
182
+ system_prompt TEXT,
183
+ max_iterations INTEGER,
184
+ timeout_seconds INTEGER,
185
+ max_parallel INTEGER NOT NULL DEFAULT 1,
186
+ enabled INTEGER NOT NULL DEFAULT 1,
187
+ created_at TEXT NOT NULL,
188
+ updated_at TEXT NOT NULL,
189
+ last_run_at TEXT,
190
+ next_run_at TEXT,
191
+ claim_token TEXT,
192
+ claim_started_at TEXT,
193
+ claim_until_at TEXT,
194
+ created_by TEXT,
195
+ tags TEXT,
196
+ metadata_json TEXT
197
+ );
198
+ `);
199
+ db.exec(`
200
+ CREATE TABLE IF NOT EXISTS schedule_executions (
201
+ execution_id TEXT PRIMARY KEY,
202
+ schedule_id TEXT NOT NULL,
203
+ session_id TEXT,
204
+ triggered_at TEXT NOT NULL,
205
+ started_at TEXT,
206
+ ended_at TEXT,
207
+ status TEXT NOT NULL,
208
+ exit_code INTEGER,
209
+ error_message TEXT,
210
+ iterations INTEGER,
211
+ tokens_used INTEGER,
212
+ cost_usd REAL,
213
+ FOREIGN KEY (schedule_id) REFERENCES schedules(schedule_id) ON DELETE CASCADE,
214
+ FOREIGN KEY (session_id) REFERENCES sessions(session_id) ON DELETE SET NULL
215
+ );
216
+ `);
217
+ db.exec(`
218
+ CREATE INDEX IF NOT EXISTS idx_schedule_executions_schedule
219
+ ON schedule_executions(schedule_id, triggered_at DESC);
220
+ `);
221
+ db.exec(`
222
+ CREATE INDEX IF NOT EXISTS idx_schedules_next_run
223
+ ON schedules(enabled, next_run_at);
224
+ `);
225
+
226
+ if (!options.includeLegacyMigrations) {
227
+ return;
228
+ }
229
+
230
+ const columns = db.prepare("PRAGMA table_info(sessions);").all();
231
+ const hasColumn = (name: string): boolean =>
232
+ columns.some((column) => column.name === name);
233
+ if (!hasColumn("workspace_root")) {
234
+ db.exec("ALTER TABLE sessions ADD COLUMN workspace_root TEXT;");
235
+ db.exec(
236
+ "UPDATE sessions SET workspace_root = cwd WHERE workspace_root IS NULL OR workspace_root = '';",
237
+ );
238
+ }
239
+ if (!hasColumn("parent_session_id")) {
240
+ db.exec("ALTER TABLE sessions ADD COLUMN parent_session_id TEXT;");
241
+ }
242
+ if (!hasColumn("parent_agent_id")) {
243
+ db.exec("ALTER TABLE sessions ADD COLUMN parent_agent_id TEXT;");
244
+ }
245
+ if (!hasColumn("agent_id")) {
246
+ db.exec("ALTER TABLE sessions ADD COLUMN agent_id TEXT;");
247
+ }
248
+ if (!hasColumn("conversation_id")) {
249
+ db.exec("ALTER TABLE sessions ADD COLUMN conversation_id TEXT;");
250
+ }
251
+ if (!hasColumn("is_subagent")) {
252
+ db.exec(
253
+ "ALTER TABLE sessions ADD COLUMN is_subagent INTEGER NOT NULL DEFAULT 0;",
254
+ );
255
+ }
256
+ if (!hasColumn("messages_path")) {
257
+ db.exec("ALTER TABLE sessions ADD COLUMN messages_path TEXT;");
258
+ }
259
+ if (!hasColumn("metadata_json")) {
260
+ db.exec("ALTER TABLE sessions ADD COLUMN metadata_json TEXT;");
261
+ }
262
+ const scheduleColumns = db.prepare("PRAGMA table_info(schedules);").all();
263
+ const scheduleHasColumn = (name: string): boolean =>
264
+ scheduleColumns.some((column) => column.name === name);
265
+ if (!scheduleHasColumn("claim_token")) {
266
+ db.exec("ALTER TABLE schedules ADD COLUMN claim_token TEXT;");
267
+ }
268
+ if (!scheduleHasColumn("claim_started_at")) {
269
+ db.exec("ALTER TABLE schedules ADD COLUMN claim_started_at TEXT;");
270
+ }
271
+ if (!scheduleHasColumn("claim_until_at")) {
272
+ db.exec("ALTER TABLE schedules ADD COLUMN claim_until_at TEXT;");
273
+ }
274
+ }
@@ -0,0 +1,131 @@
1
+ export type { OAuthProviderId } from "./auth/constants";
2
+ export {
3
+ AUTH_ERROR_PATTERNS,
4
+ isLikelyAuthError,
5
+ isOAuthProviderId,
6
+ OAUTH_PROVIDER_IDS,
7
+ } from "./auth/constants";
8
+ export type {
9
+ ConnectorHookEvent,
10
+ ConnectorHookEventName,
11
+ } from "./connectors/events";
12
+ export {
13
+ ConnectorHookEventNameSchema,
14
+ ConnectorHookEventSchema,
15
+ } from "./connectors/events";
16
+ export {
17
+ MODELS_DEV_PROVIDER_KEY_ENTRIES,
18
+ MODELS_DEV_PROVIDER_KEY_MAP,
19
+ resolveProviderModelCatalogKeys,
20
+ } from "./llms/model-id";
21
+ export type {
22
+ Tool,
23
+ ToolApprovalRequest,
24
+ ToolApprovalResult,
25
+ ToolCallRecord,
26
+ ToolContext,
27
+ ToolPolicy,
28
+ } from "./llms/tools";
29
+ export { ToolCallRecordSchema, ToolContextSchema } from "./llms/tools";
30
+ export type { BasicLogger } from "./logging/logger";
31
+ export { parseJsonStream, safeJsonStringify } from "./parse/json";
32
+ export { formatHumanReadableDate } from "./parse/time";
33
+ export { validateWithZod, zodToJsonSchema } from "./parse/zod";
34
+ export {
35
+ formatFileContentBlock,
36
+ formatUserInputBlock,
37
+ normalizeUserInput,
38
+ xmlTagsRemoval,
39
+ } from "./prompt/format";
40
+ export type {
41
+ RpcAddProviderActionRequest,
42
+ RpcAgentMode,
43
+ RpcChatAttachmentFile,
44
+ RpcChatAttachments,
45
+ RpcChatMessage,
46
+ RpcChatRunTurnRequest,
47
+ RpcChatRuntimeConfigBase,
48
+ RpcChatRuntimeLoggerConfig,
49
+ RpcChatStartSessionArtifacts,
50
+ RpcChatStartSessionRequest,
51
+ RpcChatStartSessionResponse,
52
+ RpcChatToolCallResult,
53
+ RpcChatTurnResult,
54
+ RpcClineAccountActionRequest,
55
+ RpcClineAccountBalance,
56
+ RpcClineAccountOrganization,
57
+ RpcClineAccountOrganizationBalance,
58
+ RpcClineAccountOrganizationUsageTransaction,
59
+ RpcClineAccountPaymentTransaction,
60
+ RpcClineAccountUsageTransaction,
61
+ RpcClineAccountUser,
62
+ RpcGetProviderModelsActionRequest,
63
+ RpcListProvidersActionRequest,
64
+ RpcOAuthProviderId,
65
+ RpcProviderActionRequest,
66
+ RpcProviderCapability,
67
+ RpcProviderCatalogResponse,
68
+ RpcProviderListItem,
69
+ RpcProviderModel,
70
+ RpcProviderModelsResponse,
71
+ RpcProviderOAuthLoginResponse,
72
+ RpcProviderSettingsActionRequest,
73
+ RpcSaveProviderSettingsActionRequest,
74
+ RpcSessionStorageOptions,
75
+ } from "./rpc/runtime";
76
+ export type {
77
+ TeamProgressCounts,
78
+ TeamProgressLifecycleEvent,
79
+ TeamProgressMemberRole,
80
+ TeamProgressMemberStatus,
81
+ TeamProgressOutcomeFragmentStatus,
82
+ TeamProgressOutcomeStatus,
83
+ TeamProgressProjectionEvent,
84
+ TeamProgressRunStatus,
85
+ TeamProgressSummary,
86
+ TeamProgressTaskStatus,
87
+ } from "./rpc/team-progress";
88
+ export {
89
+ RPC_TEAM_LIFECYCLE_EVENT_TYPE,
90
+ RPC_TEAM_PROGRESS_EVENT_TYPE,
91
+ } from "./rpc/team-progress";
92
+ export type {
93
+ ITelemetryService,
94
+ OpenTelemetryClientConfig,
95
+ TelemetryArray,
96
+ TelemetryMetadata,
97
+ TelemetryObject,
98
+ TelemetryPrimitive,
99
+ TelemetryProperties,
100
+ TelemetryValue,
101
+ } from "./services/telemetry";
102
+ export type { ClineTelemetryServiceConfig } from "./services/telemetry-config";
103
+ export {
104
+ createClineTelemetryServiceConfig,
105
+ createClineTelemetryServiceMetadata,
106
+ } from "./services/telemetry-config";
107
+ export type {
108
+ HookSessionContext,
109
+ HookSessionContextLookup,
110
+ HookSessionContextProvider,
111
+ } from "./session/hook-context";
112
+ export {
113
+ resolveHookLogPath,
114
+ resolveHookSessionContext,
115
+ resolveRootSessionId,
116
+ } from "./session/hook-context";
117
+ export type {
118
+ SessionLineage,
119
+ SessionRuntimeRecordShape,
120
+ SharedSessionStatus,
121
+ } from "./session/records";
122
+ export { SESSION_STATUS_VALUES } from "./session/records";
123
+ export type {
124
+ AgentMode,
125
+ SessionExecutionConfig,
126
+ SessionPromptConfig,
127
+ SessionWorkspaceConfig,
128
+ } from "./session/runtime-config";
129
+ export type { RuntimeEnv } from "./session/runtime-env";
130
+ // VCR is Node-only (uses node:fs, node:path) — excluded from browser build
131
+ export type { VcrRecording } from "./vcr";