mirror of
https://github.com/lobehub/lobehub.git
synced 2026-03-27 13:29:15 +07:00
✨ feat(database): added user memory activity (#11680)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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");
|
||||
10656
packages/database/migrations/meta/0070_snapshot.json
Normal file
10656
packages/database/migrations/meta/0070_snapshot.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user