@saptools/service-flow 0.1.5 → 0.1.6

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/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.6
4
+
5
+ - Scoped runtime variable resolution to eligible dynamic, ambiguous, or unresolved remote edges with matching placeholders, preserving terminal and static resolved edge status, target, reason, and confidence.
6
+ - Clamped operation-resolution confidence to the `[0, 1]` range and retained original runtime expressions alongside effective substitutions and missing-variable evidence.
7
+ - Resolved helper/package dependency graph edges primarily by indexed package name, persisted ambiguous dependency candidates with evidence, and marked inserted helper edges with explicit statuses.
8
+ - Expanded repository fingerprints to include normalized package metadata, full `cds.requires`, scripts, package file content, and the analyzer version so metadata-only changes invalidate stale facts.
9
+ - Replaced the hard-coded CLI version with package metadata as the release source of truth and documented selector, graph variable, SQLite, fingerprint, freshness, and parser-warning semantics.
10
+
3
11
  ## 0.1.5
4
12
 
5
13
  - Runtime `--var` substitution now re-runs operation resolution in memory for trace and graph output, clears stale unresolved reasons on exact matches, and traverses into the matched downstream handler without mutating the persisted graph.
package/README.md CHANGED
@@ -47,10 +47,21 @@ npm install @saptools/service-flow
47
47
  ```
48
48
 
49
49
  > [!NOTE]
50
- > Requires **Node.js ≥ 20**. Version 0.1.5 uses a persistent SQLite driver (`node:sqlite` in supported Node builds) for bound parameters, transactions, WAL, busy timeouts, and read-only query commands. The analyzer is static: it reads files and package metadata, but it does not start CAP services, connect to SAP BTP, or execute application code.
50
+ > Requires **Node.js ≥ 24.0.0** for the bundled `node:sqlite` runtime. Version 0.1.6 uses a persistent SQLite driver (`node:sqlite` in supported Node builds) for bound parameters, transactions, WAL, busy timeouts, and read-only query commands. The analyzer is static: it reads files and package metadata, but it does not start CAP services, connect to SAP BTP, or execute application code.
51
51
 
52
52
  ---
53
53
 
54
+
55
+ ### Correctness notes for 0.1.6
56
+
57
+ - Runtime `--var` values are considered only for dynamic, ambiguous, or unresolved **remote** graph edges whose alias, destination, service path, or operation path expressions contain supplied placeholders. Local database, external HTTP, event, and already resolved static edges keep their persisted status, target, reason, and confidence. Partial substitutions remain dynamic and report the missing placeholder names.
58
+ - `trace` and `graph` both accept repeatable `--var key=value` options. Effective substitutions are rendered in trace evidence without mutating the persisted graph. Confidence values are bounded to `[0, 1]`.
59
+ - Repository selectors on list, trace, graph, and inspect commands narrow scope. Unknown selectors return empty machine-readable diagnostics instead of falling back to the whole workspace.
60
+ - Helper-package dependency edges prefer exact indexed package names. Duplicate package-name candidates are persisted as ambiguous evidence rather than silently selecting one repository.
61
+ - Repository fingerprints include source content, package name/version, dependencies and devDependencies, scripts, normalized `cds.requires` (including nested credentials), package file content, and the analyzer version. Metadata-only changes therefore trigger reindexing.
62
+ - Index publication is designed around the last-good snapshot: failed parse or persistence attempts are recorded as diagnostics and must not be mixed with older graph facts. After indexing changes, relink before relying on graph/trace output; doctor reports stale or inconsistent stores where detectable.
63
+ - Parser warnings describe analysis completeness, while routing status describes graph behavior. A terminal DB edge can remain terminal while still exposing parser warning evidence about an unknown entity.
64
+
54
65
  ## 🚀 Quick Start
55
66
 
56
67
  ```bash
package/TECHNICAL-NOTE.md CHANGED
@@ -1,4 +1,4 @@
1
- # Service Flow 0.1.5 Resolution Notes
1
+ # Service Flow 0.1.6 Resolution Notes
2
2
 
3
3
  - Imported helper bindings: TypeScript imports are resolved for relative modules. When a caller assigns `const client = await connectToService()`, the analyzer follows the imported symbol to an exported helper that returns `cds.connect.to(...)` and persists caller-variable evidence plus the helper source/export chain.
4
4
  - Candidate ranking: operation-path matches start as weak candidates. A resolved operation edge requires a strong signal such as exact service path, CDS alias/destination context, or explicit dynamic variable overrides. Otherwise candidates are preserved in edge evidence as ambiguous or unresolved.
@@ -19,3 +19,13 @@
19
19
  - Edge evidence and target operation provenance are separate: call file/line and helper chains stay on the edge, while operation nodes are loaded from CDS operation/service/repository rows.
20
20
  - The linker stores explicit edge status categories and summary counts. Valid DB, event, and external terminals keep `unresolved_reason` null.
21
21
  - Repository-level fingerprints include source paths/hashes, package dependencies, and analyzer schema version. Unchanged repositories are skipped unless `--force` is used.
22
+
23
+
24
+ ## 0.1.6 correctness additions
25
+
26
+ - Runtime resolution now has an explicit eligibility gate: only remote dynamic/ambiguous/unresolved graph edges with affected placeholders are re-resolved in memory. Terminal and resolved static edges are copied through unchanged, and substitutions keep original expressions, effective values, supplied variables, and missing variables separate.
27
+ - Operation candidate scores are clamped into `[0, 1]` before graph or trace rendering.
28
+ - Helper package linking uses exact `repositories.package_name` matches before normalized directory-name fallback. Ambiguous package names are represented as ambiguous graph edges with all candidates in evidence.
29
+ - Fingerprints hash normalized package facts and package bytes in addition to source file paths/content and analyzer version.
30
+ - The CLI version imports package metadata, so package metadata, `service-flow --version`, changelog, and analyzer/fingerprint version share one release source.
31
+ - Supported runtime is Node.js 24+ with `node:sqlite` validation; older runtimes should fail with a compatibility message instead of a late `DatabaseSync` error.
@@ -873,12 +873,30 @@ function collectClassHelpers(sf) {
873
873
  }
874
874
 
875
875
  // src/linker/dynamic-edge-resolver.ts
876
+ var PLACEHOLDER = /\$\{\s*(\w+)\s*\}/g;
876
877
  function applyVariables(template, vars) {
877
- if (!template) return void 0;
878
- return template.replace(
879
- /\$\{\s*(\w+)\s*\}/g,
880
- (_m, key) => vars[key] ?? `\${${key}}`
878
+ return substituteVariables(template, vars).effective;
879
+ }
880
+ function extractPlaceholders(template) {
881
+ return [...(template ?? "").matchAll(PLACEHOLDER)].map((m) => m[1] ?? "").filter(Boolean);
882
+ }
883
+ function substituteVariables(template, vars) {
884
+ if (!template) return { placeholders: [], missing: [], supplied: [], changed: false };
885
+ const placeholders2 = [...new Set(extractPlaceholders(template))];
886
+ const supplied = placeholders2.filter((key) => Object.hasOwn(vars, key));
887
+ const missing = placeholders2.filter((key) => !Object.hasOwn(vars, key));
888
+ const effective = template.replace(
889
+ PLACEHOLDER,
890
+ (_m, key) => Object.hasOwn(vars, key) ? vars[key] ?? "" : `\${${key}}`
881
891
  );
892
+ return {
893
+ original: template,
894
+ effective,
895
+ placeholders: placeholders2,
896
+ missing,
897
+ supplied,
898
+ changed: effective !== template
899
+ };
882
900
  }
883
901
 
884
902
  // src/linker/service-resolver.ts
@@ -936,6 +954,7 @@ function resolveOperation(db, signals, workspaceId) {
936
954
  c.reasons.push("explicit_dynamic_override");
937
955
  }
938
956
  }
957
+ for (const c of candidates) c.score = Math.max(0, Math.min(1, c.score));
939
958
  candidates.sort(
940
959
  (a, b) => b.score - a.score || a.repoName.localeCompare(b.repoName)
941
960
  );
@@ -968,31 +987,47 @@ function resolveOperation(db, signals, workspaceId) {
968
987
  }
969
988
 
970
989
  // src/linker/helper-package-linker.ts
