@cat-factory/worker 0.197.1 → 0.198.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/infrastructure/repositories/D1KaizenGradingRepository.d.ts +17 -1
- package/dist/infrastructure/repositories/D1KaizenGradingRepository.d.ts.map +1 -1
- package/dist/infrastructure/repositories/D1KaizenGradingRepository.js +79 -3
- package/dist/infrastructure/repositories/D1KaizenGradingRepository.js.map +1 -1
- package/dist/infrastructure/repositories/D1KaizenVerifiedComboRepository.d.ts +1 -0
- package/dist/infrastructure/repositories/D1KaizenVerifiedComboRepository.d.ts.map +1 -1
- package/dist/infrastructure/repositories/D1KaizenVerifiedComboRepository.js +16 -0
- package/dist/infrastructure/repositories/D1KaizenVerifiedComboRepository.js.map +1 -1
- package/migrations/0095_kaizen_acknowledgement.sql +27 -0
- package/package.json +19 -19
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { KaizenGradingRepository } from '@cat-factory/kernel';
|
|
2
|
-
import type { KaizenGrading } from '@cat-factory/contracts';
|
|
2
|
+
import type { KaizenGrading, KaizenGradingStatus } from '@cat-factory/contracts';
|
|
3
3
|
import type { D1Database } from '@cloudflare/workers-types';
|
|
4
4
|
/**
|
|
5
5
|
* Kaizen gradings, one row per `(run, step)` in `kaizen_gradings` (migration 0015).
|
|
@@ -16,6 +16,22 @@ export declare class D1KaizenGradingRepository implements KaizenGradingRepositor
|
|
|
16
16
|
getByStep(workspaceId: string, executionId: string, stepIndex: number): Promise<KaizenGrading | null>;
|
|
17
17
|
listByExecution(workspaceId: string, executionId: string): Promise<KaizenGrading[]>;
|
|
18
18
|
listByWorkspace(workspaceId: string, limit?: number): Promise<KaizenGrading[]>;
|
|
19
|
+
listPage(workspaceId: string, opts: {
|
|
20
|
+
limit: number;
|
|
21
|
+
cursor?: {
|
|
22
|
+
createdAt: number;
|
|
23
|
+
id: string;
|
|
24
|
+
};
|
|
25
|
+
acknowledged?: boolean;
|
|
26
|
+
settled?: boolean;
|
|
27
|
+
status?: KaizenGradingStatus;
|
|
28
|
+
agentKind?: string;
|
|
29
|
+
since?: number;
|
|
30
|
+
}): Promise<KaizenGrading[]>;
|
|
31
|
+
setAcknowledgement(workspaceId: string, id: string, ack: {
|
|
32
|
+
by: string | null;
|
|
33
|
+
note: string | null;
|
|
34
|
+
} | null, now: number): Promise<KaizenGrading | null>;
|
|
19
35
|
listPending(staleBefore: number, limit: number): Promise<{
|
|
20
36
|
workspaceId: string;
|
|
21
37
|
grading: KaizenGrading;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"D1KaizenGradingRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1KaizenGradingRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"D1KaizenGradingRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1KaizenGradingRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAElE,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAChF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA2D3D;;;;GAIG;AACH,qBAAa,yBAA0B,YAAW,uBAAuB;IACvE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CvE;IAEK,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAMxE;IAEK,SAAS,CACb,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAS/B;IAEK,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAUxF;IAEK,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAUhF;IAEK,QAAQ,CACZ,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,CAAC,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,CAAA;QAC1C,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,MAAM,CAAC,EAAE,mBAAmB,CAAA;QAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,GACA,OAAO,CAAC,aAAa,EAAE,CAAC,CAyC1B;IAEK,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,MAAM,EACV,GAAG,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,EACtD,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA+B/B;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,CAY/F;CACF"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { KAIZEN_SETTLED_STATUSES } from '@cat-factory/contracts';
|
|
1
2
|
function parseStringArray(raw) {
|
|
2
3
|
if (!raw)
|
|
3
4
|
return [];
|
|
@@ -25,6 +26,9 @@ function rowToGrading(row) {
|
|
|
25
26
|
recommendations: parseStringArray(row.recommendations),
|
|
26
27
|
graderModel: row.grader_model,
|
|
27
28
|
error: row.error,
|
|
29
|
+
acknowledgedAt: row.acknowledged_at,
|
|
30
|
+
acknowledgedBy: row.acknowledged_by,
|
|
31
|
+
acknowledgementNote: row.acknowledgement_note,
|
|
28
32
|
createdAt: row.created_at,
|
|
29
33
|
updatedAt: row.updated_at,
|
|
30
34
|
};
|
|
@@ -40,12 +44,15 @@ export class D1KaizenGradingRepository {
|
|
|
40
44
|
this.db = db;
|
|
41
45
|
}
|
|
42
46
|
async upsert(workspaceId, grading) {
|
|
47
|
+
// The acknowledgement columns are set on INSERT and deliberately absent from the conflict SET
|
|
48
|
+
// list: the sweep re-writes this row on every grader transition, and folding them in would
|
|
49
|
+
// erase a triage the moment a grading was re-run. `setAcknowledgement` is their only writer.
|
|
43
50
|
await this.db
|
|
44
51
|
.prepare(`INSERT INTO kaizen_gradings
|
|
45
52
|
(workspace_id, id, execution_id, block_id, step_index, agent_kind, model,
|
|
46
53
|
prompt_version, combo_key, status, grade, summary, recommendations, grader_model,
|
|
47
|
-
error, created_at, updated_at)
|
|
48
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
54
|
+
error, acknowledged_at, acknowledged_by, acknowledgement_note, created_at, updated_at)
|
|
55
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
49
56
|
ON CONFLICT (workspace_id, id) DO UPDATE SET
|
|
50
57
|
status = excluded.status,
|
|
51
58
|
grade = excluded.grade,
|
|
@@ -54,7 +61,7 @@ export class D1KaizenGradingRepository {
|
|
|
54
61
|
grader_model = excluded.grader_model,
|
|
55
62
|
error = excluded.error,
|
|
56
63
|
updated_at = excluded.updated_at`)
|
|
57
|
-
.bind(workspaceId, grading.id, grading.executionId, grading.blockId, grading.stepIndex, grading.agentKind, grading.model, grading.promptVersion, grading.comboKey, grading.status, grading.grade, grading.summary, JSON.stringify(grading.recommendations), grading.graderModel, grading.error, grading.createdAt, grading.updatedAt)
|
|
64
|
+
.bind(workspaceId, grading.id, grading.executionId, grading.blockId, grading.stepIndex, grading.agentKind, grading.model, grading.promptVersion, grading.comboKey, grading.status, grading.grade, grading.summary, JSON.stringify(grading.recommendations), grading.graderModel, grading.error, grading.acknowledgedAt, grading.acknowledgedBy, grading.acknowledgementNote, grading.createdAt, grading.updatedAt)
|
|
58
65
|
.run();
|
|
59
66
|
}
|
|
60
67
|
async get(workspaceId, id) {
|
|
@@ -90,6 +97,75 @@ export class D1KaizenGradingRepository {
|
|
|
90
97
|
.all();
|
|
91
98
|
return (results ?? []).map(rowToGrading);
|
|
92
99
|
}
|
|
100
|
+
async listPage(workspaceId, opts) {
|
|
101
|
+
const where = ['workspace_id = ?'];
|
|
102
|
+
const binds = [workspaceId];
|
|
103
|
+
if (opts.cursor) {
|
|
104
|
+
// The keyset is the composite the ORDER BY uses, so gradings sharing a millisecond (every
|
|
105
|
+
// step of one run is scheduled at once) page without losing the ties.
|
|
106
|
+
where.push('(created_at < ? OR (created_at = ? AND id < ?))');
|
|
107
|
+
binds.push(opts.cursor.createdAt, opts.cursor.createdAt, opts.cursor.id);
|
|
108
|
+
}
|
|
109
|
+
if (opts.acknowledged !== undefined) {
|
|
110
|
+
where.push(opts.acknowledged ? 'acknowledged_at IS NOT NULL' : 'acknowledged_at IS NULL');
|
|
111
|
+
}
|
|
112
|
+
if (opts.settled !== undefined) {
|
|
113
|
+
// The same set the acknowledge write is gated on, from the same constant, so the backlog a
|
|
114
|
+
// caller drains and the rows that write accepts cannot drift apart.
|
|
115
|
+
const settled = KAIZEN_SETTLED_STATUSES.map(() => '?').join(', ');
|
|
116
|
+
where.push(`status ${opts.settled ? 'IN' : 'NOT IN'} (${settled})`);
|
|
117
|
+
binds.push(...KAIZEN_SETTLED_STATUSES);
|
|
118
|
+
}
|
|
119
|
+
if (opts.status) {
|
|
120
|
+
where.push('status = ?');
|
|
121
|
+
binds.push(opts.status);
|
|
122
|
+
}
|
|
123
|
+
if (opts.agentKind) {
|
|
124
|
+
where.push('agent_kind = ?');
|
|
125
|
+
binds.push(opts.agentKind);
|
|
126
|
+
}
|
|
127
|
+
if (opts.since !== undefined) {
|
|
128
|
+
where.push('created_at >= ?');
|
|
129
|
+
binds.push(opts.since);
|
|
130
|
+
}
|
|
131
|
+
binds.push(opts.limit);
|
|
132
|
+
const { results } = await this.db
|
|
133
|
+
.prepare(`SELECT * FROM kaizen_gradings
|
|
134
|
+
WHERE ${where.join(' AND ')}
|
|
135
|
+
ORDER BY created_at DESC, id DESC LIMIT ?`)
|
|
136
|
+
.bind(...binds)
|
|
137
|
+
.all();
|
|
138
|
+
return (results ?? []).map(rowToGrading);
|
|
139
|
+
}
|
|
140
|
+
async setAcknowledgement(workspaceId, id, ack, now) {
|
|
141
|
+
if (ack) {
|
|
142
|
+
// Guarded in the statement rather than by a pre-check: `acknowledged_at IS NULL` makes a
|
|
143
|
+
// repeat acknowledgement a no-op (so the stamp keeps naming the FIRST triage), and the status
|
|
144
|
+
// list refuses a row the grader is still working on, with no window between check and write.
|
|
145
|
+
// `updated_at` moves with it, so a consumer watermarking on it sees triage state change.
|
|
146
|
+
const settled = KAIZEN_SETTLED_STATUSES.map(() => '?').join(', ');
|
|
147
|
+
await this.db
|
|
148
|
+
.prepare(`UPDATE kaizen_gradings
|
|
149
|
+
SET acknowledged_at = ?, acknowledged_by = ?, acknowledgement_note = ?, updated_at = ?
|
|
150
|
+
WHERE workspace_id = ? AND id = ? AND acknowledged_at IS NULL
|
|
151
|
+
AND status IN (${settled})`)
|
|
152
|
+
.bind(now, ack.by, ack.note, now, workspaceId, id, ...KAIZEN_SETTLED_STATUSES)
|
|
153
|
+
.run();
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
// Guarded on there being an acknowledgement to clear, so clearing one that was never
|
|
157
|
+
// recorded writes nothing at all rather than touching `updated_at` on a row (a `running`
|
|
158
|
+
// grading, say) whose staleness stamp the sweep reads to decide what to re-drive.
|
|
159
|
+
await this.db
|
|
160
|
+
.prepare(`UPDATE kaizen_gradings
|
|
161
|
+
SET acknowledged_at = NULL, acknowledged_by = NULL, acknowledgement_note = NULL,
|
|
162
|
+
updated_at = ?
|
|
163
|
+
WHERE workspace_id = ? AND id = ? AND acknowledged_at IS NOT NULL`)
|
|
164
|
+
.bind(now, workspaceId, id)
|
|
165
|
+
.run();
|
|
166
|
+
}
|
|
167
|
+
return this.get(workspaceId, id);
|
|
168
|
+
}
|
|
93
169
|
async listPending(staleBefore, limit) {
|
|
94
170
|
const { results } = await this.db
|
|
95
171
|
.prepare(`SELECT * FROM kaizen_gradings
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"D1KaizenGradingRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1KaizenGradingRepository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"D1KaizenGradingRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1KaizenGradingRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AA2BhE,SAAS,gBAAgB,CAAC,GAAkB;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAqB;IACzC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,MAAM,EAAE,GAAG,CAAC,MAA6B;QACzC,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,eAAe,EAAE,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC;QACtD,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,cAAc,EAAE,GAAG,CAAC,eAAe;QACnC,cAAc,EAAE,GAAG,CAAC,eAAe;QACnC,mBAAmB,EAAE,GAAG,CAAC,oBAAoB;QAC7C,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,yBAAyB;IACnB,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,WAAmB,EAAE,OAAsB;QACtD,8FAA8F;QAC9F,2FAA2F;QAC3F,6FAA6F;QAC7F,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;;;;;;;;;;;4CAYoC,CACrC;aACA,IAAI,CACH,WAAW,EACX,OAAO,CAAC,EAAE,EACV,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,OAAO,EACf,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,EACvC,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,mBAAmB,EAC3B,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,SAAS,CAClB;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,WAAmB,EAAE,EAAU;QACvC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,iEAAiE,CAAC;aAC1E,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;aACrB,KAAK,EAAoB,CAAA;QAC5B,OAAO,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,SAAS,CACb,WAAmB,EACnB,WAAmB,EACnB,SAAiB;QAEjB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN;0EACkE,CACnE;aACA,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC;aACzC,KAAK,EAAoB,CAAA;QAC5B,OAAO,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,WAAmB,EAAE,WAAmB;QAC5D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CACN;;mCAE2B,CAC5B;aACA,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC;aAC9B,GAAG,EAAoB,CAAA;QAC1B,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,WAAmB,EAAE,KAAK,GAAG,GAAG;QACpD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CACN;;4CAEoC,CACrC;aACA,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;aACxB,GAAG,EAAoB,CAAA;QAC1B,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,WAAmB,EACnB,IAQC;QAED,MAAM,KAAK,GAAG,CAAC,kBAAkB,CAAC,CAAA;QAClC,MAAM,KAAK,GAAwB,CAAC,WAAW,CAAC,CAAA;QAChD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,0FAA0F;YAC1F,sEAAsE;YACtE,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;YAC7D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC1E,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAA;QAC3F,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,2FAA2F;YAC3F,oEAAoE;YACpE,MAAM,OAAO,GAAG,uBAAuB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACjE,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,GAAG,CAAC,CAAA;YACnE,KAAK,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,CAAA;QACxC,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC5B,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YAC7B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACtB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CACN;mBACW,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;qDACe,CAC9C;aACA,IAAI,CAAC,GAAG,KAAK,CAAC;aACd,GAAG,EAAoB,CAAA;QAC1B,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,WAAmB,EACnB,EAAU,EACV,GAAsD,EACtD,GAAW;QAEX,IAAI,GAAG,EAAE,CAAC;YACR,yFAAyF;YACzF,8FAA8F;YAC9F,6FAA6F;YAC7F,yFAAyF;YACzF,MAAM,OAAO,GAAG,uBAAuB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACjE,MAAM,IAAI,CAAC,EAAE;iBACV,OAAO,CACN;;;gCAGsB,OAAO,GAAG,CACjC;iBACA,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG,uBAAuB,CAAC;iBAC7E,GAAG,EAAE,CAAA;QACV,CAAC;aAAM,CAAC;YACN,qFAAqF;YACrF,yFAAyF;YACzF,kFAAkF;YAClF,MAAM,IAAI,CAAC,EAAE;iBACV,OAAO,CACN;;;+EAGqE,CACtE;iBACA,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,CAAC;iBAC1B,GAAG,EAAE,CAAA;QACV,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,WAAW,CACf,WAAmB,EACnB,KAAa;QAEb,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CACN;;2CAEmC,CACpC;aACA,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;aACxB,GAAG,EAAoB,CAAA;QAC1B,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACnC,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC;SAC3B,CAAC,CAAC,CAAA;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,WAAmB,EAAE,EAAU,EAAE,WAAmB,EAAE,GAAW;QAC3E,uFAAuF;QACvF,mFAAmF;QACnF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC3B,OAAO,CACN;;mFAE2E,CAC5E;aACA,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,CAAC;aACvC,GAAG,EAAE,CAAA;QACR,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC;CACF"}
|
|
@@ -13,6 +13,7 @@ export declare class D1KaizenVerifiedComboRepository implements KaizenVerifiedCo
|
|
|
13
13
|
db: D1Database;
|
|
14
14
|
});
|
|
15
15
|
getByKey(workspaceId: string, comboKey: string): Promise<KaizenVerifiedCombo | null>;
|
|
16
|
+
listByKeys(workspaceId: string, comboKeys: string[]): Promise<KaizenVerifiedCombo[]>;
|
|
16
17
|
upsert(workspaceId: string, combo: KaizenVerifiedCombo): Promise<void>;
|
|
17
18
|
listByWorkspace(workspaceId: string): Promise<KaizenVerifiedCombo[]>;
|
|
18
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"D1KaizenVerifiedComboRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1KaizenVerifiedComboRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAA;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"D1KaizenVerifiedComboRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1KaizenVerifiedComboRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAA;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA4B3D;;;;;GAKG;AACH,qBAAa,+BAAgC,YAAW,6BAA6B;IACnF,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAMzF;IAEK,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAezF;IAEK,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB3E;IAEK,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAUzE;CACF"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { chunkForIn } from './chunk';
|
|
1
2
|
function rowToCombo(row) {
|
|
2
3
|
return {
|
|
3
4
|
comboKey: row.combo_key,
|
|
@@ -28,6 +29,21 @@ export class D1KaizenVerifiedComboRepository {
|
|
|
28
29
|
.first();
|
|
29
30
|
return row ? rowToCombo(row) : null;
|
|
30
31
|
}
|
|
32
|
+
async listByKeys(workspaceId, comboKeys) {
|
|
33
|
+
const wanted = [...new Set(comboKeys)];
|
|
34
|
+
if (wanted.length === 0)
|
|
35
|
+
return [];
|
|
36
|
+
const out = [];
|
|
37
|
+
for (const chunk of chunkForIn(wanted)) {
|
|
38
|
+
const { results } = await this.db
|
|
39
|
+
.prepare(`SELECT * FROM kaizen_verified_combos
|
|
40
|
+
WHERE workspace_id = ? AND combo_key IN (${chunk.map(() => '?').join(', ')})`)
|
|
41
|
+
.bind(workspaceId, ...chunk)
|
|
42
|
+
.all();
|
|
43
|
+
out.push(...(results ?? []).map(rowToCombo));
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
31
47
|
async upsert(workspaceId, combo) {
|
|
32
48
|
await this.db
|
|
33
49
|
.prepare(`INSERT INTO kaizen_verified_combos
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"D1KaizenVerifiedComboRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1KaizenVerifiedComboRepository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"D1KaizenVerifiedComboRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1KaizenVerifiedComboRepository.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAcpC,SAAS,UAAU,CAAC,GAA2B;IAC7C,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,qBAAqB,EAAE,GAAG,CAAC,uBAAuB;QAClD,QAAQ,EAAE,GAAG,CAAC,QAAQ,KAAK,CAAC;QAC5B,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,+BAA+B;IACzB,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,WAAmB,EAAE,QAAgB;QAClD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,+EAA+E,CAAC;aACxF,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;aAC3B,KAAK,EAA0B,CAAA;QAClC,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,SAAmB;QACvD,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;QACtC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QAClC,MAAM,GAAG,GAA0B,EAAE,CAAA;QACrC,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;iBAC9B,OAAO,CACN;wDAC8C,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACjF;iBACA,IAAI,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC;iBAC3B,GAAG,EAA0B,CAAA;YAChC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAA;QAC9C,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,WAAmB,EAAE,KAA0B;QAC1D,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;;;;;;;4CAQoC,CACrC;aACA,IAAI,CACH,WAAW,EACX,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,qBAAqB,EAC3B,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACtB,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,CAChB;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,WAAmB;QACvC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CACN;;oCAE4B,CAC7B;aACA,IAAI,CAAC,WAAW,CAAC;aACjB,GAAG,EAA0B,CAAA;QAChC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACxC,CAAC;CACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
-- Acknowledgement state on a Kaizen grading, plus the index its public list pages on.
|
|
2
|
+
--
|
|
3
|
+
-- A grading records how an agent step went and what to change about it. Until now nothing recorded
|
|
4
|
+
-- whether anyone had READ one, so the only way to consume them was a bounded newest-first history
|
|
5
|
+
-- that re-reports the same rows on every look. `GET /api/v1/kaizen/entries?acknowledged=false` is
|
|
6
|
+
-- the backlog that replaces it, and these columns are what takes an entry out of it.
|
|
7
|
+
--
|
|
8
|
+
-- `acknowledged_at`: epoch ms of the FIRST acknowledgement (a repeat leaves it alone, so it
|
|
9
|
+
-- names when the entry was triaged rather than when a retry last fired).
|
|
10
|
+
-- `acknowledged_by`: the actor: a user id when the acting key is bound to a person, else the
|
|
11
|
+
-- public-API key id, so a follow-up has somebody to go back to.
|
|
12
|
+
-- `acknowledgement_note`: what the acknowledger wanted the next reader to know (a ticket id, why
|
|
13
|
+
-- it was dismissed).
|
|
14
|
+
--
|
|
15
|
+
-- All three are nullable with no default: unacknowledged is the state every existing row is in, and
|
|
16
|
+
-- writing them is never part of the grading sweep's upsert.
|
|
17
|
+
--
|
|
18
|
+
-- The index serves the list's `(workspace_id, created_at DESC, id DESC)` ordering. The existing
|
|
19
|
+
-- indexes cover the run window (workspace + execution) and the sweep (status + updated_at); neither
|
|
20
|
+
-- helps a workspace-wide chronological page.
|
|
21
|
+
|
|
22
|
+
ALTER TABLE kaizen_gradings ADD COLUMN acknowledged_at INTEGER;
|
|
23
|
+
ALTER TABLE kaizen_gradings ADD COLUMN acknowledged_by TEXT;
|
|
24
|
+
ALTER TABLE kaizen_gradings ADD COLUMN acknowledgement_note TEXT;
|
|
25
|
+
|
|
26
|
+
CREATE INDEX idx_kaizen_gradings_workspace_created
|
|
27
|
+
ON kaizen_gradings(workspace_id, created_at);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/worker",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.198.1",
|
|
4
4
|
"description": "Reusable Cloudflare Worker library (Hono + D1) exposing the Agent Architecture Board core: the `createApp()` Hono factory, the default fetch/scheduled/queue handler, and the Durable Object + Workflow classes. Deployments (see deploy/backend) supply the wrangler.toml + config and re-export these.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -43,23 +43,23 @@
|
|
|
43
43
|
"pino": "^10.3.1",
|
|
44
44
|
"valibot": "^1.4.2",
|
|
45
45
|
"workers-ai-provider": "^4.0.0",
|
|
46
|
-
"@cat-factory/agents": "0.
|
|
47
|
-
"@cat-factory/binary-generators": "0.
|
|
48
|
-
"@cat-factory/caching": "0.20.
|
|
49
|
-
"@cat-factory/consensus": "0.16.
|
|
50
|
-
"@cat-factory/contracts": "0.
|
|
51
|
-
"@cat-factory/eks": "0.1.
|
|
52
|
-
"@cat-factory/gates": "0.
|
|
53
|
-
"@cat-factory/gitlab": "0.
|
|
54
|
-
"@cat-factory/integrations": "0.
|
|
55
|
-
"@cat-factory/kernel": "0.
|
|
56
|
-
"@cat-factory/observability-langfuse": "0.
|
|
57
|
-
"@cat-factory/observability-otel": "0.
|
|
58
|
-
"@cat-factory/orchestration": "0.
|
|
59
|
-
"@cat-factory/prompt-fragments": "1.0.
|
|
60
|
-
"@cat-factory/provider-cloudflare": "0.7.
|
|
61
|
-
"@cat-factory/server": "0.
|
|
62
|
-
"@cat-factory/spend": "0.16.
|
|
46
|
+
"@cat-factory/agents": "0.138.0",
|
|
47
|
+
"@cat-factory/binary-generators": "0.3.0",
|
|
48
|
+
"@cat-factory/caching": "0.20.34",
|
|
49
|
+
"@cat-factory/consensus": "0.16.34",
|
|
50
|
+
"@cat-factory/contracts": "0.322.0",
|
|
51
|
+
"@cat-factory/eks": "0.1.338",
|
|
52
|
+
"@cat-factory/gates": "0.11.0",
|
|
53
|
+
"@cat-factory/gitlab": "0.22.0",
|
|
54
|
+
"@cat-factory/integrations": "0.166.0",
|
|
55
|
+
"@cat-factory/kernel": "0.313.0",
|
|
56
|
+
"@cat-factory/observability-langfuse": "0.11.0",
|
|
57
|
+
"@cat-factory/observability-otel": "0.22.0",
|
|
58
|
+
"@cat-factory/orchestration": "0.282.0",
|
|
59
|
+
"@cat-factory/prompt-fragments": "1.0.89",
|
|
60
|
+
"@cat-factory/provider-cloudflare": "0.7.487",
|
|
61
|
+
"@cat-factory/server": "0.298.0",
|
|
62
|
+
"@cat-factory/spend": "0.16.5"
|
|
63
63
|
},
|
|
64
64
|
"devDependencies": {
|
|
65
65
|
"@cloudflare/vitest-pool-workers": "^0.21.2",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"typescript": "7.0.2",
|
|
68
68
|
"vitest": "^4.1.10",
|
|
69
69
|
"wrangler": "^4.122.0",
|
|
70
|
-
"@cat-factory/conformance": "0.45.
|
|
70
|
+
"@cat-factory/conformance": "0.45.16"
|
|
71
71
|
},
|
|
72
72
|
"scripts": {
|
|
73
73
|
"build": "tsc -b tsconfig.build.json",
|