@cline/shared 0.0.92 → 0.0.93

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.
package/dist/db/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{existsSync as rn,readFileSync as sn,renameSync as on}from"node:fs";import{appendFileSync as ge,existsSync as u,mkdirSync as M,readdirSync as de,readFileSync as J,statSync as S}from"node:fs";import{homedir as Te}from"node:os";import{basename as _e,dirname as O,extname as fe,isAbsolute as Ne,join as o,relative as Ce,resolve as g}from"node:path";var v="workspaces",b="chat";function Ee(e){let n=e.trim(),t=/^[A-Za-z]:[\\/]/.test(n)||n.startsWith("\\\\"),r=n.startsWith("/");if(!t&&!r)return!1;let s=n.split(t?/[\\/]+/:/\/+/).filter(Boolean),i=s.at(-1)??"",c=s.at(-2)??"",a=s.at(-3)??"";return(s.at(-4)??"")===".cline"&&a==="data"&&c==="workspaces"&&i==="chat"}var X=".clinerules",h=".cline",I=".agents",Re=I,Q="agents",y="hooks",P="skills",V="rules",k="workflows",w="plugins",z="AGENTS.md",Se="plugin.json";function Tn(){return o(p(),v,b)}var Le="cline_mcp_settings.json",De="settings.json";function me(){let e=process?.env?.HOME?.trim();if(e&&e!=="~")return e;let n=process?.env?.USERPROFILE?.trim();if(n)return n;let t=process?.env?.HOMEDRIVE?.trim(),r=process?.env?.HOMEPATH?.trim();if(t&&r)return`${t}${r}`;let s=Te().trim();if(s&&s!=="~")return s;return"~"}var d=me(),Z=!1;function _n(e){let n=e.trim();if(!n)return;d=n,Z=!0}function fn(e){if(Z)return;let n=e.trim();if(!n)return;d=n}var m,ee=!1;function Nn(e){let n=e.trim();if(!n)return;m=n,ee=!0}function Cn(e){if(ee)return;let n=e.trim();if(!n)return;m=n}function l(){if(m)return m;let e=process.env.CLINE_DIR?.trim();if(e)return e;return o(d,".cline")}function Ae(){return o(d,"Documents","Cline")}function x(e){return o(Ae(),e)}function p(){let e=process.env.CLINE_DATA_DIR?.trim();if(e)return e;return o(l(),"data")}function Rn(){let e=process.env.CLINE_SESSION_DATA_DIR?.trim();if(e)return e;return o(p(),"sessions")}function Sn(){let e=process.env.CLINE_TEAM_DATA_DIR?.trim();if(e)return e;return o(p(),"teams")}function Oe(){let e=process.env.CLINE_CONNECTOR_DATA_DIR?.trim();if(e)return e;return o(p(),"connectors")}function Ln(e,n){let t=e.replace(/[^a-zA-Z0-9._-]+/g,"_"),r=n.replace(/[^a-zA-Z0-9._-]+/g,"_");return o(p(),"logs","connectors",t,`${r}.log`)}function ne(){let e=process.env.CLINE_CONNECTOR_SETTINGS_PATH?.trim();if(e)return e;return o(Oe(),De)}function G(){let e=process.env.CLINE_DB_DATA_DIR?.trim();if(e)return e;return o(p(),"db")}function te(){let e=process.env.CLINE_CONNECTORS_DB_PATH?.trim();if(e)return e;return o(G(),"connectors.db")}function Dn(){let e=process.env.CLINE_CRON_DB_PATH?.trim();if(e)return e;return o(G(),"cron.db")}function mn(){let e=process.env.CLINE_TASKS_DB_PATH?.trim();if(e)return e;return o(G(),"tasks.db")}function An(){return o(l(),"schedules")}function he(){return o(l(),"tasks")}function Ie(e){let n=e.trim();if(!n)throw Error("workspaceRoot is required for workspace task scope");return o(n,".cline","tasks")}function On(e){let n=e.taskSpecsDir?.trim();if(n)return n;if(e.scope==="workspace")return Ie(e.workspaceRoot??"");return he()}function xe(){return o(l(),"cron")}function K(e){return o(e,".cline","cron")}function re(e){if(typeof e==="string")return K(e);if(e?.cronSpecsDir?.trim())return e.cronSpecsDir.trim();if(e?.scope==="workspace"){let n=e.workspaceRoot?.trim();if(!n)throw Error("workspaceRoot is required for workspace cron scope");return K(n)}return xe()}function hn(e){return o(re(e),"reports")}function In(e){return o(re(e),"events")}function xn(){let e=process.env.CLINE_PROVIDER_SETTINGS_PATH?.trim();if(e)return e;return o(p(),"settings","providers.json")}function vn(){let e=process.env.CLINE_GLOBAL_SETTINGS_PATH?.trim();if(e)return e;return o(p(),"settings","global-settings.json")}function bn(){let e=process.env.CLINE_MCP_SETTINGS_PATH?.trim();if(e)return e;return o(p(),"settings",Le)}function N(e){let n=new Set,t=[];for(let r of e){if(!r||n.has(r))continue;n.add(r),t.push(r)}return t}function ve(e){if(!e)return[];return[X,h,I].map((n)=>o(e,n,P))}function be(){return o(l(),Q)}function yn(e){return N([e?o(e,h,Q):"",be()])}function kn(e){let n=[x("Hooks"),o(l(),y)];if(e)n.push(o(e,X,y),o(e,h,y));return N(n)}function Pn(e){return N([...ve(e),o(l(),P),o(d,I,P)])}function ye(){return o(d,I,z)}function ke(e){return[o(e,X),o(e,h,V)]}function Pe(){let e=[];for(let n of["OneDrive","OneDriveConsumer","OneDriveCommercial"]){let t=process.env[n]?.trim();if(t)e.push(o(t,"Documents"))}return e}function we(){return N([o(l(),V),o(d,"Cline","Rules"),x("Rules"),...Pe().map((e)=>o(e,"Cline","Rules"))])}function wn(e){let n=e?ke(e):[],t=e?[o(e,z)]:[];return N([...t,...n,ye(),...we()])}function Un(e){return N([e?o(e,".clinerules",k):"",x("Workflows"),o(l(),k),e?o(e,".cline",k):""])}function Mn(e){return N([e?o(e,".cline",w):"",o(l(),w),x("Plugins")])}function Xn(){return[o(d,Re,w)]}var se=new Set([".js",".ts"]),F="package.json",Ue=["index.ts","index.js"],Me=new Set(["node_modules"]);function U(e){try{return S(o(e,Se)).isFile()}catch{return!1}}function A(e){let n=e.lastIndexOf(".");if(n===-1)return!1;return se.has(e.slice(n))}function oe(e){try{let n=JSON.parse(J(e,"utf8"));if(!n.cline||typeof n.cline!=="object")return null;return n.cline}catch{return null}}function ie(e){let n=e?.plugins;if(!Array.isArray(n))return[];return n.flatMap((t)=>t.paths??[])}function Xe(e){let n=g(e);if(!u(n)||!S(n).isDirectory())return null;if(U(n))return null;let t=o(n,F);if(u(t)){let r=oe(t),s=ie(r).map((i)=>g(n,i)).filter((i)=>u(i)&&S(i).isFile()&&A(i));if(s.length>0)return s}for(let r of Ue){let s=o(n,r);if(u(s)&&S(s).isFile())return[s]}return null}function Ge(e){try{let n=JSON.parse(J(e,"utf8"));return typeof n.name==="string"&&n.name.trim()?n.name.trim():void 0}catch{return}}function Fe(e,n){let t=Ce(g(e),g(n));return t===""||!t.startsWith("..")&&!Ne(t)}function Gn(e,n){let t=O(e),r=g(n);while(Fe(r,t)){let s=o(t,F);if(u(s)){let c=Ge(s);if(c)return c;break}let i=g(t,"..");if(i===t)break;t=i}return _e(e,fe(e))}function qe(e){let n=g(e);if(!u(n))return[];if(U(n))return[];let t=[],r=[n];while(r.length>0){let s=r.pop();if(!s)continue;let i;try{i=de(s,{withFileTypes:!0})}catch{continue}for(let c of i){let a=o(s,c.name);if(c.isDirectory()){if(U(a))continue;if(Me.has(c.name)||c.name.startsWith("."))continue;let _=o(a,F);if(u(_)){let f=oe(_),H=ie(f).map((L)=>g(a,L)).filter((L)=>u(L)&&S(L).isFile()&&A(L));if(H.length>0){t.push(...H);continue}}r.push(a);continue}if(c.name.startsWith("."))continue;if(c.isFile()&&A(a))t.push(a)}}return t.sort((s,i)=>s.localeCompare(i))}function Fn(e,n){let t=[];for(let r of e){let s=r.trim();if(!s)continue;let i=g(n,s);if(!u(i))throw Error(`Plugin path does not exist: ${i}`);if(S(i).isDirectory()){let a=Xe(i);if(a){t.push(...a);continue}t.push(...qe(i));continue}if(!A(i))throw Error(`Plugin file must use a supported extension (${[...se].join(", ")}): ${i}`);t.push(i)}return t}function Ye(e){let n=O(e);if(!u(n))M(n,{recursive:!0})}function qn(e){M(O(e),{recursive:!0}),ge(e,"")}function Yn(e){if(e?.trim())return Ye(e),O(e);let n=o(p(),"logs");if(!u(n))M(n,{recursive:!0});return n}import{mkdirSync as je}from"node:fs";import{createRequire as Be}from"node:module";import{dirname as We}from"node:path";function ce(e){if(e instanceof Error)return e.message;return String(e)}function ae(e){if(e&&typeof e==="object"&&"code"in e&&typeof e.code==="string")return e.code;return""}var He=3,Ke=50;function C(){return new Date().toISOString()}function D(e){return e?1:0}function E(e){return typeof e==="string"?e:""}function q(e){if(typeof e!=="string")return;let n=e.trim();return n.length>0?n:void 0}function Je(e){return e===1||e===!0}function $e(e){if(e<=0)return;try{let n=new SharedArrayBuffer(4),t=new Int32Array(n);Atomics.wait(t,0,0,e)}catch{}}function Qe(e){if(!e||typeof e!=="object")return!1;let n=ce(e),t=ae(e);return t==="SQLITE_BUSY"||t==="SQLITE_LOCKED"||n.includes("SQLITE_BUSY")||n.includes("SQLITE_LOCKED")||n.includes("database is locked")}function T(e){let n=0;for(;;)try{return e()}catch(t){if(!Qe(t)||n>=He)throw t;n+=1,$e(Ke*2**(n-1))}}function Ve(e){return{prepare:(n)=>{let t=e.query(n);return{run:(...r)=>T(()=>t.run(...r)),get:(...r)=>T(()=>t.get(...r)),all:(...r)=>T(()=>t.all(...r))}},exec:(n)=>T(()=>e.exec(n)),close:()=>e.close?.()}}function ze(e){return{prepare:(n)=>{let t=e.prepare(n);return{run:(...r)=>T(()=>t.run(...r)),get:(...r)=>T(()=>t.get(...r)??null),all:(...r)=>T(()=>t.all(...r))}},exec:(n)=>T(()=>e.exec(n)),close:()=>e.close?.()}}function Y(e){je(We(e),{recursive:!0});let n=Be(import.meta.url);if(typeof globalThis.Bun<"u"){let{Database:r}=n("bun:sqlite");return Ve(new r(e,{create:!0}))}let t=process.emitWarning;process.emitWarning=(r,...s)=>{if((typeof r==="string"?r:r?.message??"").includes("SQLite"))return;return t.call(process,r,...s)};try{let{DatabaseSync:r}=n(["node",":sqlite"].join(""));return ze(new r(e))}finally{process.emitWarning=t}}var Ze=[`CREATE TABLE IF NOT EXISTS sessions (
1
+ import{existsSync as sn,readFileSync as on,renameSync as cn}from"node:fs";import{appendFileSync as ge,existsSync as u,mkdirSync as M,readdirSync as de,readFileSync as J,statSync as S}from"node:fs";import{homedir as Te}from"node:os";import{basename as _e,dirname as O,extname as fe,isAbsolute as Ne,join as o,relative as Ce,resolve as g}from"node:path";var v="workspaces",b="chat";function Ee(e){let n=e.trim(),t=/^[A-Za-z]:[\\/]/.test(n)||n.startsWith("\\\\"),r=n.startsWith("/");if(!t&&!r)return!1;let s=n.split(t?/[\\/]+/:/\/+/).filter(Boolean),i=s.at(-1)??"",c=s.at(-2)??"",a=s.at(-3)??"";return(s.at(-4)??"")===".cline"&&a==="data"&&c==="workspaces"&&i==="chat"}var X=".clinerules",h=".cline",Re=".claude",I=".agents",Se=I,Q="agents",y="hooks",P="skills",V="rules",k="workflows",w="plugins",z="AGENTS.md",Le="plugin.json";function _n(){return o(p(),v,b)}var De="cline_mcp_settings.json",Ae="settings.json";function me(){let e=process?.env?.HOME?.trim();if(e&&e!=="~")return e;let n=process?.env?.USERPROFILE?.trim();if(n)return n;let t=process?.env?.HOMEDRIVE?.trim(),r=process?.env?.HOMEPATH?.trim();if(t&&r)return`${t}${r}`;let s=Te().trim();if(s&&s!=="~")return s;return"~"}var d=me(),Z=!1;function fn(e){let n=e.trim();if(!n)return;d=n,Z=!0}function Nn(e){if(Z)return;let n=e.trim();if(!n)return;d=n}var A,ee=!1;function Cn(e){let n=e.trim();if(!n)return;A=n,ee=!0}function Rn(e){if(ee)return;let n=e.trim();if(!n)return;A=n}function l(){if(A)return A;let e=process.env.CLINE_DIR?.trim();if(e)return e;return o(d,".cline")}function Oe(){return o(d,"Documents","Cline")}function x(e){return o(Oe(),e)}function p(){let e=process.env.CLINE_DATA_DIR?.trim();if(e)return e;return o(l(),"data")}function Sn(){let e=process.env.CLINE_SESSION_DATA_DIR?.trim();if(e)return e;return o(p(),"sessions")}function Ln(){let e=process.env.CLINE_TEAM_DATA_DIR?.trim();if(e)return e;return o(p(),"teams")}function he(){let e=process.env.CLINE_CONNECTOR_DATA_DIR?.trim();if(e)return e;return o(p(),"connectors")}function Dn(e,n){let t=e.replace(/[^a-zA-Z0-9._-]+/g,"_"),r=n.replace(/[^a-zA-Z0-9._-]+/g,"_");return o(p(),"logs","connectors",t,`${r}.log`)}function ne(){let e=process.env.CLINE_CONNECTOR_SETTINGS_PATH?.trim();if(e)return e;return o(he(),Ae)}function G(){let e=process.env.CLINE_DB_DATA_DIR?.trim();if(e)return e;return o(p(),"db")}function te(){let e=process.env.CLINE_CONNECTORS_DB_PATH?.trim();if(e)return e;return o(G(),"connectors.db")}function An(){let e=process.env.CLINE_CRON_DB_PATH?.trim();if(e)return e;return o(G(),"cron.db")}function mn(){let e=process.env.CLINE_TASKS_DB_PATH?.trim();if(e)return e;return o(G(),"tasks.db")}function On(){return o(l(),"schedules")}function Ie(){return o(l(),"tasks")}function xe(e){let n=e.trim();if(!n)throw Error("workspaceRoot is required for workspace task scope");return o(n,".cline","tasks")}function hn(e){let n=e.taskSpecsDir?.trim();if(n)return n;if(e.scope==="workspace")return xe(e.workspaceRoot??"");return Ie()}function ve(){return o(l(),"cron")}function K(e){return o(e,".cline","cron")}function re(e){if(typeof e==="string")return K(e);if(e?.cronSpecsDir?.trim())return e.cronSpecsDir.trim();if(e?.scope==="workspace"){let n=e.workspaceRoot?.trim();if(!n)throw Error("workspaceRoot is required for workspace cron scope");return K(n)}return ve()}function In(e){return o(re(e),"reports")}function xn(e){return o(re(e),"events")}function vn(){let e=process.env.CLINE_PROVIDER_SETTINGS_PATH?.trim();if(e)return e;return o(p(),"settings","providers.json")}function bn(){let e=process.env.CLINE_GLOBAL_SETTINGS_PATH?.trim();if(e)return e;return o(p(),"settings","global-settings.json")}function yn(){let e=process.env.CLINE_MCP_SETTINGS_PATH?.trim();if(e)return e;return o(p(),"settings",De)}function N(e){let n=new Set,t=[];for(let r of e){if(!r||n.has(r))continue;n.add(r),t.push(r)}return t}function be(e){if(!e)return[];return[X,h,Re,I].map((n)=>o(e,n,P))}function ye(){return o(l(),Q)}function kn(e){return N([e?o(e,h,Q):"",ye()])}function Pn(e){let n=[x("Hooks"),o(l(),y)];if(e)n.push(o(e,X,y),o(e,h,y));return N(n)}function wn(e){return N([...be(e),o(l(),P),o(d,I,P)])}function ke(){return o(d,I,z)}function Pe(e){return[o(e,X),o(e,h,V)]}function we(){let e=[];for(let n of["OneDrive","OneDriveConsumer","OneDriveCommercial"]){let t=process.env[n]?.trim();if(t)e.push(o(t,"Documents"))}return e}function Ue(){return N([o(l(),V),o(d,"Cline","Rules"),x("Rules"),...we().map((e)=>o(e,"Cline","Rules"))])}function Un(e){let n=e?Pe(e):[],t=e?[o(e,z)]:[];return N([...t,...n,ke(),...Ue()])}function Mn(e){return N([e?o(e,".clinerules",k):"",x("Workflows"),o(l(),k),e?o(e,".cline",k):""])}function Xn(e){return N([e?o(e,".cline",w):"",o(l(),w),x("Plugins")])}function Gn(){return[o(d,Se,w)]}var se=new Set([".js",".ts"]),F="package.json",Me=["index.ts","index.js"],Xe=new Set(["node_modules"]);function U(e){try{return S(o(e,Le)).isFile()}catch{return!1}}function m(e){let n=e.lastIndexOf(".");if(n===-1)return!1;return se.has(e.slice(n))}function oe(e){try{let n=JSON.parse(J(e,"utf8"));if(!n.cline||typeof n.cline!=="object")return null;return n.cline}catch{return null}}function ie(e){let n=e?.plugins;if(!Array.isArray(n))return[];return n.flatMap((t)=>t.paths??[])}function Ge(e){let n=g(e);if(!u(n)||!S(n).isDirectory())return null;if(U(n))return null;let t=o(n,F);if(u(t)){let r=oe(t),s=ie(r).map((i)=>g(n,i)).filter((i)=>u(i)&&S(i).isFile()&&m(i));if(s.length>0)return s}for(let r of Me){let s=o(n,r);if(u(s)&&S(s).isFile())return[s]}return null}function Fe(e){try{let n=JSON.parse(J(e,"utf8"));return typeof n.name==="string"&&n.name.trim()?n.name.trim():void 0}catch{return}}function qe(e,n){let t=Ce(g(e),g(n));return t===""||!t.startsWith("..")&&!Ne(t)}function Fn(e,n){let t=O(e),r=g(n);while(qe(r,t)){let s=o(t,F);if(u(s)){let c=Fe(s);if(c)return c;break}let i=g(t,"..");if(i===t)break;t=i}return _e(e,fe(e))}function Ye(e){let n=g(e);if(!u(n))return[];if(U(n))return[];let t=[],r=[n];while(r.length>0){let s=r.pop();if(!s)continue;let i;try{i=de(s,{withFileTypes:!0})}catch{continue}for(let c of i){let a=o(s,c.name);if(c.isDirectory()){if(U(a))continue;if(Xe.has(c.name)||c.name.startsWith("."))continue;let _=o(a,F);if(u(_)){let f=oe(_),H=ie(f).map((L)=>g(a,L)).filter((L)=>u(L)&&S(L).isFile()&&m(L));if(H.length>0){t.push(...H);continue}}r.push(a);continue}if(c.name.startsWith("."))continue;if(c.isFile()&&m(a))t.push(a)}}return t.sort((s,i)=>s.localeCompare(i))}function qn(e,n){let t=[];for(let r of e){let s=r.trim();if(!s)continue;let i=g(n,s);if(!u(i))throw Error(`Plugin path does not exist: ${i}`);if(S(i).isDirectory()){let a=Ge(i);if(a){t.push(...a);continue}t.push(...Ye(i));continue}if(!m(i))throw Error(`Plugin file must use a supported extension (${[...se].join(", ")}): ${i}`);t.push(i)}return t}function je(e){let n=O(e);if(!u(n))M(n,{recursive:!0})}function Yn(e){M(O(e),{recursive:!0}),ge(e,"")}function jn(e){if(e?.trim())return je(e),O(e);let n=o(p(),"logs");if(!u(n))M(n,{recursive:!0});return n}import{mkdirSync as Be}from"node:fs";import{createRequire as We}from"node:module";import{dirname as He}from"node:path";function ce(e){if(e instanceof Error)return e.message;return String(e)}function ae(e){if(e&&typeof e==="object"&&"code"in e&&typeof e.code==="string")return e.code;return""}var Ke=3,Je=50;function C(){return new Date().toISOString()}function D(e){return e?1:0}function E(e){return typeof e==="string"?e:""}function q(e){if(typeof e!=="string")return;let n=e.trim();return n.length>0?n:void 0}function $e(e){return e===1||e===!0}function Qe(e){if(e<=0)return;try{let n=new SharedArrayBuffer(4),t=new Int32Array(n);Atomics.wait(t,0,0,e)}catch{}}function Ve(e){if(!e||typeof e!=="object")return!1;let n=ce(e),t=ae(e);return t==="SQLITE_BUSY"||t==="SQLITE_LOCKED"||n.includes("SQLITE_BUSY")||n.includes("SQLITE_LOCKED")||n.includes("database is locked")}function T(e){let n=0;for(;;)try{return e()}catch(t){if(!Ve(t)||n>=Ke)throw t;n+=1,Qe(Je*2**(n-1))}}function ze(e){return{prepare:(n)=>{let t=e.query(n);return{run:(...r)=>T(()=>t.run(...r)),get:(...r)=>T(()=>t.get(...r)),all:(...r)=>T(()=>t.all(...r))}},exec:(n)=>T(()=>e.exec(n)),close:()=>e.close?.()}}function Ze(e){return{prepare:(n)=>{let t=e.prepare(n);return{run:(...r)=>T(()=>t.run(...r)),get:(...r)=>T(()=>t.get(...r)??null),all:(...r)=>T(()=>t.all(...r))}},exec:(n)=>T(()=>e.exec(n)),close:()=>e.close?.()}}function Y(e){Be(He(e),{recursive:!0});let n=We(import.meta.url);if(typeof globalThis.Bun<"u"){let{Database:r}=n("bun:sqlite");return ze(new r(e,{create:!0}))}let t=process.emitWarning;process.emitWarning=(r,...s)=>{if((typeof r==="string"?r:r?.message??"").includes("SQLite"))return;return t.call(process,r,...s)};try{let{DatabaseSync:r}=n(["node",":sqlite"].join(""));return Ze(new r(e))}finally{process.emitWarning=t}}var en=[`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,7 +77,7 @@ import{existsSync as rn,readFileSync as sn,renameSync as on}from"node:fs";import
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);`],en=[{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 nn(e,n){return new Set(e.prepare(`PRAGMA table_info(${n});`).all().map((t)=>t.name))}function tn(e,n={}){e.exec("PRAGMA journal_mode = WAL;"),e.exec("PRAGMA busy_timeout = 5000;");for(let s of Ze)e.exec(s);if(!n.includeLegacyMigrations)return;let t=new Map,r=(s)=>{let i=t.get(s);if(!i)i=nn(e,s),t.set(s,i);return i};for(let s of en)if(!r(s.table).has(s.column)){if(e.exec(s.sql),s.column==="workspace_root")e.exec("UPDATE sessions SET workspace_root = cwd WHERE workspace_root IS NULL OR workspace_root = '';");t.delete(s.table)}}var cn=`CREATE TABLE IF NOT EXISTS connector_configs (
80
+ ON schedules(enabled, next_run_at);`],nn=[{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 tn(e,n){return new Set(e.prepare(`PRAGMA table_info(${n});`).all().map((t)=>t.name))}function rn(e,n={}){e.exec("PRAGMA journal_mode = WAL;"),e.exec("PRAGMA busy_timeout = 5000;");for(let s of en)e.exec(s);if(!n.includeLegacyMigrations)return;let t=new Map,r=(s)=>{let i=t.get(s);if(!i)i=tn(e,s),t.set(s,i);return i};for(let s of nn)if(!r(s.table).has(s.column)){if(e.exec(s.sql),s.column==="workspace_root")e.exec("UPDATE sessions SET workspace_root = cwd WHERE workspace_root IS NULL OR workspace_root = '';");t.delete(s.table)}}var an=`CREATE TABLE IF NOT EXISTS connector_configs (
81
81
  channel TEXT PRIMARY KEY,
82
82
  type TEXT NOT NULL,
83
83
  values_json TEXT NOT NULL DEFAULT '{}',
@@ -85,7 +85,7 @@ import{existsSync as rn,readFileSync as sn,renameSync as on}from"node:fs";import
85
85
  security_values_json TEXT NOT NULL DEFAULT '{}',
86
86
  configured_at TEXT NOT NULL,
87
87
  updated_at TEXT NOT NULL
88
- );`,an=`CREATE TABLE IF NOT EXISTS connector_connections (
88
+ );`,un=`CREATE TABLE IF NOT EXISTS connector_connections (
89
89
  channel TEXT NOT NULL,
90
90
  instance_id TEXT NOT NULL,
91
91
  connect_args_json TEXT NOT NULL,
@@ -94,7 +94,7 @@ import{existsSync as rn,readFileSync as sn,renameSync as on}from"node:fs";import
94
94
  updated_at TEXT NOT NULL,
95
95
  last_connected_at TEXT NOT NULL,
96
96
  PRIMARY KEY (channel, instance_id)
97
- );`;function pe(e){e.exec("PRAGMA journal_mode = WAL;"),e.exec("PRAGMA busy_timeout = 5000;"),e.exec(cn),e.exec(an)}function R(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function ue(e){if(typeof e!=="string"||!e)return{};try{let n=JSON.parse(e);if(!R(n))return{};let t={};for(let[r,s]of Object.entries(n))if(typeof s==="string")t[r]=s;return t}catch{return{}}}function le(e){if(typeof e!=="string"||!e)return;try{let n=JSON.parse(e);if(!Array.isArray(n))return;return n.filter((t)=>typeof t==="string")}catch{return}}class W{dbPath;db;constructor(e={}){this.dbPath=e.dbPath??te()}getRawDb(){if(this.db)return this.db;let e=Y(this.dbPath);return pe(e),this.db=e,this.importLegacyJsonSettings(),e}close(){this.db?.close?.(),this.db=void 0}getConfig(e){let n=this.getRawDb().prepare("SELECT * FROM connector_configs WHERE channel = ?").get(e);return n?j(n):void 0}listConfigs(){return this.getRawDb().prepare("SELECT * FROM connector_configs ORDER BY channel ASC").all().map(j)}getConnection(e,n){let t=this.getRawDb().prepare(`SELECT * FROM connector_connections
97
+ );`;function pe(e){e.exec("PRAGMA journal_mode = WAL;"),e.exec("PRAGMA busy_timeout = 5000;"),e.exec(an),e.exec(un)}function R(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function ue(e){if(typeof e!=="string"||!e)return{};try{let n=JSON.parse(e);if(!R(n))return{};let t={};for(let[r,s]of Object.entries(n))if(typeof s==="string")t[r]=s;return t}catch{return{}}}function le(e){if(typeof e!=="string"||!e)return;try{let n=JSON.parse(e);if(!Array.isArray(n))return;return n.filter((t)=>typeof t==="string")}catch{return}}class W{dbPath;db;constructor(e={}){this.dbPath=e.dbPath??te()}getRawDb(){if(this.db)return this.db;let e=Y(this.dbPath);return pe(e),this.db=e,this.importLegacyJsonSettings(),e}close(){this.db?.close?.(),this.db=void 0}getConfig(e){let n=this.getRawDb().prepare("SELECT * FROM connector_configs WHERE channel = ?").get(e);return n?j(n):void 0}listConfigs(){return this.getRawDb().prepare("SELECT * FROM connector_configs ORDER BY channel ASC").all().map(j)}getConnection(e,n){let t=this.getRawDb().prepare(`SELECT * FROM connector_connections
98
98
  WHERE channel = ? AND instance_id = ?`).get(e,n);return t?B(t):void 0}listConnections(e){return(e?this.getRawDb().prepare(`SELECT * FROM connector_connections
