@gitgov/core 2.6.0 → 2.7.1

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.
@@ -1,9 +1,8 @@
1
- import { R as RecordStore } from './record_store-BXKWqon5.js';
2
- import { C as ConfigStore, G as GitGovConfig, I as IGitModule, e as CommitInfo, E as ExecOptions, b as ExecResult, c as ChangedFile, d as GetCommitHistoryOptions, f as CommitAuthor } from './index-Bhc341pf.js';
3
- export { M as MemoryFileListerOptions } from './index-Bhc341pf.js';
4
- import { S as SessionStore, G as GitGovSession } from './key_provider-jjWek3w1.js';
5
- export { E as EnvKeyProvider, a as EnvKeyProviderOptions, c as MemoryFileLister, M as MockKeyProvider, b as MockKeyProviderOptions } from './memory_file_lister-BIIcVXLw.js';
6
- import { a as IRecordProjection, b as IndexData, P as ProjectionContext } from './record_projection.types-B8AM7u8U.js';
1
+ import { R as RecordStore, b as IRecordProjection, c as IndexData, P as ProjectionContext } from './record_projection.types-D9NkQbL_.js';
2
+ import { C as ConfigStore, G as GitGovConfig, a as GitGovSession, I as IGitModule, f as CommitInfo, E as ExecOptions, c as ExecResult, d as ChangedFile, e as GetCommitHistoryOptions, g as CommitAuthor } from './index-LULVRsCZ.js';
3
+ export { M as MemoryFileListerOptions } from './index-LULVRsCZ.js';
4
+ import { S as SessionStore } from './session_store-I4Z6PW2c.js';
5
+ export { E as EnvKeyProvider, a as EnvKeyProviderOptions, c as MemoryFileLister, M as MockKeyProvider, b as MockKeyProviderOptions } from './memory_file_lister-BCY4ZYGW.js';
7
6
 
