@huyooo/ai-chat-storage 0.3.21 → 0.3.23

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/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,uniqueIndex as a}from"drizzle-orm/sqlite-core";import{drizzle as o}from"drizzle-orm/better-sqlite3";import{and as s,desc as c,eq as l,gt as u,inArray as d,lt as f,sql as p}from"drizzle-orm";import m from"postgres";import{existsSync as ee,mkdirSync as h}from"fs";import{dirname as te}from"path";var g=Object.defineProperty,_=(e,t)=>()=>(e&&(t=e(e=0)),t),v=(e,t)=>{let n={};for(var r in e)g(n,r,{get:e[r],enumerable:!0});return t||g(n,Symbol.toStringTag,{value:`Module`}),n},y,b,x,S,C,w,T,E=_((()=>{y=r(`sessions`,{id:i(`id`).primaryKey(),appId:i(`app_id`),userId:i(`user_id`),title:i(`title`).notNull(),model:i(`model`).notNull(),mode:i(`mode`).notNull(),webSearchEnabled:t(`web_search_enabled`,{mode:`boolean`}).notNull().default(!0),thinkingEnabled:t(`thinking_enabled`,{mode:`boolean`}).notNull().default(!0),hidden:t(`hidden`,{mode:`boolean`}).notNull().default(!1),lastMessageSequence:t(`last_message_sequence`).notNull().default(0),createdAt:t(`created_at`,{mode:`timestamp`}).notNull(),updatedAt:t(`updated_at`,{mode:`timestamp`}).notNull()},t=>[e(`idx_sessions_tenant`).on(t.appId,t.userId),e(`idx_sessions_updated`).on(t.updatedAt)]),b=r(`messages`,{id:i(`id`).primaryKey(),clientId:i(`client_id`),sessionId:i(`session_id`).notNull(),appId:i(`app_id`),userId:i(`user_id`),role:i(`role`).notNull(),content:i(`content`).notNull(),atContextItems:i(`at_context_items`),images:i(`images`),model:i(`model`),mode:i(`mode`),webSearchEnabled:t(`web_search_enabled`,{mode:`boolean`}),thinkingEnabled:t(`thinking_enabled`,{mode:`boolean`}),operationIds:i(`operation_ids`),usage:i(`usage`),duration:t(`duration`),finishReason:i(`finish_reason`),sequence:t(`sequence`).notNull(),timestamp:t(`timestamp`,{mode:`timestamp`}).notNull()},t=>[e(`idx_messages_session`).on(t.sessionId),e(`idx_messages_tenant`).on(t.appId,t.userId),e(`idx_messages_sequence`).on(t.sessionId,t.sequence),a(`uq_messages_session_sequence`).on(t.sessionId,t.sequence)]),x=r(`message_parts`,{messageId:i(`message_id`).notNull(),sequence:t(`sequence`).notNull(),type:i(`type`).notNull(),payload:i(`payload`).notNull()},t=>[n({columns:[t.messageId,t.sequence]}),e(`idx_message_parts_message`).on(t.messageId,t.sequence)]),S=r(`operations`,{id:i(`id`).primaryKey(),sessionId:i(`session_id`).notNull(),messageId:i(`message_id`),appId:i(`app_id`),userId:i(`user_id`),command:i(`command`).notNull(),operationType:i(`operation_type`).notNull(),affectedFiles:i(`affected_files`).notNull(),backupPath:i(`backup_path`),status:i(`status`).notNull().default(`pending`),errorMessage:i(`error_message`),timestamp:t(`timestamp`,{mode:`timestamp`}).notNull()},t=>[e(`idx_operations_session`).on(t.sessionId),e(`idx_operations_message`).on(t.messageId),e(`idx_operations_tenant`).on(t.appId,t.userId)]),C=r(`backups`,{id:i(`id`).primaryKey(),operationId:i(`operation_id`).notNull(),originalPath:i(`original_path`).notNull(),backupPath:i(`backup_path`).notNull(),fileSize:t(`file_size`).notNull(),fileHash:i(`file_hash`).notNull(),createdAt:t(`created_at`,{mode:`timestamp`}).notNull(),expiresAt:t(`expires_at`,{mode:`timestamp`}).notNull()},t=>[e(`idx_backups_operation`).on(t.operationId),e(`idx_backups_expires`).on(t.expiresAt)]),w=r(`trash`,{id:i(`id`).primaryKey(),sessionId:i(`session_id`).notNull(),appId:i(`app_id`),userId:i(`user_id`),originalPath:i(`original_path`).notNull(),trashPath:i(`trash_path`).notNull(),deletedAt:t(`deleted_at`,{mode:`timestamp`}).notNull(),autoDeleteAt:t(`auto_delete_at`,{mode:`timestamp`}).notNull()},t=>[e(`idx_trash_tenant`).on(t.appId,t.userId),e(`idx_trash_auto_delete`).on(t.autoDeleteAt)]),T=r(`embeddings`,{id:i(`id`).primaryKey(),sessionId:i(`session_id`).notNull(),messageId:i(`message_id`),appId:i(`app_id`),userId:i(`user_id`),content:i(`content`).notNull(),contentType:i(`content_type`).notNull(),embedding:i(`embedding`),metadata:i(`metadata`),createdAt:t(`created_at`,{mode:`timestamp`}).notNull()},t=>[e(`idx_embeddings_session`).on(t.sessionId),e(`idx_embeddings_tenant`).on(t.appId,t.userId)])}));function ne(e,t,n){e.pragma(`table_info(messages)`).some(e=>e.name===t)||e.exec(`ALTER TABLE messages ADD COLUMN ${n}`)}function re(e){Number(e.pragma(`user_version`,{simple:!0})||0)!==A&&e.exec(`
1
+ import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,uniqueIndex as a}from"drizzle-orm/sqlite-core";import{drizzle as o}from"drizzle-orm/better-sqlite3";import{and as s,desc as c,eq as l,gt as u,inArray as d,lt as f,sql as p}from"drizzle-orm";import m from"postgres";import{existsSync as ee,mkdirSync as te}from"fs";import{dirname as ne}from"path";var h=Object.defineProperty,g=(e,t)=>()=>(e&&(t=e(e=0)),t),_=(e,t)=>{let n={};for(var r in e)h(n,r,{get:e[r],enumerable:!0});return t||h(n,Symbol.toStringTag,{value:`Module`}),n},v,y,b,x,S,C,w,T=g((()=>{v=r(`sessions`,{id:i(`id`).primaryKey(),appId:i(`app_id`),userId:i(`user_id`),title:i(`title`).notNull(),model:i(`model`).notNull(),mode:i(`mode`).notNull(),webSearchEnabled:t(`web_search_enabled`,{mode:`boolean`}).notNull().default(!0),thinkingEnabled:t(`thinking_enabled`,{mode:`boolean`}).notNull().default(!0),hidden:t(`hidden`,{mode:`boolean`}).notNull().default(!1),lastMessageSequence:t(`last_message_sequence`).notNull().default(0),createdAt:t(`created_at`,{mode:`timestamp`}).notNull(),updatedAt:t(`updated_at`,{mode:`timestamp`}).notNull()},t=>[e(`idx_sessions_tenant`).on(t.appId,t.userId),e(`idx_sessions_updated`).on(t.updatedAt)]),y=r(`messages`,{id:i(`id`).primaryKey(),clientId:i(`client_id`),sessionId:i(`session_id`).notNull(),appId:i(`app_id`),userId:i(`user_id`),role:i(`role`).notNull(),content:i(`content`).notNull(),atContextItems:i(`at_context_items`),images:i(`images`),model:i(`model`),modelDisplayName:i(`model_display_name`),mode:i(`mode`),webSearchEnabled:t(`web_search_enabled`,{mode:`boolean`}),thinkingEnabled:t(`thinking_enabled`,{mode:`boolean`}),operationIds:i(`operation_ids`),usage:i(`usage`),duration:t(`duration`),finishReason:i(`finish_reason`),sequence:t(`sequence`).notNull(),timestamp:t(`timestamp`,{mode:`timestamp`}).notNull()},t=>[e(`idx_messages_session`).on(t.sessionId),e(`idx_messages_tenant`).on(t.appId,t.userId),e(`idx_messages_sequence`).on(t.sessionId,t.sequence),a(`uq_messages_session_sequence`).on(t.sessionId,t.sequence)]),b=r(`message_parts`,{messageId:i(`message_id`).notNull(),sequence:t(`sequence`).notNull(),type:i(`type`).notNull(),payload:i(`payload`).notNull()},t=>[n({columns:[t.messageId,t.sequence]}),e(`idx_message_parts_message`).on(t.messageId,t.sequence)]),x=r(`operations`,{id:i(`id`).primaryKey(),sessionId:i(`session_id`).notNull(),messageId:i(`message_id`),appId:i(`app_id`),userId:i(`user_id`),command:i(`command`).notNull(),operationType:i(`operation_type`).notNull(),affectedFiles:i(`affected_files`).notNull(),backupPath:i(`backup_path`),status:i(`status`).notNull().default(`pending`),errorMessage:i(`error_message`),timestamp:t(`timestamp`,{mode:`timestamp`}).notNull()},t=>[e(`idx_operations_session`).on(t.sessionId),e(`idx_operations_message`).on(t.messageId),e(`idx_operations_tenant`).on(t.appId,t.userId)]),S=r(`backups`,{id:i(`id`).primaryKey(),operationId:i(`operation_id`).notNull(),originalPath:i(`original_path`).notNull(),backupPath:i(`backup_path`).notNull(),fileSize:t(`file_size`).notNull(),fileHash:i(`file_hash`).notNull(),createdAt:t(`created_at`,{mode:`timestamp`}).notNull(),expiresAt:t(`expires_at`,{mode:`timestamp`}).notNull()},t=>[e(`idx_backups_operation`).on(t.operationId),e(`idx_backups_expires`).on(t.expiresAt)]),C=r(`trash`,{id:i(`id`).primaryKey(),sessionId:i(`session_id`).notNull(),appId:i(`app_id`),userId:i(`user_id`),originalPath:i(`original_path`).notNull(),trashPath:i(`trash_path`).notNull(),deletedAt:t(`deleted_at`,{mode:`timestamp`}).notNull(),autoDeleteAt:t(`auto_delete_at`,{mode:`timestamp`}).notNull()},t=>[e(`idx_trash_tenant`).on(t.appId,t.userId),e(`idx_trash_auto_delete`).on(t.autoDeleteAt)]),w=r(`embeddings`,{id:i(`id`).primaryKey(),sessionId:i(`session_id`).notNull(),messageId:i(`message_id`),appId:i(`app_id`),userId:i(`user_id`),content:i(`content`).notNull(),contentType:i(`content_type`).notNull(),embedding:i(`embedding`),metadata:i(`metadata`),createdAt:t(`created_at`,{mode:`timestamp`}).notNull()},t=>[e(`idx_embeddings_session`).on(t.sessionId),e(`idx_embeddings_tenant`).on(t.appId,t.userId)])}));function E(e,t,n){e.pragma(`table_info(messages)`).some(e=>e.name===t)||e.exec(`ALTER TABLE messages ADD COLUMN ${n}`)}function re(e){Number(e.pragma(`user_version`,{simple:!0})||0)!==j&&e.exec(`
2
2
  DROP TABLE IF EXISTS message_parts;
3
3
  DROP TABLE IF EXISTS messages;
4
4
  DROP TABLE IF EXISTS operations;
@@ -33,6 +33,7 @@ import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,unique
33
33
  at_context_items TEXT,
34
34
  images TEXT,
35
35
  model TEXT,
36
+ model_display_name TEXT,
36
37
  mode TEXT,
37
38
  web_search_enabled INTEGER,
38
39
  thinking_enabled INTEGER,
@@ -129,15 +130,15 @@ import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,unique
129
130
  CREATE INDEX IF NOT EXISTS idx_embeddings_session ON embeddings(session_id);
130
131
  CREATE INDEX IF NOT EXISTS idx_user_settings_tenant ON user_settings(app_id, user_id);
131
132
  CREATE INDEX IF NOT EXISTS idx_user_settings_key ON user_settings(key);
132
- `),ne(e,`finish_reason`,`finish_reason TEXT`),e.pragma(`user_version = ${A}`)}function D(e){let t=[];return e.appId&&t.push(l(y.appId,e.appId)),e.userId&&t.push(l(y.userId,e.userId)),t.length>0?s(...t):void 0}function O(e){let t=[];return e.appId&&t.push(l(b.appId,e.appId)),e.userId&&t.push(l(b.userId,e.userId)),t.length>0?s(...t):void 0}function ie(e){let t=[];return e.appId&&t.push(l(S.appId,e.appId)),e.userId&&t.push(l(S.userId,e.userId)),t.length>0?s(...t):void 0}function k(e){let t=[];return e.appId&&t.push(l(w.appId,e.appId)),e.userId&&t.push(l(w.userId,e.userId)),t.length>0?s(...t):void 0}function ae(e,t){if(e.length===0||t.length===0||e.length!==t.length)return 0;let n=0,r=0,i=0;for(let a=0;a<e.length;a+=1)n+=e[a]*t[a],r+=e[a]*e[a],i+=t[a]*t[a];return r===0||i===0?0:n/(Math.sqrt(r)*Math.sqrt(i))}var A,j=_((()=>{E(),A=3}));function M(e){return{id:e.id,appId:e.appId,userId:e.userId,title:e.title,model:e.model,mode:e.mode,webSearchEnabled:e.webSearchEnabled,thinkingEnabled:e.thinkingEnabled,hidden:e.hidden,createdAt:e.createdAt,updatedAt:e.updatedAt}}function oe(e,t){let n=D(t);return e.select().from(y).where(n).orderBy(c(y.updatedAt)).all().map(M)}function se(e,t,n){let r=D(n),i=r?s(l(y.id,t),r):l(y.id,t),a=e.select().from(y).where(i).get();return a?M(a):null}function ce(e,t,n){let r=new Date,i={id:t.id,appId:n.appId||null,userId:n.userId||null,title:t.title,model:t.model,mode:t.mode,webSearchEnabled:t.webSearchEnabled,thinkingEnabled:t.thinkingEnabled,hidden:t.hidden??!1,createdAt:r,updatedAt:r};return e.insert(y).values({id:i.id,appId:i.appId,userId:i.userId,title:i.title,model:i.model,mode:i.mode,webSearchEnabled:i.webSearchEnabled,thinkingEnabled:i.thinkingEnabled,hidden:i.hidden,lastMessageSequence:0,createdAt:i.createdAt,updatedAt:i.updatedAt}).run(),i}function le(e,t,n,r){let i=D(r),a=i?s(l(y.id,t),i):l(y.id,t),o={updatedAt:new Date};n.title!==void 0&&(o.title=n.title),n.model!==void 0&&(o.model=n.model),n.mode!==void 0&&(o.mode=n.mode),n.webSearchEnabled!==void 0&&(o.webSearchEnabled=n.webSearchEnabled),n.thinkingEnabled!==void 0&&(o.thinkingEnabled=n.thinkingEnabled),n.hidden!==void 0&&(o.hidden=n.hidden),e.update(y).set(o).where(a).run()}function ue(e,t,n){let r=D(n),i=r?s(l(y.id,t),r):l(y.id,t);e.delete(y).where(i).run()}var de=_((()=>{E(),j()}));function N(e,t){if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=Number(t);if(Number.isFinite(e))return e}throw Error(`消息 ${e} 的序号无效: ${t}`)}function fe(e,t){if(typeof t==`number`&&Number.isFinite(t))return t;if(t instanceof Date)return t.getTime();if(typeof t==`string`){let e=Date.parse(t);if(!Number.isNaN(e))return e}throw Error(`消息 ${e} 的时间戳无效: ${t}`)}function pe(e,t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}function me(e,t){if(!t)return null;try{let e=JSON.parse(t);return Array.isArray(e)?e:null}catch{return null}}function he(e){switch(e){case`stop`:case`length`:case`tool_calls`:case`error`:case`abort`:case`max_iterations`:case`max_duration`:case`max_tool_calls`:case`max_tokens`:return e;default:return null}}function ge(e){return{messageId:e.messageId,sequence:N(e.messageId,e.sequence),type:e.type,payload:e.payload}}function P(e,t){let n=new Map;for(let e of t){let t=ge(e),r=n.get(t.messageId)??[];r.push(t),n.set(t.messageId,r)}return e.map(e=>({id:e.id,clientId:e.clientId||e.id,sessionId:e.sessionId,appId:e.appId,userId:e.userId,role:e.role,content:e.content,atContextItems:me(e.id,e.atContextItems),images:pe(e.id,e.images),model:e.model,mode:e.mode,webSearchEnabled:e.webSearchEnabled,thinkingEnabled:e.thinkingEnabled,parts:n.get(e.id)??[],operationIds:e.operationIds,usage:e.usage,duration:e.duration,finishReason:he(e.finishReason),sequence:N(e.id,e.sequence),timestamp:fe(e.id,e.timestamp)}))}function _e(e){return e?.trim().toLowerCase()??``}function F(e,t=120){let n=e?.replace(/\s+/g,` `).trim()??``;return n?n.length>t?`${n.slice(0,t-1)}...`:n:``}function I(e,t,n){let r=e.select().from(x).where(l(x.messageId,t)).orderBy(x.sequence).all(),i=new Map;for(let e of r)i.set(N(t,e.sequence),e);for(let[r,a]of n.entries()){let n=i.get(r);if(!n){e.insert(x).values({messageId:t,sequence:r,type:a.type,payload:a.payload}).run();continue}(n.type!==a.type||n.payload!==a.payload)&&e.update(x).set({type:a.type,payload:a.payload}).where(s(l(x.messageId,t),l(x.sequence,r))).run(),i.delete(r)}let a=[...i.keys()];a.length>0&&e.delete(x).where(s(l(x.messageId,t),d(x.sequence,a))).run()}function ve(e,t){let n=e.select().from(b).where(l(b.sessionId,t)).orderBy(b.sequence,b.timestamp).all();if(n.length===0)return[];let r=n.map(e=>e.id);return P(n,e.select().from(x).where(d(x.messageId,r)).orderBy(x.messageId,x.sequence).all())}function ye(e,t,n){let r=Math.max(1,Math.min(n?.limit??200,500)),i=l(b.sessionId,t),a=n?.beforeSequence==null?i:s(i,f(b.sequence,n.beforeSequence)),o=e.select().from(b).where(a).orderBy(c(b.sequence)).limit(r).all().reverse();if(o.length===0)return{messages:[],hasMore:!1,nextBeforeSequence:null};let u=o.map(e=>e.id),p=P(o,e.select().from(x).where(d(x.messageId,u)).orderBy(x.messageId,x.sequence).all()),m=p[0]?.sequence??null;return{messages:p,hasMore:m!=null&&m>1,nextBeforeSequence:m}}function be(e,t,n,r){let i=_e(t),a=Math.max(1,Math.min(n?.limit??20,100)),o=D(r??{}),u=`%${i}%`,d=p`(
133
- lower(${y.title}) LIKE ${u}
133
+ `),E(e,`finish_reason`,`finish_reason TEXT`),E(e,`model_display_name`,`model_display_name TEXT`),e.pragma(`user_version = ${j}`)}function D(e){let t=[];return e.appId&&t.push(l(v.appId,e.appId)),e.userId&&t.push(l(v.userId,e.userId)),t.length>0?s(...t):void 0}function O(e){let t=[];return e.appId&&t.push(l(y.appId,e.appId)),e.userId&&t.push(l(y.userId,e.userId)),t.length>0?s(...t):void 0}function ie(e){let t=[];return e.appId&&t.push(l(x.appId,e.appId)),e.userId&&t.push(l(x.userId,e.userId)),t.length>0?s(...t):void 0}function k(e){let t=[];return e.appId&&t.push(l(C.appId,e.appId)),e.userId&&t.push(l(C.userId,e.userId)),t.length>0?s(...t):void 0}function A(e,t){if(e.length===0||t.length===0||e.length!==t.length)return 0;let n=0,r=0,i=0;for(let a=0;a<e.length;a+=1)n+=e[a]*t[a],r+=e[a]*e[a],i+=t[a]*t[a];return r===0||i===0?0:n/(Math.sqrt(r)*Math.sqrt(i))}var j,M=g((()=>{T(),j=3}));function N(e){return{id:e.id,appId:e.appId,userId:e.userId,title:e.title,model:e.model,mode:e.mode,webSearchEnabled:e.webSearchEnabled,thinkingEnabled:e.thinkingEnabled,hidden:e.hidden,createdAt:e.createdAt,updatedAt:e.updatedAt}}function ae(e,t){let n=D(t);return e.select().from(v).where(n).orderBy(c(v.updatedAt)).all().map(N)}function oe(e,t,n){let r=D(n),i=r?s(l(v.id,t),r):l(v.id,t),a=e.select().from(v).where(i).get();return a?N(a):null}function se(e,t,n){let r=new Date,i={id:t.id,appId:n.appId||null,userId:n.userId||null,title:t.title,model:t.model,mode:t.mode,webSearchEnabled:t.webSearchEnabled,thinkingEnabled:t.thinkingEnabled,hidden:t.hidden??!1,createdAt:r,updatedAt:r};return e.insert(v).values({id:i.id,appId:i.appId,userId:i.userId,title:i.title,model:i.model,mode:i.mode,webSearchEnabled:i.webSearchEnabled,thinkingEnabled:i.thinkingEnabled,hidden:i.hidden,lastMessageSequence:0,createdAt:i.createdAt,updatedAt:i.updatedAt}).run(),i}function ce(e,t,n,r){let i=D(r),a=i?s(l(v.id,t),i):l(v.id,t),o={updatedAt:new Date};n.title!==void 0&&(o.title=n.title),n.model!==void 0&&(o.model=n.model),n.mode!==void 0&&(o.mode=n.mode),n.webSearchEnabled!==void 0&&(o.webSearchEnabled=n.webSearchEnabled),n.thinkingEnabled!==void 0&&(o.thinkingEnabled=n.thinkingEnabled),n.hidden!==void 0&&(o.hidden=n.hidden),e.update(v).set(o).where(a).run()}function le(e,t,n){let r=D(n),i=r?s(l(v.id,t),r):l(v.id,t);e.delete(v).where(i).run()}var ue=g((()=>{T(),M()}));function P(e,t){if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=Number(t);if(Number.isFinite(e))return e}throw Error(`消息 ${e} 的序号无效: ${t}`)}function de(e,t){if(typeof t==`number`&&Number.isFinite(t))return t;if(t instanceof Date)return t.getTime();if(typeof t==`string`){let e=Date.parse(t);if(!Number.isNaN(e))return e}throw Error(`消息 ${e} 的时间戳无效: ${t}`)}function fe(e,t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}function pe(e,t){if(!t)return null;try{let e=JSON.parse(t);return Array.isArray(e)?e:null}catch{return null}}function me(e){switch(e){case`stop`:case`length`:case`tool_calls`:case`error`:case`abort`:case`max_iterations`:case`max_duration`:case`max_tool_calls`:case`max_tokens`:return e;default:return null}}function he(e){return{messageId:e.messageId,sequence:P(e.messageId,e.sequence),type:e.type,payload:e.payload}}function F(e,t){let n=new Map;for(let e of t){let t=he(e),r=n.get(t.messageId)??[];r.push(t),n.set(t.messageId,r)}return e.map(e=>({id:e.id,clientId:e.clientId||e.id,sessionId:e.sessionId,appId:e.appId,userId:e.userId,role:e.role,content:e.content,atContextItems:pe(e.id,e.atContextItems),images:fe(e.id,e.images),model:e.model,modelDisplayName:e.modelDisplayName,mode:e.mode,webSearchEnabled:e.webSearchEnabled,thinkingEnabled:e.thinkingEnabled,parts:n.get(e.id)??[],operationIds:e.operationIds,usage:e.usage,duration:e.duration,finishReason:me(e.finishReason),sequence:P(e.id,e.sequence),timestamp:de(e.id,e.timestamp)}))}function ge(e){return e?.trim().toLowerCase()??``}function _e(e,t=120){let n=e?.replace(/\s+/g,` `).trim()??``;return n?n.length>t?`${n.slice(0,t-1)}...`:n:``}function I(e,t,n){let r=e.select().from(b).where(l(b.messageId,t)).orderBy(b.sequence).all(),i=new Map;for(let e of r)i.set(P(t,e.sequence),e);for(let[r,a]of n.entries()){let n=i.get(r);if(!n){e.insert(b).values({messageId:t,sequence:r,type:a.type,payload:a.payload}).run();continue}(n.type!==a.type||n.payload!==a.payload)&&e.update(b).set({type:a.type,payload:a.payload}).where(s(l(b.messageId,t),l(b.sequence,r))).run(),i.delete(r)}let a=[...i.keys()];a.length>0&&e.delete(b).where(s(l(b.messageId,t),d(b.sequence,a))).run()}function ve(e,t){let n=e.select().from(y).where(l(y.sessionId,t)).orderBy(y.sequence,y.timestamp).all();if(n.length===0)return[];let r=n.map(e=>e.id);return F(n,e.select().from(b).where(d(b.messageId,r)).orderBy(b.messageId,b.sequence).all())}function ye(e,t,n){let r=Math.max(1,Math.min(n?.limit??200,500)),i=l(y.sessionId,t),a=n?.beforeSequence==null?i:s(i,f(y.sequence,n.beforeSequence)),o=e.select().from(y).where(a).orderBy(c(y.sequence)).limit(r).all().reverse();if(o.length===0)return{messages:[],hasMore:!1,nextBeforeSequence:null};let u=o.map(e=>e.id),p=F(o,e.select().from(b).where(d(b.messageId,u)).orderBy(b.messageId,b.sequence).all()),m=p[0]?.sequence??null;return{messages:p,hasMore:m!=null&&m>1,nextBeforeSequence:m}}function be(e,t,n,r){let i=ge(t),a=Math.max(1,Math.min(n?.limit??20,100)),o=D(r??{}),u=`%${i}%`,d=p`(
134
+ lower(${v.title}) LIKE ${u}
134
135
  OR EXISTS (
135
136
  SELECT 1
136
- FROM ${b}
137
- WHERE ${b.sessionId} = ${y.id}
138
- AND lower(${b.content}) LIKE ${u}
137
+ FROM ${y}
138
+ WHERE ${y.sessionId} = ${v.id}
139
+ AND lower(${y.content}) LIKE ${u}
139
140
  )
140
- )`,f=i?o?s(o,d):d:o;return e.select({id:y.id,title:y.title,updatedAt:y.updatedAt}).from(y).where(f).orderBy(c(y.updatedAt)).limit(a).all().map(t=>{let n=!i||t.title.toLowerCase().includes(i),r=e.select({id:b.id,content:b.content}).from(b).where(l(b.sessionId,t.id)).orderBy(c(b.sequence)).limit(1).get(),a=n?null:e.select({id:b.id,content:b.content}).from(b).where(s(l(b.sessionId,t.id),p`lower(${b.content}) LIKE ${u}`)).orderBy(c(b.sequence)).limit(1).get(),o=F(a?.content??r?.content??``);return{kind:`chat`,id:t.id,sessionId:t.id,label:t.title,mention:`@chat:${t.id}`,description:o||void 0,preview:o||void 0,updatedAt:t.updatedAt.getTime(),matchedMessageId:a?.id}})}function xe(e,t,n){let r=e.select({lastMessageSequence:y.lastMessageSequence}).from(y).where(l(y.id,t)).get();if(!r)throw Error(`会话 ${t} 不存在,无法分配消息序号`);let i=(r.lastMessageSequence??0)+1;return e.update(y).set({lastMessageSequence:i,updatedAt:n}).where(l(y.id,t)).run(),i}function Se(e,t,n){let r=O(n),i=r?s(l(b.id,t),r):l(b.id,t),a=e.select().from(b).where(i).get();if(!a)return null;let o=e.select().from(x).where(l(x.messageId,t)).orderBy(x.sequence).all();return P([a],o)[0]??null}function Ce(e,t,n){let r=Date.now(),i=new Date(r);return e.transaction(e=>{let a=xe(e,t.sessionId,i),o={id:t.id,clientId:t.clientId||t.id,sessionId:t.sessionId,appId:n.appId||null,userId:n.userId||null,role:t.role,content:t.content,atContextItems:t.atContextItems||null,images:t.images||[],model:t.model,mode:t.mode,webSearchEnabled:t.webSearchEnabled,thinkingEnabled:t.thinkingEnabled,parts:(t.parts??[]).map((e,n)=>({messageId:t.id,sequence:n,type:e.type,payload:e.payload})),operationIds:t.operationIds,usage:null,duration:null,finishReason:t.finishReason??null,sequence:a,timestamp:r};return e.insert(b).values({id:o.id,clientId:o.clientId,sessionId:o.sessionId,appId:o.appId,userId:o.userId,role:o.role,content:o.content,atContextItems:o.atContextItems?JSON.stringify(o.atContextItems):null,images:o.images.length>0?JSON.stringify(o.images):null,model:o.model,mode:o.mode,webSearchEnabled:o.webSearchEnabled,thinkingEnabled:o.thinkingEnabled,operationIds:o.operationIds,usage:null,duration:null,finishReason:o.finishReason,sequence:o.sequence,timestamp:new Date(o.timestamp)}).run(),I(e,o.id,o.parts),o})}function we(e,t,n,r){e.transaction(e=>{let i=O(r),a=i?s(l(b.id,t),i):l(b.id,t),o={};n.content!==void 0&&(o.content=n.content),n.atContextItems!==void 0&&(o.atContextItems=n.atContextItems?JSON.stringify(n.atContextItems):null),n.operationIds!==void 0&&(o.operationIds=n.operationIds),n.usage!==void 0&&(o.usage=n.usage),n.duration!==void 0&&(o.duration=n.duration),n.finishReason!==void 0&&(o.finishReason=n.finishReason),Object.keys(o).length>0&&e.update(b).set(o).where(a).run(),n.parts!==void 0&&I(e,t,n.parts)})}function L(e,t){t.length!==0&&e.delete(x).where(d(x.messageId,t)).run()}function Te(e,t,n){e.transaction(e=>{L(e,e.select({id:b.id}).from(b).where(s(l(b.sessionId,t),u(b.timestamp,n))).all().map(e=>e.id)),e.delete(b).where(s(l(b.sessionId,t),u(b.timestamp,n))).run()})}function Ee(e,t,n,r){e.transaction(e=>{L(e,e.select({id:b.id}).from(b).where(s(l(b.sessionId,t),u(b.sequence,r))).all().map(e=>e.id)),e.delete(b).where(s(l(b.sessionId,t),u(b.sequence,r))).run()})}function De(e,t){e.transaction(e=>{L(e,e.select({id:b.id}).from(b).where(l(b.sessionId,t)).all().map(e=>e.id)),e.delete(b).where(l(b.sessionId,t)).run()})}var Oe=_((()=>{E(),j()}));function R(e){return{id:e.id,sessionId:e.sessionId,messageId:e.messageId,appId:e.appId,userId:e.userId,command:e.command,operationType:e.operationType,affectedFiles:e.affectedFiles,backupPath:e.backupPath,status:e.status,errorMessage:e.errorMessage,timestamp:e.timestamp}}function ke(e,t){return e.select().from(S).where(l(S.sessionId,t)).orderBy(S.timestamp).all().map(R)}function Ae(e,t,n){let r=ie(n),i=r?s(l(S.messageId,t),r):l(S.messageId,t);return e.select().from(S).where(i).all().map(R)}function je(e,t,n){let r=new Date,i={id:t.id,sessionId:t.sessionId,messageId:t.messageId,appId:n.appId||null,userId:n.userId||null,command:t.command,operationType:t.operationType,affectedFiles:t.affectedFiles,backupPath:t.backupPath,status:t.status||`pending`,errorMessage:null,timestamp:r};return e.insert(S).values({id:i.id,sessionId:i.sessionId,messageId:i.messageId,appId:i.appId,userId:i.userId,command:i.command,operationType:i.operationType,affectedFiles:i.affectedFiles,backupPath:i.backupPath,status:i.status,errorMessage:i.errorMessage,timestamp:i.timestamp}).run(),i}function Me(e,t,n,r){let i={status:n};r!==void 0&&(i.errorMessage=r),e.update(S).set(i).where(l(S.id,t)).run()}function Ne(e,t){e.delete(S).where(l(S.sessionId,t)).run()}var Pe=_((()=>{E(),j()}));function Fe(e){return{id:e.id,operationId:e.operationId,originalPath:e.originalPath,backupPath:e.backupPath,fileSize:e.fileSize,fileHash:e.fileHash,createdAt:e.createdAt,expiresAt:e.expiresAt}}function Ie(e,t){return e.select().from(C).where(l(C.operationId,t)).all().map(Fe)}function Le(e,t){let n=new Date,r={...t,createdAt:n};return e.insert(C).values({id:r.id,operationId:r.operationId,originalPath:r.originalPath,backupPath:r.backupPath,fileSize:r.fileSize,fileHash:r.fileHash,createdAt:r.createdAt,expiresAt:r.expiresAt}).run(),r}function Re(e){let t=new Date;return e.delete(C).where(f(C.expiresAt,t)).run().changes}var ze=_((()=>{E()}));function z(e){return{id:e.id,sessionId:e.sessionId,appId:e.appId,userId:e.userId,originalPath:e.originalPath,trashPath:e.trashPath,deletedAt:e.deletedAt,autoDeleteAt:e.autoDeleteAt}}function Be(e,t){let n=k(t);return e.select().from(w).where(n).orderBy(c(w.deletedAt)).all().map(z)}function Ve(e,t,n,r){let i=new Date,a=r.trashRetentionDays||30,o=new Date(i.getTime()+a*24*60*60*1e3),s={...t,appId:n.appId||null,userId:n.userId||null,deletedAt:i,autoDeleteAt:o};return e.insert(w).values({id:s.id,sessionId:s.sessionId,appId:s.appId,userId:s.userId,originalPath:s.originalPath,trashPath:s.trashPath,deletedAt:s.deletedAt,autoDeleteAt:s.autoDeleteAt}).run(),s}function He(e,t,n){let r=k(n),i=r?s(l(w.id,t),r):l(w.id,t),a=e.select().from(w).where(i).get();if(!a)throw Error(`回收站记录不存在`);return e.delete(w).where(l(w.id,t)).run(),z(a)}function Ue(e){let t=new Date;return e.delete(w).where(f(w.autoDeleteAt,t)).run().changes}var We=_((()=>{E(),j()}));function Ge(e,t,n,r,i,a){let o=new Date;e.insert(T).values({id:t,sessionId:i.sessionId,messageId:i.messageId||null,appId:a.appId||null,userId:a.userId||null,content:n,contentType:i.contentType,embedding:JSON.stringify(r),metadata:JSON.stringify(i),createdAt:o}).run()}function Ke(e,t,n,r){let{limit:i=10,threshold:a=.7,sessionId:o}=n,c=[];return r.appId&&c.push(l(T.appId,r.appId)),r.userId&&c.push(l(T.userId,r.userId)),o&&c.push(l(T.sessionId,o)),e.select().from(T).where(c.length>0?s(...c):void 0).all().map(e=>{let n=ae(t,e.embedding?JSON.parse(e.embedding):[]);return{id:e.id,content:e.content,contentType:e.contentType,similarity:n,metadata:e.metadata?JSON.parse(e.metadata):void 0}}).filter(e=>e.similarity>=a).sort((e,t)=>t.similarity-e.similarity).slice(0,i)}function qe(e,t){e.delete(T).where(l(T.sessionId,t)).run()}var Je=_((()=>{E(),j()}));function Ye(e,t,n){return e.prepare(`
141
+ )`,f=i?o?s(o,d):d:o;return e.select({id:v.id,title:v.title,updatedAt:v.updatedAt}).from(v).where(f).orderBy(c(v.updatedAt)).limit(a).all().map(t=>{let n=!i||t.title.toLowerCase().includes(i),r=e.select({id:y.id,content:y.content}).from(y).where(l(y.sessionId,t.id)).orderBy(c(y.sequence)).limit(1).get(),a=n?null:e.select({id:y.id,content:y.content}).from(y).where(s(l(y.sessionId,t.id),p`lower(${y.content}) LIKE ${u}`)).orderBy(c(y.sequence)).limit(1).get(),o=_e(a?.content??r?.content??``);return{kind:`chat`,id:t.id,sessionId:t.id,label:t.title,mention:`@chat:${t.id}`,description:o||void 0,preview:o||void 0,updatedAt:t.updatedAt.getTime(),matchedMessageId:a?.id}})}function xe(e,t,n){let r=e.select({lastMessageSequence:v.lastMessageSequence}).from(v).where(l(v.id,t)).get();if(!r)throw Error(`会话 ${t} 不存在,无法分配消息序号`);let i=(r.lastMessageSequence??0)+1;return e.update(v).set({lastMessageSequence:i,updatedAt:n}).where(l(v.id,t)).run(),i}function Se(e,t,n){let r=O(n),i=r?s(l(y.id,t),r):l(y.id,t),a=e.select().from(y).where(i).get();if(!a)return null;let o=e.select().from(b).where(l(b.messageId,t)).orderBy(b.sequence).all();return F([a],o)[0]??null}function Ce(e,t,n){let r=Date.now(),i=new Date(r);return e.transaction(e=>{let a=xe(e,t.sessionId,i),o={id:t.id,clientId:t.clientId||t.id,sessionId:t.sessionId,appId:n.appId||null,userId:n.userId||null,role:t.role,content:t.content,atContextItems:t.atContextItems||null,images:t.images||[],model:t.model,modelDisplayName:t.modelDisplayName??null,mode:t.mode,webSearchEnabled:t.webSearchEnabled,thinkingEnabled:t.thinkingEnabled,parts:(t.parts??[]).map((e,n)=>({messageId:t.id,sequence:n,type:e.type,payload:e.payload})),operationIds:t.operationIds,usage:null,duration:null,finishReason:t.finishReason??null,sequence:a,timestamp:r};return e.insert(y).values({id:o.id,clientId:o.clientId,sessionId:o.sessionId,appId:o.appId,userId:o.userId,role:o.role,content:o.content,atContextItems:o.atContextItems?JSON.stringify(o.atContextItems):null,images:o.images.length>0?JSON.stringify(o.images):null,model:o.model,modelDisplayName:o.modelDisplayName,mode:o.mode,webSearchEnabled:o.webSearchEnabled,thinkingEnabled:o.thinkingEnabled,operationIds:o.operationIds,usage:null,duration:null,finishReason:o.finishReason,sequence:o.sequence,timestamp:new Date(o.timestamp)}).run(),I(e,o.id,o.parts),o})}function we(e,t,n,r){e.transaction(e=>{let i=O(r),a=i?s(l(y.id,t),i):l(y.id,t),o={};n.content!==void 0&&(o.content=n.content),n.atContextItems!==void 0&&(o.atContextItems=n.atContextItems?JSON.stringify(n.atContextItems):null),n.operationIds!==void 0&&(o.operationIds=n.operationIds),n.usage!==void 0&&(o.usage=n.usage),n.duration!==void 0&&(o.duration=n.duration),n.finishReason!==void 0&&(o.finishReason=n.finishReason),Object.keys(o).length>0&&e.update(y).set(o).where(a).run(),n.parts!==void 0&&I(e,t,n.parts)})}function L(e,t){t.length!==0&&e.delete(b).where(d(b.messageId,t)).run()}function Te(e,t,n){e.transaction(e=>{L(e,e.select({id:y.id}).from(y).where(s(l(y.sessionId,t),u(y.timestamp,n))).all().map(e=>e.id)),e.delete(y).where(s(l(y.sessionId,t),u(y.timestamp,n))).run()})}function Ee(e,t,n,r){e.transaction(e=>{L(e,e.select({id:y.id}).from(y).where(s(l(y.sessionId,t),u(y.sequence,r))).all().map(e=>e.id)),e.delete(y).where(s(l(y.sessionId,t),u(y.sequence,r))).run()})}function De(e,t){e.transaction(e=>{L(e,e.select({id:y.id}).from(y).where(l(y.sessionId,t)).all().map(e=>e.id)),e.delete(y).where(l(y.sessionId,t)).run()})}var Oe=g((()=>{T(),M()}));function R(e){return{id:e.id,sessionId:e.sessionId,messageId:e.messageId,appId:e.appId,userId:e.userId,command:e.command,operationType:e.operationType,affectedFiles:e.affectedFiles,backupPath:e.backupPath,status:e.status,errorMessage:e.errorMessage,timestamp:e.timestamp}}function ke(e,t){return e.select().from(x).where(l(x.sessionId,t)).orderBy(x.timestamp).all().map(R)}function Ae(e,t,n){let r=ie(n),i=r?s(l(x.messageId,t),r):l(x.messageId,t);return e.select().from(x).where(i).all().map(R)}function je(e,t,n){let r=new Date,i={id:t.id,sessionId:t.sessionId,messageId:t.messageId,appId:n.appId||null,userId:n.userId||null,command:t.command,operationType:t.operationType,affectedFiles:t.affectedFiles,backupPath:t.backupPath,status:t.status||`pending`,errorMessage:null,timestamp:r};return e.insert(x).values({id:i.id,sessionId:i.sessionId,messageId:i.messageId,appId:i.appId,userId:i.userId,command:i.command,operationType:i.operationType,affectedFiles:i.affectedFiles,backupPath:i.backupPath,status:i.status,errorMessage:i.errorMessage,timestamp:i.timestamp}).run(),i}function Me(e,t,n,r){let i={status:n};r!==void 0&&(i.errorMessage=r),e.update(x).set(i).where(l(x.id,t)).run()}function Ne(e,t){e.delete(x).where(l(x.sessionId,t)).run()}var Pe=g((()=>{T(),M()}));function Fe(e){return{id:e.id,operationId:e.operationId,originalPath:e.originalPath,backupPath:e.backupPath,fileSize:e.fileSize,fileHash:e.fileHash,createdAt:e.createdAt,expiresAt:e.expiresAt}}function Ie(e,t){return e.select().from(S).where(l(S.operationId,t)).all().map(Fe)}function Le(e,t){let n=new Date,r={...t,createdAt:n};return e.insert(S).values({id:r.id,operationId:r.operationId,originalPath:r.originalPath,backupPath:r.backupPath,fileSize:r.fileSize,fileHash:r.fileHash,createdAt:r.createdAt,expiresAt:r.expiresAt}).run(),r}function Re(e){let t=new Date;return e.delete(S).where(f(S.expiresAt,t)).run().changes}var ze=g((()=>{T()}));function z(e){return{id:e.id,sessionId:e.sessionId,appId:e.appId,userId:e.userId,originalPath:e.originalPath,trashPath:e.trashPath,deletedAt:e.deletedAt,autoDeleteAt:e.autoDeleteAt}}function Be(e,t){let n=k(t);return e.select().from(C).where(n).orderBy(c(C.deletedAt)).all().map(z)}function Ve(e,t,n,r){let i=new Date,a=r.trashRetentionDays||30,o=new Date(i.getTime()+a*24*60*60*1e3),s={...t,appId:n.appId||null,userId:n.userId||null,deletedAt:i,autoDeleteAt:o};return e.insert(C).values({id:s.id,sessionId:s.sessionId,appId:s.appId,userId:s.userId,originalPath:s.originalPath,trashPath:s.trashPath,deletedAt:s.deletedAt,autoDeleteAt:s.autoDeleteAt}).run(),s}function He(e,t,n){let r=k(n),i=r?s(l(C.id,t),r):l(C.id,t),a=e.select().from(C).where(i).get();if(!a)throw Error(`回收站记录不存在`);return e.delete(C).where(l(C.id,t)).run(),z(a)}function Ue(e){let t=new Date;return e.delete(C).where(f(C.autoDeleteAt,t)).run().changes}var We=g((()=>{T(),M()}));function Ge(e,t,n,r,i,a){let o=new Date;e.insert(w).values({id:t,sessionId:i.sessionId,messageId:i.messageId||null,appId:a.appId||null,userId:a.userId||null,content:n,contentType:i.contentType,embedding:JSON.stringify(r),metadata:JSON.stringify(i),createdAt:o}).run()}function Ke(e,t,n,r){let{limit:i=10,threshold:a=.7,sessionId:o}=n,c=[];return r.appId&&c.push(l(w.appId,r.appId)),r.userId&&c.push(l(w.userId,r.userId)),o&&c.push(l(w.sessionId,o)),e.select().from(w).where(c.length>0?s(...c):void 0).all().map(e=>{let n=A(t,e.embedding?JSON.parse(e.embedding):[]);return{id:e.id,content:e.content,contentType:e.contentType,similarity:n,metadata:e.metadata?JSON.parse(e.metadata):void 0}}).filter(e=>e.similarity>=a).sort((e,t)=>t.similarity-e.similarity).slice(0,i)}function qe(e,t){e.delete(w).where(l(w.sessionId,t)).run()}var Je=g((()=>{T(),M()}));function Ye(e,t,n){return e.prepare(`
141
142
  SELECT value FROM user_settings
142
143
  WHERE key = ? AND app_id IS ? AND user_id IS ?
143
144
  LIMIT 1
@@ -153,7 +154,7 @@ import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,unique
153
154
  `).all(t.appId||null,t.userId||null),r={};for(let e of n)r[e.key]=e.value;return r}function Qe(e,t,n){e.prepare(`
154
155
  DELETE FROM user_settings
155
156
  WHERE key = ? AND app_id IS ? AND user_id IS ?
156
- `).run(t,n.appId||null,n.userId||null)}var $e=_((()=>{})),et=v({SqliteAdapter:()=>B}),B,V=_((()=>{j(),de(),Oe(),Pe(),ze(),We(),Je(),$e(),B=class{sqlite;db;config;get sqliteInstance(){return this.sqlite}constructor(e,t){this.sqlite=t.sqliteFactory(e),this.db=o(this.sqlite),this.config=t,re(this.sqlite)}async getSessions(e){return oe(this.db,e)}async getSession(e,t){return se(this.db,e,t)}async createSession(e,t){return ce(this.db,e,t)}async updateSession(e,t,n){le(this.db,e,t,n)}async deleteSession(e,t){De(this.db,e),Ne(this.db,e),qe(this.db,e),ue(this.db,e,t)}async getMessages(e,t){return await this.getSession(e,t)?ve(this.db,e):[]}async getMessagesPage(e,t,n){return await this.getSession(e,n)?ye(this.db,e,t):{messages:[],hasMore:!1,nextBeforeSequence:null}}async searchAtChats(e,t,n){return be(this.db,e,t,n)}async getMessage(e,t){return Se(this.db,e,t)}async saveMessage(e,t){return Ce(this.db,e,t)}async updateMessage(e,t,n){we(this.db,e,t,n)}async deleteMessagesAfter(e,t,n){await this.getSession(e,n)&&Te(this.db,e,t)}async deleteMessagesAfterMessageId(e,t,n){if(!await this.getSession(e,n))return;let r=await this.getMessage(t,n);if(r&&r.sessionId===e){if(r.sequence===null||r.sequence===void 0)throw Error(`消息 ${t} 缺少序号,无法删除后续消息`);Ee(this.db,e,t,r.sequence)}}async getOperations(e,t){return await this.getSession(e,t)?ke(this.db,e):[]}async getOperationsByMessage(e,t){return Ae(this.db,e,t)}async saveOperation(e,t){return je(this.db,e,t)}async updateOperationStatus(e,t,n){Me(this.db,e,t,n)}async getBackups(e){return Ie(this.db,e)}async saveBackup(e){return Le(this.db,e)}async deleteExpiredBackups(){return Re(this.db)}async getTrashItems(e){return Be(this.db,e)}async moveToTrash(e,t){return Ve(this.db,e,t,this.config)}async restoreFromTrash(e,t){return He(this.db,e,t)}async emptyExpiredTrash(){return Ue(this.db)}async saveEmbedding(e,t,n,r,i){Ge(this.db,e,t,n,r,i)}async searchSimilar(e,t,n){return Ke(this.db,e,t,n)}async getUserSetting(e,t){return Ye(this.sqlite,e,t)}async setUserSetting(e,t,n){return Xe(this.sqlite,e,t,n)}async getUserSettings(e){return Ze(this.sqlite,e)}async deleteUserSetting(e,t){return Qe(this.sqlite,e,t)}async close(){this.sqlite.close()}}}));async function tt(e){try{await e`CREATE EXTENSION IF NOT EXISTS vector`}catch{}await e`
157
+ `).run(t,n.appId||null,n.userId||null)}var $e=g((()=>{})),et=_({SqliteAdapter:()=>B}),B,V=g((()=>{M(),ue(),Oe(),Pe(),ze(),We(),Je(),$e(),B=class{sqlite;db;config;get sqliteInstance(){return this.sqlite}constructor(e,t){this.sqlite=t.sqliteFactory(e),this.db=o(this.sqlite),this.config=t,re(this.sqlite)}async getSessions(e){return ae(this.db,e)}async getSession(e,t){return oe(this.db,e,t)}async createSession(e,t){return se(this.db,e,t)}async updateSession(e,t,n){ce(this.db,e,t,n)}async deleteSession(e,t){De(this.db,e),Ne(this.db,e),qe(this.db,e),le(this.db,e,t)}async getMessages(e,t){return await this.getSession(e,t)?ve(this.db,e):[]}async getMessagesPage(e,t,n){return await this.getSession(e,n)?ye(this.db,e,t):{messages:[],hasMore:!1,nextBeforeSequence:null}}async searchAtChats(e,t,n){return be(this.db,e,t,n)}async getMessage(e,t){return Se(this.db,e,t)}async saveMessage(e,t){return Ce(this.db,e,t)}async updateMessage(e,t,n){we(this.db,e,t,n)}async deleteMessagesAfter(e,t,n){await this.getSession(e,n)&&Te(this.db,e,t)}async deleteMessagesAfterMessageId(e,t,n){if(!await this.getSession(e,n))return;let r=await this.getMessage(t,n);if(r&&r.sessionId===e){if(r.sequence===null||r.sequence===void 0)throw Error(`消息 ${t} 缺少序号,无法删除后续消息`);Ee(this.db,e,t,r.sequence)}}async getOperations(e,t){return await this.getSession(e,t)?ke(this.db,e):[]}async getOperationsByMessage(e,t){return Ae(this.db,e,t)}async saveOperation(e,t){return je(this.db,e,t)}async updateOperationStatus(e,t,n){Me(this.db,e,t,n)}async getBackups(e){return Ie(this.db,e)}async saveBackup(e){return Le(this.db,e)}async deleteExpiredBackups(){return Re(this.db)}async getTrashItems(e){return Be(this.db,e)}async moveToTrash(e,t){return Ve(this.db,e,t,this.config)}async restoreFromTrash(e,t){return He(this.db,e,t)}async emptyExpiredTrash(){return Ue(this.db)}async saveEmbedding(e,t,n,r,i){Ge(this.db,e,t,n,r,i)}async searchSimilar(e,t,n){return Ke(this.db,e,t,n)}async getUserSetting(e,t){return Ye(this.sqlite,e,t)}async setUserSetting(e,t,n){return Xe(this.sqlite,e,t,n)}async getUserSettings(e){return Ze(this.sqlite,e)}async deleteUserSetting(e,t){return Qe(this.sqlite,e,t)}async close(){this.sqlite.close()}}}));async function tt(e){try{await e`CREATE EXTENSION IF NOT EXISTS vector`}catch{}await e`
157
158
  CREATE TABLE IF NOT EXISTS schema_meta (
158
159
  key TEXT PRIMARY KEY,
159
160
  value TEXT NOT NULL
@@ -195,6 +196,7 @@ import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,unique
195
196
  at_context_items TEXT,
196
197
  images TEXT,
197
198
  model TEXT,
199
+ model_display_name TEXT,
198
200
  mode TEXT,
199
201
  web_search_enabled BOOLEAN,
200
202
  thinking_enabled BOOLEAN,
@@ -209,6 +211,9 @@ import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,unique
209
211
  `,await e`
210
212
  ALTER TABLE messages
211
213
  ADD COLUMN IF NOT EXISTS finish_reason TEXT
214
+ `,await e`
215
+ ALTER TABLE messages
216
+ ADD COLUMN IF NOT EXISTS model_display_name TEXT
212
217
  `,await e`
213
218
  CREATE TABLE IF NOT EXISTS message_parts (
214
219
  message_id TEXT NOT NULL,
@@ -295,7 +300,7 @@ import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,unique
295
300
  INSERT INTO schema_meta (key, value)
296
301
  VALUES ('schema_version', ${H})
297
302
  ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value
298
- `}function nt(e,t){if(e.length===0||t.length===0||e.length!==t.length)return 0;let n=0,r=0,i=0;for(let a=0;a<e.length;a+=1)n+=e[a]*t[a],r+=e[a]*e[a],i+=t[a]*t[a];return r===0||i===0?0:n/(Math.sqrt(r)*Math.sqrt(i))}var H,U=_((()=>{H=`3`}));function W(e){return{id:e.id,appId:e.app_id,userId:e.user_id,title:e.title,model:e.model,mode:e.mode,webSearchEnabled:e.web_search_enabled,thinkingEnabled:e.thinking_enabled,hidden:e.hidden,createdAt:new Date(e.created_at),updatedAt:new Date(e.updated_at)}}async function rt(e,t){return(await e`
303
+ `}function nt(e,t){if(e.length===0||t.length===0||e.length!==t.length)return 0;let n=0,r=0,i=0;for(let a=0;a<e.length;a+=1)n+=e[a]*t[a],r+=e[a]*e[a],i+=t[a]*t[a];return r===0||i===0?0:n/(Math.sqrt(r)*Math.sqrt(i))}var H,U=g((()=>{H=`3`}));function W(e){return{id:e.id,appId:e.app_id,userId:e.user_id,title:e.title,model:e.model,mode:e.mode,webSearchEnabled:e.web_search_enabled,thinkingEnabled:e.thinking_enabled,hidden:e.hidden,createdAt:new Date(e.created_at),updatedAt:new Date(e.updated_at)}}async function rt(e,t){return(await e`
299
304
  SELECT id, app_id, user_id, title, model, mode, web_search_enabled, thinking_enabled, hidden, created_at, updated_at
300
305
  FROM sessions
301
306
  WHERE (${t.appId||null}::TEXT IS NULL OR app_id = ${t.appId||null})
@@ -333,7 +338,7 @@ import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,unique
333
338
  WHERE id = ${t}
334
339
  AND (${n.appId||null}::TEXT IS NULL OR app_id = ${n.appId||null})
335
340
  AND (${n.userId||null}::TEXT IS NULL OR user_id = ${n.userId||null})
336
- `}var ct=_((()=>{}));function lt(e,t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}function ut(e,t){if(!t)return null;try{let e=JSON.parse(t);return Array.isArray(e)?e:null}catch{return null}}function dt(e){switch(e){case`stop`:case`length`:case`tool_calls`:case`error`:case`abort`:case`max_iterations`:case`max_duration`:case`max_tool_calls`:case`max_tokens`:return e;default:return null}}function G(e,t){if(typeof t==`number`&&Number.isFinite(t))return t;if(t instanceof Date)return t.getTime();if(typeof t==`string`){let e=Date.parse(t);if(!Number.isNaN(e))return e}throw Error(`消息 ${e} 的时间戳无效: ${t}`)}function ft(e){return{messageId:e.message_id,sequence:e.sequence,type:e.type,payload:e.payload}}function K(e,t){let n=new Map;for(let e of t){let t=ft(e),r=n.get(t.messageId)??[];r.push(t),n.set(t.messageId,r)}return e.map(e=>({id:e.id,clientId:e.client_id||e.id,sessionId:e.session_id,appId:e.app_id,userId:e.user_id,role:e.role,content:e.content,atContextItems:ut(e.id,e.at_context_items),images:lt(e.id,e.images),model:e.model,mode:e.mode,webSearchEnabled:e.web_search_enabled,thinkingEnabled:e.thinking_enabled,parts:n.get(e.id)??[],operationIds:e.operation_ids,usage:e.usage,duration:e.duration==null?null:Number(e.duration),finishReason:dt(e.finish_reason),sequence:e.sequence,timestamp:G(e.id,e.timestamp)}))}function pt(e){return e?.trim().toLowerCase()??``}function mt(e,t=120){let n=e?.replace(/\s+/g,` `).trim()??``;return n?n.length>t?`${n.slice(0,t-1)}...`:n:``}async function q(e,t){return t.length===0?[]:e`
341
+ `}var ct=g((()=>{}));function lt(e,t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}function ut(e,t){if(!t)return null;try{let e=JSON.parse(t);return Array.isArray(e)?e:null}catch{return null}}function dt(e){switch(e){case`stop`:case`length`:case`tool_calls`:case`error`:case`abort`:case`max_iterations`:case`max_duration`:case`max_tool_calls`:case`max_tokens`:return e;default:return null}}function G(e,t){if(typeof t==`number`&&Number.isFinite(t))return t;if(t instanceof Date)return t.getTime();if(typeof t==`string`){let e=Date.parse(t);if(!Number.isNaN(e))return e}throw Error(`消息 ${e} 的时间戳无效: ${t}`)}function ft(e){return{messageId:e.message_id,sequence:e.sequence,type:e.type,payload:e.payload}}function K(e,t){let n=new Map;for(let e of t){let t=ft(e),r=n.get(t.messageId)??[];r.push(t),n.set(t.messageId,r)}return e.map(e=>({id:e.id,clientId:e.client_id||e.id,sessionId:e.session_id,appId:e.app_id,userId:e.user_id,role:e.role,content:e.content,atContextItems:ut(e.id,e.at_context_items),images:lt(e.id,e.images),model:e.model,modelDisplayName:e.model_display_name,mode:e.mode,webSearchEnabled:e.web_search_enabled,thinkingEnabled:e.thinking_enabled,parts:n.get(e.id)??[],operationIds:e.operation_ids,usage:e.usage,duration:e.duration==null?null:Number(e.duration),finishReason:dt(e.finish_reason),sequence:e.sequence,timestamp:G(e.id,e.timestamp)}))}function pt(e){return e?.trim().toLowerCase()??``}function mt(e,t=120){let n=e?.replace(/\s+/g,` `).trim()??``;return n?n.length>t?`${n.slice(0,t-1)}...`:n:``}async function q(e,t){return t.length===0?[]:e`
337
342
  SELECT message_id, sequence, type, payload
338
343
  FROM message_parts
339
344
  WHERE message_id = ANY(${t}::text[])
@@ -417,7 +422,7 @@ import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,unique
417
422
  `;if(!r[0])return null;let i=await q(e,[t]);return K([r[0]],i)[0]??null}async function bt(e,t,n){let r=Date.now(),i=new Date(r),a=t.clientId||t.id;return e.begin(async e=>{let o=await ht(e,t.sessionId);return await e`
418
423
  INSERT INTO messages (
419
424
  id, client_id, session_id, app_id, user_id, role, content, at_context_items, images,
420
- model, mode, web_search_enabled, thinking_enabled, operation_ids, usage, duration, finish_reason, sequence, timestamp
425
+ model, model_display_name, mode, web_search_enabled, thinking_enabled, operation_ids, usage, duration, finish_reason, sequence, timestamp
421
426
  )
422
427
  VALUES (
423
428
  ${t.id},
@@ -430,6 +435,7 @@ import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,unique
430
435
  ${t.atContextItems?JSON.stringify(t.atContextItems):null},
431
436
  ${t.images&&t.images.length>0?JSON.stringify(t.images):null},
432
437
  ${t.model},
438
+ ${t.modelDisplayName??null},
433
439
  ${t.mode},
434
440
  ${t.webSearchEnabled},
435
441
  ${t.thinkingEnabled},
@@ -440,7 +446,7 @@ import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,unique
440
446
  ${o},
441
447
  ${i}
442
448
  )
443
- `,t.parts&&t.parts.length>0&&await J(e,t.id,t.parts),{id:t.id,clientId:a,sessionId:t.sessionId,appId:n.appId||null,userId:n.userId||null,role:t.role,content:t.content,atContextItems:t.atContextItems||null,images:t.images||[],model:t.model,mode:t.mode,webSearchEnabled:t.webSearchEnabled,thinkingEnabled:t.thinkingEnabled,parts:(t.parts??[]).map((e,n)=>({messageId:t.id,sequence:n,type:e.type,payload:e.payload})),operationIds:t.operationIds,usage:null,duration:null,finishReason:t.finishReason??null,sequence:o,timestamp:r}})}async function xt(e,t,n,r){await e.begin(async e=>{let i=[],a=[],o=1;if(n.content!==void 0&&(i.push(`content = $${o++}`),a.push(n.content)),n.atContextItems!==void 0&&(i.push(`at_context_items = $${o++}`),a.push(n.atContextItems?JSON.stringify(n.atContextItems):null)),n.operationIds!==void 0&&(i.push(`operation_ids = $${o++}`),a.push(n.operationIds)),n.usage!==void 0&&(i.push(`usage = $${o++}`),a.push(n.usage)),n.duration!==void 0&&(i.push(`duration = $${o++}`),a.push(n.duration)),n.finishReason!==void 0&&(i.push(`finish_reason = $${o++}`),a.push(n.finishReason)),i.length>0){let n=`WHERE id = $${o++}${r.appId?` AND app_id = $${o++}`:``}${r.userId?` AND user_id = $${o++}`:``}`;a.push(t),r.appId&&a.push(r.appId),r.userId&&a.push(r.userId),await e.unsafe(`UPDATE messages SET ${i.join(`, `)} ${n}`,a)}n.parts!==void 0&&await J(e,t,n.parts)})}async function St(e,t,n){await e.begin(async e=>{let r=(await e`
449
+ `,t.parts&&t.parts.length>0&&await J(e,t.id,t.parts),{id:t.id,clientId:a,sessionId:t.sessionId,appId:n.appId||null,userId:n.userId||null,role:t.role,content:t.content,atContextItems:t.atContextItems||null,images:t.images||[],model:t.model,modelDisplayName:t.modelDisplayName??null,mode:t.mode,webSearchEnabled:t.webSearchEnabled,thinkingEnabled:t.thinkingEnabled,parts:(t.parts??[]).map((e,n)=>({messageId:t.id,sequence:n,type:e.type,payload:e.payload})),operationIds:t.operationIds,usage:null,duration:null,finishReason:t.finishReason??null,sequence:o,timestamp:r}})}async function xt(e,t,n,r){await e.begin(async e=>{let i=[],a=[],o=1;if(n.content!==void 0&&(i.push(`content = $${o++}`),a.push(n.content)),n.atContextItems!==void 0&&(i.push(`at_context_items = $${o++}`),a.push(n.atContextItems?JSON.stringify(n.atContextItems):null)),n.operationIds!==void 0&&(i.push(`operation_ids = $${o++}`),a.push(n.operationIds)),n.usage!==void 0&&(i.push(`usage = $${o++}`),a.push(n.usage)),n.duration!==void 0&&(i.push(`duration = $${o++}`),a.push(n.duration)),n.finishReason!==void 0&&(i.push(`finish_reason = $${o++}`),a.push(n.finishReason)),i.length>0){let n=`WHERE id = $${o++}${r.appId?` AND app_id = $${o++}`:``}${r.userId?` AND user_id = $${o++}`:``}`;a.push(t),r.appId&&a.push(r.appId),r.userId&&a.push(r.userId),await e.unsafe(`UPDATE messages SET ${i.join(`, `)} ${n}`,a)}n.parts!==void 0&&await J(e,t,n.parts)})}async function St(e,t,n){await e.begin(async e=>{let r=(await e`
444
450
  SELECT id FROM messages
445
451
  WHERE session_id = ${t}
446
452
  AND timestamp > ${n}
@@ -459,7 +465,7 @@ import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,unique
459
465
  `})}async function wt(e,t){await e.begin(async e=>{let n=(await e`
460
466
  SELECT id FROM messages
461
467
  WHERE session_id = ${t}
462
- `).map(e=>e.id);n.length>0&&await e`DELETE FROM message_parts WHERE message_id = ANY(${n}::text[])`,await e`DELETE FROM messages WHERE session_id = ${t}`})}var Tt=_((()=>{}));function Y(e){return{id:e.id,sessionId:e.session_id,messageId:e.message_id,appId:e.app_id,userId:e.user_id,command:e.command,operationType:e.operation_type,affectedFiles:e.affected_files,backupPath:e.backup_path,status:e.status,errorMessage:e.error_message,timestamp:new Date(e.timestamp)}}async function Et(e,t){return(await e`
468
+ `).map(e=>e.id);n.length>0&&await e`DELETE FROM message_parts WHERE message_id = ANY(${n}::text[])`,await e`DELETE FROM messages WHERE session_id = ${t}`})}var Tt=g((()=>{}));function Y(e){return{id:e.id,sessionId:e.session_id,messageId:e.message_id,appId:e.app_id,userId:e.user_id,command:e.command,operationType:e.operation_type,affectedFiles:e.affected_files,backupPath:e.backup_path,status:e.status,errorMessage:e.error_message,timestamp:new Date(e.timestamp)}}async function Et(e,t){return(await e`
463
469
  SELECT id, session_id, message_id, app_id, user_id, command, operation_type,
464
470
  affected_files, backup_path, status, error_message, timestamp
465
471
  FROM operations
@@ -479,14 +485,14 @@ import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,unique
479
485
  UPDATE operations
480
486
  SET status = ${n}, error_message = ${r||null}
481
487
  WHERE id = ${t}
482
- `}async function At(e,t){await e`DELETE FROM operations WHERE session_id = ${t}`}var jt=_((()=>{}));function Mt(e){return{id:e.id,operationId:e.operation_id,originalPath:e.original_path,backupPath:e.backup_path,fileSize:e.file_size,fileHash:e.file_hash,createdAt:new Date(e.created_at),expiresAt:new Date(e.expires_at)}}async function Nt(e,t){return(await e`
488
+ `}async function At(e,t){await e`DELETE FROM operations WHERE session_id = ${t}`}var jt=g((()=>{}));function Mt(e){return{id:e.id,operationId:e.operation_id,originalPath:e.original_path,backupPath:e.backup_path,fileSize:e.file_size,fileHash:e.file_hash,createdAt:new Date(e.created_at),expiresAt:new Date(e.expires_at)}}async function Nt(e,t){return(await e`
483
489
  SELECT id, operation_id, original_path, backup_path, file_size, file_hash, created_at, expires_at
484
490
  FROM backups
485
491
  WHERE operation_id = ${t}
486
492
  `).map(Mt)}async function Pt(e,t){let n=new Date;return await e`
487
493
  INSERT INTO backups (id, operation_id, original_path, backup_path, file_size, file_hash, created_at, expires_at)
488
494
  VALUES (${t.id}, ${t.operationId}, ${t.originalPath}, ${t.backupPath}, ${t.fileSize}, ${t.fileHash}, ${n}, ${t.expiresAt})
489
- `,{...t,createdAt:n}}async function Ft(e){return(await e`DELETE FROM backups WHERE expires_at < NOW()`).count}var It=_((()=>{}));function X(e){return{id:e.id,sessionId:e.session_id,appId:e.app_id,userId:e.user_id,originalPath:e.original_path,trashPath:e.trash_path,deletedAt:new Date(e.deleted_at),autoDeleteAt:new Date(e.auto_delete_at)}}async function Lt(e,t){return(await e`
495
+ `,{...t,createdAt:n}}async function Ft(e){return(await e`DELETE FROM backups WHERE expires_at < NOW()`).count}var It=g((()=>{}));function X(e){return{id:e.id,sessionId:e.session_id,appId:e.app_id,userId:e.user_id,originalPath:e.original_path,trashPath:e.trash_path,deletedAt:new Date(e.deleted_at),autoDeleteAt:new Date(e.auto_delete_at)}}async function Lt(e,t){return(await e`
490
496
  SELECT id, session_id, app_id, user_id, original_path, trash_path, deleted_at, auto_delete_at
491
497
  FROM trash
492
498
  WHERE (${t.appId||null}::TEXT IS NULL OR app_id = ${t.appId||null})
@@ -501,7 +507,7 @@ import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,unique
501
507
  WHERE id = ${t}
502
508
  AND (${n.appId||null}::TEXT IS NULL OR app_id = ${n.appId||null})
503
509
  AND (${n.userId||null}::TEXT IS NULL OR user_id = ${n.userId||null})
504
- `;if(!r[0])throw Error(`回收站记录不存在`);return await e`DELETE FROM trash WHERE id = ${t}`,X(r[0])}async function Bt(e){return(await e`DELETE FROM trash WHERE auto_delete_at < NOW()`).count}var Vt=_((()=>{}));async function Z(e,t,n,r,i,a){let o=`[${r.join(`,`)}]`;try{await e`
510
+ `;if(!r[0])throw Error(`回收站记录不存在`);return await e`DELETE FROM trash WHERE id = ${t}`,X(r[0])}async function Bt(e){return(await e`DELETE FROM trash WHERE auto_delete_at < NOW()`).count}var Vt=g((()=>{}));async function Z(e,t,n,r,i,a){let o=`[${r.join(`,`)}]`;try{await e`
505
511
  INSERT INTO embeddings (id, session_id, message_id, app_id, user_id, content, content_type, embedding, metadata, created_at)
506
512
  VALUES (${t}, ${i.sessionId}, ${i.messageId||null}, ${a.appId||null}, ${a.userId||null}, ${n}, ${i.contentType}, ${o}::vector, ${JSON.stringify(i)}, NOW())
507
513
  `}catch{await e`
@@ -523,7 +529,7 @@ import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,unique
523
529
  WHERE (${r.appId||null}::TEXT IS NULL OR app_id = ${r.appId||null})
524
530
  AND (${r.userId||null}::TEXT IS NULL OR user_id = ${r.userId||null})
525
531
  AND (${o||null}::TEXT IS NULL OR session_id = ${o||null})
526
- `).map(e=>{let n=[];if(typeof e.embedding==`string`)try{n=JSON.parse(e.embedding.replace(/^\[|\]$/g,``).split(`,`).map(Number).join(`,`))}catch{n=e.embedding.slice(1,-1).split(`,`).map(Number)}else Array.isArray(e.embedding)&&(n=e.embedding);let r=nt(t,n);return{id:e.id,content:e.content,contentType:e.content_type,similarity:r,metadata:e.metadata}}).filter(e=>e.similarity>=a).sort((e,t)=>t.similarity-e.similarity).slice(0,i)}}async function Ut(e,t){await e`DELETE FROM embeddings WHERE session_id = ${t}`}var Wt=_((()=>{U()})),Gt=v({PostgresAdapter:()=>Q}),Q,$=_((()=>{U(),ct(),Tt(),jt(),It(),Vt(),Wt(),Q=class{sql;config;initialized=!1;constructor(e,t){this.sql=m(e),this.config=t}async ensureInitialized(){this.initialized||=(await tt(this.sql),!0)}async getSessions(e){return await this.ensureInitialized(),rt(this.sql,e)}async getSession(e,t){return await this.ensureInitialized(),it(this.sql,e,t)}async createSession(e,t){return await this.ensureInitialized(),at(this.sql,e,t)}async updateSession(e,t,n){await this.ensureInitialized(),await ot(this.sql,e,t,n)}async deleteSession(e,t){await this.ensureInitialized(),await wt(this.sql,e),await At(this.sql,e),await Ut(this.sql,e),await st(this.sql,e,t)}async getMessages(e,t){return await this.ensureInitialized(),await this.getSession(e,t)?gt(this.sql,e):[]}async getMessagesPage(e,t,n){return await this.ensureInitialized(),await this.getSession(e,n)?_t(this.sql,e,t):{messages:[],hasMore:!1,nextBeforeSequence:null}}async searchAtChats(e,t,n){return await this.ensureInitialized(),vt(this.sql,e,t,n)}async getMessage(e,t){return await this.ensureInitialized(),yt(this.sql,e,t)}async saveMessage(e,t){return await this.ensureInitialized(),bt(this.sql,e,t)}async updateMessage(e,t,n){await this.ensureInitialized(),await xt(this.sql,e,t,n)}async deleteMessagesAfter(e,t,n){await this.ensureInitialized(),await this.getSession(e,n)&&await St(this.sql,e,t)}async deleteMessagesAfterMessageId(e,t,n){if(await this.ensureInitialized(),!await this.getSession(e,n))return;let r=await this.getMessage(t,n);if(r&&r.sessionId===e){if(r.sequence===null||r.sequence===void 0)throw Error(`消息 ${t} 缺少序号,无法删除后续消息`);await Ct(this.sql,e,t,r.sequence)}}async getOperations(e,t){return await this.ensureInitialized(),await this.getSession(e,t)?Et(this.sql,e):[]}async getOperationsByMessage(e,t){return await this.ensureInitialized(),Dt(this.sql,e,t)}async saveOperation(e,t){return await this.ensureInitialized(),Ot(this.sql,e,t)}async updateOperationStatus(e,t,n){await this.ensureInitialized(),await kt(this.sql,e,t,n)}async getBackups(e){return await this.ensureInitialized(),Nt(this.sql,e)}async saveBackup(e){return await this.ensureInitialized(),Pt(this.sql,e)}async deleteExpiredBackups(){return await this.ensureInitialized(),Ft(this.sql)}async getTrashItems(e){return await this.ensureInitialized(),Lt(this.sql,e)}async moveToTrash(e,t){return await this.ensureInitialized(),Rt(this.sql,e,t,this.config)}async restoreFromTrash(e,t){return await this.ensureInitialized(),zt(this.sql,e,t)}async emptyExpiredTrash(){return await this.ensureInitialized(),Bt(this.sql)}async saveEmbedding(e,t,n,r,i){await this.ensureInitialized(),await Z(this.sql,e,t,n,r,i)}async searchSimilar(e,t,n){return await this.ensureInitialized(),Ht(this.sql,e,t,n)}async getUserSetting(e,t){await this.ensureInitialized();let n=`${t.appId||`default`}_${t.userId||`default`}_${e}`,r=await this.sql`
532
+ `).map(e=>{let n=[];if(typeof e.embedding==`string`)try{n=JSON.parse(e.embedding.replace(/^\[|\]$/g,``).split(`,`).map(Number).join(`,`))}catch{n=e.embedding.slice(1,-1).split(`,`).map(Number)}else Array.isArray(e.embedding)&&(n=e.embedding);let r=nt(t,n);return{id:e.id,content:e.content,contentType:e.content_type,similarity:r,metadata:e.metadata}}).filter(e=>e.similarity>=a).sort((e,t)=>t.similarity-e.similarity).slice(0,i)}}async function Ut(e,t){await e`DELETE FROM embeddings WHERE session_id = ${t}`}var Wt=g((()=>{U()})),Gt=_({PostgresAdapter:()=>Q}),Q,$=g((()=>{U(),ct(),Tt(),jt(),It(),Vt(),Wt(),Q=class{sql;config;initialized=!1;constructor(e,t){this.sql=m(e),this.config=t}async ensureInitialized(){this.initialized||=(await tt(this.sql),!0)}async getSessions(e){return await this.ensureInitialized(),rt(this.sql,e)}async getSession(e,t){return await this.ensureInitialized(),it(this.sql,e,t)}async createSession(e,t){return await this.ensureInitialized(),at(this.sql,e,t)}async updateSession(e,t,n){await this.ensureInitialized(),await ot(this.sql,e,t,n)}async deleteSession(e,t){await this.ensureInitialized(),await wt(this.sql,e),await At(this.sql,e),await Ut(this.sql,e),await st(this.sql,e,t)}async getMessages(e,t){return await this.ensureInitialized(),await this.getSession(e,t)?gt(this.sql,e):[]}async getMessagesPage(e,t,n){return await this.ensureInitialized(),await this.getSession(e,n)?_t(this.sql,e,t):{messages:[],hasMore:!1,nextBeforeSequence:null}}async searchAtChats(e,t,n){return await this.ensureInitialized(),vt(this.sql,e,t,n)}async getMessage(e,t){return await this.ensureInitialized(),yt(this.sql,e,t)}async saveMessage(e,t){return await this.ensureInitialized(),bt(this.sql,e,t)}async updateMessage(e,t,n){await this.ensureInitialized(),await xt(this.sql,e,t,n)}async deleteMessagesAfter(e,t,n){await this.ensureInitialized(),await this.getSession(e,n)&&await St(this.sql,e,t)}async deleteMessagesAfterMessageId(e,t,n){if(await this.ensureInitialized(),!await this.getSession(e,n))return;let r=await this.getMessage(t,n);if(r&&r.sessionId===e){if(r.sequence===null||r.sequence===void 0)throw Error(`消息 ${t} 缺少序号,无法删除后续消息`);await Ct(this.sql,e,t,r.sequence)}}async getOperations(e,t){return await this.ensureInitialized(),await this.getSession(e,t)?Et(this.sql,e):[]}async getOperationsByMessage(e,t){return await this.ensureInitialized(),Dt(this.sql,e,t)}async saveOperation(e,t){return await this.ensureInitialized(),Ot(this.sql,e,t)}async updateOperationStatus(e,t,n){await this.ensureInitialized(),await kt(this.sql,e,t,n)}async getBackups(e){return await this.ensureInitialized(),Nt(this.sql,e)}async saveBackup(e){return await this.ensureInitialized(),Pt(this.sql,e)}async deleteExpiredBackups(){return await this.ensureInitialized(),Ft(this.sql)}async getTrashItems(e){return await this.ensureInitialized(),Lt(this.sql,e)}async moveToTrash(e,t){return await this.ensureInitialized(),Rt(this.sql,e,t,this.config)}async restoreFromTrash(e,t){return await this.ensureInitialized(),zt(this.sql,e,t)}async emptyExpiredTrash(){return await this.ensureInitialized(),Bt(this.sql)}async saveEmbedding(e,t,n,r,i){await this.ensureInitialized(),await Z(this.sql,e,t,n,r,i)}async searchSimilar(e,t,n){return await this.ensureInitialized(),Ht(this.sql,e,t,n)}async getUserSetting(e,t){await this.ensureInitialized();let n=`${t.appId||`default`}_${t.userId||`default`}_${e}`,r=await this.sql`
527
533
  SELECT value FROM user_settings
528
534
  WHERE id = ${n}
529
535
  LIMIT 1
@@ -542,4 +548,4 @@ import{index as e,integer as t,primaryKey as n,sqliteTable as r,text as i,unique
542
548
  WHERE key = ${e}
543
549
  AND app_id IS NOT DISTINCT FROM ${t.appId||null}
544
550
  AND user_id IS NOT DISTINCT FROM ${t.userId||null}
545
- `}async close(){await this.sql.end()}}}));E(),V(),$();async function Kt(e){switch(e.type){case`sqlite`:{if(!e.sqlitePath)throw Error(`SQLite 需要提供 sqlitePath 配置`);if(!e.sqliteFactory)throw Error(`SQLite 需要提供 sqliteFactory 配置`);let t=te(e.sqlitePath);ee(t)||h(t,{recursive:!0});let{SqliteAdapter:n}=await Promise.resolve().then(()=>(V(),et));return new n(e.sqlitePath,e)}case`postgres`:{if(!e.postgresUrl)throw Error(`PostgreSQL 需要提供 postgresUrl 配置`);let{PostgresAdapter:t}=await Promise.resolve().then(()=>($(),Gt));return new t(e.postgresUrl,e)}}throw Error(`不支持的存储类型`)}function qt(){return`${process.env.HOME||process.env.USERPROFILE||`.`}/.ai-chat/db.sqlite`}function Jt(){return`${process.env.HOME||process.env.USERPROFILE||`.`}/.ai-chat/backups`}function Yt(){return`${process.env.HOME||process.env.USERPROFILE||`.`}/.ai-chat/trash`}export{Q as PostgresAdapter,B as SqliteAdapter,C as backups,Kt as createStorage,T as embeddings,Jt as getDefaultBackupDir,qt as getDefaultStoragePath,Yt as getDefaultTrashDir,x as messageParts,b as messages,S as operations,y as sessions,w as trash};
551
+ `}async close(){await this.sql.end()}}}));T(),V(),$();async function Kt(e){switch(e.type){case`sqlite`:{if(!e.sqlitePath)throw Error(`SQLite 需要提供 sqlitePath 配置`);if(!e.sqliteFactory)throw Error(`SQLite 需要提供 sqliteFactory 配置`);let t=ne(e.sqlitePath);ee(t)||te(t,{recursive:!0});let{SqliteAdapter:n}=await Promise.resolve().then(()=>(V(),et));return new n(e.sqlitePath,e)}case`postgres`:{if(!e.postgresUrl)throw Error(`PostgreSQL 需要提供 postgresUrl 配置`);let{PostgresAdapter:t}=await Promise.resolve().then(()=>($(),Gt));return new t(e.postgresUrl,e)}}throw Error(`不支持的存储类型`)}function qt(){return`${process.env.HOME||process.env.USERPROFILE||`.`}/.ai-chat/db.sqlite`}function Jt(){return`${process.env.HOME||process.env.USERPROFILE||`.`}/.ai-chat/backups`}function Yt(){return`${process.env.HOME||process.env.USERPROFILE||`.`}/.ai-chat/trash`}export{Q as PostgresAdapter,B as SqliteAdapter,S as backups,Kt as createStorage,w as embeddings,Jt as getDefaultBackupDir,qt as getDefaultStoragePath,Yt as getDefaultTrashDir,b as messageParts,y as messages,x as operations,v as sessions,C as trash};
package/dist/schema.d.ts CHANGED
@@ -421,6 +421,25 @@ export declare const messages: import("drizzle-orm/sqlite-core").SQLiteTableWith
421
421
  }, {}, {
422
422
  length: number | undefined;
423
423
  }>;
