@cat-factory/node-server 0.95.1 → 0.96.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.
Files changed (52) hide show
  1. package/dist/container.d.ts.map +1 -1
  2. package/dist/container.js +16 -5
  3. package/dist/container.js.map +1 -1
  4. package/dist/repositories/drizzle/_shared.d.ts +2 -0
  5. package/dist/repositories/drizzle/_shared.d.ts.map +1 -0
  6. package/dist/repositories/drizzle/_shared.js +11 -0
  7. package/dist/repositories/drizzle/_shared.js.map +1 -0
  8. package/dist/repositories/drizzle/accounts.d.ts +62 -0
  9. package/dist/repositories/drizzle/accounts.d.ts.map +1 -0
  10. package/dist/repositories/drizzle/accounts.js +438 -0
  11. package/dist/repositories/drizzle/accounts.js.map +1 -0
  12. package/dist/repositories/drizzle/board.d.ts +74 -0
  13. package/dist/repositories/drizzle/board.d.ts.map +1 -0
  14. package/dist/repositories/drizzle/board.js +489 -0
  15. package/dist/repositories/drizzle/board.js.map +1 -0
  16. package/dist/repositories/drizzle/connections.d.ts +84 -0
  17. package/dist/repositories/drizzle/connections.d.ts.map +1 -0
  18. package/dist/repositories/drizzle/connections.js +391 -0
  19. package/dist/repositories/drizzle/connections.js.map +1 -0
  20. package/dist/repositories/drizzle/execution.d.ts +58 -0
  21. package/dist/repositories/drizzle/execution.d.ts.map +1 -0
  22. package/dist/repositories/drizzle/execution.js +585 -0
  23. package/dist/repositories/drizzle/execution.js.map +1 -0
  24. package/dist/repositories/drizzle/initiatives.d.ts +54 -0
  25. package/dist/repositories/drizzle/initiatives.d.ts.map +1 -0
  26. package/dist/repositories/drizzle/initiatives.js +343 -0
  27. package/dist/repositories/drizzle/initiatives.js.map +1 -0
  28. package/dist/repositories/drizzle/kaizen.d.ts +34 -0
  29. package/dist/repositories/drizzle/kaizen.d.ts.map +1 -0
  30. package/dist/repositories/drizzle/kaizen.js +192 -0
  31. package/dist/repositories/drizzle/kaizen.js.map +1 -0
  32. package/dist/repositories/drizzle/reviews.d.ts +75 -0
  33. package/dist/repositories/drizzle/reviews.d.ts.map +1 -0
  34. package/dist/repositories/drizzle/reviews.js +449 -0
  35. package/dist/repositories/drizzle/reviews.js.map +1 -0
  36. package/dist/repositories/drizzle/sandbox.d.ts +61 -0
  37. package/dist/repositories/drizzle/sandbox.d.ts.map +1 -0
  38. package/dist/repositories/drizzle/sandbox.js +370 -0
  39. package/dist/repositories/drizzle/sandbox.js.map +1 -0
  40. package/dist/repositories/drizzle/settings.d.ts +76 -0
  41. package/dist/repositories/drizzle/settings.d.ts.map +1 -0
  42. package/dist/repositories/drizzle/settings.js +377 -0
  43. package/dist/repositories/drizzle/settings.js.map +1 -0
  44. package/dist/repositories/drizzle/telemetry.d.ts +60 -0
  45. package/dist/repositories/drizzle/telemetry.d.ts.map +1 -0
  46. package/dist/repositories/drizzle/telemetry.js +559 -0
  47. package/dist/repositories/drizzle/telemetry.js.map +1 -0
  48. package/dist/repositories/drizzle.d.ts +6 -113
  49. package/dist/repositories/drizzle.d.ts.map +1 -1
  50. package/dist/repositories/drizzle.js +20 -4118
  51. package/dist/repositories/drizzle.js.map +1 -1
  52. package/package.json +20 -20
