@nt-ai-lab/deterministic-agent-workflow-event-store 0.3.2 → 0.3.3
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/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/platform/domain/sqlite-event-store.d.ts +5 -1
- package/dist/platform/domain/sqlite-event-store.js +92 -1
- package/dist/platform/domain/sqlite-review-storage.d.ts +92 -0
- package/dist/platform/domain/sqlite-review-storage.js +132 -0
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -2,3 +2,4 @@ export type { SqliteEventStore } from './platform/domain/sqlite-event-store';
|
|
|
2
2
|
export { createStore, resolveSessionId, } from './platform/domain/sqlite-event-store';
|
|
3
3
|
export type { SqliteDatabase, SqliteStatement, } from './platform/infra/external-clients/sqlite/sqlite-runtime';
|
|
4
4
|
export { enableWalMode, openSqliteDatabase, } from './platform/infra/external-clients/sqlite/sqlite-runtime';
|
|
5
|
+
export { buildReviewFilters } from './platform/domain/sqlite-review-storage';
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { createStore, resolveSessionId, } from './platform/domain/sqlite-event-store.js';
|
|
2
2
|
export { enableWalMode, openSqliteDatabase, } from './platform/infra/external-clients/sqlite/sqlite-runtime.js';
|
|
3
|
+
export { buildReviewFilters } from './platform/domain/sqlite-review-storage.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RecordReflectionInput, StoredEvent, StoredReflection } from '@nt-ai-lab/deterministic-agent-workflow-engine';
|
|
1
|
+
import type { ListedReview, RecordReviewInput, RecordReflectionInput, ReviewFilters, StoredEvent, StoredReflection, StoredReview } from '@nt-ai-lab/deterministic-agent-workflow-engine';
|
|
2
2
|
import { type SqliteDatabase } from '../infra/external-clients/sqlite/sqlite-runtime';
|
|
3
3
|
/** @riviere-role value-object */
|
|
4
4
|
export type SqliteEventStore = {
|
|
@@ -8,6 +8,10 @@ export type SqliteEventStore = {
|
|
|
8
8
|
readonly hasSessionStarted: (sessionId: string) => boolean;
|
|
9
9
|
readonly recordReflection: (sessionId: string, createdAt: string, input: RecordReflectionInput) => StoredReflection;
|
|
10
10
|
readonly listReflections: (sessionId: string) => readonly StoredReflection[];
|
|
11
|
+
readonly recordReview: (sessionId: string, createdAt: string, input: RecordReviewInput) => StoredReview;
|
|
12
|
+
readonly recordReviewWithEvent: (sessionId: string, createdAt: string, input: RecordReviewInput, eventState: string) => StoredReview;
|
|
13
|
+
readonly listSessionReviews: (sessionId: string) => readonly StoredReview[];
|
|
14
|
+
readonly listReviews: (filters: ReviewFilters) => readonly ListedReview[];
|
|
11
15
|
readonly listSessions: () => readonly string[];
|
|
12
16
|
readonly db: SqliteDatabase;
|
|
13
17
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { recordReflectionInputSchema, storedReflectionSchema, stripEnvelopeKeys, WorkflowStateError, } from '@nt-ai-lab/deterministic-agent-workflow-engine';
|
|
2
|
+
import { recordReviewInputSchema, recordReflectionInputSchema, storedReflectionSchema, storedReviewSchema, stripEnvelopeKeys, WorkflowStateError, } from '@nt-ai-lab/deterministic-agent-workflow-engine';
|
|
3
3
|
import { enableWalMode, openSqliteDatabase, } from '../infra/external-clients/sqlite/sqlite-runtime.js';
|
|
4
|
+
import { buildReviewFilters, createReviewsBranchIndexSql, createReviewsPullRequestIndexSql, createReviewsSessionIndexSql, createReviewsTableSql, createReviewsTypeVerdictIndexSql, listedReviewRowsSchema, parseListedReviewRow, parseStoredReviewRow, reviewIdRowSchema, reviewRowsSchema, } from './sqlite-review-storage.js';
|
|
4
5
|
const createTableSql = `
|
|
5
6
|
CREATE TABLE IF NOT EXISTS events (
|
|
6
7
|
seq INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
@@ -53,6 +54,11 @@ export function createStore(dbPath) {
|
|
|
53
54
|
db.exec(createTableSql);
|
|
54
55
|
db.exec(createReflectionsTableSql);
|
|
55
56
|
db.exec(createReflectionsIndexSql);
|
|
57
|
+
db.exec(createReviewsTableSql);
|
|
58
|
+
db.exec(createReviewsSessionIndexSql);
|
|
59
|
+
db.exec(createReviewsTypeVerdictIndexSql);
|
|
60
|
+
db.exec(createReviewsBranchIndexSql);
|
|
61
|
+
db.exec(createReviewsPullRequestIndexSql);
|
|
56
62
|
ensureStateColumn(db);
|
|
57
63
|
return {
|
|
58
64
|
db,
|
|
@@ -124,6 +130,91 @@ export function createStore(dbPath) {
|
|
|
124
130
|
});
|
|
125
131
|
});
|
|
126
132
|
},
|
|
133
|
+
recordReview(sessionId, createdAt, input) {
|
|
134
|
+
const parsedInput = recordReviewInputSchema.parse(input);
|
|
135
|
+
const insert = db.prepare('INSERT INTO reviews (session_id, created_at, review_type, verdict, branch, pull_request_number, source_state, payload_json) VALUES (?, ?, ?, ?, ?, ?, ?, ?)');
|
|
136
|
+
db.exec('BEGIN IMMEDIATE');
|
|
137
|
+
try {
|
|
138
|
+
insert.run(sessionId, createdAt, parsedInput.reviewType, parsedInput.verdict, parsedInput.branch ?? null, parsedInput.pullRequestNumber ?? null, parsedInput.sourceState ?? null, JSON.stringify(parsedInput));
|
|
139
|
+
const rawId = db.prepare('SELECT last_insert_rowid() AS id').get();
|
|
140
|
+
const parsedId = reviewIdRowSchema.parse(rawId);
|
|
141
|
+
const id = Number(parsedId.id);
|
|
142
|
+
db.exec('COMMIT');
|
|
143
|
+
return storedReviewSchema.parse({
|
|
144
|
+
id,
|
|
145
|
+
sessionId,
|
|
146
|
+
createdAt,
|
|
147
|
+
...parsedInput,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
db.exec('ROLLBACK');
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
recordReviewWithEvent(sessionId, createdAt, input, eventState) {
|
|
156
|
+
const parsedInput = recordReviewInputSchema.parse(input);
|
|
157
|
+
const insertReview = db.prepare('INSERT INTO reviews (session_id, created_at, review_type, verdict, branch, pull_request_number, source_state, payload_json) VALUES (?, ?, ?, ?, ?, ?, ?, ?)');
|
|
158
|
+
const insertEvent = db.prepare('INSERT INTO events (session_id, type, at, state, payload) VALUES (?, ?, ?, ?, ?)');
|
|
159
|
+
db.exec('BEGIN IMMEDIATE');
|
|
160
|
+
try {
|
|
161
|
+
insertReview.run(sessionId, createdAt, parsedInput.reviewType, parsedInput.verdict, parsedInput.branch ?? null, parsedInput.pullRequestNumber ?? null, parsedInput.sourceState ?? null, JSON.stringify(parsedInput));
|
|
162
|
+
const rawId = db.prepare('SELECT last_insert_rowid() AS id').get();
|
|
163
|
+
const parsedId = reviewIdRowSchema.parse(rawId);
|
|
164
|
+
const id = Number(parsedId.id);
|
|
165
|
+
insertEvent.run(sessionId, 'review-recorded', createdAt, eventState, JSON.stringify({
|
|
166
|
+
reviewId: id,
|
|
167
|
+
reviewType: parsedInput.reviewType,
|
|
168
|
+
verdict: parsedInput.verdict,
|
|
169
|
+
}));
|
|
170
|
+
db.exec('COMMIT');
|
|
171
|
+
return storedReviewSchema.parse({
|
|
172
|
+
id,
|
|
173
|
+
sessionId,
|
|
174
|
+
createdAt,
|
|
175
|
+
...parsedInput,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
db.exec('ROLLBACK');
|
|
180
|
+
throw error;
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
listSessionReviews(sessionId) {
|
|
184
|
+
const rawRows = db.prepare('SELECT id, session_id, created_at, review_type, verdict, branch, pull_request_number, source_state, payload_json FROM reviews WHERE session_id = ? ORDER BY created_at ASC, id ASC').all(sessionId);
|
|
185
|
+
const rows = reviewRowsSchema.parse(rawRows);
|
|
186
|
+
return rows.map(parseStoredReviewRow);
|
|
187
|
+
},
|
|
188
|
+
listReviews(filters) {
|
|
189
|
+
const parsedFilters = buildReviewFilters(filters);
|
|
190
|
+
const whereClause = parsedFilters.conditions.length === 0
|
|
191
|
+
? ''
|
|
192
|
+
: `WHERE ${parsedFilters.conditions.join(' AND ')}`;
|
|
193
|
+
const rawRows = db.prepare(`
|
|
194
|
+
SELECT
|
|
195
|
+
reviews.id,
|
|
196
|
+
reviews.session_id,
|
|
197
|
+
reviews.created_at,
|
|
198
|
+
reviews.review_type,
|
|
199
|
+
reviews.verdict,
|
|
200
|
+
reviews.branch,
|
|
201
|
+
reviews.pull_request_number,
|
|
202
|
+
reviews.source_state,
|
|
203
|
+
reviews.payload_json,
|
|
204
|
+
(
|
|
205
|
+
SELECT json_extract(events.payload, '$.repository')
|
|
206
|
+
FROM events
|
|
207
|
+
WHERE events.session_id = reviews.session_id AND events.type = 'session-started'
|
|
208
|
+
ORDER BY events.seq ASC
|
|
209
|
+
LIMIT 1
|
|
210
|
+
) AS repository
|
|
211
|
+
FROM reviews
|
|
212
|
+
${whereClause}
|
|
213
|
+
ORDER BY reviews.created_at DESC, reviews.id DESC
|
|
214
|
+
`).all(...parsedFilters.parameters);
|
|
215
|
+
const rows = listedReviewRowsSchema.parse(rawRows);
|
|
216
|
+
return rows.map(parseListedReviewRow);
|
|
217
|
+
},
|
|
127
218
|
listSessions() {
|
|
128
219
|
const rawRows = db.prepare('SELECT session_id FROM events GROUP BY session_id ORDER BY MIN(seq)').all();
|
|
129
220
|
return rowWithSessionIdSchema.parse(rawRows).map((row) => row.session_id);
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ListedReview, ReviewFilters, StoredReview } from '@nt-ai-lab/deterministic-agent-workflow-engine';
|
|
3
|
+
export declare const createReviewsTableSql = "\n CREATE TABLE IF NOT EXISTS reviews (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL,\n created_at TEXT NOT NULL,\n review_type TEXT NOT NULL,\n verdict TEXT NOT NULL,\n branch TEXT,\n pull_request_number INTEGER,\n source_state TEXT,\n payload_json TEXT NOT NULL\n )\n";
|
|
4
|
+
export declare const createReviewsSessionIndexSql = "\n CREATE INDEX IF NOT EXISTS idx_reviews_session_created_at\n ON reviews (session_id, created_at ASC, id ASC)\n";
|
|
5
|
+
export declare const createReviewsTypeVerdictIndexSql = "\n CREATE INDEX IF NOT EXISTS idx_reviews_type_verdict\n ON reviews (review_type, verdict)\n";
|
|
6
|
+
export declare const createReviewsBranchIndexSql = "\n CREATE INDEX IF NOT EXISTS idx_reviews_branch\n ON reviews (branch)\n";
|
|
7
|
+
export declare const createReviewsPullRequestIndexSql = "\n CREATE INDEX IF NOT EXISTS idx_reviews_pull_request_number\n ON reviews (pull_request_number)\n";
|
|
8
|
+
export declare const reviewIdRowSchema: z.ZodObject<{
|
|
9
|
+
id: z.ZodUnion<[z.ZodNumber, z.ZodBigInt, z.ZodString]>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
id: string | number | bigint;
|
|
12
|
+
}, {
|
|
13
|
+
id: string | number | bigint;
|
|
14
|
+
}>;
|
|
15
|
+
export declare const reviewRowsSchema: z.ZodArray<z.ZodObject<{
|
|
16
|
+
id: z.ZodNumber;
|
|
17
|
+
session_id: z.ZodString;
|
|
18
|
+
created_at: z.ZodString;
|
|
19
|
+
review_type: z.ZodString;
|
|
20
|
+
verdict: z.ZodString;
|
|
21
|
+
branch: z.ZodNullable<z.ZodString>;
|
|
22
|
+
pull_request_number: z.ZodNullable<z.ZodNumber>;
|
|
23
|
+
source_state: z.ZodNullable<z.ZodString>;
|
|
24
|
+
payload_json: z.ZodString;
|
|
25
|
+
}, "strip", z.ZodTypeAny, {
|
|
26
|
+
id: number;
|
|
27
|
+
session_id: string;
|
|
28
|
+
created_at: string;
|
|
29
|
+
review_type: string;
|
|
30
|
+
verdict: string;
|
|
31
|
+
branch: string | null;
|
|
32
|
+
pull_request_number: number | null;
|
|
33
|
+
source_state: string | null;
|
|
34
|
+
payload_json: string;
|
|
35
|
+
}, {
|
|
36
|
+
id: number;
|
|
37
|
+
session_id: string;
|
|
38
|
+
created_at: string;
|
|
39
|
+
review_type: string;
|
|
40
|
+
verdict: string;
|
|
41
|
+
branch: string | null;
|
|
42
|
+
pull_request_number: number | null;
|
|
43
|
+
source_state: string | null;
|
|
44
|
+
payload_json: string;
|
|
45
|
+
}>, "many">;
|
|
46
|
+
export declare const listedReviewRowsSchema: z.ZodArray<z.ZodObject<{
|
|
47
|
+
id: z.ZodNumber;
|
|
48
|
+
session_id: z.ZodString;
|
|
49
|
+
created_at: z.ZodString;
|
|
50
|
+
review_type: z.ZodString;
|
|
51
|
+
verdict: z.ZodString;
|
|
52
|
+
branch: z.ZodNullable<z.ZodString>;
|
|
53
|
+
pull_request_number: z.ZodNullable<z.ZodNumber>;
|
|
54
|
+
source_state: z.ZodNullable<z.ZodString>;
|
|
55
|
+
payload_json: z.ZodString;
|
|
56
|
+
repository: z.ZodNullable<z.ZodString>;
|
|
57
|
+
}, "strip", z.ZodTypeAny, {
|
|
58
|
+
id: number;
|
|
59
|
+
session_id: string;
|
|
60
|
+
created_at: string;
|
|
61
|
+
review_type: string;
|
|
62
|
+
verdict: string;
|
|
63
|
+
branch: string | null;
|
|
64
|
+
pull_request_number: number | null;
|
|
65
|
+
source_state: string | null;
|
|
66
|
+
payload_json: string;
|
|
67
|
+
repository: string | null;
|
|
68
|
+
}, {
|
|
69
|
+
id: number;
|
|
70
|
+
session_id: string;
|
|
71
|
+
created_at: string;
|
|
72
|
+
review_type: string;
|
|
73
|
+
verdict: string;
|
|
74
|
+
branch: string | null;
|
|
75
|
+
pull_request_number: number | null;
|
|
76
|
+
source_state: string | null;
|
|
77
|
+
payload_json: string;
|
|
78
|
+
repository: string | null;
|
|
79
|
+
}>, "many">;
|
|
80
|
+
/** @riviere-role value-object */
|
|
81
|
+
export type ReviewRow = z.infer<typeof reviewRowsSchema>[number];
|
|
82
|
+
/** @riviere-role value-object */
|
|
83
|
+
export type ListedReviewRow = z.infer<typeof listedReviewRowsSchema>[number];
|
|
84
|
+
/** @riviere-role domain-service */
|
|
85
|
+
export declare function buildReviewFilters(filters: ReviewFilters): {
|
|
86
|
+
readonly conditions: ReadonlyArray<string>;
|
|
87
|
+
readonly parameters: ReadonlyArray<string | number>;
|
|
88
|
+
};
|
|
89
|
+
/** @riviere-role domain-service */
|
|
90
|
+
export declare function parseStoredReviewRow(row: ReviewRow): StoredReview;
|
|
91
|
+
/** @riviere-role domain-service */
|
|
92
|
+
export declare function parseListedReviewRow(row: ListedReviewRow): ListedReview;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { listedReviewSchema, recordReviewInputSchema, reviewFiltersSchema, storedReviewSchema, } from '@nt-ai-lab/deterministic-agent-workflow-engine';
|
|
3
|
+
export const createReviewsTableSql = `
|
|
4
|
+
CREATE TABLE IF NOT EXISTS reviews (
|
|
5
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
6
|
+
session_id TEXT NOT NULL,
|
|
7
|
+
created_at TEXT NOT NULL,
|
|
8
|
+
review_type TEXT NOT NULL,
|
|
9
|
+
verdict TEXT NOT NULL,
|
|
10
|
+
branch TEXT,
|
|
11
|
+
pull_request_number INTEGER,
|
|
12
|
+
source_state TEXT,
|
|
13
|
+
payload_json TEXT NOT NULL
|
|
14
|
+
)
|
|
15
|
+
`;
|
|
16
|
+
export const createReviewsSessionIndexSql = `
|
|
17
|
+
CREATE INDEX IF NOT EXISTS idx_reviews_session_created_at
|
|
18
|
+
ON reviews (session_id, created_at ASC, id ASC)
|
|
19
|
+
`;
|
|
20
|
+
export const createReviewsTypeVerdictIndexSql = `
|
|
21
|
+
CREATE INDEX IF NOT EXISTS idx_reviews_type_verdict
|
|
22
|
+
ON reviews (review_type, verdict)
|
|
23
|
+
`;
|
|
24
|
+
export const createReviewsBranchIndexSql = `
|
|
25
|
+
CREATE INDEX IF NOT EXISTS idx_reviews_branch
|
|
26
|
+
ON reviews (branch)
|
|
27
|
+
`;
|
|
28
|
+
export const createReviewsPullRequestIndexSql = `
|
|
29
|
+
CREATE INDEX IF NOT EXISTS idx_reviews_pull_request_number
|
|
30
|
+
ON reviews (pull_request_number)
|
|
31
|
+
`;
|
|
32
|
+
export const reviewIdRowSchema = z.object({ id: z.union([z.number(), z.bigint(), z.string()]) });
|
|
33
|
+
export const reviewRowsSchema = z.array(z.object({
|
|
34
|
+
id: z.number(),
|
|
35
|
+
session_id: z.string(),
|
|
36
|
+
created_at: z.string(),
|
|
37
|
+
review_type: z.string(),
|
|
38
|
+
verdict: z.string(),
|
|
39
|
+
branch: z.string().nullable(),
|
|
40
|
+
pull_request_number: z.number().nullable(),
|
|
41
|
+
source_state: z.string().nullable(),
|
|
42
|
+
payload_json: z.string(),
|
|
43
|
+
}));
|
|
44
|
+
export const listedReviewRowsSchema = z.array(z.object({
|
|
45
|
+
id: z.number(),
|
|
46
|
+
session_id: z.string(),
|
|
47
|
+
created_at: z.string(),
|
|
48
|
+
review_type: z.string(),
|
|
49
|
+
verdict: z.string(),
|
|
50
|
+
branch: z.string().nullable(),
|
|
51
|
+
pull_request_number: z.number().nullable(),
|
|
52
|
+
source_state: z.string().nullable(),
|
|
53
|
+
payload_json: z.string(),
|
|
54
|
+
repository: z.string().nullable(),
|
|
55
|
+
}));
|
|
56
|
+
const persistedReviewPayloadSchema = recordReviewInputSchema.passthrough();
|
|
57
|
+
/** @riviere-role domain-service */
|
|
58
|
+
export function buildReviewFilters(filters) {
|
|
59
|
+
const parsed = reviewFiltersSchema.parse(filters);
|
|
60
|
+
const conditions = [];
|
|
61
|
+
const parameters = [];
|
|
62
|
+
if (parsed.repository !== undefined) {
|
|
63
|
+
conditions.push(`(
|
|
64
|
+
SELECT json_extract(events.payload, '$.repository')
|
|
65
|
+
FROM events
|
|
66
|
+
WHERE events.session_id = reviews.session_id AND events.type = 'session-started'
|
|
67
|
+
ORDER BY events.seq ASC
|
|
68
|
+
LIMIT 1
|
|
69
|
+
) = ?`);
|
|
70
|
+
parameters.push(parsed.repository);
|
|
71
|
+
}
|
|
72
|
+
if (parsed.branch !== undefined) {
|
|
73
|
+
conditions.push('reviews.branch = ?');
|
|
74
|
+
parameters.push(parsed.branch);
|
|
75
|
+
}
|
|
76
|
+
if (parsed.pullRequestNumber !== undefined) {
|
|
77
|
+
conditions.push('reviews.pull_request_number = ?');
|
|
78
|
+
parameters.push(parsed.pullRequestNumber);
|
|
79
|
+
}
|
|
80
|
+
if (parsed.reviewType !== undefined) {
|
|
81
|
+
conditions.push('reviews.review_type = ?');
|
|
82
|
+
parameters.push(parsed.reviewType);
|
|
83
|
+
}
|
|
84
|
+
if (parsed.verdict !== undefined) {
|
|
85
|
+
conditions.push('reviews.verdict = ?');
|
|
86
|
+
parameters.push(parsed.verdict);
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
conditions,
|
|
90
|
+
parameters,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** @riviere-role domain-service */
|
|
94
|
+
export function parseStoredReviewRow(row) {
|
|
95
|
+
const parsedPayload = JSON.parse(row.payload_json);
|
|
96
|
+
return storedReviewSchema.parse({
|
|
97
|
+
...parseReviewPayload(parsedPayload),
|
|
98
|
+
id: row.id,
|
|
99
|
+
sessionId: row.session_id,
|
|
100
|
+
createdAt: row.created_at,
|
|
101
|
+
reviewType: row.review_type,
|
|
102
|
+
verdict: row.verdict,
|
|
103
|
+
...(row.branch === null ? {} : { branch: row.branch }),
|
|
104
|
+
...(row.pull_request_number === null ? {} : { pullRequestNumber: row.pull_request_number }),
|
|
105
|
+
...(row.source_state === null ? {} : { sourceState: row.source_state }),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/** @riviere-role domain-service */
|
|
109
|
+
export function parseListedReviewRow(row) {
|
|
110
|
+
const parsedPayload = JSON.parse(row.payload_json);
|
|
111
|
+
return listedReviewSchema.parse({
|
|
112
|
+
...parseReviewPayload(parsedPayload),
|
|
113
|
+
id: row.id,
|
|
114
|
+
sessionId: row.session_id,
|
|
115
|
+
createdAt: row.created_at,
|
|
116
|
+
reviewType: row.review_type,
|
|
117
|
+
verdict: row.verdict,
|
|
118
|
+
...(row.branch === null ? {} : { branch: row.branch }),
|
|
119
|
+
...(row.pull_request_number === null ? {} : { pullRequestNumber: row.pull_request_number }),
|
|
120
|
+
...(row.source_state === null ? {} : { sourceState: row.source_state }),
|
|
121
|
+
...(row.repository === null ? {} : { repository: row.repository }),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
function parseReviewPayload(payload) {
|
|
125
|
+
const parsed = persistedReviewPayloadSchema.parse(payload);
|
|
126
|
+
return {
|
|
127
|
+
findings: parsed.findings,
|
|
128
|
+
...(parsed.summary === undefined ? {} : { summary: parsed.summary }),
|
|
129
|
+
...(parsed.branch === undefined ? {} : { branch: parsed.branch }),
|
|
130
|
+
...(parsed.pullRequestNumber === undefined ? {} : { pullRequestNumber: parsed.pullRequestNumber }),
|
|
131
|
+
};
|
|
132
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nt-ai-lab/deterministic-agent-workflow-event-store",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
],
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"zod": "^3.25.76",
|
|
15
|
-
"@nt-ai-lab/deterministic-agent-workflow-engine": "0.3.
|
|
15
|
+
"@nt-ai-lab/deterministic-agent-workflow-engine": "0.3.3"
|
|
16
16
|
},
|
|
17
17
|
"publishConfig": {
|
|
18
18
|
"access": "public"
|