99
99
  WHERE channel = ?
100
100
  ORDER BY instance_id ASC`).all(e):this.getRawDb().prepare(`SELECT * FROM connector_connections
@@ -124,4 +124,4 @@ import{existsSync as rn,readFileSync as sn,renameSync as on}from"node:fs";import
124
124
  WHERE channel = ? AND instance_id = ?`).run(D(n),C(),e,t);return}this.getRawDb().prepare(`UPDATE connector_connections
125
125
  SET enabled = ?, updated_at = ?
126
126
  WHERE channel = ?`).run(D(n),C(),e)}deleteConnection(e,n){return(this.getRawDb().prepare(`DELETE FROM connector_connections
127
- WHERE channel = ? AND instance_id = ?`).run(e,n).changes??0)>0}disableAll(){this.getRawDb().prepare("UPDATE connector_connections SET enabled = 0, updated_at = ?").run(C())}deleteConfig(e){return(this.getRawDb().prepare("DELETE FROM connector_configs WHERE channel = ?").run(e).changes??0)>0}importLegacyJsonSettings(){let e=ne();if(!rn(e))return;try{let n=JSON.parse(sn(e,"utf8")),t=R(n)&&R(n.connectors)?n.connectors:{};for(let[r,s]of Object.entries(t)){if(!R(s)||this.getConfig(r))continue;let i={};if(R(s.values)){for(let[_,f]of Object.entries(s.values))if(typeof f==="string")i[_]=f}let c={},a=R(s.security)?s.security:void 0;if(a&&R(a.values)){for(let[_,f]of Object.entries(a.values))if(typeof f==="string")c[_]=f}this.upsertConfig({channel:r,type:typeof s.type==="string"?s.type:r,values:i,security:a?{enabled:a.enabled===!0,values:c}:void 0,configuredAt:typeof s.configuredAt==="string"?s.configuredAt:void 0,updatedAt:typeof s.updatedAt==="string"?s.updatedAt:void 0})}on(e,`${e}.migrated`)}catch{}}}function j(e){let n=e.security_enabled===1,t=ue(e.security_values_json),r=n||Object.keys(t).length>0;return{channel:E(e.channel),type:E(e.type),values:ue(e.values_json),security:r?{enabled:n,values:t}:void 0,configuredAt:E(e.configured_at),updatedAt:E(e.updated_at)}}function B(e){return{channel:E(e.channel),instanceId:E(e.instance_id),connectArgs:le(e.connect_args_json)??[],lastSuccessfulArgs:le(e.last_successful_args_json)??[],enabled:e.enabled===1,updatedAt:E(e.updated_at),lastConnectedAt:q(e.last_connected_at)??E(e.updated_at)}}function un(e){let n=new W;try{return e(n)}finally{n.close()}}export{W as SqliteConnectorStore,Je as asBool,q as asOptionalString,E as asString,pe as ensureConnectorSchema,tn as ensureSessionSchema,Y as loadSqliteDb,C as nowIso,D as toBoolInt,un as withConnectorStore};
127
+ WHERE channel = ? AND instance_id = ?`).run(e,n).changes??0)>0}disableAll(){this.getRawDb().prepare("UPDATE connector_connections SET enabled = 0, updated_at = ?").run(C())}deleteConfig(e){return(this.getRawDb().prepare("DELETE FROM connector_configs WHERE channel = ?").run(e).changes??0)>0}importLegacyJsonSettings(){let e=ne();if(!sn(e))return;try{let n=JSON.parse(on(e,"utf8")),t=R(n)&&R(n.connectors)?n.connectors:{};for(let[r,s]of Object.entries(t)){if(!R(s)||this.getConfig(r))continue;let i={};if(R(s.values)){for(let[_,f]of Object.entries(s.values))if(typeof f==="string")i[_]=f}let c={},a=R(s.security)?s.security:void 0;if(a&&R(a.values)){for(let[_,f]of Object.entries(a.values))if(typeof f==="string")c[_]=f}this.upsertConfig({channel:r,type:typeof s.type==="string"?s.type:r,values:i,security:a?{enabled:a.enabled===!0,values:c}:void 0,configuredAt:typeof s.configuredAt==="string"?s.configuredAt:void 0,updatedAt:typeof s.updatedAt==="string"?s.updatedAt:void 0})}cn(e,`${e}.migrated`)}catch{}}}function j(e){let n=e.security_enabled===1,t=ue(e.security_values_json),r=n||Object.keys(t).length>0;return{channel:E(e.channel),type:E(e.type),values:ue(e.values_json),security:r?{enabled:n,values:t}:void 0,configuredAt:E(e.configured_at),updatedAt:E(e.updated_at)}}function B(e){return{channel:E(e.channel),instanceId:E(e.instance_id),connectArgs:le(e.connect_args_json)??[],lastSuccessfulArgs:le(e.last_successful_args_json)??[],enabled:e.enabled===1,updatedAt:E(e.updated_at),lastConnectedAt:q(e.last_connected_at)??E(e.updated_at)}}function ln(e){let n=new W;try{return e(n)}finally{n.close()}}export{W as SqliteConnectorStore,$e as asBool,q as asOptionalString,E as asString,pe as ensureConnectorSchema,rn as ensureSessionSchema,Y as loadSqliteDb,C as nowIso,D as toBoolInt,ln as withConnectorStore};
@@ -162,6 +162,24 @@ export interface PluginSetupContext {
162
162
  * it); identity and common-property setters are no-ops.
