@lobehub/lobehub 2.0.0-next.320 → 2.0.0-next.322
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/.codex/skills/vercel-react-best-practices/AGENTS.md +2410 -0
- package/.codex/skills/vercel-react-best-practices/SKILL.md +125 -0
- package/.codex/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/.codex/skills/vercel-react-best-practices/rules/advanced-use-latest.md +49 -0
- package/.codex/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/.codex/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
- package/.codex/skills/vercel-react-best-practices/rules/async-dependencies.md +36 -0
- package/.codex/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/.codex/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/.codex/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/.codex/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/.codex/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/.codex/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/.codex/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/.codex/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/.codex/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/.codex/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/.codex/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/.codex/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +57 -0
- package/.codex/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/.codex/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/.codex/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/.codex/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/.codex/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/.codex/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/.codex/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/.codex/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/.codex/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/.codex/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/.codex/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/.codex/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/.codex/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/.codex/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/.codex/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/.codex/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/.codex/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/.codex/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/.codex/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/.codex/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/.codex/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/.codex/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/.codex/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/.codex/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/.codex/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/.codex/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/.codex/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/.codex/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/.codex/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/.codex/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/.cursor/skills/vercel-react-best-practices/AGENTS.md +2410 -0
- package/.cursor/skills/vercel-react-best-practices/SKILL.md +125 -0
- package/.cursor/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/.cursor/skills/vercel-react-best-practices/rules/advanced-use-latest.md +49 -0
- package/.cursor/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/.cursor/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
- package/.cursor/skills/vercel-react-best-practices/rules/async-dependencies.md +36 -0
- package/.cursor/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/.cursor/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/.cursor/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/.cursor/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/.cursor/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/.cursor/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/.cursor/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/.cursor/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/.cursor/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/.cursor/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/.cursor/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/.cursor/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +57 -0
- package/.cursor/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/.cursor/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/.cursor/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/.cursor/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/.cursor/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/.cursor/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/.cursor/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/.cursor/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/.cursor/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/.cursor/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/.cursor/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/.cursor/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/.cursor/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/.cursor/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/.cursor/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/.cursor/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/.cursor/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/.cursor/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/.cursor/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/.cursor/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/.cursor/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/.cursor/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/.cursor/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/.cursor/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/.cursor/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/.cursor/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/.cursor/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/.cursor/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/.cursor/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/.cursor/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/CHANGELOG.md +50 -0
- package/changelog/v1.json +10 -0
- package/package.json +1 -1
- package/src/app/[variants]/(main)/agent/profile/index.tsx +15 -2
- package/src/features/PageEditor/PageEditor.tsx +20 -8
- package/src/layout/GlobalProvider/FaviconProvider.tsx +45 -21
- package/src/server/globalConfig/parseMemoryExtractionConfig.ts +43 -4
- package/src/server/services/memory/userMemory/__tests__/extract.payload.test.ts +101 -0
- package/src/server/services/memory/userMemory/__tests__/extract.runtime.test.ts +121 -0
- package/src/server/services/memory/userMemory/extract.ts +164 -17
- package/src/utils/styles.ts +10 -0
|
@@ -38,6 +38,7 @@ import {
|
|
|
38
38
|
} from '@lobechat/observability-otel/modules/memory-user-memory';
|
|
39
39
|
import { attributesCommon } from '@lobechat/observability-otel/node';
|
|
40
40
|
import type {
|
|
41
|
+
AiProviderRuntimeState,
|
|
41
42
|
IdentityMemoryDetail,
|
|
42
43
|
MemoryExtractionAgentCallTrace,
|
|
43
44
|
MemoryExtractionTraceError,
|
|
@@ -55,6 +56,7 @@ import type { ListUsersForMemoryExtractorCursor } from '@/database/models/user';
|
|
|
55
56
|
import { UserModel } from '@/database/models/user';
|
|
56
57
|
import { UserMemoryModel } from '@/database/models/userMemory';
|
|
57
58
|
import { UserMemorySourceBenchmarkLoCoMoModel } from '@/database/models/userMemory/sources/benchmarkLoCoMo';
|
|
59
|
+
import { AiInfraRepos } from '@/database/repositories/aiInfra';
|
|
58
60
|
import { getServerDB } from '@/database/server';
|
|
59
61
|
import { getServerGlobalConfig } from '@/server/globalConfig';
|
|
60
62
|
import {
|
|
@@ -64,7 +66,7 @@ import {
|
|
|
64
66
|
import { KeyVaultsGateKeeper } from '@/server/modules/KeyVaultsEncrypt';
|
|
65
67
|
import { S3 } from '@/server/modules/S3';
|
|
66
68
|
import type { GlobalMemoryLayer } from '@/types/serverConfig';
|
|
67
|
-
import type {
|
|
69
|
+
import type { ProviderConfig } from '@/types/user/settings';
|
|
68
70
|
import {
|
|
69
71
|
LayersEnum,
|
|
70
72
|
MemorySourceType,
|
|
@@ -212,6 +214,11 @@ export interface TopicBatchWorkflowPayload extends MemoryExtractionPayloadInput
|
|
|
212
214
|
userId: string;
|
|
213
215
|
}
|
|
214
216
|
|
|
217
|
+
type ProviderKeyVaultMap = Record<
|
|
218
|
+
string,
|
|
219
|
+
AiProviderRuntimeState['runtimeConfig'][string]['keyVaults'] | undefined
|
|
220
|
+
>;
|
|
221
|
+
|
|
215
222
|
export const buildWorkflowPayloadInput = (
|
|
216
223
|
payload: MemoryExtractionNormalizedPayload,
|
|
217
224
|
): MemoryExtractionPayloadInput => ({
|
|
@@ -232,11 +239,9 @@ export const buildWorkflowPayloadInput = (
|
|
|
232
239
|
userIds: payload.userIds,
|
|
233
240
|
});
|
|
234
241
|
|
|
235
|
-
const normalizeProvider = (provider: string) => provider.toLowerCase()
|
|
236
|
-
|
|
237
|
-
const extractCredentialsFromVault = (provider: string, keyVaults?: UserKeyVaults) => {
|
|
238
|
-
const vault = keyVaults?.[normalizeProvider(provider)];
|
|
242
|
+
const normalizeProvider = (provider: string) => provider.toLowerCase();
|
|
239
243
|
|
|
244
|
+
const extractCredentialsFromVault = (vault?: Record<string, unknown>) => {
|
|
240
245
|
if (!vault || typeof vault !== 'object') return {};
|
|
241
246
|
|
|
242
247
|
const apiKey = 'apiKey' in vault && typeof vault.apiKey === 'string' ? vault.apiKey : undefined;
|
|
@@ -275,11 +280,10 @@ const maskSecret = (value?: string) => {
|
|
|
275
280
|
return `${value.slice(0, 6)}***${value.slice(-4)}`;
|
|
276
281
|
};
|
|
277
282
|
|
|
278
|
-
const resolveRuntimeAgentConfig = (agent: MemoryAgentConfig, keyVaults?:
|
|
283
|
+
const resolveRuntimeAgentConfig = (agent: MemoryAgentConfig, keyVaults?: ProviderKeyVaultMap) => {
|
|
279
284
|
const provider = agent.provider || 'openai';
|
|
280
285
|
const { apiKey: userApiKey, baseURL: userBaseURL } = extractCredentialsFromVault(
|
|
281
|
-
provider,
|
|
282
|
-
keyVaults,
|
|
286
|
+
keyVaults?.[normalizeProvider(provider)],
|
|
283
287
|
);
|
|
284
288
|
|
|
285
289
|
// Only use the user baseURL if we are also using their API key; otherwise fall back entirely
|
|
@@ -309,7 +313,7 @@ const debugRuntimeInit = (
|
|
|
309
313
|
});
|
|
310
314
|
};
|
|
311
315
|
|
|
312
|
-
const initRuntimeForAgent = async (agent: MemoryAgentConfig, keyVaults?:
|
|
316
|
+
const initRuntimeForAgent = async (agent: MemoryAgentConfig, keyVaults?: ProviderKeyVaultMap) => {
|
|
313
317
|
const resolved = resolveRuntimeAgentConfig(agent, keyVaults);
|
|
314
318
|
debugRuntimeInit(agent, resolved);
|
|
315
319
|
|
|
@@ -366,6 +370,13 @@ type MemoryExtractionConfig = ReturnType<typeof parseMemoryExtractionConfig>;
|
|
|
366
370
|
type ServerConfig = Awaited<ReturnType<typeof getServerGlobalConfig>>;
|
|
367
371
|
|
|
368
372
|
export class MemoryExtractionExecutor {
|
|
373
|
+
private readonly aiProviderConfig: Record<string, ProviderConfig>;
|
|
374
|
+
private readonly embeddingPreferredModels?: string[];
|
|
375
|
+
private readonly embeddingPreferredProviders?: string[];
|
|
376
|
+
private readonly gatekeeperPreferredModels?: string[];
|
|
377
|
+
private readonly gatekeeperPreferredProviders?: string[];
|
|
378
|
+
private readonly layerPreferredModels?: string[];
|
|
379
|
+
private readonly layerPreferredProviders?: string[];
|
|
369
380
|
private readonly privateConfig: MemoryExtractionConfig;
|
|
370
381
|
private readonly modelConfig: {
|
|
371
382
|
embeddingsModel: string;
|
|
@@ -380,6 +391,13 @@ export class MemoryExtractionExecutor {
|
|
|
380
391
|
|
|
381
392
|
private constructor(serverConfig: ServerConfig, privateConfig: MemoryExtractionConfig) {
|
|
382
393
|
this.privateConfig = privateConfig;
|
|
394
|
+
this.aiProviderConfig = (serverConfig.aiProvider || {}) as Record<string, ProviderConfig>;
|
|
395
|
+
this.embeddingPreferredProviders = privateConfig.embeddingPreferredProviders;
|
|
396
|
+
this.embeddingPreferredModels = privateConfig.embeddingPreferredModels;
|
|
397
|
+
this.gatekeeperPreferredProviders = privateConfig.agentGateKeeperPreferredProviders;
|
|
398
|
+
this.gatekeeperPreferredModels = privateConfig.agentGateKeeperPreferredModels;
|
|
399
|
+
this.layerPreferredProviders = privateConfig.agentLayerExtractorPreferredProviders;
|
|
400
|
+
this.layerPreferredModels = privateConfig.agentLayerExtractorPreferredModels;
|
|
383
401
|
|
|
384
402
|
const publicMemoryConfig = serverConfig.memory?.userMemory;
|
|
385
403
|
|
|
@@ -1014,8 +1032,11 @@ export class MemoryExtractionExecutor {
|
|
|
1014
1032
|
};
|
|
1015
1033
|
|
|
1016
1034
|
const userModel = new UserModel(db, job.userId);
|
|
1017
|
-
const userState = await
|
|
1018
|
-
|
|
1035
|
+
const [userState, aiProviderRuntimeState] = await Promise.all([
|
|
1036
|
+
userModel.getUserState(KeyVaultsGateKeeper.getUserKeyVaults),
|
|
1037
|
+
this.getAiProviderRuntimeState(job.userId),
|
|
1038
|
+
]);
|
|
1039
|
+
const keyVaults = this.resolveRuntimeKeyVaults(aiProviderRuntimeState);
|
|
1019
1040
|
const language = userState.settings?.general?.responseLanguage;
|
|
1020
1041
|
|
|
1021
1042
|
const runtimes = await this.getRuntime(job.userId, keyVaults);
|
|
@@ -1625,7 +1646,121 @@ export class MemoryExtractionExecutor {
|
|
|
1625
1646
|
};
|
|
1626
1647
|
}
|
|
1627
1648
|
|
|
1628
|
-
private async
|
|
1649
|
+
private async getAiProviderRuntimeState(userId: string): Promise<AiProviderRuntimeState> {
|
|
1650
|
+
const db = await this.db;
|
|
1651
|
+
const aiInfraRepos = new AiInfraRepos(db, userId, this.aiProviderConfig);
|
|
1652
|
+
|
|
1653
|
+
return aiInfraRepos.getAiProviderRuntimeState(KeyVaultsGateKeeper.getUserKeyVaults);
|
|
1654
|
+
}
|
|
1655
|
+
|
|
1656
|
+
private resolveRuntimeKeyVaults(runtimeState: AiProviderRuntimeState): ProviderKeyVaultMap {
|
|
1657
|
+
const normalizedRuntimeConfig = Object.fromEntries(
|
|
1658
|
+
Object.entries(runtimeState.runtimeConfig || {}).map(([providerId, config]) => [
|
|
1659
|
+
normalizeProvider(providerId),
|
|
1660
|
+
config,
|
|
1661
|
+
]),
|
|
1662
|
+
);
|
|
1663
|
+
|
|
1664
|
+
const providerModels = runtimeState.enabledAiModels.reduce<Record<string, Set<string>>>(
|
|
1665
|
+
(acc, model) => {
|
|
1666
|
+
const providerId = normalizeProvider(model.providerId);
|
|
1667
|
+
acc[providerId] = acc[providerId] || new Set<string>();
|
|
1668
|
+
acc[providerId].add(model.id);
|
|
1669
|
+
return acc;
|
|
1670
|
+
},
|
|
1671
|
+
{},
|
|
1672
|
+
);
|
|
1673
|
+
|
|
1674
|
+
const resolveProviderForModel = (
|
|
1675
|
+
modelId: string,
|
|
1676
|
+
fallbackProvider?: string,
|
|
1677
|
+
preferredProviders?: string[],
|
|
1678
|
+
preferredModels?: string[],
|
|
1679
|
+
label?: string,
|
|
1680
|
+
) => {
|
|
1681
|
+
const providerOrder = Array.from(
|
|
1682
|
+
new Set(
|
|
1683
|
+
[
|
|
1684
|
+
...(preferredProviders?.map(normalizeProvider) || []),
|
|
1685
|
+
fallbackProvider ? normalizeProvider(fallbackProvider) : undefined,
|
|
1686
|
+
...Object.keys(providerModels),
|
|
1687
|
+
].filter(Boolean) as string[],
|
|
1688
|
+
),
|
|
1689
|
+
);
|
|
1690
|
+
|
|
1691
|
+
const candidateModels = preferredModels && preferredModels.length > 0 ? preferredModels : [];
|
|
1692
|
+
|
|
1693
|
+
for (const providerId of providerOrder) {
|
|
1694
|
+
const models = providerModels[providerId];
|
|
1695
|
+
if (!models) continue;
|
|
1696
|
+
if (models.has(modelId)) return providerId;
|
|
1697
|
+
|
|
1698
|
+
const preferredMatch = candidateModels.find((preferredModel) => models.has(preferredModel));
|
|
1699
|
+
if (preferredMatch) return providerId;
|
|
1700
|
+
}
|
|
1701
|
+
if (fallbackProvider) {
|
|
1702
|
+
console.warn(
|
|
1703
|
+
`[memory-extraction] no enabled provider found for ${label || 'model'} "${modelId}"`,
|
|
1704
|
+
`(preferred ${preferredProviders}), falling back to server-configured provider "${fallbackProvider}".`,
|
|
1705
|
+
);
|
|
1706
|
+
|
|
1707
|
+
return normalizeProvider(fallbackProvider);
|
|
1708
|
+
}
|
|
1709
|
+
|
|
1710
|
+
throw new Error(
|
|
1711
|
+
`Unable to resolve provider for ${label || 'model'} "${modelId}". ` +
|
|
1712
|
+
`Check preferred providers/models configuration.`,
|
|
1713
|
+
);
|
|
1714
|
+
};
|
|
1715
|
+
|
|
1716
|
+
const keyVaults: ProviderKeyVaultMap = {};
|
|
1717
|
+
|
|
1718
|
+
const gatekeeperProvider = resolveProviderForModel(
|
|
1719
|
+
this.modelConfig.gateModel,
|
|
1720
|
+
this.privateConfig.agentGateKeeper.provider,
|
|
1721
|
+
this.gatekeeperPreferredProviders,
|
|
1722
|
+
this.gatekeeperPreferredModels,
|
|
1723
|
+
'gatekeeper',
|
|
1724
|
+
);
|
|
1725
|
+
const gatekeeperRuntime = normalizedRuntimeConfig[gatekeeperProvider];
|
|
1726
|
+
if (gatekeeperRuntime?.keyVaults) {
|
|
1727
|
+
keyVaults[gatekeeperProvider] = gatekeeperRuntime.keyVaults;
|
|
1728
|
+
}
|
|
1729
|
+
|
|
1730
|
+
const embeddingProvider = resolveProviderForModel(
|
|
1731
|
+
this.modelConfig.embeddingsModel,
|
|
1732
|
+
this.privateConfig.embedding.provider,
|
|
1733
|
+
this.embeddingPreferredProviders,
|
|
1734
|
+
this.embeddingPreferredModels,
|
|
1735
|
+
'embedding',
|
|
1736
|
+
);
|
|
1737
|
+
const embeddingRuntime = normalizedRuntimeConfig[embeddingProvider];
|
|
1738
|
+
if (embeddingRuntime?.keyVaults) {
|
|
1739
|
+
keyVaults[embeddingProvider] = embeddingRuntime.keyVaults;
|
|
1740
|
+
}
|
|
1741
|
+
|
|
1742
|
+
Object.values(this.modelConfig.layerModels).forEach((model) => {
|
|
1743
|
+
if (!model) return;
|
|
1744
|
+
const providerId = resolveProviderForModel(
|
|
1745
|
+
model,
|
|
1746
|
+
this.privateConfig.agentLayerExtractor.provider,
|
|
1747
|
+
this.layerPreferredProviders,
|
|
1748
|
+
this.layerPreferredModels,
|
|
1749
|
+
'layer extractor',
|
|
1750
|
+
);
|
|
1751
|
+
const runtime = normalizedRuntimeConfig[providerId];
|
|
1752
|
+
if (runtime?.keyVaults) {
|
|
1753
|
+
keyVaults[providerId] = runtime.keyVaults;
|
|
1754
|
+
}
|
|
1755
|
+
});
|
|
1756
|
+
|
|
1757
|
+
return keyVaults;
|
|
1758
|
+
}
|
|
1759
|
+
|
|
1760
|
+
private async getRuntime(
|
|
1761
|
+
userId: string,
|
|
1762
|
+
keyVaults?: ProviderKeyVaultMap,
|
|
1763
|
+
): Promise<RuntimeBundle> {
|
|
1629
1764
|
// TODO: implement a better cache eviction strategy
|
|
1630
1765
|
// TODO: make cache size configurable
|
|
1631
1766
|
if (this.runtimeCache.keys.length > 200) {
|
|
@@ -1673,8 +1808,11 @@ export class MemoryExtractionExecutor {
|
|
|
1673
1808
|
try {
|
|
1674
1809
|
const db = await this.db;
|
|
1675
1810
|
const userModel = new UserModel(db, params.userId);
|
|
1676
|
-
const userState = await
|
|
1677
|
-
|
|
1811
|
+
const [userState, aiProviderRuntimeState] = await Promise.all([
|
|
1812
|
+
userModel.getUserState(KeyVaultsGateKeeper.getUserKeyVaults),
|
|
1813
|
+
this.getAiProviderRuntimeState(params.userId),
|
|
1814
|
+
]);
|
|
1815
|
+
const keyVaults = this.resolveRuntimeKeyVaults(aiProviderRuntimeState);
|
|
1678
1816
|
const language = params.language || userState.settings?.general?.responseLanguage;
|
|
1679
1817
|
|
|
1680
1818
|
const runtimes = await this.getRuntime(params.userId, keyVaults);
|
|
@@ -1849,7 +1987,10 @@ export class MemoryExtractionWorkflowService {
|
|
|
1849
1987
|
return this.client;
|
|
1850
1988
|
}
|
|
1851
1989
|
|
|
1852
|
-
static triggerProcessUsers(
|
|
1990
|
+
static triggerProcessUsers(
|
|
1991
|
+
payload: MemoryExtractionPayloadInput,
|
|
1992
|
+
options?: { extraHeaders?: Record<string, string> },
|
|
1993
|
+
) {
|
|
1853
1994
|
if (!payload.baseUrl) {
|
|
1854
1995
|
throw new Error('Missing baseUrl for workflow trigger');
|
|
1855
1996
|
}
|
|
@@ -1858,7 +1999,10 @@ export class MemoryExtractionWorkflowService {
|
|
|
1858
1999
|
return this.getClient().trigger({ body: payload, headers: options?.extraHeaders, url });
|
|
1859
2000
|
}
|
|
1860
2001
|
|
|
1861
|
-
static triggerProcessUserTopics(
|
|
2002
|
+
static triggerProcessUserTopics(
|
|
2003
|
+
payload: UserTopicWorkflowPayload,
|
|
2004
|
+
options?: { extraHeaders?: Record<string, string> },
|
|
2005
|
+
) {
|
|
1862
2006
|
if (!payload.baseUrl) {
|
|
1863
2007
|
throw new Error('Missing baseUrl for workflow trigger');
|
|
1864
2008
|
}
|
|
@@ -1867,7 +2011,10 @@ export class MemoryExtractionWorkflowService {
|
|
|
1867
2011
|
return this.getClient().trigger({ body: payload, headers: options?.extraHeaders, url });
|
|
1868
2012
|
}
|
|
1869
2013
|
|
|
1870
|
-
static triggerProcessTopics(
|
|
2014
|
+
static triggerProcessTopics(
|
|
2015
|
+
payload: MemoryExtractionPayloadInput,
|
|
2016
|
+
options?: { extraHeaders?: Record<string, string> },
|
|
2017
|
+
) {
|
|
1871
2018
|
if (!payload.baseUrl) {
|
|
1872
2019
|
throw new Error('Missing baseUrl for workflow trigger');
|
|
1873
2020
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CSSProperties } from 'react';
|
|
2
|
+
|
|
3
|
+
export const StyleSheet = {
|
|
4
|
+
compose: (...styles: Array<CSSProperties | undefined | null | false>): CSSProperties => {
|
|
5
|
+
return Object.assign({}, ...styles.filter(Boolean));
|
|
6
|
+
},
|
|
7
|
+
create: (styles: Record<string, CSSProperties>) => {
|
|
8
|
+
return styles;
|
|
9
|
+
},
|
|
10
|
+
};
|