clhq-postgres-module 1.1.0-alpha.106 → 1.1.0-alpha.108

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.
@@ -31,3 +31,5 @@ export * from './project-metadata.entity';
31
31
  export * from './user-context.entity';
32
32
  export * from './ai-embedding.entity';
33
33
  export * from './metadata-activity-log.entity';
34
+ export * from './project-scene-job.entity';
35
+ export * from './project-scene.entity';
@@ -49,3 +49,5 @@ __exportStar(require("./project-metadata.entity"), exports);
49
49
  __exportStar(require("./user-context.entity"), exports);
50
50
  __exportStar(require("./ai-embedding.entity"), exports);
51
51
  __exportStar(require("./metadata-activity-log.entity"), exports);
52
+ __exportStar(require("./project-scene-job.entity"), exports);
53
+ __exportStar(require("./project-scene.entity"), exports);
@@ -0,0 +1,38 @@
1
+ import { User } from './user.entity';
2
+ export declare enum ProjectSceneJobStatus {
3
+ NEW = "NEW",
4
+ PROCESSING = "PROCESSING",
5
+ SUCCESS = "SUCCESS",
6
+ ERROR = "ERROR"
7
+ }
8
+ export declare class ProjectSceneJob {
9
+ id: string;
10
+ projectId: string;
11
+ userId: string;
12
+ user: User;
13
+ workspaceId: string;
14
+ status: ProjectSceneJobStatus;
15
+ totalScenes: number;
16
+ completedScenes: number;
17
+ failedScenes: number;
18
+ intervalSeconds: number;
19
+ durationMs: number;
20
+ data: {
21
+ scenes?: Array<{
22
+ timestamp: number;
23
+ url: string;
24
+ s3Key: string;
25
+ size: number;
26
+ }>;
27
+ errors?: Array<{
28
+ timestamp: number;
29
+ error: string;
30
+ }>;
31
+ processingTimeMs?: number;
32
+ };
33
+ errorMessage: string;
34
+ startedAt: Date;
35
+ completedAt: Date;
36
+ createdAt: Date;
37
+ updatedAt: Date;
38
+ }
@@ -0,0 +1,103 @@
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.ProjectSceneJob = exports.ProjectSceneJobStatus = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ const user_entity_1 = require("./user.entity");
15
+ var ProjectSceneJobStatus;
16
+ (function (ProjectSceneJobStatus) {
17
+ ProjectSceneJobStatus["NEW"] = "NEW";
18
+ ProjectSceneJobStatus["PROCESSING"] = "PROCESSING";
19
+ ProjectSceneJobStatus["SUCCESS"] = "SUCCESS";
20
+ ProjectSceneJobStatus["ERROR"] = "ERROR";
21
+ })(ProjectSceneJobStatus || (exports.ProjectSceneJobStatus = ProjectSceneJobStatus = {}));
22
+ let ProjectSceneJob = class ProjectSceneJob {
23
+ };
24
+ exports.ProjectSceneJob = ProjectSceneJob;
25
+ __decorate([
26
+ (0, typeorm_1.PrimaryColumn)({ type: 'varchar', length: 255 }),
27
+ __metadata("design:type", String)
28
+ ], ProjectSceneJob.prototype, "id", void 0);
29
+ __decorate([
30
+ (0, typeorm_1.Column)({ name: 'project_id', type: 'varchar', length: 255 }),
31
+ __metadata("design:type", String)
32
+ ], ProjectSceneJob.prototype, "projectId", void 0);
33
+ __decorate([
34
+ (0, typeorm_1.Column)({ name: 'user_id', type: 'uuid' }),
35
+ __metadata("design:type", String)
36
+ ], ProjectSceneJob.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
+ ], ProjectSceneJob.prototype, "user", void 0);
42
+ __decorate([
43
+ (0, typeorm_1.Column)({ name: 'workspace_id', type: 'uuid', nullable: true }),
44
+ __metadata("design:type", String)
45
+ ], ProjectSceneJob.prototype, "workspaceId", void 0);
46
+ __decorate([
47
+ (0, typeorm_1.Column)({
48
+ type: 'enum',
49
+ enum: ProjectSceneJobStatus,
50
+ default: ProjectSceneJobStatus.NEW,
51
+ }),
52
+ __metadata("design:type", String)
53
+ ], ProjectSceneJob.prototype, "status", void 0);
54
+ __decorate([
55
+ (0, typeorm_1.Column)({ name: 'total_scenes', type: 'integer', default: 0 }),
56
+ __metadata("design:type", Number)
57
+ ], ProjectSceneJob.prototype, "totalScenes", void 0);
58
+ __decorate([
59
+ (0, typeorm_1.Column)({ name: 'completed_scenes', type: 'integer', default: 0 }),
60
+ __metadata("design:type", Number)
61
+ ], ProjectSceneJob.prototype, "completedScenes", void 0);
62
+ __decorate([
63
+ (0, typeorm_1.Column)({ name: 'failed_scenes', type: 'integer', default: 0 }),
64
+ __metadata("design:type", Number)
65
+ ], ProjectSceneJob.prototype, "failedScenes", void 0);
66
+ __decorate([
67
+ (0, typeorm_1.Column)({ name: 'interval_seconds', type: 'integer', default: 5 }),
68
+ __metadata("design:type", Number)
69
+ ], ProjectSceneJob.prototype, "intervalSeconds", void 0);
70
+ __decorate([
71
+ (0, typeorm_1.Column)({ name: 'duration_ms', type: 'integer', nullable: true }),
72
+ __metadata("design:type", Number)
73
+ ], ProjectSceneJob.prototype, "durationMs", void 0);
74
+ __decorate([
75
+ (0, typeorm_1.Column)({ type: 'jsonb', nullable: true }),
76
+ __metadata("design:type", Object)
77
+ ], ProjectSceneJob.prototype, "data", void 0);
78
+ __decorate([
79
+ (0, typeorm_1.Column)({ name: 'error_message', type: 'text', nullable: true }),
80
+ __metadata("design:type", String)
81
+ ], ProjectSceneJob.prototype, "errorMessage", void 0);
82
+ __decorate([
83
+ (0, typeorm_1.Column)({ name: 'started_at', type: 'timestamp', nullable: true }),
84
+ __metadata("design:type", Date)
85
+ ], ProjectSceneJob.prototype, "startedAt", void 0);
86
+ __decorate([
87
+ (0, typeorm_1.Column)({ name: 'completed_at', type: 'timestamp', nullable: true }),
88
+ __metadata("design:type", Date)
89
+ ], ProjectSceneJob.prototype, "completedAt", void 0);
90
+ __decorate([
91
+ (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }),
92
+ __metadata("design:type", Date)
93
+ ], ProjectSceneJob.prototype, "createdAt", void 0);
94
+ __decorate([
95
+ (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }),
96
+ __metadata("design:type", Date)
97
+ ], ProjectSceneJob.prototype, "updatedAt", void 0);
98
+ exports.ProjectSceneJob = ProjectSceneJob = __decorate([
99
+ (0, typeorm_1.Entity)('project_scene_jobs'),
100
+ (0, typeorm_1.Index)(['projectId']),
101
+ (0, typeorm_1.Index)(['userId']),
102
+ (0, typeorm_1.Index)(['status'])
103
+ ], ProjectSceneJob);
@@ -0,0 +1,27 @@
1
+ export declare enum ProjectSceneStatus {
2
+ PENDING = "PENDING",
3
+ GENERATING = "GENERATING",
4
+ READY = "READY",
5
+ FAILED = "FAILED"
6
+ }
7
+ export declare class ProjectScene {
8
+ id: string;
9
+ projectId: string;
10
+ jobId: string;
11
+ timestamp: number;
12
+ status: ProjectSceneStatus;
13
+ s3Url: string;
14
+ s3Key: string;
15
+ fileSize: number;
16
+ width: number;
17
+ height: number;
18
+ generationTimeMs: number;
19
+ errorMessage: string;
20
+ metadata: {
21
+ layerCount?: number;
22
+ itemTypes?: string[];
23
+ editlySpec?: any;
24
+ };
25
+ createdAt: Date;
26
+ updatedAt: Date;
27
+ }
@@ -0,0 +1,93 @@
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.ProjectScene = exports.ProjectSceneStatus = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ var ProjectSceneStatus;
15
+ (function (ProjectSceneStatus) {
16
+ ProjectSceneStatus["PENDING"] = "PENDING";
17
+ ProjectSceneStatus["GENERATING"] = "GENERATING";
18
+ ProjectSceneStatus["READY"] = "READY";
19
+ ProjectSceneStatus["FAILED"] = "FAILED";
20
+ })(ProjectSceneStatus || (exports.ProjectSceneStatus = ProjectSceneStatus = {}));
21
+ let ProjectScene = class ProjectScene {
22
+ };
23
+ exports.ProjectScene = ProjectScene;
24
+ __decorate([
25
+ (0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
26
+ __metadata("design:type", String)
27
+ ], ProjectScene.prototype, "id", void 0);
28
+ __decorate([
29
+ (0, typeorm_1.Column)({ name: 'project_id', type: 'varchar', length: 255 }),
30
+ __metadata("design:type", String)
31
+ ], ProjectScene.prototype, "projectId", void 0);
32
+ __decorate([
33
+ (0, typeorm_1.Column)({ name: 'job_id', type: 'varchar', length: 255, nullable: true }),
34
+ __metadata("design:type", String)
35
+ ], ProjectScene.prototype, "jobId", void 0);
36
+ __decorate([
37
+ (0, typeorm_1.Column)({ type: 'float' }),
38
+ __metadata("design:type", Number)
39
+ ], ProjectScene.prototype, "timestamp", void 0);
40
+ __decorate([
41
+ (0, typeorm_1.Column)({
42
+ type: 'enum',
43
+ enum: ProjectSceneStatus,
44
+ default: ProjectSceneStatus.PENDING,
45
+ }),
46
+ __metadata("design:type", String)
47
+ ], ProjectScene.prototype, "status", void 0);
48
+ __decorate([
49
+ (0, typeorm_1.Column)({ name: 's3_url', type: 'text', nullable: true }),
50
+ __metadata("design:type", String)
51
+ ], ProjectScene.prototype, "s3Url", void 0);
52
+ __decorate([
53
+ (0, typeorm_1.Column)({ name: 's3_key', type: 'text', nullable: true }),
54
+ __metadata("design:type", String)
55
+ ], ProjectScene.prototype, "s3Key", void 0);
56
+ __decorate([
57
+ (0, typeorm_1.Column)({ name: 'file_size', type: 'integer', nullable: true }),
58
+ __metadata("design:type", Number)
59
+ ], ProjectScene.prototype, "fileSize", void 0);
60
+ __decorate([
61
+ (0, typeorm_1.Column)({ type: 'integer', nullable: true }),
62
+ __metadata("design:type", Number)
63
+ ], ProjectScene.prototype, "width", void 0);
64
+ __decorate([
65
+ (0, typeorm_1.Column)({ type: 'integer', nullable: true }),
66
+ __metadata("design:type", Number)
67
+ ], ProjectScene.prototype, "height", void 0);
68
+ __decorate([
69
+ (0, typeorm_1.Column)({ name: 'generation_time_ms', type: 'integer', nullable: true }),
70
+ __metadata("design:type", Number)
71
+ ], ProjectScene.prototype, "generationTimeMs", void 0);
72
+ __decorate([
73
+ (0, typeorm_1.Column)({ name: 'error_message', type: 'text', nullable: true }),
74
+ __metadata("design:type", String)
75
+ ], ProjectScene.prototype, "errorMessage", void 0);
76
+ __decorate([
77
+ (0, typeorm_1.Column)({ type: 'jsonb', nullable: true }),
78
+ __metadata("design:type", Object)
79
+ ], ProjectScene.prototype, "metadata", void 0);
80
+ __decorate([
81
+ (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }),
82
+ __metadata("design:type", Date)
83
+ ], ProjectScene.prototype, "createdAt", void 0);
84
+ __decorate([
85
+ (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }),
86
+ __metadata("design:type", Date)
87
+ ], ProjectScene.prototype, "updatedAt", void 0);
88
+ exports.ProjectScene = ProjectScene = __decorate([
89
+ (0, typeorm_1.Entity)('project_scenes'),
90
+ (0, typeorm_1.Index)(['projectId']),
91
+ (0, typeorm_1.Index)(['projectId', 'timestamp']),
92
+ (0, typeorm_1.Unique)(['projectId', 'timestamp'])
93
+ ], ProjectScene);
@@ -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
+ }