163
163
  */
164
164
  telemetry?: ITelemetryService;
165
+ /**
166
+ * The session's working directory. Use it instead of `process.cwd()`:
167
+ * plugins loaded in the Hub share one process across sessions.
168
+ */
169
+ cwd?: string;
170
+ /**
171
+ * Sends a plugin event (for example `steer_message`) to the session that
172
+ * set the plugin up. Replaces `globalThis.__clinePluginHost.emitEvent`,
173
+ * which is kept as a shim.
174
+ */
175
+ emitEvent?: (name: string, payload?: unknown) => void;
176
+ /**
177
+ * Registers cleanup to run when the session that set the plugin up ends.
178
+ * Plugins loaded in the Hub share its process, so anything a plugin starts
179
+ * for a session (timers, child processes, sockets, listeners on shared
180
+ * emitters) must be stopped here.
181
+ */
182
+ onDispose?: (cleanup: () => void | Promise<void>) => void;
165
183
  }
166
184
  declare const ExtensionCapabilityOptions: readonly ["hooks", "tools", "commands", "rules", "skills", "messageBuilders", "providers", "automationEvents", "mcp"];
167
185
  export type AgentExtensionCapability = (typeof ExtensionCapabilityOptions)[number];
package/dist/hub.d.ts CHANGED
@@ -7,7 +7,7 @@ export type HubProtocolVersion = "v1";
7
7
  export declare const CURRENT_HUB_PROTOCOL_VERSION: HubProtocolVersion;
