clhq-postgres-module 1.1.0-alpha.105 → 1.1.0-alpha.107

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.
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ProjectMetadata = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ const editor_project_entity_1 = require("./editor-project.entity");
15
+ const user_entity_1 = require("./user.entity");
16
+ const workspace_entity_1 = require("./workspace.entity");
17
+ let ProjectMetadata = class ProjectMetadata {
18
+ };
19
+ exports.ProjectMetadata = ProjectMetadata;
20
+ __decorate([
21
+ (0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
22
+ __metadata("design:type", String)
23
+ ], ProjectMetadata.prototype, "id", void 0);
24
+ __decorate([
25
+ (0, typeorm_1.Column)({ name: 'project_id', type: 'varchar', length: 255 }),
26
+ __metadata("design:type", String)
27
+ ], ProjectMetadata.prototype, "projectId", void 0);
28
+ __decorate([
29
+ (0, typeorm_1.ManyToOne)(() => editor_project_entity_1.EditorProject),
30
+ (0, typeorm_1.JoinColumn)({ name: 'project_id' }),
31
+ __metadata("design:type", editor_project_entity_1.EditorProject)
32
+ ], ProjectMetadata.prototype, "project", void 0);
33
+ __decorate([
34
+ (0, typeorm_1.Column)({ name: 'user_id', type: 'uuid' }),
35
+ __metadata("design:type", String)
36
+ ], ProjectMetadata.prototype, "userId", void 0);
37
+ __decorate([
38
+ (0, typeorm_1.ManyToOne)(() => user_entity_1.User),
39
+ (0, typeorm_1.JoinColumn)({ name: 'user_id' }),
40
+ __metadata("design:type", user_entity_1.User)
41
+ ], ProjectMetadata.prototype, "user", void 0);
42
+ __decorate([
43
+ (0, typeorm_1.Column)({ name: 'workspace_id', type: 'uuid' }),
44
+ __metadata("design:type", String)
45
+ ], ProjectMetadata.prototype, "workspaceId", void 0);
46
+ __decorate([
47
+ (0, typeorm_1.ManyToOne)(() => workspace_entity_1.Workspace),
48
+ (0, typeorm_1.JoinColumn)({ name: 'workspace_id' }),
49
+ __metadata("design:type", workspace_entity_1.Workspace)
50
+ ], ProjectMetadata.prototype, "workspace", void 0);
51
+ __decorate([
52
+ (0, typeorm_1.Column)({ name: 'project_type', type: 'varchar', length: 100, nullable: true }),
53
+ __metadata("design:type", String)
54
+ ], ProjectMetadata.prototype, "projectType", void 0);
55
+ __decorate([
56
+ (0, typeorm_1.Column)({ name: 'target_platform', type: 'varchar', length: 100, nullable: true }),
57
+ __metadata("design:type", String)
58
+ ], ProjectMetadata.prototype, "targetPlatform", void 0);
59
+ __decorate([
60
+ (0, typeorm_1.Column)({ name: 'target_duration_ms', type: 'integer', nullable: true }),
61
+ __metadata("design:type", Number)
62
+ ], ProjectMetadata.prototype, "targetDurationMs", void 0);
63
+ __decorate([
64
+ (0, typeorm_1.Column)({ type: 'varchar', length: 100, nullable: true }),
65
+ __metadata("design:type", String)
66
+ ], ProjectMetadata.prototype, "mood", void 0);
67
+ __decorate([
68
+ (0, typeorm_1.Column)({ type: 'varchar', length: 100, nullable: true }),
69
+ __metadata("design:type", String)
70
+ ], ProjectMetadata.prototype, "style", void 0);
71
+ __decorate([
72
+ (0, typeorm_1.Column)({ type: 'varchar', length: 100, nullable: true }),
73
+ __metadata("design:type", String)
74
+ ], ProjectMetadata.prototype, "genre", void 0);
75
+ __decorate([
76
+ (0, typeorm_1.Column)({ name: 'color_palette', type: 'jsonb', nullable: true }),
77
+ __metadata("design:type", Array)
78
+ ], ProjectMetadata.prototype, "colorPalette", void 0);
79
+ __decorate([
80
+ (0, typeorm_1.Column)({ name: 'brand_guidelines', type: 'jsonb', nullable: true }),
81
+ __metadata("design:type", Object)
82
+ ], ProjectMetadata.prototype, "brandGuidelines", void 0);
83
+ __decorate([
84
+ (0, typeorm_1.Column)({ type: 'jsonb', nullable: true }),
85
+ __metadata("design:type", Object)
86
+ ], ProjectMetadata.prototype, "composition", void 0);
87
+ __decorate([
88
+ (0, typeorm_1.Column)({ name: 'style_fingerprint', type: 'jsonb', nullable: true }),
89
+ __metadata("design:type", Object)
90
+ ], ProjectMetadata.prototype, "styleFingerprint", void 0);
91
+ __decorate([
92
+ (0, typeorm_1.Column)({ name: 'edit_sessions_count', type: 'integer', default: 0 }),
93
+ __metadata("design:type", Number)
94
+ ], ProjectMetadata.prototype, "editSessionsCount", void 0);
95
+ __decorate([
96
+ (0, typeorm_1.Column)({ name: 'total_edit_time_ms', type: 'bigint', default: 0 }),
97
+ __metadata("design:type", Number)
98
+ ], ProjectMetadata.prototype, "totalEditTimeMs", void 0);
99
+ __decorate([
100
+ (0, typeorm_1.Column)({ name: 'assets_used', type: 'text', array: true, nullable: true }),
101
+ __metadata("design:type", Array)
102
+ ], ProjectMetadata.prototype, "assetsUsed", void 0);
103
+ __decorate([
104
+ (0, typeorm_1.Column)({ name: 'effects_used', type: 'jsonb', nullable: true }),
105
+ __metadata("design:type", Object)
106
+ ], ProjectMetadata.prototype, "effectsUsed", void 0);
107
+ __decorate([
108
+ (0, typeorm_1.Column)({ name: 'export_history', type: 'jsonb', nullable: true }),
109
+ __metadata("design:type", Array)
110
+ ], ProjectMetadata.prototype, "exportHistory", void 0);
111
+ __decorate([
112
+ (0, typeorm_1.Column)({ name: 'ai_suggestions_applied', type: 'jsonb', nullable: true }),
113
+ __metadata("design:type", Array)
114
+ ], ProjectMetadata.prototype, "aiSuggestionsApplied", void 0);
115
+ __decorate([
116
+ (0, typeorm_1.Column)({ name: 'generated_content', type: 'jsonb', nullable: true }),
117
+ __metadata("design:type", Array)
118
+ ], ProjectMetadata.prototype, "generatedContent", void 0);
119
+ __decorate([
120
+ (0, typeorm_1.Column)({ name: 'project_embedding', type: 'jsonb', nullable: true }),
121
+ __metadata("design:type", Array)
122
+ ], ProjectMetadata.prototype, "projectEmbedding", void 0);
123
+ __decorate([
124
+ (0, typeorm_1.Column)({ name: 'embedding_generated_at', type: 'timestamp', nullable: true }),
125
+ __metadata("design:type", Date)
126
+ ], ProjectMetadata.prototype, "embeddingGeneratedAt", void 0);
127
+ __decorate([
128
+ (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }),
129
+ __metadata("design:type", Date)
130
+ ], ProjectMetadata.prototype, "createdAt", void 0);
131
+ __decorate([
132
+ (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }),
133
+ __metadata("design:type", Date)
134
+ ], ProjectMetadata.prototype, "updatedAt", void 0);
135
+ exports.ProjectMetadata = ProjectMetadata = __decorate([
136
+ (0, typeorm_1.Entity)('project_metadata'),
137
+ (0, typeorm_1.Index)(['projectId'], { unique: true }),
138
+ (0, typeorm_1.Index)(['userId']),
139
+ (0, typeorm_1.Index)(['workspaceId']),
140
+ (0, typeorm_1.Index)(['projectType'])
141
+ ], ProjectMetadata);
@@ -0,0 +1,59 @@
1
+ import { User } from './user.entity';
2
+ export declare class UserContext {
3
+ id: string;
4
+ userId: string;
5
+ user: User;
6
+ preferredStyles: string[];
7
+ preferredGenres: string[];
8
+ preferredTransitions: string[];
9
+ preferredEffects: string[];
10
+ preferredFonts: string[];
11
+ defaultAspectRatio: string;
12
+ defaultResolution: string;
13
+ defaultFps: number;
14
+ brandColors: {
15
+ primary?: string;
16
+ secondary?: string[];
17
+ accent?: string;
18
+ };
19
+ brandFonts: {
20
+ heading?: string;
21
+ body?: string;
22
+ };
23
+ brandLogoAssetIds: string[];
24
+ brandWatermarkAssetId: string;
25
+ avgProjectDurationMs: number;
26
+ avgSessionLengthMs: number;
27
+ totalProjectsCount: number;
28
+ completedProjectsCount: number;
29
+ totalEditTimeMs: number;
30
+ mostUsedEffects: Record<string, number>;
31
+ mostUsedTransitions: Record<string, number>;
32
+ editingPatterns: {
33
+ avgClipDuration?: number;
34
+ avgTransitionsPerProject?: number;
35
+ avgTextElementsPerProject?: number;
36
+ preferredPacing?: 'fast' | 'medium' | 'slow';
37
+ musicUsageRate?: number;
38
+ captionUsageRate?: number;
39
+ };
40
+ skillLevel: 'beginner' | 'intermediate' | 'advanced' | 'expert';
41
+ activityHeatmap: {
42
+ peakHours?: number[];
43
+ peakDays?: number[];
44
+ };
45
+ aiPromptsCount: number;
46
+ aiSuggestionsAccepted: number;
47
+ aiSuggestionsRejected: number;
48
+ preferredAiModels: string[];
49
+ recentPrompts: Array<{
50
+ prompt: string;
51
+ timestamp: string;
52
+ successful: boolean;
53
+ }>;
54
+ userEmbedding: number[];
55
+ embeddingGeneratedAt: Date;
56
+ lastAggregatedAt: Date;
57
+ createdAt: Date;
58
+ updatedAt: Date;
59
+ }
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.UserContext = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ const user_entity_1 = require("./user.entity");
15
+ let UserContext = class UserContext {
16
+ };
17
+ exports.UserContext = UserContext;
18
+ __decorate([
19
+ (0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
20
+ __metadata("design:type", String)
21
+ ], UserContext.prototype, "id", void 0);
22
+ __decorate([
23
+ (0, typeorm_1.Column)({ name: 'user_id', type: 'uuid' }),
24
+ __metadata("design:type", String)
25
+ ], UserContext.prototype, "userId", void 0);
26
+ __decorate([
27
+ (0, typeorm_1.OneToOne)(() => user_entity_1.User),
28
+ (0, typeorm_1.JoinColumn)({ name: 'user_id' }),
29
+ __metadata("design:type", user_entity_1.User)
30
+ ], UserContext.prototype, "user", void 0);
31
+ __decorate([
32
+ (0, typeorm_1.Column)({ name: 'preferred_styles', type: 'text', array: true, nullable: true }),
33
+ __metadata("design:type", Array)
34
+ ], UserContext.prototype, "preferredStyles", void 0);
35
+ __decorate([
36
+ (0, typeorm_1.Column)({ name: 'preferred_genres', type: 'text', array: true, nullable: true }),
37
+ __metadata("design:type", Array)
38
+ ], UserContext.prototype, "preferredGenres", void 0);
39
+ __decorate([
40
+ (0, typeorm_1.Column)({ name: 'preferred_transitions', type: 'text', array: true, nullable: true }),
41
+ __metadata("design:type", Array)
42
+ ], UserContext.prototype, "preferredTransitions", void 0);
43
+ __decorate([
44
+ (0, typeorm_1.Column)({ name: 'preferred_effects', type: 'text', array: true, nullable: true }),
45
+ __metadata("design:type", Array)
46
+ ], UserContext.prototype, "preferredEffects", void 0);
47
+ __decorate([
48
+ (0, typeorm_1.Column)({ name: 'preferred_fonts', type: 'text', array: true, nullable: true }),
49
+ __metadata("design:type", Array)
50
+ ], UserContext.prototype, "preferredFonts", void 0);
51
+ __decorate([
52
+ (0, typeorm_1.Column)({ name: 'default_aspect_ratio', type: 'varchar', length: 20, nullable: true }),
53
+ __metadata("design:type", String)
54
+ ], UserContext.prototype, "defaultAspectRatio", void 0);
55
+ __decorate([
56
+ (0, typeorm_1.Column)({ name: 'default_resolution', type: 'varchar', length: 20, nullable: true }),
57
+ __metadata("design:type", String)
58
+ ], UserContext.prototype, "defaultResolution", void 0);
59
+ __decorate([
60
+ (0, typeorm_1.Column)({ name: 'default_fps', type: 'integer', nullable: true }),
61
+ __metadata("design:type", Number)
62
+ ], UserContext.prototype, "defaultFps", void 0);
63
+ __decorate([
64
+ (0, typeorm_1.Column)({ name: 'brand_colors', type: 'jsonb', nullable: true }),
65
+ __metadata("design:type", Object)
66
+ ], UserContext.prototype, "brandColors", void 0);
67
+ __decorate([
68
+ (0, typeorm_1.Column)({ name: 'brand_fonts', type: 'jsonb', nullable: true }),
69
+ __metadata("design:type", Object)
70
+ ], UserContext.prototype, "brandFonts", void 0);
71
+ __decorate([
72
+ (0, typeorm_1.Column)({ name: 'brand_logo_asset_ids', type: 'text', array: true, nullable: true }),
73
+ __metadata("design:type", Array)
74
+ ], UserContext.prototype, "brandLogoAssetIds", void 0);
75
+ __decorate([
76
+ (0, typeorm_1.Column)({ name: 'brand_watermark_asset_id', type: 'uuid', nullable: true }),
77
+ __metadata("design:type", String)
78
+ ], UserContext.prototype, "brandWatermarkAssetId", void 0);
79
+ __decorate([
80
+ (0, typeorm_1.Column)({ name: 'avg_project_duration_ms', type: 'integer', nullable: true }),
81
+ __metadata("design:type", Number)
82
+ ], UserContext.prototype, "avgProjectDurationMs", void 0);
83
+ __decorate([
84
+ (0, typeorm_1.Column)({ name: 'avg_session_length_ms', type: 'integer', nullable: true }),
85
+ __metadata("design:type", Number)
86
+ ], UserContext.prototype, "avgSessionLengthMs", void 0);
87
+ __decorate([
88
+ (0, typeorm_1.Column)({ name: 'total_projects_count', type: 'integer', default: 0 }),
89
+ __metadata("design:type", Number)
90
+ ], UserContext.prototype, "totalProjectsCount", void 0);
91
+ __decorate([
92
+ (0, typeorm_1.Column)({ name: 'completed_projects_count', type: 'integer', default: 0 }),
93
+ __metadata("design:type", Number)
94
+ ], UserContext.prototype, "completedProjectsCount", void 0);
95
+ __decorate([
96
+ (0, typeorm_1.Column)({ name: 'total_edit_time_ms', type: 'bigint', default: 0 }),
97
+ __metadata("design:type", Number)
98
+ ], UserContext.prototype, "totalEditTimeMs", void 0);
99
+ __decorate([
100
+ (0, typeorm_1.Column)({ name: 'most_used_effects', type: 'jsonb', nullable: true }),
101
+ __metadata("design:type", Object)
102
+ ], UserContext.prototype, "mostUsedEffects", void 0);
103
+ __decorate([
104
+ (0, typeorm_1.Column)({ name: 'most_used_transitions', type: 'jsonb', nullable: true }),
105
+ __metadata("design:type", Object)
106
+ ], UserContext.prototype, "mostUsedTransitions", void 0);
107
+ __decorate([
108
+ (0, typeorm_1.Column)({ name: 'editing_patterns', type: 'jsonb', nullable: true }),
109
+ __metadata("design:type", Object)
110
+ ], UserContext.prototype, "editingPatterns", void 0);
111
+ __decorate([
112
+ (0, typeorm_1.Column)({ name: 'skill_level', type: 'varchar', length: 50, nullable: true }),
113
+ __metadata("design:type", String)
114
+ ], UserContext.prototype, "skillLevel", void 0);
115
+ __decorate([
116
+ (0, typeorm_1.Column)({ name: 'activity_heatmap', type: 'jsonb', nullable: true }),
117
+ __metadata("design:type", Object)
118
+ ], UserContext.prototype, "activityHeatmap", void 0);
119
+ __decorate([
120
+ (0, typeorm_1.Column)({ name: 'ai_prompts_count', type: 'integer', default: 0 }),
121
+ __metadata("design:type", Number)
122
+ ], UserContext.prototype, "aiPromptsCount", void 0);
123
+ __decorate([
124
+ (0, typeorm_1.Column)({ name: 'ai_suggestions_accepted', type: 'integer', default: 0 }),
125
+ __metadata("design:type", Number)
126
+ ], UserContext.prototype, "aiSuggestionsAccepted", void 0);
127
+ __decorate([
128
+ (0, typeorm_1.Column)({ name: 'ai_suggestions_rejected', type: 'integer', default: 0 }),
129
+ __metadata("design:type", Number)
130
+ ], UserContext.prototype, "aiSuggestionsRejected", void 0);
131
+ __decorate([
132
+ (0, typeorm_1.Column)({ name: 'preferred_ai_models', type: 'text', array: true, nullable: true }),
133
+ __metadata("design:type", Array)
134
+ ], UserContext.prototype, "preferredAiModels", void 0);
135
+ __decorate([
136
+ (0, typeorm_1.Column)({ name: 'recent_prompts', type: 'jsonb', nullable: true }),
137
+ __metadata("design:type", Array)
138
+ ], UserContext.prototype, "recentPrompts", void 0);
139
+ __decorate([
140
+ (0, typeorm_1.Column)({ name: 'user_embedding', type: 'jsonb', nullable: true }),
141
+ __metadata("design:type", Array)
142
+ ], UserContext.prototype, "userEmbedding", void 0);
143
+ __decorate([
144
+ (0, typeorm_1.Column)({ name: 'embedding_generated_at', type: 'timestamp', nullable: true }),
145
+ __metadata("design:type", Date)
146
+ ], UserContext.prototype, "embeddingGeneratedAt", void 0);
147
+ __decorate([
148
+ (0, typeorm_1.Column)({ name: 'last_aggregated_at', type: 'timestamp', nullable: true }),
149
+ __metadata("design:type", Date)
150
+ ], UserContext.prototype, "lastAggregatedAt", void 0);
151
+ __decorate([
152
+ (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }),
153
+ __metadata("design:type", Date)
154
+ ], UserContext.prototype, "createdAt", void 0);
155
+ __decorate([
156
+ (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }),
157
+ __metadata("design:type", Date)
158
+ ], UserContext.prototype, "updatedAt", void 0);
159
+ exports.UserContext = UserContext = __decorate([
160
+ (0, typeorm_1.Entity)('user_context'),
161
+ (0, typeorm_1.Index)(['userId'], { unique: true })
162
+ ], UserContext);
@@ -0,0 +1,38 @@
1
+ import { Repository } from 'typeorm';
2
+ import { BaseRepository } from './base.repository';
3
+ import { AiEmbedding, EmbeddingEntityType, EmbeddingType } from '../entities/ai-embedding.entity';
4
+ export declare class AiEmbeddingRepository extends BaseRepository<AiEmbedding> {
5
+ private readonly aiEmbeddingRepository;
6
+ constructor(aiEmbeddingRepository: Repository<AiEmbedding>);
7
+ findByEntity(entityType: EmbeddingEntityType, entityId: string): Promise<AiEmbedding | null>;
8
+ findByEntityType(entityType: EmbeddingEntityType, userId?: string): Promise<AiEmbedding[]>;
9
+ findByUserId(userId: string): Promise<AiEmbedding[]>;
10
+ findByWorkspaceId(workspaceId: string): Promise<AiEmbedding[]>;
11
+ upsertEmbedding(data: {
12
+ entityType: EmbeddingEntityType;
13
+ entityId: string;
14
+ userId?: string;
15
+ workspaceId?: string;
16
+ embeddingType?: EmbeddingType;
17
+ embedding: number[];
18
+ sourceText?: string;
19
+ modelId: string;
20
+ modelVersion?: string;
21
+ metadata?: AiEmbedding['metadata'];
22
+ }): Promise<AiEmbedding>;
23
+ deleteByEntity(entityType: EmbeddingEntityType, entityId: string): Promise<boolean>;
24
+ findSimilar(embedding: number[], entityType: EmbeddingEntityType, userId?: string, limit?: number, excludeEntityId?: string): Promise<Array<AiEmbedding & {
25
+ similarity: number;
26
+ }>>;
27
+ batchFindSimilar(queries: Array<{
28
+ embedding: number[];
29
+ entityType: EmbeddingEntityType;
30
+ userId?: string;
31
+ limit?: number;
32
+ }>): Promise<Array<Array<AiEmbedding & {
33
+ similarity: number;
34
+ }>>>;
35
+ getCountsByEntityType(userId?: string): Promise<Record<string, number>>;
36
+ findByModelVersion(modelId: string, modelVersion?: string): Promise<AiEmbedding[]>;
37
+ findOutdatedEmbeddings(modelId: string, currentVersion: string, limit?: number): Promise<AiEmbedding[]>;
38
+ }
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.AiEmbeddingRepository = void 0;
16
+ const typeorm_1 = require("typeorm");
17
+ const common_1 = require("@nestjs/common");
18
+ const typeorm_2 = require("@nestjs/typeorm");
19
+ const base_repository_1 = require("./base.repository");
20
+ const ai_embedding_entity_1 = require("../entities/ai-embedding.entity");
21
+ let AiEmbeddingRepository = class AiEmbeddingRepository extends base_repository_1.BaseRepository {
22
+ constructor(aiEmbeddingRepository) {
23
+ super(aiEmbeddingRepository);
24
+ this.aiEmbeddingRepository = aiEmbeddingRepository;
25
+ }
26
+ async findByEntity(entityType, entityId) {
27
+ return this.aiEmbeddingRepository.findOne({
28
+ where: { entityType, entityId },
29
+ });
30
+ }
31
+ async findByEntityType(entityType, userId) {
32
+ const where = { entityType };
33
+ if (userId) {
34
+ where.userId = userId;
35
+ }
36
+ return this.aiEmbeddingRepository.find({
37
+ where,
38
+ order: { createdAt: 'DESC' },
39
+ });
40
+ }
41
+ async findByUserId(userId) {
42
+ return this.aiEmbeddingRepository.find({
43
+ where: { userId },
44
+ order: { createdAt: 'DESC' },
45
+ });
46
+ }
47
+ async findByWorkspaceId(workspaceId) {
48
+ return this.aiEmbeddingRepository.find({
49
+ where: { workspaceId },
50
+ order: { createdAt: 'DESC' },
51
+ });
52
+ }
53
+ async upsertEmbedding(data) {
54
+ const existing = await this.findByEntity(data.entityType, data.entityId);
55
+ if (existing) {
56
+ await this.aiEmbeddingRepository.update(existing.id, {
57
+ embedding: data.embedding,
58
+ embeddingType: data.embeddingType || existing.embeddingType,
59
+ dimension: data.embedding.length,
60
+ sourceText: data.sourceText,
61
+ modelId: data.modelId,
62
+ modelVersion: data.modelVersion,
63
+ metadata: data.metadata,
64
+ });
65
+ return (await this.findById(existing.id));
66
+ }
67
+ return this.create({
68
+ ...data,
69
+ dimension: data.embedding.length,
70
+ });
71
+ }
72
+ async deleteByEntity(entityType, entityId) {
73
+ const result = await this.aiEmbeddingRepository.delete({
74
+ entityType,
75
+ entityId,
76
+ });
77
+ return (result.affected ?? 0) > 0;
78
+ }
79
+ async findSimilar(embedding, entityType, userId, limit = 20, excludeEntityId) {
80
+ const embeddingStr = JSON.stringify(embedding);
81
+ const dimension = embedding.length;
82
+ let query = this.aiEmbeddingRepository
83
+ .createQueryBuilder('ae')
84
+ .select('ae.*')
85
+ .addSelect(`1 - (ae.embedding::vector(${dimension}) <=> '${embeddingStr}'::vector(${dimension}))`, 'similarity')
86
+ .where('ae.entity_type = :entityType', { entityType })
87
+ .andWhere('ae.dimension = :dimension', { dimension });
88
+ if (userId) {
89
+ query = query.andWhere('ae.user_id = :userId', { userId });
90
+ }
91
+ if (excludeEntityId) {
92
+ query = query.andWhere('ae.entity_id != :excludeEntityId', {
93
+ excludeEntityId,
94
+ });
95
+ }
96
+ const results = await query
97
+ .orderBy('similarity', 'DESC')
98
+ .limit(limit)
99
+ .getRawMany();
100
+ return results;
101
+ }
102
+ async batchFindSimilar(queries) {
103
+ const results = await Promise.all(queries.map((query) => this.findSimilar(query.embedding, query.entityType, query.userId, query.limit || 10)));
104
+ return results;
105
+ }
106
+ async getCountsByEntityType(userId) {
107
+ const queryBuilder = this.aiEmbeddingRepository
108
+ .createQueryBuilder('ae')
109
+ .select('ae.entity_type', 'entityType')
110
+ .addSelect('COUNT(*)', 'count')
111
+ .groupBy('ae.entity_type');
112
+ if (userId) {
113
+ queryBuilder.where('ae.user_id = :userId', { userId });
114
+ }
115
+ const results = await queryBuilder.getRawMany();
116
+ return results.reduce((acc, row) => {
117
+ acc[row.entityType] = parseInt(row.count, 10);
118
+ return acc;
119
+ }, {});
120
+ }
121
+ async findByModelVersion(modelId, modelVersion) {
122
+ const where = { modelId };
123
+ if (modelVersion) {
124
+ where.modelVersion = modelVersion;
125
+ }
126
+ return this.aiEmbeddingRepository.find({
127
+ where,
128
+ order: { createdAt: 'ASC' },
129
+ });
130
+ }
131
+ async findOutdatedEmbeddings(modelId, currentVersion, limit = 100) {
132
+ return this.aiEmbeddingRepository
133
+ .createQueryBuilder('ae')
134
+ .where('ae.model_id = :modelId', { modelId })
135
+ .andWhere('(ae.model_version IS NULL OR ae.model_version != :currentVersion)', { currentVersion })
136
+ .orderBy('ae.created_at', 'ASC')
137
+ .limit(limit)
138
+ .getMany();
139
+ }
140
+ };
141
+ exports.AiEmbeddingRepository = AiEmbeddingRepository;
142
+ exports.AiEmbeddingRepository = AiEmbeddingRepository = __decorate([
143
+ (0, common_1.Injectable)(),
144
+ __param(0, (0, typeorm_2.InjectRepository)(ai_embedding_entity_1.AiEmbedding)),
145
+ __metadata("design:paramtypes", [typeorm_1.Repository])
146
+ ], AiEmbeddingRepository);
@@ -0,0 +1,39 @@
1
+ import { Repository } from 'typeorm';
2
+ import { BaseRepository } from './base.repository';
3
+ import { AssetMetadata, AssetMetadataStatus } from '../entities/asset-metadata.entity';
4
+ export declare class AssetMetadataRepository extends BaseRepository<AssetMetadata> {
5
+ private readonly assetMetadataRepository;
6
+ constructor(assetMetadataRepository: Repository<AssetMetadata>);
7
+ findByAssetId(assetId: string): Promise<AssetMetadata | null>;
8
+ findByUserId(userId: string): Promise<AssetMetadata[]>;
9
+ findByWorkspaceId(workspaceId: string): Promise<AssetMetadata[]>;
10
+ findByStatus(status: AssetMetadataStatus): Promise<AssetMetadata[]>;
11
+ findPendingForProcessing(limit?: number): Promise<AssetMetadata[]>;
12
+ updateStatus(id: string, status: AssetMetadataStatus, error?: string): Promise<AssetMetadata | null>;
13
+ updateEmbedding(id: string, embedding: number[], model: string, version?: string): Promise<AssetMetadata | null>;
14
+ updateContent(id: string, content: AssetMetadata['content']): Promise<AssetMetadata | null>;
15
+ updateTechnical(id: string, technical: AssetMetadata['technical']): Promise<AssetMetadata | null>;
16
+ findSimilarByEmbedding(embedding: number[], userId: string, limit?: number, excludeAssetId?: string, minSimilarity?: number): Promise<Array<AssetMetadata & {
17
+ similarity: number;
18
+ }>>;
19
+ findSimilarByEmbeddingOptimized(embedding: number[], userId: string, limit?: number, minSimilarity?: number): Promise<Array<{
20
+ assetId: string;
21
+ similarity: number;
22
+ category: string;
23
+ tags: string[];
24
+ description: string;
25
+ usageCount: number;
26
+ lastUsedAt: Date;
27
+ }>>;
28
+ findByTags(userId: string, tags: string[]): Promise<AssetMetadata[]>;
29
+ searchByKeywords(userId: string, searchTerm: string): Promise<AssetMetadata[]>;
30
+ incrementUsageCount(assetId: string, projectId?: string): Promise<void>;
31
+ findWithoutEmbeddings(limit?: number): Promise<AssetMetadata[]>;
32
+ getStatsForUser(userId: string): Promise<{
33
+ total: number;
34
+ pending: number;
35
+ completed: number;
36
+ failed: number;
37
+ withEmbeddings: number;
38
+ }>;
39
+ }