@adversarylabs/sdk 0.1.19 → 0.1.20
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 +20 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/repo-graph.d.ts +41 -1
- package/dist/repo-graph.d.ts.map +1 -1
- package/dist/repo-graph.js +62 -1
- package/dist/repo-graph.js.map +1 -1
- package/package.json +1 -1
package/dist/repo-graph.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare const ADVERSARY_REPO_GRAPH_ENV = "ADVERSARY_REPO_GRAPH";
|
|
2
2
|
export declare const REPO_GRAPH_SCHEMA_VERSION = "v2";
|
|
3
|
-
export declare const REPO_GRAPH_ADAPTER_REVISION = "go-
|
|
3
|
+
export declare const REPO_GRAPH_ADAPTER_REVISION = "go-semantic-v1+ts-syntax-v1";
|
|
4
4
|
export interface RepoGraphMeta {
|
|
5
5
|
schemaVersion: string;
|
|
6
6
|
adapterRevision: string;
|
|
@@ -12,6 +12,7 @@ export interface RepoGraphMeta {
|
|
|
12
12
|
symbolCount: number;
|
|
13
13
|
edgeCount: number;
|
|
14
14
|
testLinkCount: number;
|
|
15
|
+
factCount: number;
|
|
15
16
|
parseFailures?: readonly RepoGraphDiagnostic[];
|
|
16
17
|
}
|
|
17
18
|
export interface RepoGraphDiagnostic {
|
|
@@ -62,6 +63,43 @@ export interface RepoGraphTestLink {
|
|
|
62
63
|
confidence: number;
|
|
63
64
|
reason: string;
|
|
64
65
|
}
|
|
66
|
+
export interface RepoGraphSemanticFact<T = unknown> {
|
|
67
|
+
id: number;
|
|
68
|
+
kind: string;
|
|
69
|
+
path: string;
|
|
70
|
+
module?: string;
|
|
71
|
+
symbolId?: number;
|
|
72
|
+
line: number;
|
|
73
|
+
column: number;
|
|
74
|
+
endLine: number;
|
|
75
|
+
endColumn: number;
|
|
76
|
+
confidence: number;
|
|
77
|
+
adapter: string;
|
|
78
|
+
data: T;
|
|
79
|
+
}
|
|
80
|
+
export interface RepoGraphFactQuery {
|
|
81
|
+
kind?: string;
|
|
82
|
+
path?: string;
|
|
83
|
+
module?: string;
|
|
84
|
+
cursor?: string;
|
|
85
|
+
limit?: number;
|
|
86
|
+
}
|
|
87
|
+
export interface GoFallibleOnceInitialization {
|
|
88
|
+
id: number;
|
|
89
|
+
path: string;
|
|
90
|
+
module?: string;
|
|
91
|
+
symbolId?: number;
|
|
92
|
+
line: number;
|
|
93
|
+
column: number;
|
|
94
|
+
endLine: number;
|
|
95
|
+
endColumn: number;
|
|
96
|
+
confidence: number;
|
|
97
|
+
function: string;
|
|
98
|
+
guard: string;
|
|
99
|
+
value: string;
|
|
100
|
+
error: string;
|
|
101
|
+
explicitResetAfterError: boolean;
|
|
102
|
+
}
|
|
65
103
|
export interface RepoGraphPage<T> {
|
|
66
104
|
items: readonly T[];
|
|
67
105
|
nextCursor?: string;
|
|
@@ -103,6 +141,8 @@ export interface RepoGraph {
|
|
|
103
141
|
cursor?: string;
|
|
104
142
|
limit?: number;
|
|
105
143
|
}): RepoGraphPage<RepoGraphTestLink>;
|
|
144
|
+
semanticFacts<T = unknown>(query?: RepoGraphFactQuery): RepoGraphPage<RepoGraphSemanticFact<T>>;
|
|
145
|
+
goFallibleOnceInitializations(query?: Omit<RepoGraphFactQuery, "kind">): RepoGraphPage<GoFallibleOnceInitialization>;
|
|
106
146
|
close(): void;
|
|
107
147
|
}
|
|
108
148
|
export declare class RepoGraphUnavailableError extends Error {
|
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":"AAIA,eAAO,MAAM,wBAAwB,yBAAyB,CAAC;AAC/D,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAC9C,eAAO,MAAM,2BAA2B,
|
|
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
|
@@ -3,7 +3,7 @@ import { join } from "node:path";
|
|
|
3
3
|
import { DatabaseSync } from "node:sqlite";
|
|
4
4
|
export const ADVERSARY_REPO_GRAPH_ENV = "ADVERSARY_REPO_GRAPH";
|
|
5
5
|
export const REPO_GRAPH_SCHEMA_VERSION = "v2";
|
|
6
|
-
export const REPO_GRAPH_ADAPTER_REVISION = "go-
|
|
6
|
+
export const REPO_GRAPH_ADAPTER_REVISION = "go-semantic-v1+ts-syntax-v1";
|
|
7
7
|
export class RepoGraphUnavailableError extends Error {
|
|
8
8
|
code = "repo_graph_unavailable";
|
|
9
9
|
constructor(message) {
|
|
@@ -114,6 +114,29 @@ class SQLiteRepoGraph {
|
|
|
114
114
|
.all(cursor, options.path ?? "", normalizePath(options.path ?? ""), symbolId, symbolId, symbolId, limit + 1);
|
|
115
115
|
return testLinkPage(rows.map(testLinkRow), limit);
|
|
116
116
|
}
|
|
117
|
+
semanticFacts(query = {}) {
|
|
118
|
+
if (query.path !== undefined)
|
|
119
|
+
validPath(query.path);
|
|
120
|
+
const { limit, cursor } = bounds(query.limit, query.cursor);
|
|
121
|
+
const rows = this.database
|
|
122
|
+
.prepare(`SELECT sf.id,sf.kind,f.path,f.module,sf.symbol_id,
|
|
123
|
+
sf.line,sf.column,sf.end_line,sf.end_column,sf.confidence,sf.adapter,sf.data
|
|
124
|
+
FROM semantic_facts sf JOIN files f ON f.id=sf.file_id
|
|
125
|
+
WHERE sf.id>? AND (?='' OR sf.kind=?) AND (?='' OR f.path=?)
|
|
126
|
+
AND (?='' OR f.module=?) ORDER BY sf.id LIMIT ?`)
|
|
127
|
+
.all(cursor, query.kind ?? "", query.kind ?? "", query.path ?? "", normalizePath(query.path ?? ""), query.module ?? "", query.module ?? "", limit + 1);
|
|
128
|
+
return page(rows.map((row) => semanticFactRow(row)), limit, (item) => item.id);
|
|
129
|
+
}
|
|
130
|
+
goFallibleOnceInitializations(query = {}) {
|
|
131
|
+
const facts = this.semanticFacts({
|
|
132
|
+
...query,
|
|
133
|
+
kind: "go.fallible_once_initialization",
|
|
134
|
+
});
|
|
135
|
+
return {
|
|
136
|
+
items: facts.items.map(goFallibleOnceInitialization),
|
|
137
|
+
...(facts.nextCursor === undefined ? {} : { nextCursor: facts.nextCursor }),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
117
140
|
close() {
|
|
118
141
|
this.database.close();
|
|
119
142
|
}
|
|
@@ -191,6 +214,44 @@ function edgeRow(row) {
|
|
|
191
214
|
adapter: text(row.adapter),
|
|
192
215
|
};
|
|
193
216
|
}
|
|
217
|
+
function semanticFactRow(row) {
|
|
218
|
+
return {
|
|
219
|
+
id: number(row.id),
|
|
220
|
+
kind: text(row.kind),
|
|
221
|
+
path: text(row.path),
|
|
222
|
+
...(text(row.module) === "" ? {} : { module: text(row.module) }),
|
|
223
|
+
...(row.symbol_id === null ? {} : { symbolId: number(row.symbol_id) }),
|
|
224
|
+
line: number(row.line),
|
|
225
|
+
column: number(row.column),
|
|
226
|
+
endLine: number(row.end_line),
|
|
227
|
+
endColumn: number(row.end_column),
|
|
228
|
+
confidence: number(row.confidence),
|
|
229
|
+
adapter: text(row.adapter),
|
|
230
|
+
data: JSON.parse(text(row.data)),
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
function goFallibleOnceInitialization(fact) {
|
|
234
|
+
const data = fact.data;
|
|
235
|
+
if (typeof data.function !== "string" ||
|
|
236
|
+
typeof data.guard !== "string" ||
|
|
237
|
+
typeof data.value !== "string" ||
|
|
238
|
+
typeof data.error !== "string" ||
|
|
239
|
+
typeof data.explicitResetAfterError !== "boolean") {
|
|
240
|
+
throw new Error("malformed go.fallible_once_initialization fact");
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
id: fact.id,
|
|
244
|
+
path: fact.path,
|
|
245
|
+
...(fact.module === undefined ? {} : { module: fact.module }),
|
|
246
|
+
...(fact.symbolId === undefined ? {} : { symbolId: fact.symbolId }),
|
|
247
|
+
line: fact.line,
|
|
248
|
+
column: fact.column,
|
|
249
|
+
endLine: fact.endLine,
|
|
250
|
+
endColumn: fact.endColumn,
|
|
251
|
+
confidence: fact.confidence,
|
|
252
|
+
...data,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
194
255
|
function testLinkRow(row) {
|
|
195
256
|
return {
|
|
196
257
|
id: number(row.id),
|
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 { 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-ast-v1+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 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 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 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 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 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 { 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-v1+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 factCount: 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 interface RepoGraphSemanticFact<T = unknown> {\n id: number;\n kind: string;\n path: string;\n module?: string;\n symbolId?: number;\n line: number;\n column: number;\n endLine: number;\n endColumn: number;\n confidence: number;\n adapter: string;\n data: T;\n}\n\nexport interface RepoGraphFactQuery {\n kind?: string;\n path?: string;\n module?: string;\n cursor?: string;\n limit?: number;\n}\n\nexport interface GoFallibleOnceInitialization {\n id: number;\n path: string;\n module?: string;\n symbolId?: number;\n line: number;\n column: number;\n endLine: number;\n endColumn: number;\n confidence: number;\n function: string;\n guard: string;\n value: string;\n error: string;\n explicitResetAfterError: boolean;\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 semanticFacts<T = unknown>(query?: RepoGraphFactQuery): RepoGraphPage<RepoGraphSemanticFact<T>>;\n goFallibleOnceInitializations(\n query?: Omit<RepoGraphFactQuery, \"kind\">,\n ): RepoGraphPage<GoFallibleOnceInitialization>;\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 semanticFacts<T = unknown>(\n query: RepoGraphFactQuery = {},\n ): RepoGraphPage<RepoGraphSemanticFact<T>> {\n if (query.path !== undefined) validPath(query.path);\n const { limit, cursor } = bounds(query.limit, query.cursor);\n const rows = this.database\n .prepare(`SELECT sf.id,sf.kind,f.path,f.module,sf.symbol_id,\n sf.line,sf.column,sf.end_line,sf.end_column,sf.confidence,sf.adapter,sf.data\n FROM semantic_facts sf JOIN files f ON f.id=sf.file_id\n WHERE sf.id>? AND (?='' OR sf.kind=?) AND (?='' OR f.path=?)\n AND (?='' OR f.module=?) ORDER BY sf.id LIMIT ?`)\n .all(\n cursor,\n query.kind ?? \"\",\n query.kind ?? \"\",\n query.path ?? \"\",\n normalizePath(query.path ?? \"\"),\n query.module ?? \"\",\n query.module ?? \"\",\n limit + 1,\n );\n return page(\n rows.map((row) => semanticFactRow<T>(row)),\n limit,\n (item) => item.id,\n );\n }\n\n goFallibleOnceInitializations(\n query: Omit<RepoGraphFactQuery, \"kind\"> = {},\n ): RepoGraphPage<GoFallibleOnceInitialization> {\n const facts = this.semanticFacts<GoFallibleOnceData>({\n ...query,\n kind: \"go.fallible_once_initialization\",\n });\n return {\n items: facts.items.map(goFallibleOnceInitialization),\n ...(facts.nextCursor === undefined ? {} : { nextCursor: facts.nextCursor }),\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 GoFallibleOnceData {\n function: string;\n guard: string;\n value: string;\n error: string;\n explicitResetAfterError: boolean;\n}\n\nfunction semanticFactRow<T>(row: RowRecord): RepoGraphSemanticFact<T> {\n return {\n id: number(row.id),\n kind: text(row.kind),\n path: text(row.path),\n ...(text(row.module) === \"\" ? {} : { module: text(row.module) }),\n ...(row.symbol_id === null ? {} : { symbolId: number(row.symbol_id) }),\n line: number(row.line),\n column: number(row.column),\n endLine: number(row.end_line),\n endColumn: number(row.end_column),\n confidence: number(row.confidence),\n adapter: text(row.adapter),\n data: JSON.parse(text(row.data)) as T,\n };\n}\n\nfunction goFallibleOnceInitialization(\n fact: RepoGraphSemanticFact<GoFallibleOnceData>,\n): GoFallibleOnceInitialization {\n const data = fact.data;\n if (\n typeof data.function !== \"string\" ||\n typeof data.guard !== \"string\" ||\n typeof data.value !== \"string\" ||\n typeof data.error !== \"string\" ||\n typeof data.explicitResetAfterError !== \"boolean\"\n ) {\n throw new Error(\"malformed go.fallible_once_initialization fact\");\n }\n return {\n id: fact.id,\n path: fact.path,\n ...(fact.module === undefined ? {} : { module: fact.module }),\n ...(fact.symbolId === undefined ? {} : { symbolId: fact.symbolId }),\n line: fact.line,\n column: fact.column,\n endLine: fact.endLine,\n endColumn: fact.endColumn,\n confidence: fact.confidence,\n ...data,\n };\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"]}
|