@adversarylabs/sdk 0.1.28 → 0.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -4
- package/dist/repo-graph.d.ts +3 -1
- package/dist/repo-graph.d.ts.map +1 -1
- package/dist/repo-graph.js +15 -6
- package/dist/repo-graph.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -251,10 +251,10 @@ const query = defineSemanticQuery({
|
|
|
251
251
|
{ kind: "call", capture: "guard", method: "Do", receiverType: "sync.Once" },
|
|
252
252
|
{ kind: "call", capture: "constructor", name: "connect", within: "guard" },
|
|
253
253
|
{ kind: "assignment", within: "guard", source: "constructor", operator: "=", sourceKind: "call", targets: [
|
|
254
|
-
{ scope: "package" },
|
|
255
|
-
{ capture: "failure", scope: "package",
|
|
254
|
+
{ capture: "value", scope: "package" },
|
|
255
|
+
{ capture: "failure", scope: "package", trait: "error" },
|
|
256
256
|
] },
|
|
257
|
-
{ kind: "return", after: "guard", references: "failure" },
|
|
257
|
+
{ kind: "return", after: "guard", references: ["value", "failure"] },
|
|
258
258
|
],
|
|
259
259
|
});
|
|
260
260
|
const matches = ctx.repoGraph?.semanticMatches(query) ?? [];
|
|
@@ -265,7 +265,11 @@ operations or bindings. `defineSemanticQuery` rejects unknown, duplicate, or typ
|
|
|
265
265
|
capture references when the adversary loads, so malformed query contracts cannot silently match
|
|
266
266
|
nothing. An assignment linked with `source` must not also be `after` that source: the direct RHS
|
|
267
267
|
call is nested inside the assignment and therefore starts later in source order. Rules remain
|
|
268
|
-
responsible for policy, severity, and finding language.
|
|
268
|
+
responsible for policy, severity, and finding language. `references` accepts one capture name or
|
|
269
|
+
an array when the same operation must reference every captured binding.
|
|
270
|
+
Binding `trait` constraints are adapter-neutral semantic categories. For example, a language
|
|
271
|
+
adapter may mark both an interface-typed failure and a concrete failure implementation with the
|
|
272
|
+
`error` trait, avoiding brittle exact type-name checks in adversaries.
|
|
269
273
|
|
|
270
274
|
### Opinion framing (`formatOpinion` / `formatOpinionAsync`)
|
|
271
275
|
|
package/dist/repo-graph.d.ts
CHANGED
|
@@ -68,6 +68,7 @@ export interface SemanticBinding {
|
|
|
68
68
|
id: string;
|
|
69
69
|
name: string;
|
|
70
70
|
type?: string;
|
|
71
|
+
traits?: readonly string[];
|
|
71
72
|
scope: SemanticBindingScope;
|
|
72
73
|
}
|
|
73
74
|
export interface SemanticOperation {
|
|
@@ -106,6 +107,7 @@ export interface SemanticTargetPattern {
|
|
|
106
107
|
capture?: string;
|
|
107
108
|
scope?: SemanticBindingScope;
|
|
108
109
|
type?: string;
|
|
110
|
+
trait?: string;
|
|
109
111
|
}
|
|
110
112
|
export interface SemanticOperationPattern {
|
|
111
113
|
kind: SemanticOperation["kind"];
|
|
@@ -119,7 +121,7 @@ export interface SemanticOperationPattern {
|
|
|
119
121
|
sourceKind?: SemanticOperation["sourceKind"];
|
|
120
122
|
source?: string;
|
|
121
123
|
targets?: readonly SemanticTargetPattern[];
|
|
122
|
-
references?: string;
|
|
124
|
+
references?: string | readonly string[];
|
|
123
125
|
}
|
|
124
126
|
export interface SemanticQuery {
|
|
125
127
|
language: string;
|
package/dist/repo-graph.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-graph.d.ts","sourceRoot":"","sources":["../src/repo-graph.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"repo-graph.d.ts","sourceRoot":"","sources":["../src/repo-graph.ts"],"names":[],"mappings":"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"}
|
package/dist/repo-graph.js
CHANGED
|
@@ -52,8 +52,13 @@ export function defineSemanticQuery(query) {
|
|
|
52
52
|
throw new SemanticQueryValidationError(`${label} cannot be after its own direct source call`);
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
const references = typeof step.references === "string" ? [step.references] : (step.references ?? []);
|
|
56
|
+
if (references.length === 0 && Array.isArray(step.references)) {
|
|
57
|
+
throw new SemanticQueryValidationError(`${label}.references must not be empty`);
|
|
58
|
+
}
|
|
59
|
+
for (const reference of references) {
|
|
60
|
+
requireCapture(reference, `${label}.references`, "binding");
|
|
61
|
+
}
|
|
57
62
|
addCapture(step.capture, "operation", step.kind);
|
|
58
63
|
for (const target of step.targets ?? [])
|
|
59
64
|
addCapture(target.capture, "binding");
|
|
@@ -356,14 +361,18 @@ function operationMatches(operation, pattern, captures, bindings) {
|
|
|
356
361
|
const binding = bindings.get(operation.targets[index]);
|
|
357
362
|
if (!binding ||
|
|
358
363
|
(target.scope && binding.scope !== target.scope) ||
|
|
359
|
-
(target.type && binding.type !== target.type)
|
|
364
|
+
(target.type && binding.type !== target.type) ||
|
|
365
|
+
(target.trait && !binding.traits?.includes(target.trait)))
|
|
360
366
|
return false;
|
|
361
367
|
}
|
|
362
368
|
}
|
|
363
369
|
if (pattern.references) {
|
|
364
|
-
const
|
|
365
|
-
|
|
366
|
-
|
|
370
|
+
const references = typeof pattern.references === "string" ? [pattern.references] : pattern.references;
|
|
371
|
+
for (const reference of references) {
|
|
372
|
+
const captured = captures[reference];
|
|
373
|
+
if (!captured || "kind" in captured || !operation.references?.includes(captured.id))
|
|
374
|
+
return false;
|
|
375
|
+
}
|
|
367
376
|
}
|
|
368
377
|
return true;
|
|
369
378
|
}
|
package/dist/repo-graph.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-graph.js","sourceRoot":"","sources":["../src/repo-graph.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\n\nexport const ADVERSARY_REPO_GRAPH_ENV = \"ADVERSARY_REPO_GRAPH\";\nexport const REPO_GRAPH_SCHEMA_VERSION = \"v2\";\nexport const REPO_GRAPH_ADAPTER_REVISION = \"go-semantic-operations-v2+ts-syntax-v1\";\n\nexport interface RepoGraphMeta {\n schemaVersion: string;\n adapterRevision: string;\n fingerprint: string;\n repoPath: string;\n builtAt: string;\n durationMs: number;\n fileCount: number;\n symbolCount: number;\n edgeCount: number;\n testLinkCount: number;\n semanticUnitCount: number;\n parseFailures?: readonly RepoGraphDiagnostic[];\n}\n\nexport interface RepoGraphDiagnostic {\n path: string;\n adapter: string;\n message: string;\n}\n\nexport interface RepoGraphFile {\n id: number;\n path: string;\n language: string;\n size: number;\n hash: string;\n module?: string;\n}\n\nexport interface RepoGraphSymbol {\n id: number;\n name: string;\n kind: string;\n path: string;\n startLine: number;\n startColumn: number;\n endLine: number;\n endColumn: number;\n containerId?: number;\n exported: boolean;\n language: string;\n metadata?: string;\n}\n\nexport interface RepoGraphEdge {\n id: number;\n fromPath: string;\n fromSymbolId?: number;\n toPath?: string;\n toSymbolId?: number;\n unresolvedTarget?: string;\n kind: string;\n line: number;\n column: number;\n confidence: number;\n adapter: string;\n}\n\nexport interface RepoGraphTestLink {\n sourcePath: string;\n sourceSymbolId?: number;\n testPath: string;\n testSymbolId?: number;\n confidence: number;\n reason: string;\n}\n\nexport type SemanticBindingScope = \"package\" | \"parameter\" | \"local\" | \"field\" | \"unknown\";\n\nexport interface SemanticBinding {\n id: string;\n name: string;\n type?: string;\n scope: SemanticBindingScope;\n}\n\nexport interface SemanticOperation {\n id: number;\n kind: \"call\" | \"assignment\" | \"return\" | \"condition\";\n line: number;\n column: number;\n endLine: number;\n endColumn: number;\n ancestors: readonly number[];\n name?: string;\n method?: string;\n receiverType?: string;\n receiverBinding?: string;\n operator?: string;\n sourceKind?: \"call\" | \"expression\";\n sourceOperation?: number;\n targets?: readonly string[];\n references?: readonly string[];\n}\n\nexport interface SemanticUnit {\n id: number;\n key: string;\n path: string;\n language: string;\n kind: \"function\";\n name: string;\n line: number;\n column: number;\n endLine: number;\n endColumn: number;\n bindings: readonly SemanticBinding[];\n operations: readonly SemanticOperation[];\n}\n\nexport interface SemanticTargetPattern {\n capture?: string;\n scope?: SemanticBindingScope;\n type?: string;\n}\n\nexport interface SemanticOperationPattern {\n kind: SemanticOperation[\"kind\"];\n capture?: string;\n within?: string;\n after?: string;\n name?: string;\n method?: string;\n receiverType?: string;\n operator?: string;\n sourceKind?: SemanticOperation[\"sourceKind\"];\n source?: string;\n targets?: readonly SemanticTargetPattern[];\n references?: string;\n}\n\nexport interface SemanticQuery {\n language: string;\n within: \"function\";\n steps: readonly SemanticOperationPattern[];\n}\n\nexport interface SemanticMatch {\n key: string;\n path: string;\n unit: SemanticUnit;\n line: number;\n column: number;\n captures: Readonly<Record<string, SemanticOperation | SemanticBinding>>;\n}\n\nexport class SemanticQueryValidationError extends Error {\n constructor(message: string) {\n super(`invalid semantic query: ${message}`);\n this.name = \"SemanticQueryValidationError\";\n }\n}\n\nexport function defineSemanticQuery<T extends SemanticQuery>(query: T): T {\n if (!query.language.trim()) throw new SemanticQueryValidationError(\"language is required\");\n if (query.within !== \"function\") {\n throw new SemanticQueryValidationError('within must be \"function\"');\n }\n if (query.steps.length === 0)\n throw new SemanticQueryValidationError(\"at least one step is required\");\n\n const captures = new Map<\n string,\n { type: \"operation\" | \"binding\"; kind?: SemanticOperation[\"kind\"] }\n >();\n const requireCapture = (\n name: string,\n relationship: string,\n type: \"operation\" | \"binding\",\n kind?: SemanticOperation[\"kind\"],\n ): void => {\n const captured = captures.get(name);\n if (!captured) {\n throw new SemanticQueryValidationError(\n `${relationship} references unknown earlier capture ${JSON.stringify(name)}`,\n );\n }\n if (captured.type !== type || (kind && captured.kind !== kind)) {\n throw new SemanticQueryValidationError(\n `${relationship} references an incompatible ${captured.type} capture ${JSON.stringify(name)}`,\n );\n }\n };\n const addCapture = (\n name: string | undefined,\n type: \"operation\" | \"binding\",\n kind?: SemanticOperation[\"kind\"],\n ): void => {\n if (!name) return;\n if (captures.has(name)) {\n throw new SemanticQueryValidationError(\n `capture ${JSON.stringify(name)} is declared more than once`,\n );\n }\n captures.set(name, { type, ...(kind ? { kind } : {}) });\n };\n\n for (const [index, step] of query.steps.entries()) {\n const label = `steps[${index}]`;\n if (step.within) requireCapture(step.within, `${label}.within`, \"operation\", \"call\");\n if (step.after) requireCapture(step.after, `${label}.after`, \"operation\");\n if (step.source) {\n if (step.kind !== \"assignment\" || step.sourceKind !== \"call\") {\n throw new SemanticQueryValidationError(\n `${label}.source requires an assignment with sourceKind \"call\"`,\n );\n }\n requireCapture(step.source, `${label}.source`, \"operation\", \"call\");\n if (step.after === step.source) {\n throw new SemanticQueryValidationError(\n `${label} cannot be after its own direct source call`,\n );\n }\n }\n if (step.references) requireCapture(step.references, `${label}.references`, \"binding\");\n addCapture(step.capture, \"operation\", step.kind);\n for (const target of step.targets ?? []) addCapture(target.capture, \"binding\");\n }\n return query;\n}\n\nexport interface RepoGraphPage<T> {\n items: readonly T[];\n nextCursor?: string;\n}\n\nexport interface RepoGraphFileQuery {\n language?: string;\n glob?: string;\n cursor?: string;\n limit?: number;\n}\n\nexport interface RepoGraphSymbolQuery {\n path?: string;\n name?: string;\n kind?: string;\n cursor?: string;\n limit?: number;\n}\n\nexport interface RepoGraphRelationQuery {\n symbolId: number;\n cursor?: string;\n limit?: number;\n}\n\nexport interface RepoGraph {\n readonly dir: string;\n readonly meta: RepoGraphMeta;\n files(query?: RepoGraphFileQuery): RepoGraphPage<RepoGraphFile>;\n symbolAt(path: string, line: number, column?: number): RepoGraphSymbol | undefined;\n symbols(query?: RepoGraphSymbolQuery): RepoGraphPage<RepoGraphSymbol>;\n definitions(query: RepoGraphSymbolQuery): RepoGraphPage<RepoGraphSymbol>;\n references(query: RepoGraphRelationQuery): RepoGraphPage<RepoGraphEdge>;\n callers(query: RepoGraphRelationQuery): RepoGraphPage<RepoGraphEdge>;\n callees(query: RepoGraphRelationQuery): RepoGraphPage<RepoGraphEdge>;\n implementations(query: RepoGraphRelationQuery): RepoGraphPage<RepoGraphEdge>;\n importsOf(path: string, cursor?: string, limit?: number): RepoGraphPage<RepoGraphEdge>;\n importersOf(path: string, cursor?: string, limit?: number): RepoGraphPage<RepoGraphEdge>;\n relatedTests(options: {\n path?: string;\n symbolId?: number;\n cursor?: string;\n limit?: number;\n }): RepoGraphPage<RepoGraphTestLink>;\n semanticUnits(options?: { language?: string; path?: string }): readonly SemanticUnit[];\n semanticMatches(query: SemanticQuery): readonly SemanticMatch[];\n close(): void;\n}\n\nexport class RepoGraphUnavailableError extends Error {\n readonly code = \"repo_graph_unavailable\";\n\n constructor(message: string) {\n super(message);\n this.name = \"RepoGraphUnavailableError\";\n }\n}\n\nexport async function openRepoGraph(dir: string): Promise<RepoGraph> {\n const raw = await readFile(join(dir, \"meta.json\"), \"utf8\");\n const meta = JSON.parse(raw) as RepoGraphMeta;\n if (\n meta.schemaVersion !== REPO_GRAPH_SCHEMA_VERSION ||\n meta.adapterRevision !== REPO_GRAPH_ADAPTER_REVISION\n ) {\n throw new RepoGraphUnavailableError(\n `unsupported repo-graph schema ${meta.schemaVersion}/${meta.adapterRevision}`,\n );\n }\n const database = new DatabaseSync(join(dir, \"graph.sqlite\"), { readOnly: true });\n return new SQLiteRepoGraph(dir, meta, database);\n}\n\nexport async function repoGraphFromEnvironment(\n env: Record<string, string | undefined> = process.env,\n): Promise<RepoGraph | null> {\n const dir = env[ADVERSARY_REPO_GRAPH_ENV]?.trim();\n if (!dir) return null;\n try {\n return await openRepoGraph(dir);\n } catch {\n return null;\n }\n}\n\nclass SQLiteRepoGraph implements RepoGraph {\n constructor(\n readonly dir: string,\n readonly meta: RepoGraphMeta,\n private readonly database: DatabaseSync,\n ) {}\n\n files(query: RepoGraphFileQuery = {}): RepoGraphPage<RepoGraphFile> {\n const { limit, cursor } = bounds(query.limit, query.cursor);\n const glob = query.glob === undefined ? \"\" : globToLike(query.glob);\n const rows = this.database\n .prepare(`SELECT id,path,language,size,hash,module FROM files\n WHERE id > ? AND (? = '' OR language = ?) AND (? = '' OR path LIKE ? ESCAPE '\\\\')\n ORDER BY id LIMIT ?`)\n .all(cursor, query.language ?? \"\", query.language ?? \"\", glob, glob, limit + 1);\n return page(rows.map(fileRow), limit, (item) => item.id);\n }\n\n symbolAt(path: string, line: number, column = 0): RepoGraphSymbol | undefined {\n validPath(path);\n if (!Number.isInteger(line) || line < 1 || !Number.isInteger(column) || column < 0) {\n throw new Error(\"line must be positive and column non-negative\");\n }\n const row = this.database\n .prepare(`${symbolSelect}\n WHERE f.path=? AND (s.start_line < ? OR (s.start_line=? AND s.start_col<=?))\n AND (s.end_line > ? OR (s.end_line=? AND s.end_col>=?))\n ORDER BY (s.end_line-s.start_line) ASC, s.id ASC LIMIT 1`)\n .get(normalizePath(path), line, line, column, line, line, column);\n return row === undefined ? undefined : symbolRow(row);\n }\n\n symbols(query: RepoGraphSymbolQuery = {}): RepoGraphPage<RepoGraphSymbol> {\n if (query.path !== undefined) validPath(query.path);\n const { limit, cursor } = bounds(query.limit, query.cursor);\n const rows = this.database\n .prepare(`${symbolSelect}\n WHERE s.id>? AND (?='' OR f.path=?) AND (?='' OR s.name=?) AND (?='' OR s.kind=?)\n ORDER BY s.id LIMIT ?`)\n .all(\n cursor,\n query.path ?? \"\",\n normalizePath(query.path ?? \"\"),\n query.name ?? \"\",\n query.name ?? \"\",\n query.kind ?? \"\",\n query.kind ?? \"\",\n limit + 1,\n );\n return page(rows.map(symbolRow), limit, (item) => item.id);\n }\n\n definitions(query: RepoGraphSymbolQuery): RepoGraphPage<RepoGraphSymbol> {\n return this.symbols(query);\n }\n\n references(query: RepoGraphRelationQuery): RepoGraphPage<RepoGraphEdge> {\n return this.relations(query, \"references\", false);\n }\n\n callers(query: RepoGraphRelationQuery): RepoGraphPage<RepoGraphEdge> {\n return this.relations(query, \"calls\", false);\n }\n\n callees(query: RepoGraphRelationQuery): RepoGraphPage<RepoGraphEdge> {\n return this.relations(query, \"calls\", true);\n }\n\n implementations(query: RepoGraphRelationQuery): RepoGraphPage<RepoGraphEdge> {\n return this.relations(query, \"implements\", false);\n }\n\n importsOf(path: string, cursor?: string, limit?: number): RepoGraphPage<RepoGraphEdge> {\n return this.fileRelations(path, cursor, limit, true);\n }\n\n importersOf(path: string, cursor?: string, limit?: number): RepoGraphPage<RepoGraphEdge> {\n return this.fileRelations(path, cursor, limit, false);\n }\n\n relatedTests(options: {\n path?: string;\n symbolId?: number;\n cursor?: string;\n limit?: number;\n }): RepoGraphPage<RepoGraphTestLink> {\n if (options.path !== undefined) validPath(options.path);\n const symbolId = options.symbolId ?? 0;\n if (!Number.isInteger(symbolId) || symbolId < 0)\n throw new Error(\"symbolId must be non-negative\");\n const { limit, cursor } = bounds(options.limit, options.cursor);\n const rows = this.database\n .prepare(`SELECT tl.id,sf.path AS source_path,\n tl.source_symbol_id,tf.path AS test_path,tl.test_symbol_id,tl.confidence,tl.reason\n FROM test_links tl JOIN files sf ON sf.id=tl.source_file_id\n JOIN files tf ON tf.id=tl.test_file_id\n WHERE tl.id>? AND (?='' OR sf.path=?)\n AND (?=0 OR tl.source_symbol_id=? OR sf.id=(SELECT file_id FROM symbols WHERE id=?))\n ORDER BY tl.id LIMIT ?`)\n .all(\n cursor,\n options.path ?? \"\",\n normalizePath(options.path ?? \"\"),\n symbolId,\n symbolId,\n symbolId,\n limit + 1,\n );\n return testLinkPage(rows.map(testLinkRow), limit);\n }\n\n semanticUnits(options: { language?: string; path?: string } = {}): readonly SemanticUnit[] {\n if (options.path !== undefined) validPath(options.path);\n const rows = this.database\n .prepare(`SELECT su.id,f.path,su.language,su.kind,su.name,\n su.line,su.column,su.end_line,su.end_column,su.data\n FROM semantic_units su JOIN files f ON f.id=su.file_id\n WHERE (?='' OR su.language=?) AND (?='' OR f.path=?) ORDER BY su.id`)\n .all(\n options.language ?? \"\",\n options.language ?? \"\",\n options.path ?? \"\",\n normalizePath(options.path ?? \"\"),\n );\n return rows.map(semanticUnitRow);\n }\n\n semanticMatches(query: SemanticQuery): readonly SemanticMatch[] {\n defineSemanticQuery(query);\n return this.semanticUnits({ language: query.language }).flatMap((unit) =>\n matchUnit(unit, query),\n );\n }\n\n close(): void {\n this.database.close();\n }\n\n private relations(\n query: RepoGraphRelationQuery,\n kind: string,\n outgoing: boolean,\n ): RepoGraphPage<RepoGraphEdge> {\n if (!Number.isInteger(query.symbolId) || query.symbolId < 1) {\n throw new Error(\"symbolId must be positive\");\n }\n const { limit, cursor } = bounds(query.limit, query.cursor);\n const column = outgoing ? \"from_symbol_id\" : \"to_symbol_id\";\n const rows = this.database\n .prepare(`${edgeSelect}\n WHERE e.id>? AND e.kind=? AND e.${column}=? ORDER BY e.id LIMIT ?`)\n .all(cursor, kind, query.symbolId, limit + 1);\n return page(rows.map(edgeRow), limit, (item) => item.id);\n }\n\n private fileRelations(\n path: string,\n cursorValue: string | undefined,\n limitValue: number | undefined,\n outgoing: boolean,\n ): RepoGraphPage<RepoGraphEdge> {\n validPath(path);\n const { limit, cursor } = bounds(limitValue, cursorValue);\n const condition = outgoing ? \"ff.path=?\" : \"tf.module=(SELECT module FROM files WHERE path=?)\";\n const rows = this.database\n .prepare(`${edgeSelect}\n WHERE e.id>? AND e.kind='imports' AND ${condition} ORDER BY e.id LIMIT ?`)\n .all(cursor, normalizePath(path), limit + 1);\n return page(rows.map(edgeRow), limit, (item) => item.id);\n }\n}\n\nconst symbolSelect = `SELECT s.id,s.name,s.kind,f.path,s.start_line,s.start_col,\n s.end_line,s.end_col,s.container_id,s.exported,f.language,s.adapter_data\n FROM symbols s JOIN files f ON f.id=s.file_id`;\n\nconst edgeSelect = `SELECT e.id,ff.path AS from_path,e.from_symbol_id,\n COALESCE(tf.path,'') AS to_path,e.to_symbol_id,\n COALESCE(e.unresolved_target,'') AS unresolved_target,e.kind,e.line,e.column,\n e.confidence,e.adapter FROM edges e JOIN files ff ON ff.id=e.from_file_id\n LEFT JOIN files tf ON tf.id=e.to_file_id`;\n\ninterface RowRecord {\n [key: string]: unknown;\n}\n\nfunction fileRow(row: RowRecord): RepoGraphFile {\n return {\n id: number(row.id),\n path: text(row.path),\n language: text(row.language),\n size: number(row.size),\n hash: text(row.hash),\n ...(text(row.module) === \"\" ? {} : { module: text(row.module) }),\n };\n}\n\nfunction symbolRow(row: RowRecord): RepoGraphSymbol {\n return {\n id: number(row.id),\n name: text(row.name),\n kind: text(row.kind),\n path: text(row.path),\n startLine: number(row.start_line),\n startColumn: number(row.start_col),\n endLine: number(row.end_line),\n endColumn: number(row.end_col),\n ...(row.container_id === null ? {} : { containerId: number(row.container_id) }),\n exported: number(row.exported) !== 0,\n language: text(row.language),\n ...(text(row.adapter_data) === \"\" ? {} : { metadata: text(row.adapter_data) }),\n };\n}\n\nfunction edgeRow(row: RowRecord): RepoGraphEdge {\n return {\n id: number(row.id),\n fromPath: text(row.from_path),\n ...(row.from_symbol_id === null ? {} : { fromSymbolId: number(row.from_symbol_id) }),\n ...(text(row.to_path) === \"\" ? {} : { toPath: text(row.to_path) }),\n ...(row.to_symbol_id === null ? {} : { toSymbolId: number(row.to_symbol_id) }),\n ...(text(row.unresolved_target) === \"\"\n ? {}\n : { unresolvedTarget: text(row.unresolved_target) }),\n kind: text(row.kind),\n line: number(row.line),\n column: number(row.column),\n confidence: number(row.confidence),\n adapter: text(row.adapter),\n };\n}\n\ninterface SemanticUnitData {\n key: string;\n bindings: SemanticBinding[];\n operations: SemanticOperation[];\n}\n\nfunction semanticUnitRow(row: RowRecord): SemanticUnit {\n const data = JSON.parse(text(row.data)) as SemanticUnitData;\n return {\n id: number(row.id),\n key: data.key,\n path: text(row.path),\n language: text(row.language),\n kind: \"function\",\n name: text(row.name),\n line: number(row.line),\n column: number(row.column),\n endLine: number(row.end_line),\n endColumn: number(row.end_column),\n bindings: data.bindings,\n operations: data.operations,\n };\n}\n\nfunction matchUnit(unit: SemanticUnit, query: SemanticQuery): SemanticMatch[] {\n const bindings = new Map(unit.bindings.map((binding) => [binding.id, binding]));\n const results: SemanticMatch[] = [];\n const resultKeys = new Set<string>();\n const visit = (\n stepIndex: number,\n captures: Record<string, SemanticOperation | SemanticBinding>,\n ): void => {\n if (stepIndex === query.steps.length) {\n const first = Object.values(captures).find(\n (value): value is SemanticOperation => \"kind\" in value,\n );\n const identity = JSON.stringify([\n unit.key,\n ...Object.entries(captures).map(([key, value]) => [key, value.id]),\n ]);\n const key = `semantic-match:sha256:${createHash(\"sha256\").update(identity).digest(\"hex\")}`;\n if (resultKeys.has(key)) return;\n resultKeys.add(key);\n results.push({\n key,\n path: unit.path,\n unit,\n line: first?.line ?? unit.line,\n column: first?.column ?? unit.column,\n captures: { ...captures },\n });\n return;\n }\n const pattern = query.steps[stepIndex] as SemanticOperationPattern;\n for (const operation of unit.operations) {\n if (!operationMatches(operation, pattern, captures, bindings)) continue;\n const next = { ...captures };\n if (pattern.capture) next[pattern.capture] = operation;\n if (pattern.targets) {\n for (let index = 0; index < pattern.targets.length; index++) {\n const capture = pattern.targets[index]?.capture;\n const binding = bindings.get(operation.targets?.[index] ?? \"\");\n if (capture && binding) next[capture] = binding;\n }\n }\n visit(stepIndex + 1, next);\n }\n };\n visit(0, {});\n return results;\n}\n\nfunction operationMatches(\n operation: SemanticOperation,\n pattern: SemanticOperationPattern,\n captures: Record<string, SemanticOperation | SemanticBinding>,\n bindings: Map<string, SemanticBinding>,\n): boolean {\n if (\n operation.kind !== pattern.kind ||\n (pattern.name && operation.name !== pattern.name) ||\n (pattern.method && operation.method !== pattern.method) ||\n (pattern.receiverType && operation.receiverType !== pattern.receiverType) ||\n (pattern.operator && operation.operator !== pattern.operator) ||\n (pattern.sourceKind && operation.sourceKind !== pattern.sourceKind)\n )\n return false;\n if (pattern.within) {\n const parent = captures[pattern.within];\n if (!parent || !(\"kind\" in parent) || !operation.ancestors.includes(parent.id)) return false;\n }\n if (pattern.after) {\n const previous = captures[pattern.after];\n if (!previous || !(\"kind\" in previous) || operation.id <= previous.id) return false;\n }\n if (pattern.source) {\n const source = captures[pattern.source];\n if (!source || !(\"kind\" in source) || operation.sourceOperation !== source.id) return false;\n }\n if (pattern.targets) {\n if (!operation.targets || operation.targets.length !== pattern.targets.length) return false;\n for (let index = 0; index < pattern.targets.length; index++) {\n const target = pattern.targets[index] as SemanticTargetPattern;\n const binding = bindings.get(operation.targets[index] as string);\n if (\n !binding ||\n (target.scope && binding.scope !== target.scope) ||\n (target.type && binding.type !== target.type)\n )\n return false;\n }\n }\n if (pattern.references) {\n const captured = captures[pattern.references];\n if (!captured || \"kind\" in captured || !operation.references?.includes(captured.id))\n return false;\n }\n return true;\n}\n\ninterface TestLinkWithID extends RepoGraphTestLink {\n id: number;\n}\n\nfunction testLinkRow(row: RowRecord): TestLinkWithID {\n return {\n id: number(row.id),\n sourcePath: text(row.source_path),\n ...(row.source_symbol_id === null ? {} : { sourceSymbolId: number(row.source_symbol_id) }),\n testPath: text(row.test_path),\n ...(row.test_symbol_id === null ? {} : { testSymbolId: number(row.test_symbol_id) }),\n confidence: number(row.confidence),\n reason: text(row.reason),\n };\n}\n\nfunction page<T>(items: T[], limit: number, id: (item: T) => number): RepoGraphPage<T> {\n const hasMore = items.length > limit;\n const bounded = hasMore ? items.slice(0, limit) : items;\n const nextCursor = hasMore ? String(id(bounded[bounded.length - 1] as T)) : undefined;\n return {\n items: bounded,\n ...(nextCursor === undefined ? {} : { nextCursor }),\n };\n}\n\nfunction testLinkPage(items: TestLinkWithID[], limit: number): RepoGraphPage<RepoGraphTestLink> {\n const bounded = page(items, limit, (item) => item.id);\n return {\n items: bounded.items.map(({ id: _id, ...item }) => item),\n ...(bounded.nextCursor === undefined ? {} : { nextCursor: bounded.nextCursor }),\n };\n}\n\nfunction bounds(limitValue?: number, cursorValue?: string): { limit: number; cursor: number } {\n const limit = limitValue ?? 100;\n if (!Number.isInteger(limit) || limit < 1 || limit > 500) {\n throw new Error(\"limit must be an integer from 1 through 500\");\n }\n const cursor = cursorValue === undefined || cursorValue === \"\" ? 0 : Number(cursorValue);\n if (!Number.isSafeInteger(cursor) || cursor < 0) {\n throw new Error(\"cursor must be a non-negative integer\");\n }\n return { limit, cursor };\n}\n\nfunction validPath(path: string): void {\n const normalized = normalizePath(path);\n if (\n normalized === \"\" ||\n normalized.startsWith(\"/\") ||\n normalized === \"..\" ||\n normalized.startsWith(\"../\") ||\n normalized.includes(\"/../\") ||\n normalized.includes(\"\\0\") ||\n normalized.includes(\"//\")\n ) {\n throw new Error(\"path must be normalized and repository-relative\");\n }\n}\n\nfunction normalizePath(path: string): string {\n return path.replaceAll(\"\\\\\", \"/\").replace(/^\\.\\//, \"\");\n}\n\nfunction globToLike(glob: string): string {\n if (glob.includes(\"..\") || glob.startsWith(\"/\") || glob.includes(\"\\0\")) {\n throw new Error(\"glob must be repository-relative\");\n }\n return normalizePath(glob)\n .replaceAll(\"\\\\\", \"\\\\\\\\\")\n .replaceAll(\"%\", \"\\\\%\")\n .replaceAll(\"_\", \"\\\\_\")\n .replaceAll(\"*\", \"%\")\n .replaceAll(\"?\", \"_\");\n}\n\nfunction text(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value === null || value === undefined) return \"\";\n throw new Error(\"repo graph returned a non-string value\");\n}\n\nfunction number(value: unknown): number {\n if (typeof value === \"number\") return value;\n if (typeof value === \"bigint\") return Number(value);\n throw new Error(\"repo graph returned a non-number value\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"repo-graph.js","sourceRoot":"","sources":["../src/repo-graph.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\n\nexport const ADVERSARY_REPO_GRAPH_ENV = \"ADVERSARY_REPO_GRAPH\";\nexport const REPO_GRAPH_SCHEMA_VERSION = \"v2\";\nexport const REPO_GRAPH_ADAPTER_REVISION = \"go-semantic-operations-v2+ts-syntax-v1\";\n\nexport interface RepoGraphMeta {\n schemaVersion: string;\n adapterRevision: string;\n fingerprint: string;\n repoPath: string;\n builtAt: string;\n durationMs: number;\n fileCount: number;\n symbolCount: number;\n edgeCount: number;\n testLinkCount: number;\n semanticUnitCount: number;\n parseFailures?: readonly RepoGraphDiagnostic[];\n}\n\nexport interface RepoGraphDiagnostic {\n path: string;\n adapter: string;\n message: string;\n}\n\nexport interface RepoGraphFile {\n id: number;\n path: string;\n language: string;\n size: number;\n hash: string;\n module?: string;\n}\n\nexport interface RepoGraphSymbol {\n id: number;\n name: string;\n kind: string;\n path: string;\n startLine: number;\n startColumn: number;\n endLine: number;\n endColumn: number;\n containerId?: number;\n exported: boolean;\n language: string;\n metadata?: string;\n}\n\nexport interface RepoGraphEdge {\n id: number;\n fromPath: string;\n fromSymbolId?: number;\n toPath?: string;\n toSymbolId?: number;\n unresolvedTarget?: string;\n kind: string;\n line: number;\n column: number;\n confidence: number;\n adapter: string;\n}\n\nexport interface RepoGraphTestLink {\n sourcePath: string;\n sourceSymbolId?: number;\n testPath: string;\n testSymbolId?: number;\n confidence: number;\n reason: string;\n}\n\nexport type SemanticBindingScope = \"package\" | \"parameter\" | \"local\" | \"field\" | \"unknown\";\n\nexport interface SemanticBinding {\n id: string;\n name: string;\n type?: string;\n traits?: readonly string[];\n scope: SemanticBindingScope;\n}\n\nexport interface SemanticOperation {\n id: number;\n kind: \"call\" | \"assignment\" | \"return\" | \"condition\";\n line: number;\n column: number;\n endLine: number;\n endColumn: number;\n ancestors: readonly number[];\n name?: string;\n method?: string;\n receiverType?: string;\n receiverBinding?: string;\n operator?: string;\n sourceKind?: \"call\" | \"expression\";\n sourceOperation?: number;\n targets?: readonly string[];\n references?: readonly string[];\n}\n\nexport interface SemanticUnit {\n id: number;\n key: string;\n path: string;\n language: string;\n kind: \"function\";\n name: string;\n line: number;\n column: number;\n endLine: number;\n endColumn: number;\n bindings: readonly SemanticBinding[];\n operations: readonly SemanticOperation[];\n}\n\nexport interface SemanticTargetPattern {\n capture?: string;\n scope?: SemanticBindingScope;\n type?: string;\n trait?: string;\n}\n\nexport interface SemanticOperationPattern {\n kind: SemanticOperation[\"kind\"];\n capture?: string;\n within?: string;\n after?: string;\n name?: string;\n method?: string;\n receiverType?: string;\n operator?: string;\n sourceKind?: SemanticOperation[\"sourceKind\"];\n source?: string;\n targets?: readonly SemanticTargetPattern[];\n references?: string | readonly string[];\n}\n\nexport interface SemanticQuery {\n language: string;\n within: \"function\";\n steps: readonly SemanticOperationPattern[];\n}\n\nexport interface SemanticMatch {\n key: string;\n path: string;\n unit: SemanticUnit;\n line: number;\n column: number;\n captures: Readonly<Record<string, SemanticOperation | SemanticBinding>>;\n}\n\nexport class SemanticQueryValidationError extends Error {\n constructor(message: string) {\n super(`invalid semantic query: ${message}`);\n this.name = \"SemanticQueryValidationError\";\n }\n}\n\nexport function defineSemanticQuery<T extends SemanticQuery>(query: T): T {\n if (!query.language.trim()) throw new SemanticQueryValidationError(\"language is required\");\n if (query.within !== \"function\") {\n throw new SemanticQueryValidationError('within must be \"function\"');\n }\n if (query.steps.length === 0)\n throw new SemanticQueryValidationError(\"at least one step is required\");\n\n const captures = new Map<\n string,\n { type: \"operation\" | \"binding\"; kind?: SemanticOperation[\"kind\"] }\n >();\n const requireCapture = (\n name: string,\n relationship: string,\n type: \"operation\" | \"binding\",\n kind?: SemanticOperation[\"kind\"],\n ): void => {\n const captured = captures.get(name);\n if (!captured) {\n throw new SemanticQueryValidationError(\n `${relationship} references unknown earlier capture ${JSON.stringify(name)}`,\n );\n }\n if (captured.type !== type || (kind && captured.kind !== kind)) {\n throw new SemanticQueryValidationError(\n `${relationship} references an incompatible ${captured.type} capture ${JSON.stringify(name)}`,\n );\n }\n };\n const addCapture = (\n name: string | undefined,\n type: \"operation\" | \"binding\",\n kind?: SemanticOperation[\"kind\"],\n ): void => {\n if (!name) return;\n if (captures.has(name)) {\n throw new SemanticQueryValidationError(\n `capture ${JSON.stringify(name)} is declared more than once`,\n );\n }\n captures.set(name, { type, ...(kind ? { kind } : {}) });\n };\n\n for (const [index, step] of query.steps.entries()) {\n const label = `steps[${index}]`;\n if (step.within) requireCapture(step.within, `${label}.within`, \"operation\", \"call\");\n if (step.after) requireCapture(step.after, `${label}.after`, \"operation\");\n if (step.source) {\n if (step.kind !== \"assignment\" || step.sourceKind !== \"call\") {\n throw new SemanticQueryValidationError(\n `${label}.source requires an assignment with sourceKind \"call\"`,\n );\n }\n requireCapture(step.source, `${label}.source`, \"operation\", \"call\");\n if (step.after === step.source) {\n throw new SemanticQueryValidationError(\n `${label} cannot be after its own direct source call`,\n );\n }\n }\n const references =\n typeof step.references === \"string\" ? [step.references] : (step.references ?? []);\n if (references.length === 0 && Array.isArray(step.references)) {\n throw new SemanticQueryValidationError(`${label}.references must not be empty`);\n }\n for (const reference of references) {\n requireCapture(reference, `${label}.references`, \"binding\");\n }\n addCapture(step.capture, \"operation\", step.kind);\n for (const target of step.targets ?? []) addCapture(target.capture, \"binding\");\n }\n return query;\n}\n\nexport interface RepoGraphPage<T> {\n items: readonly T[];\n nextCursor?: string;\n}\n\nexport interface RepoGraphFileQuery {\n language?: string;\n glob?: string;\n cursor?: string;\n limit?: number;\n}\n\nexport interface RepoGraphSymbolQuery {\n path?: string;\n name?: string;\n kind?: string;\n cursor?: string;\n limit?: number;\n}\n\nexport interface RepoGraphRelationQuery {\n symbolId: number;\n cursor?: string;\n limit?: number;\n}\n\nexport interface RepoGraph {\n readonly dir: string;\n readonly meta: RepoGraphMeta;\n files(query?: RepoGraphFileQuery): RepoGraphPage<RepoGraphFile>;\n symbolAt(path: string, line: number, column?: number): RepoGraphSymbol | undefined;\n symbols(query?: RepoGraphSymbolQuery): RepoGraphPage<RepoGraphSymbol>;\n definitions(query: RepoGraphSymbolQuery): RepoGraphPage<RepoGraphSymbol>;\n references(query: RepoGraphRelationQuery): RepoGraphPage<RepoGraphEdge>;\n callers(query: RepoGraphRelationQuery): RepoGraphPage<RepoGraphEdge>;\n callees(query: RepoGraphRelationQuery): RepoGraphPage<RepoGraphEdge>;\n implementations(query: RepoGraphRelationQuery): RepoGraphPage<RepoGraphEdge>;\n importsOf(path: string, cursor?: string, limit?: number): RepoGraphPage<RepoGraphEdge>;\n importersOf(path: string, cursor?: string, limit?: number): RepoGraphPage<RepoGraphEdge>;\n relatedTests(options: {\n path?: string;\n symbolId?: number;\n cursor?: string;\n limit?: number;\n }): RepoGraphPage<RepoGraphTestLink>;\n semanticUnits(options?: { language?: string; path?: string }): readonly SemanticUnit[];\n semanticMatches(query: SemanticQuery): readonly SemanticMatch[];\n close(): void;\n}\n\nexport class RepoGraphUnavailableError extends Error {\n readonly code = \"repo_graph_unavailable\";\n\n constructor(message: string) {\n super(message);\n this.name = \"RepoGraphUnavailableError\";\n }\n}\n\nexport async function openRepoGraph(dir: string): Promise<RepoGraph> {\n const raw = await readFile(join(dir, \"meta.json\"), \"utf8\");\n const meta = JSON.parse(raw) as RepoGraphMeta;\n if (\n meta.schemaVersion !== REPO_GRAPH_SCHEMA_VERSION ||\n meta.adapterRevision !== REPO_GRAPH_ADAPTER_REVISION\n ) {\n throw new RepoGraphUnavailableError(\n `unsupported repo-graph schema ${meta.schemaVersion}/${meta.adapterRevision}`,\n );\n }\n const database = new DatabaseSync(join(dir, \"graph.sqlite\"), { readOnly: true });\n return new SQLiteRepoGraph(dir, meta, database);\n}\n\nexport async function repoGraphFromEnvironment(\n env: Record<string, string | undefined> = process.env,\n): Promise<RepoGraph | null> {\n const dir = env[ADVERSARY_REPO_GRAPH_ENV]?.trim();\n if (!dir) return null;\n try {\n return await openRepoGraph(dir);\n } catch {\n return null;\n }\n}\n\nclass SQLiteRepoGraph implements RepoGraph {\n constructor(\n readonly dir: string,\n readonly meta: RepoGraphMeta,\n private readonly database: DatabaseSync,\n ) {}\n\n files(query: RepoGraphFileQuery = {}): RepoGraphPage<RepoGraphFile> {\n const { limit, cursor } = bounds(query.limit, query.cursor);\n const glob = query.glob === undefined ? \"\" : globToLike(query.glob);\n const rows = this.database\n .prepare(`SELECT id,path,language,size,hash,module FROM files\n WHERE id > ? AND (? = '' OR language = ?) AND (? = '' OR path LIKE ? ESCAPE '\\\\')\n ORDER BY id LIMIT ?`)\n .all(cursor, query.language ?? \"\", query.language ?? \"\", glob, glob, limit + 1);\n return page(rows.map(fileRow), limit, (item) => item.id);\n }\n\n symbolAt(path: string, line: number, column = 0): RepoGraphSymbol | undefined {\n validPath(path);\n if (!Number.isInteger(line) || line < 1 || !Number.isInteger(column) || column < 0) {\n throw new Error(\"line must be positive and column non-negative\");\n }\n const row = this.database\n .prepare(`${symbolSelect}\n WHERE f.path=? AND (s.start_line < ? OR (s.start_line=? AND s.start_col<=?))\n AND (s.end_line > ? OR (s.end_line=? AND s.end_col>=?))\n ORDER BY (s.end_line-s.start_line) ASC, s.id ASC LIMIT 1`)\n .get(normalizePath(path), line, line, column, line, line, column);\n return row === undefined ? undefined : symbolRow(row);\n }\n\n symbols(query: RepoGraphSymbolQuery = {}): RepoGraphPage<RepoGraphSymbol> {\n if (query.path !== undefined) validPath(query.path);\n const { limit, cursor } = bounds(query.limit, query.cursor);\n const rows = this.database\n .prepare(`${symbolSelect}\n WHERE s.id>? AND (?='' OR f.path=?) AND (?='' OR s.name=?) AND (?='' OR s.kind=?)\n ORDER BY s.id LIMIT ?`)\n .all(\n cursor,\n query.path ?? \"\",\n normalizePath(query.path ?? \"\"),\n query.name ?? \"\",\n query.name ?? \"\",\n query.kind ?? \"\",\n query.kind ?? \"\",\n limit + 1,\n );\n return page(rows.map(symbolRow), limit, (item) => item.id);\n }\n\n definitions(query: RepoGraphSymbolQuery): RepoGraphPage<RepoGraphSymbol> {\n return this.symbols(query);\n }\n\n references(query: RepoGraphRelationQuery): RepoGraphPage<RepoGraphEdge> {\n return this.relations(query, \"references\", false);\n }\n\n callers(query: RepoGraphRelationQuery): RepoGraphPage<RepoGraphEdge> {\n return this.relations(query, \"calls\", false);\n }\n\n callees(query: RepoGraphRelationQuery): RepoGraphPage<RepoGraphEdge> {\n return this.relations(query, \"calls\", true);\n }\n\n implementations(query: RepoGraphRelationQuery): RepoGraphPage<RepoGraphEdge> {\n return this.relations(query, \"implements\", false);\n }\n\n importsOf(path: string, cursor?: string, limit?: number): RepoGraphPage<RepoGraphEdge> {\n return this.fileRelations(path, cursor, limit, true);\n }\n\n importersOf(path: string, cursor?: string, limit?: number): RepoGraphPage<RepoGraphEdge> {\n return this.fileRelations(path, cursor, limit, false);\n }\n\n relatedTests(options: {\n path?: string;\n symbolId?: number;\n cursor?: string;\n limit?: number;\n }): RepoGraphPage<RepoGraphTestLink> {\n if (options.path !== undefined) validPath(options.path);\n const symbolId = options.symbolId ?? 0;\n if (!Number.isInteger(symbolId) || symbolId < 0)\n throw new Error(\"symbolId must be non-negative\");\n const { limit, cursor } = bounds(options.limit, options.cursor);\n const rows = this.database\n .prepare(`SELECT tl.id,sf.path AS source_path,\n tl.source_symbol_id,tf.path AS test_path,tl.test_symbol_id,tl.confidence,tl.reason\n FROM test_links tl JOIN files sf ON sf.id=tl.source_file_id\n JOIN files tf ON tf.id=tl.test_file_id\n WHERE tl.id>? AND (?='' OR sf.path=?)\n AND (?=0 OR tl.source_symbol_id=? OR sf.id=(SELECT file_id FROM symbols WHERE id=?))\n ORDER BY tl.id LIMIT ?`)\n .all(\n cursor,\n options.path ?? \"\",\n normalizePath(options.path ?? \"\"),\n symbolId,\n symbolId,\n symbolId,\n limit + 1,\n );\n return testLinkPage(rows.map(testLinkRow), limit);\n }\n\n semanticUnits(options: { language?: string; path?: string } = {}): readonly SemanticUnit[] {\n if (options.path !== undefined) validPath(options.path);\n const rows = this.database\n .prepare(`SELECT su.id,f.path,su.language,su.kind,su.name,\n su.line,su.column,su.end_line,su.end_column,su.data\n FROM semantic_units su JOIN files f ON f.id=su.file_id\n WHERE (?='' OR su.language=?) AND (?='' OR f.path=?) ORDER BY su.id`)\n .all(\n options.language ?? \"\",\n options.language ?? \"\",\n options.path ?? \"\",\n normalizePath(options.path ?? \"\"),\n );\n return rows.map(semanticUnitRow);\n }\n\n semanticMatches(query: SemanticQuery): readonly SemanticMatch[] {\n defineSemanticQuery(query);\n return this.semanticUnits({ language: query.language }).flatMap((unit) =>\n matchUnit(unit, query),\n );\n }\n\n close(): void {\n this.database.close();\n }\n\n private relations(\n query: RepoGraphRelationQuery,\n kind: string,\n outgoing: boolean,\n ): RepoGraphPage<RepoGraphEdge> {\n if (!Number.isInteger(query.symbolId) || query.symbolId < 1) {\n throw new Error(\"symbolId must be positive\");\n }\n const { limit, cursor } = bounds(query.limit, query.cursor);\n const column = outgoing ? \"from_symbol_id\" : \"to_symbol_id\";\n const rows = this.database\n .prepare(`${edgeSelect}\n WHERE e.id>? AND e.kind=? AND e.${column}=? ORDER BY e.id LIMIT ?`)\n .all(cursor, kind, query.symbolId, limit + 1);\n return page(rows.map(edgeRow), limit, (item) => item.id);\n }\n\n private fileRelations(\n path: string,\n cursorValue: string | undefined,\n limitValue: number | undefined,\n outgoing: boolean,\n ): RepoGraphPage<RepoGraphEdge> {\n validPath(path);\n const { limit, cursor } = bounds(limitValue, cursorValue);\n const condition = outgoing ? \"ff.path=?\" : \"tf.module=(SELECT module FROM files WHERE path=?)\";\n const rows = this.database\n .prepare(`${edgeSelect}\n WHERE e.id>? AND e.kind='imports' AND ${condition} ORDER BY e.id LIMIT ?`)\n .all(cursor, normalizePath(path), limit + 1);\n return page(rows.map(edgeRow), limit, (item) => item.id);\n }\n}\n\nconst symbolSelect = `SELECT s.id,s.name,s.kind,f.path,s.start_line,s.start_col,\n s.end_line,s.end_col,s.container_id,s.exported,f.language,s.adapter_data\n FROM symbols s JOIN files f ON f.id=s.file_id`;\n\nconst edgeSelect = `SELECT e.id,ff.path AS from_path,e.from_symbol_id,\n COALESCE(tf.path,'') AS to_path,e.to_symbol_id,\n COALESCE(e.unresolved_target,'') AS unresolved_target,e.kind,e.line,e.column,\n e.confidence,e.adapter FROM edges e JOIN files ff ON ff.id=e.from_file_id\n LEFT JOIN files tf ON tf.id=e.to_file_id`;\n\ninterface RowRecord {\n [key: string]: unknown;\n}\n\nfunction fileRow(row: RowRecord): RepoGraphFile {\n return {\n id: number(row.id),\n path: text(row.path),\n language: text(row.language),\n size: number(row.size),\n hash: text(row.hash),\n ...(text(row.module) === \"\" ? {} : { module: text(row.module) }),\n };\n}\n\nfunction symbolRow(row: RowRecord): RepoGraphSymbol {\n return {\n id: number(row.id),\n name: text(row.name),\n kind: text(row.kind),\n path: text(row.path),\n startLine: number(row.start_line),\n startColumn: number(row.start_col),\n endLine: number(row.end_line),\n endColumn: number(row.end_col),\n ...(row.container_id === null ? {} : { containerId: number(row.container_id) }),\n exported: number(row.exported) !== 0,\n language: text(row.language),\n ...(text(row.adapter_data) === \"\" ? {} : { metadata: text(row.adapter_data) }),\n };\n}\n\nfunction edgeRow(row: RowRecord): RepoGraphEdge {\n return {\n id: number(row.id),\n fromPath: text(row.from_path),\n ...(row.from_symbol_id === null ? {} : { fromSymbolId: number(row.from_symbol_id) }),\n ...(text(row.to_path) === \"\" ? {} : { toPath: text(row.to_path) }),\n ...(row.to_symbol_id === null ? {} : { toSymbolId: number(row.to_symbol_id) }),\n ...(text(row.unresolved_target) === \"\"\n ? {}\n : { unresolvedTarget: text(row.unresolved_target) }),\n kind: text(row.kind),\n line: number(row.line),\n column: number(row.column),\n confidence: number(row.confidence),\n adapter: text(row.adapter),\n };\n}\n\ninterface SemanticUnitData {\n key: string;\n bindings: SemanticBinding[];\n operations: SemanticOperation[];\n}\n\nfunction semanticUnitRow(row: RowRecord): SemanticUnit {\n const data = JSON.parse(text(row.data)) as SemanticUnitData;\n return {\n id: number(row.id),\n key: data.key,\n path: text(row.path),\n language: text(row.language),\n kind: \"function\",\n name: text(row.name),\n line: number(row.line),\n column: number(row.column),\n endLine: number(row.end_line),\n endColumn: number(row.end_column),\n bindings: data.bindings,\n operations: data.operations,\n };\n}\n\nfunction matchUnit(unit: SemanticUnit, query: SemanticQuery): SemanticMatch[] {\n const bindings = new Map(unit.bindings.map((binding) => [binding.id, binding]));\n const results: SemanticMatch[] = [];\n const resultKeys = new Set<string>();\n const visit = (\n stepIndex: number,\n captures: Record<string, SemanticOperation | SemanticBinding>,\n ): void => {\n if (stepIndex === query.steps.length) {\n const first = Object.values(captures).find(\n (value): value is SemanticOperation => \"kind\" in value,\n );\n const identity = JSON.stringify([\n unit.key,\n ...Object.entries(captures).map(([key, value]) => [key, value.id]),\n ]);\n const key = `semantic-match:sha256:${createHash(\"sha256\").update(identity).digest(\"hex\")}`;\n if (resultKeys.has(key)) return;\n resultKeys.add(key);\n results.push({\n key,\n path: unit.path,\n unit,\n line: first?.line ?? unit.line,\n column: first?.column ?? unit.column,\n captures: { ...captures },\n });\n return;\n }\n const pattern = query.steps[stepIndex] as SemanticOperationPattern;\n for (const operation of unit.operations) {\n if (!operationMatches(operation, pattern, captures, bindings)) continue;\n const next = { ...captures };\n if (pattern.capture) next[pattern.capture] = operation;\n if (pattern.targets) {\n for (let index = 0; index < pattern.targets.length; index++) {\n const capture = pattern.targets[index]?.capture;\n const binding = bindings.get(operation.targets?.[index] ?? \"\");\n if (capture && binding) next[capture] = binding;\n }\n }\n visit(stepIndex + 1, next);\n }\n };\n visit(0, {});\n return results;\n}\n\nfunction operationMatches(\n operation: SemanticOperation,\n pattern: SemanticOperationPattern,\n captures: Record<string, SemanticOperation | SemanticBinding>,\n bindings: Map<string, SemanticBinding>,\n): boolean {\n if (\n operation.kind !== pattern.kind ||\n (pattern.name && operation.name !== pattern.name) ||\n (pattern.method && operation.method !== pattern.method) ||\n (pattern.receiverType && operation.receiverType !== pattern.receiverType) ||\n (pattern.operator && operation.operator !== pattern.operator) ||\n (pattern.sourceKind && operation.sourceKind !== pattern.sourceKind)\n )\n return false;\n if (pattern.within) {\n const parent = captures[pattern.within];\n if (!parent || !(\"kind\" in parent) || !operation.ancestors.includes(parent.id)) return false;\n }\n if (pattern.after) {\n const previous = captures[pattern.after];\n if (!previous || !(\"kind\" in previous) || operation.id <= previous.id) return false;\n }\n if (pattern.source) {\n const source = captures[pattern.source];\n if (!source || !(\"kind\" in source) || operation.sourceOperation !== source.id) return false;\n }\n if (pattern.targets) {\n if (!operation.targets || operation.targets.length !== pattern.targets.length) return false;\n for (let index = 0; index < pattern.targets.length; index++) {\n const target = pattern.targets[index] as SemanticTargetPattern;\n const binding = bindings.get(operation.targets[index] as string);\n if (\n !binding ||\n (target.scope && binding.scope !== target.scope) ||\n (target.type && binding.type !== target.type) ||\n (target.trait && !binding.traits?.includes(target.trait))\n )\n return false;\n }\n }\n if (pattern.references) {\n const references =\n typeof pattern.references === \"string\" ? [pattern.references] : pattern.references;\n for (const reference of references) {\n const captured = captures[reference];\n if (!captured || \"kind\" in captured || !operation.references?.includes(captured.id))\n return false;\n }\n }\n return true;\n}\n\ninterface TestLinkWithID extends RepoGraphTestLink {\n id: number;\n}\n\nfunction testLinkRow(row: RowRecord): TestLinkWithID {\n return {\n id: number(row.id),\n sourcePath: text(row.source_path),\n ...(row.source_symbol_id === null ? {} : { sourceSymbolId: number(row.source_symbol_id) }),\n testPath: text(row.test_path),\n ...(row.test_symbol_id === null ? {} : { testSymbolId: number(row.test_symbol_id) }),\n confidence: number(row.confidence),\n reason: text(row.reason),\n };\n}\n\nfunction page<T>(items: T[], limit: number, id: (item: T) => number): RepoGraphPage<T> {\n const hasMore = items.length > limit;\n const bounded = hasMore ? items.slice(0, limit) : items;\n const nextCursor = hasMore ? String(id(bounded[bounded.length - 1] as T)) : undefined;\n return {\n items: bounded,\n ...(nextCursor === undefined ? {} : { nextCursor }),\n };\n}\n\nfunction testLinkPage(items: TestLinkWithID[], limit: number): RepoGraphPage<RepoGraphTestLink> {\n const bounded = page(items, limit, (item) => item.id);\n return {\n items: bounded.items.map(({ id: _id, ...item }) => item),\n ...(bounded.nextCursor === undefined ? {} : { nextCursor: bounded.nextCursor }),\n };\n}\n\nfunction bounds(limitValue?: number, cursorValue?: string): { limit: number; cursor: number } {\n const limit = limitValue ?? 100;\n if (!Number.isInteger(limit) || limit < 1 || limit > 500) {\n throw new Error(\"limit must be an integer from 1 through 500\");\n }\n const cursor = cursorValue === undefined || cursorValue === \"\" ? 0 : Number(cursorValue);\n if (!Number.isSafeInteger(cursor) || cursor < 0) {\n throw new Error(\"cursor must be a non-negative integer\");\n }\n return { limit, cursor };\n}\n\nfunction validPath(path: string): void {\n const normalized = normalizePath(path);\n if (\n normalized === \"\" ||\n normalized.startsWith(\"/\") ||\n normalized === \"..\" ||\n normalized.startsWith(\"../\") ||\n normalized.includes(\"/../\") ||\n normalized.includes(\"\\0\") ||\n normalized.includes(\"//\")\n ) {\n throw new Error(\"path must be normalized and repository-relative\");\n }\n}\n\nfunction normalizePath(path: string): string {\n return path.replaceAll(\"\\\\\", \"/\").replace(/^\\.\\//, \"\");\n}\n\nfunction globToLike(glob: string): string {\n if (glob.includes(\"..\") || glob.startsWith(\"/\") || glob.includes(\"\\0\")) {\n throw new Error(\"glob must be repository-relative\");\n }\n return normalizePath(glob)\n .replaceAll(\"\\\\\", \"\\\\\\\\\")\n .replaceAll(\"%\", \"\\\\%\")\n .replaceAll(\"_\", \"\\\\_\")\n .replaceAll(\"*\", \"%\")\n .replaceAll(\"?\", \"_\");\n}\n\nfunction text(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value === null || value === undefined) return \"\";\n throw new Error(\"repo graph returned a non-string value\");\n}\n\nfunction number(value: unknown): number {\n if (typeof value === \"number\") return value;\n if (typeof value === \"bigint\") return Number(value);\n throw new Error(\"repo graph returned a non-number value\");\n}\n"]}
|