@saptools/service-flow 0.1.30 → 0.1.32
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 +14 -0
- package/README.md +20 -1
- package/TECHNICAL-NOTE.md +7 -0
- package/dist/{chunk-UHYHSYCS.js → chunk-VT5FVMOA.js} +238 -71
- package/dist/chunk-VT5FVMOA.js.map +1 -0
- package/dist/cli.js +33 -6
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-UHYHSYCS.js.map +0 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/config/defaults.ts","../src/config/workspace-config.ts","../src/db/connection.ts","../src/db/schema.ts","../src/db/migrations.ts","../package.json","../src/version.ts","../src/db/repositories.ts","../src/discovery/classify-repository.ts","../src/utils/diagnostics.ts","../src/indexer/repository-indexer.ts","../src/parsers/symbol-parser.ts","../src/utils/hashing.ts","../src/indexer/workspace-indexer.ts","../src/trace/selectors.ts","../src/output/table-output.ts","../src/output/json-output.ts","../src/output/mermaid-output.ts"],"sourcesContent":["import { Command } from 'commander';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport pc from 'picocolors';\nimport { DEFAULT_IGNORES } from './config/defaults.js';\nimport {\n createWorkspaceConfig,\n loadWorkspaceConfig,\n saveWorkspaceConfig,\n} from './config/workspace-config.js';\nimport { openDatabase, openReadOnlyDatabase } from './db/connection.js';\nimport {\n getWorkspace,\n listRepositories,\n repoByName,\n upsertRepository,\n upsertWorkspace,\n} from './db/repositories.js';\nimport { discoverRepositories } from './discovery/discover-repositories.js';\nimport { parsePackageJson } from './parsers/package-json-parser.js';\nimport { classifyRepository } from './discovery/classify-repository.js';\nimport { indexWorkspace } from './indexer/workspace-indexer.js';\nimport { linkWorkspace } from './linker/cross-repo-linker.js';\nimport { normalizeODataOperationInvocationPath } from './linker/odata-path-normalizer.js';\nimport { trace } from './trace/trace-engine.js';\nimport { parseVars } from './trace/selectors.js';\nimport { renderTraceTable } from './output/table-output.js';\nimport { renderTraceJson, renderJson } from './output/json-output.js';\nimport { renderMermaid } from './output/mermaid-output.js';\nimport { VERSION } from './version.js';\nasync function init(\n workspace: string,\n options: { db?: string; ignore?: string[] },\n): Promise<void> {\n const config = createWorkspaceConfig(\n workspace,\n options.db,\n options.ignore?.length ? options.ignore : [...DEFAULT_IGNORES],\n );\n const repos = await discoverRepositories(config.rootPath, config.ignore);\n await saveWorkspaceConfig(config);\n const db = openDatabase(config.dbPath);\n const workspaceId = upsertWorkspace(db, config.rootPath, config.dbPath);\n for (const repo of repos) {\n const pkg = await parsePackageJson(repo.absolutePath);\n const kind = await classifyRepository(repo.absolutePath, pkg);\n upsertRepository(db, workspaceId, {\n ...repo,\n packageName: pkg.packageName,\n packageVersion: pkg.packageVersion,\n dependencies: pkg.dependencies,\n kind,\n });\n }\n db.close();\n process.stdout.write(\n `Workspace: ${config.rootPath}\\nDatabase: ${config.dbPath}\\nRepositories: ${repos.length}\\nIgnored: ${config.ignore.join(', ')}\\nNext: service-flow index --workspace ${config.rootPath}\\n`,\n );\n}\nasync function withWorkspace<T>(\n workspace: string | undefined,\n fn: (\n db: ReturnType<typeof openDatabase>,\n workspaceId: number,\n rootPath: string,\n ) => Promise<T> | T,\n): Promise<T> {\n const config = await loadWorkspaceConfig(workspace);\n const db = openDatabase(config.dbPath);\n try {\n const row = getWorkspace(db, config.rootPath);\n const workspaceId =\n row?.id ?? upsertWorkspace(db, config.rootPath, config.dbPath);\n return await fn(db, workspaceId, config.rootPath);\n } finally {\n db.close();\n }\n}\nasync function withReadOnlyWorkspace<T>(\n workspace: string | undefined,\n fn: (db: ReturnType<typeof openDatabase>, workspaceId: number, rootPath: string) => Promise<T> | T,\n): Promise<T> {\n const config = await loadWorkspaceConfig(workspace);\n const db = openReadOnlyDatabase(config.dbPath);\n try {\n const row = getWorkspace(db, config.rootPath);\n if (!row) throw new Error(`Workspace is not initialized in ${config.dbPath}`);\n return await fn(db, row.id, config.rootPath);\n } finally {\n db.close();\n }\n}\nfunction localServiceDiagnostics(db: ReturnType<typeof openDatabase>, strict: boolean): Array<Record<string, unknown>> {\n const rows = db.prepare(`SELECT e.status status,e.unresolved_reason reason,e.evidence_json evidenceJson FROM graph_edges e JOIN outbound_calls c ON e.from_kind='call' AND c.id=CAST(e.from_id AS INTEGER) WHERE c.call_type='local_service_call'`).all() as Array<{ status?: string; reason?: string | null; evidenceJson?: string }>;\n const implementationContext = rows.filter((row) => row.status === 'resolved' && String(row.evidenceJson ?? '').includes('implementation_context_caller_ownership')).length;\n const withoutOwnership = rows.filter((row) => row.reason === 'local_service_candidate_without_caller_ownership' || String(row.evidenceJson ?? '').includes('local_service_candidate_without_caller_ownership')).length;\n const unresolved = rows.filter((row) => row.status === 'unresolved').length;\n const outsideScope = rows.filter((row) => {\n if (row.status !== 'unresolved') return false;\n try {\n const evidence = JSON.parse(String(row.evidenceJson ?? '{}')) as { candidateCount?: unknown };\n return Number(evidence.candidateCount ?? 0) > 0;\n } catch {\n return false;\n }\n }).length;\n const out: Array<Record<string, unknown>> = [];\n if (withoutOwnership > 0) out.push({ severity: 'warning', code: 'local_service_candidate_without_caller_ownership', message: `Local service calls have operation candidates but no caller ownership evidence: ${withoutOwnership}` });\n if (outsideScope > 0) out.push({ severity: 'warning', code: 'local_service_candidates_outside_local_scope', message: `Local service calls found candidates outside same-repository scope: ${outsideScope}` });\n if (strict && unresolved > 0) out.push({ severity: 'warning', code: 'local_service_calls_unresolved', message: `Unresolved local service calls: ${unresolved}` });\n if (strict && implementationContext > 0) out.push({ severity: 'info', code: 'local_service_calls_resolved_by_implementation_context', message: `Local service calls resolved by implementation-context ownership: ${implementationContext}` });\n return out;\n}\n\nfunction parserQualityDiagnostics(db: ReturnType<typeof openDatabase>, strict: boolean): Array<Record<string, unknown>> {\n if (!strict) return [];\n const symbolUnresolvedThreshold = 0.05;\n const dbUnknownThreshold = 0.25;\n const outboundUnownedThreshold = 0.01;\n const symbol = db.prepare(\"SELECT COUNT(*) total, SUM(CASE WHEN status='resolved' THEN 1 ELSE 0 END) resolved, SUM(CASE WHEN status='unresolved' THEN 1 ELSE 0 END) unresolved FROM symbol_calls\").get() as { total?: number; resolved?: number; unresolved?: number };\n const top = db.prepare(\"SELECT callee_expression calleeExpression,COUNT(*) count FROM symbol_calls WHERE status='unresolved' GROUP BY callee_expression ORDER BY count DESC,callee_expression LIMIT 5\").all() as Array<Record<string, unknown>>;\n const evidence = db.prepare(\"SELECT COUNT(*) total, SUM(CASE WHEN json_valid(evidence_json)=0 OR json_type(evidence_json) <> 'object' THEN 1 ELSE 0 END) nonObject FROM symbol_calls\").get() as { total?: number; nonObject?: number };\n const dbq = db.prepare(\"SELECT COUNT(*) total, SUM(CASE WHEN query_entity IS NOT NULL THEN 1 ELSE 0 END) known, SUM(CASE WHEN query_entity IS NULL THEN 1 ELSE 0 END) unknown FROM outbound_calls WHERE call_type='local_db_query'\").get() as { total?: number; known?: number; unknown?: number };\n const outbound = db.prepare(\"SELECT COUNT(*) total, SUM(CASE WHEN source_symbol_id IS NULL THEN 1 ELSE 0 END) withoutOwnership FROM outbound_calls\").get() as { total?: number; withoutOwnership?: number };\n const outboundEvidence = db.prepare(\"SELECT COUNT(*) total, SUM(CASE WHEN evidence_json IS NULL THEN 1 ELSE 0 END) missing, SUM(CASE WHEN evidence_json IS NOT NULL AND json_valid(evidence_json)=0 THEN 1 ELSE 0 END) invalid, SUM(CASE WHEN evidence_json IS NOT NULL AND json_valid(evidence_json)=1 AND json_type(evidence_json) <> 'object' THEN 1 ELSE 0 END) nonObject FROM outbound_calls\").get() as { total?: number; missing?: number; invalid?: number; nonObject?: number };\n const outboundEvidenceExamples = db.prepare(\"SELECT call_type callType, source_file sourceFile, source_line sourceLine FROM outbound_calls WHERE evidence_json IS NULL OR json_valid(evidence_json)=0 OR json_type(evidence_json) <> 'object' ORDER BY source_file, source_line LIMIT 10\").all() as Array<Record<string, unknown>>;\n const graphEvidence = db.prepare(\"SELECT COUNT(*) total, SUM(CASE WHEN e.evidence_json IS NULL OR json_valid(e.evidence_json)=0 OR json_type(e.evidence_json) <> 'object' THEN 1 ELSE 0 END) nonObject, SUM(CASE WHEN e.evidence_json IS NOT NULL AND json_valid(e.evidence_json)=1 AND json_extract(e.evidence_json,'$.outboundEvidence.parser') IS NOT NULL THEN 1 ELSE 0 END) withOutboundEvidence FROM graph_edges e WHERE e.from_kind='call'\").get() as { total?: number; nonObject?: number; withOutboundEvidence?: number };\n const graphEvidenceExamples = db.prepare(\"SELECT c.call_type callType,c.source_file sourceFile,c.source_line sourceLine,e.edge_type edgeType FROM graph_edges e JOIN outbound_calls c ON e.from_kind='call' AND c.id=CAST(e.from_id AS INTEGER) WHERE e.evidence_json IS NULL OR json_valid(e.evidence_json)=0 OR json_type(e.evidence_json) <> 'object' OR json_extract(e.evidence_json,'$.outboundEvidence.parser') IS NULL ORDER BY c.source_file,c.source_line LIMIT 10\").all() as Array<Record<string, unknown>>;\n const eventReceiver = db.prepare(\"SELECT COUNT(*) total, SUM(CASE WHEN call_type IN ('async_emit','async_subscribe') THEN 1 ELSE 0 END) eventTotal, SUM(CASE WHEN call_type IN ('async_emit','async_subscribe') AND (json_extract(evidence_json,'$.receiverClassification') IS NULL OR json_extract(evidence_json,'$.receiverClassification') <> 'cap_evidence') THEN 1 ELSE 0 END) questionable FROM outbound_calls\").get() as { total?: number; eventTotal?: number; questionable?: number };\n const dynamicTerminal = db.prepare(\"SELECT COUNT(*) count FROM graph_edges WHERE status='terminal' AND is_dynamic=1\").get() as { count?: number };\n const ownerlessByType = db.prepare(\"SELECT call_type callType, COUNT(*) count FROM outbound_calls WHERE source_symbol_id IS NULL GROUP BY call_type ORDER BY count DESC, call_type\").all() as Array<Record<string, unknown>>;\n const ownerlessByCategory = db.prepare(`SELECT CASE\n WHEN COALESCE(evidence_json,'') LIKE '%comment_or_non_executable_source%' THEN 'comment_or_non_executable_source'\n WHEN call_type='async_subscribe' AND COALESCE(evidence_json,'') LIKE '%cap_service_event_subscription%' THEN 'top_level_event_registration'\n WHEN call_type='async_subscribe' THEN 'generic_event_listener_ignored_or_unowned'\n WHEN EXISTS (SELECT 1 FROM symbols s WHERE s.repo_id=outbound_calls.repo_id AND s.source_file=outbound_calls.source_file) THEN 'line_range_mismatch'\n WHEN source_line <= 1 THEN 'unsupported_function_shape'\n WHEN source_line > 1 THEN 'unsupported_callback_shape'\n ELSE 'unknown' END category, COUNT(*) count\n FROM outbound_calls WHERE source_symbol_id IS NULL GROUP BY category ORDER BY count DESC, category`).all() as Array<Record<string, unknown>>;\n const ownerlessExamples = db.prepare(`SELECT CASE\n WHEN COALESCE(evidence_json,'') LIKE '%comment_or_non_executable_source%' THEN 'comment_or_non_executable_source'\n WHEN call_type='async_subscribe' AND COALESCE(evidence_json,'') LIKE '%cap_service_event_subscription%' THEN 'top_level_event_registration'\n WHEN call_type='async_subscribe' THEN 'generic_event_listener_ignored_or_unowned'\n WHEN EXISTS (SELECT 1 FROM symbols s WHERE s.repo_id=outbound_calls.repo_id AND s.source_file=outbound_calls.source_file) THEN 'line_range_mismatch'\n WHEN source_line <= 1 THEN 'unsupported_function_shape'\n WHEN source_line > 1 THEN 'unsupported_callback_shape'\n ELSE 'unknown' END category, call_type callType, source_file sourceFile, source_line sourceLine, unresolved_reason unresolvedReason\n FROM outbound_calls WHERE source_symbol_id IS NULL ORDER BY category, source_file, source_line LIMIT 10`).all() as Array<Record<string, unknown>>;\n const symbolTotal = Number(symbol.total ?? 0);\n const symbolUnresolved = Number(symbol.unresolved ?? 0);\n const symbolUnresolvedRatio = symbolTotal === 0 ? 0 : Number((symbolUnresolved / symbolTotal).toFixed(4));\n const queryTotal = Number(dbq.total ?? 0);\n const queryUnknown = Number(dbq.unknown ?? 0);\n const queryUnknownRatio = queryTotal === 0 ? 0 : Number((queryUnknown / queryTotal).toFixed(4));\n const outboundTotal = Number(outbound.total ?? 0);\n const outboundWithoutOwnership = Number(outbound.withoutOwnership ?? 0);\n const outboundWithoutOwnershipRatio = outboundTotal === 0 ? 0 : Number((outboundWithoutOwnership / outboundTotal).toFixed(4));\n const remoteQuery = remoteQueryTargetQuality(db);\n const invocation = odataInvocationResolutionQuality(db);\n const remoteAction = remoteActionTargetQuality(db);\n const aliasQuality = identityAliasBindingQuality(db);\n const noBindingQuality = remoteActionNoBindingQuality(db);\n const contextualQuality = contextualImplementationQuality(db);\n const classInstanceQuality = classInstanceNoiseQuality(db);\n const bindingPropagationQuality = contextualBindingPropagationQuality(db);\n const wrapperQuality = wrapperPathPropagationQuality(db);\n const nestedThisQuality = nestedThisReceiverQuality(db);\n return [\n aliasQuality,\n noBindingQuality,\n contextualQuality,\n classInstanceQuality,\n bindingPropagationQuality,\n wrapperQuality,\n nestedThisQuality,\n remoteQuery,\n invocation,\n remoteAction,\n { severity: Number(evidence.nonObject ?? 0) > 0 ? 'warning' : 'info', code: 'strict_symbol_call_evidence_quality', message: 'Symbol-call evidence JSON object aggregate', total: Number(evidence.total ?? 0), nonObject: Number(evidence.nonObject ?? 0) },\n { severity: Number(outboundEvidence.missing ?? 0) + Number(outboundEvidence.invalid ?? 0) + Number(outboundEvidence.nonObject ?? 0) > 0 ? 'warning' : 'info', code: 'strict_outbound_evidence_quality', message: 'Outbound parser evidence JSON object aggregate', total: Number(outboundEvidence.total ?? 0), missing: Number(outboundEvidence.missing ?? 0), invalid: Number(outboundEvidence.invalid ?? 0), nonObject: Number(outboundEvidence.nonObject ?? 0), examples: outboundEvidenceExamples },\n { severity: Number(graphEvidence.nonObject ?? 0) > 0 || Number(graphEvidence.withOutboundEvidence ?? 0) < Number(graphEvidence.total ?? 0) ? 'warning' : 'info', code: 'strict_graph_evidence_quality', message: 'Call-derived graph evidence and parser-evidence propagation aggregate', total: Number(graphEvidence.total ?? 0), nonObject: Number(graphEvidence.nonObject ?? 0), withOutboundEvidence: Number(graphEvidence.withOutboundEvidence ?? 0), examples: graphEvidenceExamples },\n { severity: Number(eventReceiver.questionable ?? 0) > 0 ? 'warning' : 'info', code: 'strict_event_receiver_classification_quality', message: 'CAP event receiver classification aggregate', eventTotal: Number(eventReceiver.eventTotal ?? 0), questionable: Number(eventReceiver.questionable ?? 0) },\n { severity: Number(dynamicTerminal.count ?? 0) > 0 ? 'warning' : 'info', code: 'strict_graph_dynamic_flag_consistency', message: 'Graph dynamic flag consistency aggregate', dynamicTerminalEdges: Number(dynamicTerminal.count ?? 0) },\n { severity: symbolUnresolvedRatio > symbolUnresolvedThreshold ? 'warning' : 'info', code: 'strict_symbol_call_quality', message: 'Symbol-call quality aggregate', total: symbolTotal, resolved: Number(symbol.resolved ?? 0), unresolved: symbolUnresolved, unresolvedRatio: symbolUnresolvedRatio, unresolvedRatioThreshold: symbolUnresolvedThreshold, topUnresolvedCallees: top },\n { severity: queryUnknownRatio > dbUnknownThreshold ? 'warning' : 'info', code: 'strict_db_query_quality', message: 'Local DB query quality aggregate', total: queryTotal, known: Number(dbq.known ?? 0), unknown: queryUnknown, unknownRatio: queryUnknownRatio, unknownRatioThreshold: dbUnknownThreshold },\n { severity: outboundWithoutOwnershipRatio > outboundUnownedThreshold ? 'warning' : 'info', code: 'strict_outbound_source_ownership_quality', message: 'Outbound call source-symbol ownership aggregate', total: outboundTotal, withoutOwnership: outboundWithoutOwnership, withoutOwnershipRatio: outboundWithoutOwnershipRatio, withoutOwnershipRatioThreshold: outboundUnownedThreshold, ownerlessByType, ownerlessByCategory, ownerlessExamples },\n ];\n}\n\n\nfunction identityAliasBindingQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const examples = db.prepare(`SELECT c.source_file sourceFile,c.source_line sourceLine,c.service_binding_id serviceBindingId,json_extract(c.evidence_json,'$.receiver') receiverName,b.variable_name aliasSourceVariable,'same-file identifier alias still lacks a binding id' parserReason\n FROM outbound_calls c JOIN service_bindings b ON b.repo_id=c.repo_id AND b.source_file=c.source_file\n WHERE c.call_type='remote_action' AND c.service_binding_id IS NULL AND json_extract(c.evidence_json,'$.receiver') IS NOT NULL\n AND c.evidence_json LIKE '%' || '\"aliasOf\":\"' || json_extract(c.evidence_json,'$.receiver') || '\"' || '%'\n ORDER BY c.source_file,c.source_line LIMIT 5`).all() as Array<Record<string, unknown>>;\n return { severity: examples.length > 0 ? 'warning' : 'info', code: 'strict_identity_alias_binding_quality', message: 'Remote sends that look like missed same-file identity aliases', missedAliasBindingCalls: examples.length, examples };\n}\n\nfunction remoteActionNoBindingQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const categoryCase = `CASE\n WHEN c.unresolved_reason='dynamic_operation_path_identifier' THEN 'dynamic_path_identifier'\n WHEN json_extract(c.evidence_json,'$.classifier')='higher_order_wrapper_literal_path' OR json_extract(c.evidence_json,'$.operationPathExpression') IS NOT NULL THEN 'likely_higher_order_wrapper_path_needed'\n WHEN json_extract(c.evidence_json,'$.receiver') LIKE '%.%' THEN 'likely_parameter_context_needed'\n WHEN EXISTS (\n SELECT 1 FROM symbol_calls sc\n JOIN symbols caller ON caller.id=sc.caller_symbol_id\n JOIN symbols callee ON callee.id=sc.callee_symbol_id\n WHERE sc.status='resolved'\n AND sc.source_file=c.source_file\n AND caller.id=c.source_symbol_id\n AND json_extract(sc.evidence_json,'$.relation')='class_instance_method'\n AND (callee.evidence_json IS NULL OR json_extract(callee.evidence_json,'$.parameterBindings') IS NULL)\n ) THEN 'likely_instance_method_parameter_metadata_needed'\n WHEN EXISTS (SELECT 1 FROM service_bindings b WHERE b.repo_id=c.repo_id AND b.source_file=c.source_file AND ABS(b.source_line-c.source_line) < 50) THEN 'likely_missing_assignment_binding'\n WHEN e.status='unresolved' AND COALESCE(e.unresolved_reason,'') LIKE '%No indexed target operation%' THEN 'no_indexed_target_operation'\n WHEN c.operation_path_expr IS NOT NULL AND (c.operation_path_expr LIKE '/%' OR c.operation_path_expr NOT LIKE '%/%') THEN 'operation_path_only_no_static_service_signal'\n ELSE 'external_or_entity_path_not_action' END`;\n const rows = db.prepare(`SELECT ${categoryCase} category,COALESCE(e.status,'missing_edge') status,COUNT(*) count\n FROM outbound_calls c LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n WHERE c.call_type='remote_action' AND c.operation_path_expr IS NOT NULL AND c.service_binding_id IS NULL\n GROUP BY category,status ORDER BY count DESC,category,status`).all() as Array<Record<string, unknown>>;\n const examples = db.prepare(`SELECT c.source_file sourceFile,c.source_line sourceLine,json_extract(c.evidence_json,'$.receiver') receiverName,c.operation_path_expr operationPath,COALESCE(e.status,'missing_edge') status,${categoryCase} category\n FROM outbound_calls c LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n WHERE c.call_type='remote_action' AND c.operation_path_expr IS NOT NULL AND c.service_binding_id IS NULL ORDER BY c.source_file,c.source_line LIMIT 8`).all() as Array<Record<string, unknown>>;\n const total = rows.reduce((sum, row) => sum + Number(row.count ?? 0), 0);\n return { severity: total > 0 ? 'warning' : 'info', code: 'strict_remote_action_no_binding_quality', message: 'Remote actions with operation paths but no service binding id', total, breakdown: rows, examples };\n}\n\nfunction classInstanceNoiseQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const builtIns = ['Set', 'Map', 'WeakSet', 'WeakMap', 'Date', 'RegExp', 'URL', 'URLSearchParams', 'Error', 'EvalError', 'RangeError', 'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'AggregateError', 'ArrayBuffer', 'SharedArrayBuffer', 'DataView', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'BigInt64Array', 'BigUint64Array', 'Promise', 'AbortController'];\n const placeholders = builtIns.map(() => '?').join(',');\n const aggregate = db.prepare(`SELECT COUNT(*) total,\n SUM(CASE WHEN status='unresolved' THEN 1 ELSE 0 END) unresolved,\n SUM(CASE WHEN status='unresolved' AND json_extract(evidence_json,'$.className') IN (${placeholders}) THEN 1 ELSE 0 END) unresolvedBuiltIn\n FROM symbol_calls WHERE json_extract(evidence_json,'$.relation')='class_instance_method'`).get(...builtIns) as { total?: number; unresolved?: number; unresolvedBuiltIn?: number };\n const byConstructor = db.prepare(`SELECT json_extract(evidence_json,'$.className') constructorName,COUNT(*) unresolvedCount\n FROM symbol_calls WHERE status='unresolved' AND json_extract(evidence_json,'$.relation')='class_instance_method'\n GROUP BY constructorName ORDER BY unresolvedCount DESC,constructorName LIMIT 10`).all() as Array<Record<string, unknown>>;\n return { severity: Number(aggregate.unresolvedBuiltIn ?? 0) > 0 ? 'warning' : 'info', code: 'strict_class_instance_noise_quality', message: 'Class-instance symbol-call aggregate with built-in constructor guard', totalClassInstanceCalls: Number(aggregate.total ?? 0), unresolvedClassInstanceCalls: Number(aggregate.unresolved ?? 0), unresolvedBuiltInClassInstanceCalls: Number(aggregate.unresolvedBuiltIn ?? 0), unresolvedByConstructor: byConstructor };\n}\n\nfunction contextualBindingPropagationQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const serviceClientCalls = db.prepare(`SELECT COUNT(*) count FROM symbol_calls sc\n WHERE json_extract(sc.evidence_json,'$.callArguments[0].kind') IN ('identifier','object_literal')`).get() as { count?: number };\n const missingMetadata = db.prepare(`SELECT COUNT(*) count FROM symbol_calls sc JOIN symbols s ON s.id=sc.callee_symbol_id\n WHERE sc.status='resolved' AND json_extract(sc.evidence_json,'$.callArguments[0].kind') IN ('identifier','object_literal')\n AND (s.evidence_json IS NULL OR json_extract(s.evidence_json,'$.parameterBindings') IS NULL)`).get() as { count?: number };\n const destructuredUnmapped = db.prepare(`SELECT COUNT(*) count FROM symbol_calls sc JOIN symbols s ON s.id=sc.callee_symbol_id\n WHERE json_extract(sc.evidence_json,'$.callArguments[0].kind')='object_literal'\n AND json_extract(s.evidence_json,'$.parameterBindings[0].kind')='object_pattern'\n AND json_array_length(json_extract(sc.evidence_json,'$.callArguments[0].properties')) > json_array_length(json_extract(s.evidence_json,'$.parameterBindings[0].properties'))`).get() as { count?: number };\n const opportunities = db.prepare(`SELECT c.source_file sourceFile,c.source_line sourceLine,json_extract(c.evidence_json,'$.receiver') receiverName,c.operation_path_expr operationPath,b.alias bindingAlias,b.alias_expr bindingAliasExpr,b.service_path_expr servicePathExpr,b.destination_expr destinationExpr,req.service_path requireServicePath,req.destination requireDestination,COALESCE(e.status,'missing_edge') persistedStatus,\n CASE\n WHEN (b.alias_expr LIKE '%$%' OR b.service_path_expr LIKE '%$%' OR b.destination_expr LIKE '%$%') THEN 'runtime_variables_required'\n WHEN b.alias IS NOT NULL AND req.id IS NULL AND b.service_path_expr IS NULL THEN 'alias_without_matching_cds_requires'\n WHEN req.id IS NOT NULL AND COALESCE(e.status,'missing_edge')!='resolved' THEN 'cds_requires_present_but_persisted_resolution_unresolved'\n ELSE 'trace_time_contextual_binding_candidate'\n END contextualStatus\n FROM outbound_calls c\n LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n LEFT JOIN service_bindings b ON b.id=c.service_binding_id\n LEFT JOIN cds_requires req ON req.repo_id=c.repo_id AND req.alias=b.alias\n WHERE c.call_type='remote_action' AND json_extract(c.evidence_json,'$.receiver') IS NOT NULL\n AND (c.service_binding_id IS NULL OR e.status IS NULL OR e.status!='resolved')\n AND EXISTS (SELECT 1 FROM symbol_calls sc WHERE sc.status='resolved' AND sc.source_file=c.source_file)\n ORDER BY c.source_file,c.source_line LIMIT 8`).all() as Array<Record<string, unknown>>;\n const statusRows = db.prepare(`SELECT contextualStatus,COUNT(*) count FROM (\n SELECT CASE\n WHEN (b.alias_expr LIKE '%$%' OR b.service_path_expr LIKE '%$%' OR b.destination_expr LIKE '%$%') THEN 'runtime_variables_required'\n WHEN b.alias IS NOT NULL AND req.id IS NULL AND b.service_path_expr IS NULL THEN 'alias_without_matching_cds_requires'\n WHEN req.id IS NOT NULL AND COALESCE(e.status,'missing_edge')!='resolved' THEN 'cds_requires_present_but_persisted_resolution_unresolved'\n ELSE 'trace_time_contextual_binding_candidate'\n END contextualStatus\n FROM outbound_calls c\n LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n LEFT JOIN service_bindings b ON b.id=c.service_binding_id\n LEFT JOIN cds_requires req ON req.repo_id=c.repo_id AND req.alias=b.alias\n WHERE c.call_type='remote_action' AND json_extract(c.evidence_json,'$.receiver') IS NOT NULL\n AND (c.service_binding_id IS NULL OR e.status IS NULL OR e.status!='resolved')\n AND EXISTS (SELECT 1 FROM symbol_calls sc WHERE sc.status='resolved' AND sc.source_file=c.source_file)\n ) GROUP BY contextualStatus ORDER BY count DESC,contextualStatus`).all() as Array<Record<string, unknown>>;\n const resolvedContextual = db.prepare(`SELECT COUNT(*) count FROM outbound_calls c JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT) WHERE c.call_type='remote_action' AND e.status='resolved' AND c.service_binding_id IS NOT NULL`).get() as { count?: number };\n const totalOpportunities = statusRows.reduce((sum, row) => sum + Number(row.count ?? 0), 0);\n const actionableStatuses = new Set(['alias_without_matching_cds_requires', 'cds_requires_present_but_persisted_resolution_unresolved', 'trace_time_contextual_binding_candidate']);\n const actionableOpportunityCount = statusRows.reduce((sum, row) => actionableStatuses.has(String(row.contextualStatus)) ? sum + Number(row.count ?? 0) : sum, 0);\n const severity = Number(missingMetadata.count ?? 0) + Number(destructuredUnmapped.count ?? 0) + actionableOpportunityCount > 0 ? 'warning' : 'info';\n return { severity, code: 'strict_contextual_binding_propagation_quality', message: 'Contextual service-client propagation opportunities for trace-time helper resolution', localSymbolCallsWithServiceClientArguments: Number(serviceClientCalls.count ?? 0), calleeSymbolsMissingParameterMetadata: Number(missingMetadata.count ?? 0), destructuredObjectParametersPossiblyUnmapped: Number(destructuredUnmapped.count ?? 0), contextualHelperSendsResolvedDuringPersistedLink: Number(resolvedContextual.count ?? 0), traceTimeContextualOpportunities: totalOpportunities, traceTimeContextualOpportunityBreakdown: statusRows.length > 0 ? statusRows : [{ contextualStatus: 'no_contextual_opportunity', count: 0 }], exampleCount: opportunities.length, examples: opportunities };\n}\n\nfunction nestedThisReceiverQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const aggregate = db.prepare(`SELECT COUNT(*) total,\n SUM(CASE WHEN json_extract(evidence_json,'$.relation')='indexed_this_method' THEN 1 ELSE 0 END) resolvedToCurrentClass,\n SUM(CASE WHEN json_extract(evidence_json,'$.relation')='class_instance_method' THEN 1 ELSE 0 END) withExplicitHelperInstanceEvidence\n FROM symbol_calls WHERE callee_expression LIKE 'this.%.%'`).get() as { total?: number; resolvedToCurrentClass?: number; withExplicitHelperInstanceEvidence?: number };\n const examples = db.prepare(`SELECT source_file sourceFile,source_line sourceLine,callee_expression calleeExpression,json_extract(evidence_json,'$.relation') relation,json_extract(evidence_json,'$.targetName') targetName\n FROM symbol_calls WHERE callee_expression LIKE 'this.%.%' AND json_extract(evidence_json,'$.relation')='indexed_this_method'\n ORDER BY source_file,source_line LIMIT 8`).all() as Array<Record<string, unknown>>;\n return { severity: Number(aggregate.resolvedToCurrentClass ?? 0) > 0 ? 'warning' : 'info', code: 'strict_nested_this_receiver_quality', message: 'Nested this receiver symbol-call aggregate', nestedThisReceiverCallsConsidered: Number(aggregate.total ?? 0), nestedThisResolvedToCurrentClass: Number(aggregate.resolvedToCurrentClass ?? 0), nestedThisWithExplicitHelperInstanceEvidence: Number(aggregate.withExplicitHelperInstanceEvidence ?? 0), warningExamples: examples };\n}\n\nfunction contextualImplementationQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const rows = db.prepare(`SELECT status,COALESCE(unresolved_reason,status) reason,COUNT(*) count\n FROM graph_edges WHERE edge_type='OPERATION_IMPLEMENTED_BY_HANDLER' AND status IN ('ambiguous','unresolved') GROUP BY status,reason ORDER BY status,count DESC,reason`).all() as Array<Record<string, unknown>>;\n const examples = db.prepare(`SELECT json_extract(evidence_json,'$.servicePath') servicePath,json_extract(evidence_json,'$.operationPath') operationPath,status,unresolved_reason unresolvedReason,\n json_extract(evidence_json,'$.candidates[0].rejectedReasons[0]') topRejectedReason,\n json_extract(evidence_json,'$.candidates[0].acceptedReasons[0]') topAcceptedReason\n FROM graph_edges WHERE edge_type='OPERATION_IMPLEMENTED_BY_HANDLER' AND status IN ('ambiguous','unresolved') ORDER BY status,id LIMIT 6`).all() as Array<Record<string, unknown>>;\n const total = rows.reduce((sum, row) => sum + Number(row.count ?? 0), 0);\n return { severity: total > 0 ? 'warning' : 'info', code: 'strict_contextual_implementation_quality', message: 'Implementation hops stopped by ambiguous or unresolved implementation edges', total, breakdown: rows, examples };\n}\n\nfunction wrapperPathPropagationQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const examples = db.prepare(`SELECT source_file sourceFile,source_line sourceLine,json_extract(evidence_json,'$.receiver') receiverName,json_extract(evidence_json,'$.operationPathExpression') pathIdentifier,CASE WHEN json_extract(evidence_json,'$.literalCallerArgumentDetected') IS NOT NULL THEN 1 ELSE 0 END literalCallerArgumentDetected\n FROM outbound_calls WHERE call_type='remote_action' AND unresolved_reason='dynamic_operation_path_identifier' ORDER BY source_file,source_line LIMIT 5`).all() as Array<Record<string, unknown>>;\n const aggregate = db.prepare(\"SELECT COUNT(*) count FROM outbound_calls WHERE call_type='remote_action' AND unresolved_reason='dynamic_operation_path_identifier'\").get() as { count?: number };\n return { severity: Number(aggregate.count ?? 0) > 0 ? 'warning' : 'info', code: 'strict_wrapper_path_propagation_quality', message: 'Dynamic path sends where send({ path }) used a path identifier', dynamicPathIdentifierCalls: Number(aggregate.count ?? 0), examples };\n}\n\nfunction remoteQueryTargetQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const aggregate = db.prepare(`SELECT COUNT(*) total,\n SUM(CASE WHEN e.edge_type='HANDLER_RUNS_REMOTE_QUERY' AND e.status='terminal' THEN 1 ELSE 0 END) terminal,\n SUM(CASE WHEN e.edge_type='HANDLER_RUNS_REMOTE_QUERY' AND e.to_id GLOB '[0-9]*' THEN 1 ELSE 0 END) numericTargets,\n SUM(CASE WHEN e.edge_type='UNRESOLVED_EDGE' OR e.status='unresolved' THEN 1 ELSE 0 END) unresolved\n FROM outbound_calls c LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT) WHERE c.call_type='remote_query'`).get() as { total?: number; terminal?: number; numericTargets?: number; unresolved?: number };\n const examples = db.prepare(`SELECT c.source_file sourceFile,c.source_line sourceLine,c.query_entity queryEntity,e.edge_type edgeType,e.status status,e.to_id target\n FROM outbound_calls c LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n WHERE c.call_type='remote_query' AND (e.id IS NULL OR e.edge_type<>'HANDLER_RUNS_REMOTE_QUERY' OR e.status<>'terminal' OR e.to_id GLOB '[0-9]*')\n ORDER BY c.source_file,c.source_line LIMIT 5`).all() as Array<Record<string, unknown>>;\n const numericTargets = Number(aggregate.numericTargets ?? 0);\n const unresolved = Number(aggregate.unresolved ?? 0);\n return { severity: numericTargets + unresolved > 0 ? 'warning' : 'info', code: 'strict_remote_query_target_quality', message: 'Remote query terminal target quality aggregate', totalRemoteQueryCalls: Number(aggregate.total ?? 0), terminalRemoteQueryEdges: Number(aggregate.terminal ?? 0), numericTargetCount: numericTargets, unresolvedRemoteQueryCount: unresolved, examples };\n}\n\nfunction remoteActionTargetQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const aggregate = db.prepare(`SELECT COUNT(*) total,\n SUM(CASE WHEN e.status='unresolved' THEN 1 ELSE 0 END) unresolved,\n SUM(CASE WHEN e.status='unresolved' AND e.to_id GLOB '[0-9]*' THEN 1 ELSE 0 END) numericTargets,\n SUM(CASE WHEN e.status='unresolved' AND (e.to_id='Remote action: unknown path' OR e.to_id='Remote action: dynamic path') THEN 1 ELSE 0 END) semanticTargets\n FROM outbound_calls c LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT) WHERE c.call_type='remote_action'`).get() as { total?: number; unresolved?: number; numericTargets?: number; semanticTargets?: number };\n const examples = db.prepare(`SELECT c.source_file sourceFile,c.source_line sourceLine,c.operation_path_expr operationPath,e.status status,e.to_id target\n FROM outbound_calls c LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n WHERE c.call_type='remote_action' AND e.status='unresolved' AND e.to_id GLOB '[0-9]*' ORDER BY c.source_file,c.source_line LIMIT 5`).all() as Array<Record<string, unknown>>;\n const numericTargets = Number(aggregate.numericTargets ?? 0);\n return { severity: numericTargets > 0 ? 'warning' : 'info', code: 'strict_remote_action_target_quality', message: 'Remote action unresolved target quality aggregate', totalRemoteActionCalls: Number(aggregate.total ?? 0), unresolvedRemoteActionCalls: Number(aggregate.unresolved ?? 0), numericUnresolvedTargetCount: numericTargets, semanticUnknownOrDynamicTargetCount: Number(aggregate.semanticTargets ?? 0), examples };\n}\n\nfunction odataInvocationResolutionQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const aggregate = db.prepare(`SELECT COUNT(*) total,\n SUM(CASE WHEN e.status='resolved' THEN 1 ELSE 0 END) resolved,\n SUM(CASE WHEN e.status='dynamic' THEN 1 ELSE 0 END) dynamic,\n SUM(CASE WHEN e.status='ambiguous' THEN 1 ELSE 0 END) ambiguous,\n SUM(CASE WHEN e.status='unresolved' THEN 1 ELSE 0 END) unresolved\n FROM outbound_calls c JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n WHERE c.call_type='remote_action' AND c.operation_path_expr LIKE '%(%'`) .get() as { total?: number; resolved?: number; dynamic?: number; ambiguous?: number; unresolved?: number };\n const rows = db.prepare(`SELECT c.id id,c.operation_path_expr operationPathExpr,c.source_file sourceFile,c.source_line sourceLine,e.status status,e.unresolved_reason unresolvedReason\n FROM outbound_calls c JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n WHERE c.call_type='remote_action' AND e.status IN ('unresolved','ambiguous') AND c.operation_path_expr LIKE '%(%'\n ORDER BY c.source_file,c.source_line LIMIT 100`).all() as Array<{ id?: number; operationPathExpr?: string; sourceFile?: string; sourceLine?: number; status?: string; unresolvedReason?: string }>;\n const examples: Array<Record<string, unknown>> = [];\n let unresolvedMatchingIndexedOperation = 0;\n let ambiguousNormalizedCalls = 0;\n for (const row of rows) {\n const normalized = normalizeODataOperationInvocationPath(row.operationPathExpr);\n if (!normalized?.wasInvocation) continue;\n const normalizedName = normalized.normalizedOperationPath.replace(/^\\//, '');\n const simpleName = normalizedName.split('.').at(-1) ?? normalizedName;\n const candidates = db.prepare('SELECT s.service_path servicePath,o.operation_path operationPath,o.operation_name operationName FROM cds_operations o JOIN cds_services s ON s.id=o.service_id WHERE o.operation_path IN (?,?) OR o.operation_name IN (?,?) ORDER BY s.service_path,o.operation_name LIMIT 5').all(normalized.normalizedOperationPath, `/${simpleName}`, normalizedName, simpleName) as Array<Record<string, unknown>>;\n if (candidates.length === 0) continue;\n if (row.status === 'ambiguous') ambiguousNormalizedCalls += 1;\n if (row.status === 'unresolved') unresolvedMatchingIndexedOperation += 1;\n if (examples.length < 5) examples.push({ sourceFile: row.sourceFile, sourceLine: row.sourceLine, rawOperationPath: row.operationPathExpr, normalizedOperationPath: normalized.normalizedOperationPath, candidateCount: candidates.length, candidates });\n }\n return { severity: unresolvedMatchingIndexedOperation + ambiguousNormalizedCalls > 0 ? 'warning' : 'info', code: 'strict_odata_invocation_resolution_quality', message: 'OData invocation-path resolution quality aggregate', totalInvocationRemoteActions: Number(aggregate.total ?? 0), resolvedInvocationCalls: Number(aggregate.resolved ?? 0), dynamicInvocationCalls: Number(aggregate.dynamic ?? 0), ambiguousInvocationCalls: Number(aggregate.ambiguous ?? 0), unresolvedInvocationCalls: Number(aggregate.unresolved ?? 0), ambiguousNormalizedCalls, unresolvedNormalizedCallsWithIndexedCandidates: unresolvedMatchingIndexedOperation, examples };\n}\n\nexport function createProgram(): Command {\n const program = new Command();\n program\n .name('service-flow')\n .description(\n 'Trace SAP CAP service-to-service flows across multi-repository workspaces',\n )\n .version(VERSION);\n program\n .command('init')\n .argument('<workspace>')\n .option('--db <path>')\n .option('--ignore <pattern...>')\n .action(\n (workspace: string, opts: { db?: string; ignore?: string[] }) =>\n void init(workspace, opts).catch(fail),\n );\n program\n .command('index')\n .option('--workspace <path>')\n .option('--repo <name>')\n .option('--force')\n .action(\n (opts: { workspace?: string; repo?: string; force?: boolean }) =>\n void withWorkspace(opts.workspace, async (db, workspaceId) => {\n const r = await indexWorkspace(db, workspaceId, {\n repo: opts.repo,\n force: Boolean(opts.force),\n });\n process.stdout.write(\n `Indexed ${r.indexedCount} repositories, skipped ${r.skippedCount}, ${r.fileCount} files, ${r.diagnosticCount} diagnostics\\n`,\n );\n }).catch(fail),\n );\n program\n .command('link')\n .option('--workspace <path>')\n .option('--force')\n .action(\n (opts: { workspace?: string }) =>\n void withWorkspace(opts.workspace, (db, workspaceId) => {\n const r = linkWorkspace(db, workspaceId);\n process.stdout.write(\n `Linked ${r.edgeCount} edges: ${r.remoteResolvedCount} remote operation calls resolved, ${r.localResolvedCount} local operation calls resolved, ${r.unresolvedCount} unresolved operation calls, ${r.ambiguousCount} ambiguous operation calls, ${r.dynamicCount} dynamic operation calls, ${r.terminalCount} terminal call edges, ${r.dependencyResolvedCount} dependency resolved, ${r.dependencyAmbiguousCount} dependency ambiguous, ${r.implementationResolvedCount} implementation resolved, ${r.implementationAmbiguousCount} implementation ambiguous, ${r.implementationUnresolvedCount} implementation unresolved\\n`,\n );\n }).catch(fail),\n );\n program\n .command('trace')\n .option('--workspace <path>')\n .option('--repo <name>')\n .option('--operation <name>')\n .option('--service <path>')\n .option('--path <operationPath>')\n .option('--handler <name>')\n .option('--depth <n>', 'trace depth', '25')\n .option('--format <format>', 'table|json|mermaid', 'table')\n .option('--include-external')\n .option('--include-db')\n .option('--include-async')\n .option('--var <key=value>', 'dynamic variable', collect, [])\n .action(\n (opts: {\n workspace?: string;\n repo?: string;\n operation?: string;\n service?: string;\n path?: string;\n handler?: string;\n depth: string;\n format: string;\n includeExternal?: boolean;\n includeDb?: boolean;\n includeAsync?: boolean;\n var: string[];\n }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) => {\n const result = trace(\n db,\n {\n repo: opts.repo,\n servicePath: opts.service,\n operation: opts.operation,\n operationPath: opts.path,\n handler: opts.handler,\n },\n {\n depth: Number(opts.depth),\n vars: parseVars(opts.var),\n includeExternal: Boolean(opts.includeExternal),\n includeDb: Boolean(opts.includeDb),\n includeAsync: Boolean(opts.includeAsync),\n },\n );\n process.stdout.write(\n opts.format === 'json'\n ? renderTraceJson(result)\n : opts.format === 'mermaid'\n ? renderMermaid(result)\n : renderTraceTable(result),\n );\n }).catch(fail),\n );\n const list = program.command('list');\n list\n .command('repos')\n .option('--workspace <path>')\n .action(\n (opts: { workspace?: string }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) =>\n process.stdout.write(\n renderJson(\n listRepositories(db).map((r) => ({\n name: r.name,\n kind: r.kind,\n packageName: r.package_name,\n })),\n ),\n ),\n ).catch(fail),\n );\n list\n .command('services')\n .option('--workspace <path>')\n .option('--repo <name>')\n .action(\n (opts: { workspace?: string; repo?: string }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) => {\n const repo = opts.repo ? repoByName(db, opts.repo) : undefined;\n if (opts.repo && !repo) {\n process.stdout.write(renderJson([{ severity: 'warning', code: 'selector_repo_not_found', message: `Repository selector not found: ${opts.repo}` }]));\n return;\n }\n const rows = db\n .prepare(\n 'SELECT r.name repo,s.service_path servicePath,s.qualified_name qualifiedName FROM cds_services s JOIN repositories r ON r.id=s.repo_id WHERE (? IS NULL OR s.repo_id=?) ORDER BY r.name,s.service_path',\n )\n .all(repo?.id, repo?.id);\n process.stdout.write(renderJson(rows));\n }).catch(fail),\n );\n list\n .command('operations')\n .option('--workspace <path>')\n .option('--repo <name>')\n .option('--service <path>')\n .action(\n (opts: { workspace?: string; repo?: string; service?: string }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) => {\n const repo = opts.repo ? repoByName(db, opts.repo) : undefined;\n if (opts.repo && !repo) {\n process.stdout.write(renderJson([{ severity: 'warning', code: 'selector_repo_not_found', message: `Repository selector not found: ${opts.repo}` }]));\n return;\n }\n const rows = db\n .prepare(\n 'SELECT r.name repo,s.service_path servicePath,o.operation_name operation,o.operation_path path FROM cds_operations o JOIN cds_services s ON s.id=o.service_id JOIN repositories r ON r.id=s.repo_id WHERE (? IS NULL OR s.repo_id=?) AND (? IS NULL OR s.service_path=?)',\n )\n .all(repo?.id, repo?.id, opts.service, opts.service);\n process.stdout.write(renderJson(rows));\n }).catch(fail),\n );\n list\n .command('calls')\n .option('--workspace <path>')\n .option('--repo <name>')\n .option('--operation <name>')\n .action(\n (opts: { workspace?: string; repo?: string; operation?: string }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) => {\n const repo = opts.repo ? repoByName(db, opts.repo) : undefined;\n if (opts.repo && !repo) {\n process.stdout.write(renderJson([{ severity: 'warning', code: 'selector_repo_not_found', message: `Repository selector not found: ${opts.repo}` }]));\n return;\n }\n const rows = db\n .prepare(\n 'SELECT r.name repo,c.call_type type,c.operation_path_expr path,c.source_file file,c.source_line line FROM outbound_calls c JOIN repositories r ON r.id=c.repo_id WHERE (? IS NULL OR c.repo_id=?) AND (? IS NULL OR c.operation_path_expr=? OR c.operation_path_expr=? OR c.payload_summary LIKE ?)',\n )\n .all(\n repo?.id,\n repo?.id,\n opts.operation,\n opts.operation,\n opts.operation ? `/${opts.operation}` : undefined,\n opts.operation ? `%${opts.operation}%` : undefined,\n );\n process.stdout.write(renderJson(rows));\n }).catch(fail),\n );\n program\n .command('graph')\n .option('--workspace <path>')\n .option('--repo <name>')\n .option('--operation <name>')\n .option('--service <path>')\n .option('--path <operationPath>')\n .option('--format <format>', 'mermaid|json', 'mermaid')\n .option('--var <key=value>', 'dynamic variable', collect, [])\n .action(\n (opts: {\n workspace?: string;\n repo?: string;\n operation?: string;\n service?: string;\n path?: string;\n format: string;\n var: string[];\n }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) => {\n const result = trace(\n db,\n {\n repo: opts.repo,\n operation: opts.operation,\n servicePath: opts.service,\n operationPath: opts.path,\n },\n {\n depth: 100,\n includeAsync: true,\n includeDb: true,\n includeExternal: true,\n vars: parseVars(opts.var),\n },\n );\n process.stdout.write(\n opts.format === 'json'\n ? renderTraceJson(result)\n : renderMermaid(result),\n );\n }).catch(fail),\n );\n const inspect = program.command('inspect');\n inspect\n .command('repo')\n .argument('<name>')\n .option('--workspace <path>')\n .action(\n (name: string, opts: { workspace?: string }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) =>\n process.stdout.write(\n renderJson(repoByName(db, name) ?? { error: 'repo not found' }),\n ),\n ).catch(fail),\n );\n inspect\n .command('operation')\n .argument('<selector>')\n .option('--workspace <path>')\n .action(\n (selector: string, opts: { workspace?: string }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) => {\n const rows = db\n .prepare(\n 'SELECT * FROM cds_operations WHERE operation_name=? OR operation_path=?',\n )\n .all(selector, selector);\n process.stdout.write(renderJson(rows));\n }).catch(fail),\n );\n program\n .command('doctor')\n .option('--workspace <path>')\n .option('--strict')\n .action(\n (opts: { workspace?: string; strict?: boolean }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) => {\n const diagnostics = db\n .prepare(\n 'SELECT severity,code,message,source_file sourceFile,source_line sourceLine FROM diagnostics ORDER BY id',\n )\n .all() as Array<Record<string, unknown>>;\n const health = db\n .prepare(\n `SELECT 'info' severity,'entity_only_service' code,'CDS service has no action/function/event operations; this can be valid for entity-only services' message,s.source_file sourceFile,s.source_line sourceLine\n FROM cds_services s LEFT JOIN cds_operations o ON o.service_id=s.id WHERE o.id IS NULL AND ?\n UNION ALL\n SELECT 'warning','extend_service_unresolved_base','Extend service has no indexed local operations; verify base service resolution',s.source_file,s.source_line\n FROM cds_services s LEFT JOIN cds_operations o ON o.service_id=s.id WHERE o.id IS NULL AND s.is_extend=1 AND ?\n UNION ALL\n SELECT 'warning','handler_without_service','Repository has handlers but no CDS services',hc.source_file,hc.source_line\n FROM handler_classes hc JOIN repositories r ON r.id=hc.repo_id\n WHERE r.kind IN ('cap-service','mixed') AND NOT EXISTS (SELECT 1 FROM cds_services s WHERE s.repo_id=hc.repo_id)\n UNION ALL\n SELECT 'warning','search_index_empty','Search index is empty after indexing',NULL,NULL\n WHERE NOT EXISTS (SELECT 1 FROM search_index)\n UNION ALL\n SELECT 'error','foreign_key_violation','SQLite foreign_key_check reported integrity failures',NULL,NULL\n WHERE EXISTS (SELECT 1 FROM pragma_foreign_key_check)\n UNION ALL\n SELECT 'warning','legacy_schema_weaker_foreign_keys','Legacy table lacks fresh-schema foreign-key metadata; rebuild the database or re-run init/index in a new database',NULL,NULL\n WHERE (SELECT COUNT(*) FROM pragma_foreign_key_list('graph_edges'))=0 OR (SELECT COUNT(*) FROM pragma_foreign_key_list('index_runs'))=0 OR (SELECT COUNT(*) FROM pragma_foreign_key_list('diagnostics'))=0\n UNION ALL\n SELECT 'warning','implementation_candidates_rejected','Implementation candidates were rejected for ' || s.service_path || o.operation_path,o.source_file,o.source_line\n FROM graph_edges e\n JOIN cds_operations o ON o.id=CAST(e.from_id AS INTEGER)\n JOIN cds_services s ON s.id=o.service_id\n WHERE e.edge_type='OPERATION_IMPLEMENTED_BY_HANDLER' AND e.status='unresolved' AND (? OR EXISTS (SELECT 1 FROM graph_edges remote WHERE remote.edge_type='REMOTE_CALL_RESOLVES_TO_OPERATION' AND remote.to_kind='operation' AND remote.to_id=e.from_id))\n UNION ALL\n SELECT 'warning','remote_target_without_implementation','Remote target operation has no implementation edge: ' || s.service_path || o.operation_path,o.source_file,o.source_line\n FROM graph_edges remote\n JOIN cds_operations o ON o.id=CAST(remote.to_id AS INTEGER)\n JOIN cds_services s ON s.id=o.service_id\n WHERE remote.edge_type='REMOTE_CALL_RESOLVES_TO_OPERATION' AND remote.to_kind='operation' AND NOT EXISTS (SELECT 1 FROM graph_edges impl WHERE impl.edge_type='OPERATION_IMPLEMENTED_BY_HANDLER' AND impl.from_kind='operation' AND impl.from_id=remote.to_id) AND ?\n UNION ALL\n SELECT CASE WHEN ? THEN 'warning' ELSE 'error' END,'local_service_calls_all_unresolved','All local service calls are unresolved; verify local service alias parsing and linking',NULL,NULL\n WHERE EXISTS (SELECT 1 FROM outbound_calls WHERE call_type='local_service_call') AND NOT EXISTS (SELECT 1 FROM graph_edges e JOIN outbound_calls c ON e.from_kind='call' AND c.id=CAST(e.from_id AS INTEGER) WHERE c.call_type='local_service_call' AND e.status='resolved')\n UNION ALL\n SELECT 'error','local_service_accessor_misclassified','Entity accessor calls were indexed as /entities operations',source_file,source_line\n FROM outbound_calls WHERE call_type='local_service_call' AND operation_path_expr='/entities' AND (? OR 1)\n UNION ALL\n SELECT 'warning','outbound_calls_without_source_symbol','Outbound calls lack source symbol ownership: ' || COUNT(*),NULL,NULL\n FROM outbound_calls WHERE source_symbol_id IS NULL AND ? HAVING COUNT(*) >= 1\n UNION ALL\n SELECT 'warning','trace_scope_fell_back_to_file','Trace may fall back to source-file scope for calls without symbols',NULL,NULL\n WHERE EXISTS (SELECT 1 FROM outbound_calls WHERE source_symbol_id IS NULL) AND ?\n UNION ALL\n SELECT 'warning','graph_stale','Graph is stale after repository fact changes; run service-flow link',NULL,NULL\n WHERE EXISTS (SELECT 1 FROM repositories WHERE graph_stale_reason IS NOT NULL)\n UNION ALL\n SELECT 'warning','index_run_abandoned','Index run ' || id || ' started at ' || started_at || ' is still running after the 60 minute abandonment threshold',NULL,NULL\n FROM index_runs WHERE status='running' AND datetime(started_at) < datetime('now','-60 minutes')`,\n )\n .all(Boolean(opts.strict), Boolean(opts.strict), Boolean(opts.strict), Boolean(opts.strict), Boolean(opts.strict), Boolean(opts.strict), Boolean(opts.strict), Boolean(opts.strict)) as Array<Record<string, unknown>>;\n const localServiceHealth = localServiceDiagnostics(db, Boolean(opts.strict));\n const parserQualityHealth = parserQualityDiagnostics(db, Boolean(opts.strict));\n const allDiagnostics = [...diagnostics, ...health, ...localServiceHealth, ...parserQualityHealth];\n process.stdout.write(\n allDiagnostics.length\n ? renderJson(allDiagnostics)\n : `${pc.green('No diagnostics recorded')}\\n`,\n );\n }).catch(fail),\n );\n program\n .command('clean')\n .option('--workspace <path>')\n .option('--db-only')\n .action(\n (opts: { workspace?: string; dbOnly?: boolean }) =>\n void (async () => {\n const config = await loadWorkspaceConfig(opts.workspace);\n const dbDir = path.resolve(path.dirname(config.dbPath));\n const workspaceRoot = path.resolve(config.rootPath);\n await fs.rm(config.dbPath, { force: true });\n if (!opts.dbOnly) {\n const marker = path.join(dbDir, '.service-flow-state');\n const dangerous = new Set([\n path.parse(dbDir).root,\n '/tmp',\n process.env.HOME ? path.resolve(process.env.HOME) : '',\n workspaceRoot,\n ]);\n let ownsState: boolean;\n try {\n ownsState = (await fs.stat(marker)).isFile();\n } catch {\n ownsState = false;\n }\n if (!ownsState || dangerous.has(dbDir))\n throw new Error(\n `Refusing to recursively delete unowned or dangerous state directory: ${dbDir}. Use --db-only to remove only the database file.`,\n );\n await fs.rm(dbDir, { recursive: true, force: true });\n }\n process.stdout.write('Cleaned service-flow state\\n');\n })().catch(fail),\n );\n return program;\n}\nfunction collect(value: string, previous: string[]): string[] {\n previous.push(value);\n return previous;\n}\nfunction fail(error: unknown): void {\n process.stderr.write(\n `${error instanceof Error ? error.message : String(error)}\\n`,\n );\n process.exitCode = 1;\n}\ncreateProgram().parse(process.argv);\n","export const DEFAULT_IGNORES = [\n 'node_modules',\n 'gen',\n 'dist',\n 'coverage',\n '.git',\n '.turbo',\n '.next',\n '.cache',\n '.service-flow'\n] as const;\nexport const CONFIG_DIR = '.service-flow';\nexport const CONFIG_FILE = 'config.json';\nexport const DEFAULT_DB_FILE = 'service-flow.db';\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport {\n CONFIG_DIR,\n CONFIG_FILE,\n DEFAULT_DB_FILE,\n DEFAULT_IGNORES,\n} from './defaults.js';\nconst schema = z.object({\n rootPath: z.string(),\n dbPath: z.string(),\n ignore: z.array(z.string()),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\nexport type WorkspaceConfig = z.infer<typeof schema>;\nexport function configPath(rootPath: string): string {\n return path.join(rootPath, CONFIG_DIR, CONFIG_FILE);\n}\nexport function defaultDbPath(rootPath: string): string {\n return path.join(rootPath, CONFIG_DIR, DEFAULT_DB_FILE);\n}\nexport async function saveWorkspaceConfig(\n config: WorkspaceConfig,\n): Promise<void> {\n await fs.mkdir(path.dirname(configPath(config.rootPath)), {\n recursive: true,\n });\n await fs.writeFile(\n configPath(config.rootPath),\n `${JSON.stringify(config, null, 2)}\\n`,\n );\n if (path.dirname(config.dbPath) === path.dirname(configPath(config.rootPath)))\n await fs.writeFile(\n path.join(path.dirname(config.dbPath), '.service-flow-state'),\n 'service-flow\\n',\n );\n}\nexport async function loadWorkspaceConfig(\n workspace?: string,\n): Promise<WorkspaceConfig> {\n const root = path.resolve(workspace ?? process.cwd());\n const data = await fs.readFile(configPath(root), 'utf8');\n return schema.parse(JSON.parse(data) as unknown);\n}\nexport function createWorkspaceConfig(\n rootPath: string,\n dbPath?: string,\n ignore: string[] = [...DEFAULT_IGNORES],\n): WorkspaceConfig {\n const now = new Date().toISOString();\n const root = path.resolve(rootPath);\n return {\n rootPath: root,\n dbPath: path.resolve(dbPath ?? defaultDbPath(root)),\n ignore,\n createdAt: now,\n updatedAt: now,\n };\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { migrate } from './migrations.js';\nimport { VERSION } from '../version.js';\n\ntype SqlValue = string | number | bigint | Buffer | null | undefined;\ninterface NativeStatement {\n run: (...params: SqlValue[]) => { changes: number };\n get: (...params: SqlValue[]) => Record<string, unknown> | undefined;\n all: (...params: SqlValue[]) => Array<Record<string, unknown>>;\n}\ninterface NativeDatabase {\n exec: (sql: string) => void;\n prepare: (sql: string) => NativeStatement;\n close: () => void;\n}\ninterface NodeSqliteModule {\n DatabaseSync: new (location: string, options?: { open?: boolean; readOnly?: boolean }) => NativeDatabase;\n}\n\nlet sqliteWarningFilterInstalled = false;\nfunction installSqliteWarningFilter(): void {\n if (sqliteWarningFilterInstalled) return;\n sqliteWarningFilterInstalled = true;\n const original = process.emitWarning.bind(process);\n process.emitWarning = ((warning: string | Error, ...args: unknown[]): void => {\n const text = warning instanceof Error ? warning.message : String(warning);\n if (text.includes('SQLite is an experimental feature')) return;\n Reflect.apply(original, process, [warning, ...args]);\n }) as typeof process.emitWarning;\n}\nexport interface Statement {\n run: (...params: unknown[]) => { changes: number };\n get: (...params: unknown[]) => Record<string, unknown> | undefined;\n all: (...params: unknown[]) => Array<Record<string, unknown>>;\n}\nexport interface Db {\n path: string;\n readonly: boolean;\n exec: (sql: string) => void;\n prepare: (sql: string) => Statement;\n pragma: (sql: string) => Array<Record<string, unknown>>;\n transaction: <T>(fn: () => T) => T;\n close: () => void;\n}\nexport interface OpenDatabaseOptions {\n readonly?: boolean;\n migrate?: boolean;\n}\nfunction loadSqlite(): NodeSqliteModule {\n try {\n installSqliteWarningFilter();\n const moduleValue = process.getBuiltinModule('node:sqlite') as unknown;\n if (!moduleValue || typeof moduleValue !== 'object' || !('DatabaseSync' in moduleValue))\n throw new Error('node:sqlite DatabaseSync is unavailable');\n const sqlite = moduleValue as NodeSqliteModule;\n if (typeof sqlite.DatabaseSync !== 'function')\n throw new Error('node:sqlite DatabaseSync is not a constructor');\n return sqlite;\n } catch (error) {\n throw new Error(\n `service-flow ${VERSION} requires Node.js >=24 with node:sqlite DatabaseSync support. Upgrade Node.js or install a service-flow build with a compatible SQLite driver.`,\n { cause: error },\n );\n }\n}\nfunction bindParams(params: unknown[]): SqlValue[] {\n return params.map((param) => {\n if (param === undefined || param === null) return null;\n if (typeof param === 'string' || typeof param === 'number' || typeof param === 'bigint' || Buffer.isBuffer(param)) return param;\n if (typeof param === 'boolean') return param ? 1 : 0;\n return JSON.stringify(param);\n });\n}\nexport function openDatabase(dbPath: string, options: OpenDatabaseOptions = {}): Db {\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n const sqlite = loadSqlite();\n const native = new sqlite.DatabaseSync(dbPath, { readOnly: Boolean(options.readonly) });\n let inTransaction = false;\n const db: Db = {\n path: dbPath,\n readonly: Boolean(options.readonly),\n exec(sql: string): void {\n native.exec(sql);\n },\n prepare(sql: string): Statement {\n const statement = native.prepare(sql);\n return {\n run: (...params: unknown[]) => statement.run(...bindParams(params)),\n get: (...params: unknown[]) => statement.get(...bindParams(params)),\n all: (...params: unknown[]) => statement.all(...bindParams(params)),\n };\n },\n pragma(sql: string): Array<Record<string, unknown>> {\n const normalized = sql.trim().replace(/;$/, '');\n if (/=/.test(normalized)) {\n native.exec(`PRAGMA ${normalized}`);\n return [];\n }\n return native.prepare(`PRAGMA ${normalized}`).all();\n },\n transaction<T>(fn: () => T): T {\n if (inTransaction) return fn();\n inTransaction = true;\n native.exec('BEGIN IMMEDIATE');\n try {\n const result = fn();\n native.exec('COMMIT');\n return result;\n } catch (error) {\n native.exec('ROLLBACK');\n throw error;\n } finally {\n inTransaction = false;\n }\n },\n close(): void {\n native.close();\n },\n };\n db.pragma('busy_timeout = 10000');\n db.pragma('foreign_keys = ON');\n if (!options.readonly) {\n db.pragma('journal_mode = WAL');\n if (options.migrate !== false) migrate(db);\n }\n return db;\n}\nexport function openReadOnlyDatabase(dbPath: string): Db {\n return openDatabase(dbPath, { readonly: true, migrate: false });\n}\n","export const schemaSql = `\nCREATE TABLE IF NOT EXISTS workspaces (id INTEGER PRIMARY KEY, root_path TEXT UNIQUE NOT NULL, db_path TEXT NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL);\nCREATE TABLE IF NOT EXISTS repositories (id INTEGER PRIMARY KEY, workspace_id INTEGER NOT NULL, name TEXT NOT NULL, absolute_path TEXT NOT NULL, relative_path TEXT NOT NULL, package_name TEXT, package_version TEXT, dependencies_json TEXT DEFAULT '{}', kind TEXT NOT NULL, is_git_repo INTEGER NOT NULL, last_indexed_at TEXT, index_status TEXT DEFAULT 'pending', error_count INTEGER DEFAULT 0, fingerprint TEXT, fact_generation INTEGER NOT NULL DEFAULT 0, graph_generation INTEGER NOT NULL DEFAULT 0, graph_stale_reason TEXT, graph_stale_at TEXT, UNIQUE(workspace_id, absolute_path), FOREIGN KEY(workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS files (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, relative_path TEXT NOT NULL, extension TEXT NOT NULL, sha256 TEXT NOT NULL, size_bytes INTEGER NOT NULL, last_indexed_at TEXT NOT NULL, UNIQUE(repo_id, relative_path), FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS cds_requires (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, alias TEXT NOT NULL, kind TEXT, model TEXT, destination TEXT, service_path TEXT, request_timeout INTEGER, raw_json TEXT NOT NULL, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS cds_services (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, namespace TEXT, service_name TEXT NOT NULL, qualified_name TEXT NOT NULL, service_path TEXT NOT NULL, is_extend INTEGER NOT NULL, source_file TEXT NOT NULL, source_line INTEGER NOT NULL, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS cds_operations (id INTEGER PRIMARY KEY, service_id INTEGER NOT NULL, operation_type TEXT NOT NULL, operation_name TEXT NOT NULL, operation_path TEXT NOT NULL, params_json TEXT NOT NULL, return_type TEXT, source_file TEXT NOT NULL, source_line INTEGER NOT NULL, FOREIGN KEY(service_id) REFERENCES cds_services(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS symbols (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, file_id INTEGER, kind TEXT NOT NULL, name TEXT NOT NULL, qualified_name TEXT NOT NULL, exported INTEGER NOT NULL, start_line INTEGER NOT NULL, end_line INTEGER NOT NULL, start_offset INTEGER, end_offset INTEGER, source_file TEXT, exported_name TEXT, evidence_json TEXT, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE, FOREIGN KEY(file_id) REFERENCES files(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS handler_classes (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, symbol_id INTEGER, class_name TEXT NOT NULL, source_file TEXT NOT NULL, source_line INTEGER NOT NULL, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE, FOREIGN KEY(symbol_id) REFERENCES symbols(id) ON DELETE SET NULL);\nCREATE TABLE IF NOT EXISTS handler_methods (id INTEGER PRIMARY KEY, handler_class_id INTEGER NOT NULL, method_name TEXT NOT NULL, decorator_kind TEXT NOT NULL, decorator_value TEXT, decorator_raw_expression TEXT NOT NULL, source_file TEXT NOT NULL, source_line INTEGER NOT NULL, FOREIGN KEY(handler_class_id) REFERENCES handler_classes(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS handler_registrations (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, handler_class_id INTEGER, class_name TEXT, import_source TEXT, registration_file TEXT NOT NULL, registration_line INTEGER NOT NULL, registration_kind TEXT NOT NULL, confidence REAL NOT NULL, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE, FOREIGN KEY(handler_class_id) REFERENCES handler_classes(id) ON DELETE SET NULL);\nCREATE TABLE IF NOT EXISTS service_bindings (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, symbol_id INTEGER, variable_name TEXT NOT NULL, alias TEXT, alias_expr TEXT, destination_expr TEXT, service_path_expr TEXT, is_dynamic INTEGER NOT NULL, placeholders_json TEXT NOT NULL, source_file TEXT NOT NULL, source_line INTEGER NOT NULL, helper_chain_json TEXT, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE, FOREIGN KEY(symbol_id) REFERENCES symbols(id) ON DELETE SET NULL);\nCREATE TABLE IF NOT EXISTS outbound_calls (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, source_symbol_id INTEGER, call_type TEXT NOT NULL, service_binding_id INTEGER, method TEXT, operation_path_expr TEXT, query_entity TEXT, event_name_expr TEXT, payload_summary TEXT, source_file TEXT NOT NULL, source_line INTEGER NOT NULL, confidence REAL NOT NULL, unresolved_reason TEXT, local_service_name TEXT, local_service_lookup TEXT, alias_chain_json TEXT, evidence_json TEXT, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE, FOREIGN KEY(source_symbol_id) REFERENCES symbols(id) ON DELETE SET NULL, FOREIGN KEY(service_binding_id) REFERENCES service_bindings(id) ON DELETE SET NULL);\nCREATE TABLE IF NOT EXISTS symbol_calls (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, caller_symbol_id INTEGER NOT NULL, callee_symbol_id INTEGER, callee_expression TEXT NOT NULL, import_source TEXT, source_file TEXT NOT NULL, source_line INTEGER NOT NULL, status TEXT NOT NULL, confidence REAL NOT NULL, evidence_json TEXT NOT NULL, unresolved_reason TEXT, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE, FOREIGN KEY(caller_symbol_id) REFERENCES symbols(id) ON DELETE CASCADE, FOREIGN KEY(callee_symbol_id) REFERENCES symbols(id) ON DELETE SET NULL);\nCREATE TABLE IF NOT EXISTS graph_edges (id INTEGER PRIMARY KEY, workspace_id INTEGER NOT NULL, edge_type TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'unresolved', from_kind TEXT NOT NULL, from_id TEXT NOT NULL, to_kind TEXT NOT NULL, to_id TEXT NOT NULL, confidence REAL NOT NULL, evidence_json TEXT NOT NULL, is_dynamic INTEGER NOT NULL, unresolved_reason TEXT, generation INTEGER NOT NULL DEFAULT 0, FOREIGN KEY(workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS index_runs (id INTEGER PRIMARY KEY, workspace_id INTEGER NOT NULL, started_at TEXT NOT NULL, finished_at TEXT, status TEXT NOT NULL, repo_count INTEGER NOT NULL, file_count INTEGER NOT NULL, diagnostic_count INTEGER NOT NULL, error_message TEXT, FOREIGN KEY(workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS diagnostics (id INTEGER PRIMARY KEY, repo_id INTEGER, file_id INTEGER, severity TEXT NOT NULL, code TEXT NOT NULL, message TEXT NOT NULL, source_file TEXT, source_line INTEGER, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE, FOREIGN KEY(file_id) REFERENCES files(id) ON DELETE SET NULL);\nCREATE INDEX IF NOT EXISTS idx_repo_name ON repositories(name);\nCREATE INDEX IF NOT EXISTS idx_service_path ON cds_services(service_path);\nCREATE INDEX IF NOT EXISTS idx_operation_name ON cds_operations(operation_name, operation_path);\nCREATE INDEX IF NOT EXISTS idx_calls_repo ON outbound_calls(repo_id, call_type);\nCREATE INDEX IF NOT EXISTS idx_symbol_calls_caller ON symbol_calls(repo_id, caller_symbol_id);\nCREATE VIRTUAL TABLE IF NOT EXISTS search_index USING fts5(kind, name, path, repo);\n`;\n","import type { Db } from './connection.js';\nimport { schemaSql } from './schema.js';\nconst CURRENT_SCHEMA_VERSION = 5;\nconst columns: Record<string, Array<{ name: string; ddl: string }>> = {\n service_bindings: [\n { name: 'helper_chain_json', ddl: 'ALTER TABLE service_bindings ADD COLUMN helper_chain_json TEXT' },\n { name: 'alias_expr', ddl: 'ALTER TABLE service_bindings ADD COLUMN alias_expr TEXT' },\n ],\n repositories: [\n { name: 'fingerprint', ddl: 'ALTER TABLE repositories ADD COLUMN fingerprint TEXT' },\n { name: 'fact_generation', ddl: 'ALTER TABLE repositories ADD COLUMN fact_generation INTEGER NOT NULL DEFAULT 0' },\n { name: 'graph_generation', ddl: 'ALTER TABLE repositories ADD COLUMN graph_generation INTEGER NOT NULL DEFAULT 0' },\n { name: 'graph_stale_reason', ddl: 'ALTER TABLE repositories ADD COLUMN graph_stale_reason TEXT' },\n { name: 'graph_stale_at', ddl: 'ALTER TABLE repositories ADD COLUMN graph_stale_at TEXT' },\n ],\n graph_edges: [\n { name: 'status', ddl: \"ALTER TABLE graph_edges ADD COLUMN status TEXT NOT NULL DEFAULT 'unresolved'\" },\n { name: 'generation', ddl: 'ALTER TABLE graph_edges ADD COLUMN generation INTEGER NOT NULL DEFAULT 0' },\n ],\n handler_registrations: [\n { name: 'class_name', ddl: 'ALTER TABLE handler_registrations ADD COLUMN class_name TEXT' },\n { name: 'import_source', ddl: 'ALTER TABLE handler_registrations ADD COLUMN import_source TEXT' },\n ],\n symbols: [\n { name: 'start_offset', ddl: 'ALTER TABLE symbols ADD COLUMN start_offset INTEGER' },\n { name: 'end_offset', ddl: 'ALTER TABLE symbols ADD COLUMN end_offset INTEGER' },\n { name: 'source_file', ddl: 'ALTER TABLE symbols ADD COLUMN source_file TEXT' },\n { name: 'exported_name', ddl: 'ALTER TABLE symbols ADD COLUMN exported_name TEXT' },\n { name: 'evidence_json', ddl: 'ALTER TABLE symbols ADD COLUMN evidence_json TEXT' },\n ],\n outbound_calls: [\n { name: 'local_service_name', ddl: 'ALTER TABLE outbound_calls ADD COLUMN local_service_name TEXT' },\n { name: 'local_service_lookup', ddl: 'ALTER TABLE outbound_calls ADD COLUMN local_service_lookup TEXT' },\n { name: 'alias_chain_json', ddl: 'ALTER TABLE outbound_calls ADD COLUMN alias_chain_json TEXT' },\n { name: 'evidence_json', ddl: 'ALTER TABLE outbound_calls ADD COLUMN evidence_json TEXT' },\n ],\n index_runs: [\n { name: 'error_message', ddl: 'ALTER TABLE index_runs ADD COLUMN error_message TEXT' },\n ],\n};\nfunction hasColumn(db: Db, table: string, column: string): boolean {\n return (db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name?: string }>).some((row) => row.name === column);\n}\nfunction userVersion(db: Db): number {\n const row = db.pragma('user_version')[0] as { user_version?: number } | undefined;\n return Number(row?.user_version ?? 0);\n}\nfunction addMissingColumns(db: Db): void {\n for (const [table, tableColumns] of Object.entries(columns)) {\n for (const column of tableColumns) {\n if (!hasColumn(db, table, column.name)) db.prepare(column.ddl).run();\n }\n }\n}\nfunction normalizeLegacyStatus(db: Db): void {\n db.prepare(\"UPDATE graph_edges SET status=CASE WHEN edge_type='REMOTE_CALL_RESOLVES_TO_OPERATION' THEN 'resolved' WHEN edge_type IN ('HANDLER_RUNS_DB_QUERY','HANDLER_CALLS_EXTERNAL_HTTP','HANDLER_EMITS_EVENT','EVENT_CONSUMED_BY_HANDLER') THEN 'terminal' WHEN edge_type='DYNAMIC_EDGE_CANDIDATE' THEN 'dynamic' WHEN status='ambiguous' THEN 'ambiguous' ELSE status END\").run();\n db.prepare(\"UPDATE repositories SET graph_stale_reason='schema_migration_requires_relink', graph_stale_at=COALESCE(graph_stale_at, datetime('now')) WHERE EXISTS (SELECT 1 FROM graph_edges WHERE graph_edges.workspace_id=repositories.workspace_id) AND graph_generation=0\").run();\n}\nexport function migrate(db: Db): void {\n db.transaction(() => {\n const version = userVersion(db);\n if (version > CURRENT_SCHEMA_VERSION) throw new Error(`Unsupported future service-flow schema version ${version}`);\n db.exec(schemaSql);\n addMissingColumns(db);\n normalizeLegacyStatus(db);\n const violations = db.pragma('foreign_key_check');\n if (violations.length > 0) throw new Error('SQLite foreign_key_check failed during migration');\n db.pragma(`user_version = ${CURRENT_SCHEMA_VERSION}`);\n });\n}\nexport function schemaVersion(db: Db): number {\n return userVersion(db);\n}\nexport function foreignKeyViolations(db: Db): Array<Record<string, unknown>> {\n return db.pragma('foreign_key_check');\n}\n","{\n \"name\": \"@saptools/service-flow\",\n \"version\": \"0.1.30\",\n \"description\": \"Trace SAP CAP service-to-service flows across multi-repository workspaces with runtime-aware graph resolution\",\n \"type\": \"module\",\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"bin\": {\n \"service-flow\": \"dist/cli.js\"\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"CHANGELOG.md\",\n \"README.md\",\n \"TECHNICAL-NOTE.md\",\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=24.0.0\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint src tests\",\n \"test\": \"vitest run tests/unit\",\n \"test:unit\": \"vitest run tests/unit\",\n \"test:e2e\": \"vitest run tests/e2e\",\n \"test:e2e:fake\": \"vitest run tests/e2e\"\n },\n \"keywords\": [\n \"sap\",\n \"cap\",\n \"cds\",\n \"btp\",\n \"cli\",\n \"service-graph\",\n \"call-graph\",\n \"sqlite\",\n \"saptools\"\n ],\n \"author\": \"Dong Tran\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/dongitran/saptools.git\",\n \"directory\": \"packages/service-flow\"\n },\n \"homepage\": \"https://github.com/dongitran/saptools/tree/main/packages/service-flow#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/dongitran/saptools/issues\"\n },\n \"dependencies\": {\n \"commander\": \"13.1.0\",\n \"picocolors\": \"1.1.1\",\n \"typescript\": \"5.9.3\",\n \"zod\": \"4.4.3\"\n },\n \"devDependencies\": {\n \"@vitest/coverage-v8\": \"3.2.4\",\n \"tsup\": \"8.5.1\",\n \"vitest\": \"3.2.4\"\n }\n}\n","import packageJson from '../package.json' with { type: 'json' };\n\nexport const VERSION = packageJson.version;\nexport const ANALYZER_VERSION = packageJson.version;\n","import type { Db } from './connection.js';\nimport type {\n CdsRequire,\n CdsServiceFact,\n HandlerClassFact,\n HandlerRegistrationFact,\n OutboundCallFact,\n ServiceBindingFact,\n ExecutableSymbolFact,\n SymbolCallFact,\n} from '../types.js';\nexport interface RepoRow {\n id: number;\n name: string;\n absolute_path: string;\n relative_path: string;\n package_name: string | null;\n package_version: string | null;\n dependencies_json: string;\n kind: string;\n fingerprint?: string | null;\n fact_generation?: number;\n graph_generation?: number;\n graph_stale_reason?: string | null;\n}\nexport interface WorkspaceRow {\n id: number;\n root_path: string;\n db_path: string;\n}\nexport function upsertWorkspace(\n db: Db,\n rootPath: string,\n dbPath: string,\n): number {\n const now = new Date().toISOString();\n db.prepare(\n 'INSERT INTO workspaces(root_path,db_path,created_at,updated_at) VALUES(?,?,?,?) ON CONFLICT(root_path) DO UPDATE SET db_path=excluded.db_path,updated_at=excluded.updated_at',\n ).run(rootPath, dbPath, now, now);\n return Number(\n db.prepare('SELECT id FROM workspaces WHERE root_path=?').get(rootPath)?.id,\n );\n}\nexport function getWorkspace(\n db: Db,\n rootPath: string,\n): WorkspaceRow | undefined {\n return db\n .prepare('SELECT * FROM workspaces WHERE root_path=?')\n .get(rootPath) as WorkspaceRow | undefined;\n}\nexport function upsertRepository(\n db: Db,\n workspaceId: number,\n r: {\n name: string;\n absolutePath: string;\n relativePath: string;\n isGitRepo: boolean;\n packageName?: string;\n packageVersion?: string;\n dependencies?: Record<string, string>;\n kind?: string;\n },\n): number {\n db.prepare(\n `INSERT INTO repositories(workspace_id,name,absolute_path,relative_path,package_name,package_version,dependencies_json,kind,is_git_repo) VALUES(?,?,?,?,?,?,?,?,?) ON CONFLICT(workspace_id,absolute_path) DO UPDATE SET name=excluded.name,relative_path=excluded.relative_path,package_name=excluded.package_name,package_version=excluded.package_version,dependencies_json=excluded.dependencies_json,kind=excluded.kind`,\n ).run(\n workspaceId,\n r.name,\n r.absolutePath,\n r.relativePath,\n r.packageName,\n r.packageVersion,\n JSON.stringify(r.dependencies ?? {}),\n r.kind ?? 'unknown',\n r.isGitRepo ? 1 : 0,\n );\n return Number(\n db\n .prepare(\n 'SELECT id FROM repositories WHERE workspace_id=? AND absolute_path=?',\n )\n .get(workspaceId, r.absolutePath)?.id,\n );\n}\nexport function listRepositories(db: Db): RepoRow[] {\n return db\n .prepare('SELECT * FROM repositories ORDER BY name')\n .all() as unknown as RepoRow[];\n}\nexport function repoByName(db: Db, name: string): RepoRow | undefined {\n return db\n .prepare('SELECT * FROM repositories WHERE name=? OR package_name=?')\n .get(name, name) as RepoRow | undefined;\n}\nexport function clearRepoFacts(db: Db, repoId: number): void {\n for (const t of [\n 'cds_requires',\n 'cds_services',\n 'handler_classes',\n 'outbound_calls',\n 'symbol_calls',\n 'handler_registrations',\n 'service_bindings',\n 'symbols',\n 'diagnostics',\n 'files',\n ])\n db.prepare(`DELETE FROM ${t} WHERE repo_id=?`).run(repoId);\n db.prepare('DELETE FROM search_index WHERE repo=?').run(String(repoId));\n}\nexport function insertRequires(\n db: Db,\n repoId: number,\n rows: CdsRequire[],\n): void {\n const stmt = db.prepare(\n 'INSERT INTO cds_requires(repo_id,alias,kind,model,destination,service_path,request_timeout,raw_json) VALUES(?,?,?,?,?,?,?,?)',\n );\n for (const r of rows)\n stmt.run(\n repoId,\n r.alias,\n r.kind,\n r.model,\n r.destination,\n r.servicePath,\n r.requestTimeout,\n r.rawJson,\n );\n}\nexport function insertService(\n db: Db,\n repoId: number,\n s: CdsServiceFact,\n): number {\n const id = Number(\n db\n .prepare(\n 'INSERT INTO cds_services(repo_id,namespace,service_name,qualified_name,service_path,is_extend,source_file,source_line) VALUES(?,?,?,?,?,?,?,?) RETURNING id',\n )\n .get(\n repoId,\n s.namespace,\n s.serviceName,\n s.qualifiedName,\n s.servicePath,\n s.isExtend ? 1 : 0,\n s.sourceFile,\n s.sourceLine,\n )?.id,\n );\n const stmt = db.prepare(\n 'INSERT INTO cds_operations(service_id,operation_type,operation_name,operation_path,params_json,return_type,source_file,source_line) VALUES(?,?,?,?,?,?,?,?)',\n );\n db.prepare(\n 'INSERT INTO search_index(kind,name,path,repo) VALUES(?,?,?,?)',\n ).run('service', s.qualifiedName, s.servicePath, String(repoId));\n for (const o of s.operations)\n stmt.run(\n id,\n o.operationType,\n o.operationName,\n o.operationPath,\n o.paramsJson,\n o.returnType,\n o.sourceFile,\n o.sourceLine,\n );\n const search = db.prepare(\n 'INSERT INTO search_index(kind,name,path,repo) VALUES(?,?,?,?)',\n );\n for (const o of s.operations)\n search.run('operation', o.operationName, o.operationPath, String(repoId));\n return id;\n}\nexport function insertHandler(\n db: Db,\n repoId: number,\n h: HandlerClassFact,\n): number {\n const sid = Number(\n db\n .prepare(\n 'INSERT INTO symbols(repo_id,kind,name,qualified_name,exported,start_line,end_line) VALUES(?,?,?,?,?,?,?) RETURNING id',\n )\n .get(\n repoId,\n 'class',\n h.className,\n h.className,\n 1,\n h.sourceLine,\n h.sourceLine,\n )?.id,\n );\n const hid = Number(\n db\n .prepare(\n 'INSERT INTO handler_classes(repo_id,symbol_id,class_name,source_file,source_line) VALUES(?,?,?,?,?) RETURNING id',\n )\n .get(repoId, sid, h.className, h.sourceFile, h.sourceLine)?.id,\n );\n const stmt = db.prepare(\n 'INSERT INTO handler_methods(handler_class_id,method_name,decorator_kind,decorator_value,decorator_raw_expression,source_file,source_line) VALUES(?,?,?,?,?,?,?)',\n );\n for (const m of h.methods)\n stmt.run(\n hid,\n m.methodName,\n m.decoratorKind,\n m.decoratorValue,\n m.decoratorRawExpression,\n m.sourceFile,\n m.sourceLine,\n );\n return hid;\n}\nexport function insertRegistrations(\n db: Db,\n repoId: number,\n rows: HandlerRegistrationFact[],\n): void {\n const stmt = db.prepare(\n 'INSERT INTO handler_registrations(repo_id,handler_class_id,class_name,import_source,registration_file,registration_line,registration_kind,confidence) VALUES(?,?,?,?,?,?,?,?)',\n );\n for (const r of rows) {\n const handlerClass = r.className\n ? (db\n .prepare(\n 'SELECT id FROM handler_classes WHERE repo_id=? AND class_name=? ORDER BY id',\n )\n .all(repoId, r.className) as Array<{ id: number }>)\n : [];\n stmt.run(\n repoId,\n handlerClass.length === 1 ? handlerClass[0]?.id : null,\n r.className,\n r.importSource,\n r.registrationFile,\n r.registrationLine,\n r.registrationKind,\n r.confidence,\n );\n }\n}\nexport function insertBindings(\n db: Db,\n repoId: number,\n rows: ServiceBindingFact[],\n): void {\n const stmt = db.prepare(\n 'INSERT INTO service_bindings(repo_id,variable_name,alias,alias_expr,destination_expr,service_path_expr,is_dynamic,placeholders_json,source_file,source_line,helper_chain_json) VALUES(?,?,?,?,?,?,?,?,?,?,?)',\n );\n for (const r of rows)\n stmt.run(\n repoId,\n r.variableName,\n r.alias,\n r.aliasExpr,\n r.destinationExpr,\n r.servicePathExpr,\n r.isDynamic ? 1 : 0,\n JSON.stringify(r.placeholders),\n r.sourceFile,\n r.sourceLine,\n r.helperChain ? JSON.stringify(r.helperChain) : null,\n );\n}\nexport function insertExecutableSymbols(db: Db, repoId: number, rows: ExecutableSymbolFact[]): void {\n const stmt = db.prepare('INSERT INTO symbols(repo_id,file_id,kind,name,qualified_name,exported,start_line,end_line,start_offset,end_offset,source_file,exported_name,evidence_json) VALUES(?,(SELECT id FROM files WHERE repo_id=? AND relative_path=?),?,?,?,?,?,?,?,?,?,?,?)');\n for (const r of rows) stmt.run(repoId, repoId, r.sourceFile, r.kind, r.localName, r.qualifiedName, r.exported ? 1 : 0, r.startLine, r.endLine, r.startOffset, r.endOffset, r.sourceFile, r.exportedName, r.importExportEvidence ? JSON.stringify(r.importExportEvidence) : null);\n}\nexport function insertSymbolCalls(db: Db, repoId: number, rows: SymbolCallFact[]): void {\n const callerStmt = db.prepare('SELECT id FROM symbols WHERE repo_id=? AND source_file=? AND qualified_name=? ORDER BY id LIMIT 1');\n const insertStmt = db.prepare('INSERT INTO symbol_calls(repo_id,caller_symbol_id,callee_symbol_id,callee_expression,import_source,source_file,source_line,status,confidence,evidence_json,unresolved_reason) VALUES(?,?,?,?,?,?,?,?,?,?,?)');\n for (const r of rows) {\n const caller = callerStmt.get(repoId, r.sourceFile, r.callerQualifiedName) as { id?: number } | undefined;\n const target = resolveSymbolCallTarget(db, repoId, r);\n insertStmt.run(repoId, caller?.id, target.id, r.calleeExpression, r.importSource, r.sourceFile, r.sourceLine, target.status, 0.8, JSON.stringify({ ...r.evidence, candidateStrategy: target.strategy, candidateCount: target.candidateCount }), target.reason);\n }\n}\nfunction isRelativeImportedSymbolCall(r: SymbolCallFact): boolean {\n return Boolean(r.importSource?.startsWith('.'));\n}\nfunction resolveSymbolCallTarget(db: Db, repoId: number, r: SymbolCallFact): { id: number | null; status: string; reason: string | null; strategy: string; candidateCount: number } {\n const evidence = r.evidence as { relation?: unknown };\n const localRows = db.prepare('SELECT id FROM symbols WHERE repo_id=? AND source_file=? AND (name=? OR qualified_name=?) ORDER BY id').all(repoId, r.sourceFile, r.calleeLocalName, r.calleeLocalName) as Array<{ id: number }>;\n if (localRows.length === 1) return { id: localRows[0]?.id ?? null, status: 'resolved', reason: null, strategy: 'same_file_exact', candidateCount: 1 };\n if (localRows.length > 1) return { id: null, status: 'ambiguous', reason: 'Multiple same-file symbol targets matched exactly', strategy: 'same_file_exact', candidateCount: localRows.length };\n if (evidence.relation === 'class_instance_method' && isRelativeImportedSymbolCall(r)) {\n const classRows = db.prepare('SELECT id FROM symbols WHERE repo_id=? AND source_file<>? AND qualified_name=? ORDER BY id').all(repoId, r.sourceFile, r.calleeLocalName) as Array<{ id: number }>;\n if (classRows.length === 1) return { id: classRows[0]?.id ?? null, status: 'resolved', reason: null, strategy: 'relative_import_class_instance_method', candidateCount: 1 };\n if (classRows.length > 1) return { id: null, status: 'ambiguous', reason: 'Multiple relative class instance method targets matched exactly', strategy: 'relative_import_class_instance_method', candidateCount: classRows.length };\n }\n const rows = db.prepare('SELECT id,kind,evidence_json evidenceJson FROM symbols WHERE repo_id=? AND source_file<>? AND exported=1 AND (exported_name=? OR name=? OR qualified_name=?) ORDER BY id').all(repoId, r.sourceFile, r.calleeLocalName, r.calleeLocalName, r.calleeLocalName) as Array<{ id: number; kind?: string; evidenceJson?: string | null }>;\n if (evidence.relation === 'relative_import_proxy_member' && rows.length > 1) {\n const objectMapRows = rows.filter((row) => String(row.evidenceJson ?? '').includes('exported_object_shorthand') || String(row.evidenceJson ?? '').includes('exported_object_literal'));\n if (objectMapRows.length > 0) {\n const concrete = rows.find((row) => row.kind !== 'object_alias') ?? objectMapRows[0];\n return { id: concrete?.id ?? null, status: 'resolved', reason: null, strategy: 'proxy_member_exported_object_map', candidateCount: rows.length };\n }\n return { id: null, status: 'ambiguous', reason: 'Proxy member target requires explicit factory/module/type evidence; global member name is ambiguous', strategy: 'proxy_member_no_global_name_fallback', candidateCount: rows.length };\n }\n if (rows.length === 1) return { id: rows[0]?.id ?? null, status: 'resolved', reason: null, strategy: evidence.relation === 'relative_import_proxy_member' ? 'proxy_member_unique_exported_candidate' : 'relative_import_exported_exact', candidateCount: 1 };\n if (rows.length > 1) return { id: null, status: 'ambiguous', reason: 'Multiple exported symbol targets matched exactly', strategy: 'exported_exact', candidateCount: rows.length };\n return { id: null, status: 'unresolved', reason: 'No local symbol target matched exactly', strategy: evidence.relation === 'relative_import_proxy_member' ? 'proxy_member_no_global_name_fallback' : 'exact_symbol_match', candidateCount: 0 };\n}\nexport function insertCalls(\n db: Db,\n repoId: number,\n rows: OutboundCallFact[],\n): void {\n const stmt = db.prepare(\n 'INSERT INTO outbound_calls(repo_id,source_symbol_id,call_type,method,operation_path_expr,query_entity,event_name_expr,payload_summary,source_file,source_line,confidence,unresolved_reason,local_service_name,local_service_lookup,alias_chain_json,evidence_json,service_binding_id) VALUES(?,COALESCE((SELECT id FROM symbols WHERE repo_id=? AND source_file=? AND qualified_name=? ORDER BY id LIMIT 1),(SELECT id FROM symbols WHERE repo_id=? AND source_file=? AND start_line<=? AND end_line>=? ORDER BY (end_line-start_line),id LIMIT 1)),?,?,?,?,?,?,?,?,?,?,?,?,?,?,(SELECT id FROM service_bindings WHERE repo_id=? AND variable_name=? AND source_file=? ORDER BY CASE WHEN source_line<=? THEN 0 ELSE 1 END, ABS(source_line-?) ASC, id DESC LIMIT 1))',\n );\n for (const r of rows)\n stmt.run(\n repoId,\n repoId,\n r.sourceFile,\n r.sourceSymbolQualifiedName,\n repoId,\n r.sourceFile,\n r.sourceLine,\n r.sourceLine,\n r.callType,\n r.method,\n r.operationPathExpr,\n r.queryEntity,\n r.eventNameExpr,\n r.payloadSummary,\n r.sourceFile,\n r.sourceLine,\n r.confidence,\n r.unresolvedReason,\n r.localServiceName,\n r.localServiceLookup,\n r.aliasChain ? JSON.stringify(r.aliasChain) : null,\n r.evidence ? JSON.stringify(r.evidence) : null,\n repoId,\n r.serviceVariableName,\n r.sourceFile,\n r.sourceLine,\n r.sourceLine,\n );\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { PackageFacts, RepoKind } from '../types.js';\nexport async function classifyRepository(\n repoPath: string,\n facts: PackageFacts\n): Promise<RepoKind> {\n const hasCdsDep = Boolean(\n facts.dependencies['@sap/cds'] ??\n facts.dependencies.cds ??\n facts.dependencies['cds-routing-handlers']\n );\n const cdsFiles = await findFiles(repoPath, '.cds');\n const serverFiles = await Promise.all(\n ['srv/server.ts', 'srv/server.js', 'src/server.ts', 'src/server.js'].map(\n async (f) =>\n fs\n .access(path.join(repoPath, f))\n .then(() => true)\n .catch(() => false)\n )\n );\n const helper =\n Object.keys(facts.dependencies).includes('cds-routing-handlers') ||\n facts.packageName?.includes('helper') === true;\n if (helper && cdsFiles.length > 0) return 'mixed';\n if (helper) return 'helper-package';\n if (hasCdsDep && (cdsFiles.length > 0 || serverFiles.some(Boolean)))\n return 'cap-service';\n if (cdsFiles.length > 0)\n return serverFiles.some(Boolean) ? 'cap-service' : 'cap-db-model';\n return 'unknown';\n}\n\nasync function findFiles(root: string, suffix: string): Promise<string[]> {\n const out: string[] = [];\n async function walk(dir: string): Promise<void> {\n const entries = await fs\n .readdir(dir, { withFileTypes: true })\n .catch(() => []);\n for (const e of entries) {\n if (e.isDirectory()) {\n if (!['node_modules', 'dist', 'gen', '.git'].includes(e.name))\n await walk(path.join(dir, e.name));\n } else if (e.name.endsWith(suffix)) out.push(path.join(dir, e.name));\n }\n }\n await walk(root);\n return out;\n}\n","export interface DiagnosticInput {\n severity: 'info' | 'warning' | 'error';\n code: string;\n message: string;\n sourceFile?: string;\n sourceLine?: number;\n}\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Db } from '../db/connection.js';\nimport {\n clearRepoFacts,\n insertBindings,\n insertCalls,\n insertExecutableSymbols,\n insertHandler,\n insertRegistrations,\n insertSymbolCalls,\n insertRequires,\n insertService,\n type RepoRow,\n} from '../db/repositories.js';\nimport { classifyRepository } from '../discovery/classify-repository.js';\nimport { parseCdsFile } from '../parsers/cds-parser.js';\nimport { parseDecorators } from '../parsers/decorator-parser.js';\nimport { parseHandlerRegistrations } from '../parsers/handler-registration-parser.js';\nimport { parseOutboundCalls } from '../parsers/outbound-call-parser.js';\nimport { parseExecutableSymbols } from '../parsers/symbol-parser.js';\nimport { parsePackageJson } from '../parsers/package-json-parser.js';\nimport { parseServiceBindings } from '../parsers/service-binding-parser.js';\nimport { sha256File } from '../utils/hashing.js';\nimport { normalizePath } from '../utils/path-utils.js';\nimport { errorMessage } from '../utils/diagnostics.js';\nimport { sha256Text } from '../utils/hashing.js';\nimport { ANALYZER_VERSION } from '../version.js';\nimport type { CdsServiceFact, HandlerClassFact, HandlerRegistrationFact, OutboundCallFact, ServiceBindingFact, ExecutableSymbolFact, SymbolCallFact } from '../types.js';\nexport interface IndexRepoResult {\n fileCount: number;\n diagnosticCount: number;\n skipped: boolean;\n}\ninterface ParsedFacts {\n services: CdsServiceFact[];\n handlers: HandlerClassFact[];\n registrations: HandlerRegistrationFact[];\n bindings: ServiceBindingFact[];\n calls: OutboundCallFact[];\n symbols: ExecutableSymbolFact[];\n symbolCalls: SymbolCallFact[];\n fileRecords: Array<{ relativePath: string; extension: string; sha256: string; sizeBytes: number }>;\n}\nexport async function indexRepository(\n db: Db,\n repo: RepoRow,\n force: boolean,\n): Promise<IndexRepoResult> {\n try {\n const sourceFiles = await findSourceFiles(repo.absolute_path);\n const packageFacts = await parsePackageJson(repo.absolute_path);\n const fingerprint = await repositoryFingerprint(repo.absolute_path, sourceFiles, packageFacts);\n if (!force && repo.fingerprint === fingerprint) return { fileCount: 0, diagnosticCount: 0, skipped: true };\n const kind = await classifyRepository(repo.absolute_path, packageFacts);\n const parsed = await parseAllSourceFacts(repo.absolute_path, sourceFiles);\n db.transaction(() => {\n db.prepare('UPDATE repositories SET package_name=?, package_version=?, dependencies_json=?, kind=?, index_status=? WHERE id=?').run(packageFacts.packageName, packageFacts.packageVersion, JSON.stringify(packageFacts.dependencies), kind, 'indexing', repo.id);\n clearRepoFacts(db, repo.id);\n insertRequires(db, repo.id, packageFacts.cdsRequires);\n const fileStmt = db.prepare('INSERT INTO files(repo_id,relative_path,extension,sha256,size_bytes,last_indexed_at) VALUES(?,?,?,?,?,?) ON CONFLICT(repo_id,relative_path) DO UPDATE SET sha256=excluded.sha256,size_bytes=excluded.size_bytes,last_indexed_at=excluded.last_indexed_at');\n for (const file of parsed.fileRecords) fileStmt.run(repo.id, file.relativePath, file.extension, file.sha256, file.sizeBytes, new Date().toISOString());\n for (const s of parsed.services) insertService(db, repo.id, s);\n for (const h of parsed.handlers) insertHandler(db, repo.id, h);\n insertExecutableSymbols(db, repo.id, parsed.symbols);\n insertSymbolCalls(db, repo.id, parsed.symbolCalls);\n insertRegistrations(db, repo.id, parsed.registrations);\n insertBindings(db, repo.id, parsed.bindings);\n insertCalls(db, repo.id, parsed.calls);\n db.prepare(\"UPDATE repositories SET last_indexed_at=?, index_status='indexed', error_count=0, fingerprint=?, fact_generation=COALESCE(fact_generation,0)+1, graph_stale_reason='facts_changed', graph_stale_at=? WHERE id=?\").run(new Date().toISOString(), fingerprint, new Date().toISOString(), repo.id);\n });\n return { fileCount: sourceFiles.length, diagnosticCount: 0, skipped: false };\n } catch (error) {\n const message = errorMessage(error);\n db.prepare(\"UPDATE repositories SET index_status='failed', error_count=1 WHERE id=?\").run(repo.id);\n db.prepare(\"DELETE FROM diagnostics WHERE repo_id=? AND code IN ('index_failed_snapshot_preserved','source_read_failed')\").run(repo.id);\n db.prepare('INSERT INTO diagnostics(repo_id,severity,code,message) VALUES(?,?,?,?)').run(repo.id, 'error', 'source_read_failed', `Index failed before publication; previous facts and fingerprint were preserved. ${message}`);\n return { fileCount: 0, diagnosticCount: 1, skipped: false };\n }\n}\nasync function parseAllSourceFacts(root: string, files: string[]): Promise<ParsedFacts> {\n const facts: ParsedFacts = { services: [], handlers: [], registrations: [], bindings: [], calls: [], symbols: [], symbolCalls: [], fileRecords: [] };\n for (const file of files) {\n const abs = path.join(root, file);\n const stat = await fs.stat(abs);\n facts.fileRecords.push({ relativePath: normalizePath(file), extension: path.extname(file), sha256: await sha256File(abs), sizeBytes: stat.size });\n if (file.endsWith('.cds')) facts.services.push(...(await parseCdsFile(root, file)));\n if (/\\.[jt]s$/.test(file)) {\n facts.handlers.push(...(await parseDecorators(root, file)));\n facts.registrations.push(...(await parseHandlerRegistrations(root, file)));\n facts.bindings.push(...(await parseServiceBindings(root, file)));\n const symbolFacts = await parseExecutableSymbols(root, file);\n facts.symbols.push(...symbolFacts.symbols);\n facts.symbolCalls.push(...symbolFacts.calls);\n facts.calls.push(...(await parseOutboundCalls(root, file)));\n }\n }\n return facts;\n}\nasync function findSourceFiles(root: string): Promise<string[]> {\n const out: string[] = [];\n async function walk(dir: string, prefix = ''): Promise<void> {\n const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);\n for (const e of entries) {\n const rel = prefix ? `${prefix}/${e.name}` : e.name;\n if (e.isDirectory()) {\n if (!['node_modules', 'dist', 'gen', 'coverage', '.git'].includes(e.name)) await walk(path.join(dir, e.name), rel);\n } else if (/\\.(cds|ts|js)$/.test(e.name) && !isDefaultTestFile(rel)) out.push(rel);\n }\n }\n await walk(root);\n return out.sort();\n}\nfunction isDefaultTestFile(relativeFile: string): boolean {\n const parts = relativeFile.split('/');\n if (parts.some((part) => ['test', 'tests', '__tests__'].includes(part))) return true;\n return /\\.(test|spec)\\.[jt]s$/.test(parts.at(-1) ?? '');\n}\nasync function repositoryFingerprint(root: string, files: string[], facts: Awaited<ReturnType<typeof parsePackageJson>>): Promise<string> {\n const packageJson = await fs.readFile(path.join(root, 'package.json'), 'utf8').catch(() => '');\n const normalizedFacts = {\n analyzerVersion: ANALYZER_VERSION,\n packageName: facts.packageName,\n packageVersion: facts.packageVersion,\n dependencies: Object.fromEntries(Object.entries(facts.dependencies).sort()),\n cdsRequires: [...facts.cdsRequires].sort((a, b) => a.alias.localeCompare(b.alias)),\n scripts: Object.fromEntries(Object.entries(facts.scripts).sort()),\n includeTests: false,\n packageJsonHash: sha256Text(packageJson),\n };\n const entries: string[] = [`facts:${JSON.stringify(normalizedFacts)}`];\n for (const file of files) {\n const content = await fs.readFile(path.join(root, file), 'utf8');\n entries.push(`${file}:${sha256Text(content)}`);\n }\n return sha256Text(entries.join('\\n'));\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport ts from 'typescript';\nimport type { ExecutableSymbolFact, SymbolCallFact } from '../types.js';\nimport { containsSupportedOutboundCall } from './outbound-call-parser.js';\nimport { normalizePath } from '../utils/path-utils.js';\n\nfunction lineOf(source: ts.SourceFile, pos: number): number {\n return source.getLineAndCharacterOfPosition(pos).line + 1;\n}\nfunction nameOf(node: ts.PropertyName | ts.BindingName | undefined): string | undefined {\n if (!node) return undefined;\n if (ts.isIdentifier(node) || ts.isStringLiteral(node) || ts.isNumericLiteral(node)) return node.text;\n return undefined;\n}\nfunction isFunctionLike(node: ts.Node): node is ts.FunctionLikeDeclaration {\n return ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node) || ts.isFunctionExpression(node) || ts.isArrowFunction(node);\n}\nfunction exported(node: ts.Node): boolean {\n return Boolean(ts.getCombinedModifierFlags(node as ts.Declaration) & ts.ModifierFlags.Export);\n}\nfunction isPublicClassMethod(node: ts.MethodDeclaration): boolean {\n const flags = ts.getCombinedModifierFlags(node);\n return (flags & ts.ModifierFlags.Private) === 0 && (flags & ts.ModifierFlags.Protected) === 0;\n}\nfunction exportDeclarations(source: ts.SourceFile): Map<string, string> {\n const exports = new Map<string, string>();\n const visit = (node: ts.Node): void => {\n if (ts.isExportDeclaration(node) && node.exportClause && ts.isNamedExports(node.exportClause)) {\n for (const el of node.exportClause.elements) exports.set((el.propertyName ?? el.name).text, el.name.text);\n }\n ts.forEachChild(node, visit);\n };\n visit(source);\n return exports;\n}\nfunction isRelativeImport(value: string | undefined): boolean {\n return Boolean(value?.startsWith('.'));\n}\nfunction isObjectFunction(node: ts.Node): boolean {\n return ts.isFunctionExpression(node) || ts.isArrowFunction(node) || ts.isMethodDeclaration(node);\n}\ntype ParameterBinding =\n | { index: number; kind: 'identifier'; name: string }\n | { index: number; kind: 'object_pattern'; properties: Array<{ property: string; local: string }> };\ntype ParameterPropertyAlias = { parameter: string; property: string; local: string; kind: 'object_parameter_destructure'; line: number };\nconst commonTerminalMembers = new Set(['push', 'includes', 'find', 'findIndex', 'map', 'filter', 'reduce', 'forEach', 'some', 'every', 'toUpperCase', 'toLowerCase', 'trim', 'split', 'join', 'get', 'set', 'has']);\nconst loggerMembers = new Set(['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'log']);\nconst globalObjects = new Set(['JSON', 'Object', 'Array', 'String', 'Number', 'Boolean', 'Math', 'Date', 'Promise', 'Reflect']);\nconst builtInConstructors = new Set([\n 'Set', 'Map', 'WeakSet', 'WeakMap',\n 'Date', 'RegExp', 'URL', 'URLSearchParams',\n 'Error', 'EvalError', 'RangeError', 'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'AggregateError',\n 'ArrayBuffer', 'SharedArrayBuffer', 'DataView',\n 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array',\n 'Float32Array', 'Float64Array', 'BigInt64Array', 'BigUint64Array',\n 'Promise', 'AbortController',\n]);\nconst capDslRoots = new Set(['SELECT', 'INSERT', 'UPSERT', 'UPDATE', 'DELETE']);\nconst requestHelpers = new Set(['reject', 'error', 'info', 'warn', 'notify']);\nconst transportMembers = new Set(['emit', 'publish', 'send', 'on']);\nfunction callName(expr: ts.Expression): { expression: string; local?: string; member?: string; receiver?: string } {\n if (ts.isIdentifier(expr)) return { expression: expr.text, local: expr.text };\n if (ts.isPropertyAccessExpression(expr)) {\n const left = expr.expression.getText();\n const root = left.split('.')[0];\n return { expression: expr.getText(), local: left === 'this' ? undefined : root, member: expr.name.text, receiver: left };\n }\n return { expression: expr.getText() };\n}\nfunction requireSource(expr: ts.Expression): string | undefined {\n if (!ts.isCallExpression(expr) || !ts.isIdentifier(expr.expression) || expr.expression.text !== 'require') return undefined;\n const first = expr.arguments[0];\n return first && ts.isStringLiteral(first) ? first.text : undefined;\n}\nfunction ignoredFrameworkCall(callee: { expression: string; local?: string; member?: string; receiver?: string }): boolean {\n if (callee.local && capDslRoots.has(callee.local)) return true;\n if (callee.expression === 'cds.run' || callee.expression.startsWith('cds.connect.') || callee.expression.startsWith('cds.services.') || callee.expression.startsWith('cds.parse.')) return true;\n if (callee.local === 'req' && callee.member && requestHelpers.has(callee.member)) return true;\n if (callee.member && transportMembers.has(callee.member)) return true;\n if (callee.local && globalObjects.has(callee.local)) return true;\n if (callee.expression.startsWith('new Date().')) return true;\n return false;\n}\nfunction nearest(symbols: ExecutableSymbolFact[], line: number): ExecutableSymbolFact | undefined {\n return symbols.filter((s) => s.startLine <= line && s.endLine >= line).sort((a, b) => (a.endLine - a.startLine) - (b.endLine - b.startLine))[0];\n}\nfunction argumentEvidence(args: ts.NodeArray<ts.Expression>, source: ts.SourceFile): Array<Record<string, unknown>> {\n return args.map((arg) => {\n if (ts.isIdentifier(arg)) return { kind: 'identifier', name: arg.text };\n if (ts.isObjectLiteralExpression(arg)) {\n const properties: Array<Record<string, unknown>> = [];\n for (const prop of arg.properties) {\n if (ts.isShorthandPropertyAssignment(prop)) properties.push({ kind: 'shorthand', property: prop.name.text, argument: prop.name.text });\n if (ts.isPropertyAssignment(prop)) {\n const propName = nameOf(prop.name);\n if (propName && ts.isIdentifier(prop.initializer)) properties.push({ kind: 'property_assignment', property: propName, argument: prop.initializer.text });\n }\n }\n return { kind: 'object_literal', properties };\n }\n return { kind: 'unsupported', expression: arg.getText(source) };\n });\n}\nfunction bindingLocalName(name: ts.BindingName, initializer?: ts.Expression): string | undefined {\n if (ts.isIdentifier(name)) return name.text;\n if (initializer && ts.isIdentifier(initializer)) return initializer.text;\n return undefined;\n}\n\nfunction objectPatternAliases(pattern: ts.ObjectBindingPattern, parameter: string, source: ts.SourceFile, lineNode: ts.Node): ParameterPropertyAlias[] {\n return pattern.elements.flatMap((element): ParameterPropertyAlias[] => {\n if (element.dotDotDotToken || ts.isObjectBindingPattern(element.name) || ts.isArrayBindingPattern(element.name)) return [];\n const property = element.propertyName ? nameOf(element.propertyName) : nameOf(element.name);\n if (!property) return [];\n const local = bindingLocalName(element.name, element.initializer);\n return local ? [{ parameter, property, local, kind: 'object_parameter_destructure', line: lineOf(source, lineNode.getStart(source)) }] : [];\n });\n}\nfunction parameterPropertyAliases(fn: ts.FunctionLikeDeclaration, source: ts.SourceFile): ParameterPropertyAlias[] {\n const parameterNames = new Set(fn.parameters.flatMap((param) => ts.isIdentifier(param.name) ? [param.name.text] : []));\n if (!fn.body || parameterNames.size === 0) return [];\n const aliases: ParameterPropertyAlias[] = [];\n const addFromAssignment = (left: ts.Expression, right: ts.Expression, node: ts.Node): void => {\n if (!ts.isObjectLiteralExpression(left) || !ts.isIdentifier(right) || !parameterNames.has(right.text)) return;\n for (const prop of left.properties) {\n if (!ts.isPropertyAssignment(prop)) continue;\n const property = nameOf(prop.name);\n if (property && ts.isIdentifier(prop.initializer)) aliases.push({ parameter: right.text, property, local: prop.initializer.text, kind: 'object_parameter_destructure', line: lineOf(source, node.getStart(source)) });\n }\n };\n const visit = (node: ts.Node): void => {\n if (ts.isVariableDeclaration(node) && ts.isObjectBindingPattern(node.name) && node.initializer && ts.isIdentifier(node.initializer) && parameterNames.has(node.initializer.text)) aliases.push(...objectPatternAliases(node.name, node.initializer.text, source, node));\n if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken) addFromAssignment(ts.isParenthesizedExpression(node.left) ? node.left.expression : node.left, node.right, node);\n ts.forEachChild(node, visit);\n };\n visit(fn.body);\n const seen = new Set<string>();\n return aliases.filter((alias) => { const key = `${alias.parameter}.${alias.property}:${alias.local}`; if (seen.has(key)) return false; seen.add(key); return true; });\n}\nfunction parameterBindings(params: ts.NodeArray<ts.ParameterDeclaration>): ParameterBinding[] {\n return params.flatMap((param, index): ParameterBinding[] => {\n if (ts.isIdentifier(param.name)) return [{ index, kind: 'identifier', name: param.name.text }];\n if (!ts.isObjectBindingPattern(param.name)) return [];\n const properties = param.name.elements.flatMap((element): Array<{ property: string; local: string }> => {\n if (element.dotDotDotToken || ts.isObjectBindingPattern(element.name) || ts.isArrayBindingPattern(element.name)) return [];\n const property = element.propertyName ? nameOf(element.propertyName) : nameOf(element.name);\n if (!property) return [];\n const local = bindingLocalName(element.name, element.initializer);\n return local ? [{ property, local }] : [];\n });\n return properties.length > 0 ? [{ index, kind: 'object_pattern', properties }] : [];\n });\n}\nexport async function parseExecutableSymbols(repoPath: string, filePath: string): Promise<{ symbols: ExecutableSymbolFact[]; calls: SymbolCallFact[] }> {\n const text = await fs.readFile(path.join(repoPath, filePath), 'utf8');\n const source = ts.createSourceFile(filePath, text, ts.ScriptTarget.Latest, true, filePath.endsWith('.ts') ? ts.ScriptKind.TS : ts.ScriptKind.JS);\n const sourceFile = normalizePath(filePath);\n const symbols: ExecutableSymbolFact[] = [];\n const calls: SymbolCallFact[] = [];\n const imports = new Map<string, string>();\n const exportNames = exportDeclarations(source);\n const objectExports = new Set<string>();\n const exportedClasses = new Set<string>();\n const declaredClasses = new Set<string>();\n const proxyVariables = new Map<string, { importSource: string; factory: string; variableName: string }>();\n const classInstances = new Map<string, { className: string; importSource?: string; propertyName?: string }>();\n const addSymbol = (kind: string, localName: string, node: ts.Node, parentName?: string, exportedName?: string, evidence?: Record<string, unknown>): void => {\n const parentRoot = parentName?.split('.')[0] ?? '';\n const declaredExportName = exportedName ?? exportNames.get(parentName ? parentRoot : localName);\n const qualifiedName = parentName ? `${parentName}.${localName}` : localName;\n const objectExported = parentName ? objectExports.has(parentRoot) : false;\n const classMemberExported = kind === 'method' && parentName ? exportedClasses.has(parentRoot) && ts.isMethodDeclaration(node) && (ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Static) !== 0 && isPublicClassMethod(node) : false;\n const effectiveExportedName = classMemberExported || objectExported ? qualifiedName : declaredExportName;\n const bindings = isFunctionLike(node) ? parameterBindings(node.parameters) : undefined;\n const params = bindings?.flatMap((binding) => binding.kind === 'identifier' ? [binding.name] : []);\n const sourceEvidence = evidence ?? (classMemberExported ? { source: 'exported_class_member', exportedClass: parentRoot, memberKind: (ts.getCombinedModifierFlags(node as ts.Declaration) & ts.ModifierFlags.Static) !== 0 ? 'static_method' : 'class_method', parameters: params } : declaredExportName ? { exportedName: declaredExportName, source: 'export_declaration' } : objectExported ? { exportedName: qualifiedName, source: 'exported_object_literal' } : undefined);\n const aliases = isFunctionLike(node) ? parameterPropertyAliases(node, source) : [];\n const parameterEvidence = { ...(bindings && bindings.length > 0 ? { parameters: params, parameterBindings: bindings } : {}), ...(aliases.length > 0 ? { parameterPropertyAliases: aliases } : {}) };\n symbols.push({ kind, localName: kind === 'object_method' ? qualifiedName : localName, exportedName: effectiveExportedName, qualifiedName, sourceFile, startLine: lineOf(source, node.getStart(source)), endLine: lineOf(source, node.getEnd()), startOffset: node.getStart(source), endOffset: node.getEnd(), exported: exported(node) || Boolean(effectiveExportedName), importExportEvidence: sourceEvidence ? { ...sourceEvidence, ...parameterEvidence } : bindings && bindings.length > 0 ? parameterEvidence : undefined });\n };\n const addAliasSymbol = (objectName: string, propertyName: string, node: ts.Node, targetImportSource?: string): void => {\n symbols.push({ kind: 'object_alias', localName: propertyName, exportedName: propertyName, qualifiedName: `${objectName}.${propertyName}`, sourceFile, startLine: lineOf(source, node.getStart(source)), endLine: lineOf(source, node.getEnd()), startOffset: node.getStart(source), endOffset: node.getEnd(), exported: true, importExportEvidence: { source: 'exported_object_shorthand', objectName, propertyName, targetImportSource } });\n };\n const visitImports = (node: ts.Node): void => {\n if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier)) {\n const sourceText = node.moduleSpecifier.text;\n const clause = node.importClause;\n if (clause?.name) imports.set(clause.name.text, sourceText);\n const named = clause?.namedBindings;\n if (named && ts.isNamedImports(named)) for (const el of named.elements) imports.set(el.name.text, sourceText);\n if (named && ts.isNamespaceImport(named)) imports.set(named.name.text, sourceText);\n }\n if (ts.isVariableStatement(node)) {\n for (const declaration of node.declarationList.declarations) {\n const requiredSource = declaration.initializer ? requireSource(declaration.initializer) : undefined;\n if (ts.isIdentifier(declaration.name) && requiredSource) imports.set(declaration.name.text, requiredSource);\n if (ts.isObjectBindingPattern(declaration.name) && requiredSource) for (const element of declaration.name.elements) if (ts.isIdentifier(element.name)) imports.set(element.name.text, requiredSource);\n }\n }\n ts.forEachChild(node, visitImports);\n };\n visitImports(source);\n const visitSymbols = (node: ts.Node, parentClass?: string): void => {\n if (ts.isClassDeclaration(node) && node.name) {\n declaredClasses.add(node.name.text);\n if (exported(node) || exportNames.has(node.name.text)) exportedClasses.add(node.name.text);\n for (const member of node.members) visitSymbols(member, node.name.text);\n return;\n }\n if (ts.isMethodDeclaration(node)) {\n const localName = nameOf(node.name);\n if (localName) addSymbol('method', localName, node, parentClass);\n } else if (ts.isPropertyDeclaration(node) && parentClass && node.initializer && (ts.isArrowFunction(node.initializer) || ts.isFunctionExpression(node.initializer))) {\n const localName = nameOf(node.name);\n if (localName) addSymbol('method', localName, node.initializer, parentClass, undefined, { source: 'class_property_function', memberKind: ts.isArrowFunction(node.initializer) ? 'arrow_function_property' : 'function_expression_property' });\n } else if (ts.isFunctionDeclaration(node) && node.name) addSymbol('function', node.name.text, node, undefined, exported(node) ? node.name.text : undefined);\n else if (ts.isVariableStatement(node)) {\n for (const d of node.declarationList.declarations) {\n const localName = nameOf(d.name);\n if (!localName || !d.initializer) continue;\n if (isFunctionLike(d.initializer)) addSymbol('function', localName, d.initializer, undefined, exported(node) ? localName : exportNames.get(localName));\n if (ts.isObjectLiteralExpression(d.initializer)) {\n const objectIsExported = exported(node) || exportNames.has(localName);\n if (objectIsExported) objectExports.add(localName);\n for (const prop of d.initializer.properties) {\n if (objectIsExported && ts.isShorthandPropertyAssignment(prop)) addAliasSymbol(localName, prop.name.text, prop.name, imports.get(prop.name.text));\n if (ts.isPropertyAssignment(prop) && isObjectFunction(prop.initializer)) {\n const propName = nameOf(prop.name);\n if (propName) addSymbol('object_method', propName, prop.initializer, localName);\n } else if (ts.isMethodDeclaration(prop)) {\n const propName = nameOf(prop.name);\n if (propName) addSymbol('object_method', propName, prop, localName);\n }\n }\n }\n }\n } else ts.forEachChild(node, (child) => visitSymbols(child, parentClass));\n };\n visitSymbols(source);\n\n const isTopLevelCallback = (node: ts.Node): node is ts.ArrowFunction | ts.FunctionExpression => {\n if (!ts.isArrowFunction(node) && !ts.isFunctionExpression(node)) return false;\n if (!ts.isCallExpression(node.parent)) return false;\n const callee = callName(node.parent.expression);\n const member = callee.member ?? callee.local;\n return Boolean(member && ['bootstrap', 'served', 'connect', 'on', 'once', 'use', 'get', 'post', 'put', 'patch', 'delete', 'subscribe'].includes(member));\n };\n const visitCallbackSymbols = (node: ts.Node): void => {\n if (isTopLevelCallback(node) && containsSupportedOutboundCall(node)) {\n const startLine = lineOf(source, node.getStart(source));\n const name = `callback:${startLine}`;\n symbols.push({ kind: 'callback', localName: name, qualifiedName: `module:${sourceFile}#${name}`, sourceFile, startLine, endLine: lineOf(source, node.getEnd()), startOffset: node.getStart(source), endOffset: node.getEnd(), exported: false, importExportEvidence: { source: 'synthetic_outbound_callback', callbackLine: startLine } });\n }\n ts.forEachChild(node, visitCallbackSymbols);\n };\n visitCallbackSymbols(source);\n\n const visitEventRegistrationSymbols = (node: ts.Node): void => {\n if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression) && node.expression.name.text === 'on') {\n const receiver = node.expression.expression.getText(source);\n const eventArg = node.arguments[0];\n if ((receiver === 'cds' || /^(srv|service|serviceClient|messaging|messageClient|eventClient|.*Client)$/.test(receiver)) && eventArg && (ts.isStringLiteral(eventArg) || ts.isNoSubstitutionTemplateLiteral(eventArg))) {\n const startLine = lineOf(source, node.getStart(source));\n const eventName = eventArg.text.replace(/[^A-Za-z0-9_$-]/g, '_');\n const name = `event:${eventName}:${startLine}`;\n symbols.push({ kind: 'event_registration', localName: name, qualifiedName: `module:${sourceFile}#${name}`, sourceFile, startLine, endLine: lineOf(source, node.getEnd()), startOffset: node.getStart(source), endOffset: node.getEnd(), exported: false, importExportEvidence: { source: 'synthetic_event_registration', eventName: eventArg.text, registrationLine: startLine, receiver } });\n }\n }\n ts.forEachChild(node, visitEventRegistrationSymbols);\n };\n visitEventRegistrationSymbols(source);\n const visitProxyVariables = (node: ts.Node): void => {\n if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name) && node.initializer && ts.isCallExpression(node.initializer) && ts.isPropertyAccessExpression(node.initializer.expression)) {\n const callee = callName(node.initializer.expression);\n const importSource = callee.local ? imports.get(callee.local) : undefined;\n if (callee.member && importSource && isRelativeImport(importSource)) proxyVariables.set(node.name.text, { importSource, factory: callee.expression, variableName: node.name.text });\n }\n ts.forEachChild(node, visitProxyVariables);\n };\n visitProxyVariables(source);\n const rememberClassInstance = (variableName: string, className: string, propertyName?: string): void => {\n const importSource = imports.get(className);\n if (!builtInConstructors.has(className) && ((importSource && isRelativeImport(importSource)) || declaredClasses.has(className))) classInstances.set(variableName, { className, importSource, propertyName });\n };\n const visitClassInstances = (node: ts.Node): void => {\n if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name) && node.initializer && ts.isNewExpression(node.initializer) && ts.isIdentifier(node.initializer.expression)) {\n rememberClassInstance(node.name.text, node.initializer.expression.text);\n }\n if (ts.isPropertyDeclaration(node) && node.initializer && ts.isNewExpression(node.initializer) && ts.isIdentifier(node.initializer.expression)) {\n const propertyName = nameOf(node.name);\n if (propertyName) rememberClassInstance(`this.${propertyName}`, node.initializer.expression.text, propertyName);\n }\n ts.forEachChild(node, visitClassInstances);\n };\n visitClassInstances(source);\n const localCallables = new Set(symbols.flatMap((sym) => [sym.localName, sym.qualifiedName]));\n const visitCalls = (node: ts.Node): void => {\n if (ts.isCallExpression(node)) {\n const line = lineOf(source, node.getStart(source));\n const caller = nearest(symbols, line);\n if (caller) {\n const callee = callName(node.expression);\n const proxy = callee.local ? proxyVariables.get(callee.local) : undefined;\n const instance = (callee.local ? classInstances.get(callee.local) : undefined) ?? (callee.receiver ? classInstances.get(callee.receiver) : undefined);\n const importSource = instance?.importSource ?? proxy?.importSource ?? (callee.local ? imports.get(callee.local) : undefined) ?? (callee.member && callee.local ? imports.get(callee.local) : undefined);\n const directThisMethod = callee.receiver === 'this';\n const targetName = instance && callee.member ? `${instance.className}.${callee.member}` : proxy && callee.member ? callee.member : directThisMethod ? callee.member : callee.member && callee.local ? `${callee.local}.${callee.member}` : callee.local;\n const className = caller.qualifiedName.includes('.') ? caller.qualifiedName.split('.')[0] : undefined;\n const thisTarget = directThisMethod && className && callee.member ? `${className}.${callee.member}` : undefined;\n const loggerLike = callee.receiver?.endsWith('.logger') || callee.local === 'logger' || (callee.expression.startsWith('this.logger.') && callee.member ? loggerMembers.has(callee.member) : false);\n const terminalMember = callee.member ? commonTerminalMembers.has(callee.member) || loggerMembers.has(callee.member) : false;\n const provenLocal = Boolean(targetName) && localCallables.has(String(targetName));\n const provenThisMethod = Boolean(thisTarget && localCallables.has(thisTarget));\n const provenRelativeImport = Boolean(isRelativeImport(importSource) && targetName);\n const provenClassInstance = Boolean(instance && callee.member && targetName);\n const importedFromPackage = Boolean(importSource && !isRelativeImport(importSource));\n const ignored = loggerLike || terminalMember || importedFromPackage || ignoredFrameworkCall(callee);\n const resolvedTarget = provenThisMethod ? thisTarget : targetName;\n const keep = Boolean(resolvedTarget) && !ignored && (provenLocal || provenThisMethod || provenRelativeImport || provenClassInstance);\n if (keep) calls.push({ callerQualifiedName: caller.qualifiedName, calleeExpression: callee.expression, calleeLocalName: resolvedTarget, receiverLocalName: callee.member ? (callee.local ?? callee.receiver) : undefined, importSource, sourceFile, sourceLine: line, evidence: { relation: instance ? 'class_instance_method' : proxy ? 'relative_import_proxy_member' : importSource ? 'relative_import' : provenThisMethod ? 'indexed_this_method' : 'indexed_local_symbol', caller: caller.qualifiedName, targetName: resolvedTarget, instanceVariable: instance ? (instance.propertyName ?? callee.local) : undefined, className: instance?.className, methodName: instance ? callee.member : undefined, classImportSource: instance?.importSource, callArguments: argumentEvidence(node.arguments, source), proxyVariableName: proxy?.variableName, factory: proxy?.factory, factoryExpression: proxy?.factory, factoryImportSource: proxy?.importSource, candidateStrategy: instance ? (instance.importSource ? 'relative_import_class_instance_method' : 'same_file_class_instance_method') : proxy ? 'proxy_member_exact_export_or_unique_member' : undefined } });\n }\n }\n ts.forEachChild(node, visitCalls);\n };\n visitCalls(source);\n return { symbols, calls };\n}\n","import { createHash } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nexport async function sha256File(filePath: string): Promise<string> {\n return createHash('sha256')\n .update(await readFile(filePath))\n .digest('hex');\n}\nexport function sha256Text(text: string): string {\n return createHash('sha256').update(text).digest('hex');\n}\n","import type { Db } from '../db/connection.js';\nimport { listRepositories, repoByName } from '../db/repositories.js';\nimport { errorMessage } from '../utils/diagnostics.js';\nimport { indexRepository } from './repository-indexer.js';\nexport async function indexWorkspace(\n db: Db,\n workspaceId: number,\n options: { repo?: string; force: boolean },\n): Promise<{ repoCount: number; indexedCount: number; skippedCount: number; fileCount: number; diagnosticCount: number }> {\n const started = new Date().toISOString();\n const repos = options.repo ? [repoByName(db, options.repo)].filter((r) => r !== undefined) : listRepositories(db);\n const runId = Number(db.prepare('INSERT INTO index_runs(workspace_id,started_at,status,repo_count,file_count,diagnostic_count) VALUES(?,?,?,?,?,?) RETURNING id').get(workspaceId, started, 'running', repos.length, 0, 0)?.id);\n let fileCount = 0;\n let diagnosticCount = 0;\n let skippedCount = 0;\n try {\n for (const repo of repos) {\n const result = await indexRepository(db, repo, options.force);\n fileCount += result.fileCount;\n diagnosticCount += result.diagnosticCount;\n skippedCount += result.skipped ? 1 : 0;\n }\n db.prepare('UPDATE index_runs SET finished_at=?, status=?, file_count=?, diagnostic_count=? WHERE id=?').run(new Date().toISOString(), diagnosticCount ? 'failed' : 'success', fileCount, diagnosticCount, runId);\n return { repoCount: repos.length, indexedCount: repos.length - skippedCount, skippedCount, fileCount, diagnosticCount };\n } catch (error) {\n db.prepare(\"UPDATE index_runs SET finished_at=?, status='failed', file_count=?, diagnostic_count=?, error_message=? WHERE id=?\").run(new Date().toISOString(), fileCount, diagnosticCount + 1, errorMessage(error), runId);\n throw error;\n }\n}\n","import type { TraceStart } from '../types.js';\nexport function parseVars(\n values: string[] | undefined\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const value of values ?? []) {\n const [key, ...rest] = value.split('=');\n if (key && rest.length > 0) out[key] = rest.join('=');\n }\n return out;\n}\nexport function startLabel(start: TraceStart): string {\n return [\n start.repo,\n start.servicePath,\n start.operation ?? start.operationPath ?? start.handler\n ]\n .filter(Boolean)\n .join(' ');\n}\n","import type { TraceResult } from '../types.js';\n\nfunction location(evidence: Record<string, unknown>): string {\n const file = evidence.file ?? evidence.sourceFile ?? evidence.handlerSourceFile ?? evidence.operationSourceFile ?? evidence.registrationSourceFile;\n const line = evidence.line ?? evidence.sourceLine ?? evidence.handlerSourceLine ?? evidence.operationSourceLine ?? evidence.registrationSourceLine;\n if (file || line) return `${String(file ?? '')}:${String(line ?? '')}`;\n const candidates = evidence.candidates;\n if (Array.isArray(candidates) && candidates.length > 0) {\n const first = candidates[0] as Record<string, unknown>;\n return `${String(first.sourceFile ?? '')}:${String(first.sourceLine ?? '')}`;\n }\n return ':';\n}\nexport function renderTraceTable(result: TraceResult): string {\n const lines = ['Step Type From To Evidence'];\n for (const e of result.edges) {\n lines.push(`${String(e.step).padEnd(5)} ${e.type.padEnd(20)} ${e.from.slice(0, 34).padEnd(35)} ${e.to.slice(0, 35).padEnd(36)} ${location(e.evidence)}`);\n }\n if (result.diagnostics.length > 0) lines.push('', 'Diagnostics:', ...result.diagnostics.map((d) => `${String(d.severity ?? 'info')} ${String(d.code ?? 'diagnostic')} ${String(d.message ?? '')}`));\n return `${lines.join('\\n')}\\n`;\n}\n","import type { TraceResult } from '../types.js';\nexport function renderJson(value: unknown): string {\n return `${JSON.stringify(value, null, 2)}\\n`;\n}\nexport function renderTraceJson(trace: TraceResult): string {\n return renderJson(trace);\n}\n","import type { TraceResult } from '../types.js';\nfunction safe(value: string): string {\n return value.replace(/[^\\w-]/g, '_').slice(0, 60);\n}\nfunction label(trace: TraceResult, idOrLabel: string): string {\n const node = trace.nodes.find((item) => item.id === idOrLabel || item.label === idOrLabel);\n return String(node?.label ?? idOrLabel);\n}\nexport function renderMermaid(trace: TraceResult): string {\n const lines = ['flowchart TD'];\n for (const e of trace.edges)\n lines.push(\n ` ${safe(e.from)}[\"${label(trace, e.from)}\"] -->|${e.type}| ${safe(e.to)}[\"${label(trace, e.to)}\"]`\n );\n return `${lines.join('\\n')}\\n`;\n}\n"],"mappings":"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","names":["path","fs","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","path","fs","trace","trace","path","fs"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/config/defaults.ts","../src/config/workspace-config.ts","../src/db/connection.ts","../src/db/schema.ts","../src/db/migrations.ts","../package.json","../src/version.ts","../src/db/repositories.ts","../src/discovery/classify-repository.ts","../src/utils/diagnostics.ts","../src/indexer/repository-indexer.ts","../src/parsers/symbol-parser.ts","../src/utils/hashing.ts","../src/indexer/workspace-indexer.ts","../src/trace/selectors.ts","../src/output/table-output.ts","../src/output/json-output.ts","../src/output/mermaid-output.ts"],"sourcesContent":["import { Command } from 'commander';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport pc from 'picocolors';\nimport { DEFAULT_IGNORES } from './config/defaults.js';\nimport {\n createWorkspaceConfig,\n loadWorkspaceConfig,\n saveWorkspaceConfig,\n} from './config/workspace-config.js';\nimport { openDatabase, openReadOnlyDatabase } from './db/connection.js';\nimport {\n getWorkspace,\n listRepositories,\n repoByName,\n upsertRepository,\n upsertWorkspace,\n} from './db/repositories.js';\nimport { discoverRepositories } from './discovery/discover-repositories.js';\nimport { parsePackageJson } from './parsers/package-json-parser.js';\nimport { classifyRepository } from './discovery/classify-repository.js';\nimport { indexWorkspace } from './indexer/workspace-indexer.js';\nimport { linkWorkspace } from './linker/cross-repo-linker.js';\nimport { normalizeODataOperationInvocationPath } from './linker/odata-path-normalizer.js';\nimport { trace } from './trace/trace-engine.js';\nimport { parseVars } from './trace/selectors.js';\nimport { renderTraceTable } from './output/table-output.js';\nimport { renderTraceJson, renderJson } from './output/json-output.js';\nimport { renderMermaid } from './output/mermaid-output.js';\nimport { VERSION } from './version.js';\nasync function init(\n workspace: string,\n options: { db?: string; ignore?: string[] },\n): Promise<void> {\n const config = createWorkspaceConfig(\n workspace,\n options.db,\n options.ignore?.length ? options.ignore : [...DEFAULT_IGNORES],\n );\n const repos = await discoverRepositories(config.rootPath, config.ignore);\n await saveWorkspaceConfig(config);\n const db = openDatabase(config.dbPath);\n const workspaceId = upsertWorkspace(db, config.rootPath, config.dbPath);\n for (const repo of repos) {\n const pkg = await parsePackageJson(repo.absolutePath);\n const kind = await classifyRepository(repo.absolutePath, pkg);\n upsertRepository(db, workspaceId, {\n ...repo,\n packageName: pkg.packageName,\n packageVersion: pkg.packageVersion,\n dependencies: pkg.dependencies,\n kind,\n });\n }\n db.close();\n process.stdout.write(\n `Workspace: ${config.rootPath}\\nDatabase: ${config.dbPath}\\nRepositories: ${repos.length}\\nIgnored: ${config.ignore.join(', ')}\\nNext: service-flow index --workspace ${config.rootPath}\\n`,\n );\n}\nasync function withWorkspace<T>(\n workspace: string | undefined,\n fn: (\n db: ReturnType<typeof openDatabase>,\n workspaceId: number,\n rootPath: string,\n ) => Promise<T> | T,\n): Promise<T> {\n const config = await loadWorkspaceConfig(workspace);\n const db = openDatabase(config.dbPath);\n try {\n const row = getWorkspace(db, config.rootPath);\n const workspaceId =\n row?.id ?? upsertWorkspace(db, config.rootPath, config.dbPath);\n return await fn(db, workspaceId, config.rootPath);\n } finally {\n db.close();\n }\n}\nasync function withReadOnlyWorkspace<T>(\n workspace: string | undefined,\n fn: (db: ReturnType<typeof openDatabase>, workspaceId: number, rootPath: string) => Promise<T> | T,\n): Promise<T> {\n const config = await loadWorkspaceConfig(workspace);\n const db = openReadOnlyDatabase(config.dbPath);\n try {\n const row = getWorkspace(db, config.rootPath);\n if (!row) throw new Error(`Workspace is not initialized in ${config.dbPath}`);\n return await fn(db, row.id, config.rootPath);\n } finally {\n db.close();\n }\n}\nfunction localServiceDiagnostics(db: ReturnType<typeof openDatabase>, strict: boolean): Array<Record<string, unknown>> {\n const rows = db.prepare(`SELECT e.status status,e.unresolved_reason reason,e.evidence_json evidenceJson FROM graph_edges e JOIN outbound_calls c ON e.from_kind='call' AND c.id=CAST(e.from_id AS INTEGER) WHERE c.call_type='local_service_call'`).all() as Array<{ status?: string; reason?: string | null; evidenceJson?: string }>;\n const implementationContext = rows.filter((row) => row.status === 'resolved' && String(row.evidenceJson ?? '').includes('implementation_context_caller_ownership')).length;\n const withoutOwnership = rows.filter((row) => row.reason === 'local_service_candidate_without_caller_ownership' || String(row.evidenceJson ?? '').includes('local_service_candidate_without_caller_ownership')).length;\n const unresolved = rows.filter((row) => row.status === 'unresolved').length;\n const outsideScope = rows.filter((row) => {\n if (row.status !== 'unresolved') return false;\n try {\n const evidence = JSON.parse(String(row.evidenceJson ?? '{}')) as { candidateCount?: unknown };\n return Number(evidence.candidateCount ?? 0) > 0;\n } catch {\n return false;\n }\n }).length;\n const out: Array<Record<string, unknown>> = [];\n if (withoutOwnership > 0) out.push({ severity: 'warning', code: 'local_service_candidate_without_caller_ownership', message: `Local service calls have operation candidates but no caller ownership evidence: ${withoutOwnership}` });\n if (outsideScope > 0) out.push({ severity: 'warning', code: 'local_service_candidates_outside_local_scope', message: `Local service calls found candidates outside same-repository scope: ${outsideScope}` });\n if (strict && unresolved > 0) out.push({ severity: 'warning', code: 'local_service_calls_unresolved', message: `Unresolved local service calls: ${unresolved}` });\n if (strict && implementationContext > 0) out.push({ severity: 'info', code: 'local_service_calls_resolved_by_implementation_context', message: `Local service calls resolved by implementation-context ownership: ${implementationContext}` });\n return out;\n}\n\nfunction parserQualityDiagnostics(db: ReturnType<typeof openDatabase>, strict: boolean): Array<Record<string, unknown>> {\n if (!strict) return [];\n const symbolUnresolvedThreshold = 0.05;\n const dbUnknownThreshold = 0.25;\n const outboundUnownedThreshold = 0.01;\n const symbol = db.prepare(\"SELECT COUNT(*) total, SUM(CASE WHEN status='resolved' THEN 1 ELSE 0 END) resolved, SUM(CASE WHEN status='unresolved' THEN 1 ELSE 0 END) unresolved FROM symbol_calls\").get() as { total?: number; resolved?: number; unresolved?: number };\n const top = db.prepare(\"SELECT callee_expression calleeExpression,COUNT(*) count FROM symbol_calls WHERE status='unresolved' GROUP BY callee_expression ORDER BY count DESC,callee_expression LIMIT 5\").all() as Array<Record<string, unknown>>;\n const evidence = db.prepare(\"SELECT COUNT(*) total, SUM(CASE WHEN json_valid(evidence_json)=0 OR json_type(evidence_json) <> 'object' THEN 1 ELSE 0 END) nonObject FROM symbol_calls\").get() as { total?: number; nonObject?: number };\n const dbq = db.prepare(\"SELECT COUNT(*) total, SUM(CASE WHEN query_entity IS NOT NULL THEN 1 ELSE 0 END) known, SUM(CASE WHEN query_entity IS NULL THEN 1 ELSE 0 END) unknown FROM outbound_calls WHERE call_type='local_db_query'\").get() as { total?: number; known?: number; unknown?: number };\n const outbound = db.prepare(\"SELECT COUNT(*) total, SUM(CASE WHEN source_symbol_id IS NULL THEN 1 ELSE 0 END) withoutOwnership FROM outbound_calls\").get() as { total?: number; withoutOwnership?: number };\n const outboundEvidence = db.prepare(\"SELECT COUNT(*) total, SUM(CASE WHEN evidence_json IS NULL THEN 1 ELSE 0 END) missing, SUM(CASE WHEN evidence_json IS NOT NULL AND json_valid(evidence_json)=0 THEN 1 ELSE 0 END) invalid, SUM(CASE WHEN evidence_json IS NOT NULL AND json_valid(evidence_json)=1 AND json_type(evidence_json) <> 'object' THEN 1 ELSE 0 END) nonObject FROM outbound_calls\").get() as { total?: number; missing?: number; invalid?: number; nonObject?: number };\n const outboundEvidenceExamples = db.prepare(\"SELECT call_type callType, source_file sourceFile, source_line sourceLine FROM outbound_calls WHERE evidence_json IS NULL OR json_valid(evidence_json)=0 OR json_type(evidence_json) <> 'object' ORDER BY source_file, source_line LIMIT 10\").all() as Array<Record<string, unknown>>;\n const graphEvidence = db.prepare(\"SELECT COUNT(*) total, SUM(CASE WHEN e.evidence_json IS NULL OR json_valid(e.evidence_json)=0 OR json_type(e.evidence_json) <> 'object' THEN 1 ELSE 0 END) nonObject, SUM(CASE WHEN e.evidence_json IS NOT NULL AND json_valid(e.evidence_json)=1 AND json_extract(e.evidence_json,'$.outboundEvidence.parser') IS NOT NULL THEN 1 ELSE 0 END) withOutboundEvidence FROM graph_edges e WHERE e.from_kind='call'\").get() as { total?: number; nonObject?: number; withOutboundEvidence?: number };\n const graphEvidenceExamples = db.prepare(\"SELECT c.call_type callType,c.source_file sourceFile,c.source_line sourceLine,e.edge_type edgeType FROM graph_edges e JOIN outbound_calls c ON e.from_kind='call' AND c.id=CAST(e.from_id AS INTEGER) WHERE e.evidence_json IS NULL OR json_valid(e.evidence_json)=0 OR json_type(e.evidence_json) <> 'object' OR json_extract(e.evidence_json,'$.outboundEvidence.parser') IS NULL ORDER BY c.source_file,c.source_line LIMIT 10\").all() as Array<Record<string, unknown>>;\n const eventReceiver = db.prepare(\"SELECT COUNT(*) total, SUM(CASE WHEN call_type IN ('async_emit','async_subscribe') THEN 1 ELSE 0 END) eventTotal, SUM(CASE WHEN call_type IN ('async_emit','async_subscribe') AND (json_extract(evidence_json,'$.receiverClassification') IS NULL OR json_extract(evidence_json,'$.receiverClassification') <> 'cap_evidence') THEN 1 ELSE 0 END) questionable FROM outbound_calls\").get() as { total?: number; eventTotal?: number; questionable?: number };\n const dynamicTerminal = db.prepare(\"SELECT COUNT(*) count FROM graph_edges WHERE status='terminal' AND is_dynamic=1\").get() as { count?: number };\n const ownerlessByType = db.prepare(\"SELECT call_type callType, COUNT(*) count FROM outbound_calls WHERE source_symbol_id IS NULL GROUP BY call_type ORDER BY count DESC, call_type\").all() as Array<Record<string, unknown>>;\n const ownerlessByCategory = db.prepare(`SELECT CASE\n WHEN COALESCE(evidence_json,'') LIKE '%comment_or_non_executable_source%' THEN 'comment_or_non_executable_source'\n WHEN call_type='async_subscribe' AND COALESCE(evidence_json,'') LIKE '%cap_service_event_subscription%' THEN 'top_level_event_registration'\n WHEN call_type='async_subscribe' THEN 'generic_event_listener_ignored_or_unowned'\n WHEN EXISTS (SELECT 1 FROM symbols s WHERE s.repo_id=outbound_calls.repo_id AND s.source_file=outbound_calls.source_file) THEN 'line_range_mismatch'\n WHEN source_line <= 1 THEN 'unsupported_function_shape'\n WHEN source_line > 1 THEN 'unsupported_callback_shape'\n ELSE 'unknown' END category, COUNT(*) count\n FROM outbound_calls WHERE source_symbol_id IS NULL GROUP BY category ORDER BY count DESC, category`).all() as Array<Record<string, unknown>>;\n const ownerlessExamples = db.prepare(`SELECT CASE\n WHEN COALESCE(evidence_json,'') LIKE '%comment_or_non_executable_source%' THEN 'comment_or_non_executable_source'\n WHEN call_type='async_subscribe' AND COALESCE(evidence_json,'') LIKE '%cap_service_event_subscription%' THEN 'top_level_event_registration'\n WHEN call_type='async_subscribe' THEN 'generic_event_listener_ignored_or_unowned'\n WHEN EXISTS (SELECT 1 FROM symbols s WHERE s.repo_id=outbound_calls.repo_id AND s.source_file=outbound_calls.source_file) THEN 'line_range_mismatch'\n WHEN source_line <= 1 THEN 'unsupported_function_shape'\n WHEN source_line > 1 THEN 'unsupported_callback_shape'\n ELSE 'unknown' END category, call_type callType, source_file sourceFile, source_line sourceLine, unresolved_reason unresolvedReason\n FROM outbound_calls WHERE source_symbol_id IS NULL ORDER BY category, source_file, source_line LIMIT 10`).all() as Array<Record<string, unknown>>;\n const symbolTotal = Number(symbol.total ?? 0);\n const symbolUnresolved = Number(symbol.unresolved ?? 0);\n const symbolUnresolvedRatio = symbolTotal === 0 ? 0 : Number((symbolUnresolved / symbolTotal).toFixed(4));\n const queryTotal = Number(dbq.total ?? 0);\n const queryUnknown = Number(dbq.unknown ?? 0);\n const queryUnknownRatio = queryTotal === 0 ? 0 : Number((queryUnknown / queryTotal).toFixed(4));\n const outboundTotal = Number(outbound.total ?? 0);\n const outboundWithoutOwnership = Number(outbound.withoutOwnership ?? 0);\n const outboundWithoutOwnershipRatio = outboundTotal === 0 ? 0 : Number((outboundWithoutOwnership / outboundTotal).toFixed(4));\n const remoteQuery = remoteQueryTargetQuality(db);\n const invocation = odataInvocationResolutionQuality(db);\n const remoteAction = remoteActionTargetQuality(db);\n const externalHttp = externalHttpTargetQuality(db);\n const aliasQuality = identityAliasBindingQuality(db);\n const noBindingQuality = remoteActionNoBindingQuality(db);\n const contextualQuality = contextualImplementationQuality(db);\n const classInstanceQuality = classInstanceNoiseQuality(db);\n const bindingPropagationQuality = contextualBindingPropagationQuality(db);\n const wrapperQuality = wrapperPathPropagationQuality(db);\n const nestedThisQuality = nestedThisReceiverQuality(db);\n return [\n aliasQuality,\n noBindingQuality,\n contextualQuality,\n classInstanceQuality,\n bindingPropagationQuality,\n wrapperQuality,\n nestedThisQuality,\n remoteQuery,\n invocation,\n remoteAction,\n externalHttp,\n { severity: Number(evidence.nonObject ?? 0) > 0 ? 'warning' : 'info', code: 'strict_symbol_call_evidence_quality', message: 'Symbol-call evidence JSON object aggregate', total: Number(evidence.total ?? 0), nonObject: Number(evidence.nonObject ?? 0) },\n { severity: Number(outboundEvidence.missing ?? 0) + Number(outboundEvidence.invalid ?? 0) + Number(outboundEvidence.nonObject ?? 0) > 0 ? 'warning' : 'info', code: 'strict_outbound_evidence_quality', message: 'Outbound parser evidence JSON object aggregate', total: Number(outboundEvidence.total ?? 0), missing: Number(outboundEvidence.missing ?? 0), invalid: Number(outboundEvidence.invalid ?? 0), nonObject: Number(outboundEvidence.nonObject ?? 0), examples: outboundEvidenceExamples },\n { severity: Number(graphEvidence.nonObject ?? 0) > 0 || Number(graphEvidence.withOutboundEvidence ?? 0) < Number(graphEvidence.total ?? 0) ? 'warning' : 'info', code: 'strict_graph_evidence_quality', message: 'Call-derived graph evidence and parser-evidence propagation aggregate', total: Number(graphEvidence.total ?? 0), nonObject: Number(graphEvidence.nonObject ?? 0), withOutboundEvidence: Number(graphEvidence.withOutboundEvidence ?? 0), examples: graphEvidenceExamples },\n { severity: Number(eventReceiver.questionable ?? 0) > 0 ? 'warning' : 'info', code: 'strict_event_receiver_classification_quality', message: 'CAP event receiver classification aggregate', eventTotal: Number(eventReceiver.eventTotal ?? 0), questionable: Number(eventReceiver.questionable ?? 0) },\n { severity: Number(dynamicTerminal.count ?? 0) > 0 ? 'warning' : 'info', code: 'strict_graph_dynamic_flag_consistency', message: 'Graph dynamic flag consistency aggregate', dynamicTerminalEdges: Number(dynamicTerminal.count ?? 0) },\n { severity: symbolUnresolvedRatio > symbolUnresolvedThreshold ? 'warning' : 'info', code: 'strict_symbol_call_quality', message: 'Symbol-call quality aggregate', total: symbolTotal, resolved: Number(symbol.resolved ?? 0), unresolved: symbolUnresolved, unresolvedRatio: symbolUnresolvedRatio, unresolvedRatioThreshold: symbolUnresolvedThreshold, topUnresolvedCallees: top },\n { severity: queryUnknownRatio > dbUnknownThreshold ? 'warning' : 'info', code: 'strict_db_query_quality', message: 'Local DB query quality aggregate', total: queryTotal, known: Number(dbq.known ?? 0), unknown: queryUnknown, unknownRatio: queryUnknownRatio, unknownRatioThreshold: dbUnknownThreshold },\n { severity: outboundWithoutOwnershipRatio > outboundUnownedThreshold ? 'warning' : 'info', code: 'strict_outbound_source_ownership_quality', message: 'Outbound call source-symbol ownership aggregate', total: outboundTotal, withoutOwnership: outboundWithoutOwnership, withoutOwnershipRatio: outboundWithoutOwnershipRatio, withoutOwnershipRatioThreshold: outboundUnownedThreshold, ownerlessByType, ownerlessByCategory, ownerlessExamples },\n ];\n}\n\n\nfunction identityAliasBindingQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const examples = db.prepare(`SELECT c.source_file sourceFile,c.source_line sourceLine,c.service_binding_id serviceBindingId,json_extract(c.evidence_json,'$.receiver') receiverName,b.variable_name aliasSourceVariable,'same-file identifier alias still lacks a binding id' parserReason\n FROM outbound_calls c JOIN service_bindings b ON b.repo_id=c.repo_id AND b.source_file=c.source_file\n WHERE c.call_type='remote_action' AND c.service_binding_id IS NULL AND json_extract(c.evidence_json,'$.receiver') IS NOT NULL\n AND c.evidence_json LIKE '%' || '\"aliasOf\":\"' || json_extract(c.evidence_json,'$.receiver') || '\"' || '%'\n ORDER BY c.source_file,c.source_line LIMIT 5`).all() as Array<Record<string, unknown>>;\n return { severity: examples.length > 0 ? 'warning' : 'info', code: 'strict_identity_alias_binding_quality', message: 'Remote sends that look like missed same-file identity aliases', missedAliasBindingCalls: examples.length, examples };\n}\n\nfunction remoteActionNoBindingQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const categoryCase = `CASE\n WHEN c.unresolved_reason='dynamic_operation_path_identifier' THEN 'dynamic_path_identifier'\n WHEN json_extract(c.evidence_json,'$.classifier')='higher_order_wrapper_literal_path' OR json_extract(c.evidence_json,'$.operationPathExpression') IS NOT NULL THEN 'likely_higher_order_wrapper_path_needed'\n WHEN json_extract(c.evidence_json,'$.receiver') LIKE '%.%' THEN 'likely_parameter_context_needed'\n WHEN EXISTS (\n SELECT 1 FROM symbol_calls sc\n JOIN symbols caller ON caller.id=sc.caller_symbol_id\n JOIN symbols callee ON callee.id=sc.callee_symbol_id\n WHERE sc.status='resolved'\n AND sc.source_file=c.source_file\n AND caller.id=c.source_symbol_id\n AND json_extract(sc.evidence_json,'$.relation')='class_instance_method'\n AND (callee.evidence_json IS NULL OR json_extract(callee.evidence_json,'$.parameterBindings') IS NULL)\n ) THEN 'likely_instance_method_parameter_metadata_needed'\n WHEN EXISTS (SELECT 1 FROM service_bindings b WHERE b.repo_id=c.repo_id AND b.source_file=c.source_file AND ABS(b.source_line-c.source_line) < 50) THEN 'likely_missing_assignment_binding'\n WHEN e.status='unresolved' AND COALESCE(e.unresolved_reason,'') LIKE '%No indexed target operation%' THEN 'no_indexed_target_operation'\n WHEN c.operation_path_expr IS NOT NULL AND (c.operation_path_expr LIKE '/%' OR c.operation_path_expr NOT LIKE '%/%') THEN 'operation_path_only_no_static_service_signal'\n ELSE 'external_or_entity_path_not_action' END`;\n const rows = db.prepare(`SELECT ${categoryCase} category,COALESCE(e.status,'missing_edge') status,COUNT(*) count\n FROM outbound_calls c LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n WHERE c.call_type='remote_action' AND c.operation_path_expr IS NOT NULL AND c.service_binding_id IS NULL\n GROUP BY category,status ORDER BY count DESC,category,status`).all() as Array<Record<string, unknown>>;\n const examples = db.prepare(`SELECT c.source_file sourceFile,c.source_line sourceLine,json_extract(c.evidence_json,'$.receiver') receiverName,c.operation_path_expr operationPath,COALESCE(e.status,'missing_edge') status,${categoryCase} category\n FROM outbound_calls c LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n WHERE c.call_type='remote_action' AND c.operation_path_expr IS NOT NULL AND c.service_binding_id IS NULL ORDER BY c.source_file,c.source_line LIMIT 8`).all() as Array<Record<string, unknown>>;\n const total = rows.reduce((sum, row) => sum + Number(row.count ?? 0), 0);\n return { severity: total > 0 ? 'warning' : 'info', code: 'strict_remote_action_no_binding_quality', message: 'Remote actions with operation paths but no service binding id', total, breakdown: rows, examples };\n}\n\nfunction classInstanceNoiseQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const builtIns = ['Set', 'Map', 'WeakSet', 'WeakMap', 'Date', 'RegExp', 'URL', 'URLSearchParams', 'Error', 'EvalError', 'RangeError', 'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'AggregateError', 'ArrayBuffer', 'SharedArrayBuffer', 'DataView', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'BigInt64Array', 'BigUint64Array', 'Promise', 'AbortController'];\n const placeholders = builtIns.map(() => '?').join(',');\n const aggregate = db.prepare(`SELECT COUNT(*) total,\n SUM(CASE WHEN status='unresolved' THEN 1 ELSE 0 END) unresolved,\n SUM(CASE WHEN status='unresolved' AND json_extract(evidence_json,'$.className') IN (${placeholders}) THEN 1 ELSE 0 END) unresolvedBuiltIn\n FROM symbol_calls WHERE json_extract(evidence_json,'$.relation')='class_instance_method'`).get(...builtIns) as { total?: number; unresolved?: number; unresolvedBuiltIn?: number };\n const byConstructor = db.prepare(`SELECT json_extract(evidence_json,'$.className') constructorName,COUNT(*) unresolvedCount\n FROM symbol_calls WHERE status='unresolved' AND json_extract(evidence_json,'$.relation')='class_instance_method'\n GROUP BY constructorName ORDER BY unresolvedCount DESC,constructorName LIMIT 10`).all() as Array<Record<string, unknown>>;\n return { severity: Number(aggregate.unresolvedBuiltIn ?? 0) > 0 ? 'warning' : 'info', code: 'strict_class_instance_noise_quality', message: 'Class-instance symbol-call aggregate with built-in constructor guard', totalClassInstanceCalls: Number(aggregate.total ?? 0), unresolvedClassInstanceCalls: Number(aggregate.unresolved ?? 0), unresolvedBuiltInClassInstanceCalls: Number(aggregate.unresolvedBuiltIn ?? 0), unresolvedByConstructor: byConstructor };\n}\n\nfunction contextualBindingPropagationQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const serviceClientCalls = db.prepare(`SELECT COUNT(*) count FROM symbol_calls sc\n WHERE json_extract(sc.evidence_json,'$.callArguments[0].kind') IN ('identifier','object_literal')`).get() as { count?: number };\n const missingMetadata = db.prepare(`SELECT COUNT(*) count FROM symbol_calls sc JOIN symbols s ON s.id=sc.callee_symbol_id\n WHERE sc.status='resolved' AND json_extract(sc.evidence_json,'$.callArguments[0].kind') IN ('identifier','object_literal')\n AND (s.evidence_json IS NULL OR json_extract(s.evidence_json,'$.parameterBindings') IS NULL)`).get() as { count?: number };\n const destructuredUnmapped = db.prepare(`SELECT COUNT(*) count FROM symbol_calls sc JOIN symbols s ON s.id=sc.callee_symbol_id\n WHERE json_extract(sc.evidence_json,'$.callArguments[0].kind')='object_literal'\n AND json_extract(s.evidence_json,'$.parameterBindings[0].kind')='object_pattern'\n AND json_array_length(json_extract(sc.evidence_json,'$.callArguments[0].properties')) > json_array_length(json_extract(s.evidence_json,'$.parameterBindings[0].properties'))`).get() as { count?: number };\n const opportunities = db.prepare(`SELECT c.source_file sourceFile,c.source_line sourceLine,json_extract(c.evidence_json,'$.receiver') receiverName,c.operation_path_expr operationPath,b.alias bindingAlias,b.alias_expr bindingAliasExpr,b.service_path_expr servicePathExpr,b.destination_expr destinationExpr,req.service_path requireServicePath,req.destination requireDestination,COALESCE(e.status,'missing_edge') persistedStatus,\n CASE\n WHEN (b.alias_expr LIKE '%$%' OR b.service_path_expr LIKE '%$%' OR b.destination_expr LIKE '%$%') THEN 'runtime_variables_required'\n WHEN b.alias IS NOT NULL AND req.id IS NULL AND b.service_path_expr IS NULL THEN 'alias_without_matching_cds_requires'\n WHEN req.id IS NOT NULL AND COALESCE(e.status,'missing_edge')!='resolved' THEN 'cds_requires_present_but_persisted_resolution_unresolved'\n ELSE 'trace_time_contextual_binding_candidate'\n END contextualStatus\n FROM outbound_calls c\n LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n LEFT JOIN service_bindings b ON b.id=c.service_binding_id\n LEFT JOIN cds_requires req ON req.repo_id=c.repo_id AND req.alias=b.alias\n WHERE c.call_type='remote_action' AND json_extract(c.evidence_json,'$.receiver') IS NOT NULL\n AND (c.service_binding_id IS NULL OR e.status IS NULL OR e.status!='resolved')\n AND EXISTS (SELECT 1 FROM symbol_calls sc WHERE sc.status='resolved' AND sc.source_file=c.source_file)\n ORDER BY c.source_file,c.source_line LIMIT 8`).all() as Array<Record<string, unknown>>;\n const statusRows = db.prepare(`SELECT contextualStatus,COUNT(*) count FROM (\n SELECT CASE\n WHEN (b.alias_expr LIKE '%$%' OR b.service_path_expr LIKE '%$%' OR b.destination_expr LIKE '%$%') THEN 'runtime_variables_required'\n WHEN b.alias IS NOT NULL AND req.id IS NULL AND b.service_path_expr IS NULL THEN 'alias_without_matching_cds_requires'\n WHEN req.id IS NOT NULL AND COALESCE(e.status,'missing_edge')!='resolved' THEN 'cds_requires_present_but_persisted_resolution_unresolved'\n ELSE 'trace_time_contextual_binding_candidate'\n END contextualStatus\n FROM outbound_calls c\n LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n LEFT JOIN service_bindings b ON b.id=c.service_binding_id\n LEFT JOIN cds_requires req ON req.repo_id=c.repo_id AND req.alias=b.alias\n WHERE c.call_type='remote_action' AND json_extract(c.evidence_json,'$.receiver') IS NOT NULL\n AND (c.service_binding_id IS NULL OR e.status IS NULL OR e.status!='resolved')\n AND EXISTS (SELECT 1 FROM symbol_calls sc WHERE sc.status='resolved' AND sc.source_file=c.source_file)\n ) GROUP BY contextualStatus ORDER BY count DESC,contextualStatus`).all() as Array<Record<string, unknown>>;\n const resolvedContextual = db.prepare(`SELECT COUNT(*) count FROM outbound_calls c JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT) WHERE c.call_type='remote_action' AND e.status='resolved' AND c.service_binding_id IS NOT NULL`).get() as { count?: number };\n const totalOpportunities = statusRows.reduce((sum, row) => sum + Number(row.count ?? 0), 0);\n const actionableStatuses = new Set(['alias_without_matching_cds_requires', 'cds_requires_present_but_persisted_resolution_unresolved', 'trace_time_contextual_binding_candidate']);\n const actionableOpportunityCount = statusRows.reduce((sum, row) => actionableStatuses.has(String(row.contextualStatus)) ? sum + Number(row.count ?? 0) : sum, 0);\n const severity = Number(missingMetadata.count ?? 0) + Number(destructuredUnmapped.count ?? 0) + actionableOpportunityCount > 0 ? 'warning' : 'info';\n return { severity, code: 'strict_contextual_binding_propagation_quality', message: 'Contextual service-client propagation opportunities for trace-time helper resolution', localSymbolCallsWithServiceClientArguments: Number(serviceClientCalls.count ?? 0), calleeSymbolsMissingParameterMetadata: Number(missingMetadata.count ?? 0), destructuredObjectParametersPossiblyUnmapped: Number(destructuredUnmapped.count ?? 0), contextualHelperSendsResolvedDuringPersistedLink: Number(resolvedContextual.count ?? 0), traceTimeContextualOpportunities: totalOpportunities, traceTimeContextualOpportunityBreakdown: statusRows.length > 0 ? statusRows : [{ contextualStatus: 'no_contextual_opportunity', count: 0 }], exampleCount: opportunities.length, examples: opportunities };\n}\n\nfunction nestedThisReceiverQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const aggregate = db.prepare(`SELECT COUNT(*) total,\n SUM(CASE WHEN json_extract(evidence_json,'$.relation')='indexed_this_method' THEN 1 ELSE 0 END) resolvedToCurrentClass,\n SUM(CASE WHEN json_extract(evidence_json,'$.relation')='class_instance_method' THEN 1 ELSE 0 END) withExplicitHelperInstanceEvidence\n FROM symbol_calls WHERE callee_expression LIKE 'this.%.%'`).get() as { total?: number; resolvedToCurrentClass?: number; withExplicitHelperInstanceEvidence?: number };\n const examples = db.prepare(`SELECT source_file sourceFile,source_line sourceLine,callee_expression calleeExpression,json_extract(evidence_json,'$.relation') relation,json_extract(evidence_json,'$.targetName') targetName\n FROM symbol_calls WHERE callee_expression LIKE 'this.%.%' AND json_extract(evidence_json,'$.relation')='indexed_this_method'\n ORDER BY source_file,source_line LIMIT 8`).all() as Array<Record<string, unknown>>;\n return { severity: Number(aggregate.resolvedToCurrentClass ?? 0) > 0 ? 'warning' : 'info', code: 'strict_nested_this_receiver_quality', message: 'Nested this receiver symbol-call aggregate', nestedThisReceiverCallsConsidered: Number(aggregate.total ?? 0), nestedThisResolvedToCurrentClass: Number(aggregate.resolvedToCurrentClass ?? 0), nestedThisWithExplicitHelperInstanceEvidence: Number(aggregate.withExplicitHelperInstanceEvidence ?? 0), warningExamples: examples };\n}\n\nfunction contextualImplementationQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const rows = db.prepare(`SELECT status,COALESCE(unresolved_reason,status) reason,COUNT(*) count\n FROM graph_edges WHERE edge_type='OPERATION_IMPLEMENTED_BY_HANDLER' AND status IN ('ambiguous','unresolved') GROUP BY status,reason ORDER BY status,count DESC,reason`).all() as Array<Record<string, unknown>>;\n const examples = db.prepare(`SELECT json_extract(evidence_json,'$.servicePath') servicePath,json_extract(evidence_json,'$.operationPath') operationPath,status,unresolved_reason unresolvedReason,\n json_extract(evidence_json,'$.candidates[0].rejectedReasons[0]') topRejectedReason,\n json_extract(evidence_json,'$.candidates[0].acceptedReasons[0]') topAcceptedReason\n FROM graph_edges WHERE edge_type='OPERATION_IMPLEMENTED_BY_HANDLER' AND status IN ('ambiguous','unresolved') ORDER BY status,id LIMIT 6`).all() as Array<Record<string, unknown>>;\n const total = rows.reduce((sum, row) => sum + Number(row.count ?? 0), 0);\n return { severity: total > 0 ? 'warning' : 'info', code: 'strict_contextual_implementation_quality', message: 'Implementation hops stopped by ambiguous or unresolved implementation edges', total, breakdown: rows, examples };\n}\n\nfunction wrapperPathPropagationQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const examples = db.prepare(`SELECT source_file sourceFile,source_line sourceLine,json_extract(evidence_json,'$.receiver') receiverName,json_extract(evidence_json,'$.operationPathExpression') pathIdentifier,CASE WHEN json_extract(evidence_json,'$.literalCallerArgumentDetected') IS NOT NULL THEN 1 ELSE 0 END literalCallerArgumentDetected\n FROM outbound_calls WHERE call_type='remote_action' AND unresolved_reason='dynamic_operation_path_identifier' ORDER BY source_file,source_line LIMIT 5`).all() as Array<Record<string, unknown>>;\n const aggregate = db.prepare(\"SELECT COUNT(*) count FROM outbound_calls WHERE call_type='remote_action' AND unresolved_reason='dynamic_operation_path_identifier'\").get() as { count?: number };\n return { severity: Number(aggregate.count ?? 0) > 0 ? 'warning' : 'info', code: 'strict_wrapper_path_propagation_quality', message: 'Dynamic path sends where send({ path }) used a path identifier', dynamicPathIdentifierCalls: Number(aggregate.count ?? 0), examples };\n}\n\nfunction remoteQueryTargetQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const aggregate = db.prepare(`SELECT COUNT(*) total,\n SUM(CASE WHEN e.edge_type='HANDLER_RUNS_REMOTE_QUERY' AND e.status='terminal' THEN 1 ELSE 0 END) terminal,\n SUM(CASE WHEN e.edge_type='HANDLER_RUNS_REMOTE_QUERY' AND e.to_id GLOB '[0-9]*' THEN 1 ELSE 0 END) numericTargets,\n SUM(CASE WHEN e.edge_type='UNRESOLVED_EDGE' OR e.status='unresolved' THEN 1 ELSE 0 END) unresolved\n FROM outbound_calls c LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT) WHERE c.call_type='remote_query'`).get() as { total?: number; terminal?: number; numericTargets?: number; unresolved?: number };\n const examples = db.prepare(`SELECT c.source_file sourceFile,c.source_line sourceLine,c.query_entity queryEntity,e.edge_type edgeType,e.status status,e.to_id target\n FROM outbound_calls c LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n WHERE c.call_type='remote_query' AND (e.id IS NULL OR e.edge_type<>'HANDLER_RUNS_REMOTE_QUERY' OR e.status<>'terminal' OR e.to_id GLOB '[0-9]*')\n ORDER BY c.source_file,c.source_line LIMIT 5`).all() as Array<Record<string, unknown>>;\n const numericTargets = Number(aggregate.numericTargets ?? 0);\n const unresolved = Number(aggregate.unresolved ?? 0);\n return { severity: numericTargets + unresolved > 0 ? 'warning' : 'info', code: 'strict_remote_query_target_quality', message: 'Remote query terminal target quality aggregate', totalRemoteQueryCalls: Number(aggregate.total ?? 0), terminalRemoteQueryEdges: Number(aggregate.terminal ?? 0), numericTargetCount: numericTargets, unresolvedRemoteQueryCount: unresolved, examples };\n}\n\nfunction remoteActionTargetQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const aggregate = db.prepare(`SELECT COUNT(*) total,\n SUM(CASE WHEN e.status='unresolved' THEN 1 ELSE 0 END) unresolved,\n SUM(CASE WHEN e.status='unresolved' AND e.to_id GLOB '[0-9]*' THEN 1 ELSE 0 END) numericTargets,\n SUM(CASE WHEN e.status='unresolved' AND (e.to_id='Remote action: unknown path' OR e.to_id='Remote action: dynamic path') THEN 1 ELSE 0 END) semanticTargets\n FROM outbound_calls c LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT) WHERE c.call_type='remote_action'`).get() as { total?: number; unresolved?: number; numericTargets?: number; semanticTargets?: number };\n const examples = db.prepare(`SELECT c.source_file sourceFile,c.source_line sourceLine,c.operation_path_expr operationPath,e.status status,e.to_id target\n FROM outbound_calls c LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n WHERE c.call_type='remote_action' AND e.status='unresolved' AND e.to_id GLOB '[0-9]*' ORDER BY c.source_file,c.source_line LIMIT 5`).all() as Array<Record<string, unknown>>;\n const numericTargets = Number(aggregate.numericTargets ?? 0);\n return { severity: numericTargets > 0 ? 'warning' : 'info', code: 'strict_remote_action_target_quality', message: 'Remote action unresolved target quality aggregate', totalRemoteActionCalls: Number(aggregate.total ?? 0), unresolvedRemoteActionCalls: Number(aggregate.unresolved ?? 0), numericUnresolvedTargetCount: numericTargets, semanticUnknownOrDynamicTargetCount: Number(aggregate.semanticTargets ?? 0), examples };\n}\n\n\nfunction externalHttpTargetQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const aggregate = db.prepare(`SELECT COUNT(*) total,\n SUM(CASE WHEN e.to_kind='external_destination' THEN 1 ELSE 0 END) destinationTargets,\n SUM(CASE WHEN e.to_kind='external_endpoint' AND json_extract(e.evidence_json,'$.externalTarget.kind')='static_url' THEN 1 ELSE 0 END) staticEndpointTargets,\n SUM(CASE WHEN e.to_kind='external_endpoint' AND json_extract(e.evidence_json,'$.externalTarget.dynamic')=1 THEN 1 ELSE 0 END) dynamicEndpointTargets,\n SUM(CASE WHEN e.to_kind='external_endpoint' AND json_extract(e.evidence_json,'$.externalTarget.kind')='unknown' THEN 1 ELSE 0 END) unknownEndpointTargets,\n SUM(CASE WHEN e.to_id GLOB '[0-9]*' THEN 1 ELSE 0 END) numericTargets,\n SUM(CASE WHEN e.evidence_json IS NULL OR json_valid(e.evidence_json)=0 OR json_extract(e.evidence_json,'$.externalTarget.kind') IS NULL THEN 1 ELSE 0 END) invalidEvidence\n FROM outbound_calls c LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT) WHERE c.call_type='external_http'`).get() as Record<string, unknown>;\n const examples = db.prepare(`SELECT c.source_file sourceFile,c.source_line sourceLine,e.to_kind targetKind,e.to_id targetId,json_extract(e.evidence_json,'$.externalTarget.label') label,json_extract(e.evidence_json,'$.externalTarget.kind') kind\n FROM outbound_calls c LEFT JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n WHERE c.call_type='external_http' AND (e.to_id GLOB '[0-9]*' OR e.evidence_json IS NULL OR json_valid(e.evidence_json)=0 OR json_extract(e.evidence_json,'$.externalTarget.kind') IS NULL)\n ORDER BY c.source_file,c.source_line LIMIT 5`).all() as Array<Record<string, unknown>>;\n const numericTargets = Number(aggregate.numericTargets ?? 0);\n const invalidEvidence = Number(aggregate.invalidEvidence ?? 0);\n return { severity: numericTargets + invalidEvidence > 0 ? 'warning' : 'info', code: 'strict_external_http_target_quality', message: 'External HTTP semantic target aggregate', totalExternalHttpCalls: Number(aggregate.total ?? 0), semanticDestinationTargets: Number(aggregate.destinationTargets ?? 0), semanticStaticEndpointTargets: Number(aggregate.staticEndpointTargets ?? 0), dynamicEndpointTargets: Number(aggregate.dynamicEndpointTargets ?? 0), unknownEndpointTargets: Number(aggregate.unknownEndpointTargets ?? 0), numericTargetCount: numericTargets, invalidOrMissingExternalTargetEvidence: invalidEvidence, examples };\n}\n\nfunction odataInvocationResolutionQuality(db: ReturnType<typeof openDatabase>): Record<string, unknown> {\n const aggregate = db.prepare(`SELECT COUNT(*) total,\n SUM(CASE WHEN e.status='resolved' THEN 1 ELSE 0 END) resolved,\n SUM(CASE WHEN e.status='dynamic' THEN 1 ELSE 0 END) dynamic,\n SUM(CASE WHEN e.status='ambiguous' THEN 1 ELSE 0 END) ambiguous,\n SUM(CASE WHEN e.status='unresolved' THEN 1 ELSE 0 END) unresolved\n FROM outbound_calls c JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n WHERE c.call_type='remote_action' AND c.operation_path_expr LIKE '%(%'`) .get() as { total?: number; resolved?: number; dynamic?: number; ambiguous?: number; unresolved?: number };\n const rows = db.prepare(`SELECT c.id id,c.operation_path_expr operationPathExpr,c.source_file sourceFile,c.source_line sourceLine,e.status status,e.unresolved_reason unresolvedReason\n FROM outbound_calls c JOIN graph_edges e ON e.from_kind='call' AND e.from_id=CAST(c.id AS TEXT)\n WHERE c.call_type='remote_action' AND e.status IN ('unresolved','ambiguous') AND c.operation_path_expr LIKE '%(%'\n ORDER BY c.source_file,c.source_line LIMIT 100`).all() as Array<{ id?: number; operationPathExpr?: string; sourceFile?: string; sourceLine?: number; status?: string; unresolvedReason?: string }>;\n const examples: Array<Record<string, unknown>> = [];\n let unresolvedMatchingIndexedOperation = 0;\n let ambiguousNormalizedCalls = 0;\n for (const row of rows) {\n const normalized = normalizeODataOperationInvocationPath(row.operationPathExpr);\n if (!normalized?.wasInvocation) continue;\n const normalizedName = normalized.normalizedOperationPath.replace(/^\\//, '');\n const simpleName = normalizedName.split('.').at(-1) ?? normalizedName;\n const candidates = db.prepare('SELECT s.service_path servicePath,o.operation_path operationPath,o.operation_name operationName FROM cds_operations o JOIN cds_services s ON s.id=o.service_id WHERE o.operation_path IN (?,?) OR o.operation_name IN (?,?) ORDER BY s.service_path,o.operation_name LIMIT 5').all(normalized.normalizedOperationPath, `/${simpleName}`, normalizedName, simpleName) as Array<Record<string, unknown>>;\n if (candidates.length === 0) continue;\n if (row.status === 'ambiguous') ambiguousNormalizedCalls += 1;\n if (row.status === 'unresolved') unresolvedMatchingIndexedOperation += 1;\n if (examples.length < 5) examples.push({ sourceFile: row.sourceFile, sourceLine: row.sourceLine, rawOperationPath: row.operationPathExpr, normalizedOperationPath: normalized.normalizedOperationPath, candidateCount: candidates.length, candidates });\n }\n return { severity: unresolvedMatchingIndexedOperation + ambiguousNormalizedCalls > 0 ? 'warning' : 'info', code: 'strict_odata_invocation_resolution_quality', message: 'OData invocation-path resolution quality aggregate', totalInvocationRemoteActions: Number(aggregate.total ?? 0), resolvedInvocationCalls: Number(aggregate.resolved ?? 0), dynamicInvocationCalls: Number(aggregate.dynamic ?? 0), ambiguousInvocationCalls: Number(aggregate.ambiguous ?? 0), unresolvedInvocationCalls: Number(aggregate.unresolved ?? 0), ambiguousNormalizedCalls, unresolvedNormalizedCallsWithIndexedCandidates: unresolvedMatchingIndexedOperation, examples };\n}\n\nexport function createProgram(): Command {\n const program = new Command();\n program\n .name('service-flow')\n .description(\n 'Trace SAP CAP service-to-service flows across multi-repository workspaces',\n )\n .version(VERSION);\n program\n .command('init')\n .argument('<workspace>')\n .option('--db <path>')\n .option('--ignore <pattern...>')\n .action(\n (workspace: string, opts: { db?: string; ignore?: string[] }) =>\n void init(workspace, opts).catch(fail),\n );\n program\n .command('index')\n .option('--workspace <path>')\n .option('--repo <name>')\n .option('--force')\n .action(\n (opts: { workspace?: string; repo?: string; force?: boolean }) =>\n void withWorkspace(opts.workspace, async (db, workspaceId) => {\n const r = await indexWorkspace(db, workspaceId, {\n repo: opts.repo,\n force: Boolean(opts.force),\n });\n process.stdout.write(\n `Indexed ${r.indexedCount} repositories, skipped ${r.skippedCount}, ${r.fileCount} files, ${r.diagnosticCount} diagnostics\\n`,\n );\n }).catch(fail),\n );\n program\n .command('link')\n .option('--workspace <path>')\n .option('--force')\n .action(\n (opts: { workspace?: string }) =>\n void withWorkspace(opts.workspace, (db, workspaceId) => {\n const r = linkWorkspace(db, workspaceId);\n process.stdout.write(\n `Linked ${r.edgeCount} edges: ${r.remoteResolvedCount} remote operation calls resolved, ${r.localResolvedCount} local operation calls resolved, ${r.unresolvedCount} unresolved operation calls, ${r.ambiguousCount} ambiguous operation calls, ${r.dynamicCount} dynamic operation calls, ${r.terminalCount} terminal call edges, ${r.dependencyResolvedCount} dependency resolved, ${r.dependencyAmbiguousCount} dependency ambiguous, ${r.implementationResolvedCount} implementation resolved, ${r.implementationAmbiguousCount} implementation ambiguous, ${r.implementationUnresolvedCount} implementation unresolved\\n`,\n );\n }).catch(fail),\n );\n program\n .command('trace')\n .option('--workspace <path>')\n .option('--repo <name>')\n .option('--operation <name>')\n .option('--service <path>')\n .option('--path <operationPath>')\n .option('--handler <name>')\n .option('--depth <n>', 'trace depth', '25')\n .option('--format <format>', 'table|json|mermaid', 'table')\n .option('--include-external')\n .option('--include-db')\n .option('--include-async')\n .option('--var <key=value>', 'dynamic variable', collect, [])\n .action(\n (opts: {\n workspace?: string;\n repo?: string;\n operation?: string;\n service?: string;\n path?: string;\n handler?: string;\n depth: string;\n format: string;\n includeExternal?: boolean;\n includeDb?: boolean;\n includeAsync?: boolean;\n var: string[];\n }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) => {\n const result = trace(\n db,\n {\n repo: opts.repo,\n servicePath: opts.service,\n operation: opts.operation,\n operationPath: opts.path,\n handler: opts.handler,\n },\n {\n depth: Number(opts.depth),\n vars: parseVars(opts.var),\n includeExternal: Boolean(opts.includeExternal),\n includeDb: Boolean(opts.includeDb),\n includeAsync: Boolean(opts.includeAsync),\n },\n );\n process.stdout.write(\n opts.format === 'json'\n ? renderTraceJson(result)\n : opts.format === 'mermaid'\n ? renderMermaid(result)\n : renderTraceTable(result),\n );\n }).catch(fail),\n );\n const list = program.command('list');\n list\n .command('repos')\n .option('--workspace <path>')\n .action(\n (opts: { workspace?: string }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) =>\n process.stdout.write(\n renderJson(\n listRepositories(db).map((r) => ({\n name: r.name,\n kind: r.kind,\n packageName: r.package_name,\n })),\n ),\n ),\n ).catch(fail),\n );\n list\n .command('services')\n .option('--workspace <path>')\n .option('--repo <name>')\n .action(\n (opts: { workspace?: string; repo?: string }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) => {\n const repo = opts.repo ? repoByName(db, opts.repo) : undefined;\n if (opts.repo && !repo) {\n process.stdout.write(renderJson([{ severity: 'warning', code: 'selector_repo_not_found', message: `Repository selector not found: ${opts.repo}` }]));\n return;\n }\n const rows = db\n .prepare(\n 'SELECT r.name repo,s.service_path servicePath,s.qualified_name qualifiedName FROM cds_services s JOIN repositories r ON r.id=s.repo_id WHERE (? IS NULL OR s.repo_id=?) ORDER BY r.name,s.service_path',\n )\n .all(repo?.id, repo?.id);\n process.stdout.write(renderJson(rows));\n }).catch(fail),\n );\n list\n .command('operations')\n .option('--workspace <path>')\n .option('--repo <name>')\n .option('--service <path>')\n .action(\n (opts: { workspace?: string; repo?: string; service?: string }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) => {\n const repo = opts.repo ? repoByName(db, opts.repo) : undefined;\n if (opts.repo && !repo) {\n process.stdout.write(renderJson([{ severity: 'warning', code: 'selector_repo_not_found', message: `Repository selector not found: ${opts.repo}` }]));\n return;\n }\n const rows = db\n .prepare(\n 'SELECT r.name repo,s.service_path servicePath,o.operation_name operation,o.operation_path path FROM cds_operations o JOIN cds_services s ON s.id=o.service_id JOIN repositories r ON r.id=s.repo_id WHERE (? IS NULL OR s.repo_id=?) AND (? IS NULL OR s.service_path=?)',\n )\n .all(repo?.id, repo?.id, opts.service, opts.service);\n process.stdout.write(renderJson(rows));\n }).catch(fail),\n );\n list\n .command('calls')\n .option('--workspace <path>')\n .option('--repo <name>')\n .option('--operation <name>')\n .action(\n (opts: { workspace?: string; repo?: string; operation?: string }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) => {\n const repo = opts.repo ? repoByName(db, opts.repo) : undefined;\n if (opts.repo && !repo) {\n process.stdout.write(renderJson([{ severity: 'warning', code: 'selector_repo_not_found', message: `Repository selector not found: ${opts.repo}` }]));\n return;\n }\n const rows = db\n .prepare(\n 'SELECT r.name repo,c.call_type type,c.operation_path_expr path,c.source_file file,c.source_line line FROM outbound_calls c JOIN repositories r ON r.id=c.repo_id WHERE (? IS NULL OR c.repo_id=?) AND (? IS NULL OR c.operation_path_expr=? OR c.operation_path_expr=? OR c.payload_summary LIKE ?)',\n )\n .all(\n repo?.id,\n repo?.id,\n opts.operation,\n opts.operation,\n opts.operation ? `/${opts.operation}` : undefined,\n opts.operation ? `%${opts.operation}%` : undefined,\n );\n process.stdout.write(renderJson(rows));\n }).catch(fail),\n );\n program\n .command('graph')\n .option('--workspace <path>')\n .option('--repo <name>')\n .option('--operation <name>')\n .option('--service <path>')\n .option('--path <operationPath>')\n .option('--format <format>', 'mermaid|json', 'mermaid')\n .option('--var <key=value>', 'dynamic variable', collect, [])\n .action(\n (opts: {\n workspace?: string;\n repo?: string;\n operation?: string;\n service?: string;\n path?: string;\n format: string;\n var: string[];\n }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) => {\n const result = trace(\n db,\n {\n repo: opts.repo,\n operation: opts.operation,\n servicePath: opts.service,\n operationPath: opts.path,\n },\n {\n depth: 100,\n includeAsync: true,\n includeDb: true,\n includeExternal: true,\n vars: parseVars(opts.var),\n },\n );\n process.stdout.write(\n opts.format === 'json'\n ? renderTraceJson(result)\n : renderMermaid(result),\n );\n }).catch(fail),\n );\n const inspect = program.command('inspect');\n inspect\n .command('repo')\n .argument('<name>')\n .option('--workspace <path>')\n .action(\n (name: string, opts: { workspace?: string }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) =>\n process.stdout.write(\n renderJson(repoByName(db, name) ?? { error: 'repo not found' }),\n ),\n ).catch(fail),\n );\n inspect\n .command('operation')\n .argument('<selector>')\n .option('--workspace <path>')\n .action(\n (selector: string, opts: { workspace?: string }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) => {\n const rows = db\n .prepare(\n 'SELECT * FROM cds_operations WHERE operation_name=? OR operation_path=?',\n )\n .all(selector, selector);\n process.stdout.write(renderJson(rows));\n }).catch(fail),\n );\n program\n .command('doctor')\n .option('--workspace <path>')\n .option('--strict')\n .action(\n (opts: { workspace?: string; strict?: boolean }) =>\n void withReadOnlyWorkspace(opts.workspace, (db) => {\n const diagnostics = db\n .prepare(\n 'SELECT severity,code,message,source_file sourceFile,source_line sourceLine FROM diagnostics ORDER BY id',\n )\n .all() as Array<Record<string, unknown>>;\n const health = db\n .prepare(\n `SELECT 'info' severity,'entity_only_service' code,'CDS service has no action/function/event operations; this can be valid for entity-only services' message,s.source_file sourceFile,s.source_line sourceLine\n FROM cds_services s LEFT JOIN cds_operations o ON o.service_id=s.id WHERE o.id IS NULL AND ?\n UNION ALL\n SELECT 'warning','extend_service_unresolved_base','Extend service has no indexed local operations; verify base service resolution',s.source_file,s.source_line\n FROM cds_services s LEFT JOIN cds_operations o ON o.service_id=s.id WHERE o.id IS NULL AND s.is_extend=1 AND ?\n UNION ALL\n SELECT 'warning','handler_without_service','Repository has handlers but no CDS services',hc.source_file,hc.source_line\n FROM handler_classes hc JOIN repositories r ON r.id=hc.repo_id\n WHERE r.kind IN ('cap-service','mixed') AND NOT EXISTS (SELECT 1 FROM cds_services s WHERE s.repo_id=hc.repo_id)\n UNION ALL\n SELECT 'warning','search_index_empty','Search index is empty after indexing',NULL,NULL\n WHERE NOT EXISTS (SELECT 1 FROM search_index)\n UNION ALL\n SELECT 'error','foreign_key_violation','SQLite foreign_key_check reported integrity failures',NULL,NULL\n WHERE EXISTS (SELECT 1 FROM pragma_foreign_key_check)\n UNION ALL\n SELECT 'warning','legacy_schema_weaker_foreign_keys','Legacy table lacks fresh-schema foreign-key metadata; rebuild the database or re-run init/index in a new database',NULL,NULL\n WHERE (SELECT COUNT(*) FROM pragma_foreign_key_list('graph_edges'))=0 OR (SELECT COUNT(*) FROM pragma_foreign_key_list('index_runs'))=0 OR (SELECT COUNT(*) FROM pragma_foreign_key_list('diagnostics'))=0\n UNION ALL\n SELECT 'warning','implementation_candidates_rejected','Implementation candidates were rejected for ' || s.service_path || o.operation_path,o.source_file,o.source_line\n FROM graph_edges e\n JOIN cds_operations o ON o.id=CAST(e.from_id AS INTEGER)\n JOIN cds_services s ON s.id=o.service_id\n WHERE e.edge_type='OPERATION_IMPLEMENTED_BY_HANDLER' AND e.status='unresolved' AND (? OR EXISTS (SELECT 1 FROM graph_edges remote WHERE remote.edge_type='REMOTE_CALL_RESOLVES_TO_OPERATION' AND remote.to_kind='operation' AND remote.to_id=e.from_id))\n UNION ALL\n SELECT 'warning','remote_target_without_implementation','Remote target operation has no implementation edge: ' || s.service_path || o.operation_path,o.source_file,o.source_line\n FROM graph_edges remote\n JOIN cds_operations o ON o.id=CAST(remote.to_id AS INTEGER)\n JOIN cds_services s ON s.id=o.service_id\n WHERE remote.edge_type='REMOTE_CALL_RESOLVES_TO_OPERATION' AND remote.to_kind='operation' AND NOT EXISTS (SELECT 1 FROM graph_edges impl WHERE impl.edge_type='OPERATION_IMPLEMENTED_BY_HANDLER' AND impl.from_kind='operation' AND impl.from_id=remote.to_id) AND ?\n UNION ALL\n SELECT CASE WHEN ? THEN 'warning' ELSE 'error' END,'local_service_calls_all_unresolved','All local service calls are unresolved; verify local service alias parsing and linking',NULL,NULL\n WHERE EXISTS (SELECT 1 FROM outbound_calls WHERE call_type='local_service_call') AND NOT EXISTS (SELECT 1 FROM graph_edges e JOIN outbound_calls c ON e.from_kind='call' AND c.id=CAST(e.from_id AS INTEGER) WHERE c.call_type='local_service_call' AND e.status='resolved')\n UNION ALL\n SELECT 'error','local_service_accessor_misclassified','Entity accessor calls were indexed as /entities operations',source_file,source_line\n FROM outbound_calls WHERE call_type='local_service_call' AND operation_path_expr='/entities' AND (? OR 1)\n UNION ALL\n SELECT 'warning','outbound_calls_without_source_symbol','Outbound calls lack source symbol ownership: ' || COUNT(*),NULL,NULL\n FROM outbound_calls WHERE source_symbol_id IS NULL AND ? HAVING COUNT(*) >= 1\n UNION ALL\n SELECT 'warning','trace_scope_fell_back_to_file','Trace may fall back to source-file scope for calls without symbols',NULL,NULL\n WHERE EXISTS (SELECT 1 FROM outbound_calls WHERE source_symbol_id IS NULL) AND ?\n UNION ALL\n SELECT 'warning','graph_stale','Graph is stale after repository fact changes; run service-flow link',NULL,NULL\n WHERE EXISTS (SELECT 1 FROM repositories WHERE graph_stale_reason IS NOT NULL)\n UNION ALL\n SELECT 'warning','index_run_abandoned','Index run ' || id || ' started at ' || started_at || ' is still running after the 60 minute abandonment threshold',NULL,NULL\n FROM index_runs WHERE status='running' AND datetime(started_at) < datetime('now','-60 minutes')`,\n )\n .all(Boolean(opts.strict), Boolean(opts.strict), Boolean(opts.strict), Boolean(opts.strict), Boolean(opts.strict), Boolean(opts.strict), Boolean(opts.strict), Boolean(opts.strict)) as Array<Record<string, unknown>>;\n const localServiceHealth = localServiceDiagnostics(db, Boolean(opts.strict));\n const parserQualityHealth = parserQualityDiagnostics(db, Boolean(opts.strict));\n const allDiagnostics = [...diagnostics, ...health, ...localServiceHealth, ...parserQualityHealth];\n process.stdout.write(\n allDiagnostics.length\n ? renderJson(allDiagnostics)\n : `${pc.green('No diagnostics recorded')}\\n`,\n );\n }).catch(fail),\n );\n program\n .command('clean')\n .option('--workspace <path>')\n .option('--db-only')\n .action(\n (opts: { workspace?: string; dbOnly?: boolean }) =>\n void (async () => {\n const config = await loadWorkspaceConfig(opts.workspace);\n const dbDir = path.resolve(path.dirname(config.dbPath));\n const workspaceRoot = path.resolve(config.rootPath);\n await fs.rm(config.dbPath, { force: true });\n if (!opts.dbOnly) {\n const marker = path.join(dbDir, '.service-flow-state');\n const dangerous = new Set([\n path.parse(dbDir).root,\n '/tmp',\n process.env.HOME ? path.resolve(process.env.HOME) : '',\n workspaceRoot,\n ]);\n let ownsState: boolean;\n try {\n ownsState = (await fs.stat(marker)).isFile();\n } catch {\n ownsState = false;\n }\n if (!ownsState || dangerous.has(dbDir))\n throw new Error(\n `Refusing to recursively delete unowned or dangerous state directory: ${dbDir}. Use --db-only to remove only the database file.`,\n );\n await fs.rm(dbDir, { recursive: true, force: true });\n }\n process.stdout.write('Cleaned service-flow state\\n');\n })().catch(fail),\n );\n return program;\n}\nfunction collect(value: string, previous: string[]): string[] {\n previous.push(value);\n return previous;\n}\nfunction fail(error: unknown): void {\n process.stderr.write(\n `${error instanceof Error ? error.message : String(error)}\\n`,\n );\n process.exitCode = 1;\n}\ncreateProgram().parse(process.argv);\n","export const DEFAULT_IGNORES = [\n 'node_modules',\n 'gen',\n 'dist',\n 'coverage',\n '.git',\n '.turbo',\n '.next',\n '.cache',\n '.service-flow'\n] as const;\nexport const CONFIG_DIR = '.service-flow';\nexport const CONFIG_FILE = 'config.json';\nexport const DEFAULT_DB_FILE = 'service-flow.db';\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport {\n CONFIG_DIR,\n CONFIG_FILE,\n DEFAULT_DB_FILE,\n DEFAULT_IGNORES,\n} from './defaults.js';\nconst schema = z.object({\n rootPath: z.string(),\n dbPath: z.string(),\n ignore: z.array(z.string()),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\nexport type WorkspaceConfig = z.infer<typeof schema>;\nexport function configPath(rootPath: string): string {\n return path.join(rootPath, CONFIG_DIR, CONFIG_FILE);\n}\nexport function defaultDbPath(rootPath: string): string {\n return path.join(rootPath, CONFIG_DIR, DEFAULT_DB_FILE);\n}\nexport async function saveWorkspaceConfig(\n config: WorkspaceConfig,\n): Promise<void> {\n await fs.mkdir(path.dirname(configPath(config.rootPath)), {\n recursive: true,\n });\n await fs.writeFile(\n configPath(config.rootPath),\n `${JSON.stringify(config, null, 2)}\\n`,\n );\n if (path.dirname(config.dbPath) === path.dirname(configPath(config.rootPath)))\n await fs.writeFile(\n path.join(path.dirname(config.dbPath), '.service-flow-state'),\n 'service-flow\\n',\n );\n}\nexport async function loadWorkspaceConfig(\n workspace?: string,\n): Promise<WorkspaceConfig> {\n const root = path.resolve(workspace ?? process.cwd());\n const data = await fs.readFile(configPath(root), 'utf8');\n return schema.parse(JSON.parse(data) as unknown);\n}\nexport function createWorkspaceConfig(\n rootPath: string,\n dbPath?: string,\n ignore: string[] = [...DEFAULT_IGNORES],\n): WorkspaceConfig {\n const now = new Date().toISOString();\n const root = path.resolve(rootPath);\n return {\n rootPath: root,\n dbPath: path.resolve(dbPath ?? defaultDbPath(root)),\n ignore,\n createdAt: now,\n updatedAt: now,\n };\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { migrate } from './migrations.js';\nimport { VERSION } from '../version.js';\n\ntype SqlValue = string | number | bigint | Buffer | null | undefined;\ninterface NativeStatement {\n run: (...params: SqlValue[]) => { changes: number };\n get: (...params: SqlValue[]) => Record<string, unknown> | undefined;\n all: (...params: SqlValue[]) => Array<Record<string, unknown>>;\n}\ninterface NativeDatabase {\n exec: (sql: string) => void;\n prepare: (sql: string) => NativeStatement;\n close: () => void;\n}\ninterface NodeSqliteModule {\n DatabaseSync: new (location: string, options?: { open?: boolean; readOnly?: boolean }) => NativeDatabase;\n}\n\nlet sqliteWarningFilterInstalled = false;\nfunction installSqliteWarningFilter(): void {\n if (sqliteWarningFilterInstalled) return;\n sqliteWarningFilterInstalled = true;\n const original = process.emitWarning.bind(process);\n process.emitWarning = ((warning: string | Error, ...args: unknown[]): void => {\n const text = warning instanceof Error ? warning.message : String(warning);\n if (text.includes('SQLite is an experimental feature')) return;\n Reflect.apply(original, process, [warning, ...args]);\n }) as typeof process.emitWarning;\n}\nexport interface Statement {\n run: (...params: unknown[]) => { changes: number };\n get: (...params: unknown[]) => Record<string, unknown> | undefined;\n all: (...params: unknown[]) => Array<Record<string, unknown>>;\n}\nexport interface Db {\n path: string;\n readonly: boolean;\n exec: (sql: string) => void;\n prepare: (sql: string) => Statement;\n pragma: (sql: string) => Array<Record<string, unknown>>;\n transaction: <T>(fn: () => T) => T;\n close: () => void;\n}\nexport interface OpenDatabaseOptions {\n readonly?: boolean;\n migrate?: boolean;\n}\nfunction loadSqlite(): NodeSqliteModule {\n try {\n installSqliteWarningFilter();\n const moduleValue = process.getBuiltinModule('node:sqlite') as unknown;\n if (!moduleValue || typeof moduleValue !== 'object' || !('DatabaseSync' in moduleValue))\n throw new Error('node:sqlite DatabaseSync is unavailable');\n const sqlite = moduleValue as NodeSqliteModule;\n if (typeof sqlite.DatabaseSync !== 'function')\n throw new Error('node:sqlite DatabaseSync is not a constructor');\n return sqlite;\n } catch (error) {\n throw new Error(\n `service-flow ${VERSION} requires Node.js >=24 with node:sqlite DatabaseSync support. Upgrade Node.js or install a service-flow build with a compatible SQLite driver.`,\n { cause: error },\n );\n }\n}\nfunction bindParams(params: unknown[]): SqlValue[] {\n return params.map((param) => {\n if (param === undefined || param === null) return null;\n if (typeof param === 'string' || typeof param === 'number' || typeof param === 'bigint' || Buffer.isBuffer(param)) return param;\n if (typeof param === 'boolean') return param ? 1 : 0;\n return JSON.stringify(param);\n });\n}\nexport function openDatabase(dbPath: string, options: OpenDatabaseOptions = {}): Db {\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n const sqlite = loadSqlite();\n const native = new sqlite.DatabaseSync(dbPath, { readOnly: Boolean(options.readonly) });\n let inTransaction = false;\n const db: Db = {\n path: dbPath,\n readonly: Boolean(options.readonly),\n exec(sql: string): void {\n native.exec(sql);\n },\n prepare(sql: string): Statement {\n const statement = native.prepare(sql);\n return {\n run: (...params: unknown[]) => statement.run(...bindParams(params)),\n get: (...params: unknown[]) => statement.get(...bindParams(params)),\n all: (...params: unknown[]) => statement.all(...bindParams(params)),\n };\n },\n pragma(sql: string): Array<Record<string, unknown>> {\n const normalized = sql.trim().replace(/;$/, '');\n if (/=/.test(normalized)) {\n native.exec(`PRAGMA ${normalized}`);\n return [];\n }\n return native.prepare(`PRAGMA ${normalized}`).all();\n },\n transaction<T>(fn: () => T): T {\n if (inTransaction) return fn();\n inTransaction = true;\n native.exec('BEGIN IMMEDIATE');\n try {\n const result = fn();\n native.exec('COMMIT');\n return result;\n } catch (error) {\n native.exec('ROLLBACK');\n throw error;\n } finally {\n inTransaction = false;\n }\n },\n close(): void {\n native.close();\n },\n };\n db.pragma('busy_timeout = 10000');\n db.pragma('foreign_keys = ON');\n if (!options.readonly) {\n db.pragma('journal_mode = WAL');\n if (options.migrate !== false) migrate(db);\n }\n return db;\n}\nexport function openReadOnlyDatabase(dbPath: string): Db {\n return openDatabase(dbPath, { readonly: true, migrate: false });\n}\n","export const schemaSql = `\nCREATE TABLE IF NOT EXISTS workspaces (id INTEGER PRIMARY KEY, root_path TEXT UNIQUE NOT NULL, db_path TEXT NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL);\nCREATE TABLE IF NOT EXISTS repositories (id INTEGER PRIMARY KEY, workspace_id INTEGER NOT NULL, name TEXT NOT NULL, absolute_path TEXT NOT NULL, relative_path TEXT NOT NULL, package_name TEXT, package_version TEXT, dependencies_json TEXT DEFAULT '{}', kind TEXT NOT NULL, is_git_repo INTEGER NOT NULL, last_indexed_at TEXT, index_status TEXT DEFAULT 'pending', error_count INTEGER DEFAULT 0, fingerprint TEXT, fact_generation INTEGER NOT NULL DEFAULT 0, graph_generation INTEGER NOT NULL DEFAULT 0, graph_stale_reason TEXT, graph_stale_at TEXT, UNIQUE(workspace_id, absolute_path), FOREIGN KEY(workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS files (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, relative_path TEXT NOT NULL, extension TEXT NOT NULL, sha256 TEXT NOT NULL, size_bytes INTEGER NOT NULL, last_indexed_at TEXT NOT NULL, UNIQUE(repo_id, relative_path), FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS cds_requires (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, alias TEXT NOT NULL, kind TEXT, model TEXT, destination TEXT, service_path TEXT, request_timeout INTEGER, raw_json TEXT NOT NULL, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS cds_services (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, namespace TEXT, service_name TEXT NOT NULL, qualified_name TEXT NOT NULL, service_path TEXT NOT NULL, is_extend INTEGER NOT NULL, source_file TEXT NOT NULL, source_line INTEGER NOT NULL, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS cds_operations (id INTEGER PRIMARY KEY, service_id INTEGER NOT NULL, operation_type TEXT NOT NULL, operation_name TEXT NOT NULL, operation_path TEXT NOT NULL, params_json TEXT NOT NULL, return_type TEXT, source_file TEXT NOT NULL, source_line INTEGER NOT NULL, FOREIGN KEY(service_id) REFERENCES cds_services(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS symbols (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, file_id INTEGER, kind TEXT NOT NULL, name TEXT NOT NULL, qualified_name TEXT NOT NULL, exported INTEGER NOT NULL, start_line INTEGER NOT NULL, end_line INTEGER NOT NULL, start_offset INTEGER, end_offset INTEGER, source_file TEXT, exported_name TEXT, evidence_json TEXT, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE, FOREIGN KEY(file_id) REFERENCES files(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS handler_classes (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, symbol_id INTEGER, class_name TEXT NOT NULL, source_file TEXT NOT NULL, source_line INTEGER NOT NULL, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE, FOREIGN KEY(symbol_id) REFERENCES symbols(id) ON DELETE SET NULL);\nCREATE TABLE IF NOT EXISTS handler_methods (id INTEGER PRIMARY KEY, handler_class_id INTEGER NOT NULL, method_name TEXT NOT NULL, decorator_kind TEXT NOT NULL, decorator_value TEXT, decorator_raw_expression TEXT NOT NULL, source_file TEXT NOT NULL, source_line INTEGER NOT NULL, FOREIGN KEY(handler_class_id) REFERENCES handler_classes(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS handler_registrations (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, handler_class_id INTEGER, class_name TEXT, import_source TEXT, registration_file TEXT NOT NULL, registration_line INTEGER NOT NULL, registration_kind TEXT NOT NULL, confidence REAL NOT NULL, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE, FOREIGN KEY(handler_class_id) REFERENCES handler_classes(id) ON DELETE SET NULL);\nCREATE TABLE IF NOT EXISTS service_bindings (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, symbol_id INTEGER, variable_name TEXT NOT NULL, alias TEXT, alias_expr TEXT, destination_expr TEXT, service_path_expr TEXT, is_dynamic INTEGER NOT NULL, placeholders_json TEXT NOT NULL, source_file TEXT NOT NULL, source_line INTEGER NOT NULL, helper_chain_json TEXT, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE, FOREIGN KEY(symbol_id) REFERENCES symbols(id) ON DELETE SET NULL);\nCREATE TABLE IF NOT EXISTS outbound_calls (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, source_symbol_id INTEGER, call_type TEXT NOT NULL, service_binding_id INTEGER, method TEXT, operation_path_expr TEXT, query_entity TEXT, event_name_expr TEXT, payload_summary TEXT, source_file TEXT NOT NULL, source_line INTEGER NOT NULL, confidence REAL NOT NULL, unresolved_reason TEXT, local_service_name TEXT, local_service_lookup TEXT, alias_chain_json TEXT, evidence_json TEXT, external_target_kind TEXT, external_target_id TEXT, external_target_label TEXT, external_target_dynamic INTEGER NOT NULL DEFAULT 0, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE, FOREIGN KEY(source_symbol_id) REFERENCES symbols(id) ON DELETE SET NULL, FOREIGN KEY(service_binding_id) REFERENCES service_bindings(id) ON DELETE SET NULL);\nCREATE TABLE IF NOT EXISTS symbol_calls (id INTEGER PRIMARY KEY, repo_id INTEGER NOT NULL, caller_symbol_id INTEGER NOT NULL, callee_symbol_id INTEGER, callee_expression TEXT NOT NULL, import_source TEXT, source_file TEXT NOT NULL, source_line INTEGER NOT NULL, status TEXT NOT NULL, confidence REAL NOT NULL, evidence_json TEXT NOT NULL, unresolved_reason TEXT, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE, FOREIGN KEY(caller_symbol_id) REFERENCES symbols(id) ON DELETE CASCADE, FOREIGN KEY(callee_symbol_id) REFERENCES symbols(id) ON DELETE SET NULL);\nCREATE TABLE IF NOT EXISTS graph_edges (id INTEGER PRIMARY KEY, workspace_id INTEGER NOT NULL, edge_type TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'unresolved', from_kind TEXT NOT NULL, from_id TEXT NOT NULL, to_kind TEXT NOT NULL, to_id TEXT NOT NULL, confidence REAL NOT NULL, evidence_json TEXT NOT NULL, is_dynamic INTEGER NOT NULL, unresolved_reason TEXT, generation INTEGER NOT NULL DEFAULT 0, FOREIGN KEY(workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS index_runs (id INTEGER PRIMARY KEY, workspace_id INTEGER NOT NULL, started_at TEXT NOT NULL, finished_at TEXT, status TEXT NOT NULL, repo_count INTEGER NOT NULL, file_count INTEGER NOT NULL, diagnostic_count INTEGER NOT NULL, error_message TEXT, FOREIGN KEY(workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS diagnostics (id INTEGER PRIMARY KEY, repo_id INTEGER, file_id INTEGER, severity TEXT NOT NULL, code TEXT NOT NULL, message TEXT NOT NULL, source_file TEXT, source_line INTEGER, FOREIGN KEY(repo_id) REFERENCES repositories(id) ON DELETE CASCADE, FOREIGN KEY(file_id) REFERENCES files(id) ON DELETE SET NULL);\nCREATE INDEX IF NOT EXISTS idx_repo_name ON repositories(name);\nCREATE INDEX IF NOT EXISTS idx_service_path ON cds_services(service_path);\nCREATE INDEX IF NOT EXISTS idx_operation_name ON cds_operations(operation_name, operation_path);\nCREATE INDEX IF NOT EXISTS idx_calls_repo ON outbound_calls(repo_id, call_type);\nCREATE INDEX IF NOT EXISTS idx_symbol_calls_caller ON symbol_calls(repo_id, caller_symbol_id);\nCREATE VIRTUAL TABLE IF NOT EXISTS search_index USING fts5(kind, name, path, repo);\n`;\n","import type { Db } from './connection.js';\nimport { schemaSql } from './schema.js';\nconst CURRENT_SCHEMA_VERSION = 6;\nconst columns: Record<string, Array<{ name: string; ddl: string }>> = {\n service_bindings: [\n { name: 'helper_chain_json', ddl: 'ALTER TABLE service_bindings ADD COLUMN helper_chain_json TEXT' },\n { name: 'alias_expr', ddl: 'ALTER TABLE service_bindings ADD COLUMN alias_expr TEXT' },\n ],\n repositories: [\n { name: 'fingerprint', ddl: 'ALTER TABLE repositories ADD COLUMN fingerprint TEXT' },\n { name: 'fact_generation', ddl: 'ALTER TABLE repositories ADD COLUMN fact_generation INTEGER NOT NULL DEFAULT 0' },\n { name: 'graph_generation', ddl: 'ALTER TABLE repositories ADD COLUMN graph_generation INTEGER NOT NULL DEFAULT 0' },\n { name: 'graph_stale_reason', ddl: 'ALTER TABLE repositories ADD COLUMN graph_stale_reason TEXT' },\n { name: 'graph_stale_at', ddl: 'ALTER TABLE repositories ADD COLUMN graph_stale_at TEXT' },\n ],\n graph_edges: [\n { name: 'status', ddl: \"ALTER TABLE graph_edges ADD COLUMN status TEXT NOT NULL DEFAULT 'unresolved'\" },\n { name: 'generation', ddl: 'ALTER TABLE graph_edges ADD COLUMN generation INTEGER NOT NULL DEFAULT 0' },\n ],\n handler_registrations: [\n { name: 'class_name', ddl: 'ALTER TABLE handler_registrations ADD COLUMN class_name TEXT' },\n { name: 'import_source', ddl: 'ALTER TABLE handler_registrations ADD COLUMN import_source TEXT' },\n ],\n symbols: [\n { name: 'start_offset', ddl: 'ALTER TABLE symbols ADD COLUMN start_offset INTEGER' },\n { name: 'end_offset', ddl: 'ALTER TABLE symbols ADD COLUMN end_offset INTEGER' },\n { name: 'source_file', ddl: 'ALTER TABLE symbols ADD COLUMN source_file TEXT' },\n { name: 'exported_name', ddl: 'ALTER TABLE symbols ADD COLUMN exported_name TEXT' },\n { name: 'evidence_json', ddl: 'ALTER TABLE symbols ADD COLUMN evidence_json TEXT' },\n ],\n outbound_calls: [\n { name: 'local_service_name', ddl: 'ALTER TABLE outbound_calls ADD COLUMN local_service_name TEXT' },\n { name: 'local_service_lookup', ddl: 'ALTER TABLE outbound_calls ADD COLUMN local_service_lookup TEXT' },\n { name: 'alias_chain_json', ddl: 'ALTER TABLE outbound_calls ADD COLUMN alias_chain_json TEXT' },\n { name: 'evidence_json', ddl: 'ALTER TABLE outbound_calls ADD COLUMN evidence_json TEXT' },\n { name: 'external_target_kind', ddl: 'ALTER TABLE outbound_calls ADD COLUMN external_target_kind TEXT' },\n { name: 'external_target_id', ddl: 'ALTER TABLE outbound_calls ADD COLUMN external_target_id TEXT' },\n { name: 'external_target_label', ddl: 'ALTER TABLE outbound_calls ADD COLUMN external_target_label TEXT' },\n { name: 'external_target_dynamic', ddl: 'ALTER TABLE outbound_calls ADD COLUMN external_target_dynamic INTEGER NOT NULL DEFAULT 0' },\n ],\n index_runs: [\n { name: 'error_message', ddl: 'ALTER TABLE index_runs ADD COLUMN error_message TEXT' },\n ],\n};\nfunction hasColumn(db: Db, table: string, column: string): boolean {\n return (db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name?: string }>).some((row) => row.name === column);\n}\nfunction userVersion(db: Db): number {\n const row = db.pragma('user_version')[0] as { user_version?: number } | undefined;\n return Number(row?.user_version ?? 0);\n}\nfunction addMissingColumns(db: Db): void {\n for (const [table, tableColumns] of Object.entries(columns)) {\n for (const column of tableColumns) {\n if (!hasColumn(db, table, column.name)) db.prepare(column.ddl).run();\n }\n }\n}\nfunction normalizeLegacyStatus(db: Db): void {\n db.prepare(\"UPDATE graph_edges SET status=CASE WHEN edge_type='REMOTE_CALL_RESOLVES_TO_OPERATION' THEN 'resolved' WHEN edge_type IN ('HANDLER_RUNS_DB_QUERY','HANDLER_CALLS_EXTERNAL_HTTP','HANDLER_EMITS_EVENT','EVENT_CONSUMED_BY_HANDLER') THEN 'terminal' WHEN edge_type='DYNAMIC_EDGE_CANDIDATE' THEN 'dynamic' WHEN status='ambiguous' THEN 'ambiguous' ELSE status END\").run();\n db.prepare(\"UPDATE repositories SET graph_stale_reason='schema_migration_requires_relink', graph_stale_at=COALESCE(graph_stale_at, datetime('now')) WHERE EXISTS (SELECT 1 FROM graph_edges WHERE graph_edges.workspace_id=repositories.workspace_id) AND graph_generation=0\").run();\n}\nexport function migrate(db: Db): void {\n db.transaction(() => {\n const version = userVersion(db);\n if (version > CURRENT_SCHEMA_VERSION) throw new Error(`Unsupported future service-flow schema version ${version}`);\n db.exec(schemaSql);\n addMissingColumns(db);\n normalizeLegacyStatus(db);\n const violations = db.pragma('foreign_key_check');\n if (violations.length > 0) throw new Error('SQLite foreign_key_check failed during migration');\n db.pragma(`user_version = ${CURRENT_SCHEMA_VERSION}`);\n });\n}\nexport function schemaVersion(db: Db): number {\n return userVersion(db);\n}\nexport function foreignKeyViolations(db: Db): Array<Record<string, unknown>> {\n return db.pragma('foreign_key_check');\n}\n","{\n \"name\": \"@saptools/service-flow\",\n \"version\": \"0.1.32\",\n \"description\": \"Trace SAP CAP service-to-service flows across multi-repository workspaces with runtime-aware graph resolution\",\n \"type\": \"module\",\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"bin\": {\n \"service-flow\": \"dist/cli.js\"\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"CHANGELOG.md\",\n \"README.md\",\n \"TECHNICAL-NOTE.md\",\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=24.0.0\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint src tests\",\n \"test\": \"vitest run tests/unit\",\n \"test:unit\": \"vitest run tests/unit\",\n \"test:e2e\": \"vitest run tests/e2e\",\n \"test:e2e:fake\": \"vitest run tests/e2e\"\n },\n \"keywords\": [\n \"sap\",\n \"cap\",\n \"cds\",\n \"btp\",\n \"cli\",\n \"service-graph\",\n \"call-graph\",\n \"sqlite\",\n \"saptools\"\n ],\n \"author\": \"Dong Tran\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/dongitran/saptools.git\",\n \"directory\": \"packages/service-flow\"\n },\n \"homepage\": \"https://github.com/dongitran/saptools/tree/main/packages/service-flow#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/dongitran/saptools/issues\"\n },\n \"dependencies\": {\n \"commander\": \"13.1.0\",\n \"picocolors\": \"1.1.1\",\n \"typescript\": \"5.9.3\",\n \"zod\": \"4.4.3\"\n },\n \"devDependencies\": {\n \"@vitest/coverage-v8\": \"3.2.4\",\n \"tsup\": \"8.5.1\",\n \"vitest\": \"3.2.4\"\n }\n}\n","import packageJson from '../package.json' with { type: 'json' };\n\nexport const VERSION = packageJson.version;\nexport const ANALYZER_VERSION = packageJson.version;\n","import type { Db } from './connection.js';\nimport type {\n CdsRequire,\n CdsServiceFact,\n HandlerClassFact,\n HandlerRegistrationFact,\n OutboundCallFact,\n ServiceBindingFact,\n ExecutableSymbolFact,\n SymbolCallFact,\n} from '../types.js';\nexport interface RepoRow {\n id: number;\n name: string;\n absolute_path: string;\n relative_path: string;\n package_name: string | null;\n package_version: string | null;\n dependencies_json: string;\n kind: string;\n fingerprint?: string | null;\n fact_generation?: number;\n graph_generation?: number;\n graph_stale_reason?: string | null;\n}\nexport interface WorkspaceRow {\n id: number;\n root_path: string;\n db_path: string;\n}\nexport function upsertWorkspace(\n db: Db,\n rootPath: string,\n dbPath: string,\n): number {\n const now = new Date().toISOString();\n db.prepare(\n 'INSERT INTO workspaces(root_path,db_path,created_at,updated_at) VALUES(?,?,?,?) ON CONFLICT(root_path) DO UPDATE SET db_path=excluded.db_path,updated_at=excluded.updated_at',\n ).run(rootPath, dbPath, now, now);\n return Number(\n db.prepare('SELECT id FROM workspaces WHERE root_path=?').get(rootPath)?.id,\n );\n}\nexport function getWorkspace(\n db: Db,\n rootPath: string,\n): WorkspaceRow | undefined {\n return db\n .prepare('SELECT * FROM workspaces WHERE root_path=?')\n .get(rootPath) as WorkspaceRow | undefined;\n}\nexport function upsertRepository(\n db: Db,\n workspaceId: number,\n r: {\n name: string;\n absolutePath: string;\n relativePath: string;\n isGitRepo: boolean;\n packageName?: string;\n packageVersion?: string;\n dependencies?: Record<string, string>;\n kind?: string;\n },\n): number {\n db.prepare(\n `INSERT INTO repositories(workspace_id,name,absolute_path,relative_path,package_name,package_version,dependencies_json,kind,is_git_repo) VALUES(?,?,?,?,?,?,?,?,?) ON CONFLICT(workspace_id,absolute_path) DO UPDATE SET name=excluded.name,relative_path=excluded.relative_path,package_name=excluded.package_name,package_version=excluded.package_version,dependencies_json=excluded.dependencies_json,kind=excluded.kind`,\n ).run(\n workspaceId,\n r.name,\n r.absolutePath,\n r.relativePath,\n r.packageName,\n r.packageVersion,\n JSON.stringify(r.dependencies ?? {}),\n r.kind ?? 'unknown',\n r.isGitRepo ? 1 : 0,\n );\n return Number(\n db\n .prepare(\n 'SELECT id FROM repositories WHERE workspace_id=? AND absolute_path=?',\n )\n .get(workspaceId, r.absolutePath)?.id,\n );\n}\nexport function listRepositories(db: Db): RepoRow[] {\n return db\n .prepare('SELECT * FROM repositories ORDER BY name')\n .all() as unknown as RepoRow[];\n}\nexport function repoByName(db: Db, name: string): RepoRow | undefined {\n return db\n .prepare('SELECT * FROM repositories WHERE name=? OR package_name=?')\n .get(name, name) as RepoRow | undefined;\n}\nexport function clearRepoFacts(db: Db, repoId: number): void {\n for (const t of [\n 'cds_requires',\n 'cds_services',\n 'handler_classes',\n 'outbound_calls',\n 'symbol_calls',\n 'handler_registrations',\n 'service_bindings',\n 'symbols',\n 'diagnostics',\n 'files',\n ])\n db.prepare(`DELETE FROM ${t} WHERE repo_id=?`).run(repoId);\n db.prepare('DELETE FROM search_index WHERE repo=?').run(String(repoId));\n}\nexport function insertRequires(\n db: Db,\n repoId: number,\n rows: CdsRequire[],\n): void {\n const stmt = db.prepare(\n 'INSERT INTO cds_requires(repo_id,alias,kind,model,destination,service_path,request_timeout,raw_json) VALUES(?,?,?,?,?,?,?,?)',\n );\n for (const r of rows)\n stmt.run(\n repoId,\n r.alias,\n r.kind,\n r.model,\n r.destination,\n r.servicePath,\n r.requestTimeout,\n r.rawJson,\n );\n}\nexport function insertService(\n db: Db,\n repoId: number,\n s: CdsServiceFact,\n): number {\n const id = Number(\n db\n .prepare(\n 'INSERT INTO cds_services(repo_id,namespace,service_name,qualified_name,service_path,is_extend,source_file,source_line) VALUES(?,?,?,?,?,?,?,?) RETURNING id',\n )\n .get(\n repoId,\n s.namespace,\n s.serviceName,\n s.qualifiedName,\n s.servicePath,\n s.isExtend ? 1 : 0,\n s.sourceFile,\n s.sourceLine,\n )?.id,\n );\n const stmt = db.prepare(\n 'INSERT INTO cds_operations(service_id,operation_type,operation_name,operation_path,params_json,return_type,source_file,source_line) VALUES(?,?,?,?,?,?,?,?)',\n );\n db.prepare(\n 'INSERT INTO search_index(kind,name,path,repo) VALUES(?,?,?,?)',\n ).run('service', s.qualifiedName, s.servicePath, String(repoId));\n for (const o of s.operations)\n stmt.run(\n id,\n o.operationType,\n o.operationName,\n o.operationPath,\n o.paramsJson,\n o.returnType,\n o.sourceFile,\n o.sourceLine,\n );\n const search = db.prepare(\n 'INSERT INTO search_index(kind,name,path,repo) VALUES(?,?,?,?)',\n );\n for (const o of s.operations)\n search.run('operation', o.operationName, o.operationPath, String(repoId));\n return id;\n}\nexport function insertHandler(\n db: Db,\n repoId: number,\n h: HandlerClassFact,\n): number {\n const sid = Number(\n db\n .prepare(\n 'INSERT INTO symbols(repo_id,kind,name,qualified_name,exported,start_line,end_line) VALUES(?,?,?,?,?,?,?) RETURNING id',\n )\n .get(\n repoId,\n 'class',\n h.className,\n h.className,\n 1,\n h.sourceLine,\n h.sourceLine,\n )?.id,\n );\n const hid = Number(\n db\n .prepare(\n 'INSERT INTO handler_classes(repo_id,symbol_id,class_name,source_file,source_line) VALUES(?,?,?,?,?) RETURNING id',\n )\n .get(repoId, sid, h.className, h.sourceFile, h.sourceLine)?.id,\n );\n const stmt = db.prepare(\n 'INSERT INTO handler_methods(handler_class_id,method_name,decorator_kind,decorator_value,decorator_raw_expression,source_file,source_line) VALUES(?,?,?,?,?,?,?)',\n );\n for (const m of h.methods)\n stmt.run(\n hid,\n m.methodName,\n m.decoratorKind,\n m.decoratorValue,\n m.decoratorRawExpression,\n m.sourceFile,\n m.sourceLine,\n );\n return hid;\n}\nexport function insertRegistrations(\n db: Db,\n repoId: number,\n rows: HandlerRegistrationFact[],\n): void {\n const stmt = db.prepare(\n 'INSERT INTO handler_registrations(repo_id,handler_class_id,class_name,import_source,registration_file,registration_line,registration_kind,confidence) VALUES(?,?,?,?,?,?,?,?)',\n );\n for (const r of rows) {\n const handlerClass = r.className\n ? (db\n .prepare(\n 'SELECT id FROM handler_classes WHERE repo_id=? AND class_name=? ORDER BY id',\n )\n .all(repoId, r.className) as Array<{ id: number }>)\n : [];\n stmt.run(\n repoId,\n handlerClass.length === 1 ? handlerClass[0]?.id : null,\n r.className,\n r.importSource,\n r.registrationFile,\n r.registrationLine,\n r.registrationKind,\n r.confidence,\n );\n }\n}\nexport function insertBindings(\n db: Db,\n repoId: number,\n rows: ServiceBindingFact[],\n): void {\n const stmt = db.prepare(\n 'INSERT INTO service_bindings(repo_id,variable_name,alias,alias_expr,destination_expr,service_path_expr,is_dynamic,placeholders_json,source_file,source_line,helper_chain_json) VALUES(?,?,?,?,?,?,?,?,?,?,?)',\n );\n for (const r of rows)\n stmt.run(\n repoId,\n r.variableName,\n r.alias,\n r.aliasExpr,\n r.destinationExpr,\n r.servicePathExpr,\n r.isDynamic ? 1 : 0,\n JSON.stringify(r.placeholders),\n r.sourceFile,\n r.sourceLine,\n r.helperChain ? JSON.stringify(r.helperChain) : null,\n );\n}\nexport function insertExecutableSymbols(db: Db, repoId: number, rows: ExecutableSymbolFact[]): void {\n const stmt = db.prepare('INSERT INTO symbols(repo_id,file_id,kind,name,qualified_name,exported,start_line,end_line,start_offset,end_offset,source_file,exported_name,evidence_json) VALUES(?,(SELECT id FROM files WHERE repo_id=? AND relative_path=?),?,?,?,?,?,?,?,?,?,?,?)');\n for (const r of rows) stmt.run(repoId, repoId, r.sourceFile, r.kind, r.localName, r.qualifiedName, r.exported ? 1 : 0, r.startLine, r.endLine, r.startOffset, r.endOffset, r.sourceFile, r.exportedName, r.importExportEvidence ? JSON.stringify(r.importExportEvidence) : null);\n}\nexport function insertSymbolCalls(db: Db, repoId: number, rows: SymbolCallFact[]): void {\n const callerStmt = db.prepare('SELECT id FROM symbols WHERE repo_id=? AND source_file=? AND qualified_name=? ORDER BY id LIMIT 1');\n const insertStmt = db.prepare('INSERT INTO symbol_calls(repo_id,caller_symbol_id,callee_symbol_id,callee_expression,import_source,source_file,source_line,status,confidence,evidence_json,unresolved_reason) VALUES(?,?,?,?,?,?,?,?,?,?,?)');\n for (const r of rows) {\n const caller = callerStmt.get(repoId, r.sourceFile, r.callerQualifiedName) as { id?: number } | undefined;\n const target = resolveSymbolCallTarget(db, repoId, r);\n insertStmt.run(repoId, caller?.id, target.id, r.calleeExpression, r.importSource, r.sourceFile, r.sourceLine, target.status, 0.8, JSON.stringify({ ...r.evidence, candidateStrategy: target.strategy, candidateCount: target.candidateCount }), target.reason);\n }\n}\nfunction isRelativeImportedSymbolCall(r: SymbolCallFact): boolean {\n return Boolean(r.importSource?.startsWith('.'));\n}\nfunction resolveSymbolCallTarget(db: Db, repoId: number, r: SymbolCallFact): { id: number | null; status: string; reason: string | null; strategy: string; candidateCount: number } {\n const evidence = r.evidence as { relation?: unknown };\n const localRows = db.prepare('SELECT id FROM symbols WHERE repo_id=? AND source_file=? AND (name=? OR qualified_name=?) ORDER BY id').all(repoId, r.sourceFile, r.calleeLocalName, r.calleeLocalName) as Array<{ id: number }>;\n if (localRows.length === 1) return { id: localRows[0]?.id ?? null, status: 'resolved', reason: null, strategy: 'same_file_exact', candidateCount: 1 };\n if (localRows.length > 1) return { id: null, status: 'ambiguous', reason: 'Multiple same-file symbol targets matched exactly', strategy: 'same_file_exact', candidateCount: localRows.length };\n if (evidence.relation === 'class_instance_method' && isRelativeImportedSymbolCall(r)) {\n const classRows = db.prepare('SELECT id FROM symbols WHERE repo_id=? AND source_file<>? AND qualified_name=? ORDER BY id').all(repoId, r.sourceFile, r.calleeLocalName) as Array<{ id: number }>;\n if (classRows.length === 1) return { id: classRows[0]?.id ?? null, status: 'resolved', reason: null, strategy: 'relative_import_class_instance_method', candidateCount: 1 };\n if (classRows.length > 1) return { id: null, status: 'ambiguous', reason: 'Multiple relative class instance method targets matched exactly', strategy: 'relative_import_class_instance_method', candidateCount: classRows.length };\n }\n const rows = db.prepare('SELECT id,kind,evidence_json evidenceJson FROM symbols WHERE repo_id=? AND source_file<>? AND exported=1 AND (exported_name=? OR name=? OR qualified_name=?) ORDER BY id').all(repoId, r.sourceFile, r.calleeLocalName, r.calleeLocalName, r.calleeLocalName) as Array<{ id: number; kind?: string; evidenceJson?: string | null }>;\n if (evidence.relation === 'relative_import_proxy_member' && rows.length > 1) {\n const objectMapRows = rows.filter((row) => String(row.evidenceJson ?? '').includes('exported_object_shorthand') || String(row.evidenceJson ?? '').includes('exported_object_literal'));\n if (objectMapRows.length > 0) {\n const concrete = rows.find((row) => row.kind !== 'object_alias') ?? objectMapRows[0];\n return { id: concrete?.id ?? null, status: 'resolved', reason: null, strategy: 'proxy_member_exported_object_map', candidateCount: rows.length };\n }\n return { id: null, status: 'ambiguous', reason: 'Proxy member target requires explicit factory/module/type evidence; global member name is ambiguous', strategy: 'proxy_member_no_global_name_fallback', candidateCount: rows.length };\n }\n if (rows.length === 1) return { id: rows[0]?.id ?? null, status: 'resolved', reason: null, strategy: evidence.relation === 'relative_import_proxy_member' ? 'proxy_member_unique_exported_candidate' : 'relative_import_exported_exact', candidateCount: 1 };\n if (rows.length > 1) return { id: null, status: 'ambiguous', reason: 'Multiple exported symbol targets matched exactly', strategy: 'exported_exact', candidateCount: rows.length };\n return { id: null, status: 'unresolved', reason: 'No local symbol target matched exactly', strategy: evidence.relation === 'relative_import_proxy_member' ? 'proxy_member_no_global_name_fallback' : 'exact_symbol_match', candidateCount: 0 };\n}\nexport function insertCalls(\n db: Db,\n repoId: number,\n rows: OutboundCallFact[],\n): void {\n const stmt = db.prepare(\n 'INSERT INTO outbound_calls(repo_id,source_symbol_id,call_type,method,operation_path_expr,query_entity,event_name_expr,payload_summary,source_file,source_line,confidence,unresolved_reason,local_service_name,local_service_lookup,alias_chain_json,evidence_json,external_target_kind,external_target_id,external_target_label,external_target_dynamic,service_binding_id) VALUES(?,COALESCE((SELECT id FROM symbols WHERE repo_id=? AND source_file=? AND qualified_name=? ORDER BY id LIMIT 1),(SELECT id FROM symbols WHERE repo_id=? AND source_file=? AND start_line<=? AND end_line>=? ORDER BY (end_line-start_line),id LIMIT 1)),?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,(SELECT id FROM service_bindings WHERE repo_id=? AND variable_name=? AND source_file=? ORDER BY CASE WHEN source_line<=? THEN 0 ELSE 1 END, ABS(source_line-?) ASC, id DESC LIMIT 1))',\n );\n for (const r of rows)\n stmt.run(\n repoId,\n repoId,\n r.sourceFile,\n r.sourceSymbolQualifiedName,\n repoId,\n r.sourceFile,\n r.sourceLine,\n r.sourceLine,\n r.callType,\n r.method,\n r.operationPathExpr,\n r.queryEntity,\n r.eventNameExpr,\n r.payloadSummary,\n r.sourceFile,\n r.sourceLine,\n r.confidence,\n r.unresolvedReason,\n r.localServiceName,\n r.localServiceLookup,\n r.aliasChain ? JSON.stringify(r.aliasChain) : null,\n r.evidence ? JSON.stringify(r.evidence) : null,\n r.externalTarget?.kind ?? null,\n r.externalTarget?.stableId ?? null,\n r.externalTarget?.label ?? null,\n r.externalTarget?.dynamic ? 1 : 0,\n repoId,\n r.serviceVariableName,\n r.sourceFile,\n r.sourceLine,\n r.sourceLine,\n );\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { PackageFacts, RepoKind } from '../types.js';\nexport async function classifyRepository(\n repoPath: string,\n facts: PackageFacts\n): Promise<RepoKind> {\n const hasCdsDep = Boolean(\n facts.dependencies['@sap/cds'] ??\n facts.dependencies.cds ??\n facts.dependencies['cds-routing-handlers']\n );\n const cdsFiles = await findFiles(repoPath, '.cds');\n const serverFiles = await Promise.all(\n ['srv/server.ts', 'srv/server.js', 'src/server.ts', 'src/server.js'].map(\n async (f) =>\n fs\n .access(path.join(repoPath, f))\n .then(() => true)\n .catch(() => false)\n )\n );\n const helper =\n Object.keys(facts.dependencies).includes('cds-routing-handlers') ||\n facts.packageName?.includes('helper') === true;\n if (helper && cdsFiles.length > 0) return 'mixed';\n if (helper) return 'helper-package';\n if (hasCdsDep && (cdsFiles.length > 0 || serverFiles.some(Boolean)))\n return 'cap-service';\n if (cdsFiles.length > 0)\n return serverFiles.some(Boolean) ? 'cap-service' : 'cap-db-model';\n return 'unknown';\n}\n\nasync function findFiles(root: string, suffix: string): Promise<string[]> {\n const out: string[] = [];\n async function walk(dir: string): Promise<void> {\n const entries = await fs\n .readdir(dir, { withFileTypes: true })\n .catch(() => []);\n for (const e of entries) {\n if (e.isDirectory()) {\n if (!['node_modules', 'dist', 'gen', '.git'].includes(e.name))\n await walk(path.join(dir, e.name));\n } else if (e.name.endsWith(suffix)) out.push(path.join(dir, e.name));\n }\n }\n await walk(root);\n return out;\n}\n","export interface DiagnosticInput {\n severity: 'info' | 'warning' | 'error';\n code: string;\n message: string;\n sourceFile?: string;\n sourceLine?: number;\n}\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Db } from '../db/connection.js';\nimport {\n clearRepoFacts,\n insertBindings,\n insertCalls,\n insertExecutableSymbols,\n insertHandler,\n insertRegistrations,\n insertSymbolCalls,\n insertRequires,\n insertService,\n type RepoRow,\n} from '../db/repositories.js';\nimport { classifyRepository } from '../discovery/classify-repository.js';\nimport { parseCdsFile } from '../parsers/cds-parser.js';\nimport { parseDecorators } from '../parsers/decorator-parser.js';\nimport { parseHandlerRegistrations } from '../parsers/handler-registration-parser.js';\nimport { parseOutboundCalls } from '../parsers/outbound-call-parser.js';\nimport { parseExecutableSymbols } from '../parsers/symbol-parser.js';\nimport { parsePackageJson } from '../parsers/package-json-parser.js';\nimport { parseServiceBindings } from '../parsers/service-binding-parser.js';\nimport { sha256File } from '../utils/hashing.js';\nimport { normalizePath } from '../utils/path-utils.js';\nimport { errorMessage } from '../utils/diagnostics.js';\nimport { sha256Text } from '../utils/hashing.js';\nimport { ANALYZER_VERSION } from '../version.js';\nimport type { CdsServiceFact, HandlerClassFact, HandlerRegistrationFact, OutboundCallFact, ServiceBindingFact, ExecutableSymbolFact, SymbolCallFact } from '../types.js';\nexport interface IndexRepoResult {\n fileCount: number;\n diagnosticCount: number;\n skipped: boolean;\n}\ninterface ParsedFacts {\n services: CdsServiceFact[];\n handlers: HandlerClassFact[];\n registrations: HandlerRegistrationFact[];\n bindings: ServiceBindingFact[];\n calls: OutboundCallFact[];\n symbols: ExecutableSymbolFact[];\n symbolCalls: SymbolCallFact[];\n fileRecords: Array<{ relativePath: string; extension: string; sha256: string; sizeBytes: number }>;\n}\nexport async function indexRepository(\n db: Db,\n repo: RepoRow,\n force: boolean,\n): Promise<IndexRepoResult> {\n try {\n const sourceFiles = await findSourceFiles(repo.absolute_path);\n const packageFacts = await parsePackageJson(repo.absolute_path);\n const fingerprint = await repositoryFingerprint(repo.absolute_path, sourceFiles, packageFacts);\n if (!force && repo.fingerprint === fingerprint) return { fileCount: 0, diagnosticCount: 0, skipped: true };\n const kind = await classifyRepository(repo.absolute_path, packageFacts);\n const parsed = await parseAllSourceFacts(repo.absolute_path, sourceFiles);\n db.transaction(() => {\n db.prepare('UPDATE repositories SET package_name=?, package_version=?, dependencies_json=?, kind=?, index_status=? WHERE id=?').run(packageFacts.packageName, packageFacts.packageVersion, JSON.stringify(packageFacts.dependencies), kind, 'indexing', repo.id);\n clearRepoFacts(db, repo.id);\n insertRequires(db, repo.id, packageFacts.cdsRequires);\n const fileStmt = db.prepare('INSERT INTO files(repo_id,relative_path,extension,sha256,size_bytes,last_indexed_at) VALUES(?,?,?,?,?,?) ON CONFLICT(repo_id,relative_path) DO UPDATE SET sha256=excluded.sha256,size_bytes=excluded.size_bytes,last_indexed_at=excluded.last_indexed_at');\n for (const file of parsed.fileRecords) fileStmt.run(repo.id, file.relativePath, file.extension, file.sha256, file.sizeBytes, new Date().toISOString());\n for (const s of parsed.services) insertService(db, repo.id, s);\n for (const h of parsed.handlers) insertHandler(db, repo.id, h);\n insertExecutableSymbols(db, repo.id, parsed.symbols);\n insertSymbolCalls(db, repo.id, parsed.symbolCalls);\n insertRegistrations(db, repo.id, parsed.registrations);\n insertBindings(db, repo.id, parsed.bindings);\n insertCalls(db, repo.id, parsed.calls);\n db.prepare(\"UPDATE repositories SET last_indexed_at=?, index_status='indexed', error_count=0, fingerprint=?, fact_generation=COALESCE(fact_generation,0)+1, graph_stale_reason='facts_changed', graph_stale_at=? WHERE id=?\").run(new Date().toISOString(), fingerprint, new Date().toISOString(), repo.id);\n });\n return { fileCount: sourceFiles.length, diagnosticCount: 0, skipped: false };\n } catch (error) {\n const message = errorMessage(error);\n db.prepare(\"UPDATE repositories SET index_status='failed', error_count=1 WHERE id=?\").run(repo.id);\n db.prepare(\"DELETE FROM diagnostics WHERE repo_id=? AND code IN ('index_failed_snapshot_preserved','source_read_failed')\").run(repo.id);\n db.prepare('INSERT INTO diagnostics(repo_id,severity,code,message) VALUES(?,?,?,?)').run(repo.id, 'error', 'source_read_failed', `Index failed before publication; previous facts and fingerprint were preserved. ${message}`);\n return { fileCount: 0, diagnosticCount: 1, skipped: false };\n }\n}\nasync function parseAllSourceFacts(root: string, files: string[]): Promise<ParsedFacts> {\n const facts: ParsedFacts = { services: [], handlers: [], registrations: [], bindings: [], calls: [], symbols: [], symbolCalls: [], fileRecords: [] };\n for (const file of files) {\n const abs = path.join(root, file);\n const stat = await fs.stat(abs);\n facts.fileRecords.push({ relativePath: normalizePath(file), extension: path.extname(file), sha256: await sha256File(abs), sizeBytes: stat.size });\n if (file.endsWith('.cds')) facts.services.push(...(await parseCdsFile(root, file)));\n if (/\\.[jt]s$/.test(file)) {\n facts.handlers.push(...(await parseDecorators(root, file)));\n facts.registrations.push(...(await parseHandlerRegistrations(root, file)));\n facts.bindings.push(...(await parseServiceBindings(root, file)));\n const symbolFacts = await parseExecutableSymbols(root, file);\n facts.symbols.push(...symbolFacts.symbols);\n facts.symbolCalls.push(...symbolFacts.calls);\n facts.calls.push(...(await parseOutboundCalls(root, file)));\n }\n }\n return facts;\n}\nasync function findSourceFiles(root: string): Promise<string[]> {\n const out: string[] = [];\n async function walk(dir: string, prefix = ''): Promise<void> {\n const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);\n for (const e of entries) {\n const rel = prefix ? `${prefix}/${e.name}` : e.name;\n if (e.isDirectory()) {\n if (!['node_modules', 'dist', 'gen', 'coverage', '.git'].includes(e.name)) await walk(path.join(dir, e.name), rel);\n } else if (/\\.(cds|ts|js)$/.test(e.name) && !isDefaultTestFile(rel)) out.push(rel);\n }\n }\n await walk(root);\n return out.sort();\n}\nfunction isDefaultTestFile(relativeFile: string): boolean {\n const parts = relativeFile.split('/');\n if (parts.some((part) => ['test', 'tests', '__tests__'].includes(part))) return true;\n return /\\.(test|spec)\\.[jt]s$/.test(parts.at(-1) ?? '');\n}\nasync function repositoryFingerprint(root: string, files: string[], facts: Awaited<ReturnType<typeof parsePackageJson>>): Promise<string> {\n const packageJson = await fs.readFile(path.join(root, 'package.json'), 'utf8').catch(() => '');\n const normalizedFacts = {\n analyzerVersion: ANALYZER_VERSION,\n packageName: facts.packageName,\n packageVersion: facts.packageVersion,\n dependencies: Object.fromEntries(Object.entries(facts.dependencies).sort()),\n cdsRequires: [...facts.cdsRequires].sort((a, b) => a.alias.localeCompare(b.alias)),\n scripts: Object.fromEntries(Object.entries(facts.scripts).sort()),\n includeTests: false,\n packageJsonHash: sha256Text(packageJson),\n };\n const entries: string[] = [`facts:${JSON.stringify(normalizedFacts)}`];\n for (const file of files) {\n const content = await fs.readFile(path.join(root, file), 'utf8');\n entries.push(`${file}:${sha256Text(content)}`);\n }\n return sha256Text(entries.join('\\n'));\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport ts from 'typescript';\nimport type { ExecutableSymbolFact, SymbolCallFact } from '../types.js';\nimport { containsSupportedOutboundCall } from './outbound-call-parser.js';\nimport { normalizePath } from '../utils/path-utils.js';\n\nfunction lineOf(source: ts.SourceFile, pos: number): number {\n return source.getLineAndCharacterOfPosition(pos).line + 1;\n}\nfunction nameOf(node: ts.PropertyName | ts.BindingName | undefined): string | undefined {\n if (!node) return undefined;\n if (ts.isIdentifier(node) || ts.isStringLiteral(node) || ts.isNumericLiteral(node)) return node.text;\n return undefined;\n}\nfunction isFunctionLike(node: ts.Node): node is ts.FunctionLikeDeclaration {\n return ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node) || ts.isFunctionExpression(node) || ts.isArrowFunction(node);\n}\nfunction exported(node: ts.Node): boolean {\n return Boolean(ts.getCombinedModifierFlags(node as ts.Declaration) & ts.ModifierFlags.Export);\n}\nfunction isPublicClassMethod(node: ts.MethodDeclaration): boolean {\n const flags = ts.getCombinedModifierFlags(node);\n return (flags & ts.ModifierFlags.Private) === 0 && (flags & ts.ModifierFlags.Protected) === 0;\n}\nfunction exportDeclarations(source: ts.SourceFile): Map<string, string> {\n const exports = new Map<string, string>();\n const visit = (node: ts.Node): void => {\n if (ts.isExportDeclaration(node) && node.exportClause && ts.isNamedExports(node.exportClause)) {\n for (const el of node.exportClause.elements) exports.set((el.propertyName ?? el.name).text, el.name.text);\n }\n ts.forEachChild(node, visit);\n };\n visit(source);\n return exports;\n}\nfunction isRelativeImport(value: string | undefined): boolean {\n return Boolean(value?.startsWith('.'));\n}\nfunction isObjectFunction(node: ts.Node): boolean {\n return ts.isFunctionExpression(node) || ts.isArrowFunction(node) || ts.isMethodDeclaration(node);\n}\ntype ParameterBinding =\n | { index: number; kind: 'identifier'; name: string }\n | { index: number; kind: 'object_pattern'; properties: Array<{ property: string; local: string }> };\ntype ParameterPropertyAlias = { parameter: string; property: string; local: string; kind: 'object_parameter_destructure'; line: number };\nconst commonTerminalMembers = new Set(['push', 'includes', 'find', 'findIndex', 'map', 'filter', 'reduce', 'forEach', 'some', 'every', 'toUpperCase', 'toLowerCase', 'trim', 'split', 'join', 'get', 'set', 'has']);\nconst loggerMembers = new Set(['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'log']);\nconst globalObjects = new Set(['JSON', 'Object', 'Array', 'String', 'Number', 'Boolean', 'Math', 'Date', 'Promise', 'Reflect']);\nconst builtInConstructors = new Set([\n 'Set', 'Map', 'WeakSet', 'WeakMap',\n 'Date', 'RegExp', 'URL', 'URLSearchParams',\n 'Error', 'EvalError', 'RangeError', 'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'AggregateError',\n 'ArrayBuffer', 'SharedArrayBuffer', 'DataView',\n 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array',\n 'Float32Array', 'Float64Array', 'BigInt64Array', 'BigUint64Array',\n 'Promise', 'AbortController',\n]);\nconst capDslRoots = new Set(['SELECT', 'INSERT', 'UPSERT', 'UPDATE', 'DELETE']);\nconst requestHelpers = new Set(['reject', 'error', 'info', 'warn', 'notify']);\nconst transportMembers = new Set(['emit', 'publish', 'send', 'on']);\nfunction callName(expr: ts.Expression): { expression: string; local?: string; member?: string; receiver?: string } {\n if (ts.isIdentifier(expr)) return { expression: expr.text, local: expr.text };\n if (ts.isPropertyAccessExpression(expr)) {\n const left = expr.expression.getText();\n const root = left.split('.')[0];\n return { expression: expr.getText(), local: left === 'this' ? undefined : root, member: expr.name.text, receiver: left };\n }\n return { expression: expr.getText() };\n}\nfunction requireSource(expr: ts.Expression): string | undefined {\n if (!ts.isCallExpression(expr) || !ts.isIdentifier(expr.expression) || expr.expression.text !== 'require') return undefined;\n const first = expr.arguments[0];\n return first && ts.isStringLiteral(first) ? first.text : undefined;\n}\nfunction ignoredFrameworkCall(callee: { expression: string; local?: string; member?: string; receiver?: string }): boolean {\n if (callee.local && capDslRoots.has(callee.local)) return true;\n if (callee.expression === 'cds.run' || callee.expression.startsWith('cds.connect.') || callee.expression.startsWith('cds.services.') || callee.expression.startsWith('cds.parse.')) return true;\n if (callee.local === 'req' && callee.member && requestHelpers.has(callee.member)) return true;\n if (callee.member && transportMembers.has(callee.member)) return true;\n if (callee.local && globalObjects.has(callee.local)) return true;\n if (callee.expression.startsWith('new Date().')) return true;\n return false;\n}\nfunction nearest(symbols: ExecutableSymbolFact[], line: number): ExecutableSymbolFact | undefined {\n return symbols.filter((s) => s.startLine <= line && s.endLine >= line).sort((a, b) => (a.endLine - a.startLine) - (b.endLine - b.startLine))[0];\n}\nfunction argumentEvidence(args: ts.NodeArray<ts.Expression>, source: ts.SourceFile): Array<Record<string, unknown>> {\n return args.map((arg) => {\n if (ts.isIdentifier(arg)) return { kind: 'identifier', name: arg.text };\n if (ts.isObjectLiteralExpression(arg)) {\n const properties: Array<Record<string, unknown>> = [];\n for (const prop of arg.properties) {\n if (ts.isShorthandPropertyAssignment(prop)) properties.push({ kind: 'shorthand', property: prop.name.text, argument: prop.name.text });\n if (ts.isPropertyAssignment(prop)) {\n const propName = nameOf(prop.name);\n if (propName && ts.isIdentifier(prop.initializer)) properties.push({ kind: 'property_assignment', property: propName, argument: prop.initializer.text });\n }\n }\n return { kind: 'object_literal', properties };\n }\n return { kind: 'unsupported', expression: arg.getText(source) };\n });\n}\nfunction bindingLocalName(name: ts.BindingName, initializer?: ts.Expression): string | undefined {\n if (ts.isIdentifier(name)) return name.text;\n if (initializer && ts.isIdentifier(initializer)) return initializer.text;\n return undefined;\n}\n\nfunction objectPatternAliases(pattern: ts.ObjectBindingPattern, parameter: string, source: ts.SourceFile, lineNode: ts.Node): ParameterPropertyAlias[] {\n return pattern.elements.flatMap((element): ParameterPropertyAlias[] => {\n if (element.dotDotDotToken || ts.isObjectBindingPattern(element.name) || ts.isArrayBindingPattern(element.name)) return [];\n const property = element.propertyName ? nameOf(element.propertyName) : nameOf(element.name);\n if (!property) return [];\n const local = bindingLocalName(element.name, element.initializer);\n return local ? [{ parameter, property, local, kind: 'object_parameter_destructure', line: lineOf(source, lineNode.getStart(source)) }] : [];\n });\n}\nfunction parameterPropertyAliases(fn: ts.FunctionLikeDeclaration, source: ts.SourceFile): ParameterPropertyAlias[] {\n const parameterNames = new Set(fn.parameters.flatMap((param) => ts.isIdentifier(param.name) ? [param.name.text] : []));\n if (!fn.body || parameterNames.size === 0) return [];\n const aliases: ParameterPropertyAlias[] = [];\n const addFromAssignment = (left: ts.Expression, right: ts.Expression, node: ts.Node): void => {\n if (!ts.isObjectLiteralExpression(left) || !ts.isIdentifier(right) || !parameterNames.has(right.text)) return;\n for (const prop of left.properties) {\n if (!ts.isPropertyAssignment(prop)) continue;\n const property = nameOf(prop.name);\n if (property && ts.isIdentifier(prop.initializer)) aliases.push({ parameter: right.text, property, local: prop.initializer.text, kind: 'object_parameter_destructure', line: lineOf(source, node.getStart(source)) });\n }\n };\n const visit = (node: ts.Node): void => {\n if (ts.isVariableDeclaration(node) && ts.isObjectBindingPattern(node.name) && node.initializer && ts.isIdentifier(node.initializer) && parameterNames.has(node.initializer.text)) aliases.push(...objectPatternAliases(node.name, node.initializer.text, source, node));\n if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken) addFromAssignment(ts.isParenthesizedExpression(node.left) ? node.left.expression : node.left, node.right, node);\n ts.forEachChild(node, visit);\n };\n visit(fn.body);\n const seen = new Set<string>();\n return aliases.filter((alias) => { const key = `${alias.parameter}.${alias.property}:${alias.local}`; if (seen.has(key)) return false; seen.add(key); return true; });\n}\nfunction parameterBindings(params: ts.NodeArray<ts.ParameterDeclaration>): ParameterBinding[] {\n return params.flatMap((param, index): ParameterBinding[] => {\n if (ts.isIdentifier(param.name)) return [{ index, kind: 'identifier', name: param.name.text }];\n if (!ts.isObjectBindingPattern(param.name)) return [];\n const properties = param.name.elements.flatMap((element): Array<{ property: string; local: string }> => {\n if (element.dotDotDotToken || ts.isObjectBindingPattern(element.name) || ts.isArrayBindingPattern(element.name)) return [];\n const property = element.propertyName ? nameOf(element.propertyName) : nameOf(element.name);\n if (!property) return [];\n const local = bindingLocalName(element.name, element.initializer);\n return local ? [{ property, local }] : [];\n });\n return properties.length > 0 ? [{ index, kind: 'object_pattern', properties }] : [];\n });\n}\nexport async function parseExecutableSymbols(repoPath: string, filePath: string): Promise<{ symbols: ExecutableSymbolFact[]; calls: SymbolCallFact[] }> {\n const text = await fs.readFile(path.join(repoPath, filePath), 'utf8');\n const source = ts.createSourceFile(filePath, text, ts.ScriptTarget.Latest, true, filePath.endsWith('.ts') ? ts.ScriptKind.TS : ts.ScriptKind.JS);\n const sourceFile = normalizePath(filePath);\n const symbols: ExecutableSymbolFact[] = [];\n const calls: SymbolCallFact[] = [];\n const imports = new Map<string, string>();\n const exportNames = exportDeclarations(source);\n const objectExports = new Set<string>();\n const exportedClasses = new Set<string>();\n const declaredClasses = new Set<string>();\n const proxyVariables = new Map<string, { importSource: string; factory: string; variableName: string }>();\n const classInstances = new Map<string, { className: string; importSource?: string; propertyName?: string }>();\n const addSymbol = (kind: string, localName: string, node: ts.Node, parentName?: string, exportedName?: string, evidence?: Record<string, unknown>): void => {\n const parentRoot = parentName?.split('.')[0] ?? '';\n const declaredExportName = exportedName ?? exportNames.get(parentName ? parentRoot : localName);\n const qualifiedName = parentName ? `${parentName}.${localName}` : localName;\n const objectExported = parentName ? objectExports.has(parentRoot) : false;\n const classMemberExported = kind === 'method' && parentName ? exportedClasses.has(parentRoot) && ts.isMethodDeclaration(node) && (ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Static) !== 0 && isPublicClassMethod(node) : false;\n const effectiveExportedName = classMemberExported || objectExported ? qualifiedName : declaredExportName;\n const bindings = isFunctionLike(node) ? parameterBindings(node.parameters) : undefined;\n const params = bindings?.flatMap((binding) => binding.kind === 'identifier' ? [binding.name] : []);\n const sourceEvidence = evidence ?? (classMemberExported ? { source: 'exported_class_member', exportedClass: parentRoot, memberKind: (ts.getCombinedModifierFlags(node as ts.Declaration) & ts.ModifierFlags.Static) !== 0 ? 'static_method' : 'class_method', parameters: params } : declaredExportName ? { exportedName: declaredExportName, source: 'export_declaration' } : objectExported ? { exportedName: qualifiedName, source: 'exported_object_literal' } : undefined);\n const aliases = isFunctionLike(node) ? parameterPropertyAliases(node, source) : [];\n const parameterEvidence = { ...(bindings && bindings.length > 0 ? { parameters: params, parameterBindings: bindings } : {}), ...(aliases.length > 0 ? { parameterPropertyAliases: aliases } : {}) };\n symbols.push({ kind, localName: kind === 'object_method' ? qualifiedName : localName, exportedName: effectiveExportedName, qualifiedName, sourceFile, startLine: lineOf(source, node.getStart(source)), endLine: lineOf(source, node.getEnd()), startOffset: node.getStart(source), endOffset: node.getEnd(), exported: exported(node) || Boolean(effectiveExportedName), importExportEvidence: sourceEvidence ? { ...sourceEvidence, ...parameterEvidence } : bindings && bindings.length > 0 ? parameterEvidence : undefined });\n };\n const addAliasSymbol = (objectName: string, propertyName: string, node: ts.Node, targetImportSource?: string): void => {\n symbols.push({ kind: 'object_alias', localName: propertyName, exportedName: propertyName, qualifiedName: `${objectName}.${propertyName}`, sourceFile, startLine: lineOf(source, node.getStart(source)), endLine: lineOf(source, node.getEnd()), startOffset: node.getStart(source), endOffset: node.getEnd(), exported: true, importExportEvidence: { source: 'exported_object_shorthand', objectName, propertyName, targetImportSource } });\n };\n const visitImports = (node: ts.Node): void => {\n if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier)) {\n const sourceText = node.moduleSpecifier.text;\n const clause = node.importClause;\n if (clause?.name) imports.set(clause.name.text, sourceText);\n const named = clause?.namedBindings;\n if (named && ts.isNamedImports(named)) for (const el of named.elements) imports.set(el.name.text, sourceText);\n if (named && ts.isNamespaceImport(named)) imports.set(named.name.text, sourceText);\n }\n if (ts.isVariableStatement(node)) {\n for (const declaration of node.declarationList.declarations) {\n const requiredSource = declaration.initializer ? requireSource(declaration.initializer) : undefined;\n if (ts.isIdentifier(declaration.name) && requiredSource) imports.set(declaration.name.text, requiredSource);\n if (ts.isObjectBindingPattern(declaration.name) && requiredSource) for (const element of declaration.name.elements) if (ts.isIdentifier(element.name)) imports.set(element.name.text, requiredSource);\n }\n }\n ts.forEachChild(node, visitImports);\n };\n visitImports(source);\n const visitSymbols = (node: ts.Node, parentClass?: string): void => {\n if (ts.isClassDeclaration(node) && node.name) {\n declaredClasses.add(node.name.text);\n if (exported(node) || exportNames.has(node.name.text)) exportedClasses.add(node.name.text);\n for (const member of node.members) visitSymbols(member, node.name.text);\n return;\n }\n if (ts.isMethodDeclaration(node)) {\n const localName = nameOf(node.name);\n if (localName) addSymbol('method', localName, node, parentClass);\n } else if (ts.isPropertyDeclaration(node) && parentClass && node.initializer && (ts.isArrowFunction(node.initializer) || ts.isFunctionExpression(node.initializer))) {\n const localName = nameOf(node.name);\n if (localName) addSymbol('method', localName, node.initializer, parentClass, undefined, { source: 'class_property_function', memberKind: ts.isArrowFunction(node.initializer) ? 'arrow_function_property' : 'function_expression_property' });\n } else if (ts.isFunctionDeclaration(node) && node.name) addSymbol('function', node.name.text, node, undefined, exported(node) ? node.name.text : undefined);\n else if (ts.isVariableStatement(node)) {\n for (const d of node.declarationList.declarations) {\n const localName = nameOf(d.name);\n if (!localName || !d.initializer) continue;\n if (isFunctionLike(d.initializer)) addSymbol('function', localName, d.initializer, undefined, exported(node) ? localName : exportNames.get(localName));\n if (ts.isObjectLiteralExpression(d.initializer)) {\n const objectIsExported = exported(node) || exportNames.has(localName);\n if (objectIsExported) objectExports.add(localName);\n for (const prop of d.initializer.properties) {\n if (objectIsExported && ts.isShorthandPropertyAssignment(prop)) addAliasSymbol(localName, prop.name.text, prop.name, imports.get(prop.name.text));\n if (ts.isPropertyAssignment(prop) && isObjectFunction(prop.initializer)) {\n const propName = nameOf(prop.name);\n if (propName) addSymbol('object_method', propName, prop.initializer, localName);\n } else if (ts.isMethodDeclaration(prop)) {\n const propName = nameOf(prop.name);\n if (propName) addSymbol('object_method', propName, prop, localName);\n }\n }\n }\n }\n } else ts.forEachChild(node, (child) => visitSymbols(child, parentClass));\n };\n visitSymbols(source);\n\n const isTopLevelCallback = (node: ts.Node): node is ts.ArrowFunction | ts.FunctionExpression => {\n if (!ts.isArrowFunction(node) && !ts.isFunctionExpression(node)) return false;\n if (!ts.isCallExpression(node.parent)) return false;\n const callee = callName(node.parent.expression);\n const member = callee.member ?? callee.local;\n return Boolean(member && ['bootstrap', 'served', 'connect', 'on', 'once', 'use', 'get', 'post', 'put', 'patch', 'delete', 'subscribe'].includes(member));\n };\n const visitCallbackSymbols = (node: ts.Node): void => {\n if (isTopLevelCallback(node) && containsSupportedOutboundCall(node)) {\n const startLine = lineOf(source, node.getStart(source));\n const name = `callback:${startLine}`;\n symbols.push({ kind: 'callback', localName: name, qualifiedName: `module:${sourceFile}#${name}`, sourceFile, startLine, endLine: lineOf(source, node.getEnd()), startOffset: node.getStart(source), endOffset: node.getEnd(), exported: false, importExportEvidence: { source: 'synthetic_outbound_callback', callbackLine: startLine } });\n }\n ts.forEachChild(node, visitCallbackSymbols);\n };\n visitCallbackSymbols(source);\n\n const visitEventRegistrationSymbols = (node: ts.Node): void => {\n if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression) && node.expression.name.text === 'on') {\n const receiver = node.expression.expression.getText(source);\n const eventArg = node.arguments[0];\n if ((receiver === 'cds' || /^(srv|service|serviceClient|messaging|messageClient|eventClient|.*Client)$/.test(receiver)) && eventArg && (ts.isStringLiteral(eventArg) || ts.isNoSubstitutionTemplateLiteral(eventArg))) {\n const startLine = lineOf(source, node.getStart(source));\n const eventName = eventArg.text.replace(/[^A-Za-z0-9_$-]/g, '_');\n const name = `event:${eventName}:${startLine}`;\n symbols.push({ kind: 'event_registration', localName: name, qualifiedName: `module:${sourceFile}#${name}`, sourceFile, startLine, endLine: lineOf(source, node.getEnd()), startOffset: node.getStart(source), endOffset: node.getEnd(), exported: false, importExportEvidence: { source: 'synthetic_event_registration', eventName: eventArg.text, registrationLine: startLine, receiver } });\n }\n }\n ts.forEachChild(node, visitEventRegistrationSymbols);\n };\n visitEventRegistrationSymbols(source);\n const visitProxyVariables = (node: ts.Node): void => {\n if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name) && node.initializer && ts.isCallExpression(node.initializer) && ts.isPropertyAccessExpression(node.initializer.expression)) {\n const callee = callName(node.initializer.expression);\n const importSource = callee.local ? imports.get(callee.local) : undefined;\n if (callee.member && importSource && isRelativeImport(importSource)) proxyVariables.set(node.name.text, { importSource, factory: callee.expression, variableName: node.name.text });\n }\n ts.forEachChild(node, visitProxyVariables);\n };\n visitProxyVariables(source);\n const rememberClassInstance = (variableName: string, className: string, propertyName?: string): void => {\n const importSource = imports.get(className);\n if (!builtInConstructors.has(className) && ((importSource && isRelativeImport(importSource)) || declaredClasses.has(className))) classInstances.set(variableName, { className, importSource, propertyName });\n };\n const visitClassInstances = (node: ts.Node): void => {\n if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name) && node.initializer && ts.isNewExpression(node.initializer) && ts.isIdentifier(node.initializer.expression)) {\n rememberClassInstance(node.name.text, node.initializer.expression.text);\n }\n if (ts.isPropertyDeclaration(node) && node.initializer && ts.isNewExpression(node.initializer) && ts.isIdentifier(node.initializer.expression)) {\n const propertyName = nameOf(node.name);\n if (propertyName) rememberClassInstance(`this.${propertyName}`, node.initializer.expression.text, propertyName);\n }\n ts.forEachChild(node, visitClassInstances);\n };\n visitClassInstances(source);\n const localCallables = new Set(symbols.flatMap((sym) => [sym.localName, sym.qualifiedName]));\n const visitCalls = (node: ts.Node): void => {\n if (ts.isCallExpression(node)) {\n const line = lineOf(source, node.getStart(source));\n const caller = nearest(symbols, line);\n if (caller) {\n const callee = callName(node.expression);\n const proxy = callee.local ? proxyVariables.get(callee.local) : undefined;\n const instance = (callee.local ? classInstances.get(callee.local) : undefined) ?? (callee.receiver ? classInstances.get(callee.receiver) : undefined);\n const importSource = instance?.importSource ?? proxy?.importSource ?? (callee.local ? imports.get(callee.local) : undefined) ?? (callee.member && callee.local ? imports.get(callee.local) : undefined);\n const directThisMethod = callee.receiver === 'this';\n const targetName = instance && callee.member ? `${instance.className}.${callee.member}` : proxy && callee.member ? callee.member : directThisMethod ? callee.member : callee.member && callee.local ? `${callee.local}.${callee.member}` : callee.local;\n const className = caller.qualifiedName.includes('.') ? caller.qualifiedName.split('.')[0] : undefined;\n const thisTarget = directThisMethod && className && callee.member ? `${className}.${callee.member}` : undefined;\n const loggerLike = callee.receiver?.endsWith('.logger') || callee.local === 'logger' || (callee.expression.startsWith('this.logger.') && callee.member ? loggerMembers.has(callee.member) : false);\n const terminalMember = callee.member ? commonTerminalMembers.has(callee.member) || loggerMembers.has(callee.member) : false;\n const provenLocal = Boolean(targetName) && localCallables.has(String(targetName));\n const provenThisMethod = Boolean(thisTarget && localCallables.has(thisTarget));\n const provenRelativeImport = Boolean(isRelativeImport(importSource) && targetName);\n const provenClassInstance = Boolean(instance && callee.member && targetName);\n const importedFromPackage = Boolean(importSource && !isRelativeImport(importSource));\n const ignored = loggerLike || terminalMember || importedFromPackage || ignoredFrameworkCall(callee);\n const resolvedTarget = provenThisMethod ? thisTarget : targetName;\n const keep = Boolean(resolvedTarget) && !ignored && (provenLocal || provenThisMethod || provenRelativeImport || provenClassInstance);\n if (keep) calls.push({ callerQualifiedName: caller.qualifiedName, calleeExpression: callee.expression, calleeLocalName: resolvedTarget, receiverLocalName: callee.member ? (callee.local ?? callee.receiver) : undefined, importSource, sourceFile, sourceLine: line, evidence: { relation: instance ? 'class_instance_method' : proxy ? 'relative_import_proxy_member' : importSource ? 'relative_import' : provenThisMethod ? 'indexed_this_method' : 'indexed_local_symbol', caller: caller.qualifiedName, targetName: resolvedTarget, instanceVariable: instance ? (instance.propertyName ?? callee.local) : undefined, className: instance?.className, methodName: instance ? callee.member : undefined, classImportSource: instance?.importSource, callArguments: argumentEvidence(node.arguments, source), proxyVariableName: proxy?.variableName, factory: proxy?.factory, factoryExpression: proxy?.factory, factoryImportSource: proxy?.importSource, candidateStrategy: instance ? (instance.importSource ? 'relative_import_class_instance_method' : 'same_file_class_instance_method') : proxy ? 'proxy_member_exact_export_or_unique_member' : undefined } });\n }\n }\n ts.forEachChild(node, visitCalls);\n };\n visitCalls(source);\n return { symbols, calls };\n}\n","import { createHash } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nexport async function sha256File(filePath: string): Promise<string> {\n return createHash('sha256')\n .update(await readFile(filePath))\n .digest('hex');\n}\nexport function sha256Text(text: string): string {\n return createHash('sha256').update(text).digest('hex');\n}\n","import type { Db } from '../db/connection.js';\nimport { listRepositories, repoByName } from '../db/repositories.js';\nimport { errorMessage } from '../utils/diagnostics.js';\nimport { indexRepository } from './repository-indexer.js';\nexport async function indexWorkspace(\n db: Db,\n workspaceId: number,\n options: { repo?: string; force: boolean },\n): Promise<{ repoCount: number; indexedCount: number; skippedCount: number; fileCount: number; diagnosticCount: number }> {\n const started = new Date().toISOString();\n const repos = options.repo ? [repoByName(db, options.repo)].filter((r) => r !== undefined) : listRepositories(db);\n const runId = Number(db.prepare('INSERT INTO index_runs(workspace_id,started_at,status,repo_count,file_count,diagnostic_count) VALUES(?,?,?,?,?,?) RETURNING id').get(workspaceId, started, 'running', repos.length, 0, 0)?.id);\n let fileCount = 0;\n let diagnosticCount = 0;\n let skippedCount = 0;\n try {\n for (const repo of repos) {\n const result = await indexRepository(db, repo, options.force);\n fileCount += result.fileCount;\n diagnosticCount += result.diagnosticCount;\n skippedCount += result.skipped ? 1 : 0;\n }\n db.prepare('UPDATE index_runs SET finished_at=?, status=?, file_count=?, diagnostic_count=? WHERE id=?').run(new Date().toISOString(), diagnosticCount ? 'failed' : 'success', fileCount, diagnosticCount, runId);\n return { repoCount: repos.length, indexedCount: repos.length - skippedCount, skippedCount, fileCount, diagnosticCount };\n } catch (error) {\n db.prepare(\"UPDATE index_runs SET finished_at=?, status='failed', file_count=?, diagnostic_count=?, error_message=? WHERE id=?\").run(new Date().toISOString(), fileCount, diagnosticCount + 1, errorMessage(error), runId);\n throw error;\n }\n}\n","import type { TraceStart } from '../types.js';\nexport function parseVars(\n values: string[] | undefined\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const value of values ?? []) {\n const [key, ...rest] = value.split('=');\n if (key && rest.length > 0) out[key] = rest.join('=');\n }\n return out;\n}\nexport function startLabel(start: TraceStart): string {\n return [\n start.repo,\n start.servicePath,\n start.operation ?? start.operationPath ?? start.handler\n ]\n .filter(Boolean)\n .join(' ');\n}\n","import type { TraceResult } from '../types.js';\n\nfunction location(evidence: Record<string, unknown>): string {\n const file = evidence.file ?? evidence.sourceFile ?? evidence.handlerSourceFile ?? evidence.operationSourceFile ?? evidence.registrationSourceFile;\n const line = evidence.line ?? evidence.sourceLine ?? evidence.handlerSourceLine ?? evidence.operationSourceLine ?? evidence.registrationSourceLine;\n if (file || line) return `${String(file ?? '')}:${String(line ?? '')}`;\n const candidates = evidence.candidates;\n if (Array.isArray(candidates) && candidates.length > 0) {\n const first = candidates[0] as Record<string, unknown>;\n return `${String(first.sourceFile ?? '')}:${String(first.sourceLine ?? '')}`;\n }\n return ':';\n}\nexport function renderTraceTable(result: TraceResult): string {\n const lines = ['Step Type From To Evidence'];\n for (const e of result.edges) {\n lines.push(`${String(e.step).padEnd(5)} ${e.type.padEnd(20)} ${e.from.slice(0, 34).padEnd(35)} ${e.to.slice(0, 35).padEnd(36)} ${location(e.evidence)}`);\n }\n if (result.diagnostics.length > 0) lines.push('', 'Diagnostics:', ...result.diagnostics.map((d) => `${String(d.severity ?? 'info')} ${String(d.code ?? 'diagnostic')} ${String(d.message ?? '')}`));\n return `${lines.join('\\n')}\\n`;\n}\n","import type { TraceResult } from '../types.js';\nexport function renderJson(value: unknown): string {\n return `${JSON.stringify(value, null, 2)}\\n`;\n}\nexport function renderTraceJson(trace: TraceResult): string {\n return renderJson(trace);\n}\n","import type { TraceResult } from '../types.js';\nfunction safe(value: string): string {\n return value.replace(/[^\\w-]/g, '_').slice(0, 60);\n}\nfunction label(trace: TraceResult, idOrLabel: string): string {\n const node = trace.nodes.find((item) => item.id === idOrLabel || item.label === idOrLabel);\n return String(node?.label ?? idOrLabel);\n}\nexport function renderMermaid(trace: TraceResult): string {\n const lines = ['flowchart TD'];\n for (const e of trace.edges)\n lines.push(\n ` ${safe(e.from)}[\"${label(trace, e.from)}\"] -->|${e.type}| ${safe(e.to)}[\"${label(trace, e.to)}\"]`\n );\n return `${lines.join('\\n')}\\n`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,SAAS,eAAe;AACxB,OAAOA,WAAU;AACjB,OAAOC,SAAQ;AACf,OAAO,QAAQ;;;ACHR,IAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACO,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,kBAAkB;;;ACb/B,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,SAAS;AAOlB,IAAM,SAAS,EAAE,OAAO;AAAA,EACtB,UAAU,EAAE,OAAO;AAAA,EACnB,QAAQ,EAAE,OAAO;AAAA,EACjB,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EAC1B,WAAW,EAAE,OAAO;AAAA,EACpB,WAAW,EAAE,OAAO;AACtB,CAAC;AAEM,SAAS,WAAW,UAA0B;AACnD,SAAO,KAAK,KAAK,UAAU,YAAY,WAAW;AACpD;AACO,SAAS,cAAc,UAA0B;AACtD,SAAO,KAAK,KAAK,UAAU,YAAY,eAAe;AACxD;AACA,eAAsB,oBACpB,QACe;AACf,QAAM,GAAG,MAAM,KAAK,QAAQ,WAAW,OAAO,QAAQ,CAAC,GAAG;AAAA,IACxD,WAAW;AAAA,EACb,CAAC;AACD,QAAM,GAAG;AAAA,IACP,WAAW,OAAO,QAAQ;AAAA,IAC1B,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA;AAAA,EACpC;AACA,MAAI,KAAK,QAAQ,OAAO,MAAM,MAAM,KAAK,QAAQ,WAAW,OAAO,QAAQ,CAAC;AAC1E,UAAM,GAAG;AAAA,MACP,KAAK,KAAK,KAAK,QAAQ,OAAO,MAAM,GAAG,qBAAqB;AAAA,MAC5D;AAAA,IACF;AACJ;AACA,eAAsB,oBACpB,WAC0B;AAC1B,QAAM,OAAO,KAAK,QAAQ,aAAa,QAAQ,IAAI,CAAC;AACpD,QAAM,OAAO,MAAM,GAAG,SAAS,WAAW,IAAI,GAAG,MAAM;AACvD,SAAO,OAAO,MAAM,KAAK,MAAM,IAAI,CAAY;AACjD;AACO,SAAS,sBACd,UACA,QACA,SAAmB,CAAC,GAAG,eAAe,GACrB;AACjB,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,OAAO,KAAK,QAAQ,QAAQ;AAClC,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,KAAK,QAAQ,UAAU,cAAc,IAAI,CAAC;AAAA,IAClD;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AACF;;;AC5DA,OAAOC,SAAQ;AACf,OAAOC,WAAU;;;ACDV,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEzB,IAAM,yBAAyB;AAC/B,IAAM,UAAgE;AAAA,EACpE,kBAAkB;AAAA,IAChB,EAAE,MAAM,qBAAqB,KAAK,iEAAiE;AAAA,IACnG,EAAE,MAAM,cAAc,KAAK,0DAA0D;AAAA,EACvF;AAAA,EACA,cAAc;AAAA,IACZ,EAAE,MAAM,eAAe,KAAK,uDAAuD;AAAA,IACnF,EAAE,MAAM,mBAAmB,KAAK,iFAAiF;AAAA,IACjH,EAAE,MAAM,oBAAoB,KAAK,kFAAkF;AAAA,IACnH,EAAE,MAAM,sBAAsB,KAAK,8DAA8D;AAAA,IACjG,EAAE,MAAM,kBAAkB,KAAK,0DAA0D;AAAA,EAC3F;AAAA,EACA,aAAa;AAAA,IACX,EAAE,MAAM,UAAU,KAAK,+EAA+E;AAAA,IACtG,EAAE,MAAM,cAAc,KAAK,2EAA2E;AAAA,EACxG;AAAA,EACA,uBAAuB;AAAA,IACrB,EAAE,MAAM,cAAc,KAAK,+DAA+D;AAAA,IAC1F,EAAE,MAAM,iBAAiB,KAAK,kEAAkE;AAAA,EAClG;AAAA,EACA,SAAS;AAAA,IACP,EAAE,MAAM,gBAAgB,KAAK,sDAAsD;AAAA,IACnF,EAAE,MAAM,cAAc,KAAK,oDAAoD;AAAA,IAC/E,EAAE,MAAM,eAAe,KAAK,kDAAkD;AAAA,IAC9E,EAAE,MAAM,iBAAiB,KAAK,oDAAoD;AAAA,IAClF,EAAE,MAAM,iBAAiB,KAAK,oDAAoD;AAAA,EACpF;AAAA,EACA,gBAAgB;AAAA,IACd,EAAE,MAAM,sBAAsB,KAAK,gEAAgE;AAAA,IACnG,EAAE,MAAM,wBAAwB,KAAK,kEAAkE;AAAA,IACvG,EAAE,MAAM,oBAAoB,KAAK,8DAA8D;AAAA,IAC/F,EAAE,MAAM,iBAAiB,KAAK,2DAA2D;AAAA,IACzF,EAAE,MAAM,wBAAwB,KAAK,kEAAkE;AAAA,IACvG,EAAE,MAAM,sBAAsB,KAAK,gEAAgE;AAAA,IACnG,EAAE,MAAM,yBAAyB,KAAK,mEAAmE;AAAA,IACzG,EAAE,MAAM,2BAA2B,KAAK,2FAA2F;AAAA,EACrI;AAAA,EACA,YAAY;AAAA,IACV,EAAE,MAAM,iBAAiB,KAAK,uDAAuD;AAAA,EACvF;AACF;AACA,SAAS,UAAU,IAAQ,OAAe,QAAyB;AACjE,SAAQ,GAAG,QAAQ,qBAAqB,KAAK,GAAG,EAAE,IAAI,EAA+B,KAAK,CAAC,QAAQ,IAAI,SAAS,MAAM;AACxH;AACA,SAAS,YAAY,IAAgB;AACnC,QAAM,MAAM,GAAG,OAAO,cAAc,EAAE,CAAC;AACvC,SAAO,OAAO,KAAK,gBAAgB,CAAC;AACtC;AACA,SAAS,kBAAkB,IAAc;AACvC,aAAW,CAAC,OAAO,YAAY,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC3D,eAAW,UAAU,cAAc;AACjC,UAAI,CAAC,UAAU,IAAI,OAAO,OAAO,IAAI,EAAG,IAAG,QAAQ,OAAO,GAAG,EAAE,IAAI;AAAA,IACrE;AAAA,EACF;AACF;AACA,SAAS,sBAAsB,IAAc;AAC3C,KAAG,QAAQ,mWAAmW,EAAE,IAAI;AACpX,KAAG,QAAQ,kQAAkQ,EAAE,IAAI;AACrR;AACO,SAAS,QAAQ,IAAc;AACpC,KAAG,YAAY,MAAM;AACnB,UAAM,UAAU,YAAY,EAAE;AAC9B,QAAI,UAAU,uBAAwB,OAAM,IAAI,MAAM,kDAAkD,OAAO,EAAE;AACjH,OAAG,KAAK,SAAS;AACjB,sBAAkB,EAAE;AACpB,0BAAsB,EAAE;AACxB,UAAM,aAAa,GAAG,OAAO,mBAAmB;AAChD,QAAI,WAAW,SAAS,EAAG,OAAM,IAAI,MAAM,kDAAkD;AAC7F,OAAG,OAAO,kBAAkB,sBAAsB,EAAE;AAAA,EACtD,CAAC;AACH;;;ACzEA;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,MAAQ;AAAA,EACR,eAAiB;AAAA,IACf,QAAU;AAAA,IACV,UAAY;AAAA,EACd;AAAA,EACA,KAAO;AAAA,IACL,gBAAgB;AAAA,EAClB;AAAA,EACA,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,SAAW;AAAA,IACT,KAAK;AAAA,MACH,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,iBAAiB;AAAA,EACnB;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAU;AAAA,EACV,SAAW;AAAA,EACX,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,UAAY;AAAA,EACZ,MAAQ;AAAA,IACN,KAAO;AAAA,EACT;AAAA,EACA,cAAgB;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,YAAc;AAAA,IACd,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,uBAAuB;AAAA,IACvB,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AACF;;;ACrEO,IAAM,UAAU,gBAAY;AAC5B,IAAM,mBAAmB,gBAAY;;;AJiB5C,IAAI,+BAA+B;AACnC,SAAS,6BAAmC;AAC1C,MAAI,6BAA8B;AAClC,iCAA+B;AAC/B,QAAM,WAAW,QAAQ,YAAY,KAAK,OAAO;AACjD,UAAQ,eAAe,CAAC,YAA4B,SAA0B;AAC5E,UAAM,OAAO,mBAAmB,QAAQ,QAAQ,UAAU,OAAO,OAAO;AACxE,QAAI,KAAK,SAAS,mCAAmC,EAAG;AACxD,YAAQ,MAAM,UAAU,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC;AAAA,EACrD;AACF;AAmBA,SAAS,aAA+B;AACtC,MAAI;AACF,+BAA2B;AAC3B,UAAM,cAAc,QAAQ,iBAAiB,aAAa;AAC1D,QAAI,CAAC,eAAe,OAAO,gBAAgB,YAAY,EAAE,kBAAkB;AACzE,YAAM,IAAI,MAAM,yCAAyC;AAC3D,UAAM,SAAS;AACf,QAAI,OAAO,OAAO,iBAAiB;AACjC,YAAM,IAAI,MAAM,+CAA+C;AACjE,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,gBAAgB,OAAO;AAAA,MACvB,EAAE,OAAO,MAAM;AAAA,IACjB;AAAA,EACF;AACF;AACA,SAAS,WAAW,QAA+B;AACjD,SAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,QAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,QAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,EAAG,QAAO;AAC1H,QAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,IAAI;AACnD,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,CAAC;AACH;AACO,SAAS,aAAa,QAAgB,UAA+B,CAAC,GAAO;AAClF,EAAAC,IAAG,UAAUC,MAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACtD,QAAM,SAAS,WAAW;AAC1B,QAAM,SAAS,IAAI,OAAO,aAAa,QAAQ,EAAE,UAAU,QAAQ,QAAQ,QAAQ,EAAE,CAAC;AACtF,MAAI,gBAAgB;AACpB,QAAM,KAAS;AAAA,IACb,MAAM;AAAA,IACN,UAAU,QAAQ,QAAQ,QAAQ;AAAA,IAClC,KAAK,KAAmB;AACtB,aAAO,KAAK,GAAG;AAAA,IACjB;AAAA,IACA,QAAQ,KAAwB;AAC9B,YAAM,YAAY,OAAO,QAAQ,GAAG;AACpC,aAAO;AAAA,QACL,KAAK,IAAI,WAAsB,UAAU,IAAI,GAAG,WAAW,MAAM,CAAC;AAAA,QAClE,KAAK,IAAI,WAAsB,UAAU,IAAI,GAAG,WAAW,MAAM,CAAC;AAAA,QAClE,KAAK,IAAI,WAAsB,UAAU,IAAI,GAAG,WAAW,MAAM,CAAC;AAAA,MACpE;AAAA,IACF;AAAA,IACA,OAAO,KAA6C;AAClD,YAAM,aAAa,IAAI,KAAK,EAAE,QAAQ,MAAM,EAAE;AAC9C,UAAI,IAAI,KAAK,UAAU,GAAG;AACxB,eAAO,KAAK,UAAU,UAAU,EAAE;AAClC,eAAO,CAAC;AAAA,MACV;AACA,aAAO,OAAO,QAAQ,UAAU,UAAU,EAAE,EAAE,IAAI;AAAA,IACpD;AAAA,IACA,YAAe,IAAgB;AAC7B,UAAI,cAAe,QAAO,GAAG;AAC7B,sBAAgB;AAChB,aAAO,KAAK,iBAAiB;AAC7B,UAAI;AACF,cAAM,SAAS,GAAG;AAClB,eAAO,KAAK,QAAQ;AACpB,eAAO;AAAA,MACT,SAAS,OAAO;AACd,eAAO,KAAK,UAAU;AACtB,cAAM;AAAA,MACR,UAAE;AACA,wBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,QAAc;AACZ,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACA,KAAG,OAAO,sBAAsB;AAChC,KAAG,OAAO,mBAAmB;AAC7B,MAAI,CAAC,QAAQ,UAAU;AACrB,OAAG,OAAO,oBAAoB;AAC9B,QAAI,QAAQ,YAAY,MAAO,SAAQ,EAAE;AAAA,EAC3C;AACA,SAAO;AACT;AACO,SAAS,qBAAqB,QAAoB;AACvD,SAAO,aAAa,QAAQ,EAAE,UAAU,MAAM,SAAS,MAAM,CAAC;AAChE;;;AKpGO,SAAS,gBACd,IACA,UACA,QACQ;AACR,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,KAAG;AAAA,IACD;AAAA,EACF,EAAE,IAAI,UAAU,QAAQ,KAAK,GAAG;AAChC,SAAO;AAAA,IACL,GAAG,QAAQ,6CAA6C,EAAE,IAAI,QAAQ,GAAG;AAAA,EAC3E;AACF;AACO,SAAS,aACd,IACA,UAC0B;AAC1B,SAAO,GACJ,QAAQ,4CAA4C,EACpD,IAAI,QAAQ;AACjB;AACO,SAAS,iBACd,IACA,aACA,GAUQ;AACR,KAAG;AAAA,IACD;AAAA,EACF,EAAE;AAAA,IACA;AAAA,IACA,EAAE;AAAA,IACF,EAAE;AAAA,IACF,EAAE;AAAA,IACF,EAAE;AAAA,IACF,EAAE;AAAA,IACF,KAAK,UAAU,EAAE,gBAAgB,CAAC,CAAC;AAAA,IACnC,EAAE,QAAQ;AAAA,IACV,EAAE,YAAY,IAAI;AAAA,EACpB;AACA,SAAO;AAAA,IACL,GACG;AAAA,MACC;AAAA,IACF,EACC,IAAI,aAAa,EAAE,YAAY,GAAG;AAAA,EACvC;AACF;AACO,SAAS,iBAAiB,IAAmB;AAClD,SAAO,GACJ,QAAQ,0CAA0C,EAClD,IAAI;AACT;AACO,SAAS,WAAW,IAAQ,MAAmC;AACpE,SAAO,GACJ,QAAQ,2DAA2D,EACnE,IAAI,MAAM,IAAI;AACnB;AACO,SAAS,eAAe,IAAQ,QAAsB;AAC3D,aAAW,KAAK;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACE,OAAG,QAAQ,eAAe,CAAC,kBAAkB,EAAE,IAAI,MAAM;AAC3D,KAAG,QAAQ,uCAAuC,EAAE,IAAI,OAAO,MAAM,CAAC;AACxE;AACO,SAAS,eACd,IACA,QACA,MACM;AACN,QAAM,OAAO,GAAG;AAAA,IACd;AAAA,EACF;AACA,aAAW,KAAK;AACd,SAAK;AAAA,MACH;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AACJ;AACO,SAAS,cACd,IACA,QACA,GACQ;AACR,QAAM,KAAK;AAAA,IACT,GACG;AAAA,MACC;AAAA,IACF,EACC;AAAA,MACC;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE,WAAW,IAAI;AAAA,MACjB,EAAE;AAAA,MACF,EAAE;AAAA,IACJ,GAAG;AAAA,EACP;AACA,QAAM,OAAO,GAAG;AAAA,IACd;AAAA,EACF;AACA,KAAG;AAAA,IACD;AAAA,EACF,EAAE,IAAI,WAAW,EAAE,eAAe,EAAE,aAAa,OAAO,MAAM,CAAC;AAC/D,aAAW,KAAK,EAAE;AAChB,SAAK;AAAA,MACH;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AACF,QAAM,SAAS,GAAG;AAAA,IAChB;AAAA,EACF;AACA,aAAW,KAAK,EAAE;AAChB,WAAO,IAAI,aAAa,EAAE,eAAe,EAAE,eAAe,OAAO,MAAM,CAAC;AAC1E,SAAO;AACT;AACO,SAAS,cACd,IACA,QACA,GACQ;AACR,QAAM,MAAM;AAAA,IACV,GACG;AAAA,MACC;AAAA,IACF,EACC;AAAA,MACC;AAAA,MACA;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,IACJ,GAAG;AAAA,EACP;AACA,QAAM,MAAM;AAAA,IACV,GACG;AAAA,MACC;AAAA,IACF,EACC,IAAI,QAAQ,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,GAAG;AAAA,EAChE;AACA,QAAM,OAAO,GAAG;AAAA,IACd;AAAA,EACF;AACA,aAAW,KAAK,EAAE;AAChB,SAAK;AAAA,MACH;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AACF,SAAO;AACT;AACO,SAAS,oBACd,IACA,QACA,MACM;AACN,QAAM,OAAO,GAAG;AAAA,IACd;AAAA,EACF;AACA,aAAW,KAAK,MAAM;AACpB,UAAM,eAAe,EAAE,YAClB,GACE;AAAA,MACC;AAAA,IACF,EACC,IAAI,QAAQ,EAAE,SAAS,IAC1B,CAAC;AACL,SAAK;AAAA,MACH;AAAA,MACA,aAAa,WAAW,IAAI,aAAa,CAAC,GAAG,KAAK;AAAA,MAClD,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AACF;AACO,SAAS,eACd,IACA,QACA,MACM;AACN,QAAM,OAAO,GAAG;AAAA,IACd;AAAA,EACF;AACA,aAAW,KAAK;AACd,SAAK;AAAA,MACH;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE,YAAY,IAAI;AAAA,MAClB,KAAK,UAAU,EAAE,YAAY;AAAA,MAC7B,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE,cAAc,KAAK,UAAU,EAAE,WAAW,IAAI;AAAA,IAClD;AACJ;AACO,SAAS,wBAAwB,IAAQ,QAAgB,MAAoC;AAClG,QAAM,OAAO,GAAG,QAAQ,uPAAuP;AAC/Q,aAAW,KAAK,KAAM,MAAK,IAAI,QAAQ,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,IAAI,GAAG,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,uBAAuB,KAAK,UAAU,EAAE,oBAAoB,IAAI,IAAI;AACjR;AACO,SAAS,kBAAkB,IAAQ,QAAgB,MAA8B;AACtF,QAAM,aAAa,GAAG,QAAQ,mGAAmG;AACjI,QAAM,aAAa,GAAG,QAAQ,6MAA6M;AAC3O,aAAW,KAAK,MAAM;AACpB,UAAM,SAAS,WAAW,IAAI,QAAQ,EAAE,YAAY,EAAE,mBAAmB;AACzE,UAAM,SAAS,wBAAwB,IAAI,QAAQ,CAAC;AACpD,eAAW,IAAI,QAAQ,QAAQ,IAAI,OAAO,IAAI,EAAE,kBAAkB,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,OAAO,QAAQ,KAAK,KAAK,UAAU,EAAE,GAAG,EAAE,UAAU,mBAAmB,OAAO,UAAU,gBAAgB,OAAO,eAAe,CAAC,GAAG,OAAO,MAAM;AAAA,EAC/P;AACF;AACA,SAAS,6BAA6B,GAA4B;AAChE,SAAO,QAAQ,EAAE,cAAc,WAAW,GAAG,CAAC;AAChD;AACA,SAAS,wBAAwB,IAAQ,QAAgB,GAA2H;AAClL,QAAM,WAAW,EAAE;AACnB,QAAM,YAAY,GAAG,QAAQ,uGAAuG,EAAE,IAAI,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe;AACpM,MAAI,UAAU,WAAW,EAAG,QAAO,EAAE,IAAI,UAAU,CAAC,GAAG,MAAM,MAAM,QAAQ,YAAY,QAAQ,MAAM,UAAU,mBAAmB,gBAAgB,EAAE;AACpJ,MAAI,UAAU,SAAS,EAAG,QAAO,EAAE,IAAI,MAAM,QAAQ,aAAa,QAAQ,qDAAqD,UAAU,mBAAmB,gBAAgB,UAAU,OAAO;AAC7L,MAAI,SAAS,aAAa,2BAA2B,6BAA6B,CAAC,GAAG;AACpF,UAAM,YAAY,GAAG,QAAQ,4FAA4F,EAAE,IAAI,QAAQ,EAAE,YAAY,EAAE,eAAe;AACtK,QAAI,UAAU,WAAW,EAAG,QAAO,EAAE,IAAI,UAAU,CAAC,GAAG,MAAM,MAAM,QAAQ,YAAY,QAAQ,MAAM,UAAU,yCAAyC,gBAAgB,EAAE;AAC1K,QAAI,UAAU,SAAS,EAAG,QAAO,EAAE,IAAI,MAAM,QAAQ,aAAa,QAAQ,mEAAmE,UAAU,yCAAyC,gBAAgB,UAAU,OAAO;AAAA,EACnO;AACA,QAAM,OAAO,GAAG,QAAQ,0KAA0K,EAAE,IAAI,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe;AACrR,MAAI,SAAS,aAAa,kCAAkC,KAAK,SAAS,GAAG;AAC3E,UAAM,gBAAgB,KAAK,OAAO,CAAC,QAAQ,OAAO,IAAI,gBAAgB,EAAE,EAAE,SAAS,2BAA2B,KAAK,OAAO,IAAI,gBAAgB,EAAE,EAAE,SAAS,yBAAyB,CAAC;AACrL,QAAI,cAAc,SAAS,GAAG;AAC5B,YAAM,WAAW,KAAK,KAAK,CAAC,QAAQ,IAAI,SAAS,cAAc,KAAK,cAAc,CAAC;AACnF,aAAO,EAAE,IAAI,UAAU,MAAM,MAAM,QAAQ,YAAY,QAAQ,MAAM,UAAU,oCAAoC,gBAAgB,KAAK,OAAO;AAAA,IACjJ;AACA,WAAO,EAAE,IAAI,MAAM,QAAQ,aAAa,QAAQ,uGAAuG,UAAU,wCAAwC,gBAAgB,KAAK,OAAO;AAAA,EACvO;AACA,MAAI,KAAK,WAAW,EAAG,QAAO,EAAE,IAAI,KAAK,CAAC,GAAG,MAAM,MAAM,QAAQ,YAAY,QAAQ,MAAM,UAAU,SAAS,aAAa,iCAAiC,2CAA2C,kCAAkC,gBAAgB,EAAE;AAC3P,MAAI,KAAK,SAAS,EAAG,QAAO,EAAE,IAAI,MAAM,QAAQ,aAAa,QAAQ,oDAAoD,UAAU,kBAAkB,gBAAgB,KAAK,OAAO;AACjL,SAAO,EAAE,IAAI,MAAM,QAAQ,cAAc,QAAQ,0CAA0C,UAAU,SAAS,aAAa,iCAAiC,yCAAyC,sBAAsB,gBAAgB,EAAE;AAC/O;AACO,SAAS,YACd,IACA,QACA,MACM;AACN,QAAM,OAAO,GAAG;AAAA,IACd;AAAA,EACF;AACA,aAAW,KAAK;AACd,SAAK;AAAA,MACH;AAAA,MACA;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE,aAAa,KAAK,UAAU,EAAE,UAAU,IAAI;AAAA,MAC9C,EAAE,WAAW,KAAK,UAAU,EAAE,QAAQ,IAAI;AAAA,MAC1C,EAAE,gBAAgB,QAAQ;AAAA,MAC1B,EAAE,gBAAgB,YAAY;AAAA,MAC9B,EAAE,gBAAgB,SAAS;AAAA,MAC3B,EAAE,gBAAgB,UAAU,IAAI;AAAA,MAChC;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AACJ;;;AC/VA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAEjB,eAAsB,mBACpB,UACA,OACmB;AACnB,QAAM,YAAY;AAAA,IAChB,MAAM,aAAa,UAAU,KAC7B,MAAM,aAAa,OACnB,MAAM,aAAa,sBAAsB;AAAA,EAC3C;AACA,QAAM,WAAW,MAAM,UAAU,UAAU,MAAM;AACjD,QAAM,cAAc,MAAM,QAAQ;AAAA,IAChC,CAAC,iBAAiB,iBAAiB,iBAAiB,eAAe,EAAE;AAAA,MACnE,OAAO,MACLD,IACG,OAAOC,MAAK,KAAK,UAAU,CAAC,CAAC,EAC7B,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AAAA,IACxB;AAAA,EACF;AACA,QAAM,SACJ,OAAO,KAAK,MAAM,YAAY,EAAE,SAAS,sBAAsB,KAC/D,MAAM,aAAa,SAAS,QAAQ,MAAM;AAC5C,MAAI,UAAU,SAAS,SAAS,EAAG,QAAO;AAC1C,MAAI,OAAQ,QAAO;AACnB,MAAI,cAAc,SAAS,SAAS,KAAK,YAAY,KAAK,OAAO;AAC/D,WAAO;AACT,MAAI,SAAS,SAAS;AACpB,WAAO,YAAY,KAAK,OAAO,IAAI,gBAAgB;AACrD,SAAO;AACT;AAEA,eAAe,UAAU,MAAc,QAAmC;AACxE,QAAM,MAAgB,CAAC;AACvB,iBAAe,KAAK,KAA4B;AAC9C,UAAM,UAAU,MAAMD,IACnB,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC,EACpC,MAAM,MAAM,CAAC,CAAC;AACjB,eAAW,KAAK,SAAS;AACvB,UAAI,EAAE,YAAY,GAAG;AACnB,YAAI,CAAC,CAAC,gBAAgB,QAAQ,OAAO,MAAM,EAAE,SAAS,EAAE,IAAI;AAC1D,gBAAM,KAAKC,MAAK,KAAK,KAAK,EAAE,IAAI,CAAC;AAAA,MACrC,WAAW,EAAE,KAAK,SAAS,MAAM,EAAG,KAAI,KAAKA,MAAK,KAAK,KAAK,EAAE,IAAI,CAAC;AAAA,IACrE;AAAA,EACF;AACA,QAAM,KAAK,IAAI;AACf,SAAO;AACT;;;AC1CO,SAAS,aAAa,OAAwB;AACnD,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;;;ACTA,OAAOC,SAAQ;AACf,OAAOC,WAAU;;;ACDjB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAO,QAAQ;AAKf,SAAS,OAAO,QAAuB,KAAqB;AAC1D,SAAO,OAAO,8BAA8B,GAAG,EAAE,OAAO;AAC1D;AACA,SAAS,OAAO,MAAwE;AACtF,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,GAAG,aAAa,IAAI,KAAK,GAAG,gBAAgB,IAAI,KAAK,GAAG,iBAAiB,IAAI,EAAG,QAAO,KAAK;AAChG,SAAO;AACT;AACA,SAAS,eAAe,MAAmD;AACzE,SAAO,GAAG,sBAAsB,IAAI,KAAK,GAAG,oBAAoB,IAAI,KAAK,GAAG,qBAAqB,IAAI,KAAK,GAAG,gBAAgB,IAAI;AACnI;AACA,SAAS,SAAS,MAAwB;AACxC,SAAO,QAAQ,GAAG,yBAAyB,IAAsB,IAAI,GAAG,cAAc,MAAM;AAC9F;AACA,SAAS,oBAAoB,MAAqC;AAChE,QAAM,QAAQ,GAAG,yBAAyB,IAAI;AAC9C,UAAQ,QAAQ,GAAG,cAAc,aAAa,MAAM,QAAQ,GAAG,cAAc,eAAe;AAC9F;AACA,SAAS,mBAAmB,QAA4C;AACtE,QAAM,UAAU,oBAAI,IAAoB;AACxC,QAAM,QAAQ,CAAC,SAAwB;AACrC,QAAI,GAAG,oBAAoB,IAAI,KAAK,KAAK,gBAAgB,GAAG,eAAe,KAAK,YAAY,GAAG;AAC7F,iBAAW,MAAM,KAAK,aAAa,SAAU,SAAQ,KAAK,GAAG,gBAAgB,GAAG,MAAM,MAAM,GAAG,KAAK,IAAI;AAAA,IAC1G;AACA,OAAG,aAAa,MAAM,KAAK;AAAA,EAC7B;AACA,QAAM,MAAM;AACZ,SAAO;AACT;AACA,SAAS,iBAAiB,OAAoC;AAC5D,SAAO,QAAQ,OAAO,WAAW,GAAG,CAAC;AACvC;AACA,SAAS,iBAAiB,MAAwB;AAChD,SAAO,GAAG,qBAAqB,IAAI,KAAK,GAAG,gBAAgB,IAAI,KAAK,GAAG,oBAAoB,IAAI;AACjG;AAKA,IAAM,wBAAwB,oBAAI,IAAI,CAAC,QAAQ,YAAY,QAAQ,aAAa,OAAO,UAAU,UAAU,WAAW,QAAQ,SAAS,eAAe,eAAe,QAAQ,SAAS,QAAQ,OAAO,OAAO,KAAK,CAAC;AAClN,IAAM,gBAAgB,oBAAI,IAAI,CAAC,SAAS,SAAS,QAAQ,QAAQ,SAAS,SAAS,KAAK,CAAC;AACzF,IAAM,gBAAgB,oBAAI,IAAI,CAAC,QAAQ,UAAU,SAAS,UAAU,UAAU,WAAW,QAAQ,QAAQ,WAAW,SAAS,CAAC;AAC9H,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EAClC;AAAA,EAAO;AAAA,EAAO;AAAA,EAAW;AAAA,EACzB;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAO;AAAA,EACzB;AAAA,EAAS;AAAA,EAAa;AAAA,EAAc;AAAA,EAAkB;AAAA,EAAe;AAAA,EAAa;AAAA,EAAY;AAAA,EAC9F;AAAA,EAAe;AAAA,EAAqB;AAAA,EACpC;AAAA,EAAa;AAAA,EAAc;AAAA,EAAqB;AAAA,EAAc;AAAA,EAAe;AAAA,EAAc;AAAA,EAC3F;AAAA,EAAgB;AAAA,EAAgB;AAAA,EAAiB;AAAA,EACjD;AAAA,EAAW;AACb,CAAC;AACD,IAAM,cAAc,oBAAI,IAAI,CAAC,UAAU,UAAU,UAAU,UAAU,QAAQ,CAAC;AAC9E,IAAM,iBAAiB,oBAAI,IAAI,CAAC,UAAU,SAAS,QAAQ,QAAQ,QAAQ,CAAC;AAC5E,IAAM,mBAAmB,oBAAI,IAAI,CAAC,QAAQ,WAAW,QAAQ,IAAI,CAAC;AAClE,SAAS,SAAS,MAAiG;AACjH,MAAI,GAAG,aAAa,IAAI,EAAG,QAAO,EAAE,YAAY,KAAK,MAAM,OAAO,KAAK,KAAK;AAC5E,MAAI,GAAG,2BAA2B,IAAI,GAAG;AACvC,UAAM,OAAO,KAAK,WAAW,QAAQ;AACrC,UAAM,OAAO,KAAK,MAAM,GAAG,EAAE,CAAC;AAC9B,WAAO,EAAE,YAAY,KAAK,QAAQ,GAAG,OAAO,SAAS,SAAS,SAAY,MAAM,QAAQ,KAAK,KAAK,MAAM,UAAU,KAAK;AAAA,EACzH;AACA,SAAO,EAAE,YAAY,KAAK,QAAQ,EAAE;AACtC;AACA,SAAS,cAAc,MAAyC;AAC9D,MAAI,CAAC,GAAG,iBAAiB,IAAI,KAAK,CAAC,GAAG,aAAa,KAAK,UAAU,KAAK,KAAK,WAAW,SAAS,UAAW,QAAO;AAClH,QAAM,QAAQ,KAAK,UAAU,CAAC;AAC9B,SAAO,SAAS,GAAG,gBAAgB,KAAK,IAAI,MAAM,OAAO;AAC3D;AACA,SAAS,qBAAqB,QAA6F;AACzH,MAAI,OAAO,SAAS,YAAY,IAAI,OAAO,KAAK,EAAG,QAAO;AAC1D,MAAI,OAAO,eAAe,aAAa,OAAO,WAAW,WAAW,cAAc,KAAK,OAAO,WAAW,WAAW,eAAe,KAAK,OAAO,WAAW,WAAW,YAAY,EAAG,QAAO;AAC3L,MAAI,OAAO,UAAU,SAAS,OAAO,UAAU,eAAe,IAAI,OAAO,MAAM,EAAG,QAAO;AACzF,MAAI,OAAO,UAAU,iBAAiB,IAAI,OAAO,MAAM,EAAG,QAAO;AACjE,MAAI,OAAO,SAAS,cAAc,IAAI,OAAO,KAAK,EAAG,QAAO;AAC5D,MAAI,OAAO,WAAW,WAAW,aAAa,EAAG,QAAO;AACxD,SAAO;AACT;AACA,SAAS,QAAQ,SAAiC,MAAgD;AAChG,SAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ,EAAE,WAAW,IAAI,EAAE,KAAK,CAAC,GAAG,MAAO,EAAE,UAAU,EAAE,aAAc,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AAChJ;AACA,SAAS,iBAAiB,MAAmC,QAAuD;AAClH,SAAO,KAAK,IAAI,CAAC,QAAQ;AACvB,QAAI,GAAG,aAAa,GAAG,EAAG,QAAO,EAAE,MAAM,cAAc,MAAM,IAAI,KAAK;AACtE,QAAI,GAAG,0BAA0B,GAAG,GAAG;AACrC,YAAM,aAA6C,CAAC;AACpD,iBAAW,QAAQ,IAAI,YAAY;AACjC,YAAI,GAAG,8BAA8B,IAAI,EAAG,YAAW,KAAK,EAAE,MAAM,aAAa,UAAU,KAAK,KAAK,MAAM,UAAU,KAAK,KAAK,KAAK,CAAC;AACrI,YAAI,GAAG,qBAAqB,IAAI,GAAG;AACjC,gBAAM,WAAW,OAAO,KAAK,IAAI;AACjC,cAAI,YAAY,GAAG,aAAa,KAAK,WAAW,EAAG,YAAW,KAAK,EAAE,MAAM,uBAAuB,UAAU,UAAU,UAAU,KAAK,YAAY,KAAK,CAAC;AAAA,QACzJ;AAAA,MACF;AACA,aAAO,EAAE,MAAM,kBAAkB,WAAW;AAAA,IAC9C;AACA,WAAO,EAAE,MAAM,eAAe,YAAY,IAAI,QAAQ,MAAM,EAAE;AAAA,EAChE,CAAC;AACH;AACA,SAAS,iBAAiB,MAAsB,aAAiD;AAC/F,MAAI,GAAG,aAAa,IAAI,EAAG,QAAO,KAAK;AACvC,MAAI,eAAe,GAAG,aAAa,WAAW,EAAG,QAAO,YAAY;AACpE,SAAO;AACT;AAEA,SAAS,qBAAqB,SAAkC,WAAmB,QAAuB,UAA6C;AACrJ,SAAO,QAAQ,SAAS,QAAQ,CAAC,YAAsC;AACrE,QAAI,QAAQ,kBAAkB,GAAG,uBAAuB,QAAQ,IAAI,KAAK,GAAG,sBAAsB,QAAQ,IAAI,EAAG,QAAO,CAAC;AACzH,UAAM,WAAW,QAAQ,eAAe,OAAO,QAAQ,YAAY,IAAI,OAAO,QAAQ,IAAI;AAC1F,QAAI,CAAC,SAAU,QAAO,CAAC;AACvB,UAAM,QAAQ,iBAAiB,QAAQ,MAAM,QAAQ,WAAW;AAChE,WAAO,QAAQ,CAAC,EAAE,WAAW,UAAU,OAAO,MAAM,gCAAgC,MAAM,OAAO,QAAQ,SAAS,SAAS,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;AAAA,EAC5I,CAAC;AACH;AACA,SAAS,yBAAyB,IAAgC,QAAiD;AACjH,QAAM,iBAAiB,IAAI,IAAI,GAAG,WAAW,QAAQ,CAAC,UAAU,GAAG,aAAa,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC;AACrH,MAAI,CAAC,GAAG,QAAQ,eAAe,SAAS,EAAG,QAAO,CAAC;AACnD,QAAM,UAAoC,CAAC;AAC3C,QAAM,oBAAoB,CAAC,MAAqB,OAAsB,SAAwB;AAC5F,QAAI,CAAC,GAAG,0BAA0B,IAAI,KAAK,CAAC,GAAG,aAAa,KAAK,KAAK,CAAC,eAAe,IAAI,MAAM,IAAI,EAAG;AACvG,eAAW,QAAQ,KAAK,YAAY;AAClC,UAAI,CAAC,GAAG,qBAAqB,IAAI,EAAG;AACpC,YAAM,WAAW,OAAO,KAAK,IAAI;AACjC,UAAI,YAAY,GAAG,aAAa,KAAK,WAAW,EAAG,SAAQ,KAAK,EAAE,WAAW,MAAM,MAAM,UAAU,OAAO,KAAK,YAAY,MAAM,MAAM,gCAAgC,MAAM,OAAO,QAAQ,KAAK,SAAS,MAAM,CAAC,EAAE,CAAC;AAAA,IACtN;AAAA,EACF;AACA,QAAM,QAAQ,CAAC,SAAwB;AACrC,QAAI,GAAG,sBAAsB,IAAI,KAAK,GAAG,uBAAuB,KAAK,IAAI,KAAK,KAAK,eAAe,GAAG,aAAa,KAAK,WAAW,KAAK,eAAe,IAAI,KAAK,YAAY,IAAI,EAAG,SAAQ,KAAK,GAAG,qBAAqB,KAAK,MAAM,KAAK,YAAY,MAAM,QAAQ,IAAI,CAAC;AACtQ,QAAI,GAAG,mBAAmB,IAAI,KAAK,KAAK,cAAc,SAAS,GAAG,WAAW,YAAa,mBAAkB,GAAG,0BAA0B,KAAK,IAAI,IAAI,KAAK,KAAK,aAAa,KAAK,MAAM,KAAK,OAAO,IAAI;AACxM,OAAG,aAAa,MAAM,KAAK;AAAA,EAC7B;AACA,QAAM,GAAG,IAAI;AACb,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,QAAQ,OAAO,CAAC,UAAU;AAAE,UAAM,MAAM,GAAG,MAAM,SAAS,IAAI,MAAM,QAAQ,IAAI,MAAM,KAAK;AAAI,QAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AAAO,SAAK,IAAI,GAAG;AAAG,WAAO;AAAA,EAAM,CAAC;AACtK;AACA,SAAS,kBAAkB,QAAmE;AAC5F,SAAO,OAAO,QAAQ,CAAC,OAAO,UAA8B;AAC1D,QAAI,GAAG,aAAa,MAAM,IAAI,EAAG,QAAO,CAAC,EAAE,OAAO,MAAM,cAAc,MAAM,MAAM,KAAK,KAAK,CAAC;AAC7F,QAAI,CAAC,GAAG,uBAAuB,MAAM,IAAI,EAAG,QAAO,CAAC;AACpD,UAAM,aAAa,MAAM,KAAK,SAAS,QAAQ,CAAC,YAAwD;AACtG,UAAI,QAAQ,kBAAkB,GAAG,uBAAuB,QAAQ,IAAI,KAAK,GAAG,sBAAsB,QAAQ,IAAI,EAAG,QAAO,CAAC;AACzH,YAAM,WAAW,QAAQ,eAAe,OAAO,QAAQ,YAAY,IAAI,OAAO,QAAQ,IAAI;AAC1F,UAAI,CAAC,SAAU,QAAO,CAAC;AACvB,YAAM,QAAQ,iBAAiB,QAAQ,MAAM,QAAQ,WAAW;AAChE,aAAO,QAAQ,CAAC,EAAE,UAAU,MAAM,CAAC,IAAI,CAAC;AAAA,IAC1C,CAAC;AACD,WAAO,WAAW,SAAS,IAAI,CAAC,EAAE,OAAO,MAAM,kBAAkB,WAAW,CAAC,IAAI,CAAC;AAAA,EACpF,CAAC;AACH;AACA,eAAsB,uBAAuB,UAAkB,UAAyF;AACtJ,QAAM,OAAO,MAAMC,IAAG,SAASC,MAAK,KAAK,UAAU,QAAQ,GAAG,MAAM;AACpE,QAAM,SAAS,GAAG,iBAAiB,UAAU,MAAM,GAAG,aAAa,QAAQ,MAAM,SAAS,SAAS,KAAK,IAAI,GAAG,WAAW,KAAK,GAAG,WAAW,EAAE;AAC/I,QAAM,aAAa,cAAc,QAAQ;AACzC,QAAM,UAAkC,CAAC;AACzC,QAAM,QAA0B,CAAC;AACjC,QAAM,UAAU,oBAAI,IAAoB;AACxC,QAAM,cAAc,mBAAmB,MAAM;AAC7C,QAAM,gBAAgB,oBAAI,IAAY;AACtC,QAAM,kBAAkB,oBAAI,IAAY;AACxC,QAAM,kBAAkB,oBAAI,IAAY;AACxC,QAAM,iBAAiB,oBAAI,IAA6E;AACxG,QAAM,iBAAiB,oBAAI,IAAiF;AAC5G,QAAM,YAAY,CAAC,MAAc,WAAmB,MAAe,YAAqB,cAAuB,aAA6C;AAC1J,UAAM,aAAa,YAAY,MAAM,GAAG,EAAE,CAAC,KAAK;AAChD,UAAM,qBAAqB,gBAAgB,YAAY,IAAI,aAAa,aAAa,SAAS;AAC9F,UAAM,gBAAgB,aAAa,GAAG,UAAU,IAAI,SAAS,KAAK;AAClE,UAAM,iBAAiB,aAAa,cAAc,IAAI,UAAU,IAAI;AACpE,UAAM,sBAAsB,SAAS,YAAY,aAAa,gBAAgB,IAAI,UAAU,KAAK,GAAG,oBAAoB,IAAI,MAAM,GAAG,yBAAyB,IAAI,IAAI,GAAG,cAAc,YAAY,KAAK,oBAAoB,IAAI,IAAI;AACpO,UAAM,wBAAwB,uBAAuB,iBAAiB,gBAAgB;AACtF,UAAM,WAAW,eAAe,IAAI,IAAI,kBAAkB,KAAK,UAAU,IAAI;AAC7E,UAAM,SAAS,UAAU,QAAQ,CAAC,YAAY,QAAQ,SAAS,eAAe,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;AACjG,UAAM,iBAAiB,aAAa,sBAAsB,EAAE,QAAQ,yBAAyB,eAAe,YAAY,aAAa,GAAG,yBAAyB,IAAsB,IAAI,GAAG,cAAc,YAAY,IAAI,kBAAkB,gBAAgB,YAAY,OAAO,IAAI,qBAAqB,EAAE,cAAc,oBAAoB,QAAQ,qBAAqB,IAAI,iBAAiB,EAAE,cAAc,eAAe,QAAQ,0BAA0B,IAAI;AACrc,UAAM,UAAU,eAAe,IAAI,IAAI,yBAAyB,MAAM,MAAM,IAAI,CAAC;AACjF,UAAM,oBAAoB,EAAE,GAAI,YAAY,SAAS,SAAS,IAAI,EAAE,YAAY,QAAQ,mBAAmB,SAAS,IAAI,CAAC,GAAI,GAAI,QAAQ,SAAS,IAAI,EAAE,0BAA0B,QAAQ,IAAI,CAAC,EAAG;AAClM,YAAQ,KAAK,EAAE,MAAM,WAAW,SAAS,kBAAkB,gBAAgB,WAAW,cAAc,uBAAuB,eAAe,YAAY,WAAW,OAAO,QAAQ,KAAK,SAAS,MAAM,CAAC,GAAG,SAAS,OAAO,QAAQ,KAAK,OAAO,CAAC,GAAG,aAAa,KAAK,SAAS,MAAM,GAAG,WAAW,KAAK,OAAO,GAAG,UAAU,SAAS,IAAI,KAAK,QAAQ,qBAAqB,GAAG,sBAAsB,iBAAiB,EAAE,GAAG,gBAAgB,GAAG,kBAAkB,IAAI,YAAY,SAAS,SAAS,IAAI,oBAAoB,OAAU,CAAC;AAAA,EAClgB;AACA,QAAM,iBAAiB,CAAC,YAAoB,cAAsB,MAAe,uBAAsC;AACrH,YAAQ,KAAK,EAAE,MAAM,gBAAgB,WAAW,cAAc,cAAc,cAAc,eAAe,GAAG,UAAU,IAAI,YAAY,IAAI,YAAY,WAAW,OAAO,QAAQ,KAAK,SAAS,MAAM,CAAC,GAAG,SAAS,OAAO,QAAQ,KAAK,OAAO,CAAC,GAAG,aAAa,KAAK,SAAS,MAAM,GAAG,WAAW,KAAK,OAAO,GAAG,UAAU,MAAM,sBAAsB,EAAE,QAAQ,6BAA6B,YAAY,cAAc,mBAAmB,EAAE,CAAC;AAAA,EAC7a;AACA,QAAM,eAAe,CAAC,SAAwB;AAC5C,QAAI,GAAG,oBAAoB,IAAI,KAAK,GAAG,gBAAgB,KAAK,eAAe,GAAG;AAC5E,YAAM,aAAa,KAAK,gBAAgB;AACxC,YAAM,SAAS,KAAK;AACpB,UAAI,QAAQ,KAAM,SAAQ,IAAI,OAAO,KAAK,MAAM,UAAU;AAC1D,YAAM,QAAQ,QAAQ;AACtB,UAAI,SAAS,GAAG,eAAe,KAAK,EAAG,YAAW,MAAM,MAAM,SAAU,SAAQ,IAAI,GAAG,KAAK,MAAM,UAAU;AAC5G,UAAI,SAAS,GAAG,kBAAkB,KAAK,EAAG,SAAQ,IAAI,MAAM,KAAK,MAAM,UAAU;AAAA,IACnF;AACA,QAAI,GAAG,oBAAoB,IAAI,GAAG;AAChC,iBAAW,eAAe,KAAK,gBAAgB,cAAc;AAC3D,cAAM,iBAAiB,YAAY,cAAc,cAAc,YAAY,WAAW,IAAI;AAC1F,YAAI,GAAG,aAAa,YAAY,IAAI,KAAK,eAAgB,SAAQ,IAAI,YAAY,KAAK,MAAM,cAAc;AAC1G,YAAI,GAAG,uBAAuB,YAAY,IAAI,KAAK;AAAgB,qBAAW,WAAW,YAAY,KAAK,SAAU,KAAI,GAAG,aAAa,QAAQ,IAAI,EAAG,SAAQ,IAAI,QAAQ,KAAK,MAAM,cAAc;AAAA;AAAA,MACtM;AAAA,IACF;AACA,OAAG,aAAa,MAAM,YAAY;AAAA,EACpC;AACA,eAAa,MAAM;AACnB,QAAM,eAAe,CAAC,MAAe,gBAA+B;AAClE,QAAI,GAAG,mBAAmB,IAAI,KAAK,KAAK,MAAM;AAC5C,sBAAgB,IAAI,KAAK,KAAK,IAAI;AAClC,UAAI,SAAS,IAAI,KAAK,YAAY,IAAI,KAAK,KAAK,IAAI,EAAG,iBAAgB,IAAI,KAAK,KAAK,IAAI;AACzF,iBAAW,UAAU,KAAK,QAAS,cAAa,QAAQ,KAAK,KAAK,IAAI;AACtE;AAAA,IACF;AACA,QAAI,GAAG,oBAAoB,IAAI,GAAG;AAChC,YAAM,YAAY,OAAO,KAAK,IAAI;AAClC,UAAI,UAAW,WAAU,UAAU,WAAW,MAAM,WAAW;AAAA,IACjE,WAAW,GAAG,sBAAsB,IAAI,KAAK,eAAe,KAAK,gBAAgB,GAAG,gBAAgB,KAAK,WAAW,KAAK,GAAG,qBAAqB,KAAK,WAAW,IAAI;AACnK,YAAM,YAAY,OAAO,KAAK,IAAI;AAClC,UAAI,UAAW,WAAU,UAAU,WAAW,KAAK,aAAa,aAAa,QAAW,EAAE,QAAQ,2BAA2B,YAAY,GAAG,gBAAgB,KAAK,WAAW,IAAI,4BAA4B,+BAA+B,CAAC;AAAA,IAC9O,WAAW,GAAG,sBAAsB,IAAI,KAAK,KAAK,KAAM,WAAU,YAAY,KAAK,KAAK,MAAM,MAAM,QAAW,SAAS,IAAI,IAAI,KAAK,KAAK,OAAO,MAAS;AAAA,aACjJ,GAAG,oBAAoB,IAAI,GAAG;AACrC,iBAAW,KAAK,KAAK,gBAAgB,cAAc;AACjD,cAAM,YAAY,OAAO,EAAE,IAAI;AAC/B,YAAI,CAAC,aAAa,CAAC,EAAE,YAAa;AAClC,YAAI,eAAe,EAAE,WAAW,EAAG,WAAU,YAAY,WAAW,EAAE,aAAa,QAAW,SAAS,IAAI,IAAI,YAAY,YAAY,IAAI,SAAS,CAAC;AACrJ,YAAI,GAAG,0BAA0B,EAAE,WAAW,GAAG;AAC/C,gBAAM,mBAAmB,SAAS,IAAI,KAAK,YAAY,IAAI,SAAS;AACpE,cAAI,iBAAkB,eAAc,IAAI,SAAS;AACjD,qBAAW,QAAQ,EAAE,YAAY,YAAY;AAC3C,gBAAI,oBAAoB,GAAG,8BAA8B,IAAI,EAAG,gBAAe,WAAW,KAAK,KAAK,MAAM,KAAK,MAAM,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AAChJ,gBAAI,GAAG,qBAAqB,IAAI,KAAK,iBAAiB,KAAK,WAAW,GAAG;AACvE,oBAAM,WAAW,OAAO,KAAK,IAAI;AACjC,kBAAI,SAAU,WAAU,iBAAiB,UAAU,KAAK,aAAa,SAAS;AAAA,YAChF,WAAW,GAAG,oBAAoB,IAAI,GAAG;AACvC,oBAAM,WAAW,OAAO,KAAK,IAAI;AACjC,kBAAI,SAAU,WAAU,iBAAiB,UAAU,MAAM,SAAS;AAAA,YACpE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,MAAO,IAAG,aAAa,MAAM,CAAC,UAAU,aAAa,OAAO,WAAW,CAAC;AAAA,EAC1E;AACA,eAAa,MAAM;AAEnB,QAAM,qBAAqB,CAAC,SAAoE;AAC9F,QAAI,CAAC,GAAG,gBAAgB,IAAI,KAAK,CAAC,GAAG,qBAAqB,IAAI,EAAG,QAAO;AACxE,QAAI,CAAC,GAAG,iBAAiB,KAAK,MAAM,EAAG,QAAO;AAC9C,UAAM,SAAS,SAAS,KAAK,OAAO,UAAU;AAC9C,UAAM,SAAS,OAAO,UAAU,OAAO;AACvC,WAAO,QAAQ,UAAU,CAAC,aAAa,UAAU,WAAW,MAAM,QAAQ,OAAO,OAAO,QAAQ,OAAO,SAAS,UAAU,WAAW,EAAE,SAAS,MAAM,CAAC;AAAA,EACzJ;AACA,QAAM,uBAAuB,CAAC,SAAwB;AACpD,QAAI,mBAAmB,IAAI,KAAK,8BAA8B,IAAI,GAAG;AACnE,YAAM,YAAY,OAAO,QAAQ,KAAK,SAAS,MAAM,CAAC;AACtD,YAAM,OAAO,YAAY,SAAS;AAClC,cAAQ,KAAK,EAAE,MAAM,YAAY,WAAW,MAAM,eAAe,UAAU,UAAU,IAAI,IAAI,IAAI,YAAY,WAAW,SAAS,OAAO,QAAQ,KAAK,OAAO,CAAC,GAAG,aAAa,KAAK,SAAS,MAAM,GAAG,WAAW,KAAK,OAAO,GAAG,UAAU,OAAO,sBAAsB,EAAE,QAAQ,+BAA+B,cAAc,UAAU,EAAE,CAAC;AAAA,IAC3U;AACA,OAAG,aAAa,MAAM,oBAAoB;AAAA,EAC5C;AACA,uBAAqB,MAAM;AAE3B,QAAM,gCAAgC,CAAC,SAAwB;AAC7D,QAAI,GAAG,iBAAiB,IAAI,KAAK,GAAG,2BAA2B,KAAK,UAAU,KAAK,KAAK,WAAW,KAAK,SAAS,MAAM;AACrH,YAAM,WAAW,KAAK,WAAW,WAAW,QAAQ,MAAM;AAC1D,YAAM,WAAW,KAAK,UAAU,CAAC;AACjC,WAAK,aAAa,SAAS,6EAA6E,KAAK,QAAQ,MAAM,aAAa,GAAG,gBAAgB,QAAQ,KAAK,GAAG,gCAAgC,QAAQ,IAAI;AACrN,cAAM,YAAY,OAAO,QAAQ,KAAK,SAAS,MAAM,CAAC;AACtD,cAAM,YAAY,SAAS,KAAK,QAAQ,oBAAoB,GAAG;AAC/D,cAAM,OAAO,SAAS,SAAS,IAAI,SAAS;AAC5C,gBAAQ,KAAK,EAAE,MAAM,sBAAsB,WAAW,MAAM,eAAe,UAAU,UAAU,IAAI,IAAI,IAAI,YAAY,WAAW,SAAS,OAAO,QAAQ,KAAK,OAAO,CAAC,GAAG,aAAa,KAAK,SAAS,MAAM,GAAG,WAAW,KAAK,OAAO,GAAG,UAAU,OAAO,sBAAsB,EAAE,QAAQ,gCAAgC,WAAW,SAAS,MAAM,kBAAkB,WAAW,SAAS,EAAE,CAAC;AAAA,MAC9X;AAAA,IACF;AACA,OAAG,aAAa,MAAM,6BAA6B;AAAA,EACrD;AACA,gCAA8B,MAAM;AACpC,QAAM,sBAAsB,CAAC,SAAwB;AACnD,QAAI,GAAG,sBAAsB,IAAI,KAAK,GAAG,aAAa,KAAK,IAAI,KAAK,KAAK,eAAe,GAAG,iBAAiB,KAAK,WAAW,KAAK,GAAG,2BAA2B,KAAK,YAAY,UAAU,GAAG;AAC3L,YAAM,SAAS,SAAS,KAAK,YAAY,UAAU;AACnD,YAAM,eAAe,OAAO,QAAQ,QAAQ,IAAI,OAAO,KAAK,IAAI;AAChE,UAAI,OAAO,UAAU,gBAAgB,iBAAiB,YAAY,EAAG,gBAAe,IAAI,KAAK,KAAK,MAAM,EAAE,cAAc,SAAS,OAAO,YAAY,cAAc,KAAK,KAAK,KAAK,CAAC;AAAA,IACpL;AACA,OAAG,aAAa,MAAM,mBAAmB;AAAA,EAC3C;AACA,sBAAoB,MAAM;AAC1B,QAAM,wBAAwB,CAAC,cAAsB,WAAmB,iBAAgC;AACtG,UAAM,eAAe,QAAQ,IAAI,SAAS;AAC1C,QAAI,CAAC,oBAAoB,IAAI,SAAS,MAAO,gBAAgB,iBAAiB,YAAY,KAAM,gBAAgB,IAAI,SAAS,GAAI,gBAAe,IAAI,cAAc,EAAE,WAAW,cAAc,aAAa,CAAC;AAAA,EAC7M;AACA,QAAM,sBAAsB,CAAC,SAAwB;AACnD,QAAI,GAAG,sBAAsB,IAAI,KAAK,GAAG,aAAa,KAAK,IAAI,KAAK,KAAK,eAAe,GAAG,gBAAgB,KAAK,WAAW,KAAK,GAAG,aAAa,KAAK,YAAY,UAAU,GAAG;AAC5K,4BAAsB,KAAK,KAAK,MAAM,KAAK,YAAY,WAAW,IAAI;AAAA,IACxE;AACA,QAAI,GAAG,sBAAsB,IAAI,KAAK,KAAK,eAAe,GAAG,gBAAgB,KAAK,WAAW,KAAK,GAAG,aAAa,KAAK,YAAY,UAAU,GAAG;AAC9I,YAAM,eAAe,OAAO,KAAK,IAAI;AACrC,UAAI,aAAc,uBAAsB,QAAQ,YAAY,IAAI,KAAK,YAAY,WAAW,MAAM,YAAY;AAAA,IAChH;AACA,OAAG,aAAa,MAAM,mBAAmB;AAAA,EAC3C;AACA,sBAAoB,MAAM;AAC1B,QAAM,iBAAiB,IAAI,IAAI,QAAQ,QAAQ,CAAC,QAAQ,CAAC,IAAI,WAAW,IAAI,aAAa,CAAC,CAAC;AAC3F,QAAM,aAAa,CAAC,SAAwB;AAC1C,QAAI,GAAG,iBAAiB,IAAI,GAAG;AAC7B,YAAM,OAAO,OAAO,QAAQ,KAAK,SAAS,MAAM,CAAC;AACjD,YAAM,SAAS,QAAQ,SAAS,IAAI;AACpC,UAAI,QAAQ;AACV,cAAM,SAAS,SAAS,KAAK,UAAU;AACvC,cAAM,QAAQ,OAAO,QAAQ,eAAe,IAAI,OAAO,KAAK,IAAI;AAChE,cAAM,YAAY,OAAO,QAAQ,eAAe,IAAI,OAAO,KAAK,IAAI,YAAe,OAAO,WAAW,eAAe,IAAI,OAAO,QAAQ,IAAI;AAC3I,cAAM,eAAe,UAAU,gBAAgB,OAAO,iBAAiB,OAAO,QAAQ,QAAQ,IAAI,OAAO,KAAK,IAAI,YAAe,OAAO,UAAU,OAAO,QAAQ,QAAQ,IAAI,OAAO,KAAK,IAAI;AAC7L,cAAM,mBAAmB,OAAO,aAAa;AAC7C,cAAM,aAAa,YAAY,OAAO,SAAS,GAAG,SAAS,SAAS,IAAI,OAAO,MAAM,KAAK,SAAS,OAAO,SAAS,OAAO,SAAS,mBAAmB,OAAO,SAAS,OAAO,UAAU,OAAO,QAAQ,GAAG,OAAO,KAAK,IAAI,OAAO,MAAM,KAAK,OAAO;AAClP,cAAM,YAAY,OAAO,cAAc,SAAS,GAAG,IAAI,OAAO,cAAc,MAAM,GAAG,EAAE,CAAC,IAAI;AAC5F,cAAM,aAAa,oBAAoB,aAAa,OAAO,SAAS,GAAG,SAAS,IAAI,OAAO,MAAM,KAAK;AACtG,cAAM,aAAa,OAAO,UAAU,SAAS,SAAS,KAAK,OAAO,UAAU,aAAa,OAAO,WAAW,WAAW,cAAc,KAAK,OAAO,SAAS,cAAc,IAAI,OAAO,MAAM,IAAI;AAC5L,cAAM,iBAAiB,OAAO,SAAS,sBAAsB,IAAI,OAAO,MAAM,KAAK,cAAc,IAAI,OAAO,MAAM,IAAI;AACtH,cAAM,cAAc,QAAQ,UAAU,KAAK,eAAe,IAAI,OAAO,UAAU,CAAC;AAChF,cAAM,mBAAmB,QAAQ,cAAc,eAAe,IAAI,UAAU,CAAC;AAC7E,cAAM,uBAAuB,QAAQ,iBAAiB,YAAY,KAAK,UAAU;AACjF,cAAM,sBAAsB,QAAQ,YAAY,OAAO,UAAU,UAAU;AAC3E,cAAM,sBAAsB,QAAQ,gBAAgB,CAAC,iBAAiB,YAAY,CAAC;AACnF,cAAM,UAAU,cAAc,kBAAkB,uBAAuB,qBAAqB,MAAM;AAClG,cAAM,iBAAiB,mBAAmB,aAAa;AACvD,cAAM,OAAO,QAAQ,cAAc,KAAK,CAAC,YAAY,eAAe,oBAAoB,wBAAwB;AAChH,YAAI,KAAM,OAAM,KAAK,EAAE,qBAAqB,OAAO,eAAe,kBAAkB,OAAO,YAAY,iBAAiB,gBAAgB,mBAAmB,OAAO,SAAU,OAAO,SAAS,OAAO,WAAY,QAAW,cAAc,YAAY,YAAY,MAAM,UAAU,EAAE,UAAU,WAAW,0BAA0B,QAAQ,iCAAiC,eAAe,oBAAoB,mBAAmB,wBAAwB,wBAAwB,QAAQ,OAAO,eAAe,YAAY,gBAAgB,kBAAkB,WAAY,SAAS,gBAAgB,OAAO,QAAS,QAAW,WAAW,UAAU,WAAW,YAAY,WAAW,OAAO,SAAS,QAAW,mBAAmB,UAAU,cAAc,eAAe,iBAAiB,KAAK,WAAW,MAAM,GAAG,mBAAmB,OAAO,cAAc,SAAS,OAAO,SAAS,mBAAmB,OAAO,SAAS,qBAAqB,OAAO,cAAc,mBAAmB,WAAY,SAAS,eAAe,0CAA0C,oCAAqC,QAAQ,+CAA+C,OAAU,EAAE,CAAC;AAAA,MAC5mC;AAAA,IACF;AACA,OAAG,aAAa,MAAM,UAAU;AAAA,EAClC;AACA,aAAW,MAAM;AACjB,SAAO,EAAE,SAAS,MAAM;AAC1B;;;ACvUA,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB;AACzB,eAAsB,WAAW,UAAmC;AAClE,SAAO,WAAW,QAAQ,EACvB,OAAO,MAAM,SAAS,QAAQ,CAAC,EAC/B,OAAO,KAAK;AACjB;AACO,SAAS,WAAW,MAAsB;AAC/C,SAAO,WAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AACvD;;;AFmCA,eAAsB,gBACpB,IACA,MACA,OAC0B;AAC1B,MAAI;AACF,UAAM,cAAc,MAAM,gBAAgB,KAAK,aAAa;AAC5D,UAAM,eAAe,MAAM,iBAAiB,KAAK,aAAa;AAC9D,UAAM,cAAc,MAAM,sBAAsB,KAAK,eAAe,aAAa,YAAY;AAC7F,QAAI,CAAC,SAAS,KAAK,gBAAgB,YAAa,QAAO,EAAE,WAAW,GAAG,iBAAiB,GAAG,SAAS,KAAK;AACzG,UAAM,OAAO,MAAM,mBAAmB,KAAK,eAAe,YAAY;AACtE,UAAM,SAAS,MAAM,oBAAoB,KAAK,eAAe,WAAW;AACxE,OAAG,YAAY,MAAM;AACnB,SAAG,QAAQ,mHAAmH,EAAE,IAAI,aAAa,aAAa,aAAa,gBAAgB,KAAK,UAAU,aAAa,YAAY,GAAG,MAAM,YAAY,KAAK,EAAE;AAC/P,qBAAe,IAAI,KAAK,EAAE;AAC1B,qBAAe,IAAI,KAAK,IAAI,aAAa,WAAW;AACpD,YAAM,WAAW,GAAG,QAAQ,0PAA0P;AACtR,iBAAW,QAAQ,OAAO,YAAa,UAAS,IAAI,KAAK,IAAI,KAAK,cAAc,KAAK,WAAW,KAAK,QAAQ,KAAK,YAAW,oBAAI,KAAK,GAAE,YAAY,CAAC;AACrJ,iBAAW,KAAK,OAAO,SAAU,eAAc,IAAI,KAAK,IAAI,CAAC;AAC7D,iBAAW,KAAK,OAAO,SAAU,eAAc,IAAI,KAAK,IAAI,CAAC;AAC7D,8BAAwB,IAAI,KAAK,IAAI,OAAO,OAAO;AACnD,wBAAkB,IAAI,KAAK,IAAI,OAAO,WAAW;AACjD,0BAAoB,IAAI,KAAK,IAAI,OAAO,aAAa;AACrD,qBAAe,IAAI,KAAK,IAAI,OAAO,QAAQ;AAC3C,kBAAY,IAAI,KAAK,IAAI,OAAO,KAAK;AACrC,SAAG,QAAQ,iNAAiN,EAAE,KAAI,oBAAI,KAAK,GAAE,YAAY,GAAG,cAAa,oBAAI,KAAK,GAAE,YAAY,GAAG,KAAK,EAAE;AAAA,IAC5S,CAAC;AACD,WAAO,EAAE,WAAW,YAAY,QAAQ,iBAAiB,GAAG,SAAS,MAAM;AAAA,EAC7E,SAAS,OAAO;AACd,UAAM,UAAU,aAAa,KAAK;AAClC,OAAG,QAAQ,yEAAyE,EAAE,IAAI,KAAK,EAAE;AACjG,OAAG,QAAQ,8GAA8G,EAAE,IAAI,KAAK,EAAE;AACtI,OAAG,QAAQ,wEAAwE,EAAE,IAAI,KAAK,IAAI,SAAS,sBAAsB,mFAAmF,OAAO,EAAE;AAC7N,WAAO,EAAE,WAAW,GAAG,iBAAiB,GAAG,SAAS,MAAM;AAAA,EAC5D;AACF;AACA,eAAe,oBAAoB,MAAc,OAAuC;AACtF,QAAM,QAAqB,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,eAAe,CAAC,GAAG,UAAU,CAAC,GAAG,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,aAAa,CAAC,GAAG,aAAa,CAAC,EAAE;AACnJ,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAMC,MAAK,KAAK,MAAM,IAAI;AAChC,UAAM,OAAO,MAAMC,IAAG,KAAK,GAAG;AAC9B,UAAM,YAAY,KAAK,EAAE,cAAc,cAAc,IAAI,GAAG,WAAWD,MAAK,QAAQ,IAAI,GAAG,QAAQ,MAAM,WAAW,GAAG,GAAG,WAAW,KAAK,KAAK,CAAC;AAChJ,QAAI,KAAK,SAAS,MAAM,EAAG,OAAM,SAAS,KAAK,GAAI,MAAM,aAAa,MAAM,IAAI,CAAE;AAClF,QAAI,WAAW,KAAK,IAAI,GAAG;AACzB,YAAM,SAAS,KAAK,GAAI,MAAM,gBAAgB,MAAM,IAAI,CAAE;AAC1D,YAAM,cAAc,KAAK,GAAI,MAAM,0BAA0B,MAAM,IAAI,CAAE;AACzE,YAAM,SAAS,KAAK,GAAI,MAAM,qBAAqB,MAAM,IAAI,CAAE;AAC/D,YAAM,cAAc,MAAM,uBAAuB,MAAM,IAAI;AAC3D,YAAM,QAAQ,KAAK,GAAG,YAAY,OAAO;AACzC,YAAM,YAAY,KAAK,GAAG,YAAY,KAAK;AAC3C,YAAM,MAAM,KAAK,GAAI,MAAM,mBAAmB,MAAM,IAAI,CAAE;AAAA,IAC5D;AAAA,EACF;AACA,SAAO;AACT;AACA,eAAe,gBAAgB,MAAiC;AAC9D,QAAM,MAAgB,CAAC;AACvB,iBAAe,KAAK,KAAa,SAAS,IAAmB;AAC3D,UAAM,UAAU,MAAMC,IAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC,CAAC;AAC7E,eAAW,KAAK,SAAS;AACvB,YAAM,MAAM,SAAS,GAAG,MAAM,IAAI,EAAE,IAAI,KAAK,EAAE;AAC/C,UAAI,EAAE,YAAY,GAAG;AACnB,YAAI,CAAC,CAAC,gBAAgB,QAAQ,OAAO,YAAY,MAAM,EAAE,SAAS,EAAE,IAAI,EAAG,OAAM,KAAKD,MAAK,KAAK,KAAK,EAAE,IAAI,GAAG,GAAG;AAAA,MACnH,WAAW,iBAAiB,KAAK,EAAE,IAAI,KAAK,CAAC,kBAAkB,GAAG,EAAG,KAAI,KAAK,GAAG;AAAA,IACnF;AAAA,EACF;AACA,QAAM,KAAK,IAAI;AACf,SAAO,IAAI,KAAK;AAClB;AACA,SAAS,kBAAkB,cAA+B;AACxD,QAAM,QAAQ,aAAa,MAAM,GAAG;AACpC,MAAI,MAAM,KAAK,CAAC,SAAS,CAAC,QAAQ,SAAS,WAAW,EAAE,SAAS,IAAI,CAAC,EAAG,QAAO;AAChF,SAAO,wBAAwB,KAAK,MAAM,GAAG,EAAE,KAAK,EAAE;AACxD;AACA,eAAe,sBAAsB,MAAc,OAAiB,OAAsE;AACxI,QAAM,cAAc,MAAMC,IAAG,SAASD,MAAK,KAAK,MAAM,cAAc,GAAG,MAAM,EAAE,MAAM,MAAM,EAAE;AAC7F,QAAM,kBAAkB;AAAA,IACtB,iBAAiB;AAAA,IACjB,aAAa,MAAM;AAAA,IACnB,gBAAgB,MAAM;AAAA,IACtB,cAAc,OAAO,YAAY,OAAO,QAAQ,MAAM,YAAY,EAAE,KAAK,CAAC;AAAA,IAC1E,aAAa,CAAC,GAAG,MAAM,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AAAA,IACjF,SAAS,OAAO,YAAY,OAAO,QAAQ,MAAM,OAAO,EAAE,KAAK,CAAC;AAAA,IAChE,cAAc;AAAA,IACd,iBAAiB,WAAW,WAAW;AAAA,EACzC;AACA,QAAM,UAAoB,CAAC,SAAS,KAAK,UAAU,eAAe,CAAC,EAAE;AACrE,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,MAAMC,IAAG,SAASD,MAAK,KAAK,MAAM,IAAI,GAAG,MAAM;AAC/D,YAAQ,KAAK,GAAG,IAAI,IAAI,WAAW,OAAO,CAAC,EAAE;AAAA,EAC/C;AACA,SAAO,WAAW,QAAQ,KAAK,IAAI,CAAC;AACtC;;;AGpIA,eAAsB,eACpB,IACA,aACA,SACwH;AACxH,QAAM,WAAU,oBAAI,KAAK,GAAE,YAAY;AACvC,QAAM,QAAQ,QAAQ,OAAO,CAAC,WAAW,IAAI,QAAQ,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,MAAM,MAAS,IAAI,iBAAiB,EAAE;AAChH,QAAM,QAAQ,OAAO,GAAG,QAAQ,gIAAgI,EAAE,IAAI,aAAa,SAAS,WAAW,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE;AAC9N,MAAI,YAAY;AAChB,MAAI,kBAAkB;AACtB,MAAI,eAAe;AACnB,MAAI;AACF,eAAW,QAAQ,OAAO;AACxB,YAAM,SAAS,MAAM,gBAAgB,IAAI,MAAM,QAAQ,KAAK;AAC5D,mBAAa,OAAO;AACpB,yBAAmB,OAAO;AAC1B,sBAAgB,OAAO,UAAU,IAAI;AAAA,IACvC;AACA,OAAG,QAAQ,4FAA4F,EAAE,KAAI,oBAAI,KAAK,GAAE,YAAY,GAAG,kBAAkB,WAAW,WAAW,WAAW,iBAAiB,KAAK;AAChN,WAAO,EAAE,WAAW,MAAM,QAAQ,cAAc,MAAM,SAAS,cAAc,cAAc,WAAW,gBAAgB;AAAA,EACxH,SAAS,OAAO;AACd,OAAG,QAAQ,oHAAoH,EAAE,KAAI,oBAAI,KAAK,GAAE,YAAY,GAAG,WAAW,kBAAkB,GAAG,aAAa,KAAK,GAAG,KAAK;AACzN,UAAM;AAAA,EACR;AACF;;;AC3BO,SAAS,UACd,QACwB;AACxB,QAAM,MAA8B,CAAC;AACrC,aAAW,SAAS,UAAU,CAAC,GAAG;AAChC,UAAM,CAAC,KAAK,GAAG,IAAI,IAAI,MAAM,MAAM,GAAG;AACtC,QAAI,OAAO,KAAK,SAAS,EAAG,KAAI,GAAG,IAAI,KAAK,KAAK,GAAG;AAAA,EACtD;AACA,SAAO;AACT;;;ACRA,SAAS,SAAS,UAA2C;AAC3D,QAAM,OAAO,SAAS,QAAQ,SAAS,cAAc,SAAS,qBAAqB,SAAS,uBAAuB,SAAS;AAC5H,QAAM,OAAO,SAAS,QAAQ,SAAS,cAAc,SAAS,qBAAqB,SAAS,uBAAuB,SAAS;AAC5H,MAAI,QAAQ,KAAM,QAAO,GAAG,OAAO,QAAQ,EAAE,CAAC,IAAI,OAAO,QAAQ,EAAE,CAAC;AACpE,QAAM,aAAa,SAAS;AAC5B,MAAI,MAAM,QAAQ,UAAU,KAAK,WAAW,SAAS,GAAG;AACtD,UAAM,QAAQ,WAAW,CAAC;AAC1B,WAAO,GAAG,OAAO,MAAM,cAAc,EAAE,CAAC,IAAI,OAAO,MAAM,cAAc,EAAE,CAAC;AAAA,EAC5E;AACA,SAAO;AACT;AACO,SAAS,iBAAiB,QAA6B;AAC5D,QAAM,QAAQ,CAAC,6GAA6G;AAC5H,aAAW,KAAK,OAAO,OAAO;AAC5B,UAAM,KAAK,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,MAAM,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,IAAI,SAAS,EAAE,QAAQ,CAAC,EAAE;AAAA,EACzJ;AACA,MAAI,OAAO,YAAY,SAAS,EAAG,OAAM,KAAK,IAAI,gBAAgB,GAAG,OAAO,YAAY,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,YAAY,MAAM,CAAC,IAAI,OAAO,EAAE,QAAQ,YAAY,CAAC,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AAClM,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AAC5B;;;ACnBO,SAAS,WAAW,OAAwB;AACjD,SAAO,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA;AAC1C;AACO,SAAS,gBAAgBE,QAA4B;AAC1D,SAAO,WAAWA,MAAK;AACzB;;;ACLA,SAAS,KAAK,OAAuB;AACnC,SAAO,MAAM,QAAQ,WAAW,GAAG,EAAE,MAAM,GAAG,EAAE;AAClD;AACA,SAAS,MAAMC,QAAoB,WAA2B;AAC5D,QAAM,OAAOA,OAAM,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,aAAa,KAAK,UAAU,SAAS;AACzF,SAAO,OAAO,MAAM,SAAS,SAAS;AACxC;AACO,SAAS,cAAcA,QAA4B;AACxD,QAAM,QAAQ,CAAC,cAAc;AAC7B,aAAW,KAAKA,OAAM;AACpB,UAAM;AAAA,MACJ,KAAK,KAAK,EAAE,IAAI,CAAC,KAAK,MAAMA,QAAO,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC,KAAK,MAAMA,QAAO,EAAE,EAAE,CAAC;AAAA,IAClG;AACF,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AAC5B;;;AlBeA,eAAe,KACb,WACA,SACe;AACf,QAAM,SAAS;AAAA,IACb;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ,QAAQ,SAAS,QAAQ,SAAS,CAAC,GAAG,eAAe;AAAA,EAC/D;AACA,QAAM,QAAQ,MAAM,qBAAqB,OAAO,UAAU,OAAO,MAAM;AACvE,QAAM,oBAAoB,MAAM;AAChC,QAAM,KAAK,aAAa,OAAO,MAAM;AACrC,QAAM,cAAc,gBAAgB,IAAI,OAAO,UAAU,OAAO,MAAM;AACtE,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,MAAM,iBAAiB,KAAK,YAAY;AACpD,UAAM,OAAO,MAAM,mBAAmB,KAAK,cAAc,GAAG;AAC5D,qBAAiB,IAAI,aAAa;AAAA,MAChC,GAAG;AAAA,MACH,aAAa,IAAI;AAAA,MACjB,gBAAgB,IAAI;AAAA,MACpB,cAAc,IAAI;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AACA,KAAG,MAAM;AACT,UAAQ,OAAO;AAAA,IACb,cAAc,OAAO,QAAQ;AAAA,YAAe,OAAO,MAAM;AAAA,gBAAmB,MAAM,MAAM;AAAA,WAAc,OAAO,OAAO,KAAK,IAAI,CAAC;AAAA,uCAA0C,OAAO,QAAQ;AAAA;AAAA,EACzL;AACF;AACA,eAAe,cACb,WACA,IAKY;AACZ,QAAM,SAAS,MAAM,oBAAoB,SAAS;AAClD,QAAM,KAAK,aAAa,OAAO,MAAM;AACrC,MAAI;AACF,UAAM,MAAM,aAAa,IAAI,OAAO,QAAQ;AAC5C,UAAM,cACJ,KAAK,MAAM,gBAAgB,IAAI,OAAO,UAAU,OAAO,MAAM;AAC/D,WAAO,MAAM,GAAG,IAAI,aAAa,OAAO,QAAQ;AAAA,EAClD,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AACA,eAAe,sBACb,WACA,IACY;AACZ,QAAM,SAAS,MAAM,oBAAoB,SAAS;AAClD,QAAM,KAAK,qBAAqB,OAAO,MAAM;AAC7C,MAAI;AACF,UAAM,MAAM,aAAa,IAAI,OAAO,QAAQ;AAC5C,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,mCAAmC,OAAO,MAAM,EAAE;AAC5E,WAAO,MAAM,GAAG,IAAI,IAAI,IAAI,OAAO,QAAQ;AAAA,EAC7C,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AACA,SAAS,wBAAwB,IAAqC,QAAiD;AACrH,QAAM,OAAO,GAAG,QAAQ,0NAA0N,EAAE,IAAI;AACxP,QAAM,wBAAwB,KAAK,OAAO,CAAC,QAAQ,IAAI,WAAW,cAAc,OAAO,IAAI,gBAAgB,EAAE,EAAE,SAAS,yCAAyC,CAAC,EAAE;AACpK,QAAM,mBAAmB,KAAK,OAAO,CAAC,QAAQ,IAAI,WAAW,sDAAsD,OAAO,IAAI,gBAAgB,EAAE,EAAE,SAAS,kDAAkD,CAAC,EAAE;AAChN,QAAM,aAAa,KAAK,OAAO,CAAC,QAAQ,IAAI,WAAW,YAAY,EAAE;AACrE,QAAM,eAAe,KAAK,OAAO,CAAC,QAAQ;AACxC,QAAI,IAAI,WAAW,aAAc,QAAO;AACxC,QAAI;AACF,YAAM,WAAW,KAAK,MAAM,OAAO,IAAI,gBAAgB,IAAI,CAAC;AAC5D,aAAO,OAAO,SAAS,kBAAkB,CAAC,IAAI;AAAA,IAChD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC,EAAE;AACH,QAAM,MAAsC,CAAC;AAC7C,MAAI,mBAAmB,EAAG,KAAI,KAAK,EAAE,UAAU,WAAW,MAAM,oDAAoD,SAAS,mFAAmF,gBAAgB,GAAG,CAAC;AACpO,MAAI,eAAe,EAAG,KAAI,KAAK,EAAE,UAAU,WAAW,MAAM,gDAAgD,SAAS,uEAAuE,YAAY,GAAG,CAAC;AAC5M,MAAI,UAAU,aAAa,EAAG,KAAI,KAAK,EAAE,UAAU,WAAW,MAAM,kCAAkC,SAAS,mCAAmC,UAAU,GAAG,CAAC;AAChK,MAAI,UAAU,wBAAwB,EAAG,KAAI,KAAK,EAAE,UAAU,QAAQ,MAAM,0DAA0D,SAAS,qEAAqE,qBAAqB,GAAG,CAAC;AAC7O,SAAO;AACT;AAEA,SAAS,yBAAyB,IAAqC,QAAiD;AACtH,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,QAAM,4BAA4B;AAClC,QAAM,qBAAqB;AAC3B,QAAM,2BAA2B;AACjC,QAAM,SAAS,GAAG,QAAQ,uKAAuK,EAAE,IAAI;AACvM,QAAM,MAAM,GAAG,QAAQ,+KAA+K,EAAE,IAAI;AAC5M,QAAM,WAAW,GAAG,QAAQ,yJAAyJ,EAAE,IAAI;AAC3L,QAAM,MAAM,GAAG,QAAQ,4MAA4M,EAAE,IAAI;AACzO,QAAM,WAAW,GAAG,QAAQ,uHAAuH,EAAE,IAAI;AACzJ,QAAM,mBAAmB,GAAG,QAAQ,8VAA8V,EAAE,IAAI;AACxY,QAAM,2BAA2B,GAAG,QAAQ,6OAA6O,EAAE,IAAI;AAC/R,QAAM,gBAAgB,GAAG,QAAQ,iZAAiZ,EAAE,IAAI;AACxb,QAAM,wBAAwB,GAAG,QAAQ,maAAma,EAAE,IAAI;AACld,QAAM,gBAAgB,GAAG,QAAQ,oXAAoX,EAAE,IAAI;AAC3Z,QAAM,kBAAkB,GAAG,QAAQ,iFAAiF,EAAE,IAAI;AAC1H,QAAM,kBAAkB,GAAG,QAAQ,gJAAgJ,EAAE,IAAI;AACzL,QAAM,sBAAsB,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uGAQ8D,EAAE,IAAI;AAC3G,QAAM,oBAAoB,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4GAQqE,EAAE,IAAI;AAChH,QAAM,cAAc,OAAO,OAAO,SAAS,CAAC;AAC5C,QAAM,mBAAmB,OAAO,OAAO,cAAc,CAAC;AACtD,QAAM,wBAAwB,gBAAgB,IAAI,IAAI,QAAQ,mBAAmB,aAAa,QAAQ,CAAC,CAAC;AACxG,QAAM,aAAa,OAAO,IAAI,SAAS,CAAC;AACxC,QAAM,eAAe,OAAO,IAAI,WAAW,CAAC;AAC5C,QAAM,oBAAoB,eAAe,IAAI,IAAI,QAAQ,eAAe,YAAY,QAAQ,CAAC,CAAC;AAC9F,QAAM,gBAAgB,OAAO,SAAS,SAAS,CAAC;AAChD,QAAM,2BAA2B,OAAO,SAAS,oBAAoB,CAAC;AACtE,QAAM,gCAAgC,kBAAkB,IAAI,IAAI,QAAQ,2BAA2B,eAAe,QAAQ,CAAC,CAAC;AAC5H,QAAM,cAAc,yBAAyB,EAAE;AAC/C,QAAM,aAAa,iCAAiC,EAAE;AACtD,QAAM,eAAe,0BAA0B,EAAE;AACjD,QAAM,eAAe,0BAA0B,EAAE;AACjD,QAAM,eAAe,4BAA4B,EAAE;AACnD,QAAM,mBAAmB,6BAA6B,EAAE;AACxD,QAAM,oBAAoB,gCAAgC,EAAE;AAC5D,QAAM,uBAAuB,0BAA0B,EAAE;AACzD,QAAM,4BAA4B,oCAAoC,EAAE;AACxE,QAAM,iBAAiB,8BAA8B,EAAE;AACvD,QAAM,oBAAoB,0BAA0B,EAAE;AACtD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,UAAU,OAAO,SAAS,aAAa,CAAC,IAAI,IAAI,YAAY,QAAQ,MAAM,uCAAuC,SAAS,8CAA8C,OAAO,OAAO,SAAS,SAAS,CAAC,GAAG,WAAW,OAAO,SAAS,aAAa,CAAC,EAAE;AAAA,IACzP,EAAE,UAAU,OAAO,iBAAiB,WAAW,CAAC,IAAI,OAAO,iBAAiB,WAAW,CAAC,IAAI,OAAO,iBAAiB,aAAa,CAAC,IAAI,IAAI,YAAY,QAAQ,MAAM,oCAAoC,SAAS,kDAAkD,OAAO,OAAO,iBAAiB,SAAS,CAAC,GAAG,SAAS,OAAO,iBAAiB,WAAW,CAAC,GAAG,SAAS,OAAO,iBAAiB,WAAW,CAAC,GAAG,WAAW,OAAO,iBAAiB,aAAa,CAAC,GAAG,UAAU,yBAAyB;AAAA,IACte,EAAE,UAAU,OAAO,cAAc,aAAa,CAAC,IAAI,KAAK,OAAO,cAAc,wBAAwB,CAAC,IAAI,OAAO,cAAc,SAAS,CAAC,IAAI,YAAY,QAAQ,MAAM,iCAAiC,SAAS,yEAAyE,OAAO,OAAO,cAAc,SAAS,CAAC,GAAG,WAAW,OAAO,cAAc,aAAa,CAAC,GAAG,sBAAsB,OAAO,cAAc,wBAAwB,CAAC,GAAG,UAAU,sBAAsB;AAAA,IAC3d,EAAE,UAAU,OAAO,cAAc,gBAAgB,CAAC,IAAI,IAAI,YAAY,QAAQ,MAAM,gDAAgD,SAAS,+CAA+C,YAAY,OAAO,cAAc,cAAc,CAAC,GAAG,cAAc,OAAO,cAAc,gBAAgB,CAAC,EAAE;AAAA,IACrS,EAAE,UAAU,OAAO,gBAAgB,SAAS,CAAC,IAAI,IAAI,YAAY,QAAQ,MAAM,yCAAyC,SAAS,4CAA4C,sBAAsB,OAAO,gBAAgB,SAAS,CAAC,EAAE;AAAA,IACtO,EAAE,UAAU,wBAAwB,4BAA4B,YAAY,QAAQ,MAAM,8BAA8B,SAAS,iCAAiC,OAAO,aAAa,UAAU,OAAO,OAAO,YAAY,CAAC,GAAG,YAAY,kBAAkB,iBAAiB,uBAAuB,0BAA0B,2BAA2B,sBAAsB,IAAI;AAAA,IACnX,EAAE,UAAU,oBAAoB,qBAAqB,YAAY,QAAQ,MAAM,2BAA2B,SAAS,oCAAoC,OAAO,YAAY,OAAO,OAAO,IAAI,SAAS,CAAC,GAAG,SAAS,cAAc,cAAc,mBAAmB,uBAAuB,mBAAmB;AAAA,IAC3S,EAAE,UAAU,gCAAgC,2BAA2B,YAAY,QAAQ,MAAM,4CAA4C,SAAS,mDAAmD,OAAO,eAAe,kBAAkB,0BAA0B,uBAAuB,+BAA+B,gCAAgC,0BAA0B,iBAAiB,qBAAqB,kBAAkB;AAAA,EACrb;AACF;AAGA,SAAS,4BAA4B,IAA8D;AACjG,QAAM,WAAW,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA,iDAImB,EAAE,IAAI;AACrD,SAAO,EAAE,UAAU,SAAS,SAAS,IAAI,YAAY,QAAQ,MAAM,yCAAyC,SAAS,iEAAiE,yBAAyB,SAAS,QAAQ,SAAS;AAC3O;AAEA,SAAS,6BAA6B,IAA8D;AAClG,QAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBrB,QAAM,OAAO,GAAG,QAAQ,UAAU,YAAY;AAAA;AAAA;AAAA,iEAGiB,EAAE,IAAI;AACrE,QAAM,WAAW,GAAG,QAAQ,iMAAiM,YAAY;AAAA;AAAA,0JAEjF,EAAE,IAAI;AAC9J,QAAM,QAAQ,KAAK,OAAO,CAAC,KAAK,QAAQ,MAAM,OAAO,IAAI,SAAS,CAAC,GAAG,CAAC;AACvE,SAAO,EAAE,UAAU,QAAQ,IAAI,YAAY,QAAQ,MAAM,2CAA2C,SAAS,iEAAiE,OAAO,WAAW,MAAM,SAAS;AACjN;AAEA,SAAS,0BAA0B,IAA8D;AAC/F,QAAM,WAAW,CAAC,OAAO,OAAO,WAAW,WAAW,QAAQ,UAAU,OAAO,mBAAmB,SAAS,aAAa,cAAc,kBAAkB,eAAe,aAAa,YAAY,kBAAkB,eAAe,qBAAqB,YAAY,aAAa,cAAc,qBAAqB,cAAc,eAAe,cAAc,eAAe,gBAAgB,gBAAgB,iBAAiB,kBAAkB,WAAW,iBAAiB;AAC3c,QAAM,eAAe,SAAS,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG;AACrD,QAAM,YAAY,GAAG,QAAQ;AAAA;AAAA,4FAE6D,YAAY;AAAA,6FACX,EAAE,IAAI,GAAG,QAAQ;AAC5G,QAAM,gBAAgB,GAAG,QAAQ;AAAA;AAAA,oFAEiD,EAAE,IAAI;AACxF,SAAO,EAAE,UAAU,OAAO,UAAU,qBAAqB,CAAC,IAAI,IAAI,YAAY,QAAQ,MAAM,uCAAuC,SAAS,wEAAwE,yBAAyB,OAAO,UAAU,SAAS,CAAC,GAAG,8BAA8B,OAAO,UAAU,cAAc,CAAC,GAAG,qCAAqC,OAAO,UAAU,qBAAqB,CAAC,GAAG,yBAAyB,cAAc;AACpc;AAEA,SAAS,oCAAoC,IAA8D;AACzG,QAAM,qBAAqB,GAAG,QAAQ;AAAA,sGAC8D,EAAE,IAAI;AAC1G,QAAM,kBAAkB,GAAG,QAAQ;AAAA;AAAA,mGAE8D,EAAE,IAAI;AACvG,QAAM,uBAAuB,GAAG,QAAQ;AAAA;AAAA;AAAA,mLAGyI,EAAE,IAAI;AACvL,QAAM,gBAAgB,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iDAcc,EAAE,IAAI;AACrD,QAAM,aAAa,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mEAcmC,EAAE,IAAI;AACvE,QAAM,qBAAqB,GAAG,QAAQ,sNAAsN,EAAE,IAAI;AAClQ,QAAM,qBAAqB,WAAW,OAAO,CAAC,KAAK,QAAQ,MAAM,OAAO,IAAI,SAAS,CAAC,GAAG,CAAC;AAC1F,QAAM,qBAAqB,oBAAI,IAAI,CAAC,uCAAuC,4DAA4D,yCAAyC,CAAC;AACjL,QAAM,6BAA6B,WAAW,OAAO,CAAC,KAAK,QAAQ,mBAAmB,IAAI,OAAO,IAAI,gBAAgB,CAAC,IAAI,MAAM,OAAO,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;AAC/J,QAAM,WAAW,OAAO,gBAAgB,SAAS,CAAC,IAAI,OAAO,qBAAqB,SAAS,CAAC,IAAI,6BAA6B,IAAI,YAAY;AAC7I,SAAO,EAAE,UAAU,MAAM,iDAAiD,SAAS,wFAAwF,4CAA4C,OAAO,mBAAmB,SAAS,CAAC,GAAG,uCAAuC,OAAO,gBAAgB,SAAS,CAAC,GAAG,8CAA8C,OAAO,qBAAqB,SAAS,CAAC,GAAG,kDAAkD,OAAO,mBAAmB,SAAS,CAAC,GAAG,kCAAkC,oBAAoB,yCAAyC,WAAW,SAAS,IAAI,aAAa,CAAC,EAAE,kBAAkB,6BAA6B,OAAO,EAAE,CAAC,GAAG,cAAc,cAAc,QAAQ,UAAU,cAAc;AAC1vB;AAEA,SAAS,0BAA0B,IAA8D;AAC/F,QAAM,YAAY,GAAG,QAAQ;AAAA;AAAA;AAAA,8DAG+B,EAAE,IAAI;AAClE,QAAM,WAAW,GAAG,QAAQ;AAAA;AAAA,6CAEe,EAAE,IAAI;AACjD,SAAO,EAAE,UAAU,OAAO,UAAU,0BAA0B,CAAC,IAAI,IAAI,YAAY,QAAQ,MAAM,uCAAuC,SAAS,8CAA8C,mCAAmC,OAAO,UAAU,SAAS,CAAC,GAAG,kCAAkC,OAAO,UAAU,0BAA0B,CAAC,GAAG,8CAA8C,OAAO,UAAU,sCAAsC,CAAC,GAAG,iBAAiB,SAAS;AACtd;AAEA,SAAS,gCAAgC,IAA8D;AACrG,QAAM,OAAO,GAAG,QAAQ;AAAA,0KACgJ,EAAE,IAAI;AAC9K,QAAM,WAAW,GAAG,QAAQ;AAAA;AAAA;AAAA,4IAG8G,EAAE,IAAI;AAChJ,QAAM,QAAQ,KAAK,OAAO,CAAC,KAAK,QAAQ,MAAM,OAAO,IAAI,SAAS,CAAC,GAAG,CAAC;AACvE,SAAO,EAAE,UAAU,QAAQ,IAAI,YAAY,QAAQ,MAAM,4CAA4C,SAAS,+EAA+E,OAAO,WAAW,MAAM,SAAS;AAChO;AAEA,SAAS,8BAA8B,IAA8D;AACnG,QAAM,WAAW,GAAG,QAAQ;AAAA,2JAC6H,EAAE,IAAI;AAC/J,QAAM,YAAY,GAAG,QAAQ,qIAAqI,EAAE,IAAI;AACxK,SAAO,EAAE,UAAU,OAAO,UAAU,SAAS,CAAC,IAAI,IAAI,YAAY,QAAQ,MAAM,2CAA2C,SAAS,kEAAkE,4BAA4B,OAAO,UAAU,SAAS,CAAC,GAAG,SAAS;AAC3Q;AAEA,SAAS,yBAAyB,IAA8D;AAC9F,QAAM,YAAY,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA,0IAI2G,EAAE,IAAI;AAC9I,QAAM,WAAW,GAAG,QAAQ;AAAA;AAAA;AAAA,iDAGmB,EAAE,IAAI;AACrD,QAAM,iBAAiB,OAAO,UAAU,kBAAkB,CAAC;AAC3D,QAAM,aAAa,OAAO,UAAU,cAAc,CAAC;AACnD,SAAO,EAAE,UAAU,iBAAiB,aAAa,IAAI,YAAY,QAAQ,MAAM,sCAAsC,SAAS,kDAAkD,uBAAuB,OAAO,UAAU,SAAS,CAAC,GAAG,0BAA0B,OAAO,UAAU,YAAY,CAAC,GAAG,oBAAoB,gBAAgB,4BAA4B,YAAY,SAAS;AACvX;AAEA,SAAS,0BAA0B,IAA8D;AAC/F,QAAM,YAAY,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA,2IAI4G,EAAE,IAAI;AAC/I,QAAM,WAAW,GAAG,QAAQ;AAAA;AAAA,uIAEyG,EAAE,IAAI;AAC3I,QAAM,iBAAiB,OAAO,UAAU,kBAAkB,CAAC;AAC3D,SAAO,EAAE,UAAU,iBAAiB,IAAI,YAAY,QAAQ,MAAM,uCAAuC,SAAS,qDAAqD,wBAAwB,OAAO,UAAU,SAAS,CAAC,GAAG,6BAA6B,OAAO,UAAU,cAAc,CAAC,GAAG,8BAA8B,gBAAgB,qCAAqC,OAAO,UAAU,mBAAmB,CAAC,GAAG,SAAS;AACna;AAGA,SAAS,0BAA0B,IAA8D;AAC/F,QAAM,YAAY,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2IAO4G,EAAE,IAAI;AAC/I,QAAM,WAAW,GAAG,QAAQ;AAAA;AAAA;AAAA,iDAGmB,EAAE,IAAI;AACrD,QAAM,iBAAiB,OAAO,UAAU,kBAAkB,CAAC;AAC3D,QAAM,kBAAkB,OAAO,UAAU,mBAAmB,CAAC;AAC7D,SAAO,EAAE,UAAU,iBAAiB,kBAAkB,IAAI,YAAY,QAAQ,MAAM,uCAAuC,SAAS,2CAA2C,wBAAwB,OAAO,UAAU,SAAS,CAAC,GAAG,4BAA4B,OAAO,UAAU,sBAAsB,CAAC,GAAG,+BAA+B,OAAO,UAAU,yBAAyB,CAAC,GAAG,wBAAwB,OAAO,UAAU,0BAA0B,CAAC,GAAG,wBAAwB,OAAO,UAAU,0BAA0B,CAAC,GAAG,oBAAoB,gBAAgB,wCAAwC,iBAAiB,SAAS;AAC/mB;AAEA,SAAS,iCAAiC,IAA8D;AACtG,QAAM,YAAY,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2EAM4C,EAAG,IAAI;AAChF,QAAM,OAAO,GAAG,QAAQ;AAAA;AAAA;AAAA,mDAGyB,EAAE,IAAI;AACvD,QAAM,WAA2C,CAAC;AAClD,MAAI,qCAAqC;AACzC,MAAI,2BAA2B;AAC/B,aAAW,OAAO,MAAM;AACtB,UAAM,aAAa,sCAAsC,IAAI,iBAAiB;AAC9E,QAAI,CAAC,YAAY,cAAe;AAChC,UAAM,iBAAiB,WAAW,wBAAwB,QAAQ,OAAO,EAAE;AAC3E,UAAM,aAAa,eAAe,MAAM,GAAG,EAAE,GAAG,EAAE,KAAK;AACvD,UAAM,aAAa,GAAG,QAAQ,8QAA8Q,EAAE,IAAI,WAAW,yBAAyB,IAAI,UAAU,IAAI,gBAAgB,UAAU;AAClY,QAAI,WAAW,WAAW,EAAG;AAC7B,QAAI,IAAI,WAAW,YAAa,6BAA4B;AAC5D,QAAI,IAAI,WAAW,aAAc,uCAAsC;AACvE,QAAI,SAAS,SAAS,EAAG,UAAS,KAAK,EAAE,YAAY,IAAI,YAAY,YAAY,IAAI,YAAY,kBAAkB,IAAI,mBAAmB,yBAAyB,WAAW,yBAAyB,gBAAgB,WAAW,QAAQ,WAAW,CAAC;AAAA,EACxP;AACA,SAAO,EAAE,UAAU,qCAAqC,2BAA2B,IAAI,YAAY,QAAQ,MAAM,8CAA8C,SAAS,sDAAsD,8BAA8B,OAAO,UAAU,SAAS,CAAC,GAAG,yBAAyB,OAAO,UAAU,YAAY,CAAC,GAAG,wBAAwB,OAAO,UAAU,WAAW,CAAC,GAAG,0BAA0B,OAAO,UAAU,aAAa,CAAC,GAAG,2BAA2B,OAAO,UAAU,cAAc,CAAC,GAAG,0BAA0B,gDAAgD,oCAAoC,SAAS;AAC/nB;AAEO,SAAS,gBAAyB;AACvC,QAAM,UAAU,IAAI,QAAQ;AAC5B,UACG,KAAK,cAAc,EACnB;AAAA,IACC;AAAA,EACF,EACC,QAAQ,OAAO;AAClB,UACG,QAAQ,MAAM,EACd,SAAS,aAAa,EACtB,OAAO,aAAa,EACpB,OAAO,uBAAuB,EAC9B;AAAA,IACC,CAAC,WAAmB,SAClB,KAAK,KAAK,WAAW,IAAI,EAAE,MAAM,IAAI;AAAA,EACzC;AACF,UACG,QAAQ,OAAO,EACf,OAAO,oBAAoB,EAC3B,OAAO,eAAe,EACtB,OAAO,SAAS,EAChB;AAAA,IACC,CAAC,SACC,KAAK,cAAc,KAAK,WAAW,OAAO,IAAI,gBAAgB;AAC5D,YAAM,IAAI,MAAM,eAAe,IAAI,aAAa;AAAA,QAC9C,MAAM,KAAK;AAAA,QACX,OAAO,QAAQ,KAAK,KAAK;AAAA,MAC3B,CAAC;AACD,cAAQ,OAAO;AAAA,QACb,WAAW,EAAE,YAAY,0BAA0B,EAAE,YAAY,KAAK,EAAE,SAAS,WAAW,EAAE,eAAe;AAAA;AAAA,MAC/G;AAAA,IACF,CAAC,EAAE,MAAM,IAAI;AAAA,EACjB;AACF,UACG,QAAQ,MAAM,EACd,OAAO,oBAAoB,EAC3B,OAAO,SAAS,EAChB;AAAA,IACC,CAAC,SACC,KAAK,cAAc,KAAK,WAAW,CAAC,IAAI,gBAAgB;AACtD,YAAM,IAAI,cAAc,IAAI,WAAW;AACvC,cAAQ,OAAO;AAAA,QACb,UAAU,EAAE,SAAS,WAAW,EAAE,mBAAmB,qCAAqC,EAAE,kBAAkB,oCAAoC,EAAE,eAAe,gCAAgC,EAAE,cAAc,+BAA+B,EAAE,YAAY,6BAA6B,EAAE,aAAa,yBAAyB,EAAE,uBAAuB,yBAAyB,EAAE,wBAAwB,0BAA0B,EAAE,2BAA2B,6BAA6B,EAAE,4BAA4B,8BAA8B,EAAE,6BAA6B;AAAA;AAAA,MAClkB;AAAA,IACF,CAAC,EAAE,MAAM,IAAI;AAAA,EACjB;AACF,UACG,QAAQ,OAAO,EACf,OAAO,oBAAoB,EAC3B,OAAO,eAAe,EACtB,OAAO,oBAAoB,EAC3B,OAAO,kBAAkB,EACzB,OAAO,wBAAwB,EAC/B,OAAO,kBAAkB,EACzB,OAAO,eAAe,eAAe,IAAI,EACzC,OAAO,qBAAqB,sBAAsB,OAAO,EACzD,OAAO,oBAAoB,EAC3B,OAAO,cAAc,EACrB,OAAO,iBAAiB,EACxB,OAAO,qBAAqB,oBAAoB,SAAS,CAAC,CAAC,EAC3D;AAAA,IACC,CAAC,SAcC,KAAK,sBAAsB,KAAK,WAAW,CAAC,OAAO;AACjD,YAAM,SAAS;AAAA,QACb;AAAA,QACA;AAAA,UACE,MAAM,KAAK;AAAA,UACX,aAAa,KAAK;AAAA,UAClB,WAAW,KAAK;AAAA,UAChB,eAAe,KAAK;AAAA,UACpB,SAAS,KAAK;AAAA,QAChB;AAAA,QACA;AAAA,UACE,OAAO,OAAO,KAAK,KAAK;AAAA,UACxB,MAAM,UAAU,KAAK,GAAG;AAAA,UACxB,iBAAiB,QAAQ,KAAK,eAAe;AAAA,UAC7C,WAAW,QAAQ,KAAK,SAAS;AAAA,UACjC,cAAc,QAAQ,KAAK,YAAY;AAAA,QACzC;AAAA,MACF;AACA,cAAQ,OAAO;AAAA,QACb,KAAK,WAAW,SACZ,gBAAgB,MAAM,IACtB,KAAK,WAAW,YACd,cAAc,MAAM,IACpB,iBAAiB,MAAM;AAAA,MAC/B;AAAA,IACF,CAAC,EAAE,MAAM,IAAI;AAAA,EACjB;AACF,QAAM,OAAO,QAAQ,QAAQ,MAAM;AACnC,OACG,QAAQ,OAAO,EACf,OAAO,oBAAoB,EAC3B;AAAA,IACC,CAAC,SACC,KAAK;AAAA,MAAsB,KAAK;AAAA,MAAW,CAAC,OAC1C,QAAQ,OAAO;AAAA,QACb;AAAA,UACE,iBAAiB,EAAE,EAAE,IAAI,CAAC,OAAO;AAAA,YAC/B,MAAM,EAAE;AAAA,YACR,MAAM,EAAE;AAAA,YACR,aAAa,EAAE;AAAA,UACjB,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,IACF,EAAE,MAAM,IAAI;AAAA,EAChB;AACF,OACG,QAAQ,UAAU,EAClB,OAAO,oBAAoB,EAC3B,OAAO,eAAe,EACtB;AAAA,IACC,CAAC,SACC,KAAK,sBAAsB,KAAK,WAAW,CAAC,OAAO;AACjD,YAAM,OAAO,KAAK,OAAO,WAAW,IAAI,KAAK,IAAI,IAAI;AACrD,UAAI,KAAK,QAAQ,CAAC,MAAM;AACtB,gBAAQ,OAAO,MAAM,WAAW,CAAC,EAAE,UAAU,WAAW,MAAM,2BAA2B,SAAS,kCAAkC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;AACnJ;AAAA,MACF;AACA,YAAM,OAAO,GACV;AAAA,QACC;AAAA,MACF,EACC,IAAI,MAAM,IAAI,MAAM,EAAE;AACzB,cAAQ,OAAO,MAAM,WAAW,IAAI,CAAC;AAAA,IACvC,CAAC,EAAE,MAAM,IAAI;AAAA,EACjB;AACF,OACG,QAAQ,YAAY,EACpB,OAAO,oBAAoB,EAC3B,OAAO,eAAe,EACtB,OAAO,kBAAkB,EACzB;AAAA,IACC,CAAC,SACC,KAAK,sBAAsB,KAAK,WAAW,CAAC,OAAO;AACjD,YAAM,OAAO,KAAK,OAAO,WAAW,IAAI,KAAK,IAAI,IAAI;AACrD,UAAI,KAAK,QAAQ,CAAC,MAAM;AACtB,gBAAQ,OAAO,MAAM,WAAW,CAAC,EAAE,UAAU,WAAW,MAAM,2BAA2B,SAAS,kCAAkC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;AACnJ;AAAA,MACF;AACA,YAAM,OAAO,GACV;AAAA,QACC;AAAA,MACF,EACC,IAAI,MAAM,IAAI,MAAM,IAAI,KAAK,SAAS,KAAK,OAAO;AACrD,cAAQ,OAAO,MAAM,WAAW,IAAI,CAAC;AAAA,IACvC,CAAC,EAAE,MAAM,IAAI;AAAA,EACjB;AACF,OACG,QAAQ,OAAO,EACf,OAAO,oBAAoB,EAC3B,OAAO,eAAe,EACtB,OAAO,oBAAoB,EAC3B;AAAA,IACC,CAAC,SACC,KAAK,sBAAsB,KAAK,WAAW,CAAC,OAAO;AACjD,YAAM,OAAO,KAAK,OAAO,WAAW,IAAI,KAAK,IAAI,IAAI;AACrD,UAAI,KAAK,QAAQ,CAAC,MAAM;AACtB,gBAAQ,OAAO,MAAM,WAAW,CAAC,EAAE,UAAU,WAAW,MAAM,2BAA2B,SAAS,kCAAkC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;AACnJ;AAAA,MACF;AACA,YAAM,OAAO,GACV;AAAA,QACC;AAAA,MACF,EACC;AAAA,QACC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,YAAY,IAAI,KAAK,SAAS,KAAK;AAAA,QACxC,KAAK,YAAY,IAAI,KAAK,SAAS,MAAM;AAAA,MAC3C;AACF,cAAQ,OAAO,MAAM,WAAW,IAAI,CAAC;AAAA,IACvC,CAAC,EAAE,MAAM,IAAI;AAAA,EACjB;AACF,UACG,QAAQ,OAAO,EACf,OAAO,oBAAoB,EAC3B,OAAO,eAAe,EACtB,OAAO,oBAAoB,EAC3B,OAAO,kBAAkB,EACzB,OAAO,wBAAwB,EAC/B,OAAO,qBAAqB,gBAAgB,SAAS,EACrD,OAAO,qBAAqB,oBAAoB,SAAS,CAAC,CAAC,EAC3D;AAAA,IACC,CAAC,SASC,KAAK,sBAAsB,KAAK,WAAW,CAAC,OAAO;AACjD,YAAM,SAAS;AAAA,QACb;AAAA,QACA;AAAA,UACE,MAAM,KAAK;AAAA,UACX,WAAW,KAAK;AAAA,UAChB,aAAa,KAAK;AAAA,UAClB,eAAe,KAAK;AAAA,QACtB;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,cAAc;AAAA,UACd,WAAW;AAAA,UACX,iBAAiB;AAAA,UACjB,MAAM,UAAU,KAAK,GAAG;AAAA,QAC1B;AAAA,MACF;AACA,cAAQ,OAAO;AAAA,QACb,KAAK,WAAW,SACZ,gBAAgB,MAAM,IACtB,cAAc,MAAM;AAAA,MAC1B;AAAA,IACF,CAAC,EAAE,MAAM,IAAI;AAAA,EACjB;AACF,QAAM,UAAU,QAAQ,QAAQ,SAAS;AACzC,UACG,QAAQ,MAAM,EACd,SAAS,QAAQ,EACjB,OAAO,oBAAoB,EAC3B;AAAA,IACC,CAAC,MAAc,SACb,KAAK;AAAA,MAAsB,KAAK;AAAA,MAAW,CAAC,OAC1C,QAAQ,OAAO;AAAA,QACb,WAAW,WAAW,IAAI,IAAI,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,MAChE;AAAA,IACF,EAAE,MAAM,IAAI;AAAA,EAChB;AACF,UACG,QAAQ,WAAW,EACnB,SAAS,YAAY,EACrB,OAAO,oBAAoB,EAC3B;AAAA,IACC,CAAC,UAAkB,SACjB,KAAK,sBAAsB,KAAK,WAAW,CAAC,OAAO;AACjD,YAAM,OAAO,GACV;AAAA,QACC;AAAA,MACF,EACC,IAAI,UAAU,QAAQ;AACzB,cAAQ,OAAO,MAAM,WAAW,IAAI,CAAC;AAAA,IACvC,CAAC,EAAE,MAAM,IAAI;AAAA,EACjB;AACF,UACG,QAAQ,QAAQ,EAChB,OAAO,oBAAoB,EAC3B,OAAO,UAAU,EACjB;AAAA,IACC,CAAC,SACC,KAAK,sBAAsB,KAAK,WAAW,CAAC,OAAO;AACjD,YAAM,cAAc,GACjB;AAAA,QACC;AAAA,MACF,EACC,IAAI;AACP,YAAM,SAAS,GACZ;AAAA,QACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAgDF,EACC,IAAI,QAAQ,KAAK,MAAM,GAAG,QAAQ,KAAK,MAAM,GAAG,QAAQ,KAAK,MAAM,GAAG,QAAQ,KAAK,MAAM,GAAG,QAAQ,KAAK,MAAM,GAAG,QAAQ,KAAK,MAAM,GAAG,QAAQ,KAAK,MAAM,GAAG,QAAQ,KAAK,MAAM,CAAC;AACrL,YAAM,qBAAqB,wBAAwB,IAAI,QAAQ,KAAK,MAAM,CAAC;AAC3E,YAAM,sBAAsB,yBAAyB,IAAI,QAAQ,KAAK,MAAM,CAAC;AAC7E,YAAM,iBAAiB,CAAC,GAAG,aAAa,GAAG,QAAQ,GAAG,oBAAoB,GAAG,mBAAmB;AAChG,cAAQ,OAAO;AAAA,QACb,eAAe,SACX,WAAW,cAAc,IACzB,GAAG,GAAG,MAAM,yBAAyB,CAAC;AAAA;AAAA,MAC5C;AAAA,IACF,CAAC,EAAE,MAAM,IAAI;AAAA,EACjB;AACF,UACG,QAAQ,OAAO,EACf,OAAO,oBAAoB,EAC3B,OAAO,WAAW,EAClB;AAAA,IACC,CAAC,SACC,MAAM,YAAY;AAChB,YAAM,SAAS,MAAM,oBAAoB,KAAK,SAAS;AACvD,YAAM,QAAQC,MAAK,QAAQA,MAAK,QAAQ,OAAO,MAAM,CAAC;AACtD,YAAM,gBAAgBA,MAAK,QAAQ,OAAO,QAAQ;AAClD,YAAMC,IAAG,GAAG,OAAO,QAAQ,EAAE,OAAO,KAAK,CAAC;AAC1C,UAAI,CAAC,KAAK,QAAQ;AAChB,cAAM,SAASD,MAAK,KAAK,OAAO,qBAAqB;AACrD,cAAM,YAAY,oBAAI,IAAI;AAAA,UACxBA,MAAK,MAAM,KAAK,EAAE;AAAA,UAClB;AAAA,UACA,QAAQ,IAAI,OAAOA,MAAK,QAAQ,QAAQ,IAAI,IAAI,IAAI;AAAA,UACpD;AAAA,QACF,CAAC;AACD,YAAI;AACJ,YAAI;AACF,uBAAa,MAAMC,IAAG,KAAK,MAAM,GAAG,OAAO;AAAA,QAC7C,QAAQ;AACN,sBAAY;AAAA,QACd;AACA,YAAI,CAAC,aAAa,UAAU,IAAI,KAAK;AACnC,gBAAM,IAAI;AAAA,YACR,wEAAwE,KAAK;AAAA,UAC/E;AACF,cAAMA,IAAG,GAAG,OAAO,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MACrD;AACA,cAAQ,OAAO,MAAM,8BAA8B;AAAA,IACrD,GAAG,EAAE,MAAM,IAAI;AAAA,EACnB;AACF,SAAO;AACT;AACA,SAAS,QAAQ,OAAe,UAA8B;AAC5D,WAAS,KAAK,KAAK;AACnB,SAAO;AACT;AACA,SAAS,KAAK,OAAsB;AAClC,UAAQ,OAAO;AAAA,IACb,GAAG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA;AAAA,EAC3D;AACA,UAAQ,WAAW;AACrB;AACA,cAAc,EAAE,MAAM,QAAQ,IAAI;","names":["path","fs","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","path","fs","trace","trace","path","fs"]}
|