@massa-ai/core 1.52.0 → 1.54.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/data/handoff/handoff-contract.d.ts +16 -0
- package/dist/data/handoff/handoff-contract.d.ts.map +1 -1
- package/dist/data/handoff/handoff-contract.js +23 -0
- package/dist/data/handoff/handoff-contract.js.map +1 -1
- package/dist/data/handoff/handoff-repository-pg.d.ts +17 -1
- package/dist/data/handoff/handoff-repository-pg.d.ts.map +1 -1
- package/dist/data/handoff/handoff-repository-pg.js +63 -0
- package/dist/data/handoff/handoff-repository-pg.js.map +1 -1
- package/dist/data/proposal/proposal-contract.d.ts +24 -0
- package/dist/data/proposal/proposal-contract.d.ts.map +1 -1
- package/dist/data/proposal/proposal-contract.js +36 -0
- package/dist/data/proposal/proposal-contract.js.map +1 -1
- package/dist/data/proposal/proposal-payload-validation.d.ts +54 -0
- package/dist/data/proposal/proposal-payload-validation.d.ts.map +1 -0
- package/dist/data/proposal/proposal-payload-validation.js +106 -0
- package/dist/data/proposal/proposal-payload-validation.js.map +1 -0
- package/dist/data/proposal/proposal-repository-pg.d.ts +27 -1
- package/dist/data/proposal/proposal-repository-pg.d.ts.map +1 -1
- package/dist/data/proposal/proposal-repository-pg.js +92 -31
- package/dist/data/proposal/proposal-repository-pg.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/services/handoff/handoff-service.d.ts +46 -2
- package/dist/services/handoff/handoff-service.d.ts.map +1 -1
- package/dist/services/handoff/handoff-service.js +81 -2
- package/dist/services/handoff/handoff-service.js.map +1 -1
- package/package.json +2 -2
|
@@ -13,11 +13,25 @@ export interface HandoffRecord {
|
|
|
13
13
|
createdAt: number;
|
|
14
14
|
acceptedAt: number | null;
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* The five fields `update` is allowed to touch (AC-01.1/AC-01.3). `status`
|
|
18
|
+
* and `acceptedAt` are deliberately absent — they stay exclusively
|
|
19
|
+
* `setStatus`'s, a paired write this store has no corruption guard for.
|
|
20
|
+
*/
|
|
21
|
+
export interface HandoffUpdatePatch {
|
|
22
|
+
targetAgent?: string | null;
|
|
23
|
+
summary?: string;
|
|
24
|
+
openQuestions?: string[];
|
|
25
|
+
nextSteps?: string[];
|
|
26
|
+
files?: string[];
|
|
27
|
+
}
|
|
16
28
|
export interface HandoffStore {
|
|
17
29
|
insert(h: HandoffRecord): Promise<void>;
|
|
18
30
|
getById(id: string): Promise<HandoffRecord | null>;
|
|
19
31
|
listPending(projectId: string, targetAgent?: string | null): Promise<HandoffRecord[]>;
|
|
20
32
|
setStatus(id: string, status: "accepted" | "expired", acceptedAt?: number): Promise<HandoffRecord | null>;
|
|
33
|
+
update(id: string, patch: HandoffUpdatePatch): Promise<HandoffRecord | null>;
|
|
34
|
+
delete(id: string): Promise<string | null>;
|
|
21
35
|
journalMode(): Promise<string>;
|
|
22
36
|
}
|
|
23
37
|
/** Test double; never selected by production factory. */
|
|
@@ -27,6 +41,8 @@ export declare class MemoryHandoffStore implements HandoffStore {
|
|
|
27
41
|
getById(id: string): Promise<HandoffRecord | null>;
|
|
28
42
|
listPending(projectId: string, targetAgent?: string | null): Promise<HandoffRecord[]>;
|
|
29
43
|
setStatus(id: string, status: "accepted" | "expired", acceptedAt?: number): Promise<HandoffRecord | null>;
|
|
44
|
+
update(id: string, patch: HandoffUpdatePatch): Promise<HandoffRecord | null>;
|
|
45
|
+
delete(id: string): Promise<string | null>;
|
|
30
46
|
journalMode(): Promise<string>;
|
|
31
47
|
}
|
|
32
48
|
//# sourceMappingURL=handoff-contract.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handoff-contract.d.ts","sourceRoot":"","sources":["../../../src/data/handoff/handoff-contract.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,0CAA2C,CAAC;AACzE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9D,MAAM,WAAW,aAAa;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAAE;AAClR,MAAM,WAAW,YAAY;IAAG,MAAM,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAAC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAAE;
|
|
1
|
+
{"version":3,"file":"handoff-contract.d.ts","sourceRoot":"","sources":["../../../src/data/handoff/handoff-contract.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,0CAA2C,CAAC;AACzE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9D,MAAM,WAAW,aAAa;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAAE;AAClR;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IAAG,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAAE;AACxJ,MAAM,WAAW,YAAY;IAAG,MAAM,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAAC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAAE;AAC1d,yDAAyD;AACzD,qBAAa,kBAAmB,YAAW,YAAY;IAC9C,IAAI,EAAE,aAAa,EAAE,CAAM;IAC5B,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IACzC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAClD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IACrF,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IACzG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAU5E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAM1C,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;CACrC"}
|
|
@@ -7,6 +7,29 @@ export class MemoryHandoffStore {
|
|
|
7
7
|
async listPending(projectId, targetAgent) { return this.rows.filter((row) => row.projectId === projectId && row.status === "open" && (targetAgent == null || row.targetAgent === targetAgent || row.targetAgent == null)).sort((a, b) => a.createdAt - b.createdAt).map((row) => structuredClone(row)); }
|
|
8
8
|
async setStatus(id, status, acceptedAt) { const row = this.rows.find((item) => item.id === id); if (!row)
|
|
9
9
|
return null; row.status = status; row.acceptedAt = status === "accepted" ? acceptedAt ?? Date.now() : null; return structuredClone(row); }
|
|
10
|
+
async update(id, patch) {
|
|
11
|
+
const row = this.rows.find((item) => item.id === id);
|
|
12
|
+
if (!row)
|
|
13
|
+
return null;
|
|
14
|
+
if (patch.targetAgent !== undefined)
|
|
15
|
+
row.targetAgent = patch.targetAgent;
|
|
16
|
+
if (patch.summary !== undefined)
|
|
17
|
+
row.summary = patch.summary;
|
|
18
|
+
if (patch.openQuestions !== undefined)
|
|
19
|
+
row.openQuestions = patch.openQuestions;
|
|
20
|
+
if (patch.nextSteps !== undefined)
|
|
21
|
+
row.nextSteps = patch.nextSteps;
|
|
22
|
+
if (patch.files !== undefined)
|
|
23
|
+
row.files = patch.files;
|
|
24
|
+
return structuredClone(row);
|
|
25
|
+
}
|
|
26
|
+
async delete(id) {
|
|
27
|
+
const index = this.rows.findIndex((item) => item.id === id);
|
|
28
|
+
if (index === -1)
|
|
29
|
+
return null;
|
|
30
|
+
this.rows.splice(index, 1);
|
|
31
|
+
return id;
|
|
32
|
+
}
|
|
10
33
|
async journalMode() { return "memory"; }
|
|
11
34
|
}
|
|
12
35
|
//# sourceMappingURL=handoff-contract.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handoff-contract.js","sourceRoot":"","sources":["../../../src/data/handoff/handoff-contract.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"handoff-contract.js","sourceRoot":"","sources":["../../../src/data/handoff/handoff-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** PostgreSQL implementation of the durable asynchronous HandoffStore contract. */
|
|
2
2
|
import type { PrismaClient } from "../../generated/prisma/index.js";
|
|
3
|
-
import { type HandoffRecord, type HandoffStore } from "./handoff-contract.js";
|
|
3
|
+
import { type HandoffRecord, type HandoffStore, type HandoffUpdatePatch } from "./handoff-contract.js";
|
|
4
4
|
export declare class PgHandoffStore implements HandoffStore {
|
|
5
5
|
private prisma;
|
|
6
6
|
private mirror;
|
|
@@ -13,6 +13,22 @@ export declare class PgHandoffStore implements HandoffStore {
|
|
|
13
13
|
getById(id: string): Promise<HandoffRecord | null>;
|
|
14
14
|
listPending(projectId: string, targetAgent?: string | null): Promise<HandoffRecord[]>;
|
|
15
15
|
setStatus(id: string, status: "accepted" | "expired", acceptedAt?: number): Promise<HandoffRecord | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Writes only the five allowlisted columns (AC-01.1). `status` /
|
|
18
|
+
* `accepted_at` never appear in this SQL — they stay exclusively
|
|
19
|
+
* `setStatus`'s paired write (AC-01.3). Absent patch fields are re-written
|
|
20
|
+
* with their current mirror value rather than a partial `SET` list, which
|
|
21
|
+
* keeps the query static; the effect on the row is identical either way.
|
|
22
|
+
*/
|
|
23
|
+
update(id: string, patch: HandoffUpdatePatch): Promise<HandoffRecord | null>;
|
|
24
|
+
/**
|
|
25
|
+
* Hard-deletes in any status (AC-01.4). The DB's affected-row count is the
|
|
26
|
+
* source of truth for whether anything existed; the in-process mirror is
|
|
27
|
+
* only ever purged *after* that DB write succeeds, and it must be purged
|
|
28
|
+
* (D3) — omitting `mirror.delete` leaves this store instance serving the
|
|
29
|
+
* deleted row from memory for the rest of the process.
|
|
30
|
+
*/
|
|
31
|
+
delete(id: string): Promise<string | null>;
|
|
16
32
|
journalMode(): Promise<string>;
|
|
17
33
|
/** Internal verification hook for async persistence and restart tests. */
|
|
18
34
|
__hydrate(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handoff-repository-pg.d.ts","sourceRoot":"","sources":["../../../src/data/handoff/handoff-repository-pg.ts"],"names":[],"mappings":"AAAA,mFAAmF;AAEnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAOpE,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,YAAY,
|
|
1
|
+
{"version":3,"file":"handoff-repository-pg.d.ts","sourceRoot":"","sources":["../../../src/data/handoff/handoff-repository-pg.ts"],"names":[],"mappings":"AAAA,mFAAmF;AAEnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAOpE,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;AAwD/B,qBAAa,cAAe,YAAW,YAAY;IACjD,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAA8B;gBAEnC,MAAM,CAAC,EAAE,YAAY;IAIjC,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,cAAc;IAyBhB,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B5C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAMlD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAerF,SAAS,CACb,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAgChC;;;;;;OAMG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAmClF;;;;;;OAMG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAa1C,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAKpC,0EAA0E;IACpE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC,8EAA8E;IACxE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
|
@@ -161,6 +161,69 @@ export class PgHandoffStore {
|
|
|
161
161
|
this.mirror.set(id, persisted);
|
|
162
162
|
return structuredClone(persisted);
|
|
163
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* Writes only the five allowlisted columns (AC-01.1). `status` /
|
|
166
|
+
* `accepted_at` never appear in this SQL — they stay exclusively
|
|
167
|
+
* `setStatus`'s paired write (AC-01.3). Absent patch fields are re-written
|
|
168
|
+
* with their current mirror value rather than a partial `SET` list, which
|
|
169
|
+
* keeps the query static; the effect on the row is identical either way.
|
|
170
|
+
*/
|
|
171
|
+
async update(id, patch) {
|
|
172
|
+
await this.ensureHydrated();
|
|
173
|
+
const current = this.mirror.get(id);
|
|
174
|
+
if (!current)
|
|
175
|
+
return null;
|
|
176
|
+
const merged = {
|
|
177
|
+
...current,
|
|
178
|
+
...(patch.targetAgent !== undefined ? { targetAgent: patch.targetAgent } : {}),
|
|
179
|
+
...(patch.summary !== undefined ? { summary: patch.summary } : {}),
|
|
180
|
+
...(patch.openQuestions !== undefined ? { openQuestions: patch.openQuestions } : {}),
|
|
181
|
+
...(patch.nextSteps !== undefined ? { nextSteps: patch.nextSteps } : {}),
|
|
182
|
+
...(patch.files !== undefined ? { files: patch.files } : {}),
|
|
183
|
+
};
|
|
184
|
+
let rows;
|
|
185
|
+
try {
|
|
186
|
+
rows = await this.getClient().$queryRaw `
|
|
187
|
+
UPDATE handoffs
|
|
188
|
+
SET target_agent = ${merged.targetAgent}, summary = ${merged.summary},
|
|
189
|
+
open_questions_json = ${JSON.stringify(merged.openQuestions ?? [])},
|
|
190
|
+
next_steps_json = ${JSON.stringify(merged.nextSteps ?? [])},
|
|
191
|
+
files_json = ${JSON.stringify(merged.files ?? [])}
|
|
192
|
+
WHERE id = ${id}
|
|
193
|
+
RETURNING id, project_id, source_session_id, target_agent, summary,
|
|
194
|
+
open_questions_json, next_steps_json, files_json, status,
|
|
195
|
+
created_at, accepted_at`;
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
throw searchBackendUnavailable("handoff_store", error);
|
|
199
|
+
}
|
|
200
|
+
if (!rows[0])
|
|
201
|
+
return null;
|
|
202
|
+
const persisted = toRecord(rows[0]);
|
|
203
|
+
this.mirror.set(id, persisted);
|
|
204
|
+
return structuredClone(persisted);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Hard-deletes in any status (AC-01.4). The DB's affected-row count is the
|
|
208
|
+
* source of truth for whether anything existed; the in-process mirror is
|
|
209
|
+
* only ever purged *after* that DB write succeeds, and it must be purged
|
|
210
|
+
* (D3) — omitting `mirror.delete` leaves this store instance serving the
|
|
211
|
+
* deleted row from memory for the rest of the process.
|
|
212
|
+
*/
|
|
213
|
+
async delete(id) {
|
|
214
|
+
await this.ensureHydrated();
|
|
215
|
+
let affected;
|
|
216
|
+
try {
|
|
217
|
+
affected = await this.getClient().$executeRaw `DELETE FROM handoffs WHERE id = ${id}`;
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
throw searchBackendUnavailable("handoff_store", error);
|
|
221
|
+
}
|
|
222
|
+
if (affected === 0)
|
|
223
|
+
return null;
|
|
224
|
+
this.mirror.delete(id);
|
|
225
|
+
return id;
|
|
226
|
+
}
|
|
164
227
|
async journalMode() {
|
|
165
228
|
await this.ensureHydrated();
|
|
166
229
|
return "postgres";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handoff-repository-pg.js","sourceRoot":"","sources":["../../../src/data/handoff/handoff-repository-pg.ts"],"names":[],"mappings":"AAAA,mFAAmF;AAGnF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EACL,wBAAwB,EACxB,eAAe,GAChB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,gBAAgB,
|
|
1
|
+
{"version":3,"file":"handoff-repository-pg.js","sourceRoot":"","sources":["../../../src/data/handoff/handoff-repository-pg.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,11 +29,32 @@ export interface ProposalRecord {
|
|
|
29
29
|
createdAt: number;
|
|
30
30
|
decidedAt: number | null;
|
|
31
31
|
}
|
|
32
|
+
/** Input to `create` (AC-02.1): the store stamps `status: "pending"` and
|
|
33
|
+
* `decidedAt: null` itself — those two fields are never caller-supplied here,
|
|
34
|
+
* which is what keeps them out of reach of a manual `insert()` misuse. */
|
|
35
|
+
export interface ProposalCreateInput {
|
|
36
|
+
id: string;
|
|
37
|
+
projectId: string;
|
|
38
|
+
kind: ProposalKind;
|
|
39
|
+
payload: ProposalPayload;
|
|
40
|
+
rationale?: string;
|
|
41
|
+
targetMemoryId?: string | null;
|
|
42
|
+
createdAt?: number;
|
|
43
|
+
}
|
|
44
|
+
/** The two fields `update` is allowed to touch (AC-02.3/AC-02.4). `kind`,
|
|
45
|
+
* `targetMemoryId`, `status` and `decidedAt` are deliberately absent. */
|
|
46
|
+
export interface ProposalUpdatePatch {
|
|
47
|
+
rationale?: string;
|
|
48
|
+
payload?: ProposalPayload;
|
|
49
|
+
}
|
|
32
50
|
export interface ProposalStore {
|
|
33
51
|
insert(p: ProposalRecord): Promise<void>;
|
|
34
52
|
getById(id: string): Promise<ProposalRecord | null>;
|
|
35
53
|
listPending(projectId: string): Promise<ProposalRecord[]>;
|
|
36
54
|
setStatus(id: string, status: "approved" | "rejected", decidedAt?: number): Promise<ProposalRecord | null>;
|
|
55
|
+
create(input: ProposalCreateInput): Promise<ProposalRecord>;
|
|
56
|
+
update(id: string, patch: ProposalUpdatePatch): Promise<ProposalRecord | null>;
|
|
57
|
+
delete(id: string): Promise<string | null>;
|
|
37
58
|
journalMode(): Promise<string>;
|
|
38
59
|
}
|
|
39
60
|
export declare class MemoryProposalStore implements ProposalStore {
|
|
@@ -42,6 +63,9 @@ export declare class MemoryProposalStore implements ProposalStore {
|
|
|
42
63
|
getById(id: string): Promise<ProposalRecord | null>;
|
|
43
64
|
listPending(projectId: string): Promise<ProposalRecord[]>;
|
|
44
65
|
setStatus(id: string, status: "approved" | "rejected", decidedAt?: number): Promise<ProposalRecord | null>;
|
|
66
|
+
create(input: ProposalCreateInput): Promise<ProposalRecord>;
|
|
67
|
+
update(id: string, patch: ProposalUpdatePatch): Promise<ProposalRecord | null>;
|
|
68
|
+
delete(id: string): Promise<string | null>;
|
|
45
69
|
journalMode(): Promise<string>;
|
|
46
70
|
}
|
|
47
71
|
//# sourceMappingURL=proposal-contract.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposal-contract.d.ts","sourceRoot":"","sources":["../../../src/data/proposal/proposal-contract.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"proposal-contract.d.ts","sourceRoot":"","sources":["../../../src/data/proposal/proposal-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { assertValidProposalPayload } from "./proposal-payload-validation.js";
|
|
1
2
|
export const PROPOSAL_STATUSES = ["pending", "approved", "rejected"];
|
|
2
3
|
export const PROPOSAL_KINDS = ["memory.create", "memory.update", "memory.tag"];
|
|
3
4
|
export class MemoryProposalStore {
|
|
@@ -25,6 +26,41 @@ export class MemoryProposalStore {
|
|
|
25
26
|
row.decidedAt = decidedAt ?? Date.now();
|
|
26
27
|
return structuredClone(row);
|
|
27
28
|
}
|
|
29
|
+
async create(input) {
|
|
30
|
+
assertValidProposalPayload(input.kind, input.payload);
|
|
31
|
+
const record = {
|
|
32
|
+
id: input.id,
|
|
33
|
+
projectId: input.projectId,
|
|
34
|
+
kind: input.kind,
|
|
35
|
+
targetMemoryId: input.targetMemoryId ?? null,
|
|
36
|
+
payload: input.payload,
|
|
37
|
+
rationale: input.rationale ?? "",
|
|
38
|
+
status: "pending",
|
|
39
|
+
createdAt: input.createdAt ?? Date.now(),
|
|
40
|
+
decidedAt: null,
|
|
41
|
+
};
|
|
42
|
+
this.rows.push(structuredClone(record));
|
|
43
|
+
return structuredClone(record);
|
|
44
|
+
}
|
|
45
|
+
async update(id, patch) {
|
|
46
|
+
const row = this.rows.find((item) => item.id === id);
|
|
47
|
+
if (!row)
|
|
48
|
+
return null;
|
|
49
|
+
if (patch.payload !== undefined)
|
|
50
|
+
assertValidProposalPayload(row.kind, patch.payload);
|
|
51
|
+
if (patch.rationale !== undefined)
|
|
52
|
+
row.rationale = patch.rationale;
|
|
53
|
+
if (patch.payload !== undefined)
|
|
54
|
+
row.payload = patch.payload;
|
|
55
|
+
return structuredClone(row);
|
|
56
|
+
}
|
|
57
|
+
async delete(id) {
|
|
58
|
+
const index = this.rows.findIndex((item) => item.id === id);
|
|
59
|
+
if (index === -1)
|
|
60
|
+
return null;
|
|
61
|
+
this.rows.splice(index, 1);
|
|
62
|
+
return id;
|
|
63
|
+
}
|
|
28
64
|
async journalMode() {
|
|
29
65
|
return "memory";
|
|
30
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposal-contract.js","sourceRoot":"","sources":["../../../src/data/proposal/proposal-contract.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,CAAU,CAAC;AAE9E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,eAAe,EAAE,eAAe,EAAE,YAAY,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"proposal-contract.js","sourceRoot":"","sources":["../../../src/data/proposal/proposal-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-kind proposal payload validation — one table, two callers (D4).
|
|
3
|
+
*
|
|
4
|
+
* `proposal-repository-pg.ts`'s `parsePayload` already enforces this exact
|
|
5
|
+
* allowed-key/type set on **read**, throwing `storeCorruption` on deviation.
|
|
6
|
+
* `create`/`update` apply the identical rules on **write**, so a row cannot
|
|
7
|
+
* be written that its own reader will reject: a payload accepted at write
|
|
8
|
+
* time but rejected here on the next read would make every subsequent
|
|
9
|
+
* `getById`, `listPending` and `approve` on that row throw `storeCorruption`
|
|
10
|
+
* (AC-02.2). Two independent copies of this table drift, and the drift only
|
|
11
|
+
* ever surfaces as a corrupt row — so this module is the only place either
|
|
12
|
+
* caller may define it.
|
|
13
|
+
*/
|
|
14
|
+
import type { ProposalKind, ProposalPayload } from "./proposal-contract.js";
|
|
15
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
16
|
+
export declare function isStringArray(value: unknown): value is string[];
|
|
17
|
+
interface ProposalPayloadFieldRule {
|
|
18
|
+
optional: boolean;
|
|
19
|
+
validate: (value: unknown) => boolean;
|
|
20
|
+
}
|
|
21
|
+
interface ProposalPayloadRule {
|
|
22
|
+
allowedKeys: readonly string[];
|
|
23
|
+
/** memory.update has no columns of its own; an empty patch is refused. */
|
|
24
|
+
requireNonEmpty?: boolean;
|
|
25
|
+
fields: Record<string, ProposalPayloadFieldRule>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The single per-kind key/type table. Traced 1:1 against the validation
|
|
29
|
+
* `parsePayload` applied inline before extraction — see
|
|
30
|
+
* `proposal-repository-pg.ts`'s `parsePayload`, which now delegates here.
|
|
31
|
+
*/
|
|
32
|
+
export declare const PROPOSAL_PAYLOAD_RULES: Readonly<Record<ProposalKind, ProposalPayloadRule>>;
|
|
33
|
+
/**
|
|
34
|
+
* Applies `PROPOSAL_PAYLOAD_RULES` for `kind` against an already-parsed
|
|
35
|
+
* object. Pure predicate — no throwing — so both the read path (which wraps
|
|
36
|
+
* a `false` result in `storeCorruption`) and the write path (which wraps it
|
|
37
|
+
* in `ProposalPayloadValidationError`) can each apply their own error shape.
|
|
38
|
+
*/
|
|
39
|
+
export declare function isValidProposalPayload(kind: ProposalKind, value: Record<string, unknown>): boolean;
|
|
40
|
+
/** Write-side 400-shaped error — deliberately not `SearchServiceError`: the
|
|
41
|
+
* `data/` layer must not import from `services/`, and this is a client
|
|
42
|
+
* input-validation failure, not a backend or corruption failure. */
|
|
43
|
+
export declare class ProposalPayloadValidationError extends Error {
|
|
44
|
+
readonly kind: ProposalKind;
|
|
45
|
+
readonly statusCode = 400;
|
|
46
|
+
constructor(kind: ProposalKind, message: string);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Write-time gate (AC-02.2, AC-02.3): throws `ProposalPayloadValidationError`
|
|
50
|
+
* for exactly the payloads `parsePayload` would refuse on the next read.
|
|
51
|
+
*/
|
|
52
|
+
export declare function assertValidProposalPayload(kind: ProposalKind, value: unknown): asserts value is ProposalPayload;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=proposal-payload-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-payload-validation.d.ts","sourceRoot":"","sources":["../../../src/data/proposal/proposal-payload-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE5E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,EAAE,CAE/D;AAUD,UAAU,wBAAwB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CACvC;AAED,UAAU,mBAAmB;IAC3B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,0EAA0E;IAC1E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;CAClD;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,mBAAmB,CAAC,CA0BtF,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAaT;AAED;;oEAEoE;AACpE,qBAAa,8BAA+B,SAAQ,KAAK;aAGrC,IAAI,EAAE,YAAY;IAFpC,QAAQ,CAAC,UAAU,OAAO;gBAER,IAAI,EAAE,YAAY,EAClC,OAAO,EAAE,MAAM;CAKlB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,KAAK,IAAI,eAAe,CAalC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-kind proposal payload validation — one table, two callers (D4).
|
|
3
|
+
*
|
|
4
|
+
* `proposal-repository-pg.ts`'s `parsePayload` already enforces this exact
|
|
5
|
+
* allowed-key/type set on **read**, throwing `storeCorruption` on deviation.
|
|
6
|
+
* `create`/`update` apply the identical rules on **write**, so a row cannot
|
|
7
|
+
* be written that its own reader will reject: a payload accepted at write
|
|
8
|
+
* time but rejected here on the next read would make every subsequent
|
|
9
|
+
* `getById`, `listPending` and `approve` on that row throw `storeCorruption`
|
|
10
|
+
* (AC-02.2). Two independent copies of this table drift, and the drift only
|
|
11
|
+
* ever surfaces as a corrupt row — so this module is the only place either
|
|
12
|
+
* caller may define it.
|
|
13
|
+
*/
|
|
14
|
+
export function isRecord(value) {
|
|
15
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
16
|
+
}
|
|
17
|
+
export function isStringArray(value) {
|
|
18
|
+
return Array.isArray(value) && value.every((item) => typeof item === "string");
|
|
19
|
+
}
|
|
20
|
+
function isString(value) {
|
|
21
|
+
return typeof value === "string";
|
|
22
|
+
}
|
|
23
|
+
function isNumber(value) {
|
|
24
|
+
return typeof value === "number";
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The single per-kind key/type table. Traced 1:1 against the validation
|
|
28
|
+
* `parsePayload` applied inline before extraction — see
|
|
29
|
+
* `proposal-repository-pg.ts`'s `parsePayload`, which now delegates here.
|
|
30
|
+
*/
|
|
31
|
+
export const PROPOSAL_PAYLOAD_RULES = {
|
|
32
|
+
"memory.create": {
|
|
33
|
+
allowedKeys: ["content", "type", "level", "importance", "tags"],
|
|
34
|
+
fields: {
|
|
35
|
+
content: { optional: false, validate: isString },
|
|
36
|
+
type: { optional: true, validate: isString },
|
|
37
|
+
level: { optional: true, validate: isNumber },
|
|
38
|
+
importance: { optional: true, validate: isNumber },
|
|
39
|
+
tags: { optional: true, validate: isStringArray },
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
"memory.update": {
|
|
43
|
+
allowedKeys: ["content", "importance", "tags"],
|
|
44
|
+
requireNonEmpty: true,
|
|
45
|
+
fields: {
|
|
46
|
+
content: { optional: true, validate: isString },
|
|
47
|
+
importance: { optional: true, validate: isNumber },
|
|
48
|
+
tags: { optional: true, validate: isStringArray },
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
"memory.tag": {
|
|
52
|
+
allowedKeys: ["tags"],
|
|
53
|
+
fields: {
|
|
54
|
+
tags: { optional: false, validate: isStringArray },
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Applies `PROPOSAL_PAYLOAD_RULES` for `kind` against an already-parsed
|
|
60
|
+
* object. Pure predicate — no throwing — so both the read path (which wraps
|
|
61
|
+
* a `false` result in `storeCorruption`) and the write path (which wraps it
|
|
62
|
+
* in `ProposalPayloadValidationError`) can each apply their own error shape.
|
|
63
|
+
*/
|
|
64
|
+
export function isValidProposalPayload(kind, value) {
|
|
65
|
+
const rule = PROPOSAL_PAYLOAD_RULES[kind];
|
|
66
|
+
if (!Object.keys(value).every((key) => rule.allowedKeys.includes(key)))
|
|
67
|
+
return false;
|
|
68
|
+
if (rule.requireNonEmpty && Object.keys(value).length === 0)
|
|
69
|
+
return false;
|
|
70
|
+
for (const [field, fieldRule] of Object.entries(rule.fields)) {
|
|
71
|
+
const present = value[field] !== undefined;
|
|
72
|
+
if (!present) {
|
|
73
|
+
if (!fieldRule.optional)
|
|
74
|
+
return false;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (!fieldRule.validate(value[field]))
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
/** Write-side 400-shaped error — deliberately not `SearchServiceError`: the
|
|
83
|
+
* `data/` layer must not import from `services/`, and this is a client
|
|
84
|
+
* input-validation failure, not a backend or corruption failure. */
|
|
85
|
+
export class ProposalPayloadValidationError extends Error {
|
|
86
|
+
kind;
|
|
87
|
+
statusCode = 400;
|
|
88
|
+
constructor(kind, message) {
|
|
89
|
+
super(message);
|
|
90
|
+
this.kind = kind;
|
|
91
|
+
this.name = "ProposalPayloadValidationError";
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Write-time gate (AC-02.2, AC-02.3): throws `ProposalPayloadValidationError`
|
|
96
|
+
* for exactly the payloads `parsePayload` would refuse on the next read.
|
|
97
|
+
*/
|
|
98
|
+
export function assertValidProposalPayload(kind, value) {
|
|
99
|
+
if (!isRecord(value)) {
|
|
100
|
+
throw new ProposalPayloadValidationError(kind, `proposal payload must be an object for kind "${kind}"`);
|
|
101
|
+
}
|
|
102
|
+
if (!isValidProposalPayload(kind, value)) {
|
|
103
|
+
throw new ProposalPayloadValidationError(kind, `proposal payload is invalid for kind "${kind}"`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=proposal-payload-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-payload-validation.js","sourceRoot":"","sources":["../../../src/data/proposal/proposal-payload-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACnC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACnC,CAAC;AAcD;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAwD;IACzF,eAAe,EAAE;QACf,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC;QAC/D,MAAM,EAAE;YACN,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE;YAChD,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE;YAC5C,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE;YAC7C,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE;YAClD,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE;SAClD;KACF;IACD,eAAe,EAAE;QACf,WAAW,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC;QAC9C,eAAe,EAAE,IAAI;QACrB,MAAM,EAAE;YACN,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE;YAC/C,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE;YAClD,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE;SAClD;KACF;IACD,YAAY,EAAE;QACZ,WAAW,EAAE,CAAC,MAAM,CAAC;QACrB,MAAM,EAAE;YACN,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE;SACnD;KACF;CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAkB,EAClB,KAA8B;IAE9B,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrF,IAAI,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1E,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;QAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC;YACtC,SAAS;QACX,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACtD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;oEAEoE;AACpE,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IAGrC;IAFT,UAAU,GAAG,GAAG,CAAC;IAC1B,YACkB,IAAkB,EAClC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAc;QAIlC,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;IAC/C,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,IAAkB,EAClB,KAAc;IAEd,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,8BAA8B,CACtC,IAAI,EACJ,gDAAgD,IAAI,GAAG,CACxD,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,8BAA8B,CACtC,IAAI,EACJ,yCAAyC,IAAI,GAAG,CACjD,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** PostgreSQL implementation of the durable asynchronous ProposalStore contract. */
|
|
2
2
|
import type { PrismaClient } from "../../generated/prisma/index.js";
|
|
3
|
-
import { type ProposalRecord, type ProposalStore } from "./proposal-contract.js";
|
|
3
|
+
import { type ProposalCreateInput, type ProposalRecord, type ProposalStore, type ProposalUpdatePatch } from "./proposal-contract.js";
|
|
4
4
|
export declare class PgProposalStore implements ProposalStore {
|
|
5
5
|
private prisma;
|
|
6
6
|
private mirror;
|
|
@@ -13,6 +13,32 @@ export declare class PgProposalStore implements ProposalStore {
|
|
|
13
13
|
getById(id: string): Promise<ProposalRecord | null>;
|
|
14
14
|
listPending(projectId: string): Promise<ProposalRecord[]>;
|
|
15
15
|
setStatus(id: string, status: "approved" | "rejected", decidedAt?: number): Promise<ProposalRecord | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Manual create (AC-02.1): always lands at `status: "pending"` /
|
|
18
|
+
* `decidedAt: null`, both stamped here rather than caller-suppliable, and
|
|
19
|
+
* the payload is re-validated against T5's shared table before the row
|
|
20
|
+
* is ever written — so a create can never write a row `parsePayload`
|
|
21
|
+
* would refuse on the next read.
|
|
22
|
+
*/
|
|
23
|
+
create(input: ProposalCreateInput): Promise<ProposalRecord>;
|
|
24
|
+
/**
|
|
25
|
+
* Writes only `rationale` and `payload` (AC-02.3/AC-02.4). `kind` /
|
|
26
|
+
* `targetMemoryId` / `status` / `decided_at` never appear in this SQL —
|
|
27
|
+
* `applyProposal` branches on the first two, and the second two stay
|
|
28
|
+
* exclusively `setStatus`'s paired write, whose corruption guard
|
|
29
|
+
* (`toRecord`) throws when `(status === "pending") !== (decidedAt ===
|
|
30
|
+
* null)`. A `payload` edit re-validates against the row's *existing*
|
|
31
|
+
* `kind` — changing `kind` here would let a payload for the old kind slip
|
|
32
|
+
* past validation for the new one.
|
|
33
|
+
*/
|
|
34
|
+
update(id: string, patch: ProposalUpdatePatch): Promise<ProposalRecord | null>;
|
|
35
|
+
/**
|
|
36
|
+
* Hard-deletes in any status (AC-02.5), including `approved` — the memory
|
|
37
|
+
* edit an approved proposal already applied is not reversed. As in
|
|
38
|
+
* `PgHandoffStore.delete` (D3), the DB's affected-row count is the source
|
|
39
|
+
* of truth and `mirror.delete` runs only after that write succeeds.
|
|
40
|
+
*/
|
|
41
|
+
delete(id: string): Promise<string | null>;
|
|
16
42
|
journalMode(): Promise<string>;
|
|
17
43
|
__hydrate(): Promise<void>;
|
|
18
44
|
__drain(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposal-repository-pg.d.ts","sourceRoot":"","sources":["../../../src/data/proposal/proposal-repository-pg.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAEpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAOpE,OAAO,
|
|
1
|
+
{"version":3,"file":"proposal-repository-pg.d.ts","sourceRoot":"","sources":["../../../src/data/proposal/proposal-repository-pg.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAEpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAOpE,OAAO,EAGL,KAAK,mBAAmB,EAGxB,KAAK,cAAc,EAEnB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACzB,MAAM,wBAAwB,CAAC;AA0EhC,qBAAa,eAAgB,YAAW,aAAa;IACnD,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAA8B;gBAEnC,MAAM,CAAC,EAAE,YAAY;IAIjC,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,cAAc;IAsBhB,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB7C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAMnD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAQzD,SAAS,CACb,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,UAAU,GAAG,UAAU,EAC/B,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IA6BjC;;;;;;OAMG;IACG,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;IAiBjE;;;;;;;;;OASG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IA+BpF;;;;;OAKG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAa1C,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAK9B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
|
@@ -3,15 +3,13 @@ import { getPrismaClient } from "../../kernel/prisma-client.js";
|
|
|
3
3
|
import { getProjectIdentityAliasResolver } from "../../kernel/alias-resolver.js";
|
|
4
4
|
import { searchBackendUnavailable, storeCorruption, } from "../../kernel/search-diagnostics.js";
|
|
5
5
|
import { PROPOSAL_KINDS, PROPOSAL_STATUSES, } from "./proposal-contract.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return Object.keys(value).every((key) => allowed.includes(key));
|
|
14
|
-
}
|
|
6
|
+
import { assertValidProposalPayload, isRecord, isValidProposalPayload, } from "./proposal-payload-validation.js";
|
|
7
|
+
/**
|
|
8
|
+
* Read-side application of the shared `PROPOSAL_PAYLOAD_RULES` table
|
|
9
|
+
* (`proposal-payload-validation.ts`, D4). This is the *reader* half of the
|
|
10
|
+
* "one table, two callers" contract — `create`/`update` below are the write
|
|
11
|
+
* half, and neither may re-derive its own copy of the key table.
|
|
12
|
+
*/
|
|
15
13
|
function parsePayload(raw, kind) {
|
|
16
14
|
let value;
|
|
17
15
|
try {
|
|
@@ -23,28 +21,7 @@ function parsePayload(raw, kind) {
|
|
|
23
21
|
if (!isRecord(value)) {
|
|
24
22
|
throw storeCorruption("proposal.payload_json", new TypeError("expected object"));
|
|
25
23
|
}
|
|
26
|
-
|
|
27
|
-
if (kind === "memory.create") {
|
|
28
|
-
valid =
|
|
29
|
-
validKeys(value, ["content", "type", "level", "importance", "tags"]) &&
|
|
30
|
-
typeof value.content === "string" &&
|
|
31
|
-
(value.type === undefined || typeof value.type === "string") &&
|
|
32
|
-
(value.level === undefined || typeof value.level === "number") &&
|
|
33
|
-
(value.importance === undefined || typeof value.importance === "number") &&
|
|
34
|
-
(value.tags === undefined || stringArray(value.tags));
|
|
35
|
-
}
|
|
36
|
-
else if (kind === "memory.update") {
|
|
37
|
-
valid =
|
|
38
|
-
validKeys(value, ["content", "importance", "tags"]) &&
|
|
39
|
-
Object.keys(value).length > 0 &&
|
|
40
|
-
(value.content === undefined || typeof value.content === "string") &&
|
|
41
|
-
(value.importance === undefined || typeof value.importance === "number") &&
|
|
42
|
-
(value.tags === undefined || stringArray(value.tags));
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
valid = validKeys(value, ["tags"]) && stringArray(value.tags);
|
|
46
|
-
}
|
|
47
|
-
if (!valid) {
|
|
24
|
+
if (!isValidProposalPayload(kind, value)) {
|
|
48
25
|
throw storeCorruption("proposal.payload_json", new TypeError("invalid proposal payload"));
|
|
49
26
|
}
|
|
50
27
|
return value;
|
|
@@ -185,6 +162,90 @@ export class PgProposalStore {
|
|
|
185
162
|
this.mirror.set(id, persisted);
|
|
186
163
|
return structuredClone(persisted);
|
|
187
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* Manual create (AC-02.1): always lands at `status: "pending"` /
|
|
167
|
+
* `decidedAt: null`, both stamped here rather than caller-suppliable, and
|
|
168
|
+
* the payload is re-validated against T5's shared table before the row
|
|
169
|
+
* is ever written — so a create can never write a row `parsePayload`
|
|
170
|
+
* would refuse on the next read.
|
|
171
|
+
*/
|
|
172
|
+
async create(input) {
|
|
173
|
+
assertValidProposalPayload(input.kind, input.payload);
|
|
174
|
+
const record = {
|
|
175
|
+
id: input.id,
|
|
176
|
+
projectId: input.projectId,
|
|
177
|
+
kind: input.kind,
|
|
178
|
+
targetMemoryId: input.targetMemoryId ?? null,
|
|
179
|
+
payload: input.payload,
|
|
180
|
+
rationale: input.rationale ?? "",
|
|
181
|
+
status: "pending",
|
|
182
|
+
createdAt: input.createdAt ?? Date.now(),
|
|
183
|
+
decidedAt: null,
|
|
184
|
+
};
|
|
185
|
+
await this.insert(record);
|
|
186
|
+
return record;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Writes only `rationale` and `payload` (AC-02.3/AC-02.4). `kind` /
|
|
190
|
+
* `targetMemoryId` / `status` / `decided_at` never appear in this SQL —
|
|
191
|
+
* `applyProposal` branches on the first two, and the second two stay
|
|
192
|
+
* exclusively `setStatus`'s paired write, whose corruption guard
|
|
193
|
+
* (`toRecord`) throws when `(status === "pending") !== (decidedAt ===
|
|
194
|
+
* null)`. A `payload` edit re-validates against the row's *existing*
|
|
195
|
+
* `kind` — changing `kind` here would let a payload for the old kind slip
|
|
196
|
+
* past validation for the new one.
|
|
197
|
+
*/
|
|
198
|
+
async update(id, patch) {
|
|
199
|
+
await this.ensureHydrated();
|
|
200
|
+
const current = this.mirror.get(id);
|
|
201
|
+
if (!current)
|
|
202
|
+
return null;
|
|
203
|
+
if (patch.payload !== undefined) {
|
|
204
|
+
assertValidProposalPayload(current.kind, patch.payload);
|
|
205
|
+
}
|
|
206
|
+
const merged = {
|
|
207
|
+
...current,
|
|
208
|
+
...(patch.rationale !== undefined ? { rationale: patch.rationale } : {}),
|
|
209
|
+
...(patch.payload !== undefined ? { payload: patch.payload } : {}),
|
|
210
|
+
};
|
|
211
|
+
let rows;
|
|
212
|
+
try {
|
|
213
|
+
rows = await this.getClient().$queryRaw `
|
|
214
|
+
UPDATE proposals
|
|
215
|
+
SET rationale = ${merged.rationale}, payload_json = ${JSON.stringify(merged.payload)}
|
|
216
|
+
WHERE id = ${id}
|
|
217
|
+
RETURNING id, project_id, kind, target_memory_id, payload_json,
|
|
218
|
+
rationale, status, created_at, decided_at`;
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
throw searchBackendUnavailable("proposal_store", error);
|
|
222
|
+
}
|
|
223
|
+
if (!rows[0])
|
|
224
|
+
return null;
|
|
225
|
+
const persisted = toRecord(rows[0]);
|
|
226
|
+
this.mirror.set(id, persisted);
|
|
227
|
+
return structuredClone(persisted);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Hard-deletes in any status (AC-02.5), including `approved` — the memory
|
|
231
|
+
* edit an approved proposal already applied is not reversed. As in
|
|
232
|
+
* `PgHandoffStore.delete` (D3), the DB's affected-row count is the source
|
|
233
|
+
* of truth and `mirror.delete` runs only after that write succeeds.
|
|
234
|
+
*/
|
|
235
|
+
async delete(id) {
|
|
236
|
+
await this.ensureHydrated();
|
|
237
|
+
let affected;
|
|
238
|
+
try {
|
|
239
|
+
affected = await this.getClient().$executeRaw `DELETE FROM proposals WHERE id = ${id}`;
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
throw searchBackendUnavailable("proposal_store", error);
|
|
243
|
+
}
|
|
244
|
+
if (affected === 0)
|
|
245
|
+
return null;
|
|
246
|
+
this.mirror.delete(id);
|
|
247
|
+
return id;
|
|
248
|
+
}
|
|
188
249
|
async journalMode() {
|
|
189
250
|
await this.ensureHydrated();
|
|
190
251
|
return "postgres";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposal-repository-pg.js","sourceRoot":"","sources":["../../../src/data/proposal/proposal-repository-pg.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAGpF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EACL,wBAAwB,EACxB,eAAe,GAChB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,cAAc,EACd,iBAAiB,
|
|
1
|
+
{"version":3,"file":"proposal-repository-pg.js","sourceRoot":"","sources":["../../../src/data/proposal/proposal-repository-pg.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAGpF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EACL,wBAAwB,EACxB,eAAe,GAChB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,cAAc,EACd,iBAAiB,GAQlB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,0BAA0B,EAC1B,QAAQ,EACR,sBAAsB,GACvB,MAAM,kCAAkC,CAAC;AAc1C;;;;;GAKG;AACH,SAAS,YAAY,CAAC,GAAW,EAAE,IAAkB;IACnD,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,eAAe,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,eAAe,CAAC,uBAAuB,EAAE,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,eAAe,CAAC,uBAAuB,EAAE,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,KAAwB,CAAC;AAClC,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,KAAa,EAAE,QAAQ,GAAG,KAAK;IAChE,IAAI,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC9D,MAAM,eAAe,CAAC,YAAY,KAAK,EAAE,EAAE,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAkB;IAClC,IAAI,CAAE,cAAoC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9D,MAAM,eAAe,CAAC,eAAe,EAAE,IAAI,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,CAAE,iBAAuC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,eAAe,CAAC,iBAAiB,EAAE,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IAChE,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,EAAE,CAAC;QACxD,MAAM,eAAe,CAAC,qBAAqB,EAAE,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAoB,CAAC;IACtC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,IAAI;QACJ,cAAc,EAAE,GAAG,CAAC,gBAAgB;QACpC,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC;QAC7C,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,MAAM,EAAE,GAAG,CAAC,MAAwB;QACpC,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAE;QACnD,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,eAAe;IAClB,MAAM,CAAgB;IACtB,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC3C,QAAQ,GAAG,KAAK,CAAC;IACjB,SAAS,GAAyB,IAAI,CAAC;IAE/C,YAAY,MAAqB;QAC/B,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACnC,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,CAAC,KAAK,IAAI,EAAE;YAC3B,IAAI,CAAC;gBACH,IAAI,IAAqB,CAAC;gBAC1B,IAAI,CAAC;oBACH,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,SAAS,CAAiB;;4EAEU,CAAC;gBACrE,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,wBAAwB,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;gBAC1D,CAAC;gBACD,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACvB,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACxB,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAsB;QACjC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACzC,+DAA+D;QAC/D,QAAQ,CAAC,SAAS,GAAG,MAAM,+BAA+B,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,WAAW,CAAA;;;;;YAK5B,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC,IAAI;YACpD,QAAQ,CAAC,cAAc,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC5D,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YACvE,QAAQ,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;UACnE,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,wBAAwB,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB;QACjC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;aAC7B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC;aACjF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;aACzC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,SAAS,CACb,EAAU,EACV,MAA+B,EAC/B,SAAkB;QAElB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;QAElE,IAAI,IAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,SAAS,CAAiB;;uBAEvC,MAAM,kBAAkB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;qBAC3D,EAAE;;4DAEqC,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACb,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,SAAS,CAAiB;;;sCAG1B,EAAE,EAAE,CAAC;YACrC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,wBAAwB,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAC/B,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CAAC,KAA0B;QACrC,0BAA0B,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,MAAM,GAAmB;YAC7B,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI;YAC5C,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;YAChC,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;YACxC,SAAS,EAAE,IAAI;SAChB,CAAC;QACF,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,KAA0B;QACjD,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAChC,0BAA0B,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,MAAM,GAAmB;YAC7B,GAAG,OAAO;YACV,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC;QAEF,IAAI,IAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,SAAS,CAAiB;;0BAEpC,MAAM,CAAC,SAAS,oBAAoB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;qBACvE,EAAE;;4DAEqC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,wBAAwB,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAC/B,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,WAAW,CAAA,oCAAoC,EAAE,EAAE,CAAC;QACxF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,wBAAwB,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9B,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -50,6 +50,7 @@ export { HandoffService, getHandoffService, resetHandoffService, buildHandoffMem
|
|
|
50
50
|
export type { BeginHandoffInput, BeginResult, AcceptCancelResult, HandoffMemorySeam, HandoffDeps, } from "./services/handoff/handoff-service.js";
|
|
51
51
|
export { HandoffAutoInjector } from "./services/handoff/handoff-auto-injector.js";
|
|
52
52
|
export { MemoryProposalStore, getProposalStore, resetProposalStore, newProposalId, PROPOSAL_STATUSES, PROPOSAL_KINDS, } from "./data/proposal/proposal-repository.js";
|
|
53
|
+
export { ProposalPayloadValidationError, assertValidProposalPayload, isValidProposalPayload, PROPOSAL_PAYLOAD_RULES, } from "./data/proposal/proposal-payload-validation.js";
|
|
53
54
|
export type { ProposalStore, ProposalRecord, ProposalStatus, ProposalKind, ProposalPayload, CreateMemoryPayload, UpdateMemoryPayload, TagMemoryPayload, } from "./data/proposal/proposal-repository.js";
|
|
54
55
|
export { AutoImproveJob, getAutoImproveJob, resetAutoImproveJob, autoImproveJob, detectPatterns, enrichWithLlm, ProposalEnrichmentSchema, } from "./services/jobs/auto-improve-job.js";
|
|
55
56
|
export type { AutoImproveJobOptions, AutoImproveResult, ApproveRejectResult, PatternThresholds, PatternCandidate, MemoryApplySeam, ProposalEnrichment, } from "./services/jobs/auto-improve-job.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,cAAc,kBAAkB,CAAC;AAIjC,cAAc,qBAAqB,CAAC;AAGpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACjF,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,aAAa,GACd,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAC7F,cAAc,kCAAkC,CAAC;AAGjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,YAAY,EACV,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,sBAAsB,GACvB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAGvE,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,YAAY,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAChF,YAAY,EACV,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,WAAW,EACX,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EACV,aAAa,EACb,eAAe,EACf,aAAa,GACd,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,WAAW,EACX,mBAAmB,GACpB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,eAAe,EACf,eAAe,GAChB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iDAAiD,CAAC;AAC5F,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,kBAAkB,GACnB,MAAM,iDAAiD,CAAC;AAGzD,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,2CAA2C,CAAC;AACnD,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,YAAY,GACb,MAAM,2CAA2C,CAAC;AAGnD,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,GACjB,MAAM,sCAAsC,CAAC;AAC9C,YAAY,EACV,YAAY,EACZ,aAAa,EACb,aAAa,GACd,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,GACZ,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAGlF,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,cAAc,GACf,MAAM,wCAAwC,CAAC;AAOhD,OAAO,EACL,8BAA8B,EAC9B,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,gDAAgD,CAAC;AACxD,YAAY,EACV,aAAa,EACb,cAAc,EACd,cAAc,EACd,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,aAAa,EACb,wBAAwB,GACzB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,GACnB,MAAM,qCAAqC,CAAC;AAG7C,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -51,5 +51,12 @@ export { HandoffService, getHandoffService, resetHandoffService, buildHandoffMem
|
|
|
51
51
|
export { HandoffAutoInjector } from "./services/handoff/handoff-auto-injector.js";
|
|
52
52
|
// Phase 5 — auto-improvement loop (G7)
|
|
53
53
|
export { MemoryProposalStore, getProposalStore, resetProposalStore, newProposalId, PROPOSAL_STATUSES, PROPOSAL_KINDS, } from "./data/proposal/proposal-repository.js";
|
|
54
|
+
// Exported so transports can identify a write-time payload rejection with
|
|
55
|
+
// `instanceof` rather than duck-typing `error.name`. `apps/tools-api`'s
|
|
56
|
+
// proposal routes need to map this to a 400, and without the class on the
|
|
57
|
+
// public surface the only available check was a string comparison against
|
|
58
|
+
// `name` — which a rename, a subclass, or a minifier breaks silently, turning
|
|
59
|
+
// a 400 into a 500 with no test able to see the difference.
|
|
60
|
+
export { ProposalPayloadValidationError, assertValidProposalPayload, isValidProposalPayload, PROPOSAL_PAYLOAD_RULES, } from "./data/proposal/proposal-payload-validation.js";
|
|
54
61
|
export { AutoImproveJob, getAutoImproveJob, resetAutoImproveJob, autoImproveJob, detectPatterns, enrichWithLlm, ProposalEnrichmentSchema, } from "./services/jobs/auto-improve-job.js";
|
|
55
62
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,QAAQ;AACR,cAAc,kBAAkB,CAAC;AAEjC,gFAAgF;AAChF,gEAAgE;AAChE,cAAc,qBAAqB,CAAC;AAEpC,OAAO;AACP,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AAMjF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAC7F,cAAc,kCAAkC,CAAC;AAEjD,qFAAqF;AACrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAQlF,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAEvE,uDAAuD;AACvD,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAShF,OAAO,EACL,WAAW,EACX,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,MAAM,kCAAkC,CAAC;AAM1C,OAAO,EACL,WAAW,EACX,mBAAmB,GACpB,MAAM,kCAAkC,CAAC;AAC1C,uDAAuD;AACvD,OAAO,EACL,eAAe,EACf,eAAe,GAChB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iDAAiD,CAAC;AAO5F,2CAA2C;AAC3C,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,2CAA2C,CAAC;AAenD,wCAAwC;AACxC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,GACjB,MAAM,sCAAsC,CAAC;AAM9C,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;AAQ/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAElF,uCAAuC;AACvC,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,cAAc,GACf,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,QAAQ;AACR,cAAc,kBAAkB,CAAC;AAEjC,gFAAgF;AAChF,gEAAgE;AAChE,cAAc,qBAAqB,CAAC;AAEpC,OAAO;AACP,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AAMjF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAC7F,cAAc,kCAAkC,CAAC;AAEjD,qFAAqF;AACrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAQlF,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAEvE,uDAAuD;AACvD,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAShF,OAAO,EACL,WAAW,EACX,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,MAAM,kCAAkC,CAAC;AAM1C,OAAO,EACL,WAAW,EACX,mBAAmB,GACpB,MAAM,kCAAkC,CAAC;AAC1C,uDAAuD;AACvD,OAAO,EACL,eAAe,EACf,eAAe,GAChB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iDAAiD,CAAC;AAO5F,2CAA2C;AAC3C,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,2CAA2C,CAAC;AAenD,wCAAwC;AACxC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,GACjB,MAAM,sCAAsC,CAAC;AAM9C,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;AAQ/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAElF,uCAAuC;AACvC,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,cAAc,GACf,MAAM,wCAAwC,CAAC;AAChD,0EAA0E;AAC1E,wEAAwE;AACxE,0EAA0E;AAC1E,0EAA0E;AAC1E,8EAA8E;AAC9E,4DAA4D;AAC5D,OAAO,EACL,8BAA8B,EAC9B,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,gDAAgD,CAAC;AAWxD,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,aAAa,EACb,wBAAwB,GACzB,MAAM,qCAAqC,CAAC"}
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
* Defaults resolve lazily at run time so the closed-MemoryRepository
|
|
21
21
|
* landmine (memory-crud.test.ts) does not poison handoff tests.
|
|
22
22
|
*/
|
|
23
|
-
import { type HandoffRecord, type HandoffStore } from "../../data/handoff/handoff-repository.js";
|
|
24
|
-
import type { InsertMemoryInput } from "../../data/memory/memory-repository.js";
|
|
23
|
+
import { type HandoffRecord, type HandoffStore, type HandoffUpdatePatch } from "../../data/handoff/handoff-repository.js";
|
|
24
|
+
import type { InsertMemoryInput, UpdateMemoryPatch } from "../../data/memory/memory-repository.js";
|
|
25
25
|
import type { LlmSurface } from "../memory/consolidator.js";
|
|
26
26
|
export interface BeginHandoffInput {
|
|
27
27
|
projectId: string;
|
|
@@ -44,12 +44,25 @@ export interface AcceptCancelResult {
|
|
|
44
44
|
handoff?: HandoffRecord;
|
|
45
45
|
reason?: string;
|
|
46
46
|
}
|
|
47
|
+
/** T7 — PATCH/DELETE results (AC-01.1..AC-01.8). */
|
|
48
|
+
export interface UpdateResult {
|
|
49
|
+
ok: boolean;
|
|
50
|
+
handoff?: HandoffRecord;
|
|
51
|
+
reason?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface DeleteResult {
|
|
54
|
+
ok: boolean;
|
|
55
|
+
id?: string;
|
|
56
|
+
reason?: string;
|
|
57
|
+
}
|
|
47
58
|
/**
|
|
48
59
|
* Injectable memory-repository seam. The default implementation resolves
|
|
49
60
|
* getMemoryRepository() lazily inside each method (test-isolation).
|
|
50
61
|
*/
|
|
51
62
|
export interface HandoffMemorySeam {
|
|
52
63
|
insert(input: InsertMemoryInput): void | Promise<void>;
|
|
64
|
+
/** AC-01.8: refresh the dual-written memory's content after an edit. */
|
|
65
|
+
update(id: string, patch: UpdateMemoryPatch): boolean | Promise<boolean>;
|
|
53
66
|
}
|
|
54
67
|
export interface HandoffDeps {
|
|
55
68
|
store?: HandoffStore;
|
|
@@ -75,7 +88,38 @@ export declare class HandoffService {
|
|
|
75
88
|
}): Promise<AcceptCancelResult>;
|
|
76
89
|
private terminate;
|
|
77
90
|
listPending(projectId: string, targetAgent?: string | null): Promise<HandoffRecord[]>;
|
|
91
|
+
/**
|
|
92
|
+
* Applies an already-allowlisted patch (the route owns rejecting
|
|
93
|
+
* disallowed/unknown fields by name — AC-01.2). `status`/`acceptedAt` are
|
|
94
|
+
* not reachable through `HandoffUpdatePatch` at all, so they cannot be
|
|
95
|
+
* written here even by mistake (AC-01.3).
|
|
96
|
+
*/
|
|
97
|
+
update(params: {
|
|
98
|
+
id: string;
|
|
99
|
+
projectId?: string;
|
|
100
|
+
patch: HandoffUpdatePatch;
|
|
101
|
+
}): Promise<UpdateResult>;
|
|
102
|
+
private refreshDualWriteMemory;
|
|
103
|
+
/**
|
|
104
|
+
* Hard-deletes in any status (AC-01.4). The dual-written memory row is
|
|
105
|
+
* left untouched (AC-01.5) — its dangling `metadata.handoffId` is accepted,
|
|
106
|
+
* documented behaviour, not an integrity break.
|
|
107
|
+
*/
|
|
108
|
+
delete(params: {
|
|
109
|
+
id: string;
|
|
110
|
+
projectId?: string;
|
|
111
|
+
}): Promise<DeleteResult>;
|
|
78
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Deterministic by handoff id (no random suffix): a PATCH must be able to
|
|
115
|
+
* recompute the id of the memory row `dualWrite` created at `begin` without
|
|
116
|
+
* any new lookup primitive on the data layer (out of this task's write set),
|
|
117
|
+
* so a PATCH that touches summary/openQuestions/nextSteps/files can refresh
|
|
118
|
+
* that row's content directly (AC-01.8). Safe against collision because a
|
|
119
|
+
* handoff id (`newHandoffId()`) is itself already unique per row and
|
|
120
|
+
* `dualWrite` runs at most once per handoff id (inside `begin`).
|
|
121
|
+
*/
|
|
122
|
+
export declare function dualWriteMemoryId(handoffId: string): string;
|
|
79
123
|
export declare function buildHandoffMemoryInput(memId: string, record: HandoffRecord): InsertMemoryInput;
|
|
80
124
|
export declare function formatMemoryContent(record: HandoffRecord): string;
|
|
81
125
|
export declare function getHandoffService(): HandoffService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handoff-service.d.ts","sourceRoot":"","sources":["../../../src/services/handoff/handoff-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;
|
|
1
|
+
{"version":3,"file":"handoff-service.d.ts","sourceRoot":"","sources":["../../../src/services/handoff/handoff-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
* Defaults resolve lazily at run time so the closed-MemoryRepository
|
|
21
21
|
* landmine (memory-crud.test.ts) does not poison handoff tests.
|
|
22
22
|
*/
|
|
23
|
-
import { randomUUID } from "crypto";
|
|
24
23
|
import { z } from "zod";
|
|
25
24
|
import { MemoryLevel, MemoryType } from "@massa-ai/shared";
|
|
26
25
|
import { getHandoffStore, newHandoffId, } from "../../data/handoff/handoff-repository.js";
|
|
@@ -51,6 +50,7 @@ export class HandoffService {
|
|
|
51
50
|
injectedRepo ??
|
|
52
51
|
{
|
|
53
52
|
insert: (i) => getMemoryRepository().insert(i),
|
|
53
|
+
update: (id, p) => getMemoryRepository().update(id, p),
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
56
|
// ── begin (R1, R2, R5, R7) ────────────────────────────────────────────────
|
|
@@ -100,7 +100,7 @@ export class HandoffService {
|
|
|
100
100
|
return { ok: true, id, status: "open", memoryId };
|
|
101
101
|
}
|
|
102
102
|
async dualWrite(record) {
|
|
103
|
-
const memId =
|
|
103
|
+
const memId = dualWriteMemoryId(record.id);
|
|
104
104
|
const input = buildHandoffMemoryInput(memId, record);
|
|
105
105
|
await Promise.resolve(this.memoryRepo.insert(input));
|
|
106
106
|
return memId;
|
|
@@ -148,8 +148,87 @@ export class HandoffService {
|
|
|
148
148
|
async listPending(projectId, targetAgent) {
|
|
149
149
|
return this.store.listPending(projectId, targetAgent ?? undefined);
|
|
150
150
|
}
|
|
151
|
+
// ── update (T7 — AC-01.1, AC-01.3, AC-01.7, AC-01.8) ─────────────────────
|
|
152
|
+
/**
|
|
153
|
+
* Applies an already-allowlisted patch (the route owns rejecting
|
|
154
|
+
* disallowed/unknown fields by name — AC-01.2). `status`/`acceptedAt` are
|
|
155
|
+
* not reachable through `HandoffUpdatePatch` at all, so they cannot be
|
|
156
|
+
* written here even by mistake (AC-01.3).
|
|
157
|
+
*/
|
|
158
|
+
async update(params) {
|
|
159
|
+
if (!params || !params.id) {
|
|
160
|
+
return { ok: false, reason: "missing-id" };
|
|
161
|
+
}
|
|
162
|
+
const row = await this.store.getById(params.id);
|
|
163
|
+
if (!row)
|
|
164
|
+
return { ok: false, reason: "not-found" };
|
|
165
|
+
if (params.projectId && row.projectId !== params.projectId) {
|
|
166
|
+
return { ok: false, reason: "project-mismatch" };
|
|
167
|
+
}
|
|
168
|
+
const updated = await this.store.update(params.id, params.patch);
|
|
169
|
+
if (!updated)
|
|
170
|
+
return { ok: false, reason: "not-found" };
|
|
171
|
+
// AC-01.8: the dual-written memory's content was built once at `begin`
|
|
172
|
+
// and nothing else ever refreshes it. Any patch field that feeds
|
|
173
|
+
// `formatMemoryContent` must re-run it and push the new content into the
|
|
174
|
+
// memory row, or an edit ships active, FTS-indexed, wrong content.
|
|
175
|
+
const touchesMemoryContent = params.patch.summary !== undefined ||
|
|
176
|
+
params.patch.openQuestions !== undefined ||
|
|
177
|
+
params.patch.nextSteps !== undefined ||
|
|
178
|
+
params.patch.files !== undefined;
|
|
179
|
+
if (touchesMemoryContent) {
|
|
180
|
+
await this.refreshDualWriteMemory(updated);
|
|
181
|
+
}
|
|
182
|
+
return { ok: true, handoff: updated };
|
|
183
|
+
}
|
|
184
|
+
async refreshDualWriteMemory(record) {
|
|
185
|
+
// Best-effort, mirroring dualWrite's own swallow in begin(): the memory
|
|
186
|
+
// row may not exist (dualWrite is itself best-effort), and a refresh
|
|
187
|
+
// failure must never fail the handoff edit that triggered it.
|
|
188
|
+
try {
|
|
189
|
+
const memId = dualWriteMemoryId(record.id);
|
|
190
|
+
const content = formatMemoryContent(record);
|
|
191
|
+
await Promise.resolve(this.memoryRepo.update(memId, { content }));
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
/* best-effort */
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// ── delete (T7 — AC-01.4, AC-01.5, AC-01.6, AC-01.7) ─────────────────────
|
|
198
|
+
/**
|
|
199
|
+
* Hard-deletes in any status (AC-01.4). The dual-written memory row is
|
|
200
|
+
* left untouched (AC-01.5) — its dangling `metadata.handoffId` is accepted,
|
|
201
|
+
* documented behaviour, not an integrity break.
|
|
202
|
+
*/
|
|
203
|
+
async delete(params) {
|
|
204
|
+
if (!params || !params.id) {
|
|
205
|
+
return { ok: false, reason: "missing-id" };
|
|
206
|
+
}
|
|
207
|
+
const row = await this.store.getById(params.id);
|
|
208
|
+
if (!row)
|
|
209
|
+
return { ok: false, reason: "not-found" };
|
|
210
|
+
if (params.projectId && row.projectId !== params.projectId) {
|
|
211
|
+
return { ok: false, reason: "project-mismatch" };
|
|
212
|
+
}
|
|
213
|
+
const deletedId = await this.store.delete(params.id);
|
|
214
|
+
if (!deletedId)
|
|
215
|
+
return { ok: false, reason: "not-found" };
|
|
216
|
+
return { ok: true, id: deletedId };
|
|
217
|
+
}
|
|
151
218
|
}
|
|
152
219
|
// ── Pure helpers ────────────────────────────────────────────────────────────
|
|
220
|
+
/**
|
|
221
|
+
* Deterministic by handoff id (no random suffix): a PATCH must be able to
|
|
222
|
+
* recompute the id of the memory row `dualWrite` created at `begin` without
|
|
223
|
+
* any new lookup primitive on the data layer (out of this task's write set),
|
|
224
|
+
* so a PATCH that touches summary/openQuestions/nextSteps/files can refresh
|
|
225
|
+
* that row's content directly (AC-01.8). Safe against collision because a
|
|
226
|
+
* handoff id (`newHandoffId()`) is itself already unique per row and
|
|
227
|
+
* `dualWrite` runs at most once per handoff id (inside `begin`).
|
|
228
|
+
*/
|
|
229
|
+
export function dualWriteMemoryId(handoffId) {
|
|
230
|
+
return `handoff-mem-${handoffId}`;
|
|
231
|
+
}
|
|
153
232
|
export function buildHandoffMemoryInput(memId, record) {
|
|
154
233
|
const content = formatMemoryContent(record);
|
|
155
234
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handoff-service.js","sourceRoot":"","sources":["../../../src/services/handoff/handoff-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"handoff-service.js","sourceRoot":"","sources":["../../../src/services/handoff/handoff-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@massa-ai/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.54.1",
|
|
4
4
|
"author": "luizgmassa",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"@ai-sdk/google": "^3.0.19",
|
|
45
45
|
"@ai-sdk/mistral": "^3.0.17",
|
|
46
46
|
"@ai-sdk/openai": "^3.0.24",
|
|
47
|
-
"@massa-ai/shared": "1.
|
|
47
|
+
"@massa-ai/shared": "1.54.1",
|
|
48
48
|
"@prisma/adapter-pg": "^7.5.0",
|
|
49
49
|
"@prisma/client": "^7.5.0",
|
|
50
50
|
"@prisma/client-runtime-utils": "^7.3.0",
|