@huyooo/ai-chat-storage 0.3.21 → 0.3.22
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 +24 -18
- package/dist/schema.d.ts +19 -0
- package/dist/types.d.ts +4 -1
- package/package.json +2 -2
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
|
|
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
|
-
`),
|
|
133
|
-
lower(${
|
|
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 ${
|
|
137
|
-
WHERE ${
|
|
138
|
-
AND lower(${
|
|
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:
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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()}}}));
|
|
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.
|
|
3
|
+
"version": "0.3.22",
|
|
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.
|
|
29
|
+
"@huyooo/ai-chat-types": "^0.3.22",
|
|
30
30
|
"drizzle-orm": "^0.38.0",
|
|
31
31
|
"postgres": "^3.4.7"
|
|
32
32
|
},
|