sdlc-agent-4-enterprise-server 1.27.0 → 1.27.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/README.md +1 -1
- package/dev-server.log +0 -0
- package/dist/engine/enrichment/CodeEnrichmentTaskCreator.d.ts +17 -1
- package/dist/engine/enrichment/CodeEnrichmentTaskCreator.js +65 -15
- package/dist/engine/enrichment/CodeEnrichmentTaskCreator.js.map +1 -1
- package/dist/knowledge/KnowledgeService.js +25 -3
- package/dist/knowledge/KnowledgeService.js.map +1 -1
- package/dist/modules/memory/task-queue/TaskWorker.js +4 -1
- package/dist/modules/memory/task-queue/TaskWorker.js.map +1 -1
- package/package.json +1 -1
- package/src/engine/enrichment/CodeEnrichmentTaskCreator.ts +90 -21
- package/src/engine/enrichment/__tests__/CodeEnrichmentTaskCreator.test.ts +152 -0
- package/src/engine/enrichment/__tests__/enrichment-e2e.test.ts +239 -0
- package/src/knowledge/KnowledgeService.ts +23 -2
- package/src/knowledge/__tests__/KnowledgeService.test.ts +21 -0
- package/src/knowledge/__tests__/routes.test.ts +23 -0
- package/src/modules/memory/task-queue/TaskWorker.ts +4 -1
- package/src/modules/memory/task-queue/__tests__/TaskWorker.test.ts +94 -0
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
</p>
|
|
7
7
|
|
|
8
8
|
<p align="center">
|
|
9
|
-
<img src="https://img.shields.io/badge/version-1.
|
|
9
|
+
<img src="https://img.shields.io/badge/version-1.27.1-blue?style=for-the-badge" alt="Version">
|
|
10
10
|
<img src="https://img.shields.io/badge/tools-66+-teal?style=for-the-badge" alt="Tools">
|
|
11
11
|
<img src="https://img.shields.io/badge/node-%3E%3D18-green?style=for-the-badge" alt="Node">
|
|
12
12
|
</p>
|
package/dev-server.log
ADDED
|
File without changes
|
|
@@ -33,10 +33,26 @@ export declare class CodeEnrichmentTaskCreator {
|
|
|
33
33
|
createTasksForProject(projectId: string): Promise<number>;
|
|
34
34
|
/** Skip if symbol already fully enriched (has summary). */
|
|
35
35
|
private shouldCreateTask;
|
|
36
|
+
/**
|
|
37
|
+
* SA4E-106: Copy enrichment data from an already-enriched scope to current project.
|
|
38
|
+
* Matches by file content_hash + symbol name + kind.
|
|
39
|
+
* Uses COALESCE for pseudo_code to preserve PegaLogicNormalizer output.
|
|
40
|
+
* @param filePath - Relative file path in current project
|
|
41
|
+
* @param projectId - Current project ID
|
|
42
|
+
* @returns Number of symbols updated
|
|
43
|
+
*/
|
|
44
|
+
private copyEnrichmentFromOtherScope;
|
|
45
|
+
/** Find a source file (another project) with enriched symbols for same content. */
|
|
46
|
+
private findSourceFileId;
|
|
47
|
+
/** Get the target file ID in the current project. */
|
|
48
|
+
private findTargetFileId;
|
|
49
|
+
/** Load enriched symbols from source file. */
|
|
50
|
+
private loadEnrichedSymbols;
|
|
51
|
+
/** Apply enrichment copy from source symbols to target file symbols. */
|
|
52
|
+
private applyEnrichmentCopy;
|
|
36
53
|
/**
|
|
37
54
|
* Cross-scope dedup: check if the same file (by content_hash) has already been
|
|
38
55
|
* enriched in another project. If yes, skip LLM task creation entirely.
|
|
39
|
-
* The enrichment data remains queryable from the other project's symbols.
|
|
40
56
|
*/
|
|
41
57
|
private isFileEnrichedInOtherScope;
|
|
42
58
|
private getSymbolKind;
|
|
@@ -33,11 +33,12 @@ export class CodeEnrichmentTaskCreator {
|
|
|
33
33
|
async createTasks(symbolIds, filePath, projectId) {
|
|
34
34
|
if (symbolIds.size === 0)
|
|
35
35
|
return 0;
|
|
36
|
-
// Cross-scope dedup
|
|
36
|
+
// SA4E-106: Cross-scope dedup — copy enrichment data instead of just skipping
|
|
37
37
|
const enrichedElsewhere = await this.isFileEnrichedInOtherScope(filePath, projectId);
|
|
38
38
|
if (enrichedElsewhere) {
|
|
39
|
-
this.
|
|
40
|
-
|
|
39
|
+
const copied = await this.copyEnrichmentFromOtherScope(filePath, projectId);
|
|
40
|
+
this.logger.debug({ filePath, projectId, copied }, '[enrichment] Cross-scope copy — enrichment data copied from another scope');
|
|
41
|
+
return 0; // No new LLM tasks needed
|
|
41
42
|
}
|
|
42
43
|
let created = 0;
|
|
43
44
|
for (const [symbolName, symbolId] of symbolIds) {
|
|
@@ -102,24 +103,73 @@ export class CodeEnrichmentTaskCreator {
|
|
|
102
103
|
// Skip only if COMPLETED AND has summary (CODE_ENRICHMENT done, not just TAG_ENRICHMENT)
|
|
103
104
|
return !(row?.enrichment_status === 'COMPLETED' && row?.summary);
|
|
104
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* SA4E-106: Copy enrichment data from an already-enriched scope to current project.
|
|
108
|
+
* Matches by file content_hash + symbol name + kind.
|
|
109
|
+
* Uses COALESCE for pseudo_code to preserve PegaLogicNormalizer output.
|
|
110
|
+
* @param filePath - Relative file path in current project
|
|
111
|
+
* @param projectId - Current project ID
|
|
112
|
+
* @returns Number of symbols updated
|
|
113
|
+
*/
|
|
114
|
+
async copyEnrichmentFromOtherScope(filePath, projectId) {
|
|
115
|
+
const sourceFileId = await this.findSourceFileId(filePath, projectId);
|
|
116
|
+
if (!sourceFileId)
|
|
117
|
+
return 0;
|
|
118
|
+
const targetFileId = await this.findTargetFileId(filePath, projectId);
|
|
119
|
+
if (!targetFileId)
|
|
120
|
+
return 0;
|
|
121
|
+
const sourceSymbols = await this.loadEnrichedSymbols(sourceFileId);
|
|
122
|
+
return this.applyEnrichmentCopy(sourceSymbols, targetFileId);
|
|
123
|
+
}
|
|
124
|
+
/** Find a source file (another project) with enriched symbols for same content. */
|
|
125
|
+
async findSourceFileId(filePath, projectId) {
|
|
126
|
+
const currentFile = await this.adapter.getAsync('SELECT content_hash FROM files WHERE relative_path = ? AND project_id = ?', [filePath, projectId]);
|
|
127
|
+
if (!currentFile?.content_hash)
|
|
128
|
+
return null;
|
|
129
|
+
const sourceFile = await this.adapter.getAsync(`SELECT f.id FROM files f
|
|
130
|
+
JOIN symbols s ON s.file_id = f.id
|
|
131
|
+
WHERE f.content_hash = ? AND f.project_id != ?
|
|
132
|
+
AND s.enrichment_status = 'COMPLETED'
|
|
133
|
+
LIMIT 1`, [currentFile.content_hash, projectId]);
|
|
134
|
+
return sourceFile?.id ?? null;
|
|
135
|
+
}
|
|
136
|
+
/** Get the target file ID in the current project. */
|
|
137
|
+
async findTargetFileId(filePath, projectId) {
|
|
138
|
+
const targetFile = await this.adapter.getAsync('SELECT id FROM files WHERE relative_path = ? AND project_id = ?', [filePath, projectId]);
|
|
139
|
+
return targetFile?.id ?? null;
|
|
140
|
+
}
|
|
141
|
+
/** Load enriched symbols from source file. */
|
|
142
|
+
async loadEnrichedSymbols(sourceFileId) {
|
|
143
|
+
return this.adapter.allAsync(`SELECT name, kind, summary, pseudo_code, llm_tags FROM symbols
|
|
144
|
+
WHERE file_id = ? AND enrichment_status = 'COMPLETED'`, [sourceFileId]);
|
|
145
|
+
}
|
|
146
|
+
/** Apply enrichment copy from source symbols to target file symbols. */
|
|
147
|
+
async applyEnrichmentCopy(sourceSymbols, targetFileId) {
|
|
148
|
+
let copied = 0;
|
|
149
|
+
for (const src of sourceSymbols) {
|
|
150
|
+
if (!src.summary)
|
|
151
|
+
continue;
|
|
152
|
+
const result = await this.adapter.runAsync(`UPDATE symbols SET
|
|
153
|
+
summary = ?,
|
|
154
|
+
pseudo_code = COALESCE(?, pseudo_code),
|
|
155
|
+
llm_tags = ?,
|
|
156
|
+
enrichment_status = 'COMPLETED',
|
|
157
|
+
enriched_at = datetime('now')
|
|
158
|
+
WHERE file_id = ? AND name = ? AND kind = ?
|
|
159
|
+
AND (enrichment_status IS NULL OR enrichment_status != 'COMPLETED')`, [src.summary, src.pseudo_code, src.llm_tags, targetFileId, src.name, src.kind]);
|
|
160
|
+
if (result?.changes && result.changes > 0)
|
|
161
|
+
copied++;
|
|
162
|
+
}
|
|
163
|
+
return copied;
|
|
164
|
+
}
|
|
105
165
|
/**
|
|
106
166
|
* Cross-scope dedup: check if the same file (by content_hash) has already been
|
|
107
167
|
* enriched in another project. If yes, skip LLM task creation entirely.
|
|
108
|
-
* The enrichment data remains queryable from the other project's symbols.
|
|
109
168
|
*/
|
|
110
169
|
async isFileEnrichedInOtherScope(filePath, currentProjectId) {
|
|
111
170
|
try {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
if (!currentFile?.content_hash)
|
|
115
|
-
return false;
|
|
116
|
-
// Check if same hash exists in another project with at least one enriched symbol
|
|
117
|
-
const enrichedElsewhere = await this.adapter.getAsync(`SELECT f.id FROM files f
|
|
118
|
-
JOIN symbols s ON s.file_id = f.id
|
|
119
|
-
WHERE f.content_hash = ? AND f.project_id != ?
|
|
120
|
-
AND s.enrichment_status = 'COMPLETED'
|
|
121
|
-
LIMIT 1`, [currentFile.content_hash, currentProjectId]);
|
|
122
|
-
return !!enrichedElsewhere;
|
|
171
|
+
const sourceId = await this.findSourceFileId(filePath, currentProjectId);
|
|
172
|
+
return sourceId !== null;
|
|
123
173
|
}
|
|
124
174
|
catch {
|
|
125
175
|
// Non-fatal: if query fails (table missing, etc.), proceed with task creation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeEnrichmentTaskCreator.js","sourceRoot":"","sources":["../../../src/engine/enrichment/CodeEnrichmentTaskCreator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEhE,+EAA+E;AAC/E,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,OAAO,EAAE,WAAW,EAAE,MAAM;IAC5B,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW;CACpD,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,OAAO,yBAAyB;IAEjB;IACA;IAFnB,YACmB,OAAwB,EACxB,MAAc;QADd,YAAO,GAAP,OAAO,CAAiB;QACxB,WAAM,GAAN,MAAM,CAAQ;IAC9B,CAAC;IAEJ;;;;;;;OAOG;IACH,KAAK,CAAC,WAAW,CACf,SAA8B,EAC9B,QAAgB,EAChB,SAAiB;QAEjB,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAEnC,
|
|
1
|
+
{"version":3,"file":"CodeEnrichmentTaskCreator.js","sourceRoot":"","sources":["../../../src/engine/enrichment/CodeEnrichmentTaskCreator.ts"],"names":[],"mappings":"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"}
|
|
@@ -68,9 +68,31 @@ export class KnowledgeService {
|
|
|
68
68
|
}
|
|
69
69
|
/** Save checkpoint (+ optional writes / messages) — projection updated. */
|
|
70
70
|
async saveCheckpoint(ctx, threadId, input) {
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
const workspaceId = this.resolveWorkspaceId(ctx);
|
|
72
|
+
let thread = await this.ownedThread(ctx, threadId);
|
|
73
|
+
if (!thread) {
|
|
74
|
+
// LangGraph generates arbitrary thread_id UUIDs per run and persists via the
|
|
75
|
+
// checkpointer without a prior POST /threads — auto-create the thread if it
|
|
76
|
+
// genuinely does not exist (mock contract, IT-HYD-03). A thread owned by
|
|
77
|
+
// another workspace is NEVER created or written (SECURITY-REVIEW #18 → 404).
|
|
78
|
+
const existing = await this.db.getThread(threadId);
|
|
79
|
+
if (existing)
|
|
80
|
+
return null;
|
|
81
|
+
if (!isUuidV4(threadId))
|
|
82
|
+
return null;
|
|
83
|
+
const now = new Date().toISOString();
|
|
84
|
+
thread = {
|
|
85
|
+
thread_id: threadId,
|
|
86
|
+
workspace_id: workspaceId,
|
|
87
|
+
title: 'Auto thread',
|
|
88
|
+
agent_id: null,
|
|
89
|
+
status: 'active',
|
|
90
|
+
created_at: now,
|
|
91
|
+
updated_at: now,
|
|
92
|
+
};
|
|
93
|
+
await this.db.createThread(thread);
|
|
94
|
+
await this.db.appendEvent(workspaceId, threadId, 'THREAD_CREATED', { title: thread.title, agent_id: null });
|
|
95
|
+
}
|
|
74
96
|
const checkpoint = await this.db.upsertCheckpoint(thread.workspace_id, threadId, input);
|
|
75
97
|
const messages = input.messages ?? [];
|
|
76
98
|
const seqBase = await this.db.countMessages(threadId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KnowledgeService.js","sourceRoot":"","sources":["../../src/knowledge/KnowledgeService.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"KnowledgeService.js","sourceRoot":"","sources":["../../src/knowledge/KnowledgeService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAcjC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAMvC,MAAM,OAAO,gBAAgB;IAIR;IACA;IAJF,gBAAgB,CAAS;IAE1C,YACmB,EAAe,EACf,MAAc,EAC/B,UAAmC,EAAE;QAFpB,OAAE,GAAF,EAAE,CAAa;QACf,WAAM,GAAN,MAAM,CAAQ;QAG/B,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,SAAS,CAAC;IAChE,CAAC;IAED,gEAAgE;IAChE,kBAAkB,CAAC,GAAmB;QACpC,OAAO,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,gBAAgB,CAAC;IACnE,CAAC;IAED,sEAAsE;IAC9D,KAAK,CAAC,WAAW,CAAC,GAAmB,EAAE,QAAgB;QAC7D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACjF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAmB,EAAE,KAAwB;QAC9D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,MAAM,GAAW;YACrB,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE;YAC9B,YAAY,EAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;YAC1C,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,YAAY;YAC1C,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;YAChC,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,GAAG;SAChB,CAAC;QACF,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,gBAAgB,EAAE;YACjF,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACvG,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAmB;QACnC,OAAO,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAmB,EAAE,QAAgB;QACnD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAmB,EAAE,QAAgB;QACrD,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QACxD,OAAO,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAmB,EAAE,QAAgB;QACvD,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QACxD,OAAO,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,cAAc,CAAC,GAAmB,EAAE,QAAgB,EAAE,KAA0B;QACpF,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,6EAA6E;YAC7E,4EAA4E;YAC5E,yEAAyE;YACzE,6EAA6E;YAC7E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACnD,IAAI,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC1B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAC;YACrC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,GAAG;gBACP,SAAS,EAAE,QAAQ;gBACnB,YAAY,EAAE,WAAW;gBACzB,KAAK,EAAE,aAAa;gBACpB,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,GAAG;aAChB,CAAC;YACF,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9G,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACxF,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE;YAC3E,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,MAAM;YAC1D,QAAQ,EAAE,QAAQ,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAC3F,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAmB,EAAE,QAAgB;QACnD,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QACxD,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAmB,EAAE,QAAgB;QACtD,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QACxD,OAAO,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAmB,EAAE,QAAgB,EAAE,KAAwD;QAC/G,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,QAAQ,GAAa;YACzB,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;YACvB,SAAS,EAAE,QAAQ;YACnB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;YAC9B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC;QACF,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACnH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,GAAmB,EAAE,QAAgB,EAAE,KAA4G;QACxK,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,IAAI,GAAkB;YAC1B,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;YACvB,SAAS,EAAE,QAAQ;YACnB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;YAC5B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC;QACF,MAAM,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7H,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAA+C;QAC/D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,KAAK,GAAU,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;QACpE,OAAO,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAmB,EAAE,QAAgB;QACtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -442,8 +442,11 @@ export class TaskWorker {
|
|
|
442
442
|
}
|
|
443
443
|
async handleTaskError(task, err) {
|
|
444
444
|
this.consecutiveErrors++;
|
|
445
|
+
// SA4E-106: Non-retryable patterns include CODE_ENRICHMENT-specific errors
|
|
445
446
|
const nonRetryable = err.message.includes('invalid_json')
|
|
446
|
-
|| err.message.includes('entry_not_found')
|
|
447
|
+
|| err.message.includes('entry_not_found')
|
|
448
|
+
|| err.message.includes('invalid_payload')
|
|
449
|
+
|| err.message.includes('symbol_not_found');
|
|
447
450
|
if (nonRetryable || task.retry_count + 1 >= task.max_retries) {
|
|
448
451
|
await this.repo.markFailed(task.id, err.message);
|
|
449
452
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskWorker.js","sourceRoot":"","sources":["../../../../src/modules/memory/task-queue/TaskWorker.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TaskWorker.js","sourceRoot":"","sources":["../../../../src/modules/memory/task-queue/TaskWorker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAGnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAYzD,MAAM,OAAO,UAAU;IACJ,IAAI,CAAwB;IAC5B,MAAM,CAAmB;IACzB,MAAM,CAAS;IACf,MAAM,CAAe;IAC9B,WAAW,CAAsB;IACjC,gBAAgB,CAAoB;IACpC,UAAU,CAAsC;IAChD,OAAO,GAAG,KAAK,CAAC;IAChB,SAAS,GAAyC,IAAI,CAAC;IACvD,gBAAgB,GAAG,CAAC,CAAC;IACrB,UAAU,GAAkB,IAAI,CAAC;IACjC,UAAU,GAAG,KAAK,CAAC;IACnB,eAAe,GAAwB,IAAI,CAAC;IACpD,uEAAuE;IAC/D,eAAe,GAA0E,IAAI,CAAC;IACtG,mFAAmF;IAC3E,iBAAiB,GAAW,CAAC,CAAC;IAC9B,iBAAiB,GAAG,CAAC,CAAC;IAE9B,YACE,EAAmB,EACnB,MAAoB,EACpB,MAAc,EACd,MAAkC;QAElC,IAAI,CAAC,IAAI,GAAG,IAAI,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,0BAA0B,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7D,CAAC;IAED,cAAc,CAAC,QAA4B,IAAU,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC;IACnF,mBAAmB,CAAC,OAAyB,IAAU,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC;IACzF,aAAa,CAAC,OAA2C,IAAU,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC;IAC/F,0EAA0E;IAClE,qBAAqB,CAAyB;IACtD,wBAAwB,CAAC,OAA8B,IAAU,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAC,CAAC,CAAC;IAExG;;;;OAIG;IACH,YAAY,CAAC,KAAsF;QACjG,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,MAAc,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;YAAG,IAAI,CAAC,MAAc,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QAC7F,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;YAAG,IAAI,CAAC,MAAc,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAC1F,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,EAChF,kCAAkC,CACnC,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACvC,oFAAoF;QACpF,IAAI,CAAC,wBAAwB,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,8CAA8C,CAAC,CAC1E,CAAC;QACF,mFAAmF;QACnF,gFAAgF;QAChF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAAC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAAC,CAAC;QAC3F,OAAO,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,wBAAwB;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACpD,IAAI,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,qDAAqD,CAAC,CAAC;QAC3G,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAChF,IAAI,SAAS,GAAG,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,uBAAuB,CAAC,CAAC;QAC5E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3C,OAAO,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IAC9E,CAAC;IAED,kEAAkE;IAClE,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO,IAAI,CAAC;QAC3D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC;QACjE,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC;QAChC,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI;YAChC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI;YAC/B,OAAO;YACP,KAAK;YACL,OAAO;SACR,CAAC;IACJ,CAAC;IAED,aAAa,KAA4B,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE5D,+DAA+D;IAC/D,SAAS,KAAuB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAErD,yDAAyD;IACzD,oBAAoB,KAAa,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAEjE,gBAAgB;IAER,YAAY,CAAC,OAAe;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QACrD,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,sFAAsF;YACtF,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;YACpD,IAAI,IAAI,CAAC,iBAAiB,KAAK,CAAC;gBAAE,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC;YAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC;YAC1C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACrD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,IAAI,CAAC,gBAAgB,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;oBACnE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,EAAE,EACtE,qCAAqC,CAAC,CAAC;gBAC3C,CAAC;gBACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAC7D,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAC3B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACzB,OAAO;YACT,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EACnF,kCAAkC,CAAC,CAAC;YACtC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,qCAAqC;YACrC,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC;YAC5C,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpE,uEAAuE;YACvE,sFAAsF;YACtF,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,GAAG,YAAY,CAAC;YAC9D,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;gBACxB,yCAAyC;gBACzC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC7E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,EAChH,4CAA4C,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBAC3B,gDAAgD;gBAChD,IAAI,IAAI,CAAC,iBAAiB,GAAG,cAAc,EAAE,CAAC;oBAC5C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;gBAChF,CAAC;YACH,CAAC;YACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAAC,IAAI,CAAC,cAAc,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YACrD,kCAAkC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,IAAI,CAAC;gBACvC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC;gBAC9B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YAC7B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAC;YAC/C,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;YAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACvC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,IAAiB;QACzC,IAAI,CAAC;YACH,sEAAsE;YACtE,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,eAAe,EAAE,CAAC;gBAChD,IAAI,CAAC,eAAe,GAAG,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBACvG,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBACvC,OAAO;YACT,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxD,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC/E,IAAI,OAAY,CAAC;YACjB,IAAI,CAAC;gBAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YAC3C,MAAM,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,sBAAsB,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACxE,sDAAsD;YACtD,MAAM,IAAI,GAAI,KAAa,CAAC,MAAM,IAAI,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC/D,IAAI,CAAC,eAAe,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAC5E,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;gBACvB,KAAK,QAAQ,CAAC,cAAc;oBAC1B,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBAC/C,MAAM;gBACR,KAAK,QAAQ,CAAC,gBAAgB;oBAC5B,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBACjD,MAAM;gBACR;oBACE,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,sBAAsB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAAC,CAAC;IAC/D,CAAC;IAED,yCAAyC;IAEjC,KAAK,CAAC,oBAAoB,CAAC,IAAiB,EAAE,OAAY;QAChE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAEpE,8DAA8D;QAC9D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC/E,IAAK,KAAa,CAAC,iBAAiB,KAAK,MAAM,EAAE,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,4CAA4C,CAAC,CAAC;YAC5F,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB;YAC5C,CAAC,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC;YAC/D,CAAC,CAAC,IAAI,CAAC;QAET,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,CAAC,mBAAmB;gBACvF,SAAS,EAAE,YAAY,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE7F,8EAA8E;QAC9E,yDAAyD;QACzD,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,IAAI,SAAS,CAAC;YAClD,MAAM,QAAQ,GAAG,0BAA0B,MAAM,EAAE,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,EAC7F,wDAAwD,CAAC,CAAC;YAC5D,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC9C,gFAAgF;YAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC9B,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAClC,OAAO,EAAE,IAAI,CAAC,EAAE;gBAChB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,aAAa,EAAE,IAAI;gBACnB,eAAe,EAAE;oBACf,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,KAAK,IAAI,SAAS;oBACvD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,aAAa,EAAE,IAAI;oBACnB,KAAK,EAAE,MAAM;iBACd;aACF,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CACrC,8HAA8H,EAC9H,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAC1B,CAAC;YACF,OAAO;QACT,CAAC;QAED,qFAAqF;QACrF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/D,IAAI,CAAC,YAAY,IAAK,YAAoB,CAAC,iBAAiB,KAAK,MAAM,EAAE,CAAC;YACxE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,2DAA2D,CAAC,CAAC;YAC3G,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa;gBACpC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC/E,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAClE,wEAAwE;YACxE,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CACrC,sFAAsF,EACtF,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAClC,CAAC;QACJ,CAAC;QAED,oEAAoE;QACpE,MAAM,IAAI,CAAC,mCAAmC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAE/E,oFAAoF;QACpF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CAC1D;;sDAEgD,EAChD,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CACrB,CAAC;QAEF,IAAI,YAAY,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,oDAAoD,CAAC,CAAC;QACtG,CAAC;QAED,yEAAyE;QACzE,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,OAAe,EACf,MAAqB;QAErB,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CACvD,uGAAuG,EACvG,CAAC,MAAM,EAAE,OAAO,CAAC,CAClB,CAAC;YACF,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,EAC9D,2BAA2B,CAAC,CAAC;gBAC/B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,GAAG,GAAG,sBAAsB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAC7D,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,iBAAiB,IAAI,GAAG,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;gBACnF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,EAC9D,0CAA0C,CAAC,CAAC;gBAC9C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO;gBACL,mBAAmB,EAAE,SAAS,CAAC,EAAE;gBACjC,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;gBACxE,iBAAiB,EAAE,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC5D,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtC,cAAc,EAAE,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;aACxD,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,EAClE,iCAAiC,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,wBAAwB,CACpC,OAAe,EACf,MAAyB,EACzB,OAAkC;QAElC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC9D,MAAM,aAAa,GAAsB;gBACvC,IAAI,EAAE,MAAM,CAAC,WAAW;gBACxB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,IAAI,EAAE;gBACjD,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,EAAE;gBACjD,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;gBAC3B,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,EAAE;gBAC3C,aAAa,EAAE,QAAQ,CAAC,aAAa;gBACrC,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;oBACvB,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;oBAChD,gBAAgB,EAAE,OAAO,CAAC,OAAO;iBAClC,CAAC,CAAC,CAAC,SAAS;gBACb,eAAe,EAAE;oBACf,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,KAAK,IAAI,SAAS;oBACvD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,aAAa,EAAE,MAAM,CAAC,YAAY;oBAClC,qBAAqB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB;iBACtD;aACF,CAAC;YACF,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAC5C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,IAAI,MAAM,CAAC,EAAE,CAAC;gBAClE,aAAa,CAAC,cAAc,GAAG,CAAC,aAAa,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChF,aAAa,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,EACnF,4CAA4C,CAAC,CAAC;gBAChD,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAC1C,CAAC;YACD,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,EAClE,8BAA8B,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,uFAAuF;IAC/E,KAAK,CAAC,mCAAmC,CAC/C,OAAe,EACf,MAAyB,EACzB,OAAkC;QAElC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,IAAK,KAAa,CAAC,iBAAiB,KAAK,MAAM;gBAAE,OAAO;YACxD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC9D,MAAM,aAAa,GAAsB;gBACvC,IAAI,EAAE,MAAM,CAAC,WAAW;gBACxB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,IAAI,EAAE;gBACjD,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,EAAE;gBACjD,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;gBAC3B,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,EAAE;gBAC3C,aAAa,EAAE,QAAQ,CAAC,aAAa;gBACrC,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;oBACvB,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;oBAChD,gBAAgB,EAAE,OAAO,CAAC,OAAO;iBAClC,CAAC,CAAC,CAAC,SAAS;gBACb,eAAe,EAAE;oBACf,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,KAAK,IAAI,SAAS;oBACvD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,aAAa,EAAE,MAAM,CAAC,YAAY;oBAClC,qBAAqB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB;iBACtD;aACF,CAAC;YACF,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAC5C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,IAAI,MAAM,CAAC,EAAE,CAAC;gBAClE,aAAa,CAAC,cAAc,GAAG,CAAC,aAAa,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChF,aAAa,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChE,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAC1C,CAAC;YACD,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CACrC,gGAAgG,EAChG,CAAC,OAAO,EAAE,OAAO,CAAC,CACnB,CAAC;YACF,kGAAkG;YAClG,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBAC1B,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CACrC,yFAAyF,EACzF,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CACjC,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,EAClE,0CAA0C,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,mEAAmE;IAC3D,KAAK,CAAC,qBAAqB,CAAC,IAAiB;QACnD,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC9E,MAAM,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,IAAiB,EAAE,OAAY;QAClE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3E,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CACrC,sDAAsD,EACtD,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CACrB,CAAC;QACF,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,IAAiB,EAAE,GAAU;QACzD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,2EAA2E;QAC3E,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;eACpD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;eACvC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;eACvC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QAC9C,IAAI,YAAY,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC7D,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACjD,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -41,11 +41,13 @@ export class CodeEnrichmentTaskCreator {
|
|
|
41
41
|
): Promise<number> {
|
|
42
42
|
if (symbolIds.size === 0) return 0;
|
|
43
43
|
|
|
44
|
-
// Cross-scope dedup
|
|
44
|
+
// SA4E-106: Cross-scope dedup — copy enrichment data instead of just skipping
|
|
45
45
|
const enrichedElsewhere = await this.isFileEnrichedInOtherScope(filePath, projectId);
|
|
46
46
|
if (enrichedElsewhere) {
|
|
47
|
-
this.
|
|
48
|
-
|
|
47
|
+
const copied = await this.copyEnrichmentFromOtherScope(filePath, projectId);
|
|
48
|
+
this.logger.debug({ filePath, projectId, copied },
|
|
49
|
+
'[enrichment] Cross-scope copy — enrichment data copied from another scope');
|
|
50
|
+
return 0; // No new LLM tasks needed
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
let created = 0;
|
|
@@ -122,30 +124,97 @@ export class CodeEnrichmentTaskCreator {
|
|
|
122
124
|
return !(row?.enrichment_status === 'COMPLETED' && row?.summary);
|
|
123
125
|
}
|
|
124
126
|
|
|
127
|
+
/**
|
|
128
|
+
* SA4E-106: Copy enrichment data from an already-enriched scope to current project.
|
|
129
|
+
* Matches by file content_hash + symbol name + kind.
|
|
130
|
+
* Uses COALESCE for pseudo_code to preserve PegaLogicNormalizer output.
|
|
131
|
+
* @param filePath - Relative file path in current project
|
|
132
|
+
* @param projectId - Current project ID
|
|
133
|
+
* @returns Number of symbols updated
|
|
134
|
+
*/
|
|
135
|
+
private async copyEnrichmentFromOtherScope(filePath: string, projectId: string): Promise<number> {
|
|
136
|
+
const sourceFileId = await this.findSourceFileId(filePath, projectId);
|
|
137
|
+
if (!sourceFileId) return 0;
|
|
138
|
+
|
|
139
|
+
const targetFileId = await this.findTargetFileId(filePath, projectId);
|
|
140
|
+
if (!targetFileId) return 0;
|
|
141
|
+
|
|
142
|
+
const sourceSymbols = await this.loadEnrichedSymbols(sourceFileId);
|
|
143
|
+
return this.applyEnrichmentCopy(sourceSymbols, targetFileId);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** Find a source file (another project) with enriched symbols for same content. */
|
|
147
|
+
private async findSourceFileId(filePath: string, projectId: string): Promise<number | null> {
|
|
148
|
+
const currentFile = await this.adapter.getAsync<{ content_hash: string }>(
|
|
149
|
+
'SELECT content_hash FROM files WHERE relative_path = ? AND project_id = ?',
|
|
150
|
+
[filePath, projectId],
|
|
151
|
+
);
|
|
152
|
+
if (!currentFile?.content_hash) return null;
|
|
153
|
+
|
|
154
|
+
const sourceFile = await this.adapter.getAsync<{ id: number }>(
|
|
155
|
+
`SELECT f.id FROM files f
|
|
156
|
+
JOIN symbols s ON s.file_id = f.id
|
|
157
|
+
WHERE f.content_hash = ? AND f.project_id != ?
|
|
158
|
+
AND s.enrichment_status = 'COMPLETED'
|
|
159
|
+
LIMIT 1`,
|
|
160
|
+
[currentFile.content_hash, projectId],
|
|
161
|
+
);
|
|
162
|
+
return sourceFile?.id ?? null;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** Get the target file ID in the current project. */
|
|
166
|
+
private async findTargetFileId(filePath: string, projectId: string): Promise<number | null> {
|
|
167
|
+
const targetFile = await this.adapter.getAsync<{ id: number }>(
|
|
168
|
+
'SELECT id FROM files WHERE relative_path = ? AND project_id = ?',
|
|
169
|
+
[filePath, projectId],
|
|
170
|
+
);
|
|
171
|
+
return targetFile?.id ?? null;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** Load enriched symbols from source file. */
|
|
175
|
+
private async loadEnrichedSymbols(sourceFileId: number) {
|
|
176
|
+
return this.adapter.allAsync<{
|
|
177
|
+
name: string; kind: string; summary: string | null;
|
|
178
|
+
pseudo_code: string | null; llm_tags: string | null;
|
|
179
|
+
}>(
|
|
180
|
+
`SELECT name, kind, summary, pseudo_code, llm_tags FROM symbols
|
|
181
|
+
WHERE file_id = ? AND enrichment_status = 'COMPLETED'`,
|
|
182
|
+
[sourceFileId],
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** Apply enrichment copy from source symbols to target file symbols. */
|
|
187
|
+
private async applyEnrichmentCopy(
|
|
188
|
+
sourceSymbols: { name: string; kind: string; summary: string | null; pseudo_code: string | null; llm_tags: string | null }[],
|
|
189
|
+
targetFileId: number,
|
|
190
|
+
): Promise<number> {
|
|
191
|
+
let copied = 0;
|
|
192
|
+
for (const src of sourceSymbols) {
|
|
193
|
+
if (!src.summary) continue;
|
|
194
|
+
const result = await this.adapter.runAsync(
|
|
195
|
+
`UPDATE symbols SET
|
|
196
|
+
summary = ?,
|
|
197
|
+
pseudo_code = COALESCE(?, pseudo_code),
|
|
198
|
+
llm_tags = ?,
|
|
199
|
+
enrichment_status = 'COMPLETED',
|
|
200
|
+
enriched_at = datetime('now')
|
|
201
|
+
WHERE file_id = ? AND name = ? AND kind = ?
|
|
202
|
+
AND (enrichment_status IS NULL OR enrichment_status != 'COMPLETED')`,
|
|
203
|
+
[src.summary, src.pseudo_code, src.llm_tags, targetFileId, src.name, src.kind],
|
|
204
|
+
);
|
|
205
|
+
if (result?.changes && result.changes > 0) copied++;
|
|
206
|
+
}
|
|
207
|
+
return copied;
|
|
208
|
+
}
|
|
209
|
+
|
|
125
210
|
/**
|
|
126
211
|
* Cross-scope dedup: check if the same file (by content_hash) has already been
|
|
127
212
|
* enriched in another project. If yes, skip LLM task creation entirely.
|
|
128
|
-
* The enrichment data remains queryable from the other project's symbols.
|
|
129
213
|
*/
|
|
130
214
|
private async isFileEnrichedInOtherScope(filePath: string, currentProjectId: string): Promise<boolean> {
|
|
131
215
|
try {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
'SELECT content_hash FROM files WHERE relative_path = ? AND project_id = ?',
|
|
135
|
-
[filePath, currentProjectId],
|
|
136
|
-
);
|
|
137
|
-
if (!currentFile?.content_hash) return false;
|
|
138
|
-
|
|
139
|
-
// Check if same hash exists in another project with at least one enriched symbol
|
|
140
|
-
const enrichedElsewhere = await this.adapter.getAsync<{ id: number }>(
|
|
141
|
-
`SELECT f.id FROM files f
|
|
142
|
-
JOIN symbols s ON s.file_id = f.id
|
|
143
|
-
WHERE f.content_hash = ? AND f.project_id != ?
|
|
144
|
-
AND s.enrichment_status = 'COMPLETED'
|
|
145
|
-
LIMIT 1`,
|
|
146
|
-
[currentFile.content_hash, currentProjectId],
|
|
147
|
-
);
|
|
148
|
-
return !!enrichedElsewhere;
|
|
216
|
+
const sourceId = await this.findSourceFileId(filePath, currentProjectId);
|
|
217
|
+
return sourceId !== null;
|
|
149
218
|
} catch {
|
|
150
219
|
// Non-fatal: if query fails (table missing, etc.), proceed with task creation
|
|
151
220
|
return false;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SA4E-106: CodeEnrichmentTaskCreator — cross-scope enrichment copy.
|
|
3
|
+
* Verifies copyEnrichmentFromOtherScope copies summary, pseudo_code, llm_tags
|
|
4
|
+
* from enriched symbols in another project to the current project.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
8
|
+
import { CodeEnrichmentTaskCreator } from '../CodeEnrichmentTaskCreator.js';
|
|
9
|
+
import type { DatabaseAdapter } from '../../../database/adapters/DatabaseAdapter.js';
|
|
10
|
+
import pino from 'pino';
|
|
11
|
+
|
|
12
|
+
const logger = pino({ level: 'silent' });
|
|
13
|
+
|
|
14
|
+
/** Create mock DB adapter with controllable query responses. */
|
|
15
|
+
function createMockAdapter() {
|
|
16
|
+
return {
|
|
17
|
+
getAsync: vi.fn(),
|
|
18
|
+
allAsync: vi.fn(() => Promise.resolve([])),
|
|
19
|
+
runAsync: vi.fn(() => Promise.resolve({ changes: 0, lastInsertRowid: 0 })),
|
|
20
|
+
getEngine: vi.fn(() => 'sqlite'),
|
|
21
|
+
} as unknown as DatabaseAdapter;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
describe('SA4E-106: copyEnrichmentFromOtherScope', () => {
|
|
25
|
+
let adapter: DatabaseAdapter;
|
|
26
|
+
let creator: CodeEnrichmentTaskCreator;
|
|
27
|
+
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
adapter = createMockAdapter();
|
|
30
|
+
creator = new CodeEnrichmentTaskCreator(adapter, logger);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('copies enrichment data from source scope to target', async () => {
|
|
34
|
+
// Setup: current file has content_hash
|
|
35
|
+
(adapter.getAsync as any)
|
|
36
|
+
.mockResolvedValueOnce({ content_hash: 'abc123' }) // findSourceFileId -> currentFile
|
|
37
|
+
.mockResolvedValueOnce({ id: 10 }) // findSourceFileId -> sourceFile
|
|
38
|
+
.mockResolvedValueOnce({ id: 20 }); // findTargetFileId -> targetFile
|
|
39
|
+
|
|
40
|
+
// Source symbols enriched
|
|
41
|
+
(adapter.allAsync as any).mockResolvedValueOnce([
|
|
42
|
+
{ name: 'MyClass', kind: 'class', summary: 'A utility class', pseudo_code: null, llm_tags: 'domain:util' },
|
|
43
|
+
{ name: 'process', kind: 'function', summary: 'Process data', pseudo_code: 'load then transform', llm_tags: 'responsibility:processing' },
|
|
44
|
+
]);
|
|
45
|
+
|
|
46
|
+
// Both updates succeed
|
|
47
|
+
(adapter.runAsync as any)
|
|
48
|
+
.mockResolvedValueOnce({ changes: 1, lastInsertRowid: 0 })
|
|
49
|
+
.mockResolvedValueOnce({ changes: 1, lastInsertRowid: 0 });
|
|
50
|
+
|
|
51
|
+
const result = await (creator as any).copyEnrichmentFromOtherScope('src/utils.ts', 'project-B');
|
|
52
|
+
expect(result).toBe(2);
|
|
53
|
+
expect(adapter.runAsync).toHaveBeenCalledTimes(2);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('returns 0 when no content_hash exists for current file', async () => {
|
|
57
|
+
(adapter.getAsync as any).mockResolvedValueOnce(null);
|
|
58
|
+
|
|
59
|
+
const result = await (creator as any).copyEnrichmentFromOtherScope('src/new.ts', 'project-B');
|
|
60
|
+
expect(result).toBe(0);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('returns 0 when no source file found in other scope', async () => {
|
|
64
|
+
(adapter.getAsync as any)
|
|
65
|
+
.mockResolvedValueOnce({ content_hash: 'abc123' })
|
|
66
|
+
.mockResolvedValueOnce(null); // No source file
|
|
67
|
+
|
|
68
|
+
const result = await (creator as any).copyEnrichmentFromOtherScope('src/file.ts', 'project-B');
|
|
69
|
+
expect(result).toBe(0);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('returns 0 when target file not found in current project', async () => {
|
|
73
|
+
(adapter.getAsync as any)
|
|
74
|
+
.mockResolvedValueOnce({ content_hash: 'abc123' })
|
|
75
|
+
.mockResolvedValueOnce({ id: 10 })
|
|
76
|
+
.mockResolvedValueOnce(null); // No target file
|
|
77
|
+
|
|
78
|
+
const result = await (creator as any).copyEnrichmentFromOtherScope('src/file.ts', 'project-B');
|
|
79
|
+
expect(result).toBe(0);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('skips source symbols without summary', async () => {
|
|
83
|
+
(adapter.getAsync as any)
|
|
84
|
+
.mockResolvedValueOnce({ content_hash: 'abc123' })
|
|
85
|
+
.mockResolvedValueOnce({ id: 10 })
|
|
86
|
+
.mockResolvedValueOnce({ id: 20 });
|
|
87
|
+
|
|
88
|
+
// One symbol has no summary -> should be skipped
|
|
89
|
+
(adapter.allAsync as any).mockResolvedValueOnce([
|
|
90
|
+
{ name: 'Helper', kind: 'class', summary: null, pseudo_code: null, llm_tags: null },
|
|
91
|
+
{ name: 'run', kind: 'function', summary: 'Run logic', pseudo_code: 'call api', llm_tags: 'domain:api' },
|
|
92
|
+
]);
|
|
93
|
+
|
|
94
|
+
(adapter.runAsync as any).mockResolvedValueOnce({ changes: 1, lastInsertRowid: 0 });
|
|
95
|
+
|
|
96
|
+
const result = await (creator as any).copyEnrichmentFromOtherScope('src/file.ts', 'project-B');
|
|
97
|
+
expect(result).toBe(1); // Only 'run' copied
|
|
98
|
+
expect(adapter.runAsync).toHaveBeenCalledTimes(1);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('uses COALESCE for pseudo_code to preserve existing values', async () => {
|
|
102
|
+
(adapter.getAsync as any)
|
|
103
|
+
.mockResolvedValueOnce({ content_hash: 'abc123' })
|
|
104
|
+
.mockResolvedValueOnce({ id: 10 })
|
|
105
|
+
.mockResolvedValueOnce({ id: 20 });
|
|
106
|
+
|
|
107
|
+
(adapter.allAsync as any).mockResolvedValueOnce([
|
|
108
|
+
{ name: 'PegaFlow', kind: 'pega_flow', summary: 'A flow', pseudo_code: 'new pseudo', llm_tags: 'domain:pega' },
|
|
109
|
+
]);
|
|
110
|
+
|
|
111
|
+
(adapter.runAsync as any).mockResolvedValueOnce({ changes: 1, lastInsertRowid: 0 });
|
|
112
|
+
|
|
113
|
+
await (creator as any).copyEnrichmentFromOtherScope('src/flow.ts', 'project-B');
|
|
114
|
+
|
|
115
|
+
// Verify COALESCE is used in the SQL (pseudo_code param passed)
|
|
116
|
+
const sqlCall = (adapter.runAsync as any).mock.calls[0];
|
|
117
|
+
expect(sqlCall[0]).toContain('COALESCE');
|
|
118
|
+
expect(sqlCall[1]).toContain('new pseudo');
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
describe('SA4E-106: createTasks calls copyEnrichmentFromOtherScope', () => {
|
|
123
|
+
let adapter: DatabaseAdapter;
|
|
124
|
+
let creator: CodeEnrichmentTaskCreator;
|
|
125
|
+
|
|
126
|
+
beforeEach(() => {
|
|
127
|
+
adapter = createMockAdapter();
|
|
128
|
+
creator = new CodeEnrichmentTaskCreator(adapter, logger);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('copies enrichment and returns 0 when file enriched in other scope', async () => {
|
|
132
|
+
// isFileEnrichedInOtherScope returns true
|
|
133
|
+
(adapter.getAsync as any)
|
|
134
|
+
.mockResolvedValueOnce({ content_hash: 'hash1' }) // isFileEnrichedInOtherScope -> currentFile
|
|
135
|
+
.mockResolvedValueOnce({ id: 5 }) // isFileEnrichedInOtherScope -> enrichedElsewhere
|
|
136
|
+
// copyEnrichmentFromOtherScope
|
|
137
|
+
.mockResolvedValueOnce({ content_hash: 'hash1' }) // findSourceFileId -> currentFile
|
|
138
|
+
.mockResolvedValueOnce({ id: 5 }) // findSourceFileId -> sourceFile
|
|
139
|
+
.mockResolvedValueOnce({ id: 15 }); // findTargetFileId -> targetFile
|
|
140
|
+
|
|
141
|
+
(adapter.allAsync as any).mockResolvedValueOnce([
|
|
142
|
+
{ name: 'Foo', kind: 'class', summary: 'Foo class', pseudo_code: null, llm_tags: 'domain:core' },
|
|
143
|
+
]);
|
|
144
|
+
(adapter.runAsync as any).mockResolvedValueOnce({ changes: 1, lastInsertRowid: 0 });
|
|
145
|
+
|
|
146
|
+
const symbolIds = new Map([['Foo', 1]]);
|
|
147
|
+
const result = await creator.createTasks(symbolIds, 'src/foo.ts', 'project-new');
|
|
148
|
+
|
|
149
|
+
// Returns 0 (no LLM tasks needed) but copy happened
|
|
150
|
+
expect(result).toBe(0);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SA4E-106: End-to-end enrichment flow integration test.
|
|
3
|
+
* Verifies: TaskWorker receives CODE_ENRICHMENT task -> dispatches to handler
|
|
4
|
+
* -> handler processes symbol -> symbols table updated with enrichment data.
|
|
5
|
+
* Also verifies Pega symbol enrichment routing.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
9
|
+
import { TaskWorker } from '../../../modules/memory/task-queue/TaskWorker.js';
|
|
10
|
+
import { TaskType, TaskStatus } from '../../../modules/memory/task-queue/models.js';
|
|
11
|
+
import type { PendingTask } from '../../../modules/memory/task-queue/models.js';
|
|
12
|
+
import type { DatabaseAdapter } from '../../../database/adapters/DatabaseAdapter.js';
|
|
13
|
+
import type { MemoryEngine } from '../../../modules/memory/engine/index.js';
|
|
14
|
+
import type { CodeEnrichmentHandler } from '../CodeEnrichmentHandler.js';
|
|
15
|
+
import pino from 'pino';
|
|
16
|
+
|
|
17
|
+
const logger = pino({ level: 'silent' });
|
|
18
|
+
|
|
19
|
+
function createMockDb(): DatabaseAdapter {
|
|
20
|
+
return {
|
|
21
|
+
getAsync: vi.fn(),
|
|
22
|
+
allAsync: vi.fn(() => Promise.resolve([])),
|
|
23
|
+
runAsync: vi.fn(() => Promise.resolve({ changes: 0, lastInsertRowid: 0 })),
|
|
24
|
+
getEngine: vi.fn(() => 'sqlite'),
|
|
25
|
+
} as unknown as DatabaseAdapter;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function createMockEngine(): MemoryEngine {
|
|
29
|
+
const mockAdapter = {
|
|
30
|
+
getAsync: vi.fn(),
|
|
31
|
+
allAsync: vi.fn(() => Promise.resolve([])),
|
|
32
|
+
runAsync: vi.fn(() => Promise.resolve({ changes: 0 })),
|
|
33
|
+
getEngine: vi.fn(() => 'sqlite'),
|
|
34
|
+
};
|
|
35
|
+
return {
|
|
36
|
+
findById: vi.fn(),
|
|
37
|
+
updateTags: vi.fn(),
|
|
38
|
+
updateStructuredMap: vi.fn(),
|
|
39
|
+
getAdapter: vi.fn(() => mockAdapter),
|
|
40
|
+
} as unknown as MemoryEngine;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
describe('SA4E-106: End-to-end enrichment flow', () => {
|
|
44
|
+
let db: DatabaseAdapter;
|
|
45
|
+
let engine: MemoryEngine;
|
|
46
|
+
|
|
47
|
+
beforeEach(() => {
|
|
48
|
+
db = createMockDb();
|
|
49
|
+
engine = createMockEngine();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('dispatches CODE_ENRICHMENT task to handler and marks completed', async () => {
|
|
53
|
+
const handler: CodeEnrichmentHandler = {
|
|
54
|
+
enrichSymbol: vi.fn().mockResolvedValue(undefined),
|
|
55
|
+
} as any;
|
|
56
|
+
|
|
57
|
+
const worker = new TaskWorker(db, engine, logger, {});
|
|
58
|
+
worker.setCodeEnrichmentHandler(handler);
|
|
59
|
+
const repo = (worker as any).repo;
|
|
60
|
+
vi.spyOn(repo, 'markCompleted').mockResolvedValue(undefined);
|
|
61
|
+
|
|
62
|
+
const task: PendingTask = {
|
|
63
|
+
id: 1,
|
|
64
|
+
task_type: TaskType.CODE_ENRICHMENT,
|
|
65
|
+
entry_id: 100,
|
|
66
|
+
status: TaskStatus.PROCESSING,
|
|
67
|
+
payload: JSON.stringify({
|
|
68
|
+
symbolId: 100, symbolName: 'MyClass', symbolKind: 'class',
|
|
69
|
+
projectId: 'proj-1', filePath: 'src/a.ts', workspaceType: 'standard',
|
|
70
|
+
}),
|
|
71
|
+
error: null,
|
|
72
|
+
retry_count: 0,
|
|
73
|
+
max_retries: 3,
|
|
74
|
+
created_at: '2025-01-01T00:00:00Z',
|
|
75
|
+
started_at: null,
|
|
76
|
+
completed_at: null,
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
await (worker as any).processTask(task);
|
|
80
|
+
|
|
81
|
+
expect(handler.enrichSymbol).toHaveBeenCalledWith(task);
|
|
82
|
+
expect(repo.markCompleted).toHaveBeenCalledWith(1);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('resets for retry when handler not injected', async () => {
|
|
86
|
+
const worker = new TaskWorker(db, engine, logger, {});
|
|
87
|
+
const repo = (worker as any).repo;
|
|
88
|
+
vi.spyOn(repo, 'resetForRetry').mockResolvedValue(undefined);
|
|
89
|
+
vi.spyOn(repo, 'markCompleted').mockResolvedValue(undefined);
|
|
90
|
+
|
|
91
|
+
const task: PendingTask = {
|
|
92
|
+
id: 2,
|
|
93
|
+
task_type: TaskType.CODE_ENRICHMENT,
|
|
94
|
+
entry_id: 200,
|
|
95
|
+
status: TaskStatus.PROCESSING,
|
|
96
|
+
payload: JSON.stringify({
|
|
97
|
+
symbolId: 200, symbolName: 'fn', symbolKind: 'function',
|
|
98
|
+
projectId: 'proj-1', filePath: 'src/b.ts', workspaceType: 'standard',
|
|
99
|
+
}),
|
|
100
|
+
error: null,
|
|
101
|
+
retry_count: 0,
|
|
102
|
+
max_retries: 3,
|
|
103
|
+
created_at: '2025-01-01T00:00:00Z',
|
|
104
|
+
started_at: null,
|
|
105
|
+
completed_at: null,
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
await (worker as any).processTask(task);
|
|
109
|
+
|
|
110
|
+
expect(repo.resetForRetry).toHaveBeenCalledWith(2);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('handles invalid_payload error as non-retryable', async () => {
|
|
114
|
+
const handler: CodeEnrichmentHandler = {
|
|
115
|
+
enrichSymbol: vi.fn().mockRejectedValue(
|
|
116
|
+
new Error('invalid_payload: missing symbolId'),
|
|
117
|
+
),
|
|
118
|
+
} as any;
|
|
119
|
+
|
|
120
|
+
const worker = new TaskWorker(db, engine, logger, {});
|
|
121
|
+
worker.setCodeEnrichmentHandler(handler);
|
|
122
|
+
const repo = (worker as any).repo;
|
|
123
|
+
vi.spyOn(repo, 'markFailed').mockResolvedValue(undefined);
|
|
124
|
+
vi.spyOn(repo, 'resetForRetry').mockResolvedValue(undefined);
|
|
125
|
+
|
|
126
|
+
const task: PendingTask = {
|
|
127
|
+
id: 3,
|
|
128
|
+
task_type: TaskType.CODE_ENRICHMENT,
|
|
129
|
+
entry_id: 300,
|
|
130
|
+
status: TaskStatus.PROCESSING,
|
|
131
|
+
payload: '{}',
|
|
132
|
+
error: null,
|
|
133
|
+
retry_count: 0,
|
|
134
|
+
max_retries: 3,
|
|
135
|
+
created_at: '2025-01-01T00:00:00Z',
|
|
136
|
+
started_at: null,
|
|
137
|
+
completed_at: null,
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
await (worker as any).processTask(task);
|
|
141
|
+
|
|
142
|
+
expect(repo.markFailed).toHaveBeenCalledWith(
|
|
143
|
+
3, 'invalid_payload: missing symbolId',
|
|
144
|
+
);
|
|
145
|
+
expect(repo.resetForRetry).not.toHaveBeenCalled();
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it('handles symbol_not_found error as non-retryable', async () => {
|
|
149
|
+
const handler: CodeEnrichmentHandler = {
|
|
150
|
+
enrichSymbol: vi.fn().mockRejectedValue(
|
|
151
|
+
new Error('symbol_not_found: 999'),
|
|
152
|
+
),
|
|
153
|
+
} as any;
|
|
154
|
+
|
|
155
|
+
const worker = new TaskWorker(db, engine, logger, {});
|
|
156
|
+
worker.setCodeEnrichmentHandler(handler);
|
|
157
|
+
const repo = (worker as any).repo;
|
|
158
|
+
vi.spyOn(repo, 'markFailed').mockResolvedValue(undefined);
|
|
159
|
+
vi.spyOn(repo, 'resetForRetry').mockResolvedValue(undefined);
|
|
160
|
+
|
|
161
|
+
const task: PendingTask = {
|
|
162
|
+
id: 4,
|
|
163
|
+
task_type: TaskType.CODE_ENRICHMENT,
|
|
164
|
+
entry_id: 999,
|
|
165
|
+
status: TaskStatus.PROCESSING,
|
|
166
|
+
payload: JSON.stringify({
|
|
167
|
+
symbolId: 999, symbolName: 'Ghost', symbolKind: 'function',
|
|
168
|
+
projectId: 'proj-1', filePath: 'src/c.ts', workspaceType: 'standard',
|
|
169
|
+
}),
|
|
170
|
+
error: null,
|
|
171
|
+
retry_count: 0,
|
|
172
|
+
max_retries: 3,
|
|
173
|
+
created_at: '2025-01-01T00:00:00Z',
|
|
174
|
+
started_at: null,
|
|
175
|
+
completed_at: null,
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
await (worker as any).processTask(task);
|
|
179
|
+
|
|
180
|
+
expect(repo.markFailed).toHaveBeenCalledWith(4, 'symbol_not_found: 999');
|
|
181
|
+
expect(repo.resetForRetry).not.toHaveBeenCalled();
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
describe('SA4E-106: Pega symbol enrichment routing', () => {
|
|
186
|
+
let db: DatabaseAdapter;
|
|
187
|
+
let engine: MemoryEngine;
|
|
188
|
+
|
|
189
|
+
beforeEach(() => {
|
|
190
|
+
db = createMockDb();
|
|
191
|
+
engine = createMockEngine();
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
it('Pega symbol task sets workspaceType=pega in payload', () => {
|
|
195
|
+
const payload = JSON.stringify({
|
|
196
|
+
symbolId: 500, symbolName: 'ProcessClaim',
|
|
197
|
+
symbolKind: 'pega_flow', projectId: 'pega-proj',
|
|
198
|
+
filePath: 'rules/ProcessClaim.json', workspaceType: 'pega',
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
const parsed = JSON.parse(payload);
|
|
202
|
+
expect(parsed.workspaceType).toBe('pega');
|
|
203
|
+
expect(parsed.symbolKind).toBe('pega_flow');
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
it('dispatches Pega symbol to handler same as standard', async () => {
|
|
207
|
+
const handler: CodeEnrichmentHandler = {
|
|
208
|
+
enrichSymbol: vi.fn().mockResolvedValue(undefined),
|
|
209
|
+
} as any;
|
|
210
|
+
|
|
211
|
+
const worker = new TaskWorker(db, engine, logger, {});
|
|
212
|
+
worker.setCodeEnrichmentHandler(handler);
|
|
213
|
+
const repo = (worker as any).repo;
|
|
214
|
+
vi.spyOn(repo, 'markCompleted').mockResolvedValue(undefined);
|
|
215
|
+
|
|
216
|
+
const task: PendingTask = {
|
|
217
|
+
id: 5,
|
|
218
|
+
task_type: TaskType.CODE_ENRICHMENT,
|
|
219
|
+
entry_id: 500,
|
|
220
|
+
status: TaskStatus.PROCESSING,
|
|
221
|
+
payload: JSON.stringify({
|
|
222
|
+
symbolId: 500, symbolName: 'ProcessClaim',
|
|
223
|
+
symbolKind: 'pega_flow', projectId: 'pega-proj',
|
|
224
|
+
filePath: 'rules/ProcessClaim.json', workspaceType: 'pega',
|
|
225
|
+
}),
|
|
226
|
+
error: null,
|
|
227
|
+
retry_count: 0,
|
|
228
|
+
max_retries: 3,
|
|
229
|
+
created_at: '2025-01-01T00:00:00Z',
|
|
230
|
+
started_at: null,
|
|
231
|
+
completed_at: null,
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
await (worker as any).processTask(task);
|
|
235
|
+
|
|
236
|
+
expect(handler.enrichSymbol).toHaveBeenCalledWith(task);
|
|
237
|
+
expect(repo.markCompleted).toHaveBeenCalledWith(5);
|
|
238
|
+
});
|
|
239
|
+
});
|
|
@@ -93,8 +93,29 @@ export class KnowledgeService {
|
|
|
93
93
|
|
|
94
94
|
/** Save checkpoint (+ optional writes / messages) — projection updated. */
|
|
95
95
|
async saveCheckpoint(ctx: ProjectContext, threadId: string, input: SaveCheckpointInput): Promise<Checkpoint | null> {
|
|
96
|
-
const
|
|
97
|
-
|
|
96
|
+
const workspaceId = this.resolveWorkspaceId(ctx);
|
|
97
|
+
let thread = await this.ownedThread(ctx, threadId);
|
|
98
|
+
if (!thread) {
|
|
99
|
+
// LangGraph generates arbitrary thread_id UUIDs per run and persists via the
|
|
100
|
+
// checkpointer without a prior POST /threads — auto-create the thread if it
|
|
101
|
+
// genuinely does not exist (mock contract, IT-HYD-03). A thread owned by
|
|
102
|
+
// another workspace is NEVER created or written (SECURITY-REVIEW #18 → 404).
|
|
103
|
+
const existing = await this.db.getThread(threadId);
|
|
104
|
+
if (existing) return null;
|
|
105
|
+
if (!isUuidV4(threadId)) return null;
|
|
106
|
+
const now = new Date().toISOString();
|
|
107
|
+
thread = {
|
|
108
|
+
thread_id: threadId,
|
|
109
|
+
workspace_id: workspaceId,
|
|
110
|
+
title: 'Auto thread',
|
|
111
|
+
agent_id: null,
|
|
112
|
+
status: 'active',
|
|
113
|
+
created_at: now,
|
|
114
|
+
updated_at: now,
|
|
115
|
+
};
|
|
116
|
+
await this.db.createThread(thread);
|
|
117
|
+
await this.db.appendEvent(workspaceId, threadId, 'THREAD_CREATED', { title: thread.title, agent_id: null });
|
|
118
|
+
}
|
|
98
119
|
const checkpoint = await this.db.upsertCheckpoint(thread.workspace_id, threadId, input);
|
|
99
120
|
const messages = input.messages ?? [];
|
|
100
121
|
const seqBase = await this.db.countMessages(threadId);
|
|
@@ -57,6 +57,27 @@ describe('KnowledgeService', () => {
|
|
|
57
57
|
expect(await service.getArtifacts(ctx('ws-B'), thread.thread_id)).toBeNull();
|
|
58
58
|
});
|
|
59
59
|
|
|
60
|
+
it('saveCheckpoint auto-creates a thread for a fresh UUID it has never seen (LangGraph checkpointer)', async () => {
|
|
61
|
+
const freshId = 'aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa';
|
|
62
|
+
const saved = await service.saveCheckpoint(ctx('ws-A'), freshId, { checkpoint: { v: 1, channel_values: {} } });
|
|
63
|
+
expect(saved).not.toBeNull();
|
|
64
|
+
expect(saved?.thread_id).toBe(freshId);
|
|
65
|
+
expect(saved?.version).toBe(1);
|
|
66
|
+
const loaded = await service.getCheckpoint(ctx('ws-A'), freshId);
|
|
67
|
+
expect(loaded?.checkpoint).toEqual({ v: 1, channel_values: {} });
|
|
68
|
+
expect(await service.getThread(ctx('ws-A'), freshId)).not.toBeNull();
|
|
69
|
+
// the new thread is visible to listThreads (multi-IDE hydrate)
|
|
70
|
+
const threads = await service.listThreads(ctx('ws-A'));
|
|
71
|
+
expect(threads.some((t) => t.thread_id === freshId)).toBe(true);
|
|
72
|
+
// a second PUT bumps version (idempotent upsert, IT-HYD-03)
|
|
73
|
+
await service.saveCheckpoint(ctx('ws-A'), freshId, { checkpoint: { v: 2, channel_values: {} } });
|
|
74
|
+
expect((await service.getCheckpoint(ctx('ws-A'), freshId))?.version).toBe(2);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('saveCheckpoint rejects a non-UUID thread id (404 path)', async () => {
|
|
78
|
+
expect(await service.saveCheckpoint(ctx('ws-A'), 'not-a-uuid', { checkpoint: { v: 1 } })).toBeNull();
|
|
79
|
+
});
|
|
80
|
+
|
|
60
81
|
it('saveCheckpoint returns null for a thread owned by another workspace', async () => {
|
|
61
82
|
const thread = await service.createThread(ctx('ws-A'), {});
|
|
62
83
|
const saved = await service.saveCheckpoint(ctx('ws-B'), thread.thread_id, { checkpoint: { v: 1 } });
|
|
@@ -127,6 +127,29 @@ describe('Knowledge REST API — /api/v1', () => {
|
|
|
127
127
|
expect(res.status).toBe(404);
|
|
128
128
|
});
|
|
129
129
|
|
|
130
|
+
it('PUT checkpoint auto-creates a thread for a never-seen UUID (LangGraph checkpointer)', async () => {
|
|
131
|
+
const { app } = makeApp();
|
|
132
|
+
const freshId = 'bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb';
|
|
133
|
+
const res = await app.request(`/api/v1/threads/${freshId}/checkpoint`, {
|
|
134
|
+
method: 'PUT',
|
|
135
|
+
headers: wsHeaders('ws-A'),
|
|
136
|
+
body: JSON.stringify({ checkpoint: { v: 1, channel_values: { ticketKey: 'X-1' } } }),
|
|
137
|
+
});
|
|
138
|
+
expect(res.status).toBe(200);
|
|
139
|
+
const body = (await res.json()) as any;
|
|
140
|
+
expect(body.data.thread_id).toBe(freshId);
|
|
141
|
+
expect(body.data.version).toBe(1);
|
|
142
|
+
|
|
143
|
+
const getRes = await app.request(`/api/v1/threads/${freshId}/checkpoint`, { headers: wsHeaders('ws-A') });
|
|
144
|
+
expect(getRes.status).toBe(200);
|
|
145
|
+
const getBody = (await getRes.json()) as any;
|
|
146
|
+
expect(getBody.data.checkpoint.channel_values.ticketKey).toBe('X-1');
|
|
147
|
+
|
|
148
|
+
const listRes = await app.request('/api/v1/threads', { headers: wsHeaders('ws-A') });
|
|
149
|
+
const listBody = (await listRes.json()) as any;
|
|
150
|
+
expect(listBody.data.some((t: { thread_id: string }) => t.thread_id === freshId)).toBe(true);
|
|
151
|
+
});
|
|
152
|
+
|
|
130
153
|
it('PUT checkpoint over body limit returns 413 (#23)', async () => {
|
|
131
154
|
const { app } = makeApp(1024); // tiny limit for fast test
|
|
132
155
|
const { thread_id } = await createThread(app, 'ws-A');
|
|
@@ -499,8 +499,11 @@ export class TaskWorker {
|
|
|
499
499
|
|
|
500
500
|
private async handleTaskError(task: PendingTask, err: Error): Promise<void> {
|
|
501
501
|
this.consecutiveErrors++;
|
|
502
|
+
// SA4E-106: Non-retryable patterns include CODE_ENRICHMENT-specific errors
|
|
502
503
|
const nonRetryable = err.message.includes('invalid_json')
|
|
503
|
-
|| err.message.includes('entry_not_found')
|
|
504
|
+
|| err.message.includes('entry_not_found')
|
|
505
|
+
|| err.message.includes('invalid_payload')
|
|
506
|
+
|| err.message.includes('symbol_not_found');
|
|
504
507
|
if (nonRetryable || task.retry_count + 1 >= task.max_retries) {
|
|
505
508
|
await this.repo.markFailed(task.id, err.message);
|
|
506
509
|
} else {
|
|
@@ -139,3 +139,97 @@ describe('UT-12: loadPreviousContext', () => {
|
|
|
139
139
|
expect(result).toBeNull();
|
|
140
140
|
});
|
|
141
141
|
});
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* SA4E-106: handleTaskError — non-retryable error patterns.
|
|
146
|
+
* Verifies invalid_payload and symbol_not_found are marked failed immediately.
|
|
147
|
+
*/
|
|
148
|
+
describe('SA4E-106: handleTaskError non-retryable patterns', () => {
|
|
149
|
+
let db: DatabaseAdapter;
|
|
150
|
+
let engine: MemoryEngine;
|
|
151
|
+
|
|
152
|
+
beforeEach(() => {
|
|
153
|
+
db = createMockDb();
|
|
154
|
+
engine = createMockEngine(new Map());
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
function createWorkerWithSpies() {
|
|
158
|
+
const worker = new TaskWorker(db, engine, logger, testConfig);
|
|
159
|
+
const repo = (worker as any).repo;
|
|
160
|
+
// Spy on repo methods to track calls without executing real SQL
|
|
161
|
+
vi.spyOn(repo, 'markFailed').mockResolvedValue(undefined);
|
|
162
|
+
vi.spyOn(repo, 'resetForRetry').mockResolvedValue(undefined);
|
|
163
|
+
return { worker, repo };
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function createFakeTask(retryCount = 0, maxRetries = 3): any {
|
|
167
|
+
return { id: 42, retry_count: retryCount, max_retries: maxRetries };
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
it('marks task failed immediately for invalid_payload error', async () => {
|
|
171
|
+
const { worker, repo } = createWorkerWithSpies();
|
|
172
|
+
const task = createFakeTask();
|
|
173
|
+
const error = new Error('invalid_payload: symbolId is required');
|
|
174
|
+
|
|
175
|
+
await (worker as any).handleTaskError(task, error);
|
|
176
|
+
|
|
177
|
+
expect(repo.markFailed).toHaveBeenCalledWith(42, error.message);
|
|
178
|
+
expect(repo.resetForRetry).not.toHaveBeenCalled();
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it('marks task failed immediately for symbol_not_found error', async () => {
|
|
182
|
+
const { worker, repo } = createWorkerWithSpies();
|
|
183
|
+
const task = createFakeTask();
|
|
184
|
+
const error = new Error('symbol_not_found: 999');
|
|
185
|
+
|
|
186
|
+
await (worker as any).handleTaskError(task, error);
|
|
187
|
+
|
|
188
|
+
expect(repo.markFailed).toHaveBeenCalledWith(42, error.message);
|
|
189
|
+
expect(repo.resetForRetry).not.toHaveBeenCalled();
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it('marks task failed immediately for invalid_json error', async () => {
|
|
193
|
+
const { worker, repo } = createWorkerWithSpies();
|
|
194
|
+
const task = createFakeTask();
|
|
195
|
+
const error = new Error('invalid_json: unexpected token');
|
|
196
|
+
|
|
197
|
+
await (worker as any).handleTaskError(task, error);
|
|
198
|
+
|
|
199
|
+
expect(repo.markFailed).toHaveBeenCalledWith(42, error.message);
|
|
200
|
+
expect(repo.resetForRetry).not.toHaveBeenCalled();
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
it('marks task failed immediately for entry_not_found error', async () => {
|
|
204
|
+
const { worker, repo } = createWorkerWithSpies();
|
|
205
|
+
const task = createFakeTask();
|
|
206
|
+
const error = new Error('entry_not_found');
|
|
207
|
+
|
|
208
|
+
await (worker as any).handleTaskError(task, error);
|
|
209
|
+
|
|
210
|
+
expect(repo.markFailed).toHaveBeenCalledWith(42, error.message);
|
|
211
|
+
expect(repo.resetForRetry).not.toHaveBeenCalled();
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it('resets for retry on transient error with retries remaining', async () => {
|
|
215
|
+
const { worker, repo } = createWorkerWithSpies();
|
|
216
|
+
const task = createFakeTask(0, 3);
|
|
217
|
+
const error = new Error('llm_timeout');
|
|
218
|
+
|
|
219
|
+
await (worker as any).handleTaskError(task, error);
|
|
220
|
+
|
|
221
|
+
expect(repo.markFailed).toHaveBeenCalledWith(42, error.message);
|
|
222
|
+
expect(repo.resetForRetry).toHaveBeenCalledWith(42);
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it('marks failed when max retries exhausted for transient error', async () => {
|
|
226
|
+
const { worker, repo } = createWorkerWithSpies();
|
|
227
|
+
const task = createFakeTask(2, 3); // retry_count + 1 >= max_retries
|
|
228
|
+
const error = new Error('llm_timeout');
|
|
229
|
+
|
|
230
|
+
await (worker as any).handleTaskError(task, error);
|
|
231
|
+
|
|
232
|
+
expect(repo.markFailed).toHaveBeenCalledWith(42, error.message);
|
|
233
|
+
expect(repo.resetForRetry).not.toHaveBeenCalled();
|
|
234
|
+
});
|
|
235
|
+
});
|