8
7
  /**
9
8
  * Options for MemoryRecordStore
@@ -1,5 +1,4 @@
1
- import { K as KeyProvider } from './key_provider-jjWek3w1.js';
2
- import { g as FileLister, M as MemoryFileListerOptions, h as FileListOptions, i as FileStats } from './index-Bhc341pf.js';
1
+ import { K as KeyProvider, h as FileLister, M as MemoryFileListerOptions, i as FileListOptions, j as FileStats } from './index-LULVRsCZ.js';
3
2
 
4
3
  /**
5
4
  * EnvKeyProvider - Environment variable-based KeyProvider implementation
@@ -1,55 +1,135 @@
1
- import { a as IRecordProjection, b as IndexData, P as ProjectionContext } from './record_projection.types-B8AM7u8U.js';
2
- import './record_store-BXKWqon5.js';
1
+ import { b as IRecordProjection, c as IndexData, P as ProjectionContext } from './record_projection.types-D9NkQbL_.js';
3
2
 
4
3
  type JsonValue = string | number | boolean | null | JsonValue[] | {
5
4
  [key: string]: JsonValue;
6
5
  };
7
- type ProjectionWhereUnique = {
6
+ type WhereRepoProjection = {
7
+ repoId: string;
8
+ projectionType: string;
9
+ };
10
+ type WhereRepoProjectionUnique = {
8
11
  repoId_projectionType: {
9
12
  repoId: string;
10
13
  projectionType: string;
11
14
  };
12
15
  };
13
- type ProjectionRow = {
16
+ type PrismaRowBase = {
14
17
  id: string;
15
18
  repoId: string;
16
19
  projectionType: string;
17
- data: JsonValue;
18
- lastCommitHash: string | null;
19
20
  createdAt: Date;
20
21
  updatedAt: Date;
21
22
  };
22
- type ProjectionDelegate = {
23
+ type PrismaRecordRowBase = PrismaRowBase & {
24
+ recordId: string;
25
+ headerJson: JsonValue;
26
+ };
27
+ type GitgovMetaRow = PrismaRowBase & {
28
+ lastCommitHash: string | null;
29
+ generatedAt: string;
30
+ integrityStatus: string;
31
+ recordCountsJson: JsonValue;
32
+ generationTime: number;
33
+ derivedStatesJson: JsonValue;
34
+ metricsJson: JsonValue;
35
+ };
36
+ type GitgovTaskRow = PrismaRecordRowBase & {
37
+ title: string;
38
+ status: string;
39
+ priority: string;
40
+ description: string;
41
+ tags: string[];
42
+ references: string[];
43
+ cycleIds: string[];
44
+ notes: string | null;
45
+ isStalled: boolean;
46
+ isAtRisk: boolean;
47
+ needsClarification: boolean;
48
+ isBlockedByDependency: boolean;
49
+ healthScore: number;
50
+ timeInCurrentStage: number;
51
+ executionCount: number;
52
+ blockingFeedbackCount: number;
53
+ openQuestionCount: number;
54
+ timeToResolution: number | null;
55
+ isReleased: boolean;
56
+ lastReleaseVersion: string | null;
57
+ lastUpdated: number;
58
+ lastActivityType: string;
59
+ recentActivity: string | null;
60
+ relationshipsJson: JsonValue;
61
+ };
62
+ type GitgovCycleRow = PrismaRecordRowBase & {
63
+ title: string;
64
+ status: string;
65
+ taskIds: string[];
66
+ childCycleIds: string[];
67
+ tags: string[];
68
+ notes: string | null;
69
+ };
70
+ type GitgovActorRow = PrismaRecordRowBase & {
71
+ actorType: string;
72
+ displayName: string;
73
+ publicKey: string;
74
+ roles: string[];
75
+ status: string | null;
76
+ supersededBy: string | null;
77
+ };
78
+ type GitgovFeedbackRow = PrismaRecordRowBase & {
79
+ entityType: string;
80
+ entityId: string;
81
+ feedbackType: string;
82
+ status: string;
83
+ content: string;
84
+ assignee: string | null;
85
+ resolvesFeedbackId: string | null;
86
+ metadataJson: JsonValue | null;
87
+ };
88
+ type GitgovActivityRow = PrismaRowBase & {
89
+ timestamp: number;
90
+ eventType: string;
91
+ entityId: string;
92
+ entityTitle: string;
93
+ actorId: string | null;
94
+ metadataJson: JsonValue | null;
95
+ };
96
+ type SingletonDelegate<TRow> = {
23
97
  upsert(args: {
24
- where: ProjectionWhereUnique;
25
- create: {
26
- repoId: string;
27
- projectionType: string;
28
- data: JsonValue;
29
- lastCommitHash: string | null;
30
- };
31
- update: {
32
- data: JsonValue;
33
- lastCommitHash: string | null;
34
- };
98
+ where: WhereRepoProjectionUnique;
99
+ create: Omit<TRow, 'id' | 'createdAt' | 'updatedAt'>;
100
+ update: Partial<Omit<TRow, 'id' | 'repoId' | 'projectionType' | 'createdAt' | 'updatedAt'>>;
35
101
  }): PromiseLike<unknown>;
36
102
  findUnique(args: {
37
- where: ProjectionWhereUnique;
103
+ where: WhereRepoProjectionUnique;
38
104
  select?: {
39
105
  id: true;
40
106
  };
41
- }): PromiseLike<ProjectionRow | {
107
+ }): PromiseLike<TRow | {
42
108
  id: string;
43
109
  } | null>;
44
110
  deleteMany(args: {
45
- where: {
46
- repoId: string;
47
- projectionType: string;
48
- };
111
+ where: WhereRepoProjection;
112
+ }): PromiseLike<unknown>;
113
+ };
114
+ type RecordDelegate<TRow> = {
115
+ createMany(args: {
116
+ data: Array<Omit<TRow, 'id' | 'createdAt' | 'updatedAt'>>;
117
+ }): PromiseLike<unknown>;
118
+ findMany(args: {
119
+ where: WhereRepoProjection;
120
+ }): PromiseLike<TRow[]>;
121
+ deleteMany(args: {
122
+ where: WhereRepoProjection;
49
123
  }): PromiseLike<unknown>;
50
124
  };
51
125
  type ProjectionClient = {
52
- projection: ProjectionDelegate;
126
+ gitgovMeta: SingletonDelegate<GitgovMetaRow>;
127
+ gitgovTask: RecordDelegate<GitgovTaskRow>;
128
+ gitgovCycle: RecordDelegate<GitgovCycleRow>;
129
+ gitgovActor: RecordDelegate<GitgovActorRow>;
130
+ gitgovFeedback: RecordDelegate<GitgovFeedbackRow>;
131
+ gitgovActivity: RecordDelegate<GitgovActivityRow>;
132
+ $transaction(operations: PromiseLike<unknown>[]): PromiseLike<unknown>;
53
133
  };
54
134
  type PrismaRecordProjectionOptions = {
55
135
  client: ProjectionClient;
@@ -66,6 +146,8 @@ declare class PrismaRecordProjection implements IRecordProjection {
66
146
  read(_context: ProjectionContext): Promise<IndexData | null>;
67
147
  exists(_context: ProjectionContext): Promise<boolean>;
68
148
  clear(_context: ProjectionContext): Promise<void>;
149
+ private buildTaskRow;
150
+ private reconstructIndexData;
69
151
  }
70
152
 
71
- export { type JsonValue, PrismaRecordProjection, type PrismaRecordProjectionOptions, type ProjectionClient, type ProjectionDelegate };
153
+ export { type JsonValue, PrismaRecordProjection, type PrismaRecordProjectionOptions, type ProjectionClient };
@@ -9,39 +9,124 @@ var PrismaRecordProjection = class {
9
9
  this.projectionType = options.projectionType ?? "index";
10
10
  }
11
11
  async persist(data, context) {
12
- await this.client.projection.upsert({
13
- where: {
14
- repoId_projectionType: {
12
+ const where = { repoId: this.repoId, projectionType: this.projectionType };
13
+ const taskRows = data.enrichedTasks.map((t) => this.buildTaskRow(t, data));
14
+ const cycleRows = data.cycles.map((c) => ({
15
+ repoId: this.repoId,
16
+ projectionType: this.projectionType,
17
+ recordId: c.payload.id,
18
+ title: c.payload.title,
19
+ status: c.payload.status,
20
+ taskIds: c.payload.taskIds ?? [],
21
+ childCycleIds: c.payload.childCycleIds ?? [],
22
+ tags: c.payload.tags ?? [],
23
+ notes: c.payload.notes ?? null,
24
+ headerJson: toJson(c.header)
25
+ }));
26
+ const actorRows = data.actors.map((a) => ({
27
+ repoId: this.repoId,
28
+ projectionType: this.projectionType,
29
+ recordId: a.payload.id,
30
+ actorType: a.payload.type,
31
+ displayName: a.payload.displayName,
32
+ publicKey: a.payload.publicKey,
33
+ roles: [...a.payload.roles],
34
+ status: a.payload.status ?? null,
35
+ supersededBy: a.payload.supersededBy ?? null,
36
+ headerJson: toJson(a.header)
37
+ }));
38
+ const feedbackRows = data.feedback.map((f) => ({
39
+ repoId: this.repoId,
40
+ projectionType: this.projectionType,
41
+ recordId: f.payload.id,
42
+ entityType: f.payload.entityType,
43
+ entityId: f.payload.entityId,
44
+ feedbackType: f.payload.type,
45
+ status: f.payload.status,
46
+ content: f.payload.content,
47
+ assignee: f.payload.assignee ?? null,
48
+ resolvesFeedbackId: f.payload.resolvesFeedbackId ?? null,
49
+ metadataJson: f.payload.metadata ? toJson(f.payload.metadata) : null,
50
+ headerJson: toJson(f.header)
51
+ }));
52
+ const activityRows = data.activityHistory.map((ev) => ({
53
+ repoId: this.repoId,
54
+ projectionType: this.projectionType,
55
+ timestamp: ev.timestamp,
56
+ eventType: ev.type,
57
+ entityId: ev.entityId,
58
+ entityTitle: ev.entityTitle,
59
+ actorId: ev.actorId ?? null,
60
+ metadataJson: ev.metadata ? toJson(ev.metadata) : null
61
+ }));
62
+ const ops = [
63
+ this.client.gitgovTask.deleteMany({ where }),
64
+ this.client.gitgovCycle.deleteMany({ where }),
65
+ this.client.gitgovActor.deleteMany({ where }),
66
+ this.client.gitgovFeedback.deleteMany({ where }),
67
+ this.client.gitgovActivity.deleteMany({ where }),
68
+ this.client.gitgovMeta.upsert({
69
+ where: { repoId_projectionType: where },
70
+ create: {
15
71
  repoId: this.repoId,
16
- projectionType: this.projectionType
72
+ projectionType: this.projectionType,
73
+ lastCommitHash: context.lastCommitHash ?? null,
74
+ generatedAt: data.metadata.generatedAt,
75
+ integrityStatus: data.metadata.integrityStatus,
76
+ recordCountsJson: toJson(data.metadata.recordCounts),
77
+ generationTime: data.metadata.generationTime,
78
+ derivedStatesJson: toJson(data.derivedStates),
79
+ metricsJson: toJson(data.metrics)
80
+ },
81
+ update: {
82
+ lastCommitHash: context.lastCommitHash ?? null,
83
+ generatedAt: data.metadata.generatedAt,
84
+ integrityStatus: data.metadata.integrityStatus,
85
+ recordCountsJson: toJson(data.metadata.recordCounts),
86
+ generationTime: data.metadata.generationTime,
87
+ derivedStatesJson: toJson(data.derivedStates),
88
+ metricsJson: toJson(data.metrics)
17
89
  }
18
- },
19
- create: {
20
- repoId: this.repoId,
21
- projectionType: this.projectionType,
22
- data: JSON.parse(JSON.stringify(data)),
23
- lastCommitHash: context.lastCommitHash ?? null
24
- },
25
- update: {
26
- data: JSON.parse(JSON.stringify(data)),
27
- lastCommitHash: context.lastCommitHash ?? null
28
- }
29
- });
90
+ })
91
+ ];
92
+ if (taskRows.length > 0) {
93
+ ops.push(this.client.gitgovTask.createMany({ data: taskRows }));
94
+ }
95
+ if (cycleRows.length > 0) {
96
+ ops.push(this.client.gitgovCycle.createMany({ data: cycleRows }));
97
+ }
98
+ if (actorRows.length > 0) {
99
+ ops.push(this.client.gitgovActor.createMany({ data: actorRows }));
100
+ }
101
+ if (feedbackRows.length > 0) {
102
+ ops.push(this.client.gitgovFeedback.createMany({ data: feedbackRows }));
103
+ }
104
+ if (activityRows.length > 0) {
105
+ ops.push(this.client.gitgovActivity.createMany({ data: activityRows }));
106
+ }
107
+ await this.client.$transaction(ops);
30
108
  }
31
109
  async read(_context) {
32
- const row = await this.client.projection.findUnique({
33
- where: {
34
- repoId_projectionType: {
35
- repoId: this.repoId,
36
- projectionType: this.projectionType
37
- }
110
+ const where = {
111
+ repoId_projectionType: {
112
+ repoId: this.repoId,
113
+ projectionType: this.projectionType
38
114
  }
39
- });
40
- if (!row || !("data" in row)) return null;
41
- return row.data;
115
+ };
116
+ const meta = await this.client.gitgovMeta.findUnique({ where });
117
+ if (!meta || !("generatedAt" in meta)) return null;
118
+ const whereMany = { repoId: this.repoId, projectionType: this.projectionType };
119
+ const [taskRows, cycleRows, actorRows, feedbackRows, activityRows] = await Promise.all([
120
+ this.client.gitgovTask.findMany({ where: whereMany }),
121
+ this.client.gitgovCycle.findMany({ where: whereMany }),
122
+ this.client.gitgovActor.findMany({ where: whereMany }),
123
+ this.client.gitgovFeedback.findMany({ where: whereMany }),
124
+ this.client.gitgovActivity.findMany({ where: whereMany })
125
+ ]);
126
+ return this.reconstructIndexData(meta, taskRows, cycleRows, actorRows, feedbackRows, activityRows);
42
127
  }
43
128
  async exists(_context) {
44
- const row = await this.client.projection.findUnique({
129
+ const row = await this.client.gitgovMeta.findUnique({
45
130
  where: {
46
131
  repoId_projectionType: {
47
132
  repoId: this.repoId,
@@ -53,14 +138,165 @@ var PrismaRecordProjection = class {
53
138
  return row !== null;
54
139
  }
55
140
  async clear(_context) {
56
- await this.client.projection.deleteMany({
57
- where: {
58
- repoId: this.repoId,
59
- projectionType: this.projectionType
60
- }
61
- });
141
+ const where = { repoId: this.repoId, projectionType: this.projectionType };
142
+ await this.client.$transaction([
143
+ this.client.gitgovTask.deleteMany({ where }),
144
+ this.client.gitgovCycle.deleteMany({ where }),
145
+ this.client.gitgovActor.deleteMany({ where }),
146
+ this.client.gitgovFeedback.deleteMany({ where }),
147
+ this.client.gitgovActivity.deleteMany({ where }),
148
+ this.client.gitgovMeta.deleteMany({ where })
149
+ ]);
150
+ }
151
+ buildTaskRow(enriched, data) {
152
+ const gitgovTask = data.tasks.find((t) => t.payload.id === enriched.id);
153
+ if (!gitgovTask) throw new Error(`Invariant: enrichedTask ${enriched.id} has no matching task record`);
154
+ const header = gitgovTask.header;
155
+ return {
156
+ repoId: this.repoId,
157
+ projectionType: this.projectionType,
158
+ recordId: enriched.id,
159
+ title: enriched.title,
160
+ status: enriched.status,
161
+ priority: enriched.priority,
162
+ description: enriched.description,
163
+ tags: enriched.tags ?? [],
164
+ references: enriched.references ?? [],
165
+ cycleIds: enriched.cycleIds ?? [],
166
+ notes: enriched.notes ?? null,
167
+ isStalled: enriched.derivedState.isStalled,
168
+ isAtRisk: enriched.derivedState.isAtRisk,
169
+ needsClarification: enriched.derivedState.needsClarification,
170
+ isBlockedByDependency: enriched.derivedState.isBlockedByDependency,
171
+ healthScore: enriched.derivedState.healthScore,
172
+ timeInCurrentStage: enriched.derivedState.timeInCurrentStage,
173
+ executionCount: enriched.metrics.executionCount,
174
+ blockingFeedbackCount: enriched.metrics.blockingFeedbackCount,
175
+ openQuestionCount: enriched.metrics.openQuestionCount,
176
+ timeToResolution: enriched.metrics.timeToResolution ?? null,
177
+ isReleased: enriched.release.isReleased,
178
+ lastReleaseVersion: enriched.release.lastReleaseVersion ?? null,
179
+ lastUpdated: enriched.lastUpdated,
180
+ lastActivityType: enriched.lastActivityType,
181
+ recentActivity: enriched.recentActivity ?? null,
182
+ relationshipsJson: toJson(enriched.relationships),
183
+ headerJson: toJson(header)
184
+ };
185
+ }
186
+ reconstructIndexData(meta, taskRows, cycleRows, actorRows, feedbackRows, activityRows) {
187
+ return {
188
+ metadata: {
189
+ generatedAt: meta.generatedAt,
190
+ lastCommitHash: meta.lastCommitHash ?? "",
191
+ integrityStatus: meta.integrityStatus,
192
+ recordCounts: meta.recordCountsJson,
193
+ generationTime: meta.generationTime
194
+ },
195
+ metrics: meta.metricsJson,
196
+ derivedStates: meta.derivedStatesJson,
197
+ activityHistory: activityRows.map((a) => ({
198
+ timestamp: a.timestamp,
199
+ type: a.eventType,
200
+ entityId: a.entityId,
201
+ entityTitle: a.entityTitle,
202
+ ...opt("actorId", a.actorId),
203
+ ...opt("metadata", a.metadataJson)
204
+ })),
205
+ tasks: taskRows.map((r) => ({
206
+ header: r.headerJson,
207
+ payload: {
208
+ id: r.recordId,
209
+ title: r.title,
210
+ status: r.status,
211
+ priority: r.priority,
212
+ description: r.description,
213
+ tags: r.tags,
214
+ references: r.references,
215
+ cycleIds: r.cycleIds,
216
+ ...opt("notes", r.notes)
217
+ }
218
+ })),
219
+ enrichedTasks: taskRows.map((r) => ({
220
+ id: r.recordId,
221
+ title: r.title,
222
+ status: r.status,
223
+ priority: r.priority,
224
+ description: r.description,
225
+ tags: r.tags,
226
+ references: r.references,
227
+ cycleIds: r.cycleIds,
228
+ ...opt("notes", r.notes),
229
+ derivedState: {
230
+ isStalled: r.isStalled,
231
+ isAtRisk: r.isAtRisk,
232
+ needsClarification: r.needsClarification,
233
+ isBlockedByDependency: r.isBlockedByDependency,
234
+ healthScore: r.healthScore,
235
+ timeInCurrentStage: r.timeInCurrentStage
236
+ },
237
+ relationships: r.relationshipsJson,
238
+ metrics: {
239
+ executionCount: r.executionCount,
240
+ blockingFeedbackCount: r.blockingFeedbackCount,
241
+ openQuestionCount: r.openQuestionCount,
242
+ ...opt("timeToResolution", r.timeToResolution)
243
+ },
244
+ release: {
245
+ isReleased: r.isReleased,
246
+ ...opt("lastReleaseVersion", r.lastReleaseVersion)
247
+ },
248
+ lastUpdated: r.lastUpdated,
249
+ lastActivityType: r.lastActivityType,
250
+ ...opt("recentActivity", r.recentActivity)
251
+ })),
252
+ cycles: cycleRows.map((c) => ({
253
+ header: c.headerJson,
254
+ payload: {
255
+ id: c.recordId,
256
+ title: c.title,
257
+ status: c.status,
258
+ taskIds: c.taskIds,
259
+ childCycleIds: c.childCycleIds,
260
+ tags: c.tags,
261
+ ...opt("notes", c.notes)
262
+ }
263
+ })),
264
+ actors: actorRows.map((a) => ({
265
+ header: a.headerJson,
266
+ payload: {
267
+ id: a.recordId,
268
+ type: a.actorType,
269
+ displayName: a.displayName,
270
+ publicKey: a.publicKey,
271
+ roles: a.roles,
272
+ ...opt("status", a.status),
273
+ ...opt("supersededBy", a.supersededBy)
274
+ }
275
+ })),
276
+ feedback: feedbackRows.map((f) => ({
277
+ header: f.headerJson,
278
+ payload: {
279
+ id: f.recordId,
280
+ entityType: f.entityType,
281
+ entityId: f.entityId,
282
+ type: f.feedbackType,
283
+ status: f.status,
284
+ content: f.content,
285
+ ...opt("assignee", f.assignee),
286
+ ...opt("resolvesFeedbackId", f.resolvesFeedbackId),
287
+ ...opt("metadata", f.metadataJson)
288
+ }
289
+ }))
290
+ };
62
291
  }
63
292
  };
293
+ function toJson(value) {
294
+ return JSON.parse(JSON.stringify(value));
295
+ }
296
+ function opt(key, value) {
297
+ if (value === null) return {};
298
+ return { [key]: value };
299
+ }
64
300
 
65
301
  export { PrismaRecordProjection };
66
302
  //# sourceMappingURL=prisma.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/record_projection/prisma/prisma_record_projection.ts"],"names":[],"mappings":";AAGO,IAAM,yBAAN,MAA0D;AAAA,EAC9C,MAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EAEjB,YAAY,OAAA,EAAwC;AAClD,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,cAAA,GAAiB,QAAQ,cAAA,IAAkB,OAAA;AAAA,EAClD;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAiB,OAAA,EAA2C;AACxE,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO;AAAA,MAClC,KAAA,EAAO;AAAA,QACL,qBAAA,EAAuB;AAAA,UACrB,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,gBAAgB,IAAA,CAAK;AAAA;AACvB,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,gBAAgB,IAAA,CAAK,cAAA;AAAA,QACrB,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,QACrC,cAAA,EAAgB,QAAQ,cAAA,IAAkB;AAAA,OAC5C;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,QACrC,cAAA,EAAgB,QAAQ,cAAA,IAAkB;AAAA;AAC5C,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAK,QAAA,EAAwD;AACjE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,WAAW,UAAA,CAAW;AAAA,MAClD,KAAA,EAAO;AAAA,QACL,qBAAA,EAAuB;AAAA,UACrB,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,gBAAgB,IAAA,CAAK;AAAA;AACvB;AACF,KACD,CAAA;AACD,IAAA,IAAI,CAAC,GAAA,IAAO,EAAE,MAAA,IAAU,MAAM,OAAO,IAAA;AACrC,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACb;AAAA,EAEA,MAAM,OAAO,QAAA,EAA+C;AAC1D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,WAAW,UAAA,CAAW;AAAA,MAClD,KAAA,EAAO;AAAA,QACL,qBAAA,EAAuB;AAAA,UACrB,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,gBAAgB,IAAA,CAAK;AAAA;AACvB,OACF;AAAA,MACA,MAAA,EAAQ,EAAE,EAAA,EAAI,IAAA;AAAK,KACpB,CAAA;AACD,IAAA,OAAO,GAAA,KAAQ,IAAA;AAAA,EACjB;AAAA,EAEA,MAAM,MAAM,QAAA,EAA4C;AACtD,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW;AAAA,MACtC,KAAA,EAAO;AAAA,QACL,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,gBAAgB,IAAA,CAAK;AAAA;AACvB,KACD,CAAA;AAAA,EACH;AACF","file":"prisma.js","sourcesContent":["import type { IRecordProjection, IndexData, ProjectionContext } from '../record_projection.types';\nimport type { JsonValue, ProjectionClient, PrismaRecordProjectionOptions } from './prisma_record_projection.types';\n\nexport class PrismaRecordProjection implements IRecordProjection {\n private readonly client: ProjectionClient;\n private readonly repoId: string;\n private readonly projectionType: string;\n\n constructor(options: PrismaRecordProjectionOptions) {\n this.client = options.client;\n this.repoId = options.repoId;\n this.projectionType = options.projectionType ?? 'index';\n }\n\n async persist(data: IndexData, context: ProjectionContext): Promise<void> {\n await this.client.projection.upsert({\n where: {\n repoId_projectionType: {\n repoId: this.repoId,\n projectionType: this.projectionType,\n },\n },\n create: {\n repoId: this.repoId,\n projectionType: this.projectionType,\n data: JSON.parse(JSON.stringify(data)) as JsonValue,\n lastCommitHash: context.lastCommitHash ?? null,\n },\n update: {\n data: JSON.parse(JSON.stringify(data)) as JsonValue,\n lastCommitHash: context.lastCommitHash ?? null,\n },\n });\n }\n\n async read(_context: ProjectionContext): Promise<IndexData | null> {\n const row = await this.client.projection.findUnique({\n where: {\n repoId_projectionType: {\n repoId: this.repoId,\n projectionType: this.projectionType,\n },\n },\n });\n if (!row || !('data' in row)) return null;\n return row.data as unknown as IndexData;\n }\n\n async exists(_context: ProjectionContext): Promise<boolean> {\n const row = await this.client.projection.findUnique({\n where: {\n repoId_projectionType: {\n repoId: this.repoId,\n projectionType: this.projectionType,\n },\n },\n select: { id: true },\n });\n return row !== null;\n }\n\n async clear(_context: ProjectionContext): Promise<void> {\n await this.client.projection.deleteMany({\n where: {\n repoId: this.repoId,\n projectionType: this.projectionType,\n },\n });\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/record_projection/prisma/prisma_record_projection.ts"],"names":[],"mappings":"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","file":"prisma.js","sourcesContent":["import type { IRecordProjection, IndexData, ProjectionContext, EnrichedTaskRecord } from '../record_projection.types';\nimport type {\n JsonValue,\n ProjectionClient,\n PrismaRecordProjectionOptions,\n GitgovTaskRow,\n GitgovCycleRow,\n GitgovActorRow,\n GitgovFeedbackRow,\n GitgovActivityRow,\n} from './prisma_record_projection.types';\n\nexport class PrismaRecordProjection implements IRecordProjection {\n private readonly client: ProjectionClient;\n private readonly repoId: string;\n private readonly projectionType: string;\n\n constructor(options: PrismaRecordProjectionOptions) {\n this.client = options.client;\n this.repoId = options.repoId;\n this.projectionType = options.projectionType ?? 'index';\n }\n\n async persist(data: IndexData, context: ProjectionContext): Promise<void> {\n const where = { repoId: this.repoId, projectionType: this.projectionType };\n\n const taskRows = data.enrichedTasks.map((t) => this.buildTaskRow(t, data));\n const cycleRows = data.cycles.map((c) => ({\n repoId: this.repoId,\n projectionType: this.projectionType,\n recordId: c.payload.id,\n title: c.payload.title,\n status: c.payload.status,\n taskIds: c.payload.taskIds ?? [],\n childCycleIds: c.payload.childCycleIds ?? [],\n tags: c.payload.tags ?? [],\n notes: c.payload.notes ?? null,\n headerJson: toJson(c.header),\n }));\n const actorRows = data.actors.map((a) => ({\n repoId: this.repoId,\n projectionType: this.projectionType,\n recordId: a.payload.id,\n actorType: a.payload.type,\n displayName: a.payload.displayName,\n publicKey: a.payload.publicKey,\n roles: [...a.payload.roles],\n status: a.payload.status ?? null,\n supersededBy: a.payload.supersededBy ?? null,\n headerJson: toJson(a.header),\n }));\n const feedbackRows = data.feedback.map((f) => ({\n repoId: this.repoId,\n projectionType: this.projectionType,\n recordId: f.payload.id,\n entityType: f.payload.entityType,\n entityId: f.payload.entityId,\n feedbackType: f.payload.type,\n status: f.payload.status,\n content: f.payload.content,\n assignee: f.payload.assignee ?? null,\n resolvesFeedbackId: f.payload.resolvesFeedbackId ?? null,\n metadataJson: f.payload.metadata ? toJson(f.payload.metadata) : null,\n headerJson: toJson(f.header),\n }));\n const activityRows = data.activityHistory.map((ev) => ({\n repoId: this.repoId,\n projectionType: this.projectionType,\n timestamp: ev.timestamp,\n eventType: ev.type,\n entityId: ev.entityId,\n entityTitle: ev.entityTitle,\n actorId: ev.actorId ?? null,\n metadataJson: ev.metadata ? toJson(ev.metadata) : null,\n }));\n\n const ops: PromiseLike<unknown>[] = [\n this.client.gitgovTask.deleteMany({ where }),\n this.client.gitgovCycle.deleteMany({ where }),\n this.client.gitgovActor.deleteMany({ where }),\n this.client.gitgovFeedback.deleteMany({ where }),\n this.client.gitgovActivity.deleteMany({ where }),\n this.client.gitgovMeta.upsert({\n where: { repoId_projectionType: where },\n create: {\n repoId: this.repoId,\n projectionType: this.projectionType,\n lastCommitHash: context.lastCommitHash ?? null,\n generatedAt: data.metadata.generatedAt,\n integrityStatus: data.metadata.integrityStatus,\n recordCountsJson: toJson(data.metadata.recordCounts),\n generationTime: data.metadata.generationTime,\n derivedStatesJson: toJson(data.derivedStates),\n metricsJson: toJson(data.metrics),\n },\n update: {\n lastCommitHash: context.lastCommitHash ?? null,\n generatedAt: data.metadata.generatedAt,\n integrityStatus: data.metadata.integrityStatus,\n recordCountsJson: toJson(data.metadata.recordCounts),\n generationTime: data.metadata.generationTime,\n derivedStatesJson: toJson(data.derivedStates),\n metricsJson: toJson(data.metrics),\n },\n }),\n ];\n\n if (taskRows.length > 0) {\n ops.push(this.client.gitgovTask.createMany({ data: taskRows }));\n }\n if (cycleRows.length > 0) {\n ops.push(this.client.gitgovCycle.createMany({ data: cycleRows }));\n }\n if (actorRows.length > 0) {\n ops.push(this.client.gitgovActor.createMany({ data: actorRows }));\n }\n if (feedbackRows.length > 0) {\n ops.push(this.client.gitgovFeedback.createMany({ data: feedbackRows }));\n }\n if (activityRows.length > 0) {\n ops.push(this.client.gitgovActivity.createMany({ data: activityRows }));\n }\n\n await this.client.$transaction(ops);\n }\n\n async read(_context: ProjectionContext): Promise<IndexData | null> {\n const where = {\n repoId_projectionType: {\n repoId: this.repoId,\n projectionType: this.projectionType,\n },\n };\n\n const meta = await this.client.gitgovMeta.findUnique({ where });\n if (!meta || !('generatedAt' in meta)) return null;\n\n const whereMany = { repoId: this.repoId, projectionType: this.projectionType };\n const [taskRows, cycleRows, actorRows, feedbackRows, activityRows] = await Promise.all([\n this.client.gitgovTask.findMany({ where: whereMany }),\n this.client.gitgovCycle.findMany({ where: whereMany }),\n this.client.gitgovActor.findMany({ where: whereMany }),\n this.client.gitgovFeedback.findMany({ where: whereMany }),\n this.client.gitgovActivity.findMany({ where: whereMany }),\n ]);\n\n return this.reconstructIndexData(meta, taskRows, cycleRows, actorRows, feedbackRows, activityRows);\n }\n\n async exists(_context: ProjectionContext): Promise<boolean> {\n const row = await this.client.gitgovMeta.findUnique({\n where: {\n repoId_projectionType: {\n repoId: this.repoId,\n projectionType: this.projectionType,\n },\n },\n select: { id: true },\n });\n return row !== null;\n }\n\n async clear(_context: ProjectionContext): Promise<void> {\n const where = { repoId: this.repoId, projectionType: this.projectionType };\n await this.client.$transaction([\n this.client.gitgovTask.deleteMany({ where }),\n this.client.gitgovCycle.deleteMany({ where }),\n this.client.gitgovActor.deleteMany({ where }),\n this.client.gitgovFeedback.deleteMany({ where }),\n this.client.gitgovActivity.deleteMany({ where }),\n this.client.gitgovMeta.deleteMany({ where }),\n ]);\n }\n\n private buildTaskRow(\n enriched: EnrichedTaskRecord,\n data: IndexData,\n ): Omit<GitgovTaskRow, 'id' | 'createdAt' | 'updatedAt'> {\n const gitgovTask = data.tasks.find((t) => t.payload.id === enriched.id);\n if (!gitgovTask) throw new Error(`Invariant: enrichedTask ${enriched.id} has no matching task record`);\n const header = gitgovTask.header;\n\n return {\n repoId: this.repoId,\n projectionType: this.projectionType,\n recordId: enriched.id,\n title: enriched.title,\n status: enriched.status,\n priority: enriched.priority,\n description: enriched.description,\n tags: enriched.tags ?? [],\n references: enriched.references ?? [],\n cycleIds: enriched.cycleIds ?? [],\n notes: enriched.notes ?? null,\n isStalled: enriched.derivedState.isStalled,\n isAtRisk: enriched.derivedState.isAtRisk,\n needsClarification: enriched.derivedState.needsClarification,\n isBlockedByDependency: enriched.derivedState.isBlockedByDependency,\n healthScore: enriched.derivedState.healthScore,\n timeInCurrentStage: enriched.derivedState.timeInCurrentStage,\n executionCount: enriched.metrics.executionCount,\n blockingFeedbackCount: enriched.metrics.blockingFeedbackCount,\n openQuestionCount: enriched.metrics.openQuestionCount,\n timeToResolution: enriched.metrics.timeToResolution ?? null,\n isReleased: enriched.release.isReleased,\n lastReleaseVersion: enriched.release.lastReleaseVersion ?? null,\n lastUpdated: enriched.lastUpdated,\n lastActivityType: enriched.lastActivityType,\n recentActivity: enriched.recentActivity ?? null,\n relationshipsJson: toJson(enriched.relationships),\n headerJson: toJson(header),\n };\n }\n\n private reconstructIndexData(\n meta: { generatedAt: string; integrityStatus: string; recordCountsJson: JsonValue; generationTime: number; derivedStatesJson: JsonValue; metricsJson: JsonValue; lastCommitHash: string | null },\n taskRows: GitgovTaskRow[],\n cycleRows: GitgovCycleRow[],\n actorRows: GitgovActorRow[],\n feedbackRows: GitgovFeedbackRow[],\n activityRows: GitgovActivityRow[],\n ): IndexData {\n return {\n metadata: {\n generatedAt: meta.generatedAt,\n lastCommitHash: meta.lastCommitHash ?? '',\n integrityStatus: meta.integrityStatus as IndexData['metadata']['integrityStatus'],\n recordCounts: meta.recordCountsJson as unknown as Record<string, number>,\n generationTime: meta.generationTime,\n },\n metrics: meta.metricsJson as unknown as IndexData['metrics'],\n derivedStates: meta.derivedStatesJson as unknown as IndexData['derivedStates'],\n activityHistory: activityRows.map((a) => ({\n timestamp: a.timestamp,\n type: a.eventType as 'task_created',\n entityId: a.entityId,\n entityTitle: a.entityTitle,\n ...opt('actorId', a.actorId),\n ...opt('metadata', a.metadataJson as Record<string, string> | null),\n })),\n tasks: taskRows.map((r) => ({\n header: r.headerJson as unknown as IndexData['tasks'][0]['header'],\n payload: {\n id: r.recordId,\n title: r.title,\n status: r.status as 'active',\n priority: r.priority as 'medium',\n description: r.description,\n tags: r.tags,\n references: r.references,\n cycleIds: r.cycleIds,\n ...opt('notes', r.notes),\n },\n })),\n enrichedTasks: taskRows.map((r) => ({\n id: r.recordId,\n title: r.title,\n status: r.status as 'active',\n priority: r.priority as 'medium',\n description: r.description,\n tags: r.tags,\n references: r.references,\n cycleIds: r.cycleIds,\n ...opt('notes', r.notes),\n derivedState: {\n isStalled: r.isStalled,\n isAtRisk: r.isAtRisk,\n needsClarification: r.needsClarification,\n isBlockedByDependency: r.isBlockedByDependency,\n healthScore: r.healthScore,\n timeInCurrentStage: r.timeInCurrentStage,\n },\n relationships: r.relationshipsJson as unknown as EnrichedTaskRecord['relationships'],\n metrics: {\n executionCount: r.executionCount,\n blockingFeedbackCount: r.blockingFeedbackCount,\n openQuestionCount: r.openQuestionCount,\n ...opt('timeToResolution', r.timeToResolution),\n },\n release: {\n isReleased: r.isReleased,\n ...opt('lastReleaseVersion', r.lastReleaseVersion),\n },\n lastUpdated: r.lastUpdated,\n lastActivityType: r.lastActivityType as EnrichedTaskRecord['lastActivityType'],\n ...opt('recentActivity', r.recentActivity),\n })),\n cycles: cycleRows.map((c) => ({\n header: c.headerJson as unknown as IndexData['cycles'][0]['header'],\n payload: {\n id: c.recordId,\n title: c.title,\n status: c.status as 'active',\n taskIds: c.taskIds,\n childCycleIds: c.childCycleIds,\n tags: c.tags,\n ...opt('notes', c.notes),\n },\n })),\n actors: actorRows.map((a) => ({\n header: a.headerJson as unknown as IndexData['actors'][0]['header'],\n payload: {\n id: a.recordId,\n type: a.actorType as 'human',\n displayName: a.displayName,\n publicKey: a.publicKey,\n roles: a.roles as [string, ...string[]],\n ...opt('status', a.status as 'active' | 'revoked' | null),\n ...opt('supersededBy', a.supersededBy),\n },\n })),\n feedback: feedbackRows.map((f) => ({\n header: f.headerJson as unknown as IndexData['feedback'][0]['header'],\n payload: {\n id: f.recordId,\n entityType: f.entityType as 'task',\n entityId: f.entityId,\n type: f.feedbackType as 'blocking',\n status: f.status as 'open',\n content: f.content,\n ...opt('assignee', f.assignee),\n ...opt('resolvesFeedbackId', f.resolvesFeedbackId),\n ...opt('metadata', f.metadataJson as Record<string, unknown> | null),\n },\n })),\n };\n }\n}\n\nfunction toJson(value: unknown): JsonValue {\n return JSON.parse(JSON.stringify(value)) as JsonValue;\n}\n\nfunction opt<K extends string, V>(key: K, value: V | null): { [P in K]: V } | Record<string, never> {\n if (value === null) return {} as Record<string, never>;\n return { [key]: value } as { [P in K]: V };\n}\n"]}