424
+ modelDisplayName: import("drizzle-orm/sqlite-core").SQLiteColumn<{
425
+ name: "model_display_name";
426
+ tableName: "messages";
427
+ dataType: "string";
428
+ columnType: "SQLiteText";
429
+ data: string;
430
+ driverParam: string;
431
+ notNull: false;
432
+ hasDefault: false;
433
+ isPrimaryKey: false;
434
+ isAutoincrement: false;
435
+ hasRuntimeDefault: false;
436
+ enumValues: [string, ...string[]];
437
+ baseColumn: never;
438
+ identity: undefined;
439
+ generated: undefined;
440
+ }, {}, {
441
+ length: number | undefined;
442
+ }>;
424
443
  mode: import("drizzle-orm/sqlite-core").SQLiteColumn<{
425
444
  name: "mode";
426
445
  tableName: "messages";
package/dist/types.d.ts CHANGED
@@ -40,6 +40,8 @@ export interface MessageRecord {
40
40
  images: string[];
41
41
  /** 生成此消息时使用的模型 */
42
42
  model: string | null;
43
+ /** 生成此消息时使用的模型展示名 */
44
+ modelDisplayName: string | null;
43
45
  /** 生成此消息时使用的模式 (ask/agent) */
44
46
  mode: string | null;
45
47
  /** 生成此消息时是否启用 web 搜索 */
@@ -60,7 +62,8 @@ export interface MessageRecord {
60
62
  /** 时间戳(毫秒,Unix 时间戳,不受 JSON 序列化影响) */
61
63
  timestamp: number;
62
64
  }
63
- export type CreateMessageInput = Omit<MessageRecord, 'timestamp' | 'appId' | 'userId' | 'sequence' | 'usage' | 'duration' | 'finishReason' | 'parts'> & {
65
+ export type CreateMessageInput = Omit<MessageRecord, 'timestamp' | 'appId' | 'userId' | 'sequence' | 'usage' | 'duration' | 'finishReason' | 'parts' | 'modelDisplayName'> & {
66
+ modelDisplayName?: string | null;
64
67
  parts?: MessagePartInput[];
65
68
  finishReason?: MessageRecord['finishReason'];
66
69
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huyooo/ai-chat-storage",
3
- "version": "0.3.21",
3
+ "version": "0.3.23",
4
4
  "description": "AI Chat 统一存储层 - SQLite",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -26,7 +26,7 @@
26
26
  "test:watch": "vitest"
27
27
  },
28
28
  "dependencies": {
29
- "@huyooo/ai-chat-types": "^0.3.21",
29
+ "@huyooo/ai-chat-types": "^0.3.23",
30
30
  "drizzle-orm": "^0.38.0",
31
31
  "postgres": "^3.4.7"
32
32
  },