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 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
- && 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
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.0-blue?style=for-the-badge" alt="Version">
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.0","uptime":5,"tools_loaded":52}
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":"AAAA;;;;;GAKG;AAmBH,2HAA2H;AAC3H,MAAM,OAAO,0BAA0B;IACrC,KAAK,CAAC,OAAO,CAAC,YAA6B,EAAE,SAAiB;QAC5D,+EAA+E;QAC/E,2EAA2E;QAC3E,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,CACtC;;;;;;;;4BAQsB,EACtB,CAAC,SAAS,CAAC,CACZ,CAAC;QACF,MAAM,KAAK,GAAoB,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3F,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YACxF,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;gBAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACd,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC9G,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,+EAA+E;AAC/E,MAAM,OAAO,sBAAsB;IACjC,KAAK,CAAC,OAAO,CAAC,YAA6B,EAAE,SAAiB;QAC5D,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,CACtC;;;;;;6CAMuC,EACvC,CAAC,SAAS,CAAC,CACZ,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS,EAAE;YAC7B,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE;YAC5B,KAAK,EAAE,UAAU;YACjB,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC,CAAC;IACN,CAAC;CACF;AAED,yFAAyF;AACzF,MAAM,OAAO,yBAAyB;IACpC,KAAK,CAAC,OAAO,CAAC,YAA6B,EAAE,SAAiB;QAC5D,qEAAqE;QACrE,yEAAyE;QACzE,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,CACtC;;;;;;;;;;WAUK,EACL,CAAC,SAAS,CAAC,CACZ,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAClB,MAAM,QAAQ,GAAG,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,WAAY,CAAC;YACtD,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO;gBACL,MAAM,EAAE,QAAQ,CAAC,CAAC,gBAAgB,EAAE;gBACpC,MAAM,EAAE,QAAQ,QAAQ,EAAE;gBAC1B,KAAK;gBACL,MAAM;aACP,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,IAAY;QAChC,QAAQ,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YAC3B,KAAK,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC;YACzB,KAAK,UAAU,CAAC,CAAC,OAAO,GAAG,CAAC;YAC5B,KAAK,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC;YAC/B,KAAK,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC;YAC3B,KAAK,WAAW,CAAC,CAAC,OAAO,GAAG,CAAC;YAC7B,KAAK,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC;YACxB,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC;QACtB,CAAC;IACH,CAAC;CACF;AAED,4CAA4C;AAC5C,MAAM,oBAAoB,GAAuB;IAC/C,IAAI,sBAAsB,EAAE;IAC5B,IAAI,0BAA0B,EAAE;IAChC,IAAI,yBAAyB,EAAE;CAChC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,YAA6B,EAC7B,YAA6B,EAC7B,SAAiB,EACjB,GAAW;IAEX,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,QAAQ,IAAI,oBAAoB,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YAC9D,aAAa,IAAI,MAAM,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mDAAmD;YACnD,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,kCAAkC,QAAQ,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,8DAA8D;AAC9D,KAAK,UAAU,gBAAgB,CAAC,OAAwB,EAAE,KAAsB;IAC9E,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,KAAK,QAAQ;QAC1C,CAAC,CAAC,0FAA0F;QAC5F,CAAC,CAAC,4HAA4H,CAAC;IACjI,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAChG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC;YAAE,KAAK,EAAE,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"code-edge-extractor.js","sourceRoot":"","sources":["../../../src/engine/graph/code-edge-extractor.ts"],"names":[],"mappings":"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"}
@@ -22,4 +22,6 @@ export declare class GraphSyncService {
22
22
  private readTopSymbols;
23
23
  private replaceCodeNodes;
24
24
  private toLabel;
25
+ /** SA4E-100: Create class nodes for Pega parent symbols (targets of BELONGS_TO edges). */
26
+ private syncPegaClasses;
25
27
  }
@@ -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, 'micro', `code-${nodeType.toLowerCase()}`,
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":"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"}
1
+ {"version":3,"file":"graph-sync-service.js","sourceRoot":"","sources":["../../../src/engine/graph/graph-sync-service.ts"],"names":[],"mappings":"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"}
@@ -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
- const body = await c.req.json();
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,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,GAAG,CAAC,CAAC;YAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;YACpE,IAAI,CAAC,KAAK;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,GAAG,CAAC,CAAC;YACpE,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,EAAE,GAAG,CAAC,CAAC;YACzE,OAAO,CAAC,CAAC,IAAI,CAAC;gBACZ,GAAG,MAAM;gBACT,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE;aAClG,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YAClC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6BAA6B,EAAE,EAAE,GAAG,CAAC,CAAC;YAClF,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAGxC,CAAC;YACT,IAAI,CAAC,OAAO,EAAE,KAAK;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uCAAuC,EAAE,EAAE,GAAG,CAAC,CAAC;YAC5F,OAAO,CAAC,CAAC,IAAI,CAAC;gBACZ,GAAG,OAAO;gBACV,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE;aACrG,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,2BAA2B,CAAC,CAAC;YAC3E,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sdlc-agent-4-enterprise-server",
3
- "version": "1.47.0",
3
+ "version": "1.47.1",
4
4
  "description": "Code Intelligence MCP Server — multi-agent SDLC pipeline with semantic memory, code graph, and draw.io integration",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -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, 'micro', `code-${nodeType.toLowerCase()}`,
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
- const body = await c.req.json();
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;