lsp-intelligence 0.2.1 → 0.3.0

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.
Files changed (134) hide show
  1. package/dist/adapters/express/index.d.ts +9 -0
  2. package/dist/adapters/express/index.js +46 -0
  3. package/dist/adapters/express/index.js.map +1 -0
  4. package/dist/adapters/next/index.d.ts +10 -0
  5. package/dist/adapters/next/index.js +67 -0
  6. package/dist/adapters/next/index.js.map +1 -0
  7. package/dist/adapters/react/index.d.ts +11 -0
  8. package/dist/adapters/react/index.js +133 -0
  9. package/dist/adapters/react/index.js.map +1 -0
  10. package/dist/adapters/registry.d.ts +22 -0
  11. package/dist/adapters/registry.js +101 -0
  12. package/dist/adapters/registry.js.map +1 -0
  13. package/dist/adapters/types.d.ts +97 -0
  14. package/dist/adapters/types.js +2 -0
  15. package/dist/adapters/types.js.map +1 -0
  16. package/dist/analysis/ts/applyVirtualEdit.d.ts +27 -0
  17. package/dist/analysis/ts/applyVirtualEdit.js +235 -0
  18. package/dist/analysis/ts/applyVirtualEdit.js.map +1 -0
  19. package/dist/analysis/ts/changeRecipes.d.ts +52 -0
  20. package/dist/analysis/ts/changeRecipes.js +14 -0
  21. package/dist/analysis/ts/changeRecipes.js.map +1 -0
  22. package/dist/analysis/ts/compatibility.d.ts +54 -0
  23. package/dist/analysis/ts/compatibility.js +113 -0
  24. package/dist/analysis/ts/compatibility.js.map +1 -0
  25. package/dist/analysis/ts/diffDeclarationShape.d.ts +26 -0
  26. package/dist/analysis/ts/diffDeclarationShape.js +114 -0
  27. package/dist/analysis/ts/diffDeclarationShape.js.map +1 -0
  28. package/dist/analysis/ts/exhaustiveness.d.ts +49 -0
  29. package/dist/analysis/ts/exhaustiveness.js +158 -0
  30. package/dist/analysis/ts/exhaustiveness.js.map +1 -0
  31. package/dist/analysis/ts/extractDeclarationShape.d.ts +30 -0
  32. package/dist/analysis/ts/extractDeclarationShape.js +127 -0
  33. package/dist/analysis/ts/extractDeclarationShape.js.map +1 -0
  34. package/dist/analysis/ts/extractExports.d.ts +19 -0
  35. package/dist/analysis/ts/extractExports.js +178 -0
  36. package/dist/analysis/ts/extractExports.js.map +1 -0
  37. package/dist/analysis/ts/extractRoutes.d.ts +12 -0
  38. package/dist/analysis/ts/extractRoutes.js +165 -0
  39. package/dist/analysis/ts/extractRoutes.js.map +1 -0
  40. package/dist/analysis/ts/parseSourceFile.d.ts +5 -1
  41. package/dist/analysis/ts/parseSourceFile.js +6 -2
  42. package/dist/analysis/ts/parseSourceFile.js.map +1 -1
  43. package/dist/analysis/ts/program/CheckerQueries.d.ts +56 -0
  44. package/dist/analysis/ts/program/CheckerQueries.js +187 -0
  45. package/dist/analysis/ts/program/CheckerQueries.js.map +1 -0
  46. package/dist/analysis/ts/program/ProgramManager.d.ts +27 -0
  47. package/dist/analysis/ts/program/ProgramManager.js +147 -0
  48. package/dist/analysis/ts/program/ProgramManager.js.map +1 -0
  49. package/dist/analysis/ts/program/TypeFacts.d.ts +58 -0
  50. package/dist/analysis/ts/program/TypeFacts.js +68 -0
  51. package/dist/analysis/ts/program/TypeFacts.js.map +1 -0
  52. package/dist/analysis/ts/typeState.d.ts +46 -0
  53. package/dist/analysis/ts/typeState.js +108 -0
  54. package/dist/analysis/ts/typeState.js.map +1 -0
  55. package/dist/ast/diffDeclarationShapes.js +25 -11
  56. package/dist/ast/diffDeclarationShapes.js.map +1 -1
  57. package/dist/ast/extractExportDeclarations.js +8 -3
  58. package/dist/ast/extractExportDeclarations.js.map +1 -1
  59. package/dist/cache/CacheSchema.d.ts +30 -0
  60. package/dist/cache/CacheSchema.js +9 -0
  61. package/dist/cache/CacheSchema.js.map +1 -0
  62. package/dist/cache/CacheStore.d.ts +22 -0
  63. package/dist/cache/CacheStore.js +111 -0
  64. package/dist/cache/CacheStore.js.map +1 -0
  65. package/dist/cache/SemanticCache.d.ts +38 -0
  66. package/dist/cache/SemanticCache.js +87 -0
  67. package/dist/cache/SemanticCache.js.map +1 -0
  68. package/dist/cache/SnapshotFingerprint.d.ts +17 -0
  69. package/dist/cache/SnapshotFingerprint.js +14 -0
  70. package/dist/cache/SnapshotFingerprint.js.map +1 -0
  71. package/dist/engine/DocumentManager.d.ts +16 -0
  72. package/dist/engine/DocumentManager.js +32 -0
  73. package/dist/engine/DocumentManager.js.map +1 -1
  74. package/dist/index.js +6 -0
  75. package/dist/index.js.map +1 -1
  76. package/dist/search/adapters/http.d.ts +9 -3
  77. package/dist/search/adapters/http.js +7 -52
  78. package/dist/search/adapters/http.js.map +1 -1
  79. package/dist/search/adapters/react.d.ts +8 -8
  80. package/dist/search/adapters/react.js +3 -88
  81. package/dist/search/adapters/react.js.map +1 -1
  82. package/dist/search/adapters/registry.d.ts +7 -4
  83. package/dist/search/adapters/registry.js +7 -17
  84. package/dist/search/adapters/registry.js.map +1 -1
  85. package/dist/search/expand/graphExpansion.js +47 -14
  86. package/dist/search/expand/graphExpansion.js.map +1 -1
  87. package/dist/search/index/declarationIndex.d.ts +3 -1
  88. package/dist/search/index/declarationIndex.js +4 -2
  89. package/dist/search/index/declarationIndex.js.map +1 -1
  90. package/dist/search/index/routeIndex.d.ts +6 -0
  91. package/dist/search/index/routeIndex.js +19 -0
  92. package/dist/search/index/routeIndex.js.map +1 -0
  93. package/dist/search/index/usageIndex.d.ts +3 -1
  94. package/dist/search/index/usageIndex.js +4 -2
  95. package/dist/search/index/usageIndex.js.map +1 -1
  96. package/dist/search/index/workspaceIndex.d.ts +7 -1
  97. package/dist/search/index/workspaceIndex.js +54 -14
  98. package/dist/search/index/workspaceIndex.js.map +1 -1
  99. package/dist/search/query/compileEffectiveSearchSpec.js +9 -0
  100. package/dist/search/query/compileEffectiveSearchSpec.js.map +1 -1
  101. package/dist/search/query/parseQuery.js +5 -1
  102. package/dist/search/query/parseQuery.js.map +1 -1
  103. package/dist/search/query/planQuery.js +14 -4
  104. package/dist/search/query/planQuery.js.map +1 -1
  105. package/dist/search/ranking/mergeCandidates.d.ts +1 -0
  106. package/dist/search/ranking/mergeCandidates.js +16 -0
  107. package/dist/search/ranking/mergeCandidates.js.map +1 -1
  108. package/dist/search/retrievers/routeRetriever.d.ts +7 -0
  109. package/dist/search/retrievers/routeRetriever.js +64 -0
  110. package/dist/search/retrievers/routeRetriever.js.map +1 -0
  111. package/dist/search/types.d.ts +16 -4
  112. package/dist/session/OverlayStore.d.ts +15 -0
  113. package/dist/session/OverlayStore.js +46 -0
  114. package/dist/session/OverlayStore.js.map +1 -0
  115. package/dist/session/SnapshotResolver.d.ts +31 -0
  116. package/dist/session/SnapshotResolver.js +50 -0
  117. package/dist/session/SnapshotResolver.js.map +1 -0
  118. package/dist/session/WorkspaceSnapshot.d.ts +21 -0
  119. package/dist/session/WorkspaceSnapshot.js +2 -0
  120. package/dist/session/WorkspaceSnapshot.js.map +1 -0
  121. package/dist/tools/composites/apiGuard.d.ts +4 -0
  122. package/dist/tools/composites/apiGuard.js +158 -24
  123. package/dist/tools/composites/apiGuard.js.map +1 -1
  124. package/dist/tools/composites/findCode.js +12 -2
  125. package/dist/tools/composites/findCode.js.map +1 -1
  126. package/dist/tools/composites/rootCauseTrace.js +89 -13
  127. package/dist/tools/composites/rootCauseTrace.js.map +1 -1
  128. package/dist/workflows/simulateChange.d.ts +44 -0
  129. package/dist/workflows/simulateChange.js +194 -0
  130. package/dist/workflows/simulateChange.js.map +1 -0
  131. package/dist/workflows/verifyChangeSet.d.ts +58 -0
  132. package/dist/workflows/verifyChangeSet.js +300 -0
  133. package/dist/workflows/verifyChangeSet.js.map +1 -0
  134. package/package.json +6 -4
