sdlc-agent-4-enterprise-server 1.47.0 → 1.47.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/Dockerfile +15 -10
- package/README.md +3 -2
- package/dist/engine/graph/code-edge-extractor.d.ts +4 -0
- package/dist/engine/graph/code-edge-extractor.js +19 -0
- package/dist/engine/graph/code-edge-extractor.js.map +1 -1
- package/dist/engine/graph/graph-sync-service.d.ts +2 -0
- package/dist/engine/graph/graph-sync-service.js +18 -1
- package/dist/engine/graph/graph-sync-service.js.map +1 -1
- package/dist/server/routes/auth/token-routes.js +10 -1
- package/dist/server/routes/auth/token-routes.js.map +1 -1
- package/package.json +1 -1
- package/src/engine/graph/code-edge-extractor.ts +23 -0
- package/src/engine/graph/graph-sync-service.ts +22 -1
- package/src/server/routes/auth/token-routes.ts +9 -1
package/Dockerfile
CHANGED
|
@@ -84,16 +84,21 @@ WORKDIR /app
|
|
|
84
84
|
# or the CLI itself.
|
|
85
85
|
ARG NPM_VERSION=11.21.0
|
|
86
86
|
RUN npm install -g npm@${NPM_VERSION} --no-audit --no-fund --loglevel=error \
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
87
|
+
&& NM=/usr/local/lib/node_modules/npm/node_modules \
|
|
88
|
+
&& for entry in "brace-expansion 5.0.12" "undici 6.28.1"; do \
|
|
89
|
+
name=$(echo "$entry" | cut -d ' ' -f1); ver=$(echo "$entry" | cut -d ' ' -f2); \
|
|
90
|
+
tgz=$(npm pack "${name}@${ver}" --pack-destination /tmp --silent); \
|
|
91
|
+
rm -rf "${NM}/${name}"; mkdir -p "${NM}/${name}"; \
|
|
92
|
+
tar -xzf "/tmp/${tgz}" -C "${NM}/${name}" --strip-components=1; \
|
|
93
|
+
done \
|
|
94
|
+
&& rm -rf /tmp/*.tgz \
|
|
95
|
+
&& node -e "require('${NM}/brace-expansion'); require('${NM}/undici')" \
|
|
96
|
+
&& npm --version \
|
|
97
|
+
# SEC-04: upgrade Debian packages to fix CVE-2026-103111 (libpcre2-8-0 HIGH) \
|
|
98
|
+
&& apt-get update \
|
|
99
|
+
&& apt-get upgrade -y --no-install-recommends libpcre2-8-0 \
|
|
100
|
+
&& apt-get clean \
|
|
101
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
97
102
|
|
|
98
103
|
# Runtime copies the pruned production node_modules + compiled dist only.
|
|
99
104
|
COPY --from=deps /app/node_modules ./node_modules
|
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.47.
|
|
9
|
+
<img src="https://img.shields.io/badge/version-1.47.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>
|
|
@@ -38,7 +38,7 @@ Server starts at **http://localhost:48721**. Verify it's running:
|
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
40
|
curl http://localhost:48721/health
|
|
41
|
-
# → {"status":"healthy","version":"1.47.
|
|
41
|
+
# → {"status":"healthy","version":"1.47.1","uptime":5,"tools_loaded":52}
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
### Development Mode (auto-reload)
|
|
@@ -233,6 +233,7 @@ The embedding model is expected at `.code-intel/models/model.onnx`. Download it:
|
|
|
233
233
|
|
|
234
234
|
| Version | Date | Ticket | Changes |
|
|
235
235
|
|---------|------|--------|---------|
|
|
236
|
+
| 1.47.1 | 2026-10-04 | — | Fix Docker CI fail (Trivy CVE-2026-103111 libpcre2-8-0 HIGH), defensive JSON parse on `/auth/refresh`, SA4E-100 Pega BELONGS_TO edges. |
|
|
236
237
|
| 1.47.0 | 2026-10-02 | — | New endpoint `GET /api/v1/enrichment/failures?limit=N` (clamp 1–1000, default 200) returns full FAILED enrichment task list from `pending_tasks` with resolved source, error, retry count, timestamp (`PendingTaskRepository.listFailedDetailed`). Surfaces ingest failures to the extension beyond the 10-item status tooltip. |
|
|
237
238
|
| 1.46.2 | 2026-09-28 | — | Version sync (no backend code changes; packaging fix lives in `extension`: missing direct `yargs` dep for vendored devtools barrel). |
|
|
238
239
|
| 1.46.1 | 2026-09-28 | — | Version sync patch: align `root`/`backend`/`extension` to 1.46.1; README badges + health example + changelogs updated. No runtime code changes since 1.46.0. |
|
|
@@ -31,6 +31,10 @@ export declare class RelationshipsEdgeStrategy implements CodeEdgeStrategy {
|
|
|
31
31
|
extract(indexAdapter: DatabaseAdapter, projectId: string): Promise<CodeGraphEdge[]>;
|
|
32
32
|
private weightForKind;
|
|
33
33
|
}
|
|
34
|
+
/** Extracts BELONGS_TO edges for Pega rules: symbols → parent class nodes. */
|
|
35
|
+
export declare class PegaMembershipEdgeStrategy implements CodeEdgeStrategy {
|
|
36
|
+
extract(indexAdapter: DatabaseAdapter, projectId: string): Promise<CodeGraphEdge[]>;
|
|
37
|
+
}
|
|
34
38
|
/**
|
|
35
39
|
* Batch-insert extracted code edges into graph_edges (admin DB).
|
|
36
40
|
* Uses ON CONFLICT DO NOTHING for idempotency.
|
|
@@ -92,11 +92,30 @@ export class RelationshipsEdgeStrategy {
|
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
|
+
/** Extracts BELONGS_TO edges for Pega rules: symbols → parent class nodes. */
|
|
96
|
+
export class PegaMembershipEdgeStrategy {
|
|
97
|
+
async extract(indexAdapter, projectId) {
|
|
98
|
+
const rows = await indexAdapter.allAsync(`SELECT id AS child_id, parent_symbol FROM symbols
|
|
99
|
+
WHERE project_id = ? AND parent_symbol IS NOT NULL AND kind LIKE 'pega_%'`, [projectId]);
|
|
100
|
+
const edges = [];
|
|
101
|
+
const seen = new Set();
|
|
102
|
+
for (const r of rows) {
|
|
103
|
+
const targetId = `class:${r.parent_symbol}`;
|
|
104
|
+
const key = `${r.child_id}→${targetId}→BELONGS_TO`;
|
|
105
|
+
if (!seen.has(key)) {
|
|
106
|
+
seen.add(key);
|
|
107
|
+
edges.push({ source: `code:${r.child_id}`, target: targetId, label: 'BELONGS_TO', weight: 0.5 });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return edges;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
95
113
|
/** Registry of all code-edge strategies. */
|
|
96
114
|
const CODE_EDGE_STRATEGIES = [
|
|
97
115
|
new MembershipEdgeStrategy(),
|
|
98
116
|
new FileContainsSymbolStrategy(),
|
|
99
117
|
new RelationshipsEdgeStrategy(),
|
|
118
|
+
new PegaMembershipEdgeStrategy(),
|
|
100
119
|
];
|
|
101
120
|
/**
|
|
102
121
|
* Batch-insert extracted code edges into graph_edges (admin DB).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-edge-extractor.js","sourceRoot":"","sources":["../../../src/engine/graph/code-edge-extractor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"code-edge-extractor.js","sourceRoot":"","sources":["../../../src/engine/graph/code-edge-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,8 @@ export class GraphSyncService {
|
|
|
36
36
|
this.log.info(`[graph-sync] Synced ${symbols.length} code nodes for project ${projectId}`);
|
|
37
37
|
// SA4E-91: Extract and insert code edges (IMPORTS, CALLS, EXTENDS)
|
|
38
38
|
await this.syncCodeEdges(projectId);
|
|
39
|
+
// SA4E-100: Create Pega class nodes for BELONGS_TO edges
|
|
40
|
+
await this.syncPegaClasses(projectId);
|
|
39
41
|
}
|
|
40
42
|
catch (err) {
|
|
41
43
|
// Non-fatal: visualization projection must never fail the index run.
|
|
@@ -84,7 +86,7 @@ export class GraphSyncService {
|
|
|
84
86
|
const pos = fibonacciSphereGrouped(i, group.length, gi, totalGroups, nodeType);
|
|
85
87
|
await this.adminAdapter.runAsync(sql, [
|
|
86
88
|
`code:${s.id}`, this.toLabel(s), nodeType, 'CODE',
|
|
87
|
-
projectId, pos.x, pos.y, pos.z,
|
|
89
|
+
projectId, pos.x, pos.y, pos.z, 2, `code-${nodeType.toLowerCase()}`,
|
|
88
90
|
]);
|
|
89
91
|
}
|
|
90
92
|
}
|
|
@@ -93,6 +95,21 @@ export class GraphSyncService {
|
|
|
93
95
|
const file = s.relative_path ? s.relative_path.split('/').pop() ?? '' : '';
|
|
94
96
|
return `${s.name} (${file})`.substring(0, 60);
|
|
95
97
|
}
|
|
98
|
+
/** SA4E-100: Create class nodes for Pega parent symbols (targets of BELONGS_TO edges). */
|
|
99
|
+
async syncPegaClasses(projectId) {
|
|
100
|
+
const classes = await this.indexAdapter.allAsync(`SELECT DISTINCT parent_symbol FROM symbols
|
|
101
|
+
WHERE project_id = ? AND parent_symbol IS NOT NULL AND kind LIKE 'pega_%'`, [projectId]);
|
|
102
|
+
if (classes.length === 0)
|
|
103
|
+
return;
|
|
104
|
+
const sql = this.adminDialect.insertIgnore('graph_nodes', ['entry_id', 'label', 'type', 'tier', 'project_id', 'x', 'y', 'z', 'level', 'cluster_id'], 'entry_id');
|
|
105
|
+
for (const cls of classes) {
|
|
106
|
+
const entryId = `class:${cls.parent_symbol}`;
|
|
107
|
+
await this.adminAdapter.runAsync(sql, [
|
|
108
|
+
entryId, cls.parent_symbol, 'CLASS', 'CODE',
|
|
109
|
+
projectId, 0, 0, 0, 1, `code-class`,
|
|
110
|
+
]);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
96
113
|
}
|
|
97
114
|
/** Fibonacci-sphere position with type-based grouping (SA4E-97). */
|
|
98
115
|
function fibonacciSphereGrouped(index, groupSize, groupId, totalGroups, type) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-sync-service.js","sourceRoot":"","sources":["../../../src/engine/graph/graph-sync-service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAUrE,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAEjd,MAAM,OAAO,gBAAgB;IAKR;IACA;IACA;IANF,YAAY,CAAgB;IAC5B,YAAY,CAAgB;IAE7C,YACmB,YAA6B,EAC7B,YAA6B,EAC7B,GAAW;QAFX,iBAAY,GAAZ,YAAY,CAAiB;QAC7B,iBAAY,GAAZ,YAAY,CAAiB;QAC7B,QAAG,GAAH,GAAG,CAAQ;QAE5B,IAAI,CAAC,YAAY,GAAG,IAAI,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,YAAY,GAAG,IAAI,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;QAChE,IAAI,YAAY,CAAC,SAAS,EAAE,KAAK,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,kBAAkB,CAAC,SAAiB;QACxC,IAAI,CAAC,SAAS;YAAE,OAAO,CAAC,cAAc;QACtC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAChD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,OAAO,CAAC,MAAM,2BAA2B,SAAS,EAAE,CAAC,CAAC;YAC3F,mEAAmE;YACnE,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"graph-sync-service.js","sourceRoot":"","sources":["../../../src/engine/graph/graph-sync-service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAUrE,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAEjd,MAAM,OAAO,gBAAgB;IAKR;IACA;IACA;IANF,YAAY,CAAgB;IAC5B,YAAY,CAAgB;IAE7C,YACmB,YAA6B,EAC7B,YAA6B,EAC7B,GAAW;QAFX,iBAAY,GAAZ,YAAY,CAAiB;QAC7B,iBAAY,GAAZ,YAAY,CAAiB;QAC7B,QAAG,GAAH,GAAG,CAAQ;QAE5B,IAAI,CAAC,YAAY,GAAG,IAAI,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,YAAY,GAAG,IAAI,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;QAChE,IAAI,YAAY,CAAC,SAAS,EAAE,KAAK,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,kBAAkB,CAAC,SAAiB;QACxC,IAAI,CAAC,SAAS;YAAE,OAAO,CAAC,cAAc;QACtC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAChD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,OAAO,CAAC,MAAM,2BAA2B,SAAS,EAAE,CAAC,CAAC;YAC3F,mEAAmE;YACnE,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YACpC,yDAAyD;YACzD,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,qEAAqE;YACrE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,8CAA8C,SAAS,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,wEAAwE;IAChE,KAAK,CAAC,aAAa,CAAC,SAAiB;QAC3C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,yBAAyB,CAC3C,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,CAC1D,CAAC;YACF,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,KAAK,2BAA2B,SAAS,EAAE,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,sDAAsD,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,SAAiB;QAC5C,yDAAyD;QACzD,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAC/B;;gDAE0C,YAAY;4DACA,EACtD,CAAC,SAAS,EAAE,GAAG,UAAU,CAAC,CAC3B,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,SAAiB,EAAE,OAAwB;QACxE,gGAAgG;QAChG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAC9B,yEAAyE,EACzE,CAAC,SAAS,CAAC,CACZ,CAAC;QAEF,+DAA+D;QAC/D,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACpD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC;QAEpC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,aAAa,EACtD,CAAC,UAAU,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,YAAY,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,OAAO,EAAC,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;QAEhG,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACnB,MAAM,GAAG,GAAG,sBAAsB,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBAC/E,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE;oBACpC,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM;oBACjD,SAAS,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,QAAQ,CAAC,WAAW,EAAE,EAAE;iBACpE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAEO,OAAO,CAAC,CAAgB;QAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,0FAA0F;IAClF,KAAK,CAAC,eAAe,CAAC,SAAiB;QAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAC9C;iFAC2E,EAC3E,CAAC,SAAS,CAAC,CACZ,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,aAAa,EACtD,CAAC,UAAU,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,YAAY,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,OAAO,EAAC,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;QAChG,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,SAAS,GAAG,CAAC,aAAa,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE;gBACpC,OAAO,EAAE,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM;gBAC3C,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY;aACpC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF;AAED,oEAAoE;AACpE,SAAS,sBAAsB,CAC7B,KAAa,EAAE,SAAiB,EAAE,OAAe,EAAE,WAAmB,EAAE,IAAY;IAEpF,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACtC,iCAAiC;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,OAAO,GAAG,MAAM,CAAC;IAC/C,MAAM,YAAY,GAAG,GAAG,CAAC;IACzB,MAAM,OAAO,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7C,wBAAwB;IACxB,MAAM,WAAW,GAAG,GAAG,CAAC;IACxB,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,GAAG,MAAM,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,WAAW,CAAC;IAC5D,mBAAmB;IACnB,MAAM,MAAM,GAA2B;QACrC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG;QACtD,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;QACtD,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG;QACxD,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG;KAC9E,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO;QACL,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;QACjE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;QACjE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;KAC/C,CAAC;AACJ,CAAC"}
|
|
@@ -14,7 +14,16 @@ const exchangeSchema = z.object({ code: z.string().min(10).max(200) });
|
|
|
14
14
|
export function registerTokenRoutes(app, sessions) {
|
|
15
15
|
app.post('/refresh', async (c) => {
|
|
16
16
|
try {
|
|
17
|
-
|
|
17
|
+
// Parse the body defensively: a malformed JSON payload must yield a clean
|
|
18
|
+
// 400 instead of an unhandled throw. Never log the raw body — it carries
|
|
19
|
+
// the refresh credential.
|
|
20
|
+
let body;
|
|
21
|
+
try {
|
|
22
|
+
body = await c.req.json();
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return c.json({ error: 'Invalid JSON body' }, 400);
|
|
26
|
+
}
|
|
18
27
|
const parsed = refreshSchema.safeParse(body);
|
|
19
28
|
if (!parsed.success)
|
|
20
29
|
return c.json({ error: 'Refresh token required' }, 400);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-routes.js","sourceRoot":"","sources":["../../../../src/server/routes/auth/token-routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;AAE7C,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC9G,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAEvE,MAAM,UAAU,mBAAmB,CAAC,GAAS,EAAE,QAAwB;IACrE,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,
|
|
1
|
+
{"version":3,"file":"token-routes.js","sourceRoot":"","sources":["../../../../src/server/routes/auth/token-routes.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -123,11 +123,34 @@ export class RelationshipsEdgeStrategy implements CodeEdgeStrategy {
|
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
+
/** Extracts BELONGS_TO edges for Pega rules: symbols → parent class nodes. */
|
|
127
|
+
export class PegaMembershipEdgeStrategy implements CodeEdgeStrategy {
|
|
128
|
+
async extract(indexAdapter: DatabaseAdapter, projectId: string): Promise<CodeGraphEdge[]> {
|
|
129
|
+
const rows = await indexAdapter.allAsync<{ child_id: number; parent_symbol: string }>(
|
|
130
|
+
`SELECT id AS child_id, parent_symbol FROM symbols
|
|
131
|
+
WHERE project_id = ? AND parent_symbol IS NOT NULL AND kind LIKE 'pega_%'`,
|
|
132
|
+
[projectId],
|
|
133
|
+
);
|
|
134
|
+
const edges: CodeGraphEdge[] = [];
|
|
135
|
+
const seen = new Set<string>();
|
|
136
|
+
for (const r of rows) {
|
|
137
|
+
const targetId = `class:${r.parent_symbol}`;
|
|
138
|
+
const key = `${r.child_id}→${targetId}→BELONGS_TO`;
|
|
139
|
+
if (!seen.has(key)) {
|
|
140
|
+
seen.add(key);
|
|
141
|
+
edges.push({ source: `code:${r.child_id}`, target: targetId, label: 'BELONGS_TO', weight: 0.5 });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return edges;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
126
148
|
/** Registry of all code-edge strategies. */
|
|
127
149
|
const CODE_EDGE_STRATEGIES: CodeEdgeStrategy[] = [
|
|
128
150
|
new MembershipEdgeStrategy(),
|
|
129
151
|
new FileContainsSymbolStrategy(),
|
|
130
152
|
new RelationshipsEdgeStrategy(),
|
|
153
|
+
new PegaMembershipEdgeStrategy(),
|
|
131
154
|
];
|
|
132
155
|
|
|
133
156
|
/**
|
|
@@ -47,6 +47,8 @@ export class GraphSyncService {
|
|
|
47
47
|
this.log.info(`[graph-sync] Synced ${symbols.length} code nodes for project ${projectId}`);
|
|
48
48
|
// SA4E-91: Extract and insert code edges (IMPORTS, CALLS, EXTENDS)
|
|
49
49
|
await this.syncCodeEdges(projectId);
|
|
50
|
+
// SA4E-100: Create Pega class nodes for BELONGS_TO edges
|
|
51
|
+
await this.syncPegaClasses(projectId);
|
|
50
52
|
} catch (err) {
|
|
51
53
|
// Non-fatal: visualization projection must never fail the index run.
|
|
52
54
|
this.log.error({ err }, `[graph-sync] Failed to sync code nodes for ${projectId}`);
|
|
@@ -107,7 +109,7 @@ export class GraphSyncService {
|
|
|
107
109
|
const pos = fibonacciSphereGrouped(i, group.length, gi, totalGroups, nodeType);
|
|
108
110
|
await this.adminAdapter.runAsync(sql, [
|
|
109
111
|
`code:${s.id}`, this.toLabel(s), nodeType, 'CODE',
|
|
110
|
-
projectId, pos.x, pos.y, pos.z,
|
|
112
|
+
projectId, pos.x, pos.y, pos.z, 2, `code-${nodeType.toLowerCase()}`,
|
|
111
113
|
]);
|
|
112
114
|
}
|
|
113
115
|
}
|
|
@@ -117,6 +119,25 @@ export class GraphSyncService {
|
|
|
117
119
|
const file = s.relative_path ? s.relative_path.split('/').pop() ?? '' : '';
|
|
118
120
|
return `${s.name} (${file})`.substring(0, 60);
|
|
119
121
|
}
|
|
122
|
+
|
|
123
|
+
/** SA4E-100: Create class nodes for Pega parent symbols (targets of BELONGS_TO edges). */
|
|
124
|
+
private async syncPegaClasses(projectId: string): Promise<void> {
|
|
125
|
+
const classes = await this.indexAdapter.allAsync<{ parent_symbol: string }>(
|
|
126
|
+
`SELECT DISTINCT parent_symbol FROM symbols
|
|
127
|
+
WHERE project_id = ? AND parent_symbol IS NOT NULL AND kind LIKE 'pega_%'`,
|
|
128
|
+
[projectId],
|
|
129
|
+
);
|
|
130
|
+
if (classes.length === 0) return;
|
|
131
|
+
const sql = this.adminDialect.insertIgnore('graph_nodes',
|
|
132
|
+
['entry_id','label','type','tier','project_id','x','y','z','level','cluster_id'], 'entry_id');
|
|
133
|
+
for (const cls of classes) {
|
|
134
|
+
const entryId = `class:${cls.parent_symbol}`;
|
|
135
|
+
await this.adminAdapter.runAsync(sql, [
|
|
136
|
+
entryId, cls.parent_symbol, 'CLASS', 'CODE',
|
|
137
|
+
projectId, 0, 0, 0, 1, `code-class`,
|
|
138
|
+
]);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
120
141
|
}
|
|
121
142
|
|
|
122
143
|
/** Fibonacci-sphere position with type-based grouping (SA4E-97). */
|
|
@@ -20,7 +20,15 @@ const exchangeSchema = z.object({ code: z.string().min(10).max(200) });
|
|
|
20
20
|
export function registerTokenRoutes(app: Hono, sessions: SessionService): void {
|
|
21
21
|
app.post('/refresh', async (c) => {
|
|
22
22
|
try {
|
|
23
|
-
|
|
23
|
+
// Parse the body defensively: a malformed JSON payload must yield a clean
|
|
24
|
+
// 400 instead of an unhandled throw. Never log the raw body — it carries
|
|
25
|
+
// the refresh credential.
|
|
26
|
+
let body;
|
|
27
|
+
try {
|
|
28
|
+
body = await c.req.json();
|
|
29
|
+
} catch {
|
|
30
|
+
return c.json({ error: 'Invalid JSON body' }, 400);
|
|
31
|
+
}
|
|
24
32
|
const parsed = refreshSchema.safeParse(body);
|
|
25
33
|
if (!parsed.success) return c.json({ error: 'Refresh token required' }, 400);
|
|
26
34
|
const token = parsed.data.sessionToken || parsed.data.refresh_token;
|