@ruso-0/nreki 6.0.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 (150) hide show
  1. package/CHANGELOG.md +648 -0
  2. package/LICENSE +21 -0
  3. package/README.md +425 -0
  4. package/dist/ast-navigator.d.ts +29 -0
  5. package/dist/ast-navigator.d.ts.map +1 -0
  6. package/dist/ast-navigator.js +279 -0
  7. package/dist/ast-navigator.js.map +1 -0
  8. package/dist/ast-sandbox.d.ts +74 -0
  9. package/dist/ast-sandbox.d.ts.map +1 -0
  10. package/dist/ast-sandbox.js +242 -0
  11. package/dist/ast-sandbox.js.map +1 -0
  12. package/dist/chronos-memory.d.ts +69 -0
  13. package/dist/chronos-memory.d.ts.map +1 -0
  14. package/dist/chronos-memory.js +247 -0
  15. package/dist/chronos-memory.js.map +1 -0
  16. package/dist/circuit-breaker.d.ts +107 -0
  17. package/dist/circuit-breaker.d.ts.map +1 -0
  18. package/dist/circuit-breaker.js +330 -0
  19. package/dist/circuit-breaker.js.map +1 -0
  20. package/dist/compressor-advanced.d.ts +80 -0
  21. package/dist/compressor-advanced.d.ts.map +1 -0
  22. package/dist/compressor-advanced.js +555 -0
  23. package/dist/compressor-advanced.js.map +1 -0
  24. package/dist/compressor.d.ts +81 -0
  25. package/dist/compressor.d.ts.map +1 -0
  26. package/dist/compressor.js +227 -0
  27. package/dist/compressor.js.map +1 -0
  28. package/dist/database.d.ts +169 -0
  29. package/dist/database.d.ts.map +1 -0
  30. package/dist/database.js +1029 -0
  31. package/dist/database.js.map +1 -0
  32. package/dist/embedder.d.ts +73 -0
  33. package/dist/embedder.d.ts.map +1 -0
  34. package/dist/embedder.js +165 -0
  35. package/dist/embedder.js.map +1 -0
  36. package/dist/engine.d.ts +224 -0
  37. package/dist/engine.d.ts.map +1 -0
  38. package/dist/engine.js +582 -0
  39. package/dist/engine.js.map +1 -0
  40. package/dist/hologram/harvester.d.ts +41 -0
  41. package/dist/hologram/harvester.d.ts.map +1 -0
  42. package/dist/hologram/harvester.js +129 -0
  43. package/dist/hologram/harvester.js.map +1 -0
  44. package/dist/hologram/shadow-cache.d.ts +49 -0
  45. package/dist/hologram/shadow-cache.d.ts.map +1 -0
  46. package/dist/hologram/shadow-cache.js +165 -0
  47. package/dist/hologram/shadow-cache.js.map +1 -0
  48. package/dist/hologram/shadow-generator.d.ts +32 -0
  49. package/dist/hologram/shadow-generator.d.ts.map +1 -0
  50. package/dist/hologram/shadow-generator.js +828 -0
  51. package/dist/hologram/shadow-generator.js.map +1 -0
  52. package/dist/hooks/preToolUse.d.ts +63 -0
  53. package/dist/hooks/preToolUse.d.ts.map +1 -0
  54. package/dist/hooks/preToolUse.js +103 -0
  55. package/dist/hooks/preToolUse.js.map +1 -0
  56. package/dist/index.d.ts +19 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +367 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/kernel/kernel-manager.d.ts +52 -0
  61. package/dist/kernel/kernel-manager.d.ts.map +1 -0
  62. package/dist/kernel/kernel-manager.js +197 -0
  63. package/dist/kernel/kernel-manager.js.map +1 -0
  64. package/dist/kernel/kernel-worker.d.ts +9 -0
  65. package/dist/kernel/kernel-worker.d.ts.map +1 -0
  66. package/dist/kernel/kernel-worker.js +76 -0
  67. package/dist/kernel/kernel-worker.js.map +1 -0
  68. package/dist/kernel/nreki-kernel.d.ts +244 -0
  69. package/dist/kernel/nreki-kernel.d.ts.map +1 -0
  70. package/dist/kernel/nreki-kernel.js +1656 -0
  71. package/dist/kernel/nreki-kernel.js.map +1 -0
  72. package/dist/middleware/circuit-breaker.d.ts +32 -0
  73. package/dist/middleware/circuit-breaker.d.ts.map +1 -0
  74. package/dist/middleware/circuit-breaker.js +160 -0
  75. package/dist/middleware/circuit-breaker.js.map +1 -0
  76. package/dist/middleware/file-lock.d.ts +33 -0
  77. package/dist/middleware/file-lock.d.ts.map +1 -0
  78. package/dist/middleware/file-lock.js +55 -0
  79. package/dist/middleware/file-lock.js.map +1 -0
  80. package/dist/middleware/validator.d.ts +26 -0
  81. package/dist/middleware/validator.d.ts.map +1 -0
  82. package/dist/middleware/validator.js +39 -0
  83. package/dist/middleware/validator.js.map +1 -0
  84. package/dist/monitor.d.ts +94 -0
  85. package/dist/monitor.d.ts.map +1 -0
  86. package/dist/monitor.js +221 -0
  87. package/dist/monitor.js.map +1 -0
  88. package/dist/parser-pool.d.ts +28 -0
  89. package/dist/parser-pool.d.ts.map +1 -0
  90. package/dist/parser-pool.js +81 -0
  91. package/dist/parser-pool.js.map +1 -0
  92. package/dist/parser.d.ts +91 -0
  93. package/dist/parser.d.ts.map +1 -0
  94. package/dist/parser.js +311 -0
  95. package/dist/parser.js.map +1 -0
  96. package/dist/pin-memory.d.ts +35 -0
  97. package/dist/pin-memory.d.ts.map +1 -0
  98. package/dist/pin-memory.js +161 -0
  99. package/dist/pin-memory.js.map +1 -0
  100. package/dist/repo-map.d.ts +81 -0
  101. package/dist/repo-map.d.ts.map +1 -0
  102. package/dist/repo-map.js +550 -0
  103. package/dist/repo-map.js.map +1 -0
  104. package/dist/router.d.ts +102 -0
  105. package/dist/router.d.ts.map +1 -0
  106. package/dist/router.js +1989 -0
  107. package/dist/router.js.map +1 -0
  108. package/dist/semantic-edit.d.ts +82 -0
  109. package/dist/semantic-edit.d.ts.map +1 -0
  110. package/dist/semantic-edit.js +529 -0
  111. package/dist/semantic-edit.js.map +1 -0
  112. package/dist/terminal-filter.d.ts +27 -0
  113. package/dist/terminal-filter.d.ts.map +1 -0
  114. package/dist/terminal-filter.js +257 -0
  115. package/dist/terminal-filter.js.map +1 -0
  116. package/dist/undo.d.ts +21 -0
  117. package/dist/undo.d.ts.map +1 -0
  118. package/dist/undo.js +55 -0
  119. package/dist/undo.js.map +1 -0
  120. package/dist/utils/code-tokenizer.d.ts +25 -0
  121. package/dist/utils/code-tokenizer.d.ts.map +1 -0
  122. package/dist/utils/code-tokenizer.js +52 -0
  123. package/dist/utils/code-tokenizer.js.map +1 -0
  124. package/dist/utils/file-filter.d.ts +23 -0
  125. package/dist/utils/file-filter.d.ts.map +1 -0
  126. package/dist/utils/file-filter.js +48 -0
  127. package/dist/utils/file-filter.js.map +1 -0
  128. package/dist/utils/imports.d.ts +32 -0
  129. package/dist/utils/imports.d.ts.map +1 -0
  130. package/dist/utils/imports.js +155 -0
  131. package/dist/utils/imports.js.map +1 -0
  132. package/dist/utils/path-jail.d.ts +27 -0
  133. package/dist/utils/path-jail.d.ts.map +1 -0
  134. package/dist/utils/path-jail.js +95 -0
  135. package/dist/utils/path-jail.js.map +1 -0
  136. package/dist/utils/read-source.d.ts +18 -0
  137. package/dist/utils/read-source.d.ts.map +1 -0
  138. package/dist/utils/read-source.js +22 -0
  139. package/dist/utils/read-source.js.map +1 -0
  140. package/dist/utils/safe-parse.d.ts +20 -0
  141. package/dist/utils/safe-parse.d.ts.map +1 -0
  142. package/dist/utils/safe-parse.js +25 -0
  143. package/dist/utils/safe-parse.js.map +1 -0
  144. package/package.json +75 -0
  145. package/scripts/download-wasm.js +46 -0
  146. package/wasm/.gitkeep +0 -0
  147. package/wasm/tree-sitter-go.wasm +0 -0
  148. package/wasm/tree-sitter-javascript.wasm +0 -0
  149. package/wasm/tree-sitter-python.wasm +0 -0
  150. package/wasm/tree-sitter-typescript.wasm +0 -0