990
+ function normalizeName(value) {
991
+ return value.toLowerCase().replace(/^@[^/]+\//, "").replace(/[^a-z0-9]+/g, "");
992
+ }
993
+ function candidatesForDependency(repos, dep, sourceId) {
994
+ const exact = repos.filter((repo) => repo.id !== sourceId && repo.package_name === dep);
995
+ if (exact.length > 0) return exact;
996
+ const normalized = normalizeName(dep);
997
+ return repos.filter((repo) => repo.id !== sourceId && normalizeName(repo.name) === normalized);
998
+ }
971
999
  function linkHelperPackages(db, workspaceId) {
972
1000
  const repos = db.prepare(
973
- "SELECT id,name,dependencies_json FROM repositories WHERE workspace_id=?"
1001
+ "SELECT id,name,package_name,dependencies_json FROM repositories WHERE workspace_id=?"
974
1002
  ).all(workspaceId);
975
1003
  let count = 0;
976
1004
  for (const repo of repos) {
977
1005
  const deps = JSON.parse(repo.dependencies_json);
978
1006
  for (const dep of Object.keys(deps)) {
979
- const helper = repos.find((r) => r.name === dep || dep.endsWith(r.name));
980
- if (helper) {
981
- db.prepare(
982
- "INSERT INTO graph_edges(workspace_id,edge_type,from_kind,from_id,to_kind,to_id,confidence,evidence_json,is_dynamic) VALUES(?,?,?,?,?,?,?,?,?)"
983
- ).run(
984
- workspaceId,
985
- "REPO_IMPORTS_HELPER_PACKAGE",
986
- "repo",
987
- String(repo.id),
988
- "repo",
989
- String(helper.id),
990
- 0.9,
991
- JSON.stringify({ dependency: dep }),
992
- 0
993
- );
994
- count += 1;
995
- }
1007
+ const candidates = candidatesForDependency(repos, dep, repo.id);
1008
+ if (candidates.length === 0) continue;
1009
+ const status = candidates.length === 1 ? "resolved" : "ambiguous";
1010
+ const helper = candidates.length === 1 ? candidates[0] : void 0;
1011
+ db.prepare(
1012
+ "INSERT INTO graph_edges(workspace_id,edge_type,status,from_kind,from_id,to_kind,to_id,confidence,evidence_json,is_dynamic,unresolved_reason) VALUES(?,?,?,?,?,?,?,?,?,?,?)"
1013
+ ).run(
1014
+ workspaceId,
1015
+ "REPO_IMPORTS_HELPER_PACKAGE",
1016
+ status,
1017
+ "repo",
1018
+ String(repo.id),
1019
+ helper ? "repo" : "repo_candidates",
1020
+ helper ? String(helper.id) : candidates.map((candidate) => candidate.id).join(","),
1021
+ helper ? 1 : 0.5,
1022
+ JSON.stringify({
1023
+ dependency: dep,
1024
+ candidates: candidates.map((candidate) => ({ id: candidate.id, name: candidate.name, packageName: candidate.package_name })),
1025
+ match: helper?.package_name === dep ? "package_name" : "normalized_directory"
1026
+ }),
1027
+ 0,
1028
+ helper ? null : "Ambiguous dependency package candidates"
1029
+ );
1030
+ count += 1;
996
1031
  }
997
1032
  }
998
1033
  return count;
@@ -1187,30 +1222,30 @@ function graphForCalls(db, callIds) {
1187
1222
  }
1188
1223
  return map;
1189
1224
  }
1190
- function candidatesFromEvidence(evidence) {
1191
- return Array.isArray(evidence.candidates) ? evidence.candidates.filter(
1192
- (candidate) => typeof candidate === "object" && candidate !== null
1193
- ) : [];
1225
+ function hasRuntimeVariable(value, vars) {
1226
+ return typeof value === "string" && extractPlaceholders(value).some((key) => Object.hasOwn(vars, key));
1227
+ }
1228
+ function isRemoteRuntimeCandidate(row, evidence, vars) {
1229
+ if (!vars || Object.keys(vars).length === 0) return false;
1230
+ if (!["dynamic", "ambiguous", "unresolved"].includes(String(row.status ?? ""))) return false;
1231
+ if (!["DYNAMIC_EDGE_CANDIDATE", "UNRESOLVED_EDGE", "REMOTE_CALL_RESOLVES_TO_OPERATION"].includes(row.edge_type)) return false;
1232
+ if (row.status === "resolved") return false;
1233
+ return ["servicePath", "operationPath", "serviceAliasExpr", "serviceAlias", "destination"].some((key) => hasRuntimeVariable(evidence[key], vars));
1194
1234
  }
1195
1235
  function evidenceWithRuntimeVariables(evidence, vars) {
1196
1236
  if (!vars || Object.keys(vars).length === 0) return evidence;
1197
- const servicePath = typeof evidence.servicePath === "string" ? applyVariables(evidence.servicePath, vars) : void 0;
1198
- const operationPath = typeof evidence.operationPath === "string" ? applyVariables(evidence.operationPath, vars) : void 0;
1199
- const candidates = candidatesFromEvidence(evidence);
1200
- const matched = servicePath ? candidates.find((candidate) => candidate.servicePath === servicePath) : void 0;
1201
- return {
1202
- ...evidence,
1203
- servicePath: servicePath ?? evidence.servicePath,
1204
- operationPath: operationPath ?? evidence.operationPath,
1205
- runtimeVariablesApplied: true,
1206
- runtimeResolvedCandidate: matched ? {
1207
- repoName: matched.repoName,
1208
- servicePath: matched.servicePath,
1209
- operationPath: matched.operationPath,
1210
- operationName: matched.operationName,
1211
- score: matched.score
1212
- } : void 0
1213
- };
1237
+ const substitutions = {};
1238
+ for (const key of ["servicePath", "operationPath", "serviceAliasExpr", "serviceAlias", "destination"]) {
1239
+ const substitution = substituteVariables(typeof evidence[key] === "string" ? String(evidence[key]) : void 0, vars);
1240
+ if (substitution.placeholders.length > 0) substitutions[key] = substitution;
1241
+ }
1242
+ const next = { ...evidence, runtimeVariablesApplied: true, runtimeSubstitutions: substitutions };
1243
+ for (const [key, value] of Object.entries(substitutions)) {
1244
+ if (value.effective) next[key] = value.effective;
1245
+ }
1246
+ const missing = Object.values(substitutions).flatMap((value) => value.missing);
1247
+ if (missing.length > 0) next.missingRuntimeVariables = [...new Set(missing)];
1248
+ return next;
1214
1249
  }
1215
1250
  function operationNode(db, operationId) {
1216
1251
  const row = db.prepare(`SELECT o.id operationId,o.operation_name operationName,o.operation_type operationType,o.operation_path operationPath,o.source_file sourceFile,o.source_line sourceLine,s.id serviceId,s.service_name serviceName,s.qualified_name qualifiedName,s.service_path servicePath,r.id repoId,r.name repoName FROM cds_operations o JOIN cds_services s ON s.id=o.service_id JOIN repositories r ON r.id=s.repo_id WHERE o.id=?`).get(operationId);
@@ -1221,20 +1256,22 @@ function workspaceIdForCall(db, callId) {
1221
1256
  return db.prepare("SELECT r.workspace_id workspaceId FROM outbound_calls c JOIN repositories r ON r.id=c.repo_id WHERE c.id=?").get(callId)?.workspaceId;
1222
1257
  }
1223
1258
  function runtimeResolution(db, row, evidence, vars) {
1224
- if (!vars || Object.keys(vars).length === 0) return { row, evidence, unresolvedReason: row.unresolved_reason };
1259
+ if (!isRemoteRuntimeCandidate(row, evidence, vars))
1260
+ return { row, evidence, unresolvedReason: row.unresolved_reason };
1225
1261
  const nextEvidence = evidenceWithRuntimeVariables(evidence, vars);
1226
1262
  const servicePath = typeof nextEvidence.servicePath === "string" ? nextEvidence.servicePath : void 0;
1227
1263
  const operationPath = typeof nextEvidence.operationPath === "string" ? nextEvidence.operationPath : void 0;
1228
- const alias = typeof nextEvidence.serviceAliasExpr === "string" ? applyVariables(nextEvidence.serviceAliasExpr, vars) : typeof nextEvidence.serviceAlias === "string" ? applyVariables(nextEvidence.serviceAlias, vars) : void 0;
1229
- const destination = typeof nextEvidence.destination === "string" ? applyVariables(nextEvidence.destination, vars) : void 0;
1230
- const resolution = resolveOperation(db, { servicePath, operationPath, alias, destination, hasExplicitOverride: true, isDynamic: Boolean(row.status === "dynamic" || nextEvidence.resolutionStatus === "dynamic") }, workspaceIdForCall(db, row.from_id));
1264
+ const alias = typeof nextEvidence.serviceAliasExpr === "string" ? nextEvidence.serviceAliasExpr : typeof nextEvidence.serviceAlias === "string" ? nextEvidence.serviceAlias : void 0;
1265
+ const destination = typeof nextEvidence.destination === "string" ? nextEvidence.destination : void 0;
1266
+ const resolution = resolveOperation(db, { servicePath, operationPath, alias, destination, hasExplicitOverride: true, isDynamic: true }, workspaceIdForCall(db, row.from_id));
1231
1267
  nextEvidence.runtimeResolutionStatus = resolution.status;
1232
1268
  nextEvidence.runtimeResolutionReasons = resolution.reasons;
1233
1269
  if (resolution.target) {
1234
1270
  nextEvidence.runtimeResolvedCandidate = resolution.target;
1235
- return { row: { ...row, to_kind: "operation", to_id: String(resolution.target.operationId), unresolved_reason: void 0, confidence: resolution.target.score }, evidence: nextEvidence, target: resolution.target };
1271
+ return { row: { ...row, to_kind: "operation", to_id: String(resolution.target.operationId), unresolved_reason: void 0, confidence: Math.max(0, Math.min(1, resolution.target.score)) }, evidence: nextEvidence, target: resolution.target };
1236
1272
  }
1237
- return { row, evidence: nextEvidence, unresolvedReason: resolution.status === "dynamic" ? `Dynamic target is missing runtime variables: ${resolution.reasons.join(", ")}` : resolution.status === "ambiguous" ? "Ambiguous runtime operation candidates" : "No runtime operation candidate matched substituted service and operation path" };
1273
+ const unresolvedReason = resolution.status === "dynamic" ? `Dynamic target is missing runtime variables: ${resolution.reasons.join(", ")}` : resolution.status === "ambiguous" ? "Ambiguous runtime operation candidates" : "No runtime operation candidate matched substituted service and operation path";
1274
+ return { row, evidence: nextEvidence, unresolvedReason };
1238
1275
  }
1239
1276
  function edgeTarget(row, evidence) {
1240
1277
  const runtimeCandidate = evidence.runtimeResolvedCandidate;
@@ -1360,7 +1397,9 @@ export {
1360
1397
  parseOutboundCalls,
1361
1398
  parseServiceBindings,
1362
1399
  applyVariables,
1400
+ extractPlaceholders,
1401
+ substituteVariables,
1363
1402
  linkWorkspace,
1364
1403
  trace
1365
1404
  };
1366
- //# sourceMappingURL=chunk-I33ASGX3.js.map
1405
+ //# sourceMappingURL=chunk-6C5HZ6IR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/discovery/discover-repositories.ts","../src/utils/path-utils.ts","../src/parsers/package-json-parser.ts","../src/parsers/cds-parser.ts","../src/parsers/decorator-parser.ts","../src/parsers/ts-project.ts","../src/parsers/handler-registration-parser.ts","../src/utils/redaction.ts","../src/parsers/outbound-call-parser.ts","../src/parsers/service-binding-parser.ts","../src/linker/dynamic-edge-resolver.ts","../src/linker/service-resolver.ts","../src/linker/helper-package-linker.ts","../src/linker/cross-repo-linker.ts","../src/trace/trace-engine.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { DiscoveredRepository } from '../types.js';\nimport { relativePath } from '../utils/path-utils.js';\nexport async function discoverRepositories(\n rootPath: string,\n ignore: readonly string[]\n): Promise<DiscoveredRepository[]> {\n const root = path.resolve(rootPath);\n const ignored = new Set(ignore);\n const found: DiscoveredRepository[] = [];\n async function isRealGitMarker(dir: string): Promise<boolean> {\n const gitPath = path.join(dir, '.git');\n try {\n const st = await fs.stat(gitPath);\n if (st.isDirectory()) {\n const children = await fs.readdir(gitPath);\n return children.includes('HEAD') || children.includes('config');\n }\n if (st.isFile()) {\n const text = await fs.readFile(gitPath, 'utf8');\n return text.trimStart().startsWith('gitdir:');\n }\n } catch {\n /* not a normal git marker */\n }\n try {\n const fixture = await fs.stat(path.join(dir, '.git-fixture'));\n return fixture.isFile() || fixture.isDirectory();\n } catch {\n return false;\n }\n }\n async function walk(dir: string): Promise<void> {\n const rel = relativePath(root, dir);\n if (rel !== '.' && rel.split('/').some((part) => ignored.has(part))) return;\n let entries: Array<{ name: string; isDirectory: () => boolean }>;\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n const hasMarker = entries.some((e) => e.name === '.git' || e.name === '.git-fixture');\n if (hasMarker && await isRealGitMarker(dir)) {\n found.push({\n name: path.basename(dir),\n absolutePath: dir,\n relativePath: relativePath(root, dir),\n isGitRepo: true\n });\n }\n for (const entry of entries)\n if (entry.isDirectory() && !ignore.includes(entry.name))\n await walk(path.join(dir, entry.name));\n }\n await walk(root);\n return found.sort((a, b) => a.relativePath.localeCompare(b.relativePath));\n}\n","import path from 'node:path';\nexport function normalizePath(value: string): string {\n return value.split(path.sep).join('/');\n}\nexport function relativePath(root: string, value: string): string {\n return normalizePath(path.relative(root, value) || '.');\n}\nexport function ensureLeadingSlash(value: string): string {\n return value.startsWith('/') ? value : `/${value}`;\n}\nexport function stripQuotes(value: string): string {\n return value.replace(/^['\"`]|['\"`]$/g, '');\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CdsRequire, PackageFacts } from '../types.js';\nfunction recordOfString(value: unknown): Record<string, string> {\n if (!value || typeof value !== 'object') return {};\n return Object.fromEntries(\n Object.entries(value).filter(([, v]) => typeof v === 'string')\n ) as Record<string, string>;\n}\nfunction readRequires(cds: unknown): CdsRequire[] {\n const requires =\n cds && typeof cds === 'object' && 'requires' in cds\n ? (cds as { requires?: unknown }).requires\n : undefined;\n if (!requires || typeof requires !== 'object') return [];\n return Object.entries(requires).flatMap(([alias, raw]) => {\n if (!raw || typeof raw !== 'object') return [];\n const obj = raw as Record<string, unknown>;\n const credentials =\n obj.credentials && typeof obj.credentials === 'object'\n ? (obj.credentials as Record<string, unknown>)\n : {};\n return [\n {\n alias,\n kind: typeof obj.kind === 'string' ? obj.kind : undefined,\n model: typeof obj.model === 'string' ? obj.model : undefined,\n destination:\n typeof credentials.destination === 'string'\n ? credentials.destination\n : undefined,\n servicePath:\n typeof credentials.path === 'string' ? credentials.path : undefined,\n requestTimeout:\n typeof credentials.requestTimeout === 'number'\n ? credentials.requestTimeout\n : undefined,\n rawJson: JSON.stringify(raw)\n }\n ];\n });\n}\nexport async function parsePackageJson(\n repoPath: string\n): Promise<PackageFacts> {\n try {\n const raw = await fs.readFile(path.join(repoPath, 'package.json'), 'utf8');\n const json = JSON.parse(raw) as Record<string, unknown>;\n return {\n packageName: typeof json.name === 'string' ? json.name : undefined,\n packageVersion:\n typeof json.version === 'string' ? json.version : undefined,\n dependencies: {\n ...recordOfString(json.dependencies),\n ...recordOfString(json.devDependencies)\n },\n cdsRequires: readRequires(json.cds),\n scripts: recordOfString(json.scripts)\n };\n } catch {\n return { dependencies: {}, cdsRequires: [], scripts: {} };\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CdsOperationFact, CdsServiceFact } from '../types.js';\nimport { ensureLeadingSlash, normalizePath } from '../utils/path-utils.js';\n\nfunction lineOf(text: string, index: number): number {\n return text.slice(0, index).split('\\n').length;\n}\n\nfunction maskCommentsAndStrings(text: string): string {\n let out = '';\n let mode: 'code' | 'line' | 'block' | 'single' | 'double' | 'template' =\n 'code';\n for (let i = 0; i < text.length; i += 1) {\n const c = text[i] ?? '';\n const n = text[i + 1] ?? '';\n if (mode === 'code' && c === '/' && n === '/') {\n mode = 'line';\n out += ' ';\n i += 1;\n continue;\n }\n if (mode === 'code' && c === '/' && n === '*') {\n mode = 'block';\n out += ' ';\n i += 1;\n continue;\n }\n if (mode === 'line' && c === '\\n') mode = 'code';\n if (mode === 'block' && c === '*' && n === '/') {\n mode = 'code';\n out += ' ';\n i += 1;\n continue;\n }\n if (mode === 'code' && (c === \"'\" || c === '\"' || c === '`')) {\n mode = c === \"'\" ? 'single' : c === '\"' ? 'double' : 'template';\n out += ' ';\n continue;\n }\n if ((mode === 'single' && c === \"'\") || (mode === 'double' && c === '\"') || (mode === 'template' && c === '`'))\n mode = 'code';\n out += mode === 'code' || c === '\\n' ? c : ' ';\n }\n return out;\n}\n\nfunction readAnnotation(text: string, index: number): { end: number; raw: string } | undefined {\n if (text[index] !== '@') return undefined;\n let i = index + 1;\n while (/\\s/.test(text[i] ?? '')) i += 1;\n if (text[i] !== '(') return undefined;\n let depth = 0;\n for (; i < text.length; i += 1) {\n if (text[i] === '(') depth += 1;\n if (text[i] === ')') depth -= 1;\n if (depth === 0) return { end: i + 1, raw: text.slice(index, i + 1) };\n }\n return undefined;\n}\n\nfunction collectAnnotations(text: string, index: number): { end: number; raw: string } {\n let i = index;\n let raw = '';\n while (i < text.length) {\n while (/\\s/.test(text[i] ?? '')) i += 1;\n const annotation = readAnnotation(text, i);\n if (!annotation) break;\n raw += annotation.raw;\n i = annotation.end;\n }\n return { end: i, raw };\n}\n\nfunction pathAnnotation(raw: string): string | undefined {\n return /path\\s*:\\s*['\"]([^'\"]+)['\"]/s.exec(raw)?.[1];\n}\n\nfunction matchingBrace(text: string, open: number): number {\n let depth = 0;\n for (let i = open; i < text.length; i += 1) {\n if (text[i] === '{') depth += 1;\n if (text[i] === '}') depth -= 1;\n if (depth === 0) return i;\n }\n return text.length - 1;\n}\n\nfunction operationsFromBody(text: string, maskedBody: string, bodyOffset: number, filePath: string): CdsOperationFact[] {\n return [...maskedBody.matchAll(/\\b(action|function|event)\\s+(\\w+)\\s*(?:\\(([^)]*)\\))?\\s*(?:returns\\s+([^;{]+))?/g)].map((m) => ({\n operationType: (m[1] as 'action' | 'function' | 'event') ?? 'action',\n operationName: m[2] ?? 'unknown',\n operationPath: ensureLeadingSlash(m[2] ?? 'unknown'),\n paramsJson: JSON.stringify((m[3] ?? '').split(',').map((part) => part.trim()).filter(Boolean)),\n returnType: m[4]?.trim(),\n sourceFile: normalizePath(filePath),\n sourceLine: lineOf(text, bodyOffset + (m.index ?? 0))\n }));\n}\n\nexport async function parseCdsFile(repoPath: string, filePath: string): Promise<CdsServiceFact[]> {\n const absolute = path.join(repoPath, filePath);\n const text = await fs.readFile(absolute, 'utf8');\n const masked = maskCommentsAndStrings(text);\n const namespace = /namespace\\s+([\\w.]+)\\s*;/.exec(masked)?.[1];\n const services: CdsServiceFact[] = [];\n const pendingAnnotations: Array<{ end: number; raw: string }> = [];\n for (const a of masked.matchAll(/@\\s*\\(/g)) {\n const annotation = collectAnnotations(masked, a.index ?? 0);\n pendingAnnotations.push(annotation);\n }\n const serviceRegex = /\\b(extend\\s+)?service\\s+([\\w.]+)\\b/g;\n let match: RegExpExecArray | null;\n while ((match = serviceRegex.exec(masked))) {\n const afterName = collectAnnotations(masked, serviceRegex.lastIndex);\n const open = masked.indexOf('{', afterName.end);\n if (open === -1) continue;\n const matchIndex = match.index;\n const prefix = pendingAnnotations\n .filter((a) => a.end <= matchIndex && matchIndex - a.end < 8)\n .map((a) => a.raw)\n .join('');\n const annotations = `${prefix}${afterName.raw}`;\n const end = matchingBrace(masked, open);\n const body = masked.slice(open + 1, end);\n const name = match[2] ?? 'UnknownService';\n const serviceName = name.split('.').pop() ?? name;\n const servicePath = ensureLeadingSlash(pathAnnotation(annotations) ?? serviceName);\n services.push({\n namespace,\n serviceName,\n qualifiedName: name.includes('.') ? name : namespace ? `${namespace}.${name}` : name,\n servicePath,\n isExtend: Boolean(match[1]),\n sourceFile: normalizePath(filePath),\n sourceLine: lineOf(text, match.index),\n operations: operationsFromBody(text, body, open + 1, filePath)\n });\n serviceRegex.lastIndex = end + 1;\n }\n const baseOps = new Map(services.filter((s) => !s.isExtend).map((s) => [s.qualifiedName, s.operations]));\n for (const service of services.filter((s) => s.isExtend && s.operations.length === 0)) {\n const inherited = baseOps.get(service.qualifiedName) ?? baseOps.get(service.serviceName);\n if (inherited) service.operations = inherited.map((op) => ({ ...op, sourceFile: service.sourceFile, sourceLine: service.sourceLine }));\n }\n return services;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport ts from 'typescript';\nimport type { HandlerClassFact } from '../types.js';\nimport { createSourceFile } from './ts-project.js';\nimport { normalizePath, stripQuotes } from '../utils/path-utils.js';\nfunction line(sf: ts.SourceFile, pos: number): number {\n return sf.getLineAndCharacterOfPosition(pos).line + 1;\n}\nfunction decs(node: ts.Node): ts.Decorator[] {\n return ts.canHaveDecorators(node) ? [...(ts.getDecorators(node) ?? [])] : [];\n}\nfunction callName(d: ts.Decorator): string {\n const e = d.expression;\n return ts.isCallExpression(e) ? e.expression.getText() : e.getText();\n}\nfunction firstArg(d: ts.Decorator): string {\n const e = d.expression;\n return ts.isCallExpression(e) && e.arguments[0]\n ? e.arguments[0].getText()\n : '';\n}\nexport async function parseDecorators(\n repoPath: string,\n filePath: string\n): Promise<HandlerClassFact[]> {\n const text = await fs.readFile(path.join(repoPath, filePath), 'utf8');\n const sf = createSourceFile(filePath, text);\n const constants = new Map<string, string>();\n const handlers: HandlerClassFact[] = [];\n function visit(node: ts.Node): void {\n if (\n ts.isVariableDeclaration(node) &&\n ts.isIdentifier(node.name) &&\n node.initializer &&\n ts.isStringLiteralLike(node.initializer)\n )\n constants.set(node.name.text, node.initializer.text);\n if (ts.isClassDeclaration(node)) {\n const className = node.name?.text ?? 'AnonymousHandler';\n const hasHandler = decs(node).some((d) => callName(d) === 'Handler');\n const methods = node.members.filter(ts.isMethodDeclaration).flatMap((m) =>\n decs(m)\n .filter((d) =>\n ['Func', 'Action', 'On', 'Event'].includes(callName(d))\n )\n .map((d) => {\n const raw = firstArg(d);\n const value =\n raw.startsWith('\"') || raw.startsWith(\"'\") || raw.startsWith('`')\n ? stripQuotes(raw)\n : (constants.get(raw) ??\n (raw.endsWith('.name') ? raw.split('.').at(-2) : undefined));\n return {\n methodName: m.name.getText(),\n decoratorKind: callName(d),\n decoratorValue: value,\n decoratorRawExpression: raw,\n sourceFile: normalizePath(filePath),\n sourceLine: line(sf, m.getStart())\n };\n })\n );\n if (hasHandler || methods.length > 0)\n handlers.push({\n className,\n sourceFile: normalizePath(filePath),\n sourceLine: line(sf, node.getStart()),\n methods\n });\n }\n ts.forEachChild(node, visit);\n }\n visit(sf);\n return handlers;\n}\n","import ts from 'typescript';\nexport function createSourceFile(\n filePath: string,\n text: string\n): ts.SourceFile {\n return ts.createSourceFile(\n filePath,\n text,\n ts.ScriptTarget.Latest,\n true,\n filePath.endsWith('.js') ? ts.ScriptKind.JS : ts.ScriptKind.TS\n );\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { HandlerRegistrationFact } from '../types.js';\nimport { normalizePath } from '../utils/path-utils.js';\nfunction lineOf(text: string, idx: number): number {\n return text.slice(0, idx).split('\\n').length;\n}\nexport async function parseHandlerRegistrations(\n repoPath: string,\n filePath: string\n): Promise<HandlerRegistrationFact[]> {\n const text = await fs.readFile(path.join(repoPath, filePath), 'utf8');\n const out: HandlerRegistrationFact[] = [];\n for (const m of text.matchAll(\n /createCombinedHandler\\s*\\(|srv\\.prepend\\s*\\(|cds\\.serve\\s*\\(/g\n ))\n out.push({\n registrationFile: normalizePath(filePath),\n registrationLine: lineOf(text, m.index ?? 0),\n registrationKind: m[0].startsWith('cds')\n ? 'cds.serve'\n : 'combined-handler',\n confidence: 0.8\n });\n for (const m of text.matchAll(\n /(?:const|export\\s+const)\\s+handlers\\s*=\\s*\\[([\\s\\S]*?)\\]/g\n ))\n for (const c of (m[1] ?? '').matchAll(/\\b(\\w+Handler)\\b/g))\n out.push({\n className: c[1],\n registrationFile: normalizePath(filePath),\n registrationLine: lineOf(text, (m.index ?? 0) + (c.index ?? 0)),\n registrationKind: 'handler-array',\n confidence: 0.9\n });\n return out;\n}\n","const SENSITIVE = /authorization|cookie|token|secret|password|key|credential/i;\nexport function redactText(text: string): string {\n return text.replace(\n /(authorization|cookie|token|secret|password|key|credential)\\s*[:=]\\s*(['\"`]?)[^,'\"`}\\s]+\\2/gi,\n '$1: [REDACTED]'\n );\n}\nexport function redactValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(redactValue);\n if (value && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value))\n out[k] = SENSITIVE.test(k) ? '[REDACTED]' : redactValue(v);\n return out;\n }\n return typeof value === 'string' ? redactText(value) : value;\n}\nexport function summarizeExpression(text: string): string {\n return redactText(text).slice(0, 240);\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { OutboundCallFact } from '../types.js';\nimport { normalizePath, stripQuotes } from '../utils/path-utils.js';\nimport { summarizeExpression } from '../utils/redaction.js';\nfunction lineOf(text: string, idx: number): number {\n return text.slice(0, idx).split('\\n').length;\n}\nfunction firstArg(body: string, key: string): string | undefined {\n return new RegExp(`${key}\\\\s*:\\\\s*([^,}\\\\n]+)`).exec(body)?.[1]?.trim();\n}\nfunction matchingParen(text: string, open: number): number {\n let depth = 0;\n let quote: string | undefined;\n let escaped = false;\n for (let i = open; i < text.length; i += 1) {\n const ch = text[i] ?? '';\n if (quote) {\n if (escaped) escaped = false;\n else if (ch === '\\\\') escaped = true;\n else if (ch === quote) quote = undefined;\n continue;\n }\n if (ch === '\"' || ch === \"'\" || ch === '`') {\n quote = ch;\n continue;\n }\n if (ch === '(') depth += 1;\n if (ch === ')') {\n depth -= 1;\n if (depth === 0) return i;\n }\n }\n return -1;\n}\nfunction argumentForCall(expr: string, marker: string): string | undefined {\n const idx = expr.indexOf(marker);\n if (idx < 0) return undefined;\n const open = expr.indexOf('(', idx + marker.length);\n if (open < 0) return undefined;\n const close = matchingParen(expr, open);\n return close > open ? expr.slice(open + 1, close).trim() : undefined;\n}\nfunction entityFromArg(arg: string | undefined): string | undefined {\n if (!arg) return undefined;\n const first = arg.split(',')[0]?.trim();\n if (!first) return undefined;\n return stripQuotes(first).replace(/^this\\./, '');\n}\nfunction extractQueryEntity(expr: string): string | undefined {\n return (\n entityFromArg(argumentForCall(expr, 'SELECT.one.from')) ??\n entityFromArg(argumentForCall(expr, 'SELECT.from')) ??\n entityFromArg(argumentForCall(expr, 'INSERT.into')) ??\n entityFromArg(argumentForCall(expr, 'UPDATE')) ??\n entityFromArg(argumentForCall(expr, 'DELETE.from'))\n );\n}\nexport async function parseOutboundCalls(\n repoPath: string,\n filePath: string,\n): Promise<OutboundCallFact[]> {\n const text = await fs.readFile(path.join(repoPath, filePath), 'utf8');\n const out: OutboundCallFact[] = [];\n for (const m of text.matchAll(/(\\w+)\\.send\\s*\\(\\s*\\{([\\s\\S]*?)\\}\\s*\\)/g)) {\n const body = m[2] ?? '';\n const query = firstArg(body, 'query');\n const op = firstArg(body, 'path') ?? firstArg(body, 'event');\n out.push({\n callType: query ? 'remote_query' : 'remote_action',\n serviceVariableName: m[1],\n method: stripQuotes(firstArg(body, 'method') ?? 'POST'),\n operationPathExpr: op\n ? `/${stripQuotes(op).replace(/^\\//, '')}`\n : undefined,\n queryEntity: extractQueryEntity(query ?? ''),\n payloadSummary: summarizeExpression(body),\n sourceFile: normalizePath(filePath),\n sourceLine: lineOf(text, m.index ?? 0),\n confidence: op || query ? 0.8 : 0.4,\n });\n }\n for (const m of text.matchAll(/cds\\.run\\s*\\(/g)) {\n const open = (m.index ?? 0) + m[0].lastIndexOf('(');\n const close = matchingParen(text, open);\n const expr = close > open ? text.slice(open + 1, close) : '';\n const entity = extractQueryEntity(expr);\n out.push({\n callType: 'local_db_query',\n queryEntity: entity,\n payloadSummary: summarizeExpression(expr),\n sourceFile: normalizePath(filePath),\n sourceLine: lineOf(text, m.index ?? 0),\n confidence: entity ? 0.9 : 0.55,\n unresolvedReason: entity\n ? undefined\n : 'Could not resolve CAP query target entity from nested expression',\n });\n }\n for (const m of text.matchAll(\n /(\\w+)\\.(emit|publish|on)\\s*\\(\\s*(['\"`])([^'\"`]+)\\3/g,\n ))\n out.push({\n callType: m[2] === 'on' ? 'async_subscribe' : 'async_emit',\n serviceVariableName: m[1],\n eventNameExpr: m[4],\n sourceFile: normalizePath(filePath),\n sourceLine: lineOf(text, m.index ?? 0),\n confidence: 0.8,\n });\n for (const m of text.matchAll(\n /(?:axios\\s*\\(|executeHttpRequest\\s*\\(|useOrFetchDestination\\s*\\()([\\s\\S]*?)\\)/g,\n ))\n out.push({\n callType: 'external_http',\n payloadSummary: summarizeExpression(m[1] ?? ''),\n sourceFile: normalizePath(filePath),\n sourceLine: lineOf(text, m.index ?? 0),\n confidence: 0.7,\n unresolvedReason:\n 'External HTTP destination is outside indexed CAP services',\n });\n for (const m of text.matchAll(\n /cds\\.services(?:\\[['\"]([^'\"]+)['\"]\\]|\\.(\\w+))\\.(\\w+)\\s*\\(/g,\n ))\n out.push({\n callType: 'local_service_call',\n operationPathExpr: `/${m[3] ?? ''}`,\n payloadSummary: m[1] ?? m[2],\n sourceFile: normalizePath(filePath),\n sourceLine: lineOf(text, m.index ?? 0),\n confidence: 0.75,\n });\n return out;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport ts from 'typescript';\nimport type { ServiceBindingFact } from '../types.js';\nimport { normalizePath } from '../utils/path-utils.js';\n\ninterface HelperBinding {\n exportedName: string;\n alias?: string;\n aliasExpr?: string;\n destinationExpr?: string;\n servicePathExpr?: string;\n isDynamic: boolean;\n placeholders: string[];\n sourceFile: string;\n sourceLine: number;\n}\ninterface ImportBinding {\n localName: string;\n exportedName: string;\n sourceFile?: string;\n}\ninterface ClassHelperReturn {\n className: string;\n helperName: string;\n propertyName: string;\n variableName: string;\n fact: Omit<HelperBinding, 'exportedName' | 'sourceFile' | 'sourceLine'>;\n sourceLine: number;\n}\n\nfunction lineOf(sf: ts.SourceFile, node: ts.Node): number {\n return sf.getLineAndCharacterOfPosition(node.getStart(sf)).line + 1;\n}\nfunction stringValue(node: ts.Expression | undefined): string | undefined {\n if (!node) return undefined;\n if (ts.isStringLiteralLike(node) || ts.isNoSubstitutionTemplateLiteral(node))\n return node.text;\n if (ts.isTemplateExpression(node))\n return node.getText().replace(/^`|`$/g, '');\n return node.getText();\n}\nfunction placeholders(value?: string): string[] {\n return [...(value ?? '').matchAll(/\\$\\{\\s*(\\w+)\\s*\\}/g)]\n .map((m) => m[1] ?? '')\n .filter(Boolean);\n}\nfunction connectFactFromCall(\n call: ts.CallExpression,\n):\n | Omit<HelperBinding, 'exportedName' | 'sourceFile' | 'sourceLine'>\n | undefined {\n const expr = call.expression;\n if (!ts.isPropertyAccessExpression(expr) || expr.name.text !== 'to')\n return undefined;\n const inner = expr.expression;\n if (\n !ts.isPropertyAccessExpression(inner) ||\n inner.name.text !== 'connect' ||\n inner.expression.getText() !== 'cds'\n )\n return undefined;\n const first = call.arguments[0];\n if (!first) return undefined;\n const second = call.arguments[1];\n const objectArg = ts.isObjectLiteralExpression(first)\n ? first\n : second && ts.isObjectLiteralExpression(second)\n ? second\n : undefined;\n let alias: string | undefined;\n let aliasExpr: string | undefined;\n if (ts.isStringLiteralLike(first) || ts.isNoSubstitutionTemplateLiteral(first))\n alias = first.text;\n else if (!ts.isObjectLiteralExpression(first))\n aliasExpr = stringValue(first);\n if (\n (ts.isStringLiteralLike(first) || ts.isNoSubstitutionTemplateLiteral(first)) &&\n !objectArg\n )\n return { alias: first.text, isDynamic: false, placeholders: [] };\n if (!objectArg && aliasExpr)\n return {\n aliasExpr,\n isDynamic: true,\n placeholders: placeholders(aliasExpr),\n };\n let destinationExpr: string | undefined;\n let servicePathExpr: string | undefined;\n function visitObject(obj: ts.ObjectLiteralExpression): void {\n for (const prop of obj.properties) {\n if (!ts.isPropertyAssignment(prop)) continue;\n const name =\n ts.isIdentifier(prop.name) || ts.isStringLiteralLike(prop.name)\n ? prop.name.text\n : undefined;\n if (name === 'destination')\n destinationExpr = stringValue(prop.initializer);\n if (name === 'path' || name === 'servicePath')\n servicePathExpr = stringValue(prop.initializer);\n if (ts.isObjectLiteralExpression(prop.initializer))\n visitObject(prop.initializer);\n }\n }\n if (objectArg) visitObject(objectArg);\n const ph = [\n ...placeholders(aliasExpr ?? alias),\n ...placeholders(destinationExpr),\n ...placeholders(servicePathExpr),\n ];\n return {\n alias,\n aliasExpr,\n destinationExpr,\n servicePathExpr,\n isDynamic: ph.length > 0 || (!destinationExpr && !servicePathExpr),\n placeholders: ph,\n };\n}\nfunction unwrapCall(expr: ts.Expression): ts.CallExpression | undefined {\n if (ts.isAwaitExpression(expr)) return unwrapCall(expr.expression);\n if (ts.isCallExpression(expr)) return expr;\n return undefined;\n}\nfunction findConnectInExpression(\n expr: ts.Expression,\n):\n | Omit<HelperBinding, 'exportedName' | 'sourceFile' | 'sourceLine'>\n | undefined {\n const direct = unwrapCall(expr);\n if (direct) {\n const fact = connectFactFromCall(direct);\n if (fact) return fact;\n }\n let found:\n | Omit<HelperBinding, 'exportedName' | 'sourceFile' | 'sourceLine'>\n | undefined;\n function visit(node: ts.Node): void {\n if (found) return;\n if (ts.isCallExpression(node)) found = connectFactFromCall(node);\n if (!found) ts.forEachChild(node, visit);\n }\n visit(expr);\n return found;\n}\nasync function readSource(abs: string): Promise<ts.SourceFile | undefined> {\n try {\n const text = await fs.readFile(abs, 'utf8');\n return ts.createSourceFile(\n abs,\n text,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n } catch {\n return undefined;\n }\n}\nasync function resolveImport(\n repoPath: string,\n fromFile: string,\n spec: string,\n): Promise<string | undefined> {\n if (!spec.startsWith('.')) return undefined;\n const rawBase = path.resolve(repoPath, path.dirname(fromFile), spec);\n const parsed = path.parse(rawBase);\n const base = ['.js', '.mjs', '.cjs', '.ts', '.mts', '.cts'].includes(parsed.ext)\n ? path.join(parsed.dir, parsed.name)\n : rawBase;\n for (const candidate of [\n base,\n `${base}.ts`,\n `${base}.js`,\n path.join(base, 'index.ts'),\n path.join(base, 'index.js'),\n ]) {\n try {\n const st = await fs.stat(candidate);\n if (st.isFile()) return normalizePath(path.relative(repoPath, candidate));\n } catch {\n /* continue */\n }\n }\n return undefined;\n}\nasync function importsFor(\n repoPath: string,\n filePath: string,\n sf: ts.SourceFile,\n): Promise<ImportBinding[]> {\n const imports: ImportBinding[] = [];\n for (const stmt of sf.statements) {\n if (\n !ts.isImportDeclaration(stmt) ||\n !ts.isStringLiteralLike(stmt.moduleSpecifier)\n )\n continue;\n const sourceFile = await resolveImport(\n repoPath,\n filePath,\n stmt.moduleSpecifier.text,\n );\n const clause = stmt.importClause;\n if (!clause) continue;\n if (clause.name)\n imports.push({\n localName: clause.name.text,\n exportedName: 'default',\n sourceFile,\n });\n const bindings = clause.namedBindings;\n if (bindings && ts.isNamedImports(bindings))\n for (const el of bindings.elements)\n imports.push({\n localName: el.name.text,\n exportedName: el.propertyName?.text ?? el.name.text,\n sourceFile,\n });\n }\n return imports;\n}\nfunction exportedLocalNames(sf: ts.SourceFile): Map<string, string> {\n const exports = new Map<string, string>();\n for (const stmt of sf.statements) {\n const direct = ts.canHaveModifiers(stmt)\n ? (ts\n .getModifiers(stmt)\n ?.some(\n (m: ts.ModifierLike) => m.kind === ts.SyntaxKind.ExportKeyword,\n ) ?? false)\n : false;\n if (direct && ts.isFunctionDeclaration(stmt) && stmt.name)\n exports.set(stmt.name.text, stmt.name.text);\n if (direct && ts.isVariableStatement(stmt))\n for (const decl of stmt.declarationList.declarations)\n if (ts.isIdentifier(decl.name)) exports.set(decl.name.text, decl.name.text);\n if (!ts.isExportDeclaration(stmt) || !stmt.exportClause) continue;\n if (!ts.isNamedExports(stmt.exportClause)) continue;\n for (const el of stmt.exportClause.elements)\n exports.set(el.name.text, el.propertyName?.text ?? el.name.text);\n }\n return exports;\n}\nasync function helperBindings(\n repoPath: string,\n filePath: string,\n): Promise<HelperBinding[]> {\n const sf = await readSource(path.join(repoPath, filePath));\n if (!sf) return [];\n const sourceFileAst = sf;\n const out: HelperBinding[] = [];\n const exportedLocals = exportedLocalNames(sf);\n const factsByLocal = new Map<\n string,\n Omit<HelperBinding, 'exportedName' | 'sourceFile' | 'sourceLine'> & {\n sourceLine: number;\n }\n >();\n for (const stmt of sf.statements) {\n if (ts.isFunctionDeclaration(stmt) && stmt.name) {\n let fact:\n | Omit<HelperBinding, 'exportedName' | 'sourceFile' | 'sourceLine'>\n | undefined;\n stmt.forEachChild(function visit(node): void {\n if (!fact && ts.isReturnStatement(node) && node.expression)\n fact = findConnectInExpression(node.expression);\n if (!fact) ts.forEachChild(node, visit);\n });\n if (fact) factsByLocal.set(stmt.name.text, { ...fact, sourceLine: lineOf(sf, stmt) });\n }\n if (ts.isVariableStatement(stmt))\n for (const decl of stmt.declarationList.declarations) {\n if (!ts.isIdentifier(decl.name) || !decl.initializer) continue;\n const fact = findConnectInExpression(decl.initializer);\n if (fact)\n factsByLocal.set(decl.name.text, {\n ...fact,\n sourceLine: lineOf(sourceFileAst, decl),\n });\n }\n }\n for (const [exportedName, localName] of exportedLocals) {\n const fact = factsByLocal.get(localName);\n if (fact)\n out.push({\n ...fact,\n exportedName,\n sourceFile: normalizePath(filePath),\n sourceLine: fact.sourceLine,\n });\n }\n return out;\n}\n\nexport async function parseServiceBindings(\n repoPath: string,\n filePath: string,\n): Promise<ServiceBindingFact[]> {\n const sf = await readSource(path.join(repoPath, filePath));\n if (!sf) return [];\n const sourceFileAst = sf;\n const out: ServiceBindingFact[] = [];\n const imports = await importsFor(repoPath, filePath, sf);\n const helperCache = new Map<string, HelperBinding[]>();\n const classHelpers = collectClassHelpers(sourceFileAst);\n async function importedHelper(\n localName: string,\n ): Promise<{ imp: ImportBinding; helper: HelperBinding } | undefined> {\n const imp = imports.find((i) => i.localName === localName && i.sourceFile);\n if (!imp?.sourceFile) return undefined;\n if (!helperCache.has(imp.sourceFile))\n helperCache.set(\n imp.sourceFile,\n await helperBindings(repoPath, imp.sourceFile),\n );\n const helper = helperCache\n .get(imp.sourceFile)\n ?.find((h) => h.exportedName === imp.exportedName);\n return helper ? { imp, helper } : undefined;\n }\n async function recordVariable(decl: ts.VariableDeclaration): Promise<void> {\n if (!ts.isIdentifier(decl.name) || !decl.initializer) return;\n const call = unwrapCall(decl.initializer);\n if (!call) return;\n const direct = connectFactFromCall(call);\n if (direct)\n out.push({\n variableName: decl.name.text,\n ...direct,\n sourceFile: normalizePath(filePath),\n sourceLine: lineOf(sourceFileAst, decl),\n });\n else if (ts.isIdentifier(call.expression)) {\n const resolved = await importedHelper(call.expression.text);\n if (resolved)\n out.push({\n variableName: decl.name.text,\n alias: resolved.helper.alias,\n aliasExpr: resolved.helper.aliasExpr,\n destinationExpr: resolved.helper.destinationExpr,\n servicePathExpr: resolved.helper.servicePathExpr,\n isDynamic: resolved.helper.isDynamic,\n placeholders: resolved.helper.placeholders,\n sourceFile: normalizePath(filePath),\n sourceLine: lineOf(sourceFileAst, decl),\n helperChain: [\n {\n callerVariable: decl.name.text,\n importedHelper: call.expression.text,\n importSource: resolved.imp.sourceFile,\n exportedSymbol: resolved.imp.exportedName,\n helperSourceFile: resolved.helper.sourceFile,\n helperSourceLine: resolved.helper.sourceLine,\n },\n ],\n });\n }\n }\n function recordDestructuredClassHelper(decl: ts.VariableDeclaration): void {\n if (!ts.isObjectBindingPattern(decl.name) || !decl.initializer) return;\n const call = unwrapCall(decl.initializer);\n if (!call || !ts.isPropertyAccessExpression(call.expression)) return;\n const target = call.expression;\n if (target.expression.kind !== ts.SyntaxKind.ThisKeyword) return;\n for (const el of decl.name.elements) {\n if (!ts.isIdentifier(el.name)) continue;\n const propertyName = el.propertyName && ts.isIdentifier(el.propertyName)\n ? el.propertyName.text\n : el.name.text;\n const helper = classHelpers.find(\n (h) => h.helperName === target.name.text && h.propertyName === propertyName,\n );\n if (!helper) continue;\n out.push({\n variableName: el.name.text,\n ...helper.fact,\n sourceFile: normalizePath(filePath),\n sourceLine: lineOf(sourceFileAst, decl),\n helperChain: [\n {\n callerVariable: el.name.text,\n className: helper.className,\n classHelper: helper.helperName,\n returnedProperty: helper.propertyName,\n helperVariable: helper.variableName,\n helperSourceFile: normalizePath(filePath),\n helperSourceLine: helper.sourceLine,\n },\n ],\n });\n }\n }\n const declarations: ts.VariableDeclaration[] = [];\n function collectDeclarations(node: ts.Node): void {\n if (ts.isVariableDeclaration(node)) declarations.push(node);\n ts.forEachChild(node, collectDeclarations);\n }\n collectDeclarations(sourceFileAst);\n for (const decl of declarations) {\n recordDestructuredClassHelper(decl);\n await recordVariable(decl);\n }\n return out;\n}\n\nfunction collectClassHelpers(sf: ts.SourceFile): ClassHelperReturn[] {\n const helpers: ClassHelperReturn[] = [];\n for (const stmt of sf.statements) {\n if (!ts.isClassDeclaration(stmt) || !stmt.name) continue;\n for (const member of stmt.members) {\n if (!ts.isPropertyDeclaration(member) || !member.initializer) continue;\n if (!ts.isIdentifier(member.name)) continue;\n const className = stmt.name.text;\n const helperName = member.name.text;\n const initializer = member.initializer;\n if (!ts.isArrowFunction(initializer) && !ts.isFunctionExpression(initializer))\n continue;\n const bindings = new Map<\n string,\n Omit<HelperBinding, 'exportedName' | 'sourceFile' | 'sourceLine'>\n >();\n function visit(node: ts.Node): void {\n if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name) && node.initializer) {\n const fact = findConnectInExpression(node.initializer);\n if (fact) bindings.set(node.name.text, fact);\n }\n if (ts.isReturnStatement(node) && node.expression && ts.isObjectLiteralExpression(node.expression)) {\n for (const prop of node.expression.properties) {\n if (ts.isShorthandPropertyAssignment(prop)) {\n const fact = bindings.get(prop.name.text);\n if (fact)\n helpers.push({\n className,\n helperName,\n propertyName: prop.name.text,\n variableName: prop.name.text,\n fact,\n sourceLine: lineOf(sf, prop),\n });\n }\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.initializer)) {\n const propertyName =\n ts.isIdentifier(prop.name) || ts.isStringLiteralLike(prop.name)\n ? prop.name.text\n : undefined;\n const fact = propertyName ? bindings.get(prop.initializer.text) : undefined;\n if (propertyName && fact)\n helpers.push({\n className,\n helperName,\n propertyName,\n variableName: prop.initializer.text,\n fact,\n sourceLine: lineOf(sf, prop),\n });\n }\n }\n }\n ts.forEachChild(node, visit);\n }\n visit(initializer);\n }\n }\n return helpers;\n}\n","export interface RuntimeSubstitution {\n original?: string;\n effective?: string;\n placeholders: string[];\n missing: string[];\n supplied: string[];\n changed: boolean;\n}\n\nconst PLACEHOLDER = /\\$\\{\\s*(\\w+)\\s*\\}/g;\n\nexport function applyVariables(\n template: string | undefined,\n vars: Record<string, string>,\n): string | undefined {\n return substituteVariables(template, vars).effective;\n}\n\nexport function extractPlaceholders(template: string | undefined): string[] {\n return [...(template ?? '').matchAll(PLACEHOLDER)]\n .map((m) => m[1] ?? '')\n .filter(Boolean);\n}\n\nexport function substituteVariables(\n template: string | undefined,\n vars: Record<string, string>,\n): RuntimeSubstitution {\n if (!template) return { placeholders: [], missing: [], supplied: [], changed: false };\n const placeholders = [...new Set(extractPlaceholders(template))];\n const supplied = placeholders.filter((key) => Object.hasOwn(vars, key));\n const missing = placeholders.filter((key) => !Object.hasOwn(vars, key));\n const effective = template.replace(PLACEHOLDER, (_m, key: string) =>\n Object.hasOwn(vars, key) ? vars[key] ?? '' : `\\${${key}}`,\n );\n return {\n original: template,\n effective,\n placeholders,\n missing,\n supplied,\n changed: effective !== template,\n };\n}\n","import type { Db } from '../db/connection.js';\nexport interface OperationTarget {\n operationId: number;\n repoName: string;\n servicePath: string;\n operationPath: string;\n operationName: string;\n sourceFile: string;\n sourceLine: number;\n score: number;\n reasons: string[];\n}\nexport interface OperationResolution {\n status: 'resolved' | 'ambiguous' | 'unresolved' | 'dynamic';\n target?: OperationTarget;\n candidates: OperationTarget[];\n reasons: string[];\n}\nfunction rows(\n db: Db,\n operationPath: string,\n workspaceId?: number,\n): OperationTarget[] {\n return db\n .prepare(\n `SELECT o.id operationId,r.name repoName,s.service_path servicePath,o.operation_path operationPath,o.operation_name operationName,o.source_file sourceFile,o.source_line sourceLine,0 score,'' reasons\n FROM cds_operations o JOIN cds_services s ON s.id=o.service_id JOIN repositories r ON r.id=s.repo_id\n WHERE (? IS NULL OR r.workspace_id=?) AND (o.operation_path=? OR o.operation_name=?) ORDER BY r.name,s.service_path,o.operation_name`,\n )\n .all(\n workspaceId,\n workspaceId,\n operationPath,\n operationPath.replace(/^\\//, ''),\n ) as unknown as OperationTarget[];\n}\nexport function resolveOperation(\n db: Db,\n signals: {\n servicePath?: string;\n alias?: string;\n destination?: string;\n operationPath?: string;\n hasExplicitOverride?: boolean;\n isDynamic?: boolean;\n },\n workspaceId?: number,\n): OperationResolution {\n const missing = [signals.servicePath, signals.alias, signals.destination, signals.operationPath].flatMap((value) => [...(value ?? '').matchAll(/\\$\\{\\s*(\\w+)\\s*\\}/g)].map((match) => match[1] ?? '')).filter(Boolean);\n if (missing.length > 0)\n return {\n status: 'dynamic',\n candidates: signals.operationPath ? rows(db, signals.operationPath, workspaceId) : [],\n reasons: [...new Set(missing)].map((name) => `missing_variable:${name}`),\n };\n if (!signals.operationPath)\n return {\n status: 'unresolved',\n candidates: [],\n reasons: ['missing_operation_path'],\n };\n const candidates = rows(db, signals.operationPath, workspaceId).map((c) => ({\n ...c,\n score: 0.2,\n reasons: ['operation_path_match'],\n }));\n if (candidates.length === 0)\n return {\n status: 'unresolved',\n candidates: [],\n reasons: ['no_operation_candidates'],\n };\n const hasStrongSignal = Boolean(\n signals.servicePath ||\n signals.alias ||\n signals.destination ||\n signals.hasExplicitOverride,\n );\n for (const c of candidates) {\n if (signals.servicePath && c.servicePath === signals.servicePath) {\n c.score += 0.75;\n c.reasons.push('exact_service_path');\n }\n if (signals.servicePath && c.servicePath !== signals.servicePath) {\n c.score -= 0.1;\n c.reasons.push('service_path_mismatch');\n }\n if (signals.hasExplicitOverride) {\n c.score += 0.2;\n c.reasons.push('explicit_dynamic_override');\n }\n }\n for (const c of candidates) c.score = Math.max(0, Math.min(1, c.score));\n candidates.sort(\n (a, b) => b.score - a.score || a.repoName.localeCompare(b.repoName),\n );\n const best = candidates[0];\n const second = candidates[1];\n if (signals.isDynamic && !signals.hasExplicitOverride && !signals.servicePath)\n return {\n status: 'dynamic',\n candidates,\n reasons: ['dynamic_target_without_override'],\n };\n if (!hasStrongSignal)\n return {\n status: candidates.length > 1 ? 'ambiguous' : 'unresolved',\n candidates,\n reasons: ['operation_path_only_has_no_strong_target_signal'],\n };\n if (\n best &&\n best.score >= 0.9 &&\n best.servicePath === signals.servicePath &&\n (best.operationPath === signals.operationPath || best.operationName === signals.operationPath.replace(/^\\//, '')) &&\n (!second || best.score - second.score >= 0.25)\n )\n return {\n status: 'resolved',\n target: best,\n candidates,\n reasons: best.reasons,\n };\n return {\n status: candidates.length > 1 ? 'ambiguous' : 'unresolved',\n candidates,\n reasons: ['candidate_score_below_resolution_threshold'],\n };\n}\nexport function findOperation(\n db: Db,\n servicePath: string | undefined,\n operationPath: string | undefined,\n workspaceId?: number,\n): OperationTarget | undefined {\n return resolveOperation(db, { servicePath, operationPath }, workspaceId)\n .target;\n}\n","import type { Db } from '../db/connection.js';\n\ninterface RepoDependencyRow {\n id: number;\n name: string;\n package_name: string | null;\n dependencies_json: string;\n}\n\nfunction normalizeName(value: string): string {\n return value.toLowerCase().replace(/^@[^/]+\\//, '').replace(/[^a-z0-9]+/g, '');\n}\n\nfunction candidatesForDependency(repos: RepoDependencyRow[], dep: string, sourceId: number): RepoDependencyRow[] {\n const exact = repos.filter((repo) => repo.id !== sourceId && repo.package_name === dep);\n if (exact.length > 0) return exact;\n const normalized = normalizeName(dep);\n return repos.filter((repo) => repo.id !== sourceId && normalizeName(repo.name) === normalized);\n}\n\nexport function linkHelperPackages(db: Db, workspaceId: number): number {\n const repos = db\n .prepare(\n 'SELECT id,name,package_name,dependencies_json FROM repositories WHERE workspace_id=?',\n )\n .all(workspaceId) as unknown as RepoDependencyRow[];\n let count = 0;\n for (const repo of repos) {\n const deps = JSON.parse(repo.dependencies_json) as Record<string, string>;\n for (const dep of Object.keys(deps)) {\n const candidates = candidatesForDependency(repos, dep, repo.id);\n if (candidates.length === 0) continue;\n const status = candidates.length === 1 ? 'resolved' : 'ambiguous';\n const helper = candidates.length === 1 ? candidates[0] : undefined;\n db.prepare(\n 'INSERT INTO graph_edges(workspace_id,edge_type,status,from_kind,from_id,to_kind,to_id,confidence,evidence_json,is_dynamic,unresolved_reason) VALUES(?,?,?,?,?,?,?,?,?,?,?)',\n ).run(\n workspaceId,\n 'REPO_IMPORTS_HELPER_PACKAGE',\n status,\n 'repo',\n String(repo.id),\n helper ? 'repo' : 'repo_candidates',\n helper ? String(helper.id) : candidates.map((candidate) => candidate.id).join(','),\n helper ? 1 : 0.5,\n JSON.stringify({\n dependency: dep,\n candidates: candidates.map((candidate) => ({ id: candidate.id, name: candidate.name, packageName: candidate.package_name })),\n match: helper?.package_name === dep ? 'package_name' : 'normalized_directory',\n }),\n 0,\n helper ? null : 'Ambiguous dependency package candidates',\n );\n count += 1;\n }\n }\n return count;\n}\n","import type { Db } from '../db/connection.js';\nimport { applyVariables } from './dynamic-edge-resolver.js';\nimport { resolveOperation } from './service-resolver.js';\nimport { linkHelperPackages } from './helper-package-linker.js';\nexport function linkWorkspace(\n db: Db,\n workspaceId: number,\n vars: Record<string, string> = {},\n): { edgeCount: number; unresolvedCount: number; resolvedCount: number; ambiguousCount: number; dynamicCount: number; terminalCount: number } {\n return db.transaction(() => {\n db.prepare('DELETE FROM graph_edges WHERE workspace_id=?').run(workspaceId);\n let edges = linkHelperPackages(db, workspaceId);\n let unresolved = 0;\n let resolvedCount = 0;\n let ambiguousCount = 0;\n let dynamicCount = 0;\n let terminalCount = 0;\n const calls = db\n .prepare(\n `SELECT c.*,r.name repoName,b.alias,b.alias_expr aliasExpr,b.destination_expr destinationExpr,b.service_path_expr servicePathExpr,b.is_dynamic isDynamic,b.placeholders_json placeholdersJson,b.helper_chain_json helperChainJson,req.service_path requireServicePath,req.destination requireDestination FROM outbound_calls c JOIN repositories r ON r.id=c.repo_id LEFT JOIN service_bindings b ON b.id=c.service_binding_id LEFT JOIN cds_requires req ON req.repo_id=c.repo_id AND req.alias=b.alias WHERE r.workspace_id=?`,\n )\n .all(workspaceId) as Array<Record<string, unknown>>;\n for (const call of calls) {\n const callType = String(call.call_type);\n const op = applyVariables(String(call.operation_path_expr ?? ''), vars);\n const servicePath = applyVariables(\n (call.servicePathExpr as string | undefined) ??\n (call.requireServicePath as string | undefined),\n vars,\n );\n const destination =\n (call.destinationExpr as string | undefined) ??\n (call.requireDestination as string | undefined);\n const isDynamic = Boolean(Number(call.isDynamic ?? 0));\n const resolution = callType.startsWith('remote')\n ? resolveOperation(\n db,\n {\n servicePath,\n operationPath: op,\n alias: applyVariables((call.aliasExpr as string | undefined) ?? (call.alias as string | undefined), vars),\n destination: applyVariables(destination, vars),\n isDynamic,\n hasExplicitOverride: Object.keys(vars).length > 0,\n },\n workspaceId,\n )\n : { status: 'unresolved' as const, candidates: [], reasons: [] };\n const target = resolution.target;\n const evidence = {\n sourceFile: call.source_file,\n sourceLine: call.source_line,\n file: call.source_file,\n line: call.source_line,\n repo: call.repoName,\n serviceAlias: call.alias,\n serviceAliasExpr: call.aliasExpr,\n destination: applyVariables(destination, vars),\n servicePath,\n operationPath: op,\n targetRepo: target?.repoName,\n targetOperation: target?.operationName,\n helperChain: call.helperChainJson\n ? (JSON.parse(String(call.helperChainJson)) as unknown)\n : undefined,\n candidates: resolution.candidates,\n candidateCount: resolution.candidates.length,\n resolutionStatus: resolution.status,\n resolutionReasons: resolution.reasons,\n };\n if (target) {\n db.prepare(\n 'INSERT INTO graph_edges(workspace_id,edge_type,status,from_kind,from_id,to_kind,to_id,confidence,evidence_json,is_dynamic) VALUES(?,?,?,?,?,?,?,?,?,?)',\n ).run(\n workspaceId,\n 'REMOTE_CALL_RESOLVES_TO_OPERATION',\n 'resolved',\n 'call',\n String(call.id),\n 'operation',\n String(target.operationId),\n target.score,\n JSON.stringify(evidence),\n isDynamic ? 1 : 0,\n );\n edges += 1;\n resolvedCount += 1;\n } else {\n const edgeType =\n callType === 'local_db_query'\n ? 'HANDLER_RUNS_DB_QUERY'\n : callType === 'external_http'\n ? 'HANDLER_CALLS_EXTERNAL_HTTP'\n : callType === 'async_emit'\n ? 'HANDLER_EMITS_EVENT'\n : callType === 'async_subscribe'\n ? 'EVENT_CONSUMED_BY_HANDLER'\n : resolution.status === 'dynamic'\n ? 'DYNAMIC_EDGE_CANDIDATE'\n : 'UNRESOLVED_EDGE';\n const status = edgeType === 'DYNAMIC_EDGE_CANDIDATE' ? 'dynamic' : resolution.status === 'ambiguous' ? 'ambiguous' : edgeType === 'UNRESOLVED_EDGE' ? 'unresolved' : 'terminal';\n const unresolvedReason = status === 'terminal' ? null : String(\n call.unresolved_reason ??\n (resolution.status === 'ambiguous'\n ? 'Ambiguous operation candidates require a strong service signal'\n : resolution.status === 'dynamic'\n ? `Dynamic target requires runtime variable overrides: ${(resolution.reasons.length ? resolution.reasons : ['missing runtime variables']).join(', ')}`\n : 'No indexed target operation matched'),\n );\n db.prepare(\n 'INSERT INTO graph_edges(workspace_id,edge_type,status,from_kind,from_id,to_kind,to_id,confidence,evidence_json,is_dynamic,unresolved_reason) VALUES(?,?,?,?,?,?,?,?,?,?,?)',\n ).run(\n workspaceId,\n edgeType,\n status,\n 'call',\n String(call.id),\n callType.startsWith('async_') ? 'event' : 'external',\n String(call.event_name_expr ?? call.query_entity ?? op ?? call.id),\n Number(call.confidence ?? 0.2),\n JSON.stringify(evidence),\n isDynamic || resolution.status === 'dynamic' ? 1 : 0,\n unresolvedReason,\n );\n edges += 1;\n unresolved += status === 'unresolved' ? 1 : 0;\n ambiguousCount += status === 'ambiguous' ? 1 : 0;\n dynamicCount += status === 'dynamic' ? 1 : 0;\n terminalCount += status === 'terminal' ? 1 : 0;\n }\n }\n return { edgeCount: edges, unresolvedCount: unresolved, resolvedCount, ambiguousCount, dynamicCount, terminalCount };\n });\n}\n","import type { Db } from '../db/connection.js';\nimport { extractPlaceholders, substituteVariables, type RuntimeSubstitution } from '../linker/dynamic-edge-resolver.js';\nimport { resolveOperation, type OperationTarget } from '../linker/service-resolver.js';\nimport type { TraceEdge, TraceResult, TraceStart } from '../types.js';\n\ninterface RepoRef {\n id: number;\n name: string;\n}\ninterface StartScope {\n repo?: RepoRef;\n sourceFiles?: Set<string>;\n selectorMatched: boolean;\n}\ninterface CallRow extends Record<string, unknown> {\n id: number;\n repo_id: number;\n repoName: string;\n source_file: string;\n source_line: number;\n call_type: string;\n confidence: number;\n}\ninterface GraphRow extends Record<string, unknown> {\n id: number;\n edge_type: string;\n from_id: string;\n to_kind: string;\n to_id: string;\n confidence: number;\n evidence_json: string;\n unresolved_reason?: string;\n status?: string;\n}\ninterface Candidate {\n servicePath?: string;\n operationPath?: string;\n repoName?: string;\n operationName?: string;\n score?: number;\n}\n\nfunction normalizeOperation(value: string | undefined): string | undefined {\n if (!value) return undefined;\n return value.startsWith('/') ? value.slice(1) : value;\n}\nfunction positiveDepth(value: number): number {\n return Number.isFinite(value) && value > 0 ? Math.floor(value) : 25;\n}\nfunction sourceFilesForStart(\n db: Db,\n repoId: number | undefined,\n start: TraceStart,\n): Set<string> | undefined {\n const handler = start.handler;\n const operation = normalizeOperation(start.operation ?? start.operationPath);\n if (!handler && !operation) return undefined;\n const rows = db\n .prepare(\n `SELECT DISTINCT hc.source_file sourceFile\n FROM handler_classes hc LEFT JOIN handler_methods hm ON hm.handler_class_id=hc.id\n WHERE (? IS NULL OR hc.repo_id=?) AND (? IS NULL OR hc.class_name=? OR hm.method_name=?)\n AND (? IS NULL OR hm.decorator_value=? OR hm.method_name=?)\n AND (? IS NULL OR EXISTS (SELECT 1 FROM cds_services s JOIN cds_operations o ON o.service_id=s.id WHERE s.repo_id=hc.repo_id AND s.service_path=? AND (? IS NULL OR o.operation_path=? OR o.operation_name=? OR hm.decorator_value=? OR hm.method_name=?)))`,\n )\n .all(\n repoId,\n repoId,\n handler,\n handler,\n handler,\n operation,\n operation,\n operation,\n start.servicePath,\n start.servicePath,\n operation,\n operation,\n operation,\n operation,\n operation,\n ) as Array<{ sourceFile?: string }>;\n if (start.servicePath && rows.length === 0) return undefined;\n if (rows.length === 0) return undefined;\n return new Set(rows.map((row) => row.sourceFile).filter(Boolean) as string[]);\n}\nfunction startScope(db: Db, start: TraceStart): StartScope {\n const repo = start.repo\n ? (db\n .prepare(\n 'SELECT id,name FROM repositories WHERE name=? OR package_name=?',\n )\n .get(start.repo, start.repo) as RepoRef | undefined)\n : undefined;\n if (start.repo && !repo) return { repo, selectorMatched: false };\n const sourceFiles = sourceFilesForStart(db, repo?.id, start);\n const hasSelector = Boolean(\n start.handler ?? start.operation ?? start.operationPath,\n );\n return {\n repo,\n sourceFiles,\n selectorMatched: !hasSelector || sourceFiles !== undefined,\n };\n}\nfunction handlerFilesForOperation(db: Db, operationId: string): Set<string> {\n const op = db\n .prepare(\n `SELECT o.operation_name operationName,o.operation_path operationPath,s.repo_id repoId\n FROM cds_operations o JOIN cds_services s ON s.id=o.service_id WHERE o.id=?`,\n )\n .get(operationId) as\n | { operationName?: string; operationPath?: string; repoId?: number }\n | undefined;\n if (!op) return new Set();\n const operation = normalizeOperation(op.operationPath ?? op.operationName);\n const rows = db\n .prepare(\n `SELECT DISTINCT hc.source_file sourceFile FROM handler_classes hc\n JOIN handler_methods hm ON hm.handler_class_id=hc.id\n WHERE hc.repo_id=? AND (hm.decorator_value=? OR hm.method_name=? OR hm.decorator_value=?)`,\n )\n .all(op.repoId, operation, operation, op.operationName) as Array<{\n sourceFile?: string;\n }>;\n return new Set(rows.map((row) => row.sourceFile).filter(Boolean) as string[]);\n}\nfunction includeCall(\n type: string,\n options: {\n includeExternal?: boolean;\n includeDb?: boolean;\n includeAsync?: boolean;\n },\n): boolean {\n if (!options.includeDb && type === 'local_db_query') return false;\n if (!options.includeExternal && type === 'external_http') return false;\n if (!options.includeAsync && type.startsWith('async_')) return false;\n return true;\n}\nfunction graphForCalls(db: Db, callIds: number[]): Map<number, GraphRow[]> {\n const map = new Map<number, GraphRow[]>();\n if (callIds.length === 0) return map;\n const rows = db\n .prepare(\n `SELECT * FROM graph_edges WHERE from_kind='call' AND from_id IN (${callIds.map(() => '?').join(',')}) ORDER BY id`,\n )\n .all(...callIds.map((id) => String(id))) as GraphRow[];\n for (const row of rows) {\n const id = Number(row.from_id);\n map.set(id, [...(map.get(id) ?? []), row]);\n }\n return map;\n}\nfunction hasRuntimeVariable(value: unknown, vars: Record<string, string>): boolean {\n return typeof value === 'string' && extractPlaceholders(value).some((key) => Object.hasOwn(vars, key));\n}\n\nfunction isRemoteRuntimeCandidate(row: GraphRow, evidence: Record<string, unknown>, vars: Record<string, string> | undefined): boolean {\n if (!vars || Object.keys(vars).length === 0) return false;\n if (!['dynamic', 'ambiguous', 'unresolved'].includes(String(row.status ?? ''))) return false;\n if (!['DYNAMIC_EDGE_CANDIDATE', 'UNRESOLVED_EDGE', 'REMOTE_CALL_RESOLVES_TO_OPERATION'].includes(row.edge_type)) return false;\n if (row.status === 'resolved') return false;\n return ['servicePath', 'operationPath', 'serviceAliasExpr', 'serviceAlias', 'destination'].some((key) => hasRuntimeVariable(evidence[key], vars));\n}\n\nfunction evidenceWithRuntimeVariables(\n evidence: Record<string, unknown>,\n vars: Record<string, string> | undefined,\n): Record<string, unknown> {\n if (!vars || Object.keys(vars).length === 0) return evidence;\n const substitutions: Record<string, RuntimeSubstitution> = {};\n for (const key of ['servicePath', 'operationPath', 'serviceAliasExpr', 'serviceAlias', 'destination']) {\n const substitution = substituteVariables(typeof evidence[key] === 'string' ? String(evidence[key]) : undefined, vars);\n if (substitution.placeholders.length > 0) substitutions[key] = substitution;\n }\n const next: Record<string, unknown> = { ...evidence, runtimeVariablesApplied: true, runtimeSubstitutions: substitutions };\n for (const [key, value] of Object.entries(substitutions)) {\n if (value.effective) next[key] = value.effective;\n }\n const missing = Object.values(substitutions).flatMap((value) => value.missing);\n if (missing.length > 0) next.missingRuntimeVariables = [...new Set(missing)];\n return next;\n}\n\nfunction operationNode(db: Db, operationId: string): Record<string, unknown> | undefined {\n const row = db.prepare(`SELECT o.id operationId,o.operation_name operationName,o.operation_type operationType,o.operation_path operationPath,o.source_file sourceFile,o.source_line sourceLine,s.id serviceId,s.service_name serviceName,s.qualified_name qualifiedName,s.service_path servicePath,r.id repoId,r.name repoName FROM cds_operations o JOIN cds_services s ON s.id=o.service_id JOIN repositories r ON r.id=s.repo_id WHERE o.id=?`).get(operationId) as Record<string, unknown> | undefined;\n if (!row) return undefined;\n return { id: `operation:${operationId}`, kind: 'operation', label: `${String(row.repoName)}:${String(row.servicePath)}${String(row.operationPath)}`, ...row };\n}\nfunction workspaceIdForCall(db: Db, callId: string): number | undefined {\n return (db.prepare('SELECT r.workspace_id workspaceId FROM outbound_calls c JOIN repositories r ON r.id=c.repo_id WHERE c.id=?').get(callId) as { workspaceId?: number } | undefined)?.workspaceId;\n}\nfunction runtimeResolution(db: Db, row: GraphRow, evidence: Record<string, unknown>, vars: Record<string, string> | undefined): { row: GraphRow; evidence: Record<string, unknown>; target?: OperationTarget; unresolvedReason?: string } {\n if (!isRemoteRuntimeCandidate(row, evidence, vars))\n return { row, evidence, unresolvedReason: row.unresolved_reason };\n const nextEvidence = evidenceWithRuntimeVariables(evidence, vars);\n const servicePath = typeof nextEvidence.servicePath === 'string' ? nextEvidence.servicePath : undefined;\n const operationPath = typeof nextEvidence.operationPath === 'string' ? nextEvidence.operationPath : undefined;\n const alias = typeof nextEvidence.serviceAliasExpr === 'string' ? nextEvidence.serviceAliasExpr : typeof nextEvidence.serviceAlias === 'string' ? nextEvidence.serviceAlias : undefined;\n const destination = typeof nextEvidence.destination === 'string' ? nextEvidence.destination : undefined;\n const resolution = resolveOperation(db, { servicePath, operationPath, alias, destination, hasExplicitOverride: true, isDynamic: true }, workspaceIdForCall(db, row.from_id));\n nextEvidence.runtimeResolutionStatus = resolution.status;\n nextEvidence.runtimeResolutionReasons = resolution.reasons;\n if (resolution.target) {\n nextEvidence.runtimeResolvedCandidate = resolution.target;\n return { row: { ...row, to_kind: 'operation', to_id: String(resolution.target.operationId), unresolved_reason: undefined, confidence: Math.max(0, Math.min(1, resolution.target.score)) }, evidence: nextEvidence, target: resolution.target };\n }\n const unresolvedReason = resolution.status === 'dynamic' ? `Dynamic target is missing runtime variables: ${resolution.reasons.join(', ')}` : resolution.status === 'ambiguous' ? 'Ambiguous runtime operation candidates' : 'No runtime operation candidate matched substituted service and operation path';\n return { row, evidence: nextEvidence, unresolvedReason };\n}\nfunction edgeTarget(row: GraphRow, evidence: Record<string, unknown>): string {\n const runtimeCandidate = evidence.runtimeResolvedCandidate as\n | Candidate\n | undefined;\n if (runtimeCandidate?.servicePath && runtimeCandidate.operationPath)\n return `${runtimeCandidate.servicePath}${runtimeCandidate.operationPath}`;\n const servicePath =\n typeof evidence.servicePath === 'string' ? evidence.servicePath : undefined;\n const operationPath =\n typeof evidence.operationPath === 'string'\n ? evidence.operationPath\n : undefined;\n const targetOperation =\n typeof evidence.targetOperation === 'string'\n ? evidence.targetOperation\n : undefined;\n const targetRepo =\n typeof evidence.targetRepo === 'string' ? evidence.targetRepo : '';\n return servicePath && operationPath\n ? `${servicePath}${operationPath}`\n : targetOperation\n ? `${targetRepo}:${targetOperation}`\n : row.to_id;\n}\nexport function trace(\n db: Db,\n start: TraceStart,\n options: {\n depth: number;\n vars?: Record<string, string>;\n includeExternal?: boolean;\n includeDb?: boolean;\n includeAsync?: boolean;\n },\n): TraceResult {\n const scope = startScope(db, start);\n const diagnostics = db\n .prepare(\n 'SELECT severity,code,message,source_file sourceFile,source_line sourceLine FROM diagnostics WHERE (? IS NULL OR repo_id=?)',\n )\n .all(scope.repo?.id, scope.repo?.id) as Array<Record<string, unknown>>;\n if (!scope.selectorMatched)\n diagnostics.unshift({\n severity: 'warning',\n code: 'trace_start_not_found',\n message: 'No handler source matched the requested trace start selector',\n });\n const maxDepth = positiveDepth(options.depth);\n const edges: TraceEdge[] = [];\n const nodes = new Map<string, Record<string, unknown>>();\n const queue: Array<{ repoId?: number; files?: Set<string>; depth: number }> =\n scope.selectorMatched\n ? [{ repoId: scope.repo?.id, files: scope.sourceFiles, depth: 1 }]\n : [];\n const seenScopes = new Set<string>();\n const seenEdges = new Set<number>();\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current || current.depth > maxDepth) continue;\n const key = `${current.repoId ?? '*'}:${[...(current.files ?? new Set(['*']))].sort().join(',')}`;\n if (seenScopes.has(key)) continue;\n seenScopes.add(key);\n const calls = db\n .prepare(\n `SELECT c.*,r.name repoName FROM outbound_calls c JOIN repositories r ON r.id=c.repo_id WHERE (? IS NULL OR c.repo_id=?) ORDER BY c.source_file,c.source_line`,\n )\n .all(current.repoId, current.repoId) as CallRow[];\n const filtered = calls.filter(\n (c) =>\n (!current.files || current.files.has(String(c.source_file))) &&\n includeCall(String(c.call_type), options),\n );\n const graph = graphForCalls(\n db,\n filtered.map((c) => Number(c.id)),\n );\n for (const call of filtered) {\n const callNode = `call:${call.id}`;\n nodes.set(callNode, {\n id: callNode,\n kind: 'outbound_call',\n repo: call.repoName,\n file: call.source_file,\n line: call.source_line,\n callType: call.call_type,\n });\n const graphRows = graph.get(Number(call.id)) ?? [];\n for (const row of graphRows) {\n if (seenEdges.has(Number(row.id))) continue;\n seenEdges.add(Number(row.id));\n const rawEvidence = JSON.parse(\n String(row.evidence_json || '{}'),\n ) as Record<string, unknown>;\n const effective = runtimeResolution(db, row, rawEvidence, options.vars);\n const evidence = effective.evidence;\n const effectiveRow = effective.row;\n const targetNode = `${effectiveRow.to_kind}:${effectiveRow.to_id}`;\n const opNode = effectiveRow.to_kind === 'operation' ? operationNode(db, effectiveRow.to_id) : undefined;\n nodes.set(targetNode, opNode ?? {\n id: targetNode,\n kind: effectiveRow.to_kind,\n label: effectiveRow.to_id,\n });\n const to = edgeTarget(effectiveRow, evidence);\n edges.push({\n step: current.depth,\n type: String(call.call_type),\n from: `${call.repoName}:${call.source_file}`,\n to,\n evidence,\n confidence: Number(effectiveRow.confidence ?? call.confidence),\n unresolvedReason: effective.unresolvedReason,\n });\n if (effectiveRow.to_kind === 'operation' && current.depth < maxDepth) {\n const files = handlerFilesForOperation(db, effectiveRow.to_id);\n if (files.size > 0) {\n const targetRepoId = db\n .prepare(\n 'SELECT s.repo_id repoId FROM cds_operations o JOIN cds_services s ON s.id=o.service_id WHERE o.id=?',\n )\n .get(effectiveRow.to_id)?.repoId as number | undefined;\n const nextKey = `${targetRepoId ?? '*'}:${[...files].sort().join(',')}`;\n if (seenScopes.has(nextKey))\n edges.push({\n step: current.depth + 1,\n type: 'cycle',\n from: to,\n to: nextKey,\n evidence: { ...evidence, cycle: true },\n confidence: 1,\n unresolvedReason:\n 'Cycle detected; downstream scope already visited',\n });\n else\n queue.push({\n repoId: targetRepoId,\n files,\n depth: current.depth + 1,\n });\n }\n }\n }\n }\n }\n return { start, nodes: [...nodes.values()], edges, diagnostics };\n}\n"],"mappings":"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","names":["path","path","fs","path","fs","path","path","fs","fs","path","ts","ts","fs","path","fs","path","lineOf","fs","path","fs","path","lineOf","firstArg","fs","path","fs","path","ts","lineOf","ts","fs","path","visit","placeholders","rows"]}