8
8
  export declare const MIN_CLIENT_HUB_PROTOCOL_VERSION: HubProtocolVersion;
9
9
  export declare const MAX_CLIENT_HUB_PROTOCOL_VERSION: HubProtocolVersion;
10
- export type HubCapabilityName = "client.register" | "client.list" | "session.create" | "session.list" | "session.get" | "session.run" | "session.abort" | "schedule.create" | "schedule.list" | "task.create" | "task.list" | "task.get" | "task.update" | "task.approve" | "task.cancel" | "task.run" | "task.automation.get" | "task.automation.set" | "settings.get" | "settings.set" | "connector.start" | "connector.stop" | "connector.supervised" | "run.enqueue" | "run.list" | "hub.drain" | "hub.status" | "stream.replay";
10
+ export type HubCapabilityName = "client.register" | "client.list" | "session.create" | "session.list" | "session.get" | "session.run" | "session.abort" | "schedule.create" | "schedule.list" | "task.create" | "task.list" | "task.get" | "task.update" | "task.approve" | "task.cancel" | "task.run" | "task.automation.get" | "task.automation.set" | "settings.get" | "settings.set" | "connector.start" | "connector.stop" | "connector.supervised" | "run.enqueue" | "run.list" | "hub.drain" | "hub.status" | "plugins.list" | "plugins.status" | "plugins.reload" | "stream.replay";
11
11
  export declare const HUB_CAPABILITIES: readonly HubCapabilityName[];
