feat(database): added user memory activity (#11680)

This commit is contained in:
Neko
2026-01-22 10:24:50 +08:00
committed by GitHub
parent 12b1d56e33
commit 0160fbde83
5 changed files with 10804 additions and 1 deletions

View File

@@ -1235,6 +1235,40 @@ table user_memories {
}
}
table user_memories_activities {
id varchar(255) [pk, not null]
user_id text
user_memory_id varchar(255)
metadata jsonb
tags text[]
type varchar(255) [not null]
status varchar(255) [not null, default: 'pending']
timezone varchar(255)
starts_at "timestamp with time zone"
ends_at "timestamp with time zone"
associated_objects jsonb
associated_subjects jsonb
associated_locations jsonb
notes text
narrative text
narrative_vector vector(1024)
feedback text
feedback_vector vector(1024)
captured_at "timestamp with time zone" [not null, default: `now()`]
accessed_at "timestamp with time zone" [not null, default: `now()`]
created_at "timestamp with time zone" [not null, default: `now()`]
updated_at "timestamp with time zone" [not null, default: `now()`]
indexes {
narrative_vector [name: 'user_memories_activities_narrative_vector_index']
feedback_vector [name: 'user_memories_activities_feedback_vector_index']
type [name: 'user_memories_activities_type_index']
user_id [name: 'user_memories_activities_user_id_index']
user_memory_id [name: 'user_memories_activities_user_memory_id_index']
status [name: 'user_memories_activities_status_index']
}
}
table user_memories_contexts {
id varchar(255) [pk, not null]
user_id text

View File

@@ -0,0 +1,35 @@
CREATE TABLE IF NOT EXISTS "user_memories_activities" (
"id" varchar(255) PRIMARY KEY NOT NULL,
"user_id" text,
"user_memory_id" varchar(255),
"metadata" jsonb,
"tags" text[],
"type" varchar(255) NOT NULL,
"status" varchar(255) DEFAULT 'pending' NOT NULL,
"timezone" varchar(255),
"starts_at" timestamp with time zone,
"ends_at" timestamp with time zone,
"associated_objects" jsonb,
"associated_subjects" jsonb,
"associated_locations" jsonb,
"notes" text,
"narrative" text,
"narrative_vector" vector(1024),
"feedback" text,
"feedback_vector" vector(1024),
"captured_at" timestamp with time zone DEFAULT now() NOT NULL,
"accessed_at" timestamp with time zone DEFAULT now() NOT NULL,
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
);
--> statement-breakpoint
ALTER TABLE "user_memories_activities" DROP CONSTRAINT IF EXISTS "user_memories_activities_user_id_users_id_fk";--> statement-breakpoint
ALTER TABLE "user_memories_activities" ADD CONSTRAINT "user_memories_activities_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "user_memories_activities" DROP CONSTRAINT IF EXISTS "user_memories_activities_user_memory_id_user_memories_id_fk";--> statement-breakpoint
ALTER TABLE "user_memories_activities" ADD CONSTRAINT "user_memories_activities_user_memory_id_user_memories_id_fk" FOREIGN KEY ("user_memory_id") REFERENCES "public"."user_memories"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "user_memories_activities_narrative_vector_index" ON "user_memories_activities" USING hnsw ("narrative_vector" vector_cosine_ops);--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "user_memories_activities_feedback_vector_index" ON "user_memories_activities" USING hnsw ("feedback_vector" vector_cosine_ops);--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "user_memories_activities_type_index" ON "user_memories_activities" USING btree ("type");--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "user_memories_activities_user_id_index" ON "user_memories_activities" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "user_memories_activities_user_memory_id_index" ON "user_memories_activities" USING btree ("user_memory_id");--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "user_memories_activities_status_index" ON "user_memories_activities" USING btree ("status");

File diff suppressed because it is too large Load Diff

View File

@@ -490,7 +490,14 @@
"when": 1768303764632,
"tag": "0069_add_topic_shares_table",
"breakpoints": true
},
{
"idx": 70,
"version": "7",
"when": 1768999498635,
"tag": "0070_add_user_memory_activities",
"breakpoints": true
}
],
"version": "6"
}
}

View File

@@ -124,6 +124,70 @@ export const userMemoriesPreferences = pgTable(
],
);
export const userMemoriesActivities = pgTable(
'user_memories_activities',
{
id: varchar255('id')
.$defaultFn(() => idGenerator('memory'))
.primaryKey(),
userId: text('user_id').references(() => users.id, { onDelete: 'cascade' }),
userMemoryId: varchar255('user_memory_id').references(() => userMemories.id, {
onDelete: 'cascade',
}),
metadata: jsonb('metadata').$type<Record<string, unknown>>(),
tags: text('tags').array(),
type: varchar255('type').notNull(),
status: varchar255('status').notNull().default('pending'),
timezone: varchar255('timezone'),
startsAt: timestamptz('starts_at'),
endsAt: timestamptz('ends_at'),
associatedObjects: jsonb('associated_objects').$type<{
extra?: Record<string, unknown>,
name?: string,
type?: string
}[]>(),
associatedSubjects: jsonb('associated_subjects').$type<{
extra?: Record<string, unknown>,
name?: string,
type?: string
}[]>(),
associatedLocations: jsonb('associated_locations').$type<{
address?: string;
name?: string;
tags?: string[];
type?: string;
}[]>(),
notes: text('notes'),
narrative: text('narrative'),
narrativeVector: vector('narrative_vector', { dimensions: 1024 }),
feedback: text('feedback'),
feedbackVector: vector('feedback_vector', { dimensions: 1024 }),
capturedAt: timestamptz('captured_at').notNull().defaultNow(),
...timestamps,
},
(table) => [
index('user_memories_activities_narrative_vector_index').using(
'hnsw',
table.narrativeVector.op('vector_cosine_ops'),
),
index('user_memories_activities_feedback_vector_index').using(
'hnsw',
table.feedbackVector.op('vector_cosine_ops'),
),
index('user_memories_activities_type_index').on(table.type),
index('user_memories_activities_user_id_index').on(table.userId),
index('user_memories_activities_user_memory_id_index').on(table.userMemoryId),
index('user_memories_activities_status_index').on(table.status),
],
);
export const userMemoriesIdentities = pgTable(
'user_memories_identities',
{
@@ -242,3 +306,10 @@ export type UserMemoryExperiencesWithoutVectors = Omit<
'situationVector' | 'actionVector' | 'keyLearningVector'
>;
export type NewUserMemoryExperience = typeof userMemoriesExperiences.$inferInsert;
export type UserMemoryActivity = typeof userMemoriesActivities.$inferSelect;
export type UserMemoryActivitiesWithoutVectors = Omit<
UserMemoryActivity,
'narrativeVector' | 'feedbackVector'
>;
export type NewUserMemoryActivity = typeof userMemoriesActivities.$inferInsert;