@@ -0,0 +1,129 @@
1
+ /**
2
+ * harvester.ts - Background .d.ts extractor for hologram mode.
3
+ *
4
+ * Extracts real .d.ts declarations from the TypeScript compiler during idle time,
5
+ * replacing heuristic Tree-sitter shadows with compiler-grade ones.
6
+ *
7
+ * Cooperative scheduler: processes 3 files per event loop cycle using setImmediate.
8
+ * Epoch-aware: aborts if kernel.logicalTime changed (new edit arrived).
9
+ * TS4023 errors: marks file as UNPRUNABLE_FOREVER in the cache.
10
+ */
11
+ // ─── Harvester ───────────────────────────────────────────────────────
12
+ export class DtsHarvester {
13
+ kernel;
14
+ cache;
15
+ queue = new Set();
16
+ isHarvesting = false;
17
+ constructor(kernel, cache) {
18
+ this.kernel = kernel;
19
+ this.cache = cache;
20
+ }
21
+ /** Queue files for .d.ts harvest during idle time. */
22
+ queueForHarvest(unprunableFiles) {
23
+ for (const file of unprunableFiles) {
24
+ if (!this.cache.isUnprunableForever(file)) {
25
+ this.queue.add(file);
26
+ }
27
+ }
28
+ if (!this.isHarvesting && this.queue.size > 0) {
29
+ this.startHarvesting(this.kernel.getLogicalTime()).catch(() => { });
30
+ }
31
+ }
32
+ /** Abort current harvest (called when an edit arrives). */
33
+ abort() {
34
+ this.isHarvesting = false;
35
+ }
36
+ /**
37
+ * Cooperative scheduler: 3 files per event loop cycle.
38
+ * Uses setImmediate to yield the event loop between batches.
39
+ * Aborts if kernel.logicalTime changed (new edit arrived).
40
+ */
41
+ async startHarvesting(epochId) {
42
+ if (this.isHarvesting) {
43
+ return { filesHarvested: 0, filesMarkedUnprunable: 0, aborted: false, durationMs: 0 };
44
+ }
45
+ this.isHarvesting = true;
46
+ const t0 = performance.now();
47
+ let filesHarvested = 0;
48
+ let filesMarkedUnprunable = 0;
49
+ const BATCH_SIZE = 3;
50
+ const files = Array.from(this.queue);
51
+ this.queue.clear();
52
+ for (let i = 0; i < files.length; i += BATCH_SIZE) {
53
+ // Abort check: stop if abort() was called or a new edit has arrived
54
+ if (!this.isHarvesting || this.kernel.getLogicalTime() !== epochId) {
55
+ this.isHarvesting = false;
56
+ return {
57
+ filesHarvested,
58
+ filesMarkedUnprunable,
59
+ aborted: true,
60
+ durationMs: performance.now() - t0,
61
+ };
62
+ }
63
+ const batch = files.slice(i, i + BATCH_SIZE);
64
+ for (const filePath of batch) {
65
+ const result = this.harvestSingleFile(filePath);
66
+ if (result === "harvested") {
67
+ filesHarvested++;
68
+ }
69
+ else if (result === "unprunable") {
70
+ filesMarkedUnprunable++;
71
+ }
72
+ }
73
+ // Yield event loop for cooperative scheduling
74
+ if (i + BATCH_SIZE < files.length) {
75
+ await new Promise(resolve => {
76
+ if (typeof globalThis.setImmediate === "function") {
77
+ setImmediate(resolve);
78
+ }
79
+ else {
80
+ setTimeout(resolve, 0);
81
+ }
82
+ });
83
+ }
84
+ }
85
+ this.isHarvesting = false;
86
+ return {
87
+ filesHarvested,
88
+ filesMarkedUnprunable,
89
+ aborted: false,
90
+ durationMs: performance.now() - t0,
91
+ };
92
+ }
93
+ /**
94
+ * Harvest a single file: extract real .d.ts from the compiler.
95
+ * Returns "harvested" on success, "unprunable" if TS4023, or "skipped".
96
+ */
97
+ harvestSingleFile(filePath) {
98
+ const program = this.kernel.getProgram();
99
+ if (!program)
100
+ return "skipped";
101
+ const sourceFile = program.getSourceFile(filePath);
102
+ if (!sourceFile)
103
+ return "skipped";
104
+ let dtsContent = "";
105
+ let hasTs4023 = false;
106
+ const emitResult = program.emit(sourceFile, (fileName, text) => {
107
+ if (fileName.endsWith(".d.ts")) {
108
+ dtsContent = text;
109
+ }
110
+ }, undefined, true);
111
+ // Check for TS4023: "Exported variable has or is using name from external module"
112
+ for (const diag of emitResult.diagnostics) {
113
+ if (diag.code === 4023) {
114
+ hasTs4023 = true;
115
+ break;
116
+ }
117
+ }
118
+ if (hasTs4023) {
119
+ this.cache.markAsUnprunableForever(filePath);
120
+ return "unprunable";
121
+ }
122
+ if (dtsContent) {
123
+ this.cache.setShadow(filePath, dtsContent, "harvested");
124
+ return "harvested";
125
+ }
126
+ return "skipped";
127
+ }
128
+ }
129
+ //# sourceMappingURL=harvester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harvester.js","sourceRoot":"","sources":["../../src/hologram/harvester.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * shadow-cache.ts - Disk persistence for holographic shadows.
3
+ *
4
+ * Persists generated .d.ts shadows between sessions so project re-scans
5
+ * are incremental. Uses a manifest file for mtime/hash-based staleness
6
+ * detection and a version guard to invalidate the entire cache when
7
+ * nrekiVersion or tsVersion changes.
8
+ *
9
+ * Cache directory: .nreki/shadows/
10
+ * Manifest file: .nreki/shadows/manifest.json
11
+ */
12
+ export interface ShadowManifest {
13
+ nrekiVersion: string;
14
+ tsVersion: string;
15
+ files: Record<string, {
16
+ mtime: number;
17
+ hash: string;
18
+ status: "pruned" | "unprunable" | "unprunable-forever" | "harvested";
19
+ }>;
20
+ }
21
+ export declare class ShadowCache {
22
+ private cacheDir;
23
+ private manifestPath;
24
+ private manifest;
25
+ private shadows;
26
+ constructor(projectRoot: string);
27
+ /** Load manifest from disk. Returns the in-memory shadow content map. */
28
+ load(): Map<string, string>;
29
+ /** Persist manifest and all shadow content to disk. */
30
+ save(shadows: Map<string, string>): void;
31
+ /** Set or update a shadow entry. */
32
+ setShadow(tsPath: string, content: string, status: "pruned" | "unprunable" | "unprunable-forever" | "harvested"): void;
33
+ /** Get cached shadow content from the in-memory map. */
34
+ getShadow(tsPath: string): string | undefined;
35
+ /** Get files whose mtime has changed since last scan. */
36
+ getStaleFiles(currentMtimes: Map<string, number>): string[];
37
+ /** Mark a file as permanently unprunable (e.g., TS4023 errors). */
38
+ markAsUnprunableForever(tsPath: string): void;
39
+ /** Check if a file is marked as permanently unprunable. */
40
+ isUnprunableForever(tsPath: string): boolean;
41
+ /** Get the current manifest. */
42
+ getManifest(): ShadowManifest;
43
+ /** Set version info. Clears cache if versions don't match. */
44
+ setVersions(nrekiVersion: string, tsVersion: string): boolean;
45
+ /** Clear entire cache (version guard triggered). */
46
+ clear(): void;
47
+ private getShadowFilePath;
48
+ }
49
+ //# sourceMappingURL=shadow-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow-cache.d.ts","sourceRoot":"","sources":["../../src/hologram/shadow-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,MAAM,WAAW,cAAc;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,QAAQ,GAAG,YAAY,GAAG,oBAAoB,GAAG,WAAW,CAAC;KACxE,CAAC,CAAC;CACN;AAID,qBAAa,WAAW;IACpB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,OAAO,CAA6B;gBAEhC,WAAW,EAAE,MAAM;IAM/B,yEAAyE;IACzE,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IA2B3B,uDAAuD;IACvD,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAiBxC,oCAAoC;IACpC,SAAS,CACL,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,QAAQ,GAAG,YAAY,GAAG,oBAAoB,GAAG,WAAW,GACrE,IAAI;IAWP,wDAAwD;IACxD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAQ7C,yDAAyD;IACzD,aAAa,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE;IAqB3D,mEAAmE;IACnE,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAS7C,2DAA2D;IAC3D,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI5C,gCAAgC;IAChC,WAAW,IAAI,cAAc;IAI7B,8DAA8D;IAC9D,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAe7D,oDAAoD;IACpD,KAAK,IAAI,IAAI;IAkBb,OAAO,CAAC,iBAAiB;CAK5B"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * shadow-cache.ts - Disk persistence for holographic shadows.
3
+ *
4
+ * Persists generated .d.ts shadows between sessions so project re-scans
5
+ * are incremental. Uses a manifest file for mtime/hash-based staleness
6
+ * detection and a version guard to invalidate the entire cache when
7
+ * nrekiVersion or tsVersion changes.
8
+ *
9
+ * Cache directory: .nreki/shadows/
10
+ * Manifest file: .nreki/shadows/manifest.json
11
+ */
12
+ import fs from "fs";
13
+ import path from "path";
14
+ import crypto from "crypto";
15
+ // ─── Shadow Cache ────────────────────────────────────────────────────
16
+ export class ShadowCache {
17
+ cacheDir;
18
+ manifestPath;
19
+ manifest;
20
+ shadows = new Map();
21
+ constructor(projectRoot) {
22
+ this.cacheDir = path.join(projectRoot, ".nreki", "shadows");
23
+ this.manifestPath = path.join(this.cacheDir, "manifest.json");
24
+ this.manifest = { nrekiVersion: "", tsVersion: "", files: {} };
25
+ }
26
+ /** Load manifest from disk. Returns the in-memory shadow content map. */
27
+ load() {
28
+ this.shadows.clear();
29
+ if (!fs.existsSync(this.manifestPath))
30
+ return this.shadows;
31
+ try {
32
+ const raw = fs.readFileSync(this.manifestPath, "utf-8");
33
+ this.manifest = JSON.parse(raw);
34
+ }
35
+ catch {
36
+ this.manifest = { nrekiVersion: "", tsVersion: "", files: {} };
37
+ return this.shadows;
38
+ }
39
+ // Load individual shadow files
40
+ for (const [tsPath, entry] of Object.entries(this.manifest.files)) {
41
+ if (entry.status === "pruned" || entry.status === "harvested") {
42
+ const shadowPath = this.getShadowFilePath(tsPath);
43
+ if (fs.existsSync(shadowPath)) {
44
+ try {
45
+ this.shadows.set(tsPath, fs.readFileSync(shadowPath, "utf-8"));
46
+ }
47
+ catch { /* skip corrupted shadow */ }
48
+ }
49
+ }
50
+ }
51
+ return this.shadows;
52
+ }
53
+ /** Persist manifest and all shadow content to disk. */
54
+ save(shadows) {
55
+ if (!fs.existsSync(this.cacheDir)) {
56
+ fs.mkdirSync(this.cacheDir, { recursive: true });
57
+ }
58
+ // Write individual shadow files
59
+ for (const [tsPath, content] of shadows) {
60
+ const shadowPath = this.getShadowFilePath(tsPath);
61
+ const dir = path.dirname(shadowPath);
62
+ if (!fs.existsSync(dir))
63
+ fs.mkdirSync(dir, { recursive: true });
64
+ fs.writeFileSync(shadowPath, content, "utf-8");
65
+ }
66
+ // Write manifest
67
+ fs.writeFileSync(this.manifestPath, JSON.stringify(this.manifest, null, 2), "utf-8");
68
+ }
69
+ /** Set or update a shadow entry. */
70
+ setShadow(tsPath, content, status) {
71
+ const hash = crypto.createHash("sha256").update(content).digest("hex").slice(0, 16);
72
+ let mtime = 0;
73
+ try {
74
+ mtime = fs.statSync(path.normalize(tsPath)).mtimeMs;
75
+ }
76
+ catch { /* file may not exist */ }
77
+ this.manifest.files[tsPath] = { mtime, hash, status };
78
+ this.shadows.set(tsPath, content);
79
+ }
80
+ /** Get cached shadow content from the in-memory map. */
81
+ getShadow(tsPath) {
82
+ const entry = this.manifest.files[tsPath];
83
+ if (!entry || (entry.status !== "pruned" && entry.status !== "harvested")) {
84
+ return undefined;
85
+ }
86
+ return this.shadows.get(tsPath);
87
+ }
88
+ /** Get files whose mtime has changed since last scan. */
89
+ getStaleFiles(currentMtimes) {
90
+ const stale = [];
91
+ for (const [tsPath, entry] of Object.entries(this.manifest.files)) {
92
+ const currentMtime = currentMtimes.get(tsPath);
93
+ if (currentMtime === undefined) {
94
+ // File was deleted
95
+ stale.push(tsPath);
96
+ }
97
+ else if (Math.abs(currentMtime - entry.mtime) > 1) {
98
+ // mtime changed (1ms tolerance for filesystem precision)
99
+ stale.push(tsPath);
100
+ }
101
+ }
102
+ // Also add files not in manifest (new files)
103
+ for (const tsPath of currentMtimes.keys()) {
104
+ if (!(tsPath in this.manifest.files)) {
105
+ stale.push(tsPath);
106
+ }
107
+ }
108
+ return stale;
109
+ }
110
+ /** Mark a file as permanently unprunable (e.g., TS4023 errors). */
111
+ markAsUnprunableForever(tsPath) {
112
+ const existing = this.manifest.files[tsPath];
113
+ if (existing) {
114
+ existing.status = "unprunable-forever";
115
+ }
116
+ else {
117
+ this.manifest.files[tsPath] = { mtime: 0, hash: "", status: "unprunable-forever" };
118
+ }
119
+ }
120
+ /** Check if a file is marked as permanently unprunable. */
121
+ isUnprunableForever(tsPath) {
122
+ return this.manifest.files[tsPath]?.status === "unprunable-forever";
123
+ }
124
+ /** Get the current manifest. */
125
+ getManifest() {
126
+ return this.manifest;
127
+ }
128
+ /** Set version info. Clears cache if versions don't match. */
129
+ setVersions(nrekiVersion, tsVersion) {
130
+ if (this.manifest.nrekiVersion &&
131
+ (this.manifest.nrekiVersion !== nrekiVersion || this.manifest.tsVersion !== tsVersion)) {
132
+ this.clear();
133
+ this.manifest.nrekiVersion = nrekiVersion;
134
+ this.manifest.tsVersion = tsVersion;
135
+ return true; // Cache was invalidated
136
+ }
137
+ this.manifest.nrekiVersion = nrekiVersion;
138
+ this.manifest.tsVersion = tsVersion;
139
+ return false;
140
+ }
141
+ /** Clear entire cache (version guard triggered). */
142
+ clear() {
143
+ this.manifest = {
144
+ nrekiVersion: this.manifest.nrekiVersion,
145
+ tsVersion: this.manifest.tsVersion,
146
+ files: {},
147
+ };
148
+ this.shadows.clear();
149
+ // Remove shadow files from disk
150
+ if (fs.existsSync(this.cacheDir)) {
151
+ try {
152
+ fs.rmSync(this.cacheDir, { recursive: true, force: true });
153
+ fs.mkdirSync(this.cacheDir, { recursive: true });
154
+ }
155
+ catch { /* best effort */ }
156
+ }
157
+ }
158
+ // ─── Private ─────────────────────────────────────────────────────
159
+ getShadowFilePath(tsPath) {
160
+ // Use hash of tsPath for flat storage to avoid deep directory trees
161
+ const hash = crypto.createHash("sha256").update(tsPath).digest("hex").slice(0, 16);
162
+ return path.join(this.cacheDir, `${hash}.d.ts`);
163
+ }
164
+ }
165
+ //# sourceMappingURL=shadow-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow-cache.js","sourceRoot":"","sources":["../../src/hologram/shadow-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * shadow-generator.ts -Tree-sitter based TypeScript file classifier and .d.ts shadow generator.
3
+ *
4
+ * Classifies TypeScript files as PRUNABLE (all exports have explicit type annotations)
5
+ * or UNPRUNABLE (any export relies on type inference). For prunable files, generates
6
+ * lightweight .d.ts shadow content that preserves structural type information.
7
+ *
8
+ * Uses Tree-sitter for accurate AST walking, not regex.
9
+ */
10
+ import Parser from "web-tree-sitter";
11
+ import { ParserPool } from "../parser-pool.js";
12
+ export interface ClassifyResult {
13
+ prunable: boolean;
14
+ shadow: string | null;
15
+ reasons: string[];
16
+ category: "explicit" | "inferred" | "no-exports";
17
+ }
18
+ export interface ScanStats {
19
+ total: number;
20
+ pruned: number;
21
+ unpruned: number;
22
+ noExports: number;
23
+ }
24
+ export interface ScanResult {
25
+ prunable: Map<string, string>;
26
+ unprunable: Set<string>;
27
+ ambientFiles: string[];
28
+ stats: ScanStats;
29
+ }
30
+ export declare function classifyAndGenerateShadow(filePath: string, content: string, parser: Parser, language: Parser.Language): ClassifyResult;
31
+ export declare function scanProject(rootDir: string, parserPool: ParserPool): Promise<ScanResult>;
32
+ //# sourceMappingURL=shadow-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow-generator.d.ts","sourceRoot":"","sources":["../../src/hologram/shadow-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAM/C,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;CACpD;AAED,MAAM,WAAW,SAAS;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,EAAE,SAAS,CAAC;CACpB;AA8tBD,wBAAgB,yBAAyB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAC1B,cAAc,CAuChB;AAkCD,wBAAsB,WAAW,CAC7B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,GACvB,OAAO,CAAC,UAAU,CAAC,CA4FrB"}