gitnexus 1.6.10-rc.140 → 1.6.10-rc.142
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/dist/_shared/graph/types.d.ts +6 -0
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +1 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/core/incremental/subgraph-extract.d.ts +7 -4
- package/dist/core/incremental/subgraph-extract.js +15 -4
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +2 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +14 -0
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +32 -0
- package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
- package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
- package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
- package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +4 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +16 -0
- package/dist/core/ingestion/languages/java/captures.js +13 -1
- package/dist/core/ingestion/languages/java/scope-resolver.js +2 -0
- package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
- package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +5 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +16 -0
- package/dist/core/ingestion/languages/kotlin/captures.js +16 -1
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +2 -0
- package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
- package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
- package/dist/core/ingestion/pipeline-phases/index.d.ts +1 -0
- package/dist/core/ingestion/pipeline-phases/index.js +1 -0
- package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
- package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
- package/dist/core/ingestion/pipeline.d.ts +10 -2
- package/dist/core/ingestion/pipeline.js +5 -3
- package/dist/core/lbug/graph-emit-sink.d.ts +2 -2
- package/dist/core/lbug/graph-emit-sink.js +4 -2
- package/dist/core/lbug/lbug-adapter.d.ts +13 -0
- package/dist/core/lbug/lbug-adapter.js +42 -0
- package/dist/core/lbug/schema.d.ts +1 -1
- package/dist/core/lbug/schema.js +1 -0
- package/dist/core/run-analyze.js +12 -6
- package/dist/mcp/local/aop-metadata.d.ts +77 -0
- package/dist/mcp/local/aop-metadata.js +227 -0
- package/dist/mcp/local/bean-metadata.js +1 -0
- package/dist/mcp/local/local-backend.js +44 -6
- package/dist/mcp/tools.js +1 -1
- package/dist/storage/parse-cache.js +4 -1
- package/dist/storage/repo-manager.d.ts +6 -1
- package/dist/storage/repo-manager.js +6 -1
- package/package.json +1 -1
- package/web/assets/{agent-CqweAZxp.js → agent-Bt3vMIs7.js} +1 -1
- package/web/assets/{index-hgYhtpuW.js → index-BsB9kQ9C.js} +3 -3
- package/web/index.html +1 -1
|
@@ -81,6 +81,12 @@ export type RelationshipType = 'CONTAINS' | 'CALLS' | 'INHERITS' | 'METHOD_OVERR
|
|
|
81
81
|
* semantics belong in `reason` so the relationship can be reused by other
|
|
82
82
|
* metadata-driven systems. */
|
|
83
83
|
| 'DECLARES'
|
|
84
|
+
/** Framework advice relationship. Source = the class-like/Method whose behavior
|
|
85
|
+
* is intercepted; target = either the concrete advice Method or a synthetic
|
|
86
|
+
* CodeElement describing a declarative interceptor (transaction, cache, or
|
|
87
|
+
* method security). Runtime activation remains explicitly unknown in the
|
|
88
|
+
* relationship reason; this edge records statically visible advice only. */
|
|
89
|
+
| 'ADVISED_BY'
|
|
84
90
|
/** Vue component event system: a handler function in a parent component is
|
|
85
91
|
* bound to an event emitted by a child component (`@event="handlerFn"`).
|
|
86
92
|
* Source = handler Function/Method node in the parent.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/graph/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/graph/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
export declare const NODE_TABLES: readonly ["File", "Folder", "Function", "Class", "Interface", "Method", "CodeElement", "Community", "Process", "Section", "Struct", "Enum", "Macro", "Typedef", "Union", "Namespace", "Trait", "Impl", "TypeAlias", "Const", "Static", "Variable", "Property", "Record", "Delegate", "Annotation", "Constructor", "Template", "Module", "Route", "Tool", "BasicBlock"];
|
|
11
11
|
export type NodeTableName = (typeof NODE_TABLES)[number];
|
|
12
12
|
export declare const REL_TABLE_NAME = "CodeRelation";
|
|
13
|
-
export declare const REL_TYPES: readonly ["CONTAINS", "DEFINES", "IMPORTS", "CALLS", "EXTENDS", "IMPLEMENTS", "HAS_METHOD", "HAS_PROPERTY", "ACCESSES", "METHOD_OVERRIDES", "OVERRIDES", "METHOD_IMPLEMENTS", "MEMBER_OF", "STEP_IN_PROCESS", "HANDLES_ROUTE", "FETCHES", "HANDLES_TOOL", "ENTRY_POINT_OF", "WRAPS", "QUERIES", "INJECTS", "CONDITIONAL_ON", "DECLARES", "CFG", "REACHING_DEF", "TAINTED", "SANITIZES", "TAINT_PATH", "CDG", "POST_DOMINATE"];
|
|
13
|
+
export declare const REL_TYPES: readonly ["CONTAINS", "DEFINES", "IMPORTS", "CALLS", "EXTENDS", "IMPLEMENTS", "HAS_METHOD", "HAS_PROPERTY", "ACCESSES", "METHOD_OVERRIDES", "OVERRIDES", "METHOD_IMPLEMENTS", "MEMBER_OF", "STEP_IN_PROCESS", "HANDLES_ROUTE", "FETCHES", "HANDLES_TOOL", "ENTRY_POINT_OF", "WRAPS", "QUERIES", "INJECTS", "CONDITIONAL_ON", "DECLARES", "ADVISED_BY", "CFG", "REACHING_DEF", "TAINTED", "SANITIZES", "TAINT_PATH", "CDG", "POST_DOMINATE"];
|
|
14
14
|
export type RelType = (typeof REL_TYPES)[number];
|
|
15
15
|
export declare const EMBEDDING_TABLE_NAME = "CodeEmbedding";
|
|
16
16
|
//# sourceMappingURL=schema-constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-constants.d.ts","sourceRoot":"","sources":["../../src/lbug/schema-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,WAAW,wWAkCd,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,cAAc,iBAAiB,CAAC;AAE7C,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"schema-constants.d.ts","sourceRoot":"","sources":["../../src/lbug/schema-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,WAAW,wWAkCd,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,cAAc,iBAAiB,CAAC;AAE7C,eAAO,MAAM,SAAS,6aAuCZ,CAAC;AAEX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjD,eAAO,MAAM,oBAAoB,kBAAkB,CAAC"}
|
|
@@ -67,6 +67,7 @@ export const REL_TYPES = [
|
|
|
67
67
|
'INJECTS',
|
|
68
68
|
'CONDITIONAL_ON',
|
|
69
69
|
'DECLARES',
|
|
70
|
+
'ADVISED_BY',
|
|
70
71
|
// Taint/PDG substrate (issue #2080) — reserved edge types, emitted by no
|
|
71
72
|
// phase yet (CFG → M1, REACHING_DEF → M2, TAINTED/SANITIZES/TAINT_PATH →
|
|
72
73
|
// M3/M4). REACHING_DEF's variable name rides the relation's `reason` column.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-constants.js","sourceRoot":"","sources":["../../src/lbug/schema-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM;IACN,QAAQ;IACR,UAAU;IACV,OAAO;IACP,WAAW;IACX,QAAQ;IACR,aAAa;IACb,WAAW;IACX,SAAS;IACT,SAAS;IACT,QAAQ;IACR,MAAM;IACN,OAAO;IACP,SAAS;IACT,OAAO;IACP,WAAW;IACX,OAAO;IACP,MAAM;IACN,WAAW;IACX,OAAO;IACP,QAAQ;IACR,UAAU;IACV,UAAU;IACV,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,aAAa;IACb,UAAU;IACV,QAAQ;IACR,OAAO;IACP,MAAM;IACN,2EAA2E;IAC3E,YAAY;CACJ,CAAC;AAIX,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC;AAE7C,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,UAAU;IACV,SAAS;IACT,SAAS;IACT,OAAO;IACP,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,UAAU;IACV,kBAAkB;IAClB,WAAW,EAAE,mEAAmE;IAChF,mBAAmB;IACnB,WAAW;IACX,iBAAiB;IACjB,eAAe;IACf,SAAS;IACT,cAAc;IACd,gBAAgB;IAChB,OAAO;IACP,SAAS;IACT,SAAS;IACT,gBAAgB;IAChB,UAAU;IACV,yEAAyE;IACzE,yEAAyE;IACzE,6EAA6E;IAC7E,KAAK;IACL,cAAc;IACd,SAAS;IACT,WAAW;IACX,YAAY;IACZ,4EAA4E;IAC5E,uEAAuE;IACvE,4EAA4E;IAC5E,8EAA8E;IAC9E,KAAK;IACL,eAAe;CACP,CAAC;AAIX,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"schema-constants.js","sourceRoot":"","sources":["../../src/lbug/schema-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM;IACN,QAAQ;IACR,UAAU;IACV,OAAO;IACP,WAAW;IACX,QAAQ;IACR,aAAa;IACb,WAAW;IACX,SAAS;IACT,SAAS;IACT,QAAQ;IACR,MAAM;IACN,OAAO;IACP,SAAS;IACT,OAAO;IACP,WAAW;IACX,OAAO;IACP,MAAM;IACN,WAAW;IACX,OAAO;IACP,QAAQ;IACR,UAAU;IACV,UAAU;IACV,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,aAAa;IACb,UAAU;IACV,QAAQ;IACR,OAAO;IACP,MAAM;IACN,2EAA2E;IAC3E,YAAY;CACJ,CAAC;AAIX,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC;AAE7C,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,UAAU;IACV,SAAS;IACT,SAAS;IACT,OAAO;IACP,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,UAAU;IACV,kBAAkB;IAClB,WAAW,EAAE,mEAAmE;IAChF,mBAAmB;IACnB,WAAW;IACX,iBAAiB;IACjB,eAAe;IACf,SAAS;IACT,cAAc;IACd,gBAAgB;IAChB,OAAO;IACP,SAAS;IACT,SAAS;IACT,gBAAgB;IAChB,UAAU;IACV,YAAY;IACZ,yEAAyE;IACzE,yEAAyE;IACzE,6EAA6E;IAC7E,KAAK;IACL,cAAc;IACd,SAAS;IACT,WAAW;IACX,YAAY;IACZ,4EAA4E;IAC5E,uEAAuE;IACvE,4EAA4E;IAC5E,8EAA8E;IAC9E,KAAK;IACL,eAAe;CACP,CAAC;AAIX,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC"}
|
|
@@ -51,10 +51,13 @@ import type { KnowledgeGraph } from '../graph/types.js';
|
|
|
51
51
|
export declare const extractChangedSubgraph: (fullGraph: KnowledgeGraph, toWriteSet: ReadonlySet<string>) => KnowledgeGraph;
|
|
52
52
|
/**
|
|
53
53
|
* Public — derive the EFFECTIVE write-set: `toWriteSet` expanded by one
|
|
54
|
-
* hop along every edge in the new graph that crosses the
|
|
55
|
-
* boundary (one endpoint in a writable file, the other in an
|
|
56
|
-
* file).
|
|
57
|
-
*
|
|
54
|
+
* hop along every file-owned edge in the new graph that crosses the
|
|
55
|
+
* writable boundary (one endpoint in a writable file, the other in an
|
|
56
|
+
* unchanged file). Graph-wide relationships are excluded: their owner
|
|
57
|
+
* phase delete-alls and re-extracts them independently, so following them
|
|
58
|
+
* here would turn high-fan-out metadata into a near-full-repository write.
|
|
59
|
+
* For ordinary edges, the unchanged-side file is pulled in so its stale
|
|
60
|
+
* rows are deleted + rewritten in lockstep with the changed side.
|
|
58
61
|
*
|
|
59
62
|
* Single pass over the edge list. Does NOT mutate `toWriteSet`. The
|
|
60
63
|
* orchestrator MUST feed the returned set to both `deleteNodesForFiles`
|
|
@@ -49,8 +49,10 @@
|
|
|
49
49
|
*/
|
|
50
50
|
import { createKnowledgeGraph } from '../graph/graph.js';
|
|
51
51
|
import { isSpringAutoConfigurationDeclaration, isSpringAutoConfigurationSyntheticClass, } from '../ingestion/frameworks/spring/auto-configuration.js';
|
|
52
|
+
import { isSpringAopEvidenceNode } from '../ingestion/frameworks/spring/aop.js';
|
|
52
53
|
const isGraphWideNode = (node) => node.label === 'Community' ||
|
|
53
54
|
node.label === 'Process' ||
|
|
55
|
+
isSpringAopEvidenceNode(node) ||
|
|
54
56
|
isSpringAutoConfigurationSyntheticClass(node);
|
|
55
57
|
/**
|
|
56
58
|
* Relationship types whose VALIDITY is a whole-program property, not a
|
|
@@ -88,6 +90,10 @@ const isGraphWideNode = (node) => node.label === 'Community' ||
|
|
|
88
90
|
const isGraphWideRelationship = (relationship) => relationship.type === 'TAINT_PATH' ||
|
|
89
91
|
relationship.type === 'CALL_SUMMARY' ||
|
|
90
92
|
relationship.type === 'INJECTS' ||
|
|
93
|
+
// Spring pointcut matching (#2416) is repository-wide. A third-file change
|
|
94
|
+
// can alter annotation-name visibility or the set matched by a wildcard,
|
|
95
|
+
// even when neither endpoint file changed.
|
|
96
|
+
relationship.type === 'ADVISED_BY' ||
|
|
91
97
|
isSpringAutoConfigurationDeclaration(relationship);
|
|
92
98
|
/**
|
|
93
99
|
* Build a Map<nodeId, filePath> for every File-bound node in the graph.
|
|
@@ -124,10 +130,13 @@ export const extractChangedSubgraph = (fullGraph, toWriteSet) => {
|
|
|
124
130
|
};
|
|
125
131
|
/**
|
|
126
132
|
* Public — derive the EFFECTIVE write-set: `toWriteSet` expanded by one
|
|
127
|
-
* hop along every edge in the new graph that crosses the
|
|
128
|
-
* boundary (one endpoint in a writable file, the other in an
|
|
129
|
-
* file).
|
|
130
|
-
*
|
|
133
|
+
* hop along every file-owned edge in the new graph that crosses the
|
|
134
|
+
* writable boundary (one endpoint in a writable file, the other in an
|
|
135
|
+
* unchanged file). Graph-wide relationships are excluded: their owner
|
|
136
|
+
* phase delete-alls and re-extracts them independently, so following them
|
|
137
|
+
* here would turn high-fan-out metadata into a near-full-repository write.
|
|
138
|
+
* For ordinary edges, the unchanged-side file is pulled in so its stale
|
|
139
|
+
* rows are deleted + rewritten in lockstep with the changed side.
|
|
131
140
|
*
|
|
132
141
|
* Single pass over the edge list. Does NOT mutate `toWriteSet`. The
|
|
133
142
|
* orchestrator MUST feed the returned set to both `deleteNodesForFiles`
|
|
@@ -138,6 +147,8 @@ export const computeEffectiveWriteSet = (fullGraph, toWriteSet) => {
|
|
|
138
147
|
const nodeFilePaths = indexNodeFilePaths(fullGraph);
|
|
139
148
|
const expanded = new Set(toWriteSet);
|
|
140
149
|
fullGraph.forEachRelationship((r) => {
|
|
150
|
+
if (isGraphWideRelationship(r))
|
|
151
|
+
return;
|
|
141
152
|
const sourcePath = nodeFilePaths.get(r.sourceId);
|
|
142
153
|
const targetPath = nodeFilePaths.get(r.targetId);
|
|
143
154
|
if (!sourcePath || !targetPath)
|
|
@@ -3,3 +3,5 @@ import type { AnalysisFeatureDescriptor } from '../../../analysis-features.js';
|
|
|
3
3
|
export declare const SPRING_BEAN_INVENTORY_FEATURE: AnalysisFeatureDescriptor;
|
|
4
4
|
/** Durable completeness contract for conditional and auto-configuration evidence. */
|
|
5
5
|
export declare const SPRING_CONDITIONALS_FEATURE: AnalysisFeatureDescriptor;
|
|
6
|
+
/** Durable completeness contract for Spring proxy/advice evidence (#2416). */
|
|
7
|
+
export declare const SPRING_AOP_FEATURE: AnalysisFeatureDescriptor;
|
|
@@ -19,3 +19,17 @@ export const SPRING_CONDITIONALS_FEATURE = {
|
|
|
19
19
|
version: 1,
|
|
20
20
|
appliesTo: (filePaths) => filePaths.some(isSpringConditionOrAutoConfigurationFile),
|
|
21
21
|
};
|
|
22
|
+
/**
|
|
23
|
+
* Candidate-language approximation, not a claim that the file contains AOP.
|
|
24
|
+
* Kotlin scripts are included because `.kts` is a supported Kotlin input.
|
|
25
|
+
*/
|
|
26
|
+
function isJvmSourceFile(filePath) {
|
|
27
|
+
const normalized = filePath.replaceAll('\\', '/').toLowerCase();
|
|
28
|
+
return normalized.endsWith('.java') || normalized.endsWith('.kt') || normalized.endsWith('.kts');
|
|
29
|
+
}
|
|
30
|
+
/** Durable completeness contract for Spring proxy/advice evidence (#2416). */
|
|
31
|
+
export const SPRING_AOP_FEATURE = {
|
|
32
|
+
id: 'spring.aop-advice',
|
|
33
|
+
version: 1,
|
|
34
|
+
appliesTo: (filePaths) => filePaths.some(isJvmSourceFile),
|
|
35
|
+
};
|
|
@@ -15,6 +15,13 @@ function splitTopLevel(value, separator) {
|
|
|
15
15
|
]);
|
|
16
16
|
for (let index = 0; index < value.length; index++) {
|
|
17
17
|
const char = value[index];
|
|
18
|
+
if (quote === '"""') {
|
|
19
|
+
if (value.startsWith('"""', index)) {
|
|
20
|
+
quote = null;
|
|
21
|
+
index += 2;
|
|
22
|
+
}
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
18
25
|
if (quote !== null) {
|
|
19
26
|
if (escaped)
|
|
20
27
|
escaped = false;
|
|
@@ -24,6 +31,11 @@ function splitTopLevel(value, separator) {
|
|
|
24
31
|
quote = null;
|
|
25
32
|
continue;
|
|
26
33
|
}
|
|
34
|
+
if (value.startsWith('"""', index)) {
|
|
35
|
+
quote = '"""';
|
|
36
|
+
index += 2;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
27
39
|
if (char === '"' || char === "'") {
|
|
28
40
|
quote = char;
|
|
29
41
|
continue;
|
|
@@ -60,6 +72,13 @@ function topLevelAssignment(argument) {
|
|
|
60
72
|
]);
|
|
61
73
|
for (let index = 0; index < argument.length; index++) {
|
|
62
74
|
const char = argument[index];
|
|
75
|
+
if (quote === '"""') {
|
|
76
|
+
if (argument.startsWith('"""', index)) {
|
|
77
|
+
quote = null;
|
|
78
|
+
index += 2;
|
|
79
|
+
}
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
63
82
|
if (quote !== null) {
|
|
64
83
|
if (escaped)
|
|
65
84
|
escaped = false;
|
|
@@ -69,6 +88,11 @@ function topLevelAssignment(argument) {
|
|
|
69
88
|
quote = null;
|
|
70
89
|
continue;
|
|
71
90
|
}
|
|
91
|
+
if (argument.startsWith('"""', index)) {
|
|
92
|
+
quote = '"""';
|
|
93
|
+
index += 2;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
72
96
|
if (char === '"' || char === "'") {
|
|
73
97
|
quote = char;
|
|
74
98
|
continue;
|
|
@@ -118,6 +142,14 @@ export function parseSpringAnnotationArguments(annotationText) {
|
|
|
118
142
|
}
|
|
119
143
|
export function parseStaticStringLiteral(value) {
|
|
120
144
|
const trimmed = value.trim();
|
|
145
|
+
if (trimmed.startsWith('"""')) {
|
|
146
|
+
if (trimmed.length < 6 || !trimmed.endsWith('"""'))
|
|
147
|
+
return null;
|
|
148
|
+
const raw = trimmed.slice(3, -3);
|
|
149
|
+
if (raw.includes('"""') || /\$(?:\{|[A-Za-z_])/.test(raw))
|
|
150
|
+
return null;
|
|
151
|
+
return raw;
|
|
152
|
+
}
|
|
121
153
|
const match = /^"((?:\\.|[^"\\])*)"$/s.exec(trimmed);
|
|
122
154
|
if (match === null)
|
|
123
155
|
return null;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { GraphNode } from '../../../../_shared/index.js';
|
|
2
|
+
import type { SpringAopStaticPointcut } from './aop.js';
|
|
3
|
+
export interface SpringAopOwnedMethod {
|
|
4
|
+
readonly method: GraphNode;
|
|
5
|
+
readonly owner: GraphNode;
|
|
6
|
+
}
|
|
7
|
+
export interface SpringAopCandidateIndex {
|
|
8
|
+
readonly totalCandidates: number;
|
|
9
|
+
candidatesFor(pointcut: SpringAopStaticPointcut): readonly SpringAopOwnedMethod[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Build immutable candidate lists once per pipeline run. The pointcut matcher
|
|
13
|
+
* remains the final authority; this index only returns safe supersets.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createSpringAopCandidateIndex(candidates: readonly SpringAopOwnedMethod[], methodAnnotations: ReadonlyMap<string, ReadonlySet<string>>): SpringAopCandidateIndex;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
function ownerPatternLiteralPrefix(pattern) {
|
|
2
|
+
const wildcardIndex = pattern.indexOf('*');
|
|
3
|
+
const descendantIndex = pattern.indexOf('..');
|
|
4
|
+
const firstDynamicIndex = [wildcardIndex, descendantIndex]
|
|
5
|
+
.filter((index) => index >= 0)
|
|
6
|
+
.reduce((first, index) => Math.min(first, index), pattern.length);
|
|
7
|
+
return pattern.slice(0, firstDynamicIndex);
|
|
8
|
+
}
|
|
9
|
+
function lowerBoundByQualifiedName(buckets, prefix) {
|
|
10
|
+
let low = 0;
|
|
11
|
+
let high = buckets.length;
|
|
12
|
+
while (low < high) {
|
|
13
|
+
const middle = low + Math.floor((high - low) / 2);
|
|
14
|
+
if ((buckets[middle]?.qualifiedName ?? '') < prefix)
|
|
15
|
+
low = middle + 1;
|
|
16
|
+
else
|
|
17
|
+
high = middle;
|
|
18
|
+
}
|
|
19
|
+
return low;
|
|
20
|
+
}
|
|
21
|
+
function compareStrings(left, right) {
|
|
22
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Build immutable candidate lists once per pipeline run. The pointcut matcher
|
|
26
|
+
* remains the final authority; this index only returns safe supersets.
|
|
27
|
+
*/
|
|
28
|
+
export function createSpringAopCandidateIndex(candidates, methodAnnotations) {
|
|
29
|
+
const allCandidates = [...candidates];
|
|
30
|
+
const candidatesByAnnotation = new Map();
|
|
31
|
+
const candidatesByExactOwner = new Map();
|
|
32
|
+
const ownerBucketsById = new Map();
|
|
33
|
+
for (const candidate of allCandidates) {
|
|
34
|
+
for (const annotation of methodAnnotations.get(candidate.method.id) ?? []) {
|
|
35
|
+
const annotated = candidatesByAnnotation.get(annotation) ?? [];
|
|
36
|
+
annotated.push(candidate);
|
|
37
|
+
candidatesByAnnotation.set(annotation, annotated);
|
|
38
|
+
}
|
|
39
|
+
const qualifiedName = candidate.owner.properties.qualifiedName;
|
|
40
|
+
if (typeof qualifiedName !== 'string' || qualifiedName.length === 0)
|
|
41
|
+
continue;
|
|
42
|
+
const exactOwnerCandidates = candidatesByExactOwner.get(qualifiedName) ?? [];
|
|
43
|
+
exactOwnerCandidates.push(candidate);
|
|
44
|
+
candidatesByExactOwner.set(qualifiedName, exactOwnerCandidates);
|
|
45
|
+
let bucket = ownerBucketsById.get(candidate.owner.id);
|
|
46
|
+
if (bucket === undefined) {
|
|
47
|
+
bucket = { id: candidate.owner.id, qualifiedName, candidates: [] };
|
|
48
|
+
ownerBucketsById.set(candidate.owner.id, bucket);
|
|
49
|
+
}
|
|
50
|
+
bucket.candidates.push(candidate);
|
|
51
|
+
}
|
|
52
|
+
const ownerBuckets = [...ownerBucketsById.values()].sort((left, right) => compareStrings(left.qualifiedName, right.qualifiedName) || compareStrings(left.id, right.id));
|
|
53
|
+
const candidatesByOwnerPattern = new Map();
|
|
54
|
+
return {
|
|
55
|
+
totalCandidates: allCandidates.length,
|
|
56
|
+
candidatesFor(pointcut) {
|
|
57
|
+
if (pointcut.kind === 'annotation') {
|
|
58
|
+
return candidatesByAnnotation.get(pointcut.annotation) ?? [];
|
|
59
|
+
}
|
|
60
|
+
if (!pointcut.ownerPattern.includes('*') && !pointcut.ownerPattern.includes('..')) {
|
|
61
|
+
return candidatesByExactOwner.get(pointcut.ownerPattern) ?? [];
|
|
62
|
+
}
|
|
63
|
+
// Unqualified wildcard patterns (for example `*Service` or `Order*`)
|
|
64
|
+
// match the owner simple name. The qualified-name prefix index cannot
|
|
65
|
+
// safely narrow those, so preserve the full candidate superset.
|
|
66
|
+
if (!pointcut.ownerPattern.includes('.'))
|
|
67
|
+
return allCandidates;
|
|
68
|
+
const prefix = ownerPatternLiteralPrefix(pointcut.ownerPattern);
|
|
69
|
+
if (prefix.length === 0)
|
|
70
|
+
return allCandidates;
|
|
71
|
+
const cached = candidatesByOwnerPattern.get(pointcut.ownerPattern);
|
|
72
|
+
if (cached !== undefined)
|
|
73
|
+
return cached;
|
|
74
|
+
const selected = [];
|
|
75
|
+
for (let index = lowerBoundByQualifiedName(ownerBuckets, prefix); index < ownerBuckets.length; index += 1) {
|
|
76
|
+
const bucket = ownerBuckets[index];
|
|
77
|
+
if (bucket === undefined || !bucket.qualifiedName.startsWith(prefix))
|
|
78
|
+
break;
|
|
79
|
+
selected.push(...bucket.candidates);
|
|
80
|
+
}
|
|
81
|
+
candidatesByOwnerPattern.set(pointcut.ownerPattern, selected);
|
|
82
|
+
return selected;
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { GraphNode, ParsedFile, Range, ScopeId } from '../../../../_shared/index.js';
|
|
2
|
+
import type { KnowledgeGraph } from '../../../graph/types.js';
|
|
3
|
+
import type { ScopeResolutionIndexes } from '../../model/scope-resolution-indexes.js';
|
|
4
|
+
import type { GraphNodeLookup } from '../../scope-resolution/graph-bridge/node-lookup.js';
|
|
5
|
+
export declare const SPRING_AOP_REASON_PREFIX = "spring-aop:v1:";
|
|
6
|
+
export declare const SPRING_AOP_EVIDENCE_DESCRIPTION_PREFIX = "Spring AOP: ";
|
|
7
|
+
export declare const SPRING_AOP_EVIDENCE_ID_PREFIX = "CodeElement:spring-aop:";
|
|
8
|
+
export type SpringAopBehavior = 'transactional' | 'caching' | 'cacheable' | 'cache-evict' | 'cache-put' | 'authorization';
|
|
9
|
+
export type SpringAopAdviceKind = 'around' | 'before' | 'after' | 'after-returning' | 'after-throwing' | 'pointcut';
|
|
10
|
+
export interface SpringAopAnnotationFact {
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly text: string;
|
|
13
|
+
readonly line: number;
|
|
14
|
+
/** Kotlin use-site targets do not describe a callable annotation here. */
|
|
15
|
+
readonly useSiteTarget?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface SpringAopOwnerFact<Annotation extends SpringAopAnnotationFact = SpringAopAnnotationFact> {
|
|
18
|
+
readonly ownerScopeId: ScopeId;
|
|
19
|
+
readonly ownerKind: 'class' | 'callable';
|
|
20
|
+
readonly ownerFilePath?: string;
|
|
21
|
+
/** Exact syntax range used only as a fail-closed bridge for collapsed language scopes. */
|
|
22
|
+
readonly ownerRange?: Range;
|
|
23
|
+
/** The language models this owner/member as static, but it belongs to a singleton instance. */
|
|
24
|
+
readonly singletonInstance?: true;
|
|
25
|
+
readonly annotations: readonly Annotation[];
|
|
26
|
+
}
|
|
27
|
+
export interface SpringAopMetadataAdapter<Annotation extends SpringAopAnnotationFact> {
|
|
28
|
+
getFacts(filePath: string): readonly SpringAopOwnerFact<Annotation>[];
|
|
29
|
+
isPackageVisibilityIncomplete(filePath: string): boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface SpringAopBehaviorReason {
|
|
32
|
+
readonly kind: 'behavior';
|
|
33
|
+
readonly annotation: string;
|
|
34
|
+
readonly behavior: SpringAopBehavior;
|
|
35
|
+
readonly declaredOn: 'class' | 'method';
|
|
36
|
+
readonly activation: 'unknown';
|
|
37
|
+
readonly proxy: 'possible';
|
|
38
|
+
}
|
|
39
|
+
export interface SpringAopAdviceReason {
|
|
40
|
+
readonly kind: 'advice';
|
|
41
|
+
readonly annotation: string;
|
|
42
|
+
readonly advice: Exclude<SpringAopAdviceKind, 'pointcut'>;
|
|
43
|
+
readonly pointcut: string;
|
|
44
|
+
readonly match: 'static';
|
|
45
|
+
readonly activation: 'unknown';
|
|
46
|
+
readonly proxy: 'possible';
|
|
47
|
+
}
|
|
48
|
+
export interface SpringAopPointcutReason {
|
|
49
|
+
readonly kind: 'pointcut';
|
|
50
|
+
readonly annotation: string;
|
|
51
|
+
readonly pointcut: string | null;
|
|
52
|
+
readonly match: 'static' | 'unresolved';
|
|
53
|
+
readonly resolution: 'resolved' | 'unknown';
|
|
54
|
+
}
|
|
55
|
+
export interface SpringAopAspectReason {
|
|
56
|
+
readonly kind: 'aspect';
|
|
57
|
+
readonly annotation: string;
|
|
58
|
+
readonly activation: 'unknown';
|
|
59
|
+
readonly registration: 'unknown';
|
|
60
|
+
}
|
|
61
|
+
export type SpringAopReason = SpringAopBehaviorReason | SpringAopAdviceReason | SpringAopPointcutReason | SpringAopAspectReason;
|
|
62
|
+
export interface SpringAopAspectRecord {
|
|
63
|
+
readonly ownerId: string;
|
|
64
|
+
readonly annotation: string;
|
|
65
|
+
readonly line: number;
|
|
66
|
+
}
|
|
67
|
+
export interface SpringAopBehaviorRecord {
|
|
68
|
+
readonly ownerId: string;
|
|
69
|
+
readonly ownerKind: 'class' | 'callable';
|
|
70
|
+
readonly annotation: string;
|
|
71
|
+
readonly behavior: SpringAopBehavior;
|
|
72
|
+
readonly line: number;
|
|
73
|
+
}
|
|
74
|
+
export interface SpringAopAdviceRecord {
|
|
75
|
+
readonly ownerId: string;
|
|
76
|
+
readonly annotation: string;
|
|
77
|
+
readonly advice: SpringAopAdviceKind;
|
|
78
|
+
readonly pointcut: string | null;
|
|
79
|
+
readonly line: number;
|
|
80
|
+
}
|
|
81
|
+
export interface SpringAopGraphMetadata {
|
|
82
|
+
readonly candidateFilePaths: ReadonlySet<string>;
|
|
83
|
+
readonly aspectClassIds: ReadonlySet<string>;
|
|
84
|
+
readonly singletonInstanceClassIds: ReadonlySet<string>;
|
|
85
|
+
readonly aspects: readonly SpringAopAspectRecord[];
|
|
86
|
+
readonly behaviors: readonly SpringAopBehaviorRecord[];
|
|
87
|
+
readonly advices: readonly SpringAopAdviceRecord[];
|
|
88
|
+
}
|
|
89
|
+
export declare function getSpringAopGraphMetadata(graph: KnowledgeGraph): SpringAopGraphMetadata;
|
|
90
|
+
export declare function hasSpringAopRelevantAnnotation(annotations: readonly Pick<SpringAopAnnotationFact, 'name'>[]): boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Resolve syntax facts after imports and package visibility are complete.
|
|
93
|
+
* Language adapters own AST shape only; this shared layer owns framework FQNs.
|
|
94
|
+
*/
|
|
95
|
+
export declare function createSpringAopMetadataAttacher<Annotation extends SpringAopAnnotationFact>(adapter: SpringAopMetadataAdapter<Annotation>): (graph: KnowledgeGraph, parsedFiles: readonly ParsedFile[], nodeLookup: GraphNodeLookup, indexes: ScopeResolutionIndexes) => void;
|
|
96
|
+
export declare function encodeSpringAopReason(reason: SpringAopReason): string;
|
|
97
|
+
/** Decode only the current, validated reason contract; malformed/foreign rows fail closed. */
|
|
98
|
+
export declare function decodeSpringAopReason(value: unknown): SpringAopReason | undefined;
|
|
99
|
+
export declare function isSpringAopEvidenceNode(node: GraphNode): boolean;
|
|
100
|
+
export interface SpringAopExecutionPointcut {
|
|
101
|
+
readonly kind: 'execution';
|
|
102
|
+
readonly ownerPattern: string;
|
|
103
|
+
readonly methodPattern: string;
|
|
104
|
+
readonly visibility?: 'public';
|
|
105
|
+
readonly parameterCount?: number;
|
|
106
|
+
}
|
|
107
|
+
export interface SpringAopWithinPointcut {
|
|
108
|
+
readonly kind: 'within';
|
|
109
|
+
readonly ownerPattern: string;
|
|
110
|
+
}
|
|
111
|
+
export interface SpringAopAnnotationPointcut {
|
|
112
|
+
readonly kind: 'annotation';
|
|
113
|
+
readonly annotation: string;
|
|
114
|
+
}
|
|
115
|
+
export type SpringAopStaticPointcut = SpringAopExecutionPointcut | SpringAopWithinPointcut | SpringAopAnnotationPointcut;
|
|
116
|
+
/** Parse the deliberately narrow, fully static pointcut subset supported in v1. */
|
|
117
|
+
export declare function parseSpringAopPointcut(expression: string): SpringAopStaticPointcut | null;
|
|
118
|
+
export declare function springAopPointcutMatches(pointcut: SpringAopStaticPointcut, owner: GraphNode, method: GraphNode, methodAnnotations?: ReadonlySet<string>): boolean;
|