12
12
  export interface HubProtocolMetadata {
13
13
  protocolVersion: string;
@@ -299,6 +299,72 @@ export interface HubSessionSearchHit {
299
299
  snippet: string;
300
300
  score: number;
301
301
  }
302
+ /**
303
+ * Lifecycle state of one plugin module loaded by a host (normally the Hub).
304
+ *
305
+ * - `loading`: the module is being imported.
306
+ * - `ready`: imported and set up without errors.
307
+ * - `degraded`: a hook or tool call failed; the plugin is still called.
308
+ * - `failed`: the last setup failed, or the plugin is off for every session
309
+ * because its import failed, a stray error was attributed to it, or calls
310
+ * kept failing. Only a setup failure lets the next session try again.
311
+ * - `disabled`: turned off in settings; never imported.
312
+ */
313
+ export type PluginRuntimeState = "loading" | "ready" | "degraded" | "failed" | "disabled";
314
+ /**
315
+ * Where a plugin error happened: `discover`, `import`, `setup`, `dispose`,
316
+ * `hook:<name>`, `tool:<name>`, `command:<name>`, `rule:<id>`,
317
+ * `messageBuilder:<name>`, or `uncaught` for a stray exception or rejection
318
+ * the host attributed to the plugin from its stack.
319
+ */
320
+ export type PluginErrorPhase = "discover" | "import" | "setup" | "dispose" | "uncaught" | `hook:${string}` | `tool:${string}` | `command:${string}` | `rule:${string}` | `messageBuilder:${string}`;
321
+ export interface PluginErrorRecord {
322
+ phase: PluginErrorPhase;
323
+ message: string;
324
+ stack?: string;
325
+ pluginPath: string;
326
+ /** Epoch milliseconds. */
327
+ timestamp: number;
328
+ sessionId?: string;
329
+ timedOut?: boolean;
330
+ }
331
+ export interface PluginStatusRecord {
332
+ /** Plugin `name` export, or a name derived from the path before import. */
333
+ name: string;
334
+ pluginPath: string;
335
+ state: PluginRuntimeState;
336
+ lastError?: PluginErrorRecord;
337
+ errorCount: number;
338
+ timeoutCount: number;
339
+ /** Live sessions that set this plugin up. */
340
+ sessionIds: string[];
341
+ capabilities?: string[];
342
+ hooks?: string[];
343
+ /** Epoch milliseconds of the last state or error change. */
344
+ updatedAt: number;
345
+ }
346
+ /**
347
+ * Per-session plugin selection, shaped like `toolPolicies`: `"*"` sets the
348
+ * default and named entries override it for one plugin. Plugins are enabled
349
+ * unless a policy says otherwise.
350
+ */
351
+ export interface PluginPolicy {
352
+ enabled?: boolean;
353
+ }
354
+ export type PluginPolicies = Record<string, PluginPolicy>;
355
+ /** A plugin a session asked for but does not have, reported at session start. */
356
+ export interface SessionPluginIssue {
357
+ name: string;
358
+ pluginPath: string;
359
+ state: PluginRuntimeState;
360
+ /** `session_policy` when the session's `plugins` policy turned it off. */
361
+ reason?: "session_policy" | "settings" | "error";
362
+ lastError?: PluginErrorRecord;
363
+ }
364
+ export interface HubPluginsReloadInput {
365
+ /** Plugin name or absolute module path. */
366
+ plugin: string;
367
+ }
302
368
  /**
303
369
  * Strongly typed task command payloads. This map is intentionally extensible so
304
370
  * other Hub command families can adopt typed payloads without changing the wire
@@ -315,6 +381,9 @@ export interface HubCommandInputMap {
315
381
  "task.run": HubTaskRevisionInput;
316
382
  "task.automation.get": Record<string, never>;
317
383
  "task.automation.set": HubTaskAutomationSetInput;
384
+ "plugins.list": Record<string, never>;
385
+ "plugins.status": Record<string, never>;
386
+ "plugins.reload": HubPluginsReloadInput;
318
387
  }
319
388
  /** Typed task command results returned in {@link HubReplyEnvelope.payload}. */
320
389
  export interface HubCommandOutputMap {
@@ -349,11 +418,20 @@ export interface HubCommandOutputMap {
349
418
  "task.automation.set": {
350
419
  policy: AgendaAutomationPolicy;
351
420
  };
421
+ "plugins.list": {
422
+ plugins: PluginStatusRecord[];
423
+ };
424
+ "plugins.status": {
425
+ plugins: PluginStatusRecord[];
426
+ };
427
+ "plugins.reload": {
428
+ plugins: PluginStatusRecord[];
429
+ };
352
430
  }
353
431
  export type HubTypedCommandName = keyof HubCommandInputMap & HubCommandName;
354
432
  export type HubCommandInput<TCommand extends HubTypedCommandName> = HubCommandInputMap[TCommand];
355
433
  export type HubCommandOutput<TCommand extends HubTypedCommandName> = HubCommandOutputMap[TCommand];
356
- export type HubCommandName = "client.register" | "client.update" | "client.unregister" | "client.list" | "cline.account.get_current" | "prompt_commands.list" | "prompt_commands.execute" | "mention_files.search" | "catalog.list" | "session.list" | "session.search" | "session.create" | "session.attach" | "session.detach" | "session.get" | "session.messages" | "session.restore" | "session.delete" | "session.update" | "session.update_connection" | "session.compaction.get" | "session.compaction.update" | "session.pending_prompts" | "session.steer_first_pending_prompt" | "session.update_pending_prompt" | "session.remove_pending_prompt" | "session.fork" | "session.hook" | "run.start" | "session.send_input" | "run.enqueue" | "run.list" | "run.abort" | "run.proceed_while_running" | "hub.drain" | "hub.status" | "approval.request" | "approval.respond" | "capability.request" | "capability.progress" | "capability.respond" | "peer.register" | "peer.list_sessions" | "peer.attach_session" | "peer.detach_session" | "peer.proxy_command" | "schedule.create" | "schedule.list" | "schedule.get" | "schedule.update" | "schedule.delete" | "schedule.enable" | "schedule.disable" | "schedule.trigger" | "schedule.list_executions" | "schedule.stats" | "schedule.active" | "schedule.upcoming" | "task.create" | "task.list" | "task.get" | "task.update" | "task.approve" | "task.cancel" | "task.run" | "task.automation.get" | "task.automation.set" | "settings.list" | "settings.get" | "settings.patch" | "settings.toggle" | "connector.channels" | "connector.configure" | "connector.delete_config" | "connector.start" | "connector.stop" | "connector.supervised" | "cron.event.ingest" | "cron.event.list" | "cron.event.get" | "ui.notify" | "ui.show_window";
434
+ export type HubCommandName = "client.register" | "client.update" | "client.unregister" | "client.list" | "cline.account.get_current" | "prompt_commands.list" | "prompt_commands.execute" | "mention_files.search" | "catalog.list" | "session.list" | "session.search" | "session.create" | "session.attach" | "session.detach" | "session.get" | "session.messages" | "session.restore" | "session.delete" | "session.update" | "session.update_connection" | "session.compaction.get" | "session.compaction.update" | "session.pending_prompts" | "session.steer_first_pending_prompt" | "session.update_pending_prompt" | "session.remove_pending_prompt" | "session.fork" | "session.hook" | "run.start" | "session.send_input" | "run.enqueue" | "run.list" | "run.abort" | "run.proceed_while_running" | "hub.drain" | "hub.status" | "plugins.list" | "plugins.status" | "plugins.reload" | "approval.request" | "approval.respond" | "capability.request" | "capability.progress" | "capability.respond" | "peer.register" | "peer.list_sessions" | "peer.attach_session" | "peer.detach_session" | "peer.proxy_command" | "schedule.create" | "schedule.list" | "schedule.get" | "schedule.update" | "schedule.delete" | "schedule.enable" | "schedule.disable" | "schedule.trigger" | "schedule.list_executions" | "schedule.stats" | "schedule.active" | "schedule.upcoming" | "task.create" | "task.list" | "task.get" | "task.update" | "task.approve" | "task.cancel" | "task.run" | "task.automation.get" | "task.automation.set" | "settings.list" | "settings.get" | "settings.patch" | "settings.toggle" | "connector.channels" | "connector.configure" | "connector.delete_config" | "connector.start" | "connector.stop" | "connector.supervised" | "cron.event.ingest" | "cron.event.list" | "cron.event.get" | "ui.notify" | "ui.show_window";
357
435
  export declare const HUB_DEFAULT_COMMAND_TIMEOUT_MS = 30000;
358
436
  export declare const HUB_COMMAND_SLOW_LOG_MS = 5000;
359
437
  export declare function getDefaultHubCommandTimeoutMs(command: HubCommandName): number | null;
@@ -378,7 +456,7 @@ export interface HubReplyEnvelope {
378
456
  details?: Record<string, unknown>;
379
457
  };
380
458
  }
381
- export type HubEventName = "hub.client.registered" | "hub.client.disconnected" | "session.created" | "session.updated" | "session.attached" | "session.detached" | "session.forked" | "session.pending_prompts" | "session.pending_prompt_submitted" | "run.started" | "run.heartbeat" | "run.aborted" | "run.completed" | "run.failed" | "run.enqueued" | "run.interrupted" | "hub.drain_changed" | "iteration.started" | "iteration.finished" | "assistant.delta" | "assistant.media" | "assistant.finished" | "session.notice" | "reasoning.delta" | "reasoning.finished" | "agent.done" | "usage.updated" | "tool.started" | "tool.updated" | "tool.finished" | "approval.requested" | "approval.resolved" | "capability.requested" | "capability.resolved" | "team.progress" | "artifact.created" | "diff.created" | "spoke.started" | "spoke.failed" | "spoke.stopped" | "peer.registered" | "peer.session_attached" | "peer.session_detached" | "schedule.created" | "schedule.updated" | "schedule.deleted" | "schedule.triggered" | "schedule.execution_completed" | "schedule.execution_failed" | "task.created" | "task.updated" | "task.deleted" | "task.run.started" | "task.run.completed" | "task.run.failed" | "task.automation.updated" | "settings.changed" | "ui.notify" | "ui.show_window" | "hub.client.updated";
459
+ export type HubEventName = "hub.client.registered" | "hub.client.disconnected" | "session.created" | "session.updated" | "session.attached" | "session.detached" | "session.forked" | "session.pending_prompts" | "session.pending_prompt_submitted" | "run.started" | "run.heartbeat" | "run.aborted" | "run.completed" | "run.failed" | "run.enqueued" | "run.interrupted" | "hub.drain_changed" | "iteration.started" | "iteration.finished" | "assistant.delta" | "assistant.media" | "assistant.finished" | "session.notice" | "reasoning.delta" | "reasoning.finished" | "agent.done" | "usage.updated" | "tool.started" | "tool.updated" | "tool.finished" | "approval.requested" | "approval.resolved" | "capability.requested" | "capability.resolved" | "team.progress" | "artifact.created" | "diff.created" | "spoke.started" | "spoke.failed" | "spoke.stopped" | "peer.registered" | "peer.session_attached" | "peer.session_detached" | "schedule.created" | "schedule.updated" | "schedule.deleted" | "schedule.triggered" | "schedule.execution_completed" | "schedule.execution_failed" | "task.created" | "task.updated" | "task.deleted" | "task.run.started" | "task.run.completed" | "task.run.failed" | "task.automation.updated" | "settings.changed" | "plugin.status_changed" | "ui.notify" | "ui.show_window" | "hub.client.updated";
382
460
  export interface HubEventEnvelope {
383
461
  version: HubProtocolVersion;
384
462
  event: HubEventName;
@@ -26,7 +26,7 @@ export * from "./llms/model-tools";
26
26
  export { DEFAULT_REASONING_EFFORT, REASONING_EFFORT_RATIOS, resolveEffectiveReasoningEffort, resolveReasoningBudgetFromRatio, resolveReasoningEffortRatio, } from "./llms/reasoning-effort";
27
27
  export { type ModelReasoningOption, ModelReasoningOptionSchema, REASONING_LEVELS, type ReasoningEffort, ReasoningEffortSchema, type ReasoningLevel, ReasoningLevelSchema, } from "./llms/reasoning-options";
28
28
  export { serializeAbortReason } from "./llms/requests";
29
- export { CHARS_PER_TOKEN, estimateRequestInputTokens, estimateTokens, type TokenEstimatedRequest, } from "./llms/tokens";
29
+ export { CHARS_PER_TOKEN, createImageAwareReplacer, ESTIMATED_TOKENS_PER_IMAGE, estimateRequestInputTokens, estimateTokens, type TokenEstimatedRequest, } from "./llms/tokens";
30
30
  export type { ToolApprovalRequest, ToolApprovalResult, ToolCallRecord, ToolPolicy, } from "./llms/tools";
31
31
  export { TOOL_REJECTION_SUFFIX, ToolCallRecordSchema, USER_REJECTED_TOOL_REASON, } from "./llms/tools";
32
32
  export type { StreamingAudioTranscriptionSession } from "./llms/transcription";