@@ -0,0 +1,54 @@
1
+ import type { Initiative, InitiativeRepository, RiskPolicy, RiskPolicyRepository, SharedStack, SharedStackRepository } from '@cat-factory/kernel';
2
+ import type { DrizzleDb } from '../../db/client.js';
3
+ /**
4
+ * Initiatives over Postgres — the Drizzle mirror of the Worker's
5
+ * `D1InitiativeRepository` (migration 0035). Behaviourally identical so the
6
+ * cross-runtime conformance suite asserts the same CRUD + rev-guarded CAS against
7
+ * both stores.
8
+ */
9
+ export declare class DrizzleInitiativeRepository implements InitiativeRepository {
10
+ private readonly db;
11
+ constructor(db: DrizzleDb);
12
+ get(workspaceId: string, id: string): Promise<Initiative | null>;
13
+ getByBlock(workspaceId: string, blockId: string): Promise<Initiative | null>;
14
+ list(workspaceId: string): Promise<Initiative[]>;
15
+ listExecuting(): Promise<Array<{
16
+ workspaceId: string;
17
+ initiative: Initiative;
18
+ }>>;
19
+ insert(workspaceId: string, initiative: Initiative): Promise<void>;
20
+ compareAndSwap(workspaceId: string, next: Initiative, expectedRev: number): Promise<boolean>;
21
+ delete(workspaceId: string, id: string): Promise<void>;
22
+ }
23
+ /**
24
+ * Per-workspace merge threshold presets over Postgres (the Drizzle mirror of the
25
+ * Worker's `D1RiskPolicyRepository`, migration 0024). Enforces the single-default
26
+ * invariant: promoting a preset to default demotes every other in the workspace
27
+ * before the upsert. The default preset cannot be removed (the service keeps that
28
+ * rule too; the DELETE also guards `is_default = 0`). Behaviourally identical to the
29
+ * D1 repo so the cross-runtime conformance suite asserts the same preset resolution.
30
+ */
31
+ export declare class DrizzleRiskPolicyRepository implements RiskPolicyRepository {
32
+ private readonly db;
33
+ constructor(db: DrizzleDb);
34
+ get(workspaceId: string, id: string): Promise<RiskPolicy | null>;
35
+ list(workspaceId: string): Promise<RiskPolicy[]>;
36
+ getDefault(workspaceId: string): Promise<RiskPolicy | null>;
37
+ upsert(workspaceId: string, preset: RiskPolicy): Promise<void>;
38
+ remove(workspaceId: string, id: string): Promise<void>;
39
+ }
40
+ /**
41
+ * A workspace's shared stacks over Postgres (the Drizzle mirror of the Worker's
42
+ * `D1SharedStackRepository`, migration 0041). JSON-shaped fields are stored as text JSON and
43
+ * `allow_host_commands` as 0/1; behaviourally identical to the D1 repo so the cross-runtime
44
+ * conformance suite asserts the same round-trip.
45
+ */
46
+ export declare class DrizzleSharedStackRepository implements SharedStackRepository {
47
+ private readonly db;
48
+ constructor(db: DrizzleDb);
49
+ get(workspaceId: string, id: string): Promise<SharedStack | null>;
50
+ list(workspaceId: string): Promise<SharedStack[]>;
51
+ upsert(workspaceId: string, stack: SharedStack): Promise<void>;
52
+ remove(workspaceId: string, id: string): Promise<void>;
53
+ }
54
+ //# sourceMappingURL=initiatives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initiatives.d.ts","sourceRoot":"","sources":["../../../src/repositories/drizzle/initiatives.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,UAAU,EACV,oBAAoB,EACpB,UAAU,EACV,oBAAoB,EACpB,WAAW,EACX,qBAAqB,EACtB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAOnD;;;;;GAKG;AAEH,qBAAa,2BAA4B,YAAW,oBAAoB;IAC1D,OAAO,CAAC,QAAQ,CAAC,EAAE;IAA/B,YAA6B,EAAE,EAAE,SAAS,EAAI;IAExC,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAOrE;IAEK,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAOjF;IAEK,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAQrD;IAEK,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC,CAYrF;IAEK,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAYvE;IAEK,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAkBlB;IAEK,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI3D;CACF;AA6BD;;;;;;;GAOG;AAEH,qBAAa,2BAA4B,YAAW,oBAAoB;IAC1D,OAAO,CAAC,QAAQ,CAAC,EAAE;IAA/B,YAA6B,EAAE,EAAE,SAAS,EAAI;IAExC,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAOrE;IAEK,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAOrD;IAEK,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQhE;IAEK,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DnE;IAEK,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3D;CACF;AAqDD;;;;;GAKG;AAEH,qBAAa,4BAA6B,YAAW,qBAAqB;IAC5D,OAAO,CAAC,QAAQ,CAAC,EAAE;IAA/B,YAA6B,EAAE,EAAE,SAAS,EAAI;IAExC,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAOtE;IAEK,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAOtD;IAEK,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CnE;IAEK,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI3D;CACF"}
@@ -0,0 +1,343 @@
1
+ // Drizzle/Postgres implementations of the core kernel repository ports, split by
2
+ // domain (mirrors the Cloudflare D1 per-repository layout). The row<->domain mapping
3
+ // is the SAME shared mapping the D1 repos use (@cat-factory/server), so behaviour
4
+ // matches across stores; this layer only owns the Drizzle queries. Assembled into the
5
+ // CoreRepositories set by ./drizzle.ts (the barrel).
6
+ import { decodeInitiativeRow } from '@cat-factory/contracts';
7
+ import { and, asc, eq, sql } from 'drizzle-orm';
8
+ import { initiatives, riskPolicies, sharedStacks } from '../../db/schema.js';
9
+ // The row → entity decode (doc blob + column-lifted keys) is the shared
10
+ // `decodeInitiativeRow` (contracts), so the Drizzle and D1 repos can't drift.
11
+ const rowToInitiative = decodeInitiativeRow;
12
+ /**
13
+ * Initiatives over Postgres — the Drizzle mirror of the Worker's
14
+ * `D1InitiativeRepository` (migration 0035). Behaviourally identical so the
15
+ * cross-runtime conformance suite asserts the same CRUD + rev-guarded CAS against
16
+ * both stores.
17
+ */
18
+ export class DrizzleInitiativeRepository {
19
+ db;
20
+ constructor(db) {
21
+ this.db = db;
22
+ }
23
+ async get(workspaceId, id) {
24
+ const rows = await this.db
25
+ .select()
26
+ .from(initiatives)
27
+ .where(and(eq(initiatives.workspace_id, workspaceId), eq(initiatives.id, id)))
28
+ .limit(1);
29
+ return rows[0] ? rowToInitiative(rows[0]) : null;
30
+ }
31
+ async getByBlock(workspaceId, blockId) {
32
+ const rows = await this.db
33
+ .select()
34
+ .from(initiatives)
35
+ .where(and(eq(initiatives.workspace_id, workspaceId), eq(initiatives.block_id, blockId)))
36
+ .limit(1);
37
+ return rows[0] ? rowToInitiative(rows[0]) : null;
38
+ }
39
+ async list(workspaceId) {
40
+ const rows = await this.db
41
+ .select()
42
+ .from(initiatives)
43
+ .where(eq(initiatives.workspace_id, workspaceId))
44
+ .orderBy(asc(initiatives.created_at));
45
+ // Snapshot-facing list read: drop a corrupt row rather than failing the board load.
46
+ return rows.map(rowToInitiative).filter((i) => i !== null);
47
+ }
48
+ async listExecuting() {
49
+ const rows = await this.db
50
+ .select()
51
+ .from(initiatives)
52
+ .where(eq(initiatives.status, 'executing'))
53
+ .orderBy(asc(initiatives.created_at));
54
+ return rows
55
+ .map((row) => {
56
+ const initiative = rowToInitiative(row);
57
+ return initiative ? { workspaceId: row.workspace_id, initiative } : null;
58
+ })
59
+ .filter((r) => r !== null);
60
+ }
61
+ async insert(workspaceId, initiative) {
62
+ await this.db.insert(initiatives).values({
63
+ workspace_id: workspaceId,
64
+ id: initiative.id,
65
+ block_id: initiative.blockId,
66
+ slug: initiative.slug,
67
+ status: initiative.status,
68
+ rev: initiative.rev,
69
+ doc: JSON.stringify(initiative),
70
+ created_at: initiative.createdAt,
71
+ updated_at: initiative.updatedAt,
72
+ });
73
+ }
74
+ async compareAndSwap(workspaceId, next, expectedRev) {
75
+ const result = await this.db
76
+ .update(initiatives)
77
+ .set({
78
+ slug: next.slug,
79
+ status: next.status,
80
+ rev: next.rev,
81
+ doc: JSON.stringify(next),
82
+ updated_at: next.updatedAt,
83
+ })
84
+ .where(and(eq(initiatives.workspace_id, workspaceId), eq(initiatives.id, next.id), eq(initiatives.rev, expectedRev)));
85
+ return (result.rowCount ?? 0) > 0;
86
+ }
87
+ async delete(workspaceId, id) {
88
+ await this.db
89
+ .delete(initiatives)
90
+ .where(and(eq(initiatives.workspace_id, workspaceId), eq(initiatives.id, id)));
91
+ }
92
+ }
93
+ function rowToRiskPolicy(row) {
94
+ return {
95
+ id: row.id,
96
+ name: row.name,
97
+ maxComplexity: row.max_complexity,
98
+ maxRisk: row.max_risk,
99
+ maxImpact: row.max_impact,
100
+ ciMaxAttempts: row.ci_max_attempts,
101
+ maxRequirementIterations: row.max_requirement_iterations,
102
+ maxRequirementConcernAllowed: row.max_requirement_concern_allowed,
103
+ maxTesterQualityIterations: row.max_tester_quality_iterations,
104
+ releaseWatchWindowMinutes: row.release_watch_window_minutes,
105
+ releaseMaxAttempts: row.release_max_attempts,
106
+ humanReviewGraceMinutes: row.human_review_grace_minutes,
107
+ autoMergeEnabled: row.auto_merge_enabled === 1,
108
+ forkDecision: row.fork_decision
109
+ ? JSON.parse(row.fork_decision)
110
+ : null,
111
+ isDefault: row.is_default === 1,
112
+ ...(row.version != null ? { version: row.version } : {}),
113
+ createdAt: row.created_at,
114
+ };
115
+ }
116
+ /**
117
+ * Per-workspace merge threshold presets over Postgres (the Drizzle mirror of the
118
+ * Worker's `D1RiskPolicyRepository`, migration 0024). Enforces the single-default
119
+ * invariant: promoting a preset to default demotes every other in the workspace
120
+ * before the upsert. The default preset cannot be removed (the service keeps that
121
+ * rule too; the DELETE also guards `is_default = 0`). Behaviourally identical to the
122
+ * D1 repo so the cross-runtime conformance suite asserts the same preset resolution.
123
+ */
124
+ export class DrizzleRiskPolicyRepository {
125
+ db;
126
+ constructor(db) {
127
+ this.db = db;
128
+ }
129
+ async get(workspaceId, id) {
130
+ const rows = await this.db
131
+ .select()
132
+ .from(riskPolicies)
133
+ .where(and(eq(riskPolicies.workspace_id, workspaceId), eq(riskPolicies.id, id)))
134
+ .limit(1);
135
+ return rows[0] ? rowToRiskPolicy(rows[0]) : null;
136
+ }
137
+ async list(workspaceId) {
138
+ const rows = await this.db
139
+ .select()
140
+ .from(riskPolicies)
141
+ .where(eq(riskPolicies.workspace_id, workspaceId))
142
+ .orderBy(riskPolicies.created_at);
143
+ return rows.map(rowToRiskPolicy);
144
+ }
145
+ async getDefault(workspaceId) {
146
+ const rows = await this.db
147
+ .select()
148
+ .from(riskPolicies)
149
+ .where(and(eq(riskPolicies.workspace_id, workspaceId), eq(riskPolicies.is_default, 1)))
150
+ .orderBy(riskPolicies.created_at)
151
+ .limit(1);
152
+ return rows[0] ? rowToRiskPolicy(rows[0]) : null;
153
+ }
154
+ async upsert(workspaceId, preset) {
155
+ const values = {
156
+ workspace_id: workspaceId,
157
+ id: preset.id,
158
+ name: preset.name,
159
+ max_complexity: preset.maxComplexity,
160
+ max_risk: preset.maxRisk,
161
+ max_impact: preset.maxImpact,
162
+ ci_max_attempts: preset.ciMaxAttempts,
163
+ max_requirement_iterations: preset.maxRequirementIterations,
164
+ max_requirement_concern_allowed: preset.maxRequirementConcernAllowed,
165
+ max_tester_quality_iterations: preset.maxTesterQualityIterations,
166
+ release_watch_window_minutes: preset.releaseWatchWindowMinutes,
167
+ release_max_attempts: preset.releaseMaxAttempts,
168
+ human_review_grace_minutes: preset.humanReviewGraceMinutes,
169
+ auto_merge_enabled: preset.autoMergeEnabled ? 1 : 0,
170
+ fork_decision: preset.forkDecision ? JSON.stringify(preset.forkDecision) : null,
171
+ version: preset.version ?? null,
172
+ is_default: preset.isDefault ? 1 : 0,
173
+ created_at: preset.createdAt,
174
+ };
175
+ // Demote + upsert run in one transaction so the single-default invariant can never
176
+ // be observed broken (zero or two defaults) by a concurrent reader or a partial failure.
177
+ await this.db.transaction(async (tx) => {
178
+ // Promoting this preset to default demotes any other default first.
179
+ if (preset.isDefault) {
180
+ await tx
181
+ .update(riskPolicies)
182
+ .set({ is_default: 0 })
183
+ .where(and(eq(riskPolicies.workspace_id, workspaceId), sql `${riskPolicies.id} <> ${preset.id}`));
184
+ }
185
+ await tx
186
+ .insert(riskPolicies)
187
+ .values(values)
188
+ .onConflictDoUpdate({
189
+ target: [riskPolicies.workspace_id, riskPolicies.id],
190
+ set: {
191
+ name: values.name,
192
+ max_complexity: values.max_complexity,
193
+ max_risk: values.max_risk,
194
+ max_impact: values.max_impact,
195
+ ci_max_attempts: values.ci_max_attempts,
196
+ max_requirement_iterations: values.max_requirement_iterations,
197
+ max_requirement_concern_allowed: values.max_requirement_concern_allowed,
198
+ max_tester_quality_iterations: values.max_tester_quality_iterations,
199
+ release_watch_window_minutes: values.release_watch_window_minutes,
200
+ release_max_attempts: values.release_max_attempts,
201
+ human_review_grace_minutes: values.human_review_grace_minutes,
202
+ auto_merge_enabled: values.auto_merge_enabled,
203
+ fork_decision: values.fork_decision,
204
+ version: values.version,
205
+ is_default: values.is_default,
206
+ },
207
+ });
208
+ });
209
+ }
210
+ async remove(workspaceId, id) {
211
+ await this.db
212
+ .delete(riskPolicies)
213
+ .where(and(eq(riskPolicies.workspace_id, workspaceId), eq(riskPolicies.id, id), eq(riskPolicies.is_default, 0)));
214
+ }
215
+ }
216
+ // Shape-guarded parsers matching the D1 mirror (`D1SharedStackRepository`) EXACTLY, so a
217
+ // malformed/hand-edited JSON column coerces identically on both stores (a non-array ⇒ `[]`, a
218
+ // non-object health gate ⇒ `null`) rather than the Node facade handing the domain a raw value the
219
+ // Worker would have dropped — the "keep the runtimes symmetric" guarantee holds for bad data too.
220
+ function parseSharedStackArray(json) {
221
+ try {
222
+ const parsed = JSON.parse(json);
223
+ return Array.isArray(parsed) ? parsed : [];
224
+ }
225
+ catch {
226
+ return [];
227
+ }
228
+ }
229
+ function parseSharedStackHealthGate(json) {
230
+ if (!json)
231
+ return null;
232
+ try {
233
+ const parsed = JSON.parse(json);
234
+ return parsed && typeof parsed === 'object'
235
+ ? parsed
236
+ : null;
237
+ }
238
+ catch {
239
+ return null;
240
+ }
241
+ }
242
+ function rowToSharedStack(row) {
243
+ return {
244
+ id: row.id,
245
+ workspaceId: row.workspace_id,
246
+ name: row.name,
247
+ cloneUrl: row.clone_url,
248
+ gitRef: row.git_ref,
249
+ composeFiles: parseSharedStackArray(row.compose_files),
250
+ composeProfiles: parseSharedStackArray(row.compose_profiles),
251
+ envFiles: parseSharedStackArray(row.env_files),
252
+ managedNetworks: parseSharedStackArray(row.managed_networks),
253
+ setupSteps: parseSharedStackArray(row.setup_steps),
254
+ prerequisites: parseSharedStackArray(row.prerequisites),
255
+ healthGate: parseSharedStackHealthGate(row.health_gate),
256
+ allowHostCommands: row.allow_host_commands === 1,
257
+ status: row.status,
258
+ lastError: row.last_error,
259
+ createdAt: row.created_at,
260
+ updatedAt: row.updated_at,
261
+ };
262
+ }
263
+ /**
264
+ * A workspace's shared stacks over Postgres (the Drizzle mirror of the Worker's
265
+ * `D1SharedStackRepository`, migration 0041). JSON-shaped fields are stored as text JSON and
266
+ * `allow_host_commands` as 0/1; behaviourally identical to the D1 repo so the cross-runtime
267
+ * conformance suite asserts the same round-trip.
268
+ */
269
+ export class DrizzleSharedStackRepository {
270
+ db;
271
+ constructor(db) {
272
+ this.db = db;
273
+ }
274
+ async get(workspaceId, id) {
275
+ const rows = await this.db
276
+ .select()
277
+ .from(sharedStacks)
278
+ .where(and(eq(sharedStacks.workspace_id, workspaceId), eq(sharedStacks.id, id)))
279
+ .limit(1);
280
+ return rows[0] ? rowToSharedStack(rows[0]) : null;
281
+ }
282
+ async list(workspaceId) {
283
+ const rows = await this.db
284
+ .select()
285
+ .from(sharedStacks)
286
+ .where(eq(sharedStacks.workspace_id, workspaceId))
287
+ .orderBy(sharedStacks.created_at);
288
+ return rows.map(rowToSharedStack);
289
+ }
290
+ async upsert(workspaceId, stack) {
291
+ const values = {
292
+ workspace_id: workspaceId,
293
+ id: stack.id,
294
+ name: stack.name,
295
+ clone_url: stack.cloneUrl,
296
+ git_ref: stack.gitRef,
297
+ compose_files: JSON.stringify(stack.composeFiles),
298
+ compose_profiles: JSON.stringify(stack.composeProfiles),
299
+ env_files: JSON.stringify(stack.envFiles),
300
+ managed_networks: JSON.stringify(stack.managedNetworks),
301
+ setup_steps: JSON.stringify(stack.setupSteps),
302
+ prerequisites: JSON.stringify(stack.prerequisites),
303
+ health_gate: stack.healthGate ? JSON.stringify(stack.healthGate) : null,
304
+ allow_host_commands: stack.allowHostCommands ? 1 : 0,
305
+ status: stack.status,
306
+ last_error: stack.lastError,
307
+ created_at: stack.createdAt,
308
+ updated_at: stack.updatedAt,
309
+ };
310
+ await this.db
311
+ .insert(sharedStacks)
312
+ .values(values)
313
+ .onConflictDoUpdate({
314
+ target: [sharedStacks.workspace_id, sharedStacks.id],
315
+ set: {
316
+ name: values.name,
317
+ clone_url: values.clone_url,
318
+ git_ref: values.git_ref,
319
+ compose_files: values.compose_files,
320
+ compose_profiles: values.compose_profiles,
321
+ env_files: values.env_files,
322
+ managed_networks: values.managed_networks,
323
+ setup_steps: values.setup_steps,
324
+ prerequisites: values.prerequisites,
325
+ health_gate: values.health_gate,
326
+ allow_host_commands: values.allow_host_commands,
327
+ status: values.status,
328
+ last_error: values.last_error,
329
+ updated_at: values.updated_at,
330
+ },
331
+ });
332
+ }
333
+ async remove(workspaceId, id) {
334
+ await this.db
335
+ .delete(sharedStacks)
336
+ .where(and(eq(sharedStacks.workspace_id, workspaceId), eq(sharedStacks.id, id)));
337
+ }
338
+ }
339
+ // ---- Sandbox (parallel prompt/model testing surface; migration 0012) --------
340
+ // The Drizzle mirror of the Worker's five `D1Sandbox*Repository` classes. JSON-shaped
341
+ // fields are stored as text JSON, parsed defensively; behaviourally identical to the D1
342
+ // repos so the cross-runtime conformance suite asserts the same Sandbox behaviour.
343
+ //# sourceMappingURL=initiatives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initiatives.js","sourceRoot":"","sources":["../../../src/repositories/drizzle/initiatives.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { KaizenGrading, KaizenGradingRepository, KaizenVerifiedCombo, KaizenVerifiedComboRepository } from '@cat-factory/kernel';
2
+ import type { DrizzleDb } from '../../db/client.js';
3
+ /**
4
+ * Kaizen gradings over Postgres (the Drizzle mirror of the Worker's
5
+ * `D1KaizenGradingRepository`, migration 0015). One row per (run, step); recommendations
6
+ * are a JSON array. The unique (execution_id, step_index) index keeps scheduling
7
+ * idempotent across durable re-drives.
8
+ */
9
+ export declare class DrizzleKaizenGradingRepository implements KaizenGradingRepository {
10
+ private readonly db;
11
+ constructor(db: DrizzleDb);
12
+ upsert(workspaceId: string, grading: KaizenGrading): Promise<void>;
13
+ get(workspaceId: string, id: string): Promise<KaizenGrading | null>;
14
+ getByStep(workspaceId: string, executionId: string, stepIndex: number): Promise<KaizenGrading | null>;
15
+ listByExecution(workspaceId: string, executionId: string): Promise<KaizenGrading[]>;
16
+ listByWorkspace(workspaceId: string, limit?: number): Promise<KaizenGrading[]>;
17
+ listPending(staleBefore: number, limit: number): Promise<{
18
+ workspaceId: string;
19
+ grading: KaizenGrading;
20
+ }[]>;
21
+ claim(workspaceId: string, id: string, staleBefore: number, now: number): Promise<boolean>;
22
+ }
23
+ /**
24
+ * Kaizen verified-combo progress over Postgres (the Drizzle mirror of the Worker's
25
+ * `D1KaizenVerifiedComboRepository`, migration 0015).
26
+ */
27
+ export declare class DrizzleKaizenVerifiedComboRepository implements KaizenVerifiedComboRepository {
28
+ private readonly db;
29
+ constructor(db: DrizzleDb);
30
+ getByKey(workspaceId: string, comboKey: string): Promise<KaizenVerifiedCombo | null>;
31
+ upsert(workspaceId: string, combo: KaizenVerifiedCombo): Promise<void>;
32
+ listByWorkspace(workspaceId: string): Promise<KaizenVerifiedCombo[]>;
33
+ }
34
+ //# sourceMappingURL=kaizen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kaizen.d.ts","sourceRoot":"","sources":["../../../src/repositories/drizzle/kaizen.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,EAEvB,mBAAmB,EACnB,6BAA6B,EAC9B,MAAM,qBAAqB,CAAA;AAE5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AA0BnD;;;;;GAKG;AAEH,qBAAa,8BAA+B,YAAW,uBAAuB;IAChE,OAAO,CAAC,QAAQ,CAAC,EAAE;IAA/B,YAA6B,EAAE,EAAE,SAAS,EAAI;IAExC,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCvE;IAEK,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAOxE;IAEK,SAAS,CACb,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAa/B;IAEK,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAYxF;IAEK,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAQhF;IAEK,WAAW,CACf,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,EAAE,CAAC,CAa5D;IAEK,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkB/F;CACF;AAiBD;;;GAGG;AAEH,qBAAa,oCAAqC,YAAW,6BAA6B;IAC5E,OAAO,CAAC,QAAQ,CAAC,EAAE;IAA/B,YAA6B,EAAE,EAAE,SAAS,EAAI;IAExC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAYzF;IAEK,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB3E;IAEK,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAOzE;CACF"}
@@ -0,0 +1,192 @@
1
+ // Drizzle/Postgres implementations of the core kernel repository ports, split by
2
+ // domain (mirrors the Cloudflare D1 per-repository layout). The row<->domain mapping
3
+ // is the SAME shared mapping the D1 repos use (@cat-factory/server), so behaviour
4
+ // matches across stores; this layer only owns the Drizzle queries. Assembled into the
5
+ // CoreRepositories set by ./drizzle.ts (the barrel).
6
+ import { parseJsonArray } from './_shared.js';
7
+ import { and, desc, eq, lt, or } from 'drizzle-orm';
8
+ import { kaizenGradings, kaizenVerifiedCombos } from '../../db/schema.js';
9
+ function rowToKaizenGrading(row) {
10
+ return {
11
+ id: row.id,
12
+ executionId: row.execution_id,
13
+ blockId: row.block_id,
14
+ stepIndex: row.step_index,
15
+ agentKind: row.agent_kind,
16
+ model: row.model,
17
+ promptVersion: row.prompt_version,
18
+ comboKey: row.combo_key,
19
+ status: row.status,
20
+ grade: row.grade,
21
+ summary: row.summary,
22
+ recommendations: parseJsonArray(row.recommendations ?? '[]'),
23
+ graderModel: row.grader_model,
24
+ error: row.error,
25
+ createdAt: row.created_at,
26
+ updatedAt: row.updated_at,
27
+ };
28
+ }
29
+ /**
30
+ * Kaizen gradings over Postgres (the Drizzle mirror of the Worker's
31
+ * `D1KaizenGradingRepository`, migration 0015). One row per (run, step); recommendations
32
+ * are a JSON array. The unique (execution_id, step_index) index keeps scheduling
33
+ * idempotent across durable re-drives.
34
+ */
35
+ export class DrizzleKaizenGradingRepository {
36
+ db;
37
+ constructor(db) {
38
+ this.db = db;
39
+ }
40
+ async upsert(workspaceId, grading) {
41
+ const values = {
42
+ workspace_id: workspaceId,
43
+ id: grading.id,
44
+ execution_id: grading.executionId,
45
+ block_id: grading.blockId,
46
+ step_index: grading.stepIndex,
47
+ agent_kind: grading.agentKind,
48
+ model: grading.model,
49
+ prompt_version: grading.promptVersion,
50
+ combo_key: grading.comboKey,
51
+ status: grading.status,
52
+ grade: grading.grade,
53
+ summary: grading.summary,
54
+ recommendations: JSON.stringify(grading.recommendations),
55
+ grader_model: grading.graderModel,
56
+ error: grading.error,
57
+ created_at: grading.createdAt,
58
+ updated_at: grading.updatedAt,
59
+ };
60
+ await this.db
61
+ .insert(kaizenGradings)
62
+ .values(values)
63
+ .onConflictDoUpdate({
64
+ target: [kaizenGradings.workspace_id, kaizenGradings.id],
65
+ set: {
66
+ status: values.status,
67
+ grade: values.grade,
68
+ summary: values.summary,
69
+ recommendations: values.recommendations,
70
+ grader_model: values.grader_model,
71
+ error: values.error,
72
+ updated_at: values.updated_at,
73
+ },
74
+ });
75
+ }
76
+ async get(workspaceId, id) {
77
+ const rows = await this.db
78
+ .select()
79
+ .from(kaizenGradings)
80
+ .where(and(eq(kaizenGradings.workspace_id, workspaceId), eq(kaizenGradings.id, id)))
81
+ .limit(1);
82
+ return rows[0] ? rowToKaizenGrading(rows[0]) : null;
83
+ }
84
+ async getByStep(workspaceId, executionId, stepIndex) {
85
+ const rows = await this.db
86
+ .select()
87
+ .from(kaizenGradings)
88
+ .where(and(eq(kaizenGradings.workspace_id, workspaceId), eq(kaizenGradings.execution_id, executionId), eq(kaizenGradings.step_index, stepIndex)))
89
+ .limit(1);
90
+ return rows[0] ? rowToKaizenGrading(rows[0]) : null;
91
+ }
92
+ async listByExecution(workspaceId, executionId) {
93
+ const rows = await this.db
94
+ .select()
95
+ .from(kaizenGradings)
96
+ .where(and(eq(kaizenGradings.workspace_id, workspaceId), eq(kaizenGradings.execution_id, executionId)))
97
+ .orderBy(kaizenGradings.step_index);
98
+ return rows.map(rowToKaizenGrading);
99
+ }
100
+ async listByWorkspace(workspaceId, limit = 200) {
101
+ const rows = await this.db
102
+ .select()
103
+ .from(kaizenGradings)
104
+ .where(eq(kaizenGradings.workspace_id, workspaceId))
105
+ .orderBy(desc(kaizenGradings.created_at))
106
+ .limit(limit);
107
+ return rows.map(rowToKaizenGrading);
108
+ }
109
+ async listPending(staleBefore, limit) {
110
+ const rows = await this.db
111
+ .select()
112
+ .from(kaizenGradings)
113
+ .where(or(eq(kaizenGradings.status, 'scheduled'), and(eq(kaizenGradings.status, 'running'), lt(kaizenGradings.updated_at, staleBefore))))
114
+ .orderBy(kaizenGradings.updated_at)
115
+ .limit(limit);
116
+ return rows.map((row) => ({ workspaceId: row.workspace_id, grading: rowToKaizenGrading(row) }));
117
+ }
118
+ async claim(workspaceId, id, staleBefore, now) {
119
+ // Conditional flip to `running`: succeeds only if the row is still claimable (the same
120
+ // predicate listPending selects on), so concurrent sweep passes can't both win it.
121
+ const claimed = await this.db
122
+ .update(kaizenGradings)
123
+ .set({ status: 'running', updated_at: now })
124
+ .where(and(eq(kaizenGradings.workspace_id, workspaceId), eq(kaizenGradings.id, id), or(eq(kaizenGradings.status, 'scheduled'), and(eq(kaizenGradings.status, 'running'), lt(kaizenGradings.updated_at, staleBefore)))))
125
+ .returning({ id: kaizenGradings.id });
126
+ return claimed.length > 0;
127
+ }
128
+ }
129
+ function rowToKaizenVerifiedCombo(row) {
130
+ return {
131
+ comboKey: row.combo_key,
132
+ agentKind: row.agent_kind,
133
+ model: row.model,
134
+ promptVersion: row.prompt_version,
135
+ consecutiveHighGrades: row.consecutive_high_grades,
136
+ verified: row.verified === 1,
137
+ verifiedAt: row.verified_at,
138
+ updatedAt: row.updated_at,
139
+ };
140
+ }
141
+ /**
142
+ * Kaizen verified-combo progress over Postgres (the Drizzle mirror of the Worker's
143
+ * `D1KaizenVerifiedComboRepository`, migration 0015).
144
+ */
145
+ export class DrizzleKaizenVerifiedComboRepository {
146
+ db;
147
+ constructor(db) {
148
+ this.db = db;
149
+ }
150
+ async getByKey(workspaceId, comboKey) {
151
+ const rows = await this.db
152
+ .select()
153
+ .from(kaizenVerifiedCombos)
154
+ .where(and(eq(kaizenVerifiedCombos.workspace_id, workspaceId), eq(kaizenVerifiedCombos.combo_key, comboKey)))
155
+ .limit(1);
156
+ return rows[0] ? rowToKaizenVerifiedCombo(rows[0]) : null;
157
+ }
158
+ async upsert(workspaceId, combo) {
159
+ const values = {
160
+ workspace_id: workspaceId,
161
+ combo_key: combo.comboKey,
162
+ agent_kind: combo.agentKind,
163
+ model: combo.model,
164
+ prompt_version: combo.promptVersion,
165
+ consecutive_high_grades: combo.consecutiveHighGrades,
166
+ verified: combo.verified ? 1 : 0,
167
+ verified_at: combo.verifiedAt,
168
+ updated_at: combo.updatedAt,
169
+ };
170
+ await this.db
171
+ .insert(kaizenVerifiedCombos)
172
+ .values(values)
173
+ .onConflictDoUpdate({
174
+ target: [kaizenVerifiedCombos.workspace_id, kaizenVerifiedCombos.combo_key],
175
+ set: {
176
+ consecutive_high_grades: values.consecutive_high_grades,
177
+ verified: values.verified,
178
+ verified_at: values.verified_at,
179
+ updated_at: values.updated_at,
180
+ },
181
+ });
182
+ }
183
+ async listByWorkspace(workspaceId) {
184
+ const rows = await this.db
185
+ .select()
186
+ .from(kaizenVerifiedCombos)
187
+ .where(eq(kaizenVerifiedCombos.workspace_id, workspaceId))
188
+ .orderBy(desc(kaizenVerifiedCombos.updated_at));
189
+ return rows.map(rowToKaizenVerifiedCombo);
190
+ }
191
+ }
192
+ //# sourceMappingURL=kaizen.js.map