aboutsummaryrefslogtreecommitdiff
path: root/packages/web/src/server
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-02-04 01:11:12 -0800
committerFuwn <[email protected]>2026-02-04 01:29:40 -0800
commite0beeab2bcf6edd4681912e5cddf2d9ee7eb041d (patch)
tree588b8abb71b91aef5e6e7691319468b513929a7d /packages/web/src/server
parentfeat(web): Enhance memory dashboard with projects and search (diff)
downloadarchived-imemio-e0beeab2bcf6edd4681912e5cddf2d9ee7eb041d.tar.xz
archived-imemio-e0beeab2bcf6edd4681912e5cddf2d9ee7eb041d.zip
feat(web): Add embedding settings with re-embed functionality
Diffstat (limited to 'packages/web/src/server')
-rw-r--r--packages/web/src/server/api/routers/memory.ts44
1 files changed, 42 insertions, 2 deletions
diff --git a/packages/web/src/server/api/routers/memory.ts b/packages/web/src/server/api/routers/memory.ts
index eebe0f8..d523b4e 100644
--- a/packages/web/src/server/api/routers/memory.ts
+++ b/packages/web/src/server/api/routers/memory.ts
@@ -179,8 +179,7 @@ export const memoryRouter = createTRPCRouter({
if (!embeddingService) {
throw new TRPCError({
code: "PRECONDITION_FAILED",
- message:
- "Search is not available. Configure OPENAI_API_KEY to enable semantic search.",
+ message: "Search requires OPENAI_API_KEY to be configured.",
});
}
@@ -194,6 +193,7 @@ export const memoryRouter = createTRPCRouter({
const searchResults = await memoryStore.search(queryEmbedding, {
projectId: input.projectId,
limit: input.limit,
+ threshold: 0.3,
});
const projectsResult = await projectStore.list();
const projects = projectsResult.success ? projectsResult.value : [];
@@ -205,4 +205,44 @@ export const memoryRouter = createTRPCRouter({
return { results: resultsWithProjects, projects };
}),
+
+ embeddingInfo: protectedProcedure.query(() => {
+ const embeddingService = getEmbeddingService();
+
+ return { available: embeddingService !== null };
+ }),
+
+ reembed: protectedProcedure.mutation(async ({ ctx: context }) => {
+ const embeddingService = getEmbeddingService();
+
+ if (!embeddingService) {
+ throw new TRPCError({
+ code: "PRECONDITION_FAILED",
+ message: "Search is not configured on this server.",
+ });
+ }
+
+ const supabaseClient = await createClient();
+ const memoryStore = new SupabaseStore(supabaseClient, context.user.id);
+ const memories = await memoryStore.list();
+ let updated = 0;
+
+ for (const memory of memories) {
+ const embedding = await embeddingService.generate(memory.content);
+ const { error } = await supabaseClient
+ .from("memories")
+ .update({
+ embedding: JSON.stringify(embedding),
+ embedding_dimensions: embeddingService.dimensions,
+ })
+ .eq("id", memory.id)
+ .eq("user_id", context.user.id);
+
+ if (!error) {
+ updated++;
+ }
+ }
+
+ return { total: memories.length, updated };
+ }),
});