@undefineds.co/xpod 0.2.23 → 0.2.26
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/api/chatkit/pod-store.d.ts +3 -0
- package/dist/api/chatkit/pod-store.js +139 -0
- package/dist/api/chatkit/pod-store.js.map +1 -1
- package/dist/api/service/VercelChatService.d.ts +4 -15
- package/dist/api/service/VercelChatService.js +80 -302
- package/dist/api/service/VercelChatService.js.map +1 -1
- package/dist/api/service/ai-gateway-transport.d.ts +23 -0
- package/dist/api/service/ai-gateway-transport.js +131 -0
- package/dist/api/service/ai-gateway-transport.js.map +1 -0
- package/dist/api/service/chat-protocol-adapters.d.ts +5 -0
- package/dist/api/service/chat-protocol-adapters.js +146 -0
- package/dist/api/service/chat-protocol-adapters.js.map +1 -0
- package/dist/api/service/chat-routing.d.ts +8 -0
- package/dist/api/service/chat-routing.js +16 -0
- package/dist/api/service/chat-routing.js.map +1 -0
- package/dist/api/service/provider-http-transport.d.ts +9 -0
- package/dist/api/service/provider-http-transport.js +32 -0
- package/dist/api/service/provider-http-transport.js.map +1 -0
- package/package.json +1 -1
|
@@ -127,6 +127,8 @@ export declare class PodChatKitStore implements ChatKitStore<StoreContext> {
|
|
|
127
127
|
* 复用已缓存的 Session,避免重复登录
|
|
128
128
|
*/
|
|
129
129
|
private extractProviderId;
|
|
130
|
+
private isKnownProvider;
|
|
131
|
+
private pushAvailableModel;
|
|
130
132
|
getAiConfig(context: StoreContext): Promise<{
|
|
131
133
|
providerId: string;
|
|
132
134
|
baseUrl: string;
|
|
@@ -135,6 +137,7 @@ export declare class PodChatKitStore implements ChatKitStore<StoreContext> {
|
|
|
135
137
|
apiKey: string;
|
|
136
138
|
credentialId: string;
|
|
137
139
|
} | undefined>;
|
|
140
|
+
listAvailableModels(context: StoreContext): Promise<any[]>;
|
|
138
141
|
/**
|
|
139
142
|
* 更新凭据状态(如 429 限流)
|
|
140
143
|
* 复用已缓存的 Session
|
|
@@ -1,4 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
26
|
exports.PodChatKitStore = void 0;
|
|
4
27
|
/**
|
|
@@ -937,6 +960,36 @@ WHERE { ${deletePatterns.join(' ')} }
|
|
|
937
960
|
}
|
|
938
961
|
return provider;
|
|
939
962
|
}
|
|
963
|
+
isKnownProvider(providerId, providers) {
|
|
964
|
+
return providers.includes(providerId);
|
|
965
|
+
}
|
|
966
|
+
pushAvailableModel(models, seenModelIds, model) {
|
|
967
|
+
const id = typeof model.id === 'string' ? model.id.trim() : '';
|
|
968
|
+
if (!id || seenModelIds.has(id)) {
|
|
969
|
+
return;
|
|
970
|
+
}
|
|
971
|
+
seenModelIds.add(id);
|
|
972
|
+
const item = {
|
|
973
|
+
id,
|
|
974
|
+
object: 'model',
|
|
975
|
+
};
|
|
976
|
+
if (typeof model.name === 'string' && model.name.trim()) {
|
|
977
|
+
item.name = model.name.trim();
|
|
978
|
+
}
|
|
979
|
+
if (typeof model.provider === 'string' && model.provider.trim()) {
|
|
980
|
+
item.provider = model.provider.trim();
|
|
981
|
+
}
|
|
982
|
+
if (typeof model.ownedBy === 'string' && model.ownedBy.trim()) {
|
|
983
|
+
item.owned_by = model.ownedBy.trim();
|
|
984
|
+
}
|
|
985
|
+
if (typeof model.contextWindow === 'number' && Number.isFinite(model.contextWindow)) {
|
|
986
|
+
item.context_window = model.contextWindow;
|
|
987
|
+
}
|
|
988
|
+
if (typeof model.maxTokens === 'number' && Number.isFinite(model.maxTokens)) {
|
|
989
|
+
item.max_tokens = model.maxTokens;
|
|
990
|
+
}
|
|
991
|
+
models.push(item);
|
|
992
|
+
}
|
|
940
993
|
async getAiConfig(context) {
|
|
941
994
|
const db = await this.getDb(context);
|
|
942
995
|
if (!db) {
|
|
@@ -993,6 +1046,92 @@ WHERE { ${deletePatterns.join(' ')} }
|
|
|
993
1046
|
return undefined;
|
|
994
1047
|
}
|
|
995
1048
|
}
|
|
1049
|
+
async listAvailableModels(context) {
|
|
1050
|
+
const db = await this.getDb(context);
|
|
1051
|
+
if (!db) {
|
|
1052
|
+
return [];
|
|
1053
|
+
}
|
|
1054
|
+
const config = await this.getAiConfig(context);
|
|
1055
|
+
if (!config) {
|
|
1056
|
+
return [];
|
|
1057
|
+
}
|
|
1058
|
+
const models = [];
|
|
1059
|
+
const seenModelIds = new Set();
|
|
1060
|
+
const providerByKey = new Map();
|
|
1061
|
+
let providerDisplayName = config.providerId;
|
|
1062
|
+
try {
|
|
1063
|
+
const providers = await db.select().from(provider_1.Provider);
|
|
1064
|
+
for (const provider of providers) {
|
|
1065
|
+
const uri = typeof provider?.['@id'] === 'string' ? provider['@id'] : undefined;
|
|
1066
|
+
if (uri) {
|
|
1067
|
+
providerByKey.set(uri, provider);
|
|
1068
|
+
}
|
|
1069
|
+
if (typeof provider?.id === 'string' && provider.id) {
|
|
1070
|
+
providerByKey.set(provider.id, provider);
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
const currentProvider = providerByKey.get(config.providerId)
|
|
1074
|
+
?? providers.find((provider) => provider?.baseUrl === config.baseUrl);
|
|
1075
|
+
if (typeof currentProvider?.displayName === 'string' && currentProvider.displayName.trim()) {
|
|
1076
|
+
providerDisplayName = currentProvider.displayName.trim();
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
catch (error) {
|
|
1080
|
+
this.logger.warn(`Failed to load providers for model listing: ${error}`);
|
|
1081
|
+
}
|
|
1082
|
+
try {
|
|
1083
|
+
const { getModels, getProviders } = await Promise.resolve().then(() => __importStar(require('@mariozechner/pi-ai')));
|
|
1084
|
+
const knownProviders = typeof getProviders === 'function' ? getProviders() : [];
|
|
1085
|
+
const providerModels = (typeof getModels === 'function' && this.isKnownProvider(config.providerId, knownProviders)) ? getModels(config.providerId) : [];
|
|
1086
|
+
for (const model of providerModels) {
|
|
1087
|
+
this.pushAvailableModel(models, seenModelIds, {
|
|
1088
|
+
id: model.id,
|
|
1089
|
+
name: model.name || model.id,
|
|
1090
|
+
provider: config.providerId,
|
|
1091
|
+
ownedBy: model.provider || providerDisplayName,
|
|
1092
|
+
contextWindow: model.contextWindow,
|
|
1093
|
+
maxTokens: model.maxTokens,
|
|
1094
|
+
});
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
catch (error) {
|
|
1098
|
+
this.logger.debug(`Failed to load provider model catalog for ${config.providerId}: ${error}`);
|
|
1099
|
+
}
|
|
1100
|
+
try {
|
|
1101
|
+
const podModels = await db.select().from(model_1.Model);
|
|
1102
|
+
for (const model of podModels) {
|
|
1103
|
+
const providerRef = typeof model?.isProvidedBy === 'string' ? model.isProvidedBy : '';
|
|
1104
|
+
const modelProvider = providerByKey.get(providerRef)
|
|
1105
|
+
?? providerByKey.get(this.extractProviderId(providerRef));
|
|
1106
|
+
const modelProviderId = typeof modelProvider?.id === 'string' && modelProvider.id
|
|
1107
|
+
? modelProvider.id
|
|
1108
|
+
: this.extractProviderId(providerRef);
|
|
1109
|
+
if (modelProviderId && modelProviderId !== config.providerId && model.id !== config.defaultModel) {
|
|
1110
|
+
continue;
|
|
1111
|
+
}
|
|
1112
|
+
this.pushAvailableModel(models, seenModelIds, {
|
|
1113
|
+
id: model.id,
|
|
1114
|
+
name: model.displayName || model.id,
|
|
1115
|
+
provider: modelProviderId || config.providerId,
|
|
1116
|
+
ownedBy: modelProvider?.displayName || providerDisplayName,
|
|
1117
|
+
contextWindow: typeof model.contextLength === 'number' ? model.contextLength : undefined,
|
|
1118
|
+
maxTokens: typeof model.maxOutputTokens === 'number' ? model.maxOutputTokens : undefined,
|
|
1119
|
+
});
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
1122
|
+
catch (error) {
|
|
1123
|
+
this.logger.warn(`Failed to load Pod models for ${config.providerId}: ${error}`);
|
|
1124
|
+
}
|
|
1125
|
+
if (config.defaultModel) {
|
|
1126
|
+
this.pushAvailableModel(models, seenModelIds, {
|
|
1127
|
+
id: config.defaultModel,
|
|
1128
|
+
name: config.defaultModel,
|
|
1129
|
+
provider: config.providerId,
|
|
1130
|
+
ownedBy: providerDisplayName,
|
|
1131
|
+
});
|
|
1132
|
+
}
|
|
1133
|
+
return models;
|
|
1134
|
+
}
|
|
996
1135
|
/**
|
|
997
1136
|
* 更新凭据状态(如 429 限流)
|
|
998
1137
|
* 复用已缓存的 Session
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pod-store.js","sourceRoot":"","sources":["../../../src/api/chatkit/pod-store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pod-based ChatKit Store\n *\n * 将 ChatKit 数据存储到 Solid Pod。\n *\n * 存储结构:\n * /.data/chat/{chatId}/\n * index.ttl\n * #this # Chat (meeting:LongChat)\n * #{threadId} # Thread (sioc:Thread)\n * {yyyy}/{MM}/{dd}/messages.ttl # Messages (meeting:Message)\n */\nimport { drizzle, eq, and } from '@undefineds.co/drizzle-solid';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { ChatKitStore, StoreContext } from './store';\nimport type {\n ThreadMetadata,\n ThreadRef,\n ThreadItem,\n Attachment,\n Page,\n StoreItemType,\n UserMessageItem,\n AssistantMessageItem,\n ThreadStatus,\n} from './types';\nimport { generateId, getThreadIdFromRef, nowTimestamp } from './types';\nimport {\n Chat,\n Thread,\n Message,\n MessageRole,\n MessageStatus,\n type ThreadRecord,\n type MessageRecord,\n} from './schema';\nimport type { AuthContext } from '../auth/AuthContext';\nimport { isSolidAuth } from '../auth/AuthContext';\nimport { Provider } from '../../ai/schema/provider';\nimport { Model } from '../../ai/schema/model';\nimport { Credential } from '../../credential/schema/tables';\nimport { ServiceType, CredentialStatus } from '../../credential/schema/types';\n\nconst schema = {\n chat: Chat,\n thread: Thread,\n message: Message,\n provider: Provider,\n model: Model,\n credential: Credential,\n};\n\nexport interface PodChatKitStoreOptions {\n tokenEndpoint: string;\n}\n\ntype QueriedMessageRecord = {\n id: string;\n chat?: string | null;\n thread?: string | null;\n maker?: string | null;\n role?: string | null;\n content?: string | null;\n status?: string | null;\n createdAt?: string | Date | null;\n toolName?: string | null;\n toolCallId?: string | null;\n metadata?: string | null;\n subjectUri?: string | null;\n};\n\ntype ThreadMetadataSource = {\n id: string;\n chatId?: string | null;\n title?: string | null;\n status?: string | null;\n metadata?: string | null;\n createdAt?: string | Date | null;\n updatedAt?: string | Date | null;\n};\n\ntype ResolvedThreadRef = {\n threadId: string;\n chatId: string;\n threadUri: string;\n};\n\n/**\n * Pod-based ChatKit Store implementation\n *\n * 数据模型映射:\n * - ChatKit thread = Thread (sioc:Thread)\n * - ChatKit thread item = Message (meeting:Message)\n * - Chat (meeting:LongChat) 是容器/Agent,通过 metadata.chat_id 暴露\n *\n * 每个 Thread 属于一个 Chat 容器。默认使用 'default' Chat。\n */\nexport class PodChatKitStore implements ChatKitStore<StoreContext> {\n private readonly logger = getLoggerFor(this);\n private readonly tokenEndpoint: string;\n\n /** 默认 Chat 容器 ID */\n private static readonly DEFAULT_CHAT_ID = 'default';\n\n public constructor(options: PodChatKitStoreOptions) {\n this.tokenEndpoint = options.tokenEndpoint;\n }\n\n // =========================================================================\n // Private Helpers\n // =========================================================================\n\n /**\n * 获取认证后的 drizzle 实例 (缓存到 context 中)\n */\n private async getDb(context: StoreContext): Promise<any | null> {\n // Check if we already have a cached db in context\n if ((context as any)._cachedDb) {\n this.logger.debug('Using cached db from context');\n return (context as any)._cachedDb;\n }\n\n const auth = context.auth as AuthContext | undefined;\n\n if (!auth || !isSolidAuth(auth)) {\n this.logger.warn('No valid solid auth in context, cannot access Pod');\n return null;\n }\n\n // Preferred path: directly use caller's Solid access token.\n if (auth.accessToken && auth.webId) {\n try {\n if (auth.tokenType === 'DPoP') {\n this.logger.warn('Using DPoP access token without proof key; Pod access may fail if issuer enforces DPoP proof');\n }\n\n this.logger.info(`[getDb] Using access token path for webId: ${auth.webId}`);\n const authFetch = this.createAccessTokenFetch(auth.accessToken, auth.tokenType);\n const db: any = drizzle(\n { fetch: authFetch, info: { webId: auth.webId, isLoggedIn: true } } as any,\n { schema },\n );\n\n this.logger.info(`Initializing tables for Pod (access token): ${auth.webId}`);\n try {\n await db.init(Chat, Thread, Message);\n this.logger.info('Tables initialized successfully');\n } catch (initError) {\n this.logger.error(`Failed to init tables: ${initError}`);\n }\n\n (context as any)._cachedDb = db;\n (context as any)._cachedFetch = authFetch;\n (context as any)._cachedWebId = auth.webId;\n return db;\n } catch (error) {\n this.logger.error(`Failed to get Pod db with access token: ${error}`);\n return null;\n }\n }\n\n if (!auth.clientId || !auth.clientSecret) {\n this.logger.warn('No accessToken and no valid client credentials in context, cannot access Pod');\n return null;\n }\n\n // Fallback path: exchange client credentials for an access token directly.\n this.logger.info(`[getDb] Using client credentials path for clientId: ${auth.clientId}`);\n try {\n const token = await this.getClientCredentialsAccessToken(auth.clientId, auth.clientSecret);\n const webId = auth.webId ?? this.getWebId(context);\n if (!webId) {\n throw new Error('Missing webId for client credentials auth');\n }\n\n this.logger.info(`[getDb] Client credentials token acquired, webId: ${webId}`);\n const db: any = drizzle(\n { fetch: this.createAccessTokenFetch(token.accessToken, token.tokenType), info: { webId, isLoggedIn: true } } as any,\n { schema },\n );\n const authFetch = this.createAccessTokenFetch(token.accessToken, token.tokenType);\n\n this.logger.info(`Initializing tables for Pod: ${webId}`);\n try {\n await db.init(Chat, Thread, Message);\n this.logger.info('Tables initialized successfully');\n } catch (initError) {\n this.logger.error(`Failed to init tables: ${initError}`);\n }\n\n (context as any)._cachedDb = db;\n (context as any)._cachedFetch = authFetch;\n (context as any)._cachedWebId = webId;\n (context as any)._cachedAccessToken = token.accessToken;\n (context as any)._cachedTokenType = token.tokenType;\n\n return db;\n } catch (error) {\n this.logger.error(`Failed to get Pod db: ${error}`);\n return null;\n }\n }\n\n private async getClientCredentialsAccessToken(clientId: string, clientSecret: string): Promise<{\n accessToken: string;\n tokenType: 'Bearer' | 'DPoP';\n }> {\n const response = await fetch(this.tokenEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: clientId,\n client_secret: clientSecret,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Client credentials token request failed: ${response.status} ${await response.text().catch(() => '')}`);\n }\n\n const token = await response.json() as { access_token?: string; token_type?: string };\n if (!token.access_token) {\n throw new Error(`Client credentials token response missing access_token: ${JSON.stringify(token)}`);\n }\n\n return {\n accessToken: token.access_token,\n tokenType: token.token_type?.toUpperCase() === 'DPOP' ? 'DPoP' : 'Bearer',\n };\n }\n\n private createAccessTokenFetch(accessToken: string, tokenType?: 'Bearer' | 'DPoP'): typeof fetch {\n const scheme = tokenType ?? 'Bearer';\n return async (\n input: Parameters<typeof fetch>[0],\n init?: Parameters<typeof fetch>[1],\n ): Promise<Response> => {\n const headers = new Headers(init?.headers);\n if (!headers.has('Authorization')) {\n headers.set('Authorization', `${scheme} ${accessToken}`);\n }\n return fetch(input, {\n ...init,\n headers,\n });\n };\n }\n\n /**\n * 从 context 获取 webId\n */\n private getWebId(context: StoreContext): string | undefined {\n const auth = context.auth as AuthContext | undefined;\n if (auth && isSolidAuth(auth)) {\n return auth.webId;\n }\n return undefined;\n }\n\n private derivePodBaseUrl(webId: string | undefined): string | undefined {\n if (!webId) {\n return undefined;\n }\n\n try {\n const url = new URL(webId);\n url.hash = '';\n url.search = '';\n\n const normalizedPath = url.pathname.replace(/\\/+$/, '');\n if (!normalizedPath.endsWith('/profile/card')) {\n return undefined;\n }\n\n const podPath = normalizedPath.slice(0, -'/profile/card'.length) || '/';\n if (podPath === '/') {\n return url.origin;\n }\n url.pathname = podPath;\n return url.toString().replace(/\\/$/, '');\n } catch {\n const withoutHash = webId.split('#')[0]?.replace(/\\/+$/, '');\n if (!withoutHash?.endsWith('/profile/card')) {\n return undefined;\n }\n const podBase = withoutHash.slice(0, -'/profile/card'.length) || '/';\n if (podBase === '/') {\n try {\n return new URL(webId).origin;\n } catch {\n return undefined;\n }\n }\n return podBase.endsWith('/') ? podBase.slice(0, -1) : podBase;\n }\n }\n\n /**\n * 将 ThreadStatus 对象转为字符串\n */\n private statusToString(status: ThreadStatus): string {\n return status.type;\n }\n\n /**\n * 将字符串转为 ThreadStatus 对象\n */\n private stringToStatus(status: string | null | undefined): ThreadStatus {\n switch (status) {\n case 'locked':\n return { type: 'locked' };\n case 'closed':\n return { type: 'closed' };\n default:\n return { type: 'active' };\n }\n }\n\n /**\n * 从 ThreadMetadata.metadata 中获取 chat_id,如果没有则返回默认值\n */\n private getChatIdFromMetadata(metadata?: Record<string, unknown>): string {\n if (metadata && typeof metadata.chat_id === 'string') {\n return metadata.chat_id;\n }\n return PodChatKitStore.DEFAULT_CHAT_ID;\n }\n\n /**\n * 确保 Chat 容器存在,如果不存在则创建\n */\n private async ensureChat(chatId: string, context: StoreContext): Promise<void> {\n const db = await this.getDb(context);\n if (!db) {\n throw new Error('Cannot access Pod: invalid credentials');\n }\n\n const webId = this.getWebId(context);\n\n // 检查是否存在\n const existing = await db.findByLocator(Chat, { id: chatId });\n\n if (!existing) {\n // 创建 Chat 容器\n const now = new Date().toISOString();\n await db.insert(Chat).values({\n id: chatId,\n title: chatId === PodChatKitStore.DEFAULT_CHAT_ID ? 'Default Chat' : chatId,\n author: webId || null,\n status: 'active',\n createdAt: now,\n updatedAt: now,\n });\n this.logger.info(`Created Chat container: ${chatId}`);\n }\n }\n\n /**\n * 将 ThreadRecord 转为 ThreadMetadata\n * 包含 metadata.chat_id 暴露 Chat 容器 ID\n */\n private threadRecordToMetadata(record: ThreadMetadataSource, chatUriMap: Map<string, string>): ThreadMetadata {\n const chatId = this.resolveChatIdFromUri(record.chatId, chatUriMap, PodChatKitStore.DEFAULT_CHAT_ID);\n let extra: Record<string, unknown> | undefined;\n if (record.metadata) {\n try {\n extra = JSON.parse(record.metadata) as Record<string, unknown>;\n } catch {\n // ignore invalid metadata\n }\n }\n\n return {\n id: record.id,\n title: record.title || undefined,\n status: this.stringToStatus(record.status),\n created_at: record.createdAt ? Math.floor(new Date(record.createdAt).getTime() / 1000) : nowTimestamp(),\n updated_at: record.updatedAt ? Math.floor(new Date(record.updatedAt).getTime() / 1000) : nowTimestamp(),\n metadata: {\n chat_id: chatId,\n ...(extra ?? {}),\n },\n };\n }\n\n /**\n * 将 MessageRecord 转为 ThreadItem\n * thread_id 返回 Message 所属的 Thread ID\n */\n private messageRecordToItem(record: QueriedMessageRecord, threadId: string): ThreadItem {\n const createdAt = record.createdAt ? Math.floor(new Date(record.createdAt).getTime() / 1000) : nowTimestamp();\n\n if (record.role === MessageRole.USER) {\n return {\n id: record.id,\n thread_id: threadId,\n type: 'user_message',\n content: [{ type: 'input_text', text: record.content || '' }],\n created_at: createdAt,\n } as UserMessageItem;\n } else {\n return {\n id: record.id,\n thread_id: threadId,\n type: 'assistant_message',\n content: [{ type: 'output_text', text: record.content || '' }],\n status: (record.status as 'in_progress' | 'completed' | 'incomplete') || 'completed',\n created_at: createdAt,\n } as AssistantMessageItem;\n }\n }\n\n /**\n * 获取或构建 chatUri → bare chatId 的映射缓存。\n * drizzle-solid 的 uri() 字段返回完整 URI,通过 Chat 的 @id 比对来还原 bare ID。\n */\n private async getChatUriMap(context: StoreContext): Promise<Map<string, string>> {\n if ((context as any)._chatUriMap) {\n return (context as any)._chatUriMap;\n }\n const db = await this.getDb(context);\n const map = new Map<string, string>();\n if (db) {\n try {\n const chats = await db.select().from(Chat);\n for (const c of chats) {\n const uri = (c as any)['@id'] as string | undefined;\n if (uri) map.set(uri, c.id);\n }\n } catch {\n // ignore\n }\n }\n (context as any)._chatUriMap = map;\n return map;\n }\n\n /**\n * 从 chatId URI 还原 bare chatId。\n * 优先通过 @id 映射,fallback 处理裸 ID。\n */\n private resolveChatIdFromUri(\n chatIdUri: string | null | undefined,\n chatUriMap: Map<string, string>,\n fallback: string,\n ): string {\n if (!chatIdUri) return fallback;\n const bare = chatUriMap.get(chatIdUri);\n if (bare) return bare;\n // Bare ID passed directly (not a URI)\n return chatIdUri.includes('/') ? fallback : chatIdUri;\n }\n\n private isAbsoluteHttpIri(value: string): boolean {\n try {\n const url = new URL(value);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n }\n\n private parseThreadIri(threadIri: string): ResolvedThreadRef | null {\n try {\n const url = new URL(threadIri);\n const match = url.pathname.match(/\\/\\.data\\/chat\\/([^/]+)\\/index\\.ttl$/);\n const threadId = url.hash.startsWith('#') ? decodeURIComponent(url.hash.slice(1)) : '';\n if (!match || !threadId) {\n return null;\n }\n return {\n threadId,\n chatId: decodeURIComponent(match[1]),\n threadUri: url.toString(),\n };\n } catch {\n return null;\n }\n }\n\n private normalizeThreadCacheKey(thread: ThreadRef): string {\n return getThreadIdFromRef(thread);\n }\n\n private async buildThreadUri(\n threadId: string,\n chatId: string,\n context: StoreContext,\n ): Promise<string> {\n await this.getDb(context);\n const podBaseUrl = this.getCachedPodBaseUrl(context)\n ?? this.derivePodBaseUrl(this.getWebId(context));\n if (!podBaseUrl) {\n throw new Error('Cannot resolve Pod base URL for thread locator');\n }\n return `${podBaseUrl}/.data/chat/${chatId}/index.ttl#${threadId}`;\n }\n\n private async resolveThreadRef(\n thread: ThreadRef,\n context: StoreContext,\n ): Promise<ResolvedThreadRef> {\n const threadIdOrIri = thread.thread_id;\n if (this.isAbsoluteHttpIri(threadIdOrIri)) {\n const parsed = this.parseThreadIri(threadIdOrIri);\n if (!parsed) {\n throw new Error(`Invalid thread IRI: ${threadIdOrIri}`);\n }\n this.cacheThreadChatId(context, parsed.threadId, parsed.chatId);\n return parsed;\n }\n\n if (!('chat_id' in thread) || !thread.chat_id) {\n throw new Error(`chat_id is required when thread_id \"${threadIdOrIri}\" is not a full thread IRI`);\n }\n\n const chatId = thread.chat_id;\n\n const threadUri = await this.buildThreadUri(threadIdOrIri, chatId, context);\n this.cacheThreadChatId(context, threadIdOrIri, chatId);\n return {\n threadId: threadIdOrIri,\n chatId,\n threadUri,\n };\n }\n\n /**\n * 缓存 Thread -> chatId 映射\n */\n private cacheThreadChatId(context: StoreContext, threadId: string, chatId: string): void {\n if (!(context as any)._threadChatIdCache) {\n (context as any)._threadChatIdCache = new Map<string, string>();\n }\n (context as any)._threadChatIdCache.set(threadId, chatId);\n }\n\n /**\n * 缓存完整的 Thread metadata\n */\n private cacheThreadMetadata(context: StoreContext, thread: ThreadMetadata): void {\n if (!(context as any)._threadMetadataCache) {\n (context as any)._threadMetadataCache = new Map<string, ThreadMetadata>();\n }\n (context as any)._threadMetadataCache.set(thread.id, thread);\n }\n\n /**\n * 从缓存获取 Thread metadata\n */\n private getCachedThreadMetadata(context: StoreContext, threadId: string): ThreadMetadata | undefined {\n const cache = (context as any)._threadMetadataCache as Map<string, ThreadMetadata> | undefined;\n return cache?.get(threadId);\n }\n\n private getCachedFetch(context: StoreContext): typeof fetch | undefined {\n return (context as any)._cachedFetch as typeof fetch | undefined;\n }\n\n private getCachedPodBaseUrl(context: StoreContext): string | undefined {\n const cachedWebId = (context as any)._cachedWebId as string | undefined;\n return this.derivePodBaseUrl(cachedWebId);\n }\n\n private extractFragmentId(subjectUri: string): string {\n const hashIndex = subjectUri.lastIndexOf('#');\n if (hashIndex >= 0 && hashIndex < subjectUri.length - 1) {\n return subjectUri.slice(hashIndex + 1);\n }\n const slashIndex = subjectUri.lastIndexOf('/');\n return slashIndex >= 0 && slashIndex < subjectUri.length - 1 ? subjectUri.slice(slashIndex + 1) : subjectUri;\n }\n\n private parseSparqlBindingValue(binding: Record<string, { value?: string }> | undefined, key: string): string | null {\n return binding?.[key]?.value ?? null;\n }\n\n private async selectMessagesForThread(\n thread: ThreadRef,\n context: StoreContext,\n ): Promise<QueriedMessageRecord[]> {\n await this.getDb(context);\n\n const cachedFetch = this.getCachedFetch(context);\n const podBaseUrl = this.getCachedPodBaseUrl(context);\n if (!cachedFetch || !podBaseUrl) {\n return [];\n }\n\n const resolvedThread = await this.resolveThreadRef(thread, context);\n const endpoint = `${podBaseUrl}/.data/chat/-/sparql`;\n const query = `\n PREFIX meeting: <http://www.w3.org/ns/pim/meeting#>\n PREFIX sioc: <http://rdfs.org/sioc/ns#>\n PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n PREFIX udfs: <https://undefineds.co/ns#>\n SELECT ?msg ?maker ?role ?content ?status ?createdAt ?toolName ?toolCallId ?metadata\n WHERE {\n ?msg a meeting:Message ;\n sioc:has_container <${resolvedThread.threadUri}> .\n OPTIONAL { ?msg foaf:maker ?maker . }\n OPTIONAL { ?msg udfs:role ?role . }\n OPTIONAL { ?msg sioc:content ?content . }\n OPTIONAL { ?msg udfs:status ?status . }\n OPTIONAL { ?msg udfs:createdAt ?createdAt . }\n OPTIONAL { ?msg udfs:toolName ?toolName . }\n OPTIONAL { ?msg udfs:toolCallId ?toolCallId . }\n OPTIONAL { ?msg udfs:metadata ?metadata . }\n }\n ORDER BY ?createdAt\n `.trim();\n\n const response = await cachedFetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/sparql-query',\n Accept: 'application/sparql-results+json',\n },\n body: query,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(`Failed to query thread messages: ${response.status} ${response.statusText} - ${text}`);\n }\n\n const json = await response.json() as {\n results?: {\n bindings?: Array<Record<string, { value?: string }>>;\n };\n };\n\n const bindings = json.results?.bindings ?? [];\n return bindings.map((binding) => ({\n id: this.extractFragmentId(this.parseSparqlBindingValue(binding, 'msg') ?? ''),\n chat: null,\n thread: resolvedThread.threadUri,\n maker: this.parseSparqlBindingValue(binding, 'maker'),\n role: this.parseSparqlBindingValue(binding, 'role'),\n content: this.parseSparqlBindingValue(binding, 'content'),\n status: this.parseSparqlBindingValue(binding, 'status'),\n createdAt: this.parseSparqlBindingValue(binding, 'createdAt'),\n toolName: this.parseSparqlBindingValue(binding, 'toolName'),\n toolCallId: this.parseSparqlBindingValue(binding, 'toolCallId'),\n metadata: this.parseSparqlBindingValue(binding, 'metadata'),\n subjectUri: this.parseSparqlBindingValue(binding, 'msg'),\n }));\n }\n\n // =========================================================================\n // ID Generation\n // =========================================================================\n\n generateThreadId(_context: StoreContext): string {\n return generateId('thread');\n }\n\n generateItemId(itemType: StoreItemType, _thread: ThreadMetadata, _context: StoreContext): string {\n return generateId(itemType.replace('_', '-'));\n }\n\n // =========================================================================\n // Thread Operations (ChatKit thread = our Thread)\n // =========================================================================\n\n async loadThread(thread: ThreadRef, context: StoreContext): Promise<ThreadMetadata> {\n const cacheKey = this.normalizeThreadCacheKey(thread);\n // 先从缓存获取\n const cached = this.getCachedThreadMetadata(context, cacheKey);\n if (cached) {\n return cached;\n }\n\n const db = await this.getDb(context);\n if (!db) {\n throw new Error('Cannot access Pod: invalid credentials');\n }\n\n const resolvedThread = await this.resolveThreadRef(thread, context);\n const threadRecord = await db.findByIri(Thread, resolvedThread.threadUri) as ThreadRecord | null;\n\n if (!threadRecord) {\n throw new Error(`Thread not found: ${resolvedThread.threadId}`);\n }\n\n const chatUriMap = await this.getChatUriMap(context);\n const metadata = this.threadRecordToMetadata(threadRecord, chatUriMap);\n // 缓存结果\n this.cacheThreadMetadata(context, metadata);\n this.cacheThreadChatId(context, metadata.id, resolvedThread.chatId);\n return metadata;\n }\n\n async saveThread(thread: ThreadMetadata, context: StoreContext): Promise<void> {\n const db = await this.getDb(context);\n if (!db) {\n throw new Error('Cannot access Pod: invalid credentials');\n }\n\n const now = new Date().toISOString();\n\n // 从 metadata 获取 chat_id\n const chatId = this.getChatIdFromMetadata(thread.metadata);\n thread.metadata = { ...(thread.metadata ?? {}), chat_id: chatId };\n // Persist all metadata except chat_id (which is derived from storage location).\n const metadataToPersist = { ...(thread.metadata ?? {}) } as Record<string, unknown>;\n delete (metadataToPersist as any).chat_id;\n const metadataJson = Object.keys(metadataToPersist).length > 0 ? JSON.stringify(metadataToPersist) : null;\n\n // 确保 Chat 容器存在\n await this.ensureChat(chatId, context);\n\n // 缓存 Thread -> chatId 映射,避免后续查询\n this.cacheThreadChatId(context, thread.id, chatId);\n const threadUri = await this.buildThreadUri(thread.id, chatId, context);\n\n // 检查 Thread 是否存在\n const existing = await db.findByIri(Thread, threadUri) as ThreadRecord | null;\n\n if (existing) {\n // Update\n await db.updateByLocator(Thread, {\n id: thread.id,\n chatId,\n }, {\n title: thread.title || null,\n status: this.statusToString(thread.status),\n metadata: metadataJson,\n updatedAt: now,\n });\n } else {\n // Insert\n await db.insert(Thread).values({\n id: thread.id,\n chatId, // 关联到 Chat 容器\n title: thread.title || null,\n status: this.statusToString(thread.status),\n metadata: metadataJson,\n createdAt: new Date(thread.created_at * 1000).toISOString(),\n updatedAt: now,\n });\n }\n\n // 缓存完整的 Thread metadata,确保 metadata.chat_id 包含正确的值\n const threadMetadata: ThreadMetadata = {\n ...thread,\n metadata: { ...(thread.metadata ?? {}), chat_id: chatId },\n };\n this.cacheThreadMetadata(context, threadMetadata);\n }\n\n async loadThreads(\n limit: number,\n after: string | undefined,\n order: string,\n context: StoreContext,\n ): Promise<Page<ThreadMetadata>> {\n const db = await this.getDb(context);\n if (!db) {\n return { data: [], has_more: false };\n }\n\n try {\n const threads = await db.select().from(Thread) as ThreadRecord[];\n\n // 排序\n threads.sort((a: ThreadRecord, b: ThreadRecord) => {\n const aTime = a.createdAt ? new Date(a.createdAt).getTime() : 0;\n const bTime = b.createdAt ? new Date(b.createdAt).getTime() : 0;\n return order === 'desc' ? bTime - aTime : aTime - bTime;\n });\n\n // 分页\n let startIndex = 0;\n if (after) {\n const afterIndex = threads.findIndex((t: ThreadRecord) => t.id === after);\n if (afterIndex !== -1) {\n startIndex = afterIndex + 1;\n }\n }\n\n const slice = threads.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + limit < threads.length;\n\n const chatUriMap = await this.getChatUriMap(context);\n\n return {\n data: slice.map((t: ThreadRecord) => this.threadRecordToMetadata(t, chatUriMap)),\n has_more: hasMore,\n after: slice.length > 0 ? slice[slice.length - 1].id : undefined,\n };\n } catch (error) {\n this.logger.error(`Failed to load threads: ${error}`);\n return { data: [], has_more: false };\n }\n }\n\n async deleteThread(thread: ThreadRef, context: StoreContext): Promise<void> {\n const resolvedThread = await this.resolveThreadRef(thread, context);\n const db = await this.getDb(context);\n if (!db) {\n throw new Error('Cannot access Pod: invalid credentials');\n }\n\n // 删除关联到此 Thread 的消息\n try {\n await db.delete(Message).where(eq(Message.thread, resolvedThread.threadUri));\n } catch (err: any) {\n if (!err.message?.includes('404') && !err.message?.includes('Could not retrieve') && !err.message?.includes('Parse error')) {\n throw err;\n }\n this.logger.debug(`Ignoring delete message error: ${err.message}`);\n }\n\n // 删除 Thread\n try {\n await db.deleteByLocator(Thread, {\n id: resolvedThread.threadId,\n chatId: resolvedThread.chatId,\n });\n } catch (err: any) {\n if (!err.message?.includes('404') && !err.message?.includes('Could not retrieve') && !err.message?.includes('Parse error')) {\n throw err;\n }\n this.logger.debug(`Ignoring delete thread error: ${err.message}`);\n }\n\n // 清除缓存\n const metadataCache = (context as any)._threadMetadataCache as Map<string, ThreadMetadata> | undefined;\n const chatIdCache = (context as any)._threadChatIdCache as Map<string, string> | undefined;\n metadataCache?.delete(resolvedThread.threadId);\n chatIdCache?.delete(resolvedThread.threadId);\n }\n\n // =========================================================================\n // Thread Item Operations (ChatKit items = our Messages)\n // =========================================================================\n\n async loadThreadItems(\n thread: ThreadRef,\n after: string | undefined,\n limit: number,\n order: string,\n context: StoreContext,\n ): Promise<Page<ThreadItem>> {\n try {\n const resolvedThread = await this.resolveThreadRef(thread, context);\n const messages = await this.selectMessagesForThread(thread, context);\n\n // 排序\n messages.sort((a: QueriedMessageRecord, b: QueriedMessageRecord) => {\n const aTime = a.createdAt ? new Date(a.createdAt).getTime() : 0;\n const bTime = b.createdAt ? new Date(b.createdAt).getTime() : 0;\n return order === 'desc' ? bTime - aTime : aTime - bTime;\n });\n\n // 分页\n let startIndex = 0;\n if (after) {\n const afterIndex = messages.findIndex((m: QueriedMessageRecord) => m.id === after);\n if (afterIndex !== -1) {\n startIndex = afterIndex + 1;\n }\n }\n\n const slice = messages.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + limit < messages.length;\n\n return {\n data: slice.map((m: QueriedMessageRecord) => this.messageRecordToItem(m, resolvedThread.threadId)),\n has_more: hasMore,\n after: slice.length > 0 ? slice[slice.length - 1].id : undefined,\n };\n } catch (error) {\n this.logger.error(`Failed to load thread items: ${error}`);\n return { data: [], has_more: false };\n }\n }\n\n async addThreadItem(thread: ThreadRef, item: ThreadItem, context: StoreContext): Promise<void> {\n const db = await this.getDb(context);\n if (!db) {\n throw new Error('Cannot access Pod: invalid credentials');\n }\n\n const resolvedThread = await this.resolveThreadRef(thread, context);\n\n const webId = this.getWebId(context);\n let content = '';\n let role: string = MessageRole.USER;\n let status: string | null = null;\n\n if (item.type === 'user_message') {\n const userItem = item as UserMessageItem;\n content = userItem.content\n .filter((c) => c.type === 'input_text')\n .map((c) => (c as any).text)\n .join('\\n');\n role = MessageRole.USER;\n } else if (item.type === 'assistant_message') {\n const assistantItem = item as AssistantMessageItem;\n content = assistantItem.content\n .filter((c) => c.type === 'output_text')\n .map((c) => c.text)\n .join('\\n');\n role = MessageRole.ASSISTANT;\n status = assistantItem.status || MessageStatus.COMPLETED;\n } else {\n // 其他类型暂时存储为 JSON\n content = JSON.stringify(item);\n role = MessageRole.SYSTEM;\n }\n\n const messageRecord = {\n id: item.id,\n chat: resolvedThread.chatId, // bare ID,用于路径构建\n thread: resolvedThread.threadUri, // 完整 URI,用于 RDF 引用\n maker: role === MessageRole.USER ? webId : null,\n role,\n content,\n status,\n createdAt: new Date(item.created_at * 1000).toISOString(),\n };\n\n await db.insert(Message).values(messageRecord);\n\n // Track this ID to avoid cache timing issues in saveItem\n this.recentlyCreatedIds.add(messageRecord.id);\n }\n\n // Track recently created message IDs to avoid SELECT cache timing issues\n private recentlyCreatedIds = new Set<string>();\n\n async saveItem(thread: ThreadRef, item: ThreadItem, context: StoreContext): Promise<void> {\n const db = await this.getDb(context);\n if (!db) {\n throw new Error('Cannot access Pod: invalid credentials');\n }\n\n const resolvedThread = await this.resolveThreadRef(thread, context);\n\n // 准备更新数据\n let content = '';\n let status: string | null = null;\n\n if (item.type === 'user_message') {\n const userItem = item as UserMessageItem;\n content = userItem.content\n .filter((c) => c.type === 'input_text')\n .map((c) => (c as any).text)\n .join('\\n');\n } else if (item.type === 'assistant_message') {\n const assistantItem = item as AssistantMessageItem;\n content = assistantItem.content\n .filter((c) => c.type === 'output_text')\n .map((c) => c.text)\n .join('\\n');\n status = assistantItem.status || MessageStatus.COMPLETED;\n }\n\n // 获取 createdAt 用于计算资源路径(与 drizzle-solid 模板填充保持一致)\n const createdAt = item.created_at ? new Date(item.created_at * 1000).toISOString() : undefined;\n\n // 如果是最近创建的消息,使用直接 PATCH 更新(避免 drizzle-solid UPDATE 的 bug)\n const wasRecentlyCreated = this.recentlyCreatedIds.has(item.id);\n if (wasRecentlyCreated) {\n this.recentlyCreatedIds.delete(item.id);\n await this.directPatchMessage(context, resolvedThread.chatId, item.id, content, status, createdAt);\n return;\n }\n\n // 对于非最近创建的消息,使用普通流程\n const existingItems = (await this.selectMessagesForThread(thread, context))\n .filter((message) => message.id === item.id);\n const existing = existingItems.length > 0 ? existingItems[0] : null;\n\n if (existing) {\n // 使用直接 PATCH 更新\n const existingCreatedAt = existing.createdAt\n ? (existing.createdAt instanceof Date ? existing.createdAt.toISOString() : String(existing.createdAt))\n : undefined;\n await this.directPatchMessage(context, resolvedThread.chatId, item.id, content, status, existingCreatedAt);\n } else {\n // Create new record\n await this.addThreadItem(thread, item, context);\n }\n }\n\n /**\n * 直接使用 SPARQL UPDATE PATCH 更新消息内容\n * 避免 drizzle-solid UPDATE 的 bug\n */\n private async directPatchMessage(\n context: StoreContext,\n chatId: string,\n messageId: string,\n content: string,\n status: string | null,\n createdAt?: string\n ): Promise<void> {\n // 使用缓存的 fetch 和 webId(由 getDb 时创建的 session)\n const cachedFetch = (context as any)._cachedFetch as typeof fetch | undefined;\n const cachedWebId = (context as any)._cachedWebId as string | undefined;\n\n if (!cachedFetch || !cachedWebId) {\n throw new Error('No cached session for direct PATCH - call getDb first');\n }\n\n // 构建资源 URL 和 subject URI\n // Template: {chatId}/{yyyy}/{MM}/{dd}/messages.ttl#{id}\n const podBaseUrl = this.derivePodBaseUrl(cachedWebId);\n if (!podBaseUrl) {\n throw new Error(`Cannot resolve Pod base URL from cached WebID: ${cachedWebId}`);\n }\n const messageDate = createdAt ? new Date(createdAt) : new Date();\n const yyyy = String(messageDate.getUTCFullYear());\n const MM = String(messageDate.getUTCMonth() + 1).padStart(2, '0');\n const dd = String(messageDate.getUTCDate()).padStart(2, '0');\n const resourceUrl = `${podBaseUrl}/.data/chat/${chatId}/${yyyy}/${MM}/${dd}/messages.ttl`;\n const subjectUri = `${resourceUrl}#${messageId}`;\n\n // 构建 SPARQL UPDATE:删除旧值,插入新值\n const deletePatterns: string[] = [];\n const insertTriples: string[] = [];\n\n // 转义特殊字符\n const escapeForSparql = (value: string): string => {\n const hasQuotes = value.includes('\"');\n const hasNewlines = value.includes('\\n') || value.includes('\\r');\n\n if (hasQuotes || hasNewlines) {\n // 使用三引号\n let escaped = value;\n escaped = escaped.replace(/\"\"\"/g, '\"\\\\\"\\\\\"\"');\n if (escaped.endsWith('\"')) {\n const match = escaped.match(/\"*$/);\n const trailingQuotes = match ? match[0].length : 0;\n if (trailingQuotes > 0) {\n escaped = escaped.slice(0, -trailingQuotes) + '\\\\\"'.repeat(trailingQuotes);\n }\n }\n return `\"\"\"${escaped}\"\"\"`;\n }\n return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n };\n\n // Content 更新\n deletePatterns.push(`<${subjectUri}> <http://rdfs.org/sioc/ns#content> ?oldContent .`);\n insertTriples.push(`<${subjectUri}> <http://rdfs.org/sioc/ns#content> ${escapeForSparql(content)} .`);\n\n // Status 更新\n if (status) {\n deletePatterns.push(`<${subjectUri}> <https://undefineds.co/ns#status> ?oldStatus .`);\n insertTriples.push(`<${subjectUri}> <https://undefineds.co/ns#status> \"${status}\" .`);\n }\n\n const sparql = `\nDELETE { ${deletePatterns.join(' ')} }\nINSERT { ${insertTriples.join(' ')} }\nWHERE { ${deletePatterns.join(' ')} }\n `.trim();\n\n const response = await cachedFetch(resourceUrl, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body: sparql,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(`Direct PATCH failed: ${response.status} ${response.statusText} - ${text}`);\n }\n }\n\n private async directDeleteMessage(\n context: StoreContext,\n subjectUri?: string | null,\n ): Promise<void> {\n if (!subjectUri) {\n throw new Error('Cannot delete message without subject URI');\n }\n\n const cachedFetch = (context as any)._cachedFetch as typeof fetch | undefined;\n if (!cachedFetch) {\n throw new Error('No cached session for direct DELETE - call getDb first');\n }\n\n const hashIndex = subjectUri.lastIndexOf('#');\n const resourceUrl = hashIndex >= 0 ? subjectUri.slice(0, hashIndex) : subjectUri;\n const sparql = `DELETE WHERE { <${subjectUri}> ?p ?o . }`;\n\n const response = await cachedFetch(resourceUrl, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body: sparql,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(`Direct message delete failed: ${response.status} ${response.statusText} - ${text}`);\n }\n }\n\n async loadItem(thread: ThreadRef, itemId: string, context: StoreContext): Promise<ThreadItem> {\n const db = await this.getDb(context);\n if (!db) {\n throw new Error('Cannot access Pod: invalid credentials');\n }\n\n const resolvedThread = await this.resolveThreadRef(thread, context);\n const messages = (await this.selectMessagesForThread(thread, context))\n .filter((message) => message.id === itemId);\n\n if (messages.length === 0) {\n throw new Error(`Item not found: ${itemId}`);\n }\n\n return this.messageRecordToItem(messages[0], resolvedThread.threadId);\n }\n\n async deleteThreadItem(thread: ThreadRef, itemId: string, context: StoreContext): Promise<void> {\n const target = (await this.selectMessagesForThread(thread, context))\n .find((message) => message.id === itemId);\n if (!target) {\n return;\n }\n\n await this.directDeleteMessage(context, target.subjectUri);\n }\n\n // =========================================================================\n // Attachment Operations (存 Pod 文件)\n // =========================================================================\n\n async saveAttachment(attachment: Attachment, _context: StoreContext): Promise<void> {\n this.logger.info(`Attachment saved: ${attachment.id} (${attachment.name})`);\n }\n\n async loadAttachment(attachmentId: string, _context: StoreContext): Promise<Attachment> {\n throw new Error(`Attachment not found: ${attachmentId}`);\n }\n\n async deleteAttachment(attachmentId: string, _context: StoreContext): Promise<void> {\n this.logger.info(`Attachment deleted: ${attachmentId}`);\n }\n\n // =========================================================================\n // AI Config Operations (复用 Session 缓存)\n // =========================================================================\n\n /**\n * AI 配置结果\n */\n public static readonly AiConfigResult = class {\n providerId!: string;\n baseUrl!: string;\n proxyUrl?: string;\n apiKey!: string;\n credentialId!: string;\n };\n\n /**\n * 从 Pod 获取 AI 配置(Provider + Credential)\n * 复用已缓存的 Session,避免重复登录\n */\n private extractProviderId(provider: string): string {\n if (!provider) {\n return '';\n }\n\n const hashIndex = provider.lastIndexOf('#');\n if (hashIndex >= 0 && hashIndex < provider.length - 1) {\n return provider.slice(hashIndex + 1);\n }\n\n return provider;\n }\n\n async getAiConfig(context: StoreContext): Promise<{\n providerId: string;\n baseUrl: string;\n proxyUrl?: string;\n defaultModel?: string;\n apiKey: string;\n credentialId: string;\n } | undefined> {\n const db = await this.getDb(context);\n if (!db) {\n return undefined;\n }\n\n try {\n // 查询活跃的 AI 凭据\n const credentials = await db.select()\n .from(Credential)\n .where(and(\n eq(Credential.service, ServiceType.AI),\n eq(Credential.status, CredentialStatus.ACTIVE),\n ));\n\n if (credentials.length === 0) {\n return undefined;\n }\n\n // Build provider @id → record map for URI matching\n const allProviders = await db.select().from(Provider);\n const providerByUri = new Map<string, typeof allProviders[0]>();\n for (const p of allProviders) {\n const uri = (p as any)['@id'] as string | undefined;\n if (uri) providerByUri.set(uri, p);\n // Also index by bare id for fallback\n providerByUri.set(p.id, p);\n }\n\n // 遍历凭据,找到有效的 Provider\n for (const cred of credentials) {\n if (!cred.provider) continue;\n\n // Match provider by full URI first, then fallback to bare fragment id.\n const provider = providerByUri.get(cred.provider)\n ?? providerByUri.get(this.extractProviderId(cred.provider));\n if (!provider) continue;\n\n const baseUrl = provider.baseUrl;\n if (!baseUrl) continue;\n\n const defaultModelRef = provider.defaultModel ?? provider.hasModel;\n const defaultModel = defaultModelRef\n ? (await db.findByIri(Model, defaultModelRef))?.id ?? undefined\n : undefined;\n\n this.logger.debug(`Using credential ${cred.id} with provider ${provider.id}`);\n\n return {\n providerId: provider.id,\n baseUrl,\n proxyUrl: provider.proxyUrl || undefined,\n defaultModel,\n apiKey: cred.apiKey!,\n credentialId: cred.id,\n };\n }\n\n return undefined;\n } catch (error) {\n this.logger.warn(`Failed to read AI config from Pod: ${error}`);\n return undefined;\n }\n }\n\n /**\n * 更新凭据状态(如 429 限流)\n * 复用已缓存的 Session\n */\n async updateCredentialStatus(\n context: StoreContext,\n credentialId: string,\n status: CredentialStatus,\n options?: { rateLimitResetAt?: Date; incrementFailCount?: boolean },\n ): Promise<void> {\n const db = await this.getDb(context);\n if (!db) {\n this.logger.debug('Cannot update credential status: no db available');\n return;\n }\n\n try {\n const updateData: Record<string, any> = { status };\n\n if (options?.rateLimitResetAt) {\n updateData.rateLimitResetAt = options.rateLimitResetAt;\n }\n\n // 如果需要递增 failCount,先查询当前值\n if (options?.incrementFailCount) {\n const currentCred = await db.findByLocator(Credential, { id: credentialId });\n if (currentCred) {\n updateData.failCount = (currentCred.failCount ?? 0) + 1;\n }\n }\n\n await db.updateByLocator(Credential, { id: credentialId }, updateData);\n\n this.logger.info(`Credential ${credentialId} status updated to ${status}`);\n } catch (error) {\n this.logger.error(`Failed to update credential ${credentialId}: ${error}`);\n }\n }\n\n /**\n * 记录凭据使用成功(重置 failCount,更新 lastUsedAt)\n */\n async recordCredentialSuccess(context: StoreContext, credentialId: string): Promise<void> {\n const db = await this.getDb(context);\n if (!db) {\n return;\n }\n\n try {\n await db.updateByLocator(Credential, { id: credentialId }, {\n lastUsedAt: new Date(),\n failCount: 0,\n status: CredentialStatus.ACTIVE,\n rateLimitResetAt: undefined,\n });\n } catch (error) {\n this.logger.debug(`Failed to record credential success: ${error}`);\n }\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"pod-store.js","sourceRoot":"","sources":["../../../src/api/chatkit/pod-store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pod-based ChatKit Store\n *\n * 将 ChatKit 数据存储到 Solid Pod。\n *\n * 存储结构:\n * /.data/chat/{chatId}/\n * index.ttl\n * #this # Chat (meeting:LongChat)\n * #{threadId} # Thread (sioc:Thread)\n * {yyyy}/{MM}/{dd}/messages.ttl # Messages (meeting:Message)\n */\nimport { drizzle, eq, and } from '@undefineds.co/drizzle-solid';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { ChatKitStore, StoreContext } from './store';\nimport type {\n ThreadMetadata,\n ThreadRef,\n ThreadItem,\n Attachment,\n Page,\n StoreItemType,\n UserMessageItem,\n AssistantMessageItem,\n ThreadStatus,\n} from './types';\nimport { generateId, getThreadIdFromRef, nowTimestamp } from './types';\nimport {\n Chat,\n Thread,\n Message,\n MessageRole,\n MessageStatus,\n type ThreadRecord,\n type MessageRecord,\n} from './schema';\nimport type { AuthContext } from '../auth/AuthContext';\nimport { isSolidAuth } from '../auth/AuthContext';\nimport { Provider } from '../../ai/schema/provider';\nimport { Model } from '../../ai/schema/model';\nimport { Credential } from '../../credential/schema/tables';\nimport { ServiceType, CredentialStatus } from '../../credential/schema/types';\nimport type { KnownProvider } from '@mariozechner/pi-ai';\n\nconst schema = {\n chat: Chat,\n thread: Thread,\n message: Message,\n provider: Provider,\n model: Model,\n credential: Credential,\n};\n\nexport interface PodChatKitStoreOptions {\n tokenEndpoint: string;\n}\n\ntype QueriedMessageRecord = {\n id: string;\n chat?: string | null;\n thread?: string | null;\n maker?: string | null;\n role?: string | null;\n content?: string | null;\n status?: string | null;\n createdAt?: string | Date | null;\n toolName?: string | null;\n toolCallId?: string | null;\n metadata?: string | null;\n subjectUri?: string | null;\n};\n\ntype ThreadMetadataSource = {\n id: string;\n chatId?: string | null;\n title?: string | null;\n status?: string | null;\n metadata?: string | null;\n createdAt?: string | Date | null;\n updatedAt?: string | Date | null;\n};\n\ntype ResolvedThreadRef = {\n threadId: string;\n chatId: string;\n threadUri: string;\n};\n\n/**\n * Pod-based ChatKit Store implementation\n *\n * 数据模型映射:\n * - ChatKit thread = Thread (sioc:Thread)\n * - ChatKit thread item = Message (meeting:Message)\n * - Chat (meeting:LongChat) 是容器/Agent,通过 metadata.chat_id 暴露\n *\n * 每个 Thread 属于一个 Chat 容器。默认使用 'default' Chat。\n */\nexport class PodChatKitStore implements ChatKitStore<StoreContext> {\n private readonly logger = getLoggerFor(this);\n private readonly tokenEndpoint: string;\n\n /** 默认 Chat 容器 ID */\n private static readonly DEFAULT_CHAT_ID = 'default';\n\n public constructor(options: PodChatKitStoreOptions) {\n this.tokenEndpoint = options.tokenEndpoint;\n }\n\n // =========================================================================\n // Private Helpers\n // =========================================================================\n\n /**\n * 获取认证后的 drizzle 实例 (缓存到 context 中)\n */\n private async getDb(context: StoreContext): Promise<any | null> {\n // Check if we already have a cached db in context\n if ((context as any)._cachedDb) {\n this.logger.debug('Using cached db from context');\n return (context as any)._cachedDb;\n }\n\n const auth = context.auth as AuthContext | undefined;\n\n if (!auth || !isSolidAuth(auth)) {\n this.logger.warn('No valid solid auth in context, cannot access Pod');\n return null;\n }\n\n // Preferred path: directly use caller's Solid access token.\n if (auth.accessToken && auth.webId) {\n try {\n if (auth.tokenType === 'DPoP') {\n this.logger.warn('Using DPoP access token without proof key; Pod access may fail if issuer enforces DPoP proof');\n }\n\n this.logger.info(`[getDb] Using access token path for webId: ${auth.webId}`);\n const authFetch = this.createAccessTokenFetch(auth.accessToken, auth.tokenType);\n const db: any = drizzle(\n { fetch: authFetch, info: { webId: auth.webId, isLoggedIn: true } } as any,\n { schema },\n );\n\n this.logger.info(`Initializing tables for Pod (access token): ${auth.webId}`);\n try {\n await db.init(Chat, Thread, Message);\n this.logger.info('Tables initialized successfully');\n } catch (initError) {\n this.logger.error(`Failed to init tables: ${initError}`);\n }\n\n (context as any)._cachedDb = db;\n (context as any)._cachedFetch = authFetch;\n (context as any)._cachedWebId = auth.webId;\n return db;\n } catch (error) {\n this.logger.error(`Failed to get Pod db with access token: ${error}`);\n return null;\n }\n }\n\n if (!auth.clientId || !auth.clientSecret) {\n this.logger.warn('No accessToken and no valid client credentials in context, cannot access Pod');\n return null;\n }\n\n // Fallback path: exchange client credentials for an access token directly.\n this.logger.info(`[getDb] Using client credentials path for clientId: ${auth.clientId}`);\n try {\n const token = await this.getClientCredentialsAccessToken(auth.clientId, auth.clientSecret);\n const webId = auth.webId ?? this.getWebId(context);\n if (!webId) {\n throw new Error('Missing webId for client credentials auth');\n }\n\n this.logger.info(`[getDb] Client credentials token acquired, webId: ${webId}`);\n const db: any = drizzle(\n { fetch: this.createAccessTokenFetch(token.accessToken, token.tokenType), info: { webId, isLoggedIn: true } } as any,\n { schema },\n );\n const authFetch = this.createAccessTokenFetch(token.accessToken, token.tokenType);\n\n this.logger.info(`Initializing tables for Pod: ${webId}`);\n try {\n await db.init(Chat, Thread, Message);\n this.logger.info('Tables initialized successfully');\n } catch (initError) {\n this.logger.error(`Failed to init tables: ${initError}`);\n }\n\n (context as any)._cachedDb = db;\n (context as any)._cachedFetch = authFetch;\n (context as any)._cachedWebId = webId;\n (context as any)._cachedAccessToken = token.accessToken;\n (context as any)._cachedTokenType = token.tokenType;\n\n return db;\n } catch (error) {\n this.logger.error(`Failed to get Pod db: ${error}`);\n return null;\n }\n }\n\n private async getClientCredentialsAccessToken(clientId: string, clientSecret: string): Promise<{\n accessToken: string;\n tokenType: 'Bearer' | 'DPoP';\n }> {\n const response = await fetch(this.tokenEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: clientId,\n client_secret: clientSecret,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Client credentials token request failed: ${response.status} ${await response.text().catch(() => '')}`);\n }\n\n const token = await response.json() as { access_token?: string; token_type?: string };\n if (!token.access_token) {\n throw new Error(`Client credentials token response missing access_token: ${JSON.stringify(token)}`);\n }\n\n return {\n accessToken: token.access_token,\n tokenType: token.token_type?.toUpperCase() === 'DPOP' ? 'DPoP' : 'Bearer',\n };\n }\n\n private createAccessTokenFetch(accessToken: string, tokenType?: 'Bearer' | 'DPoP'): typeof fetch {\n const scheme = tokenType ?? 'Bearer';\n return async (\n input: Parameters<typeof fetch>[0],\n init?: Parameters<typeof fetch>[1],\n ): Promise<Response> => {\n const headers = new Headers(init?.headers);\n if (!headers.has('Authorization')) {\n headers.set('Authorization', `${scheme} ${accessToken}`);\n }\n return fetch(input, {\n ...init,\n headers,\n });\n };\n }\n\n /**\n * 从 context 获取 webId\n */\n private getWebId(context: StoreContext): string | undefined {\n const auth = context.auth as AuthContext | undefined;\n if (auth && isSolidAuth(auth)) {\n return auth.webId;\n }\n return undefined;\n }\n\n private derivePodBaseUrl(webId: string | undefined): string | undefined {\n if (!webId) {\n return undefined;\n }\n\n try {\n const url = new URL(webId);\n url.hash = '';\n url.search = '';\n\n const normalizedPath = url.pathname.replace(/\\/+$/, '');\n if (!normalizedPath.endsWith('/profile/card')) {\n return undefined;\n }\n\n const podPath = normalizedPath.slice(0, -'/profile/card'.length) || '/';\n if (podPath === '/') {\n return url.origin;\n }\n url.pathname = podPath;\n return url.toString().replace(/\\/$/, '');\n } catch {\n const withoutHash = webId.split('#')[0]?.replace(/\\/+$/, '');\n if (!withoutHash?.endsWith('/profile/card')) {\n return undefined;\n }\n const podBase = withoutHash.slice(0, -'/profile/card'.length) || '/';\n if (podBase === '/') {\n try {\n return new URL(webId).origin;\n } catch {\n return undefined;\n }\n }\n return podBase.endsWith('/') ? podBase.slice(0, -1) : podBase;\n }\n }\n\n /**\n * 将 ThreadStatus 对象转为字符串\n */\n private statusToString(status: ThreadStatus): string {\n return status.type;\n }\n\n /**\n * 将字符串转为 ThreadStatus 对象\n */\n private stringToStatus(status: string | null | undefined): ThreadStatus {\n switch (status) {\n case 'locked':\n return { type: 'locked' };\n case 'closed':\n return { type: 'closed' };\n default:\n return { type: 'active' };\n }\n }\n\n /**\n * 从 ThreadMetadata.metadata 中获取 chat_id,如果没有则返回默认值\n */\n private getChatIdFromMetadata(metadata?: Record<string, unknown>): string {\n if (metadata && typeof metadata.chat_id === 'string') {\n return metadata.chat_id;\n }\n return PodChatKitStore.DEFAULT_CHAT_ID;\n }\n\n /**\n * 确保 Chat 容器存在,如果不存在则创建\n */\n private async ensureChat(chatId: string, context: StoreContext): Promise<void> {\n const db = await this.getDb(context);\n if (!db) {\n throw new Error('Cannot access Pod: invalid credentials');\n }\n\n const webId = this.getWebId(context);\n\n // 检查是否存在\n const existing = await db.findByLocator(Chat, { id: chatId });\n\n if (!existing) {\n // 创建 Chat 容器\n const now = new Date().toISOString();\n await db.insert(Chat).values({\n id: chatId,\n title: chatId === PodChatKitStore.DEFAULT_CHAT_ID ? 'Default Chat' : chatId,\n author: webId || null,\n status: 'active',\n createdAt: now,\n updatedAt: now,\n });\n this.logger.info(`Created Chat container: ${chatId}`);\n }\n }\n\n /**\n * 将 ThreadRecord 转为 ThreadMetadata\n * 包含 metadata.chat_id 暴露 Chat 容器 ID\n */\n private threadRecordToMetadata(record: ThreadMetadataSource, chatUriMap: Map<string, string>): ThreadMetadata {\n const chatId = this.resolveChatIdFromUri(record.chatId, chatUriMap, PodChatKitStore.DEFAULT_CHAT_ID);\n let extra: Record<string, unknown> | undefined;\n if (record.metadata) {\n try {\n extra = JSON.parse(record.metadata) as Record<string, unknown>;\n } catch {\n // ignore invalid metadata\n }\n }\n\n return {\n id: record.id,\n title: record.title || undefined,\n status: this.stringToStatus(record.status),\n created_at: record.createdAt ? Math.floor(new Date(record.createdAt).getTime() / 1000) : nowTimestamp(),\n updated_at: record.updatedAt ? Math.floor(new Date(record.updatedAt).getTime() / 1000) : nowTimestamp(),\n metadata: {\n chat_id: chatId,\n ...(extra ?? {}),\n },\n };\n }\n\n /**\n * 将 MessageRecord 转为 ThreadItem\n * thread_id 返回 Message 所属的 Thread ID\n */\n private messageRecordToItem(record: QueriedMessageRecord, threadId: string): ThreadItem {\n const createdAt = record.createdAt ? Math.floor(new Date(record.createdAt).getTime() / 1000) : nowTimestamp();\n\n if (record.role === MessageRole.USER) {\n return {\n id: record.id,\n thread_id: threadId,\n type: 'user_message',\n content: [{ type: 'input_text', text: record.content || '' }],\n created_at: createdAt,\n } as UserMessageItem;\n } else {\n return {\n id: record.id,\n thread_id: threadId,\n type: 'assistant_message',\n content: [{ type: 'output_text', text: record.content || '' }],\n status: (record.status as 'in_progress' | 'completed' | 'incomplete') || 'completed',\n created_at: createdAt,\n } as AssistantMessageItem;\n }\n }\n\n /**\n * 获取或构建 chatUri → bare chatId 的映射缓存。\n * drizzle-solid 的 uri() 字段返回完整 URI,通过 Chat 的 @id 比对来还原 bare ID。\n */\n private async getChatUriMap(context: StoreContext): Promise<Map<string, string>> {\n if ((context as any)._chatUriMap) {\n return (context as any)._chatUriMap;\n }\n const db = await this.getDb(context);\n const map = new Map<string, string>();\n if (db) {\n try {\n const chats = await db.select().from(Chat);\n for (const c of chats) {\n const uri = (c as any)['@id'] as string | undefined;\n if (uri) map.set(uri, c.id);\n }\n } catch {\n // ignore\n }\n }\n (context as any)._chatUriMap = map;\n return map;\n }\n\n /**\n * 从 chatId URI 还原 bare chatId。\n * 优先通过 @id 映射,fallback 处理裸 ID。\n */\n private resolveChatIdFromUri(\n chatIdUri: string | null | undefined,\n chatUriMap: Map<string, string>,\n fallback: string,\n ): string {\n if (!chatIdUri) return fallback;\n const bare = chatUriMap.get(chatIdUri);\n if (bare) return bare;\n // Bare ID passed directly (not a URI)\n return chatIdUri.includes('/') ? fallback : chatIdUri;\n }\n\n private isAbsoluteHttpIri(value: string): boolean {\n try {\n const url = new URL(value);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n }\n\n private parseThreadIri(threadIri: string): ResolvedThreadRef | null {\n try {\n const url = new URL(threadIri);\n const match = url.pathname.match(/\\/\\.data\\/chat\\/([^/]+)\\/index\\.ttl$/);\n const threadId = url.hash.startsWith('#') ? decodeURIComponent(url.hash.slice(1)) : '';\n if (!match || !threadId) {\n return null;\n }\n return {\n threadId,\n chatId: decodeURIComponent(match[1]),\n threadUri: url.toString(),\n };\n } catch {\n return null;\n }\n }\n\n private normalizeThreadCacheKey(thread: ThreadRef): string {\n return getThreadIdFromRef(thread);\n }\n\n private async buildThreadUri(\n threadId: string,\n chatId: string,\n context: StoreContext,\n ): Promise<string> {\n await this.getDb(context);\n const podBaseUrl = this.getCachedPodBaseUrl(context)\n ?? this.derivePodBaseUrl(this.getWebId(context));\n if (!podBaseUrl) {\n throw new Error('Cannot resolve Pod base URL for thread locator');\n }\n return `${podBaseUrl}/.data/chat/${chatId}/index.ttl#${threadId}`;\n }\n\n private async resolveThreadRef(\n thread: ThreadRef,\n context: StoreContext,\n ): Promise<ResolvedThreadRef> {\n const threadIdOrIri = thread.thread_id;\n if (this.isAbsoluteHttpIri(threadIdOrIri)) {\n const parsed = this.parseThreadIri(threadIdOrIri);\n if (!parsed) {\n throw new Error(`Invalid thread IRI: ${threadIdOrIri}`);\n }\n this.cacheThreadChatId(context, parsed.threadId, parsed.chatId);\n return parsed;\n }\n\n if (!('chat_id' in thread) || !thread.chat_id) {\n throw new Error(`chat_id is required when thread_id \"${threadIdOrIri}\" is not a full thread IRI`);\n }\n\n const chatId = thread.chat_id;\n\n const threadUri = await this.buildThreadUri(threadIdOrIri, chatId, context);\n this.cacheThreadChatId(context, threadIdOrIri, chatId);\n return {\n threadId: threadIdOrIri,\n chatId,\n threadUri,\n };\n }\n\n /**\n * 缓存 Thread -> chatId 映射\n */\n private cacheThreadChatId(context: StoreContext, threadId: string, chatId: string): void {\n if (!(context as any)._threadChatIdCache) {\n (context as any)._threadChatIdCache = new Map<string, string>();\n }\n (context as any)._threadChatIdCache.set(threadId, chatId);\n }\n\n /**\n * 缓存完整的 Thread metadata\n */\n private cacheThreadMetadata(context: StoreContext, thread: ThreadMetadata): void {\n if (!(context as any)._threadMetadataCache) {\n (context as any)._threadMetadataCache = new Map<string, ThreadMetadata>();\n }\n (context as any)._threadMetadataCache.set(thread.id, thread);\n }\n\n /**\n * 从缓存获取 Thread metadata\n */\n private getCachedThreadMetadata(context: StoreContext, threadId: string): ThreadMetadata | undefined {\n const cache = (context as any)._threadMetadataCache as Map<string, ThreadMetadata> | undefined;\n return cache?.get(threadId);\n }\n\n private getCachedFetch(context: StoreContext): typeof fetch | undefined {\n return (context as any)._cachedFetch as typeof fetch | undefined;\n }\n\n private getCachedPodBaseUrl(context: StoreContext): string | undefined {\n const cachedWebId = (context as any)._cachedWebId as string | undefined;\n return this.derivePodBaseUrl(cachedWebId);\n }\n\n private extractFragmentId(subjectUri: string): string {\n const hashIndex = subjectUri.lastIndexOf('#');\n if (hashIndex >= 0 && hashIndex < subjectUri.length - 1) {\n return subjectUri.slice(hashIndex + 1);\n }\n const slashIndex = subjectUri.lastIndexOf('/');\n return slashIndex >= 0 && slashIndex < subjectUri.length - 1 ? subjectUri.slice(slashIndex + 1) : subjectUri;\n }\n\n private parseSparqlBindingValue(binding: Record<string, { value?: string }> | undefined, key: string): string | null {\n return binding?.[key]?.value ?? null;\n }\n\n private async selectMessagesForThread(\n thread: ThreadRef,\n context: StoreContext,\n ): Promise<QueriedMessageRecord[]> {\n await this.getDb(context);\n\n const cachedFetch = this.getCachedFetch(context);\n const podBaseUrl = this.getCachedPodBaseUrl(context);\n if (!cachedFetch || !podBaseUrl) {\n return [];\n }\n\n const resolvedThread = await this.resolveThreadRef(thread, context);\n const endpoint = `${podBaseUrl}/.data/chat/-/sparql`;\n const query = `\n PREFIX meeting: <http://www.w3.org/ns/pim/meeting#>\n PREFIX sioc: <http://rdfs.org/sioc/ns#>\n PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n PREFIX udfs: <https://undefineds.co/ns#>\n SELECT ?msg ?maker ?role ?content ?status ?createdAt ?toolName ?toolCallId ?metadata\n WHERE {\n ?msg a meeting:Message ;\n sioc:has_container <${resolvedThread.threadUri}> .\n OPTIONAL { ?msg foaf:maker ?maker . }\n OPTIONAL { ?msg udfs:role ?role . }\n OPTIONAL { ?msg sioc:content ?content . }\n OPTIONAL { ?msg udfs:status ?status . }\n OPTIONAL { ?msg udfs:createdAt ?createdAt . }\n OPTIONAL { ?msg udfs:toolName ?toolName . }\n OPTIONAL { ?msg udfs:toolCallId ?toolCallId . }\n OPTIONAL { ?msg udfs:metadata ?metadata . }\n }\n ORDER BY ?createdAt\n `.trim();\n\n const response = await cachedFetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/sparql-query',\n Accept: 'application/sparql-results+json',\n },\n body: query,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(`Failed to query thread messages: ${response.status} ${response.statusText} - ${text}`);\n }\n\n const json = await response.json() as {\n results?: {\n bindings?: Array<Record<string, { value?: string }>>;\n };\n };\n\n const bindings = json.results?.bindings ?? [];\n return bindings.map((binding) => ({\n id: this.extractFragmentId(this.parseSparqlBindingValue(binding, 'msg') ?? ''),\n chat: null,\n thread: resolvedThread.threadUri,\n maker: this.parseSparqlBindingValue(binding, 'maker'),\n role: this.parseSparqlBindingValue(binding, 'role'),\n content: this.parseSparqlBindingValue(binding, 'content'),\n status: this.parseSparqlBindingValue(binding, 'status'),\n createdAt: this.parseSparqlBindingValue(binding, 'createdAt'),\n toolName: this.parseSparqlBindingValue(binding, 'toolName'),\n toolCallId: this.parseSparqlBindingValue(binding, 'toolCallId'),\n metadata: this.parseSparqlBindingValue(binding, 'metadata'),\n subjectUri: this.parseSparqlBindingValue(binding, 'msg'),\n }));\n }\n\n // =========================================================================\n // ID Generation\n // =========================================================================\n\n generateThreadId(_context: StoreContext): string {\n return generateId('thread');\n }\n\n generateItemId(itemType: StoreItemType, _thread: ThreadMetadata, _context: StoreContext): string {\n return generateId(itemType.replace('_', '-'));\n }\n\n // =========================================================================\n // Thread Operations (ChatKit thread = our Thread)\n // =========================================================================\n\n async loadThread(thread: ThreadRef, context: StoreContext): Promise<ThreadMetadata> {\n const cacheKey = this.normalizeThreadCacheKey(thread);\n // 先从缓存获取\n const cached = this.getCachedThreadMetadata(context, cacheKey);\n if (cached) {\n return cached;\n }\n\n const db = await this.getDb(context);\n if (!db) {\n throw new Error('Cannot access Pod: invalid credentials');\n }\n\n const resolvedThread = await this.resolveThreadRef(thread, context);\n const threadRecord = await db.findByIri(Thread, resolvedThread.threadUri) as ThreadRecord | null;\n\n if (!threadRecord) {\n throw new Error(`Thread not found: ${resolvedThread.threadId}`);\n }\n\n const chatUriMap = await this.getChatUriMap(context);\n const metadata = this.threadRecordToMetadata(threadRecord, chatUriMap);\n // 缓存结果\n this.cacheThreadMetadata(context, metadata);\n this.cacheThreadChatId(context, metadata.id, resolvedThread.chatId);\n return metadata;\n }\n\n async saveThread(thread: ThreadMetadata, context: StoreContext): Promise<void> {\n const db = await this.getDb(context);\n if (!db) {\n throw new Error('Cannot access Pod: invalid credentials');\n }\n\n const now = new Date().toISOString();\n\n // 从 metadata 获取 chat_id\n const chatId = this.getChatIdFromMetadata(thread.metadata);\n thread.metadata = { ...(thread.metadata ?? {}), chat_id: chatId };\n // Persist all metadata except chat_id (which is derived from storage location).\n const metadataToPersist = { ...(thread.metadata ?? {}) } as Record<string, unknown>;\n delete (metadataToPersist as any).chat_id;\n const metadataJson = Object.keys(metadataToPersist).length > 0 ? JSON.stringify(metadataToPersist) : null;\n\n // 确保 Chat 容器存在\n await this.ensureChat(chatId, context);\n\n // 缓存 Thread -> chatId 映射,避免后续查询\n this.cacheThreadChatId(context, thread.id, chatId);\n const threadUri = await this.buildThreadUri(thread.id, chatId, context);\n\n // 检查 Thread 是否存在\n const existing = await db.findByIri(Thread, threadUri) as ThreadRecord | null;\n\n if (existing) {\n // Update\n await db.updateByLocator(Thread, {\n id: thread.id,\n chatId,\n }, {\n title: thread.title || null,\n status: this.statusToString(thread.status),\n metadata: metadataJson,\n updatedAt: now,\n });\n } else {\n // Insert\n await db.insert(Thread).values({\n id: thread.id,\n chatId, // 关联到 Chat 容器\n title: thread.title || null,\n status: this.statusToString(thread.status),\n metadata: metadataJson,\n createdAt: new Date(thread.created_at * 1000).toISOString(),\n updatedAt: now,\n });\n }\n\n // 缓存完整的 Thread metadata,确保 metadata.chat_id 包含正确的值\n const threadMetadata: ThreadMetadata = {\n ...thread,\n metadata: { ...(thread.metadata ?? {}), chat_id: chatId },\n };\n this.cacheThreadMetadata(context, threadMetadata);\n }\n\n async loadThreads(\n limit: number,\n after: string | undefined,\n order: string,\n context: StoreContext,\n ): Promise<Page<ThreadMetadata>> {\n const db = await this.getDb(context);\n if (!db) {\n return { data: [], has_more: false };\n }\n\n try {\n const threads = await db.select().from(Thread) as ThreadRecord[];\n\n // 排序\n threads.sort((a: ThreadRecord, b: ThreadRecord) => {\n const aTime = a.createdAt ? new Date(a.createdAt).getTime() : 0;\n const bTime = b.createdAt ? new Date(b.createdAt).getTime() : 0;\n return order === 'desc' ? bTime - aTime : aTime - bTime;\n });\n\n // 分页\n let startIndex = 0;\n if (after) {\n const afterIndex = threads.findIndex((t: ThreadRecord) => t.id === after);\n if (afterIndex !== -1) {\n startIndex = afterIndex + 1;\n }\n }\n\n const slice = threads.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + limit < threads.length;\n\n const chatUriMap = await this.getChatUriMap(context);\n\n return {\n data: slice.map((t: ThreadRecord) => this.threadRecordToMetadata(t, chatUriMap)),\n has_more: hasMore,\n after: slice.length > 0 ? slice[slice.length - 1].id : undefined,\n };\n } catch (error) {\n this.logger.error(`Failed to load threads: ${error}`);\n return { data: [], has_more: false };\n }\n }\n\n async deleteThread(thread: ThreadRef, context: StoreContext): Promise<void> {\n const resolvedThread = await this.resolveThreadRef(thread, context);\n const db = await this.getDb(context);\n if (!db) {\n throw new Error('Cannot access Pod: invalid credentials');\n }\n\n // 删除关联到此 Thread 的消息\n try {\n await db.delete(Message).where(eq(Message.thread, resolvedThread.threadUri));\n } catch (err: any) {\n if (!err.message?.includes('404') && !err.message?.includes('Could not retrieve') && !err.message?.includes('Parse error')) {\n throw err;\n }\n this.logger.debug(`Ignoring delete message error: ${err.message}`);\n }\n\n // 删除 Thread\n try {\n await db.deleteByLocator(Thread, {\n id: resolvedThread.threadId,\n chatId: resolvedThread.chatId,\n });\n } catch (err: any) {\n if (!err.message?.includes('404') && !err.message?.includes('Could not retrieve') && !err.message?.includes('Parse error')) {\n throw err;\n }\n this.logger.debug(`Ignoring delete thread error: ${err.message}`);\n }\n\n // 清除缓存\n const metadataCache = (context as any)._threadMetadataCache as Map<string, ThreadMetadata> | undefined;\n const chatIdCache = (context as any)._threadChatIdCache as Map<string, string> | undefined;\n metadataCache?.delete(resolvedThread.threadId);\n chatIdCache?.delete(resolvedThread.threadId);\n }\n\n // =========================================================================\n // Thread Item Operations (ChatKit items = our Messages)\n // =========================================================================\n\n async loadThreadItems(\n thread: ThreadRef,\n after: string | undefined,\n limit: number,\n order: string,\n context: StoreContext,\n ): Promise<Page<ThreadItem>> {\n try {\n const resolvedThread = await this.resolveThreadRef(thread, context);\n const messages = await this.selectMessagesForThread(thread, context);\n\n // 排序\n messages.sort((a: QueriedMessageRecord, b: QueriedMessageRecord) => {\n const aTime = a.createdAt ? new Date(a.createdAt).getTime() : 0;\n const bTime = b.createdAt ? new Date(b.createdAt).getTime() : 0;\n return order === 'desc' ? bTime - aTime : aTime - bTime;\n });\n\n // 分页\n let startIndex = 0;\n if (after) {\n const afterIndex = messages.findIndex((m: QueriedMessageRecord) => m.id === after);\n if (afterIndex !== -1) {\n startIndex = afterIndex + 1;\n }\n }\n\n const slice = messages.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + limit < messages.length;\n\n return {\n data: slice.map((m: QueriedMessageRecord) => this.messageRecordToItem(m, resolvedThread.threadId)),\n has_more: hasMore,\n after: slice.length > 0 ? slice[slice.length - 1].id : undefined,\n };\n } catch (error) {\n this.logger.error(`Failed to load thread items: ${error}`);\n return { data: [], has_more: false };\n }\n }\n\n async addThreadItem(thread: ThreadRef, item: ThreadItem, context: StoreContext): Promise<void> {\n const db = await this.getDb(context);\n if (!db) {\n throw new Error('Cannot access Pod: invalid credentials');\n }\n\n const resolvedThread = await this.resolveThreadRef(thread, context);\n\n const webId = this.getWebId(context);\n let content = '';\n let role: string = MessageRole.USER;\n let status: string | null = null;\n\n if (item.type === 'user_message') {\n const userItem = item as UserMessageItem;\n content = userItem.content\n .filter((c) => c.type === 'input_text')\n .map((c) => (c as any).text)\n .join('\\n');\n role = MessageRole.USER;\n } else if (item.type === 'assistant_message') {\n const assistantItem = item as AssistantMessageItem;\n content = assistantItem.content\n .filter((c) => c.type === 'output_text')\n .map((c) => c.text)\n .join('\\n');\n role = MessageRole.ASSISTANT;\n status = assistantItem.status || MessageStatus.COMPLETED;\n } else {\n // 其他类型暂时存储为 JSON\n content = JSON.stringify(item);\n role = MessageRole.SYSTEM;\n }\n\n const messageRecord = {\n id: item.id,\n chat: resolvedThread.chatId, // bare ID,用于路径构建\n thread: resolvedThread.threadUri, // 完整 URI,用于 RDF 引用\n maker: role === MessageRole.USER ? webId : null,\n role,\n content,\n status,\n createdAt: new Date(item.created_at * 1000).toISOString(),\n };\n\n await db.insert(Message).values(messageRecord);\n\n // Track this ID to avoid cache timing issues in saveItem\n this.recentlyCreatedIds.add(messageRecord.id);\n }\n\n // Track recently created message IDs to avoid SELECT cache timing issues\n private recentlyCreatedIds = new Set<string>();\n\n async saveItem(thread: ThreadRef, item: ThreadItem, context: StoreContext): Promise<void> {\n const db = await this.getDb(context);\n if (!db) {\n throw new Error('Cannot access Pod: invalid credentials');\n }\n\n const resolvedThread = await this.resolveThreadRef(thread, context);\n\n // 准备更新数据\n let content = '';\n let status: string | null = null;\n\n if (item.type === 'user_message') {\n const userItem = item as UserMessageItem;\n content = userItem.content\n .filter((c) => c.type === 'input_text')\n .map((c) => (c as any).text)\n .join('\\n');\n } else if (item.type === 'assistant_message') {\n const assistantItem = item as AssistantMessageItem;\n content = assistantItem.content\n .filter((c) => c.type === 'output_text')\n .map((c) => c.text)\n .join('\\n');\n status = assistantItem.status || MessageStatus.COMPLETED;\n }\n\n // 获取 createdAt 用于计算资源路径(与 drizzle-solid 模板填充保持一致)\n const createdAt = item.created_at ? new Date(item.created_at * 1000).toISOString() : undefined;\n\n // 如果是最近创建的消息,使用直接 PATCH 更新(避免 drizzle-solid UPDATE 的 bug)\n const wasRecentlyCreated = this.recentlyCreatedIds.has(item.id);\n if (wasRecentlyCreated) {\n this.recentlyCreatedIds.delete(item.id);\n await this.directPatchMessage(context, resolvedThread.chatId, item.id, content, status, createdAt);\n return;\n }\n\n // 对于非最近创建的消息,使用普通流程\n const existingItems = (await this.selectMessagesForThread(thread, context))\n .filter((message) => message.id === item.id);\n const existing = existingItems.length > 0 ? existingItems[0] : null;\n\n if (existing) {\n // 使用直接 PATCH 更新\n const existingCreatedAt = existing.createdAt\n ? (existing.createdAt instanceof Date ? existing.createdAt.toISOString() : String(existing.createdAt))\n : undefined;\n await this.directPatchMessage(context, resolvedThread.chatId, item.id, content, status, existingCreatedAt);\n } else {\n // Create new record\n await this.addThreadItem(thread, item, context);\n }\n }\n\n /**\n * 直接使用 SPARQL UPDATE PATCH 更新消息内容\n * 避免 drizzle-solid UPDATE 的 bug\n */\n private async directPatchMessage(\n context: StoreContext,\n chatId: string,\n messageId: string,\n content: string,\n status: string | null,\n createdAt?: string\n ): Promise<void> {\n // 使用缓存的 fetch 和 webId(由 getDb 时创建的 session)\n const cachedFetch = (context as any)._cachedFetch as typeof fetch | undefined;\n const cachedWebId = (context as any)._cachedWebId as string | undefined;\n\n if (!cachedFetch || !cachedWebId) {\n throw new Error('No cached session for direct PATCH - call getDb first');\n }\n\n // 构建资源 URL 和 subject URI\n // Template: {chatId}/{yyyy}/{MM}/{dd}/messages.ttl#{id}\n const podBaseUrl = this.derivePodBaseUrl(cachedWebId);\n if (!podBaseUrl) {\n throw new Error(`Cannot resolve Pod base URL from cached WebID: ${cachedWebId}`);\n }\n const messageDate = createdAt ? new Date(createdAt) : new Date();\n const yyyy = String(messageDate.getUTCFullYear());\n const MM = String(messageDate.getUTCMonth() + 1).padStart(2, '0');\n const dd = String(messageDate.getUTCDate()).padStart(2, '0');\n const resourceUrl = `${podBaseUrl}/.data/chat/${chatId}/${yyyy}/${MM}/${dd}/messages.ttl`;\n const subjectUri = `${resourceUrl}#${messageId}`;\n\n // 构建 SPARQL UPDATE:删除旧值,插入新值\n const deletePatterns: string[] = [];\n const insertTriples: string[] = [];\n\n // 转义特殊字符\n const escapeForSparql = (value: string): string => {\n const hasQuotes = value.includes('\"');\n const hasNewlines = value.includes('\\n') || value.includes('\\r');\n\n if (hasQuotes || hasNewlines) {\n // 使用三引号\n let escaped = value;\n escaped = escaped.replace(/\"\"\"/g, '\"\\\\\"\\\\\"\"');\n if (escaped.endsWith('\"')) {\n const match = escaped.match(/\"*$/);\n const trailingQuotes = match ? match[0].length : 0;\n if (trailingQuotes > 0) {\n escaped = escaped.slice(0, -trailingQuotes) + '\\\\\"'.repeat(trailingQuotes);\n }\n }\n return `\"\"\"${escaped}\"\"\"`;\n }\n return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n };\n\n // Content 更新\n deletePatterns.push(`<${subjectUri}> <http://rdfs.org/sioc/ns#content> ?oldContent .`);\n insertTriples.push(`<${subjectUri}> <http://rdfs.org/sioc/ns#content> ${escapeForSparql(content)} .`);\n\n // Status 更新\n if (status) {\n deletePatterns.push(`<${subjectUri}> <https://undefineds.co/ns#status> ?oldStatus .`);\n insertTriples.push(`<${subjectUri}> <https://undefineds.co/ns#status> \"${status}\" .`);\n }\n\n const sparql = `\nDELETE { ${deletePatterns.join(' ')} }\nINSERT { ${insertTriples.join(' ')} }\nWHERE { ${deletePatterns.join(' ')} }\n `.trim();\n\n const response = await cachedFetch(resourceUrl, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body: sparql,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(`Direct PATCH failed: ${response.status} ${response.statusText} - ${text}`);\n }\n }\n\n private async directDeleteMessage(\n context: StoreContext,\n subjectUri?: string | null,\n ): Promise<void> {\n if (!subjectUri) {\n throw new Error('Cannot delete message without subject URI');\n }\n\n const cachedFetch = (context as any)._cachedFetch as typeof fetch | undefined;\n if (!cachedFetch) {\n throw new Error('No cached session for direct DELETE - call getDb first');\n }\n\n const hashIndex = subjectUri.lastIndexOf('#');\n const resourceUrl = hashIndex >= 0 ? subjectUri.slice(0, hashIndex) : subjectUri;\n const sparql = `DELETE WHERE { <${subjectUri}> ?p ?o . }`;\n\n const response = await cachedFetch(resourceUrl, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body: sparql,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(`Direct message delete failed: ${response.status} ${response.statusText} - ${text}`);\n }\n }\n\n async loadItem(thread: ThreadRef, itemId: string, context: StoreContext): Promise<ThreadItem> {\n const db = await this.getDb(context);\n if (!db) {\n throw new Error('Cannot access Pod: invalid credentials');\n }\n\n const resolvedThread = await this.resolveThreadRef(thread, context);\n const messages = (await this.selectMessagesForThread(thread, context))\n .filter((message) => message.id === itemId);\n\n if (messages.length === 0) {\n throw new Error(`Item not found: ${itemId}`);\n }\n\n return this.messageRecordToItem(messages[0], resolvedThread.threadId);\n }\n\n async deleteThreadItem(thread: ThreadRef, itemId: string, context: StoreContext): Promise<void> {\n const target = (await this.selectMessagesForThread(thread, context))\n .find((message) => message.id === itemId);\n if (!target) {\n return;\n }\n\n await this.directDeleteMessage(context, target.subjectUri);\n }\n\n // =========================================================================\n // Attachment Operations (存 Pod 文件)\n // =========================================================================\n\n async saveAttachment(attachment: Attachment, _context: StoreContext): Promise<void> {\n this.logger.info(`Attachment saved: ${attachment.id} (${attachment.name})`);\n }\n\n async loadAttachment(attachmentId: string, _context: StoreContext): Promise<Attachment> {\n throw new Error(`Attachment not found: ${attachmentId}`);\n }\n\n async deleteAttachment(attachmentId: string, _context: StoreContext): Promise<void> {\n this.logger.info(`Attachment deleted: ${attachmentId}`);\n }\n\n // =========================================================================\n // AI Config Operations (复用 Session 缓存)\n // =========================================================================\n\n /**\n * AI 配置结果\n */\n public static readonly AiConfigResult = class {\n providerId!: string;\n baseUrl!: string;\n proxyUrl?: string;\n apiKey!: string;\n credentialId!: string;\n };\n\n /**\n * 从 Pod 获取 AI 配置(Provider + Credential)\n * 复用已缓存的 Session,避免重复登录\n */\n private extractProviderId(provider: string): string {\n if (!provider) {\n return '';\n }\n\n const hashIndex = provider.lastIndexOf('#');\n if (hashIndex >= 0 && hashIndex < provider.length - 1) {\n return provider.slice(hashIndex + 1);\n }\n\n return provider;\n }\n\n private isKnownProvider(\n providerId: string,\n providers: readonly KnownProvider[],\n ): providerId is KnownProvider {\n return providers.includes(providerId as KnownProvider);\n }\n\n private pushAvailableModel(\n models: any[],\n seenModelIds: Set<string>,\n model: {\n id?: string | null;\n name?: string | null;\n provider?: string | null;\n ownedBy?: string | null;\n contextWindow?: number;\n maxTokens?: number;\n },\n ): void {\n const id = typeof model.id === 'string' ? model.id.trim() : '';\n if (!id || seenModelIds.has(id)) {\n return;\n }\n\n seenModelIds.add(id);\n const item: Record<string, unknown> = {\n id,\n object: 'model',\n };\n\n if (typeof model.name === 'string' && model.name.trim()) {\n item.name = model.name.trim();\n }\n if (typeof model.provider === 'string' && model.provider.trim()) {\n item.provider = model.provider.trim();\n }\n if (typeof model.ownedBy === 'string' && model.ownedBy.trim()) {\n item.owned_by = model.ownedBy.trim();\n }\n if (typeof model.contextWindow === 'number' && Number.isFinite(model.contextWindow)) {\n item.context_window = model.contextWindow;\n }\n if (typeof model.maxTokens === 'number' && Number.isFinite(model.maxTokens)) {\n item.max_tokens = model.maxTokens;\n }\n\n models.push(item);\n }\n\n async getAiConfig(context: StoreContext): Promise<{\n providerId: string;\n baseUrl: string;\n proxyUrl?: string;\n defaultModel?: string;\n apiKey: string;\n credentialId: string;\n } | undefined> {\n const db = await this.getDb(context);\n if (!db) {\n return undefined;\n }\n\n try {\n // 查询活跃的 AI 凭据\n const credentials = await db.select()\n .from(Credential)\n .where(and(\n eq(Credential.service, ServiceType.AI),\n eq(Credential.status, CredentialStatus.ACTIVE),\n ));\n\n if (credentials.length === 0) {\n return undefined;\n }\n\n // Build provider @id → record map for URI matching\n const allProviders = await db.select().from(Provider);\n const providerByUri = new Map<string, typeof allProviders[0]>();\n for (const p of allProviders) {\n const uri = (p as any)['@id'] as string | undefined;\n if (uri) providerByUri.set(uri, p);\n // Also index by bare id for fallback\n providerByUri.set(p.id, p);\n }\n\n // 遍历凭据,找到有效的 Provider\n for (const cred of credentials) {\n if (!cred.provider) continue;\n\n // Match provider by full URI first, then fallback to bare fragment id.\n const provider = providerByUri.get(cred.provider)\n ?? providerByUri.get(this.extractProviderId(cred.provider));\n if (!provider) continue;\n\n const baseUrl = provider.baseUrl;\n if (!baseUrl) continue;\n\n const defaultModelRef = provider.defaultModel ?? provider.hasModel;\n const defaultModel = defaultModelRef\n ? (await db.findByIri(Model, defaultModelRef))?.id ?? undefined\n : undefined;\n\n this.logger.debug(`Using credential ${cred.id} with provider ${provider.id}`);\n\n return {\n providerId: provider.id,\n baseUrl,\n proxyUrl: provider.proxyUrl || undefined,\n defaultModel,\n apiKey: cred.apiKey!,\n credentialId: cred.id,\n };\n }\n\n return undefined;\n } catch (error) {\n this.logger.warn(`Failed to read AI config from Pod: ${error}`);\n return undefined;\n }\n }\n\n async listAvailableModels(context: StoreContext): Promise<any[]> {\n const db = await this.getDb(context);\n if (!db) {\n return [];\n }\n\n const config = await this.getAiConfig(context);\n if (!config) {\n return [];\n }\n\n const models: any[] = [];\n const seenModelIds = new Set<string>();\n const providerByKey = new Map<string, any>();\n let providerDisplayName = config.providerId;\n\n try {\n const providers = await db.select().from(Provider) as any[];\n for (const provider of providers) {\n const uri = typeof provider?.['@id'] === 'string' ? provider['@id'] : undefined;\n if (uri) {\n providerByKey.set(uri, provider);\n }\n if (typeof provider?.id === 'string' && provider.id) {\n providerByKey.set(provider.id, provider);\n }\n }\n\n const currentProvider = providerByKey.get(config.providerId)\n ?? providers.find((provider: any) => provider?.baseUrl === config.baseUrl);\n if (typeof currentProvider?.displayName === 'string' && currentProvider.displayName.trim()) {\n providerDisplayName = currentProvider.displayName.trim();\n }\n } catch (error) {\n this.logger.warn(`Failed to load providers for model listing: ${error}`);\n }\n\n try {\n const { getModels, getProviders } = await import('@mariozechner/pi-ai');\n const knownProviders = typeof getProviders === 'function' ? getProviders() : [];\n const providerModels = (\n typeof getModels === 'function' && this.isKnownProvider(config.providerId, knownProviders)\n ) ? getModels(config.providerId) : [];\n for (const model of providerModels) {\n this.pushAvailableModel(models, seenModelIds, {\n id: model.id,\n name: model.name || model.id,\n provider: config.providerId,\n ownedBy: model.provider || providerDisplayName,\n contextWindow: model.contextWindow,\n maxTokens: model.maxTokens,\n });\n }\n } catch (error) {\n this.logger.debug(`Failed to load provider model catalog for ${config.providerId}: ${error}`);\n }\n\n try {\n const podModels = await db.select().from(Model) as any[];\n for (const model of podModels) {\n const providerRef = typeof model?.isProvidedBy === 'string' ? model.isProvidedBy : '';\n const modelProvider = providerByKey.get(providerRef)\n ?? providerByKey.get(this.extractProviderId(providerRef));\n const modelProviderId = typeof modelProvider?.id === 'string' && modelProvider.id\n ? modelProvider.id\n : this.extractProviderId(providerRef);\n\n if (modelProviderId && modelProviderId !== config.providerId && model.id !== config.defaultModel) {\n continue;\n }\n\n this.pushAvailableModel(models, seenModelIds, {\n id: model.id,\n name: model.displayName || model.id,\n provider: modelProviderId || config.providerId,\n ownedBy: modelProvider?.displayName || providerDisplayName,\n contextWindow: typeof model.contextLength === 'number' ? model.contextLength : undefined,\n maxTokens: typeof model.maxOutputTokens === 'number' ? model.maxOutputTokens : undefined,\n });\n }\n } catch (error) {\n this.logger.warn(`Failed to load Pod models for ${config.providerId}: ${error}`);\n }\n\n if (config.defaultModel) {\n this.pushAvailableModel(models, seenModelIds, {\n id: config.defaultModel,\n name: config.defaultModel,\n provider: config.providerId,\n ownedBy: providerDisplayName,\n });\n }\n\n return models;\n }\n\n /**\n * 更新凭据状态(如 429 限流)\n * 复用已缓存的 Session\n */\n async updateCredentialStatus(\n context: StoreContext,\n credentialId: string,\n status: CredentialStatus,\n options?: { rateLimitResetAt?: Date; incrementFailCount?: boolean },\n ): Promise<void> {\n const db = await this.getDb(context);\n if (!db) {\n this.logger.debug('Cannot update credential status: no db available');\n return;\n }\n\n try {\n const updateData: Record<string, any> = { status };\n\n if (options?.rateLimitResetAt) {\n updateData.rateLimitResetAt = options.rateLimitResetAt;\n }\n\n // 如果需要递增 failCount,先查询当前值\n if (options?.incrementFailCount) {\n const currentCred = await db.findByLocator(Credential, { id: credentialId });\n if (currentCred) {\n updateData.failCount = (currentCred.failCount ?? 0) + 1;\n }\n }\n\n await db.updateByLocator(Credential, { id: credentialId }, updateData);\n\n this.logger.info(`Credential ${credentialId} status updated to ${status}`);\n } catch (error) {\n this.logger.error(`Failed to update credential ${credentialId}: ${error}`);\n }\n }\n\n /**\n * 记录凭据使用成功(重置 failCount,更新 lastUsedAt)\n */\n async recordCredentialSuccess(context: StoreContext, credentialId: string): Promise<void> {\n const db = await this.getDb(context);\n if (!db) {\n return;\n }\n\n try {\n await db.updateByLocator(Credential, { id: credentialId }, {\n lastUsedAt: new Date(),\n failCount: 0,\n status: CredentialStatus.ACTIVE,\n rateLimitResetAt: undefined,\n });\n } catch (error) {\n this.logger.debug(`Failed to record credential success: ${error}`);\n }\n }\n\n}\n"]}
|