@@ -0,0 +1,111 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ import { CACHE_SCHEMA_VERSION } from './CacheSchema.js';
5
+ /**
6
+ * Phase 4B — Persistent cache store.
7
+ *
8
+ * Reads and writes the workspace index to disk as JSON.
9
+ * Location: <os.tmpdir()>/lsp-intelligence-cache/<fingerprint>/index-v<version>.json
10
+ *
11
+ * Positioned as ACCELERATION, not source of truth. The live semantic state
12
+ * (workspace snapshot, LSP, TypeScript checker) always wins.
13
+ */
14
+ const CACHE_BASE_DIR = path.join(os.tmpdir(), 'lsp-intelligence-cache');
15
+ const MAX_CACHE_AGE_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
16
+ export class CacheStore {
17
+ cacheDir;
18
+ cacheFile;
19
+ constructor(fingerprint, indexVersion) {
20
+ this.cacheDir = path.join(CACHE_BASE_DIR, fingerprint);
21
+ this.cacheFile = path.join(this.cacheDir, `index-v${CACHE_SCHEMA_VERSION}-i${indexVersion}.json`);
22
+ }
23
+ /**
24
+ * Load a persisted index from disk.
25
+ * Returns null if no cache exists, the schema is wrong, or the cache is too old.
26
+ */
27
+ load() {
28
+ try {
29
+ if (!fs.existsSync(this.cacheFile))
30
+ return null;
31
+ const stat = fs.statSync(this.cacheFile);
32
+ if (Date.now() - stat.mtimeMs > MAX_CACHE_AGE_MS) {
33
+ this.evict();
34
+ return null;
35
+ }
36
+ const raw = fs.readFileSync(this.cacheFile, 'utf-8');
37
+ const parsed = JSON.parse(raw);
38
+ if (parsed.schemaVersion !== CACHE_SCHEMA_VERSION)
39
+ return null;
40
+ return parsed;
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ /**
47
+ * Save a workspace index to disk.
48
+ * Serializes the files Map and stores file mtimes for freshness validation.
49
+ * Non-blocking: errors are silently swallowed (cache is best-effort).
50
+ */
51
+ save(index, scopeKey, indexVersion) {
52
+ try {
53
+ fs.mkdirSync(this.cacheDir, { recursive: true });
54
+ const fileMtimes = {};
55
+ const fileEntries = [];
56
+ for (const [filePath, entry] of index.files) {
57
+ fileMtimes[filePath] = entry.mtimeMs;
58
+ fileEntries.push([filePath, entry]);
59
+ }
60
+ const buildStart = Date.now();
61
+ const persisted = {
62
+ schemaVersion: CACHE_SCHEMA_VERSION,
63
+ indexVersion,
64
+ root: index.root,
65
+ builtAt: index.builtAt,
66
+ scopeKey,
67
+ fileEntries,
68
+ fileMtimes,
69
+ declarations: index.declarations,
70
+ usages: index.usages,
71
+ docs: index.docs,
72
+ configs: index.configs,
73
+ routes: index.routes,
74
+ scopeCapped: index.scopeCapped,
75
+ capReason: index.capReason,
76
+ buildMs: Date.now() - buildStart,
77
+ };
78
+ fs.writeFileSync(this.cacheFile, JSON.stringify(persisted), 'utf-8');
79
+ }
80
+ catch {
81
+ // Cache writes are best-effort — never block on failure
82
+ }
83
+ }
84
+ /** Remove the cache file for this workspace. */
85
+ evict() {
86
+ try {
87
+ fs.rmSync(this.cacheFile, { force: true });
88
+ }
89
+ catch { }
90
+ }
91
+ /** Remove all cache files older than MAX_CACHE_AGE_MS (for cleanup). */
92
+ static pruneOldCaches() {
93
+ try {
94
+ if (!fs.existsSync(CACHE_BASE_DIR))
95
+ return;
96
+ const cutoff = Date.now() - MAX_CACHE_AGE_MS;
97
+ for (const dir of fs.readdirSync(CACHE_BASE_DIR)) {
98
+ const dirPath = path.join(CACHE_BASE_DIR, dir);
99
+ try {
100
+ const stat = fs.statSync(dirPath);
101
+ if (stat.isDirectory() && stat.mtimeMs < cutoff) {
102
+ fs.rmSync(dirPath, { recursive: true, force: true });
103
+ }
104
+ }
105
+ catch { }
106
+ }
107
+ }
108
+ catch { }
109
+ }
110
+ }
111
+ //# sourceMappingURL=CacheStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheStore.js","sourceRoot":"","sources":["../../src/cache/CacheStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { WorkspaceIndex, SearchScope } from '../search/types.js';
2
+ /**
3
+ * Phase 4B — Semantic cache main interface.
4
+ *
5
+ * Wraps the CacheStore to provide a higher-level API:
6
+ * - tryLoad: attempt to load and VALIDATE a persisted index
7
+ * - save: persist a freshly built index for the next session
8
+ *
9
+ * Validation: compares stored file mtimes against current disk state.
10
+ * If any file has changed since the cache was built, the cache is stale
11
+ * and returns null (caller rebuilds and saves a fresh cache).
12
+ *
13
+ * IMPORTANT: This cache is bypassed entirely when a SnapshotResolver
14
+ * is provided (overlay/unsaved edits can't be persisted).
15
+ */
16
+ export declare class SemanticCache {
17
+ private readonly store;
18
+ private readonly fingerprint;
19
+ constructor(scope: SearchScope, indexVersion: number);
20
+ /**
21
+ * Try to load a valid cached WorkspaceIndex.
22
+ * Returns null if:
23
+ * - No cache file exists
24
+ * - Cache schema version mismatch
25
+ * - Cache is older than 7 days
26
+ * - Any cached file's mtime differs from the current disk mtime
27
+ *
28
+ * Cache validation is O(N files) but uses only stat calls — fast for typical workspaces.
29
+ */
30
+ tryLoad(scopeKey: string): WorkspaceIndex | null;
31
+ /**
32
+ * Persist a freshly built WorkspaceIndex for future sessions.
33
+ * Called after a successful build. Never throws.
34
+ */
35
+ save(index: WorkspaceIndex, scopeKey: string, indexVersion: number): void;
36
+ /** Invalidate the cache for this workspace (e.g. after clearWorkspaceIndex). */
37
+ invalidate(): void;
38
+ }
@@ -0,0 +1,87 @@
1
+ import * as fs from 'fs';
2
+ import { CacheStore } from './CacheStore.js';
3
+ import { computeScopeFingerprint } from './SnapshotFingerprint.js';
4
+ /**
5
+ * Phase 4B — Semantic cache main interface.
6
+ *
7
+ * Wraps the CacheStore to provide a higher-level API:
8
+ * - tryLoad: attempt to load and VALIDATE a persisted index
9
+ * - save: persist a freshly built index for the next session
10
+ *
11
+ * Validation: compares stored file mtimes against current disk state.
12
+ * If any file has changed since the cache was built, the cache is stale
13
+ * and returns null (caller rebuilds and saves a fresh cache).
14
+ *
15
+ * IMPORTANT: This cache is bypassed entirely when a SnapshotResolver
16
+ * is provided (overlay/unsaved edits can't be persisted).
17
+ */
18
+ export class SemanticCache {
19
+ store;
20
+ fingerprint;
21
+ constructor(scope, indexVersion) {
22
+ const fp = computeScopeFingerprint(scope.roots[0] ?? '', scope.includeTests);
23
+ this.fingerprint = fp.key;
24
+ this.store = new CacheStore(fp.key, indexVersion);
25
+ }
26
+ /**
27
+ * Try to load a valid cached WorkspaceIndex.
28
+ * Returns null if:
29
+ * - No cache file exists
30
+ * - Cache schema version mismatch
31
+ * - Cache is older than 7 days
32
+ * - Any cached file's mtime differs from the current disk mtime
33
+ *
34
+ * Cache validation is O(N files) but uses only stat calls — fast for typical workspaces.
35
+ */
36
+ tryLoad(scopeKey) {
37
+ const persisted = this.store.load();
38
+ if (!persisted)
39
+ return null;
40
+ if (persisted.scopeKey !== scopeKey)
41
+ return null;
42
+ // Validate freshness: check every cached file's mtime
43
+ for (const [filePath, cachedMtime] of Object.entries(persisted.fileMtimes)) {
44
+ try {
45
+ const currentMtime = fs.statSync(filePath).mtimeMs;
46
+ if (currentMtime !== cachedMtime)
47
+ return null; // file changed
48
+ }
49
+ catch {
50
+ return null; // file deleted or inaccessible
51
+ }
52
+ }
53
+ // Cache is valid — reconstruct WorkspaceIndex
54
+ return deserializeIndex(persisted);
55
+ }
56
+ /**
57
+ * Persist a freshly built WorkspaceIndex for future sessions.
58
+ * Called after a successful build. Never throws.
59
+ */
60
+ save(index, scopeKey, indexVersion) {
61
+ this.store.save(index, scopeKey, indexVersion);
62
+ }
63
+ /** Invalidate the cache for this workspace (e.g. after clearWorkspaceIndex). */
64
+ invalidate() {
65
+ this.store.evict();
66
+ }
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Deserialization
70
+ // ---------------------------------------------------------------------------
71
+ function deserializeIndex(p) {
72
+ // Reconstruct the files Map from the serialized array
73
+ const files = new Map(p.fileEntries.map(([k, v]) => [k, v]));
74
+ return {
75
+ root: p.root,
76
+ builtAt: p.builtAt,
77
+ files,
78
+ declarations: p.declarations,
79
+ usages: p.usages,
80
+ docs: p.docs,
81
+ configs: p.configs,
82
+ routes: p.routes,
83
+ scopeCapped: p.scopeCapped,
84
+ capReason: p.capReason,
85
+ };
86
+ }
87
+ //# sourceMappingURL=SemanticCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticCache.js","sourceRoot":"","sources":["../../src/cache/SemanticCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAGnE;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,aAAa;IACP,KAAK,CAAa;IAClB,WAAW,CAAS;IAErC,YAAY,KAAkB,EAAE,YAAoB;QAClD,MAAM,EAAE,GAAG,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QAC7E,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,GAAG,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACpD,CAAC;IAED;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAgB;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAEjD,sDAAsD;QACtD,KAAK,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3E,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;gBACnD,IAAI,YAAY,KAAK,WAAW;oBAAE,OAAO,IAAI,CAAC,CAAC,eAAe;YAChE,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC,CAAC,+BAA+B;YAC9C,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,KAAqB,EAAE,QAAgB,EAAE,YAAoB;QAChE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACjD,CAAC;IAED,gFAAgF;IAChF,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,SAAS,gBAAgB,CAAC,CAAiB;IACzC,sDAAsD;IACtD,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CACtC,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,KAAK;QACL,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,SAAS,EAAE,CAAC,CAAC,SAAkD;KAChE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Phase 4B — Workspace fingerprinting.
3
+ *
4
+ * Computes a stable key for a workspace scope so the persistent cache
5
+ * can be partitioned by workspace + scope without collisions.
6
+ */
7
+ export interface ScopeFingerprint {
8
+ /** Stable key for cache file naming */
9
+ key: string;
10
+ /** Human-readable label for debugging */
11
+ label: string;
12
+ }
13
+ /**
14
+ * Compute a fingerprint for a search scope.
15
+ * Deterministic: same scope always produces the same key.
16
+ */
17
+ export declare function computeScopeFingerprint(workspaceRoot: string, includeTests: boolean): ScopeFingerprint;
@@ -0,0 +1,14 @@
1
+ import * as crypto from 'crypto';
2
+ import * as path from 'path';
3
+ /**
4
+ * Compute a fingerprint for a search scope.
5
+ * Deterministic: same scope always produces the same key.
6
+ */
7
+ export function computeScopeFingerprint(workspaceRoot, includeTests) {
8
+ const normalized = path.normalize(workspaceRoot).toLowerCase();
9
+ const content = `${normalized}:tests=${includeTests}`;
10
+ const key = crypto.createHash('sha1').update(content).digest('hex').slice(0, 16);
11
+ const label = path.basename(workspaceRoot);
12
+ return { key, label };
13
+ }
14
+ //# sourceMappingURL=SnapshotFingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SnapshotFingerprint.js","sourceRoot":"","sources":["../../src/cache/SnapshotFingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAgB7B;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,aAAqB,EACrB,YAAqB;IAErB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/D,MAAM,OAAO,GAAG,GAAG,UAAU,UAAU,YAAY,EAAE,CAAC;IACtD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjF,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC3C,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACxB,CAAC"}
@@ -12,6 +12,22 @@ export declare class DocumentManager {
12
12
  * Re-read a file from disk and send didChange. For live diagnostics after edits.
13
13
  */
14
14
  refreshFromDisk(filePath: string, connection: MessageConnection): Promise<string>;
15
+ /**
16
+ * Apply an in-memory edit to an already-open document (e.g. from editor didChange).
17
+ * Updates the cached content and sends textDocument/didChange to the language server.
18
+ * If the file is not yet open, opens it first with the given content.
19
+ */
20
+ applyEdit(filePath: string, newContent: string, connection: MessageConnection): Promise<void>;
21
+ /**
22
+ * Return a snapshot of all currently open documents.
23
+ * Used by OverlayStore to build a WorkspaceSnapshot.
24
+ */
25
+ getOpenDocuments(): ReadonlyMap<string, Readonly<{
26
+ uri: string;
27
+ version: number;
28
+ content: string;
29
+ languageId: string;
30
+ }>>;
15
31
  getContent(uri: string): string | undefined;
16
32
  isOpen(uri: string): boolean;
17
33
  cacheDiagnostics(uri: string, diagnostics: Diagnostic[]): void;
@@ -46,6 +46,38 @@ export class DocumentManager {
46
46
  }
47
47
  return content;
48
48
  }
49
+ /**
50
+ * Apply an in-memory edit to an already-open document (e.g. from editor didChange).
51
+ * Updates the cached content and sends textDocument/didChange to the language server.
52
+ * If the file is not yet open, opens it first with the given content.
53
+ */
54
+ async applyEdit(filePath, newContent, connection) {
55
+ const uri = pathToUri(filePath);
56
+ const existing = this.openDocs.get(uri);
57
+ if (existing) {
58
+ existing.version++;
59
+ existing.content = newContent;
60
+ connection.sendNotification('textDocument/didChange', {
61
+ textDocument: { uri, version: existing.version },
62
+ contentChanges: [{ text: newContent }],
63
+ });
64
+ }
65
+ else {
66
+ const languageId = this.detectLanguage(filePath);
67
+ const doc = { uri, version: 1, content: newContent, languageId };
68
+ this.openDocs.set(uri, doc);
69
+ connection.sendNotification('textDocument/didOpen', {
70
+ textDocument: { uri, languageId, version: 1, text: newContent },
71
+ });
72
+ }
73
+ }
74
+ /**
75
+ * Return a snapshot of all currently open documents.
76
+ * Used by OverlayStore to build a WorkspaceSnapshot.
77
+ */
78
+ getOpenDocuments() {
79
+ return this.openDocs;
80
+ }
49
81
  getContent(uri) {
50
82
  return this.openDocs.get(uri)?.content;
51
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentManager.js","sourceRoot":"","sources":["../../src/engine/DocumentManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DocumentManager.js","sourceRoot":"","sources":["../../src/engine/DocumentManager.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -39,6 +39,9 @@ import { liveDiagnostics } from './tools/live/liveDiagnostics.js';
39
39
  import { findUnusedExports } from './tools/live/findUnusedExports.js';
40
40
  import { autoImport } from './tools/live/autoImport.js';
41
41
  import { clearIndex } from './tools/live/clearIndex.js';
42
+ // Workflows
43
+ import { verifyChangeSet } from './workflows/verifyChangeSet.js';
44
+ import { simulateChange } from './workflows/simulateChange.js';
42
45
  const workspaceRoot = process.env.LSP_WORKSPACE_ROOT || process.cwd();
43
46
  async function main() {
44
47
  console.error(`[lsp-intelligence] Starting with workspace: ${workspaceRoot}`);
@@ -78,6 +81,9 @@ async function main() {
78
81
  findUnusedExports,
79
82
  autoImport,
80
83
  clearIndex,
84
+ // Workflows
85
+ verifyChangeSet,
86
+ simulateChange,
81
87
  ]);
82
88
  engine.initialize().catch((err) => {
83
89
  console.error(`[lsp-intelligence] Engine initialization failed: ${err.message}`);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,12 @@
1
- import type { SearchAdapter } from './types.js';
2
1
  /**
3
- * HTTP/API adapter emits recipes for endpoint, route, and fetch queries.
4
- * Distinguishes between route DEFINITIONS and outbound API CALLS.
2
+ * Phase 2E migration cutover: thin compatibility wrapper.
3
+ *
4
+ * HTTP/route detection has been distributed across:
5
+ * - src/adapters/next/index.ts (Next.js route patterns)
6
+ * - src/adapters/express/index.ts (Express/Fastify route patterns)
7
+ *
8
+ * The httpAdapter is kept here for backward compatibility with any code
9
+ * that still imports it from this path. It delegates to the v2 adapters.
5
10
  */
11
+ import type { SearchAdapter } from './types.js';
6
12
  export declare const httpAdapter: SearchAdapter;
@@ -1,58 +1,13 @@
1
- /**
2
- * HTTP/API adapter emits recipes for endpoint, route, and fetch queries.
3
- * Distinguishes between route DEFINITIONS and outbound API CALLS.
4
- */
1
+ import { nextAdapter } from '../../adapters/next/index.js';
2
+ import { expressAdapter } from '../../adapters/express/index.js';
5
3
  export const httpAdapter = {
6
4
  id: 'http',
7
5
  detect(ir) {
8
- if (!ir.traits.routeLike)
9
- return [];
10
- const recipes = [];
11
- const isDefinitionQuery = ir.nlTokens.some((t) => ['endpoint', 'route', 'handler', 'defined', 'registered'].includes(t));
12
- const isCallQuery = ir.nlTokens.some((t) => ['fetch', 'request', 'http', 'call', 'calls'].includes(t));
13
- // Route/endpoint DEFINITION queries — server-side handler registration
14
- if (isDefinitionQuery) {
15
- recipes.push({
16
- id: 'http.route-definition',
17
- adapter: 'http',
18
- retrievers: ['behavior', 'regex', 'config'],
19
- regexes: [
20
- // Express/Fastify/Koa-style route registration
21
- { id: 'express-route', pattern: '(?:app|router)\\.(get|post|put|delete|patch|use)\\s*\\(', flags: 'gi' },
22
- // Next.js API route handlers
23
- { id: 'next-api-handler', pattern: 'export\\s+(?:default\\s+)?(?:async\\s+)?function\\s+(?:GET|POST|PUT|DELETE|PATCH|handler)', flags: 'g' },
24
- // Route config objects
25
- { id: 'route-config', pattern: '(?:routes|endpoints)\\s*[:=]\\s*[\\[{]', flags: 'gi' },
26
- ],
27
- scoreBoost: 3,
28
- reasons: ['HTTP adapter: route/endpoint definition query'],
29
- });
30
- }
31
- // Outbound API CALL queries — client-side fetch/request
32
- if (isCallQuery && !isDefinitionQuery) {
33
- recipes.push({
34
- id: 'http.api-call',
35
- adapter: 'http',
36
- retrievers: ['behavior', 'regex'],
37
- regexes: [
38
- { id: 'fetch-call', pattern: '(?:fetch|axios|request)\\s*\\(', flags: 'g' },
39
- { id: 'http-method', pattern: '\\.(get|post|put|delete|patch)\\s*\\(', flags: 'g' },
40
- ],
41
- scoreBoost: 1,
42
- reasons: ['HTTP adapter: outbound API call query'],
43
- });
44
- }
45
- // Ambiguous — both definition and call traits
46
- if (!isDefinitionQuery && !isCallQuery) {
47
- recipes.push({
48
- id: 'http.general',
49
- adapter: 'http',
50
- retrievers: ['behavior', 'config'],
51
- scoreBoost: 1,
52
- reasons: ['HTTP adapter: general route/API query'],
53
- });
54
- }
55
- return recipes;
6
+ // Combine Next.js and Express route detection recipes
7
+ return [
8
+ ...(nextAdapter.detect?.(ir) ?? []),
9
+ ...(expressAdapter.detect?.(ir) ?? []),
10
+ ];
56
11
  },
57
12
  };
58
13
  //# sourceMappingURL=http.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/search/adapters/http.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,EAAE,EAAE,MAAM;IAEV,MAAM,CAAC,EAAW;QAChB,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAEpC,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,MAAM,iBAAiB,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACzH,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvG,uEAAuE;QACvE,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,uBAAuB;gBAC3B,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC;gBAC3C,OAAO,EAAE;oBACP,+CAA+C;oBAC/C,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,yDAAyD,EAAE,KAAK,EAAE,IAAI,EAAE;oBACxG,6BAA6B;oBAC7B,EAAE,EAAE,EAAE,kBAAkB,EAAE,OAAO,EAAE,2FAA2F,EAAE,KAAK,EAAE,GAAG,EAAE;oBAC5I,uBAAuB;oBACvB,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,wCAAwC,EAAE,KAAK,EAAE,IAAI,EAAE;iBACvF;gBACD,UAAU,EAAE,CAAC;gBACb,OAAO,EAAE,CAAC,+CAA+C,CAAC;aAC3D,CAAC,CAAC;QACL,CAAC;QAED,wDAAwD;QACxD,IAAI,WAAW,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,eAAe;gBACnB,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;gBACjC,OAAO,EAAE;oBACP,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,gCAAgC,EAAE,KAAK,EAAE,GAAG,EAAE;oBAC3E,EAAE,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,uCAAuC,EAAE,KAAK,EAAE,GAAG,EAAE;iBACpF;gBACD,UAAU,EAAE,CAAC;gBACb,OAAO,EAAE,CAAC,uCAAuC,CAAC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,8CAA8C;QAC9C,IAAI,CAAC,iBAAiB,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,cAAc;gBAClB,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;gBAClC,UAAU,EAAE,CAAC;gBACb,OAAO,EAAE,CAAC,uCAAuC,CAAC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/search/adapters/http.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,EAAE,EAAE,MAAM;IACV,MAAM,CAAC,EAAW;QAChB,sDAAsD;QACtD,OAAO;YACL,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACnC,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;SACvC,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -1,12 +1,12 @@
1
- import type { SearchAdapter } from './types.js';
2
1
  /**
3
- * React adapter emits search recipes for React hook/component queries.
2
+ * Phase 2E migration cutover: thin compatibility wrapper.
3
+ *
4
+ * The React adapter has moved to src/adapters/react/index.ts.
5
+ * It now implements IntelligenceAdapter (v2) with graph.denylist intelligence
6
+ * in addition to search recipes.
4
7
  *
5
- * Recipes:
6
- * - react.useeffect.conditional-cleanup
7
- * - react.useeffect.functional-state-updater
8
- * - react.usememo.computation
9
- * - react.usecallback.memoized-handler
10
- * - react.hook.general (fallback for any hook query)
8
+ * Old consumers of this module still work via this re-export.
11
9
  */
10
+ import type { SearchAdapter } from './types.js';
11
+ /** Backward-compatible SearchAdapter wrapper around the v2 React adapter */
12
12
  export declare const reactAdapter: SearchAdapter;
@@ -1,92 +1,7 @@
1
- const HOOK_PATTERN = /^use[A-Z]/;
2
- /**
3
- * React adapter — emits search recipes for React hook/component queries.
4
- *
5
- * Recipes:
6
- * - react.useeffect.conditional-cleanup
7
- * - react.useeffect.functional-state-updater
8
- * - react.usememo.computation
9
- * - react.usecallback.memoized-handler
10
- * - react.hook.general (fallback for any hook query)
11
- */
1
+ import { reactAdapter as v2ReactAdapter } from '../../adapters/react/index.js';
2
+ /** Backward-compatible SearchAdapter wrapper around the v2 React adapter */
12
3
  export const reactAdapter = {
13
4
  id: 'react',
14
- detect(ir) {
15
- if (!ir.traits.reactLike)
16
- return [];
17
- const recipes = [];
18
- const hookIds = ir.exactIdentifiers.filter((id) => HOOK_PATTERN.test(id));
19
- const hasUseEffect = hookIds.includes('useEffect');
20
- const hasUseMemo = hookIds.includes('useMemo');
21
- const hasUseCallback = hookIds.includes('useCallback');
22
- // useEffect + conditional cleanup
23
- if (hasUseEffect && (ir.structuralPredicates.includes('conditional') ||
24
- ir.structuralPredicates.includes('returns-cleanup') ||
25
- ir.codeTokens.includes('cleanup'))) {
26
- recipes.push({
27
- id: 'react.useeffect.conditional-cleanup',
28
- adapter: 'react',
29
- retrievers: ['identifier', 'structural', 'regex'],
30
- exactIdentifiers: ['useEffect'],
31
- structuralPredicates: ['returns-cleanup', 'conditional'],
32
- regexes: [
33
- { id: 'conditional-return', pattern: 'if\\s*\\([^)]*\\)\\s*\\{[^}]*return\\s*\\(\\)', flags: 'g' },
34
- { id: 'useeffect-cleanup', pattern: 'useEffect\\s*\\(\\s*\\(\\)\\s*=>\\s*\\{[\\s\\S]*?return\\s', flags: 'g' },
35
- ],
36
- scoreBoost: 3,
37
- reasons: ['React adapter: useEffect + conditional cleanup pattern'],
38
- });
39
- }
40
- // useEffect + functional state updater (based on previous state)
41
- if (hasUseEffect && ir.traits.previousStateLike) {
42
- recipes.push({
43
- id: 'react.useeffect.functional-state-updater',
44
- adapter: 'react',
45
- retrievers: ['identifier', 'structural', 'regex'],
46
- exactIdentifiers: ['useEffect'],
47
- structuralPredicates: ['functional-state-updater'],
48
- regexes: [
49
- { id: 'functional-updater', pattern: 'set\\w+\\s*\\(\\s*(?:prev|current|existing|old)\\w*\\s*=>', flags: 'g' },
50
- { id: 'updater-arrow', pattern: 'set\\w+\\s*\\(\\s*\\w+\\s*=>\\s*\\w+', flags: 'g' },
51
- ],
52
- scoreBoost: 4,
53
- reasons: ['React adapter: useEffect + functional state updater'],
54
- });
55
- }
56
- // useMemo computation
57
- if (hasUseMemo) {
58
- recipes.push({
59
- id: 'react.usememo.computation',
60
- adapter: 'react',
61
- retrievers: ['identifier'],
62
- exactIdentifiers: ['useMemo'],
63
- scoreBoost: 1,
64
- reasons: ['React adapter: useMemo computation'],
65
- });
66
- }
67
- // useCallback memoized handler
68
- if (hasUseCallback) {
69
- recipes.push({
70
- id: 'react.usecallback.memoized-handler',
71
- adapter: 'react',
72
- retrievers: ['identifier'],
73
- exactIdentifiers: ['useCallback'],
74
- scoreBoost: 1,
75
- reasons: ['React adapter: useCallback memoized handler'],
76
- });
77
- }
78
- // General hook query (fallback)
79
- if (hookIds.length > 0 && recipes.length === 0) {
80
- recipes.push({
81
- id: 'react.hook.general',
82
- adapter: 'react',
83
- retrievers: ['identifier'],
84
- exactIdentifiers: hookIds,
85
- scoreBoost: 0,
86
- reasons: [`React adapter: general hook query for ${hookIds.join(', ')}`],
87
- });
88
- }
89
- return recipes;
90
- },
5
+ detect: (ir) => v2ReactAdapter.detect?.(ir) ?? [],
91
6
  };
92
7
  //# sourceMappingURL=react.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sourceRoot":"","sources":["../../../src/search/adapters/react.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../../src/search/adapters/react.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,YAAY,IAAI,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,YAAY,GAAkB;IACzC,EAAE,EAAE,OAAO;IACX,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE;CAClD,CAAC"}
@@ -1,6 +1,9 @@
1
- import type { QueryIR, SearchRecipe } from '../types.js';
2
1
  /**
3
- * Run all registered adapters against a parsed query IR.
4
- * Returns all emitted recipes.
2
+ * Phase 2E migration cutover: this file is now a thin compatibility shim.
3
+ *
4
+ * The real adapter registry has moved to src/adapters/registry.ts.
5
+ * All new code should import from there directly.
6
+ *
7
+ * This file is kept for any remaining consumers that import from the old path.
5
8
  */
6
- export declare function runAdapters(ir: QueryIR): SearchRecipe[];
9
+ export { runAdapters } from '../../adapters/registry.js';