@cat-factory/node-server 0.95.2 → 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.
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +16 -5
- package/dist/container.js.map +1 -1
- package/dist/repositories/drizzle/_shared.d.ts +2 -0
- package/dist/repositories/drizzle/_shared.d.ts.map +1 -0
- package/dist/repositories/drizzle/_shared.js +11 -0
- package/dist/repositories/drizzle/_shared.js.map +1 -0
- package/dist/repositories/drizzle/accounts.d.ts +62 -0
- package/dist/repositories/drizzle/accounts.d.ts.map +1 -0
- package/dist/repositories/drizzle/accounts.js +438 -0
- package/dist/repositories/drizzle/accounts.js.map +1 -0
- package/dist/repositories/drizzle/board.d.ts +74 -0
- package/dist/repositories/drizzle/board.d.ts.map +1 -0
- package/dist/repositories/drizzle/board.js +489 -0
- package/dist/repositories/drizzle/board.js.map +1 -0
- package/dist/repositories/drizzle/connections.d.ts +84 -0
- package/dist/repositories/drizzle/connections.d.ts.map +1 -0
- package/dist/repositories/drizzle/connections.js +391 -0
- package/dist/repositories/drizzle/connections.js.map +1 -0
- package/dist/repositories/drizzle/execution.d.ts +58 -0
- package/dist/repositories/drizzle/execution.d.ts.map +1 -0
- package/dist/repositories/drizzle/execution.js +585 -0
- package/dist/repositories/drizzle/execution.js.map +1 -0
- package/dist/repositories/drizzle/initiatives.d.ts +54 -0
- package/dist/repositories/drizzle/initiatives.d.ts.map +1 -0
- package/dist/repositories/drizzle/initiatives.js +343 -0
- package/dist/repositories/drizzle/initiatives.js.map +1 -0
- package/dist/repositories/drizzle/kaizen.d.ts +34 -0
- package/dist/repositories/drizzle/kaizen.d.ts.map +1 -0
- package/dist/repositories/drizzle/kaizen.js +192 -0
- package/dist/repositories/drizzle/kaizen.js.map +1 -0
- package/dist/repositories/drizzle/reviews.d.ts +75 -0
- package/dist/repositories/drizzle/reviews.d.ts.map +1 -0
- package/dist/repositories/drizzle/reviews.js +449 -0
- package/dist/repositories/drizzle/reviews.js.map +1 -0
- package/dist/repositories/drizzle/sandbox.d.ts +61 -0
- package/dist/repositories/drizzle/sandbox.d.ts.map +1 -0
- package/dist/repositories/drizzle/sandbox.js +370 -0
- package/dist/repositories/drizzle/sandbox.js.map +1 -0
- package/dist/repositories/drizzle/settings.d.ts +76 -0
- package/dist/repositories/drizzle/settings.d.ts.map +1 -0
- package/dist/repositories/drizzle/settings.js +377 -0
- package/dist/repositories/drizzle/settings.js.map +1 -0
- package/dist/repositories/drizzle/telemetry.d.ts +60 -0
- package/dist/repositories/drizzle/telemetry.d.ts.map +1 -0
- package/dist/repositories/drizzle/telemetry.js +559 -0
- package/dist/repositories/drizzle/telemetry.js.map +1 -0
- package/dist/repositories/drizzle.d.ts +6 -113
- package/dist/repositories/drizzle.d.ts.map +1 -1
- package/dist/repositories/drizzle.js +20 -4118
- package/dist/repositories/drizzle.js.map +1 -1
- package/package.json +7 -7
|
@@ -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
|