homegraph 1.5.5 → 1.5.7
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/CHANGELOG.md +46 -0
- package/README.md +10 -4
- package/dist/bin/homegraph.js +6 -0
- package/dist/bin/homegraph.js.map +1 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +120 -15
- package/dist/context/index.js.map +1 -1
- package/dist/db/migrations.d.ts +1 -1
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +37 -1
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/queries.d.ts +25 -0
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +50 -2
- package/dist/db/queries.js.map +1 -1
- package/dist/db/schema.sql +24 -0
- package/dist/extraction/languages/arkts.d.ts +40 -3
- package/dist/extraction/languages/arkts.d.ts.map +1 -1
- package/dist/extraction/languages/arkts.js +302 -22
- package/dist/extraction/languages/arkts.js.map +1 -1
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +87 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/engine.d.ts +26 -0
- package/dist/mcp/engine.d.ts.map +1 -1
- package/dist/mcp/engine.js +229 -8
- package/dist/mcp/engine.js.map +1 -1
- package/dist/mcp/evidence-rendering.d.ts +10 -0
- package/dist/mcp/evidence-rendering.d.ts.map +1 -0
- package/dist/mcp/evidence-rendering.js +71 -0
- package/dist/mcp/evidence-rendering.js.map +1 -0
- package/dist/mcp/explore-repeat-guard.d.ts +8 -13
- package/dist/mcp/explore-repeat-guard.d.ts.map +1 -1
- package/dist/mcp/explore-repeat-guard.js +54 -114
- package/dist/mcp/explore-repeat-guard.js.map +1 -1
- package/dist/mcp/explore-session-state.d.ts +26 -4
- package/dist/mcp/explore-session-state.d.ts.map +1 -1
- package/dist/mcp/explore-session-state.js +50 -4
- package/dist/mcp/explore-session-state.js.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +16 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/query-cache.d.ts +1 -1
- package/dist/mcp/query-cache.d.ts.map +1 -1
- package/dist/mcp/query-cache.js +86 -3
- package/dist/mcp/query-cache.js.map +1 -1
- package/dist/mcp/query-pool.js +4 -4
- package/dist/mcp/server-instructions.d.ts +2 -2
- package/dist/mcp/server-instructions.d.ts.map +1 -1
- package/dist/mcp/server-instructions.js +36 -21
- package/dist/mcp/server-instructions.js.map +1 -1
- package/dist/mcp/tools.d.ts +29 -3
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +827 -109
- package/dist/mcp/tools.js.map +1 -1
- package/dist/project-map/index.d.ts +33 -0
- package/dist/project-map/index.d.ts.map +1 -0
- package/dist/project-map/index.js +260 -0
- package/dist/project-map/index.js.map +1 -0
- package/dist/search/literal-evidence.d.ts +44 -0
- package/dist/search/literal-evidence.d.ts.map +1 -0
- package/dist/search/literal-evidence.js +278 -0
- package/dist/search/literal-evidence.js.map +1 -0
- package/dist/search/query-plan-provider.d.ts +6 -0
- package/dist/search/query-plan-provider.d.ts.map +1 -0
- package/dist/search/query-plan-provider.js +289 -0
- package/dist/search/query-plan-provider.js.map +1 -0
- package/dist/search/query-plan.d.ts +98 -0
- package/dist/search/query-plan.d.ts.map +1 -0
- package/dist/search/query-plan.js +334 -0
- package/dist/search/query-plan.js.map +1 -0
- package/dist/search/query-utils.d.ts +6 -1
- package/dist/search/query-utils.d.ts.map +1 -1
- package/dist/search/query-utils.js +64 -5
- package/dist/search/query-utils.js.map +1 -1
- package/dist/sync/watcher.d.ts +15 -3
- package/dist/sync/watcher.d.ts.map +1 -1
- package/dist/sync/watcher.js +14 -1
- package/dist/sync/watcher.js.map +1 -1
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fast project map — module boundaries + source-file inventory (no symbols/edges).
|
|
3
|
+
*
|
|
4
|
+
* Used by MCP auto-init (seconds-scale) and `homegraph_project` so agents get an
|
|
5
|
+
* engineering overview before the full index finishes.
|
|
6
|
+
*/
|
|
7
|
+
export type BuildPhase = 'none' | 'building_fast' | 'fast' | 'indexing' | 'full';
|
|
8
|
+
export interface ProjectModuleDraft {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
/** Project-relative POSIX path; empty string = project root catch-all. */
|
|
12
|
+
rootPath: string;
|
|
13
|
+
kind: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ProjectModuleFileDraft {
|
|
16
|
+
moduleId: string;
|
|
17
|
+
path: string;
|
|
18
|
+
language: string;
|
|
19
|
+
}
|
|
20
|
+
export interface BuiltProjectMap {
|
|
21
|
+
modules: Array<ProjectModuleDraft & {
|
|
22
|
+
fileCount: number;
|
|
23
|
+
}>;
|
|
24
|
+
files: ProjectModuleFileDraft[];
|
|
25
|
+
durationMs: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Discover modules + assign every indexable source file to the longest-matching
|
|
29
|
+
* module root. Prefer Harmony `build-profile.json5` modules when present.
|
|
30
|
+
*/
|
|
31
|
+
export declare function buildProjectMapScan(projectRoot: string): BuiltProjectMap;
|
|
32
|
+
export declare function parseBuildPhase(raw: string | null | undefined): BuildPhase | null;
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/project-map/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,eAAe,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;AAEjF,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC,kBAAkB,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB;AAmBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CAwBxE;AA0JD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,UAAU,GAAG,IAAI,CAWjF"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Fast project map — module boundaries + source-file inventory (no symbols/edges).
|
|
4
|
+
*
|
|
5
|
+
* Used by MCP auto-init (seconds-scale) and `homegraph_project` so agents get an
|
|
6
|
+
* engineering overview before the full index finishes.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.buildProjectMapScan = buildProjectMapScan;
|
|
43
|
+
exports.parseBuildPhase = parseBuildPhase;
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const extraction_1 = require("../extraction");
|
|
47
|
+
const grammars_1 = require("../extraction/grammars");
|
|
48
|
+
const arkts_1 = require("../extraction/languages/arkts");
|
|
49
|
+
const project_config_1 = require("../project-config");
|
|
50
|
+
const workspace_packages_1 = require("../resolution/workspace-packages");
|
|
51
|
+
const ROOT_MODULE_ID = '__root__';
|
|
52
|
+
const OHPM_MANIFEST = 'oh-package.json5';
|
|
53
|
+
const OHPM_WALK_MAX_DEPTH = 6;
|
|
54
|
+
const OHPM_WALK_DIR_BUDGET = 8000;
|
|
55
|
+
const OHPM_SKIP_DIRS = new Set([
|
|
56
|
+
'node_modules',
|
|
57
|
+
'oh_modules',
|
|
58
|
+
'.git',
|
|
59
|
+
'.homegraph',
|
|
60
|
+
'.hvigor',
|
|
61
|
+
'.preview',
|
|
62
|
+
'build',
|
|
63
|
+
'dist',
|
|
64
|
+
'out',
|
|
65
|
+
]);
|
|
66
|
+
/**
|
|
67
|
+
* Discover modules + assign every indexable source file to the longest-matching
|
|
68
|
+
* module root. Prefer Harmony `build-profile.json5` modules when present.
|
|
69
|
+
*/
|
|
70
|
+
function buildProjectMapScan(projectRoot) {
|
|
71
|
+
const t0 = Date.now();
|
|
72
|
+
const resolved = path.resolve(projectRoot);
|
|
73
|
+
const modules = discoverModules(resolved);
|
|
74
|
+
const overrides = (0, project_config_1.loadExtensionOverrides)(resolved);
|
|
75
|
+
const filesRel = (0, extraction_1.scanDirectory)(resolved);
|
|
76
|
+
const fileRows = [];
|
|
77
|
+
const counts = new Map();
|
|
78
|
+
for (const rel of filesRel) {
|
|
79
|
+
const mod = assignModule(rel, modules);
|
|
80
|
+
const language = (0, grammars_1.detectLanguage)(rel, undefined, overrides);
|
|
81
|
+
fileRows.push({ moduleId: mod.id, path: rel, language });
|
|
82
|
+
counts.set(mod.id, (counts.get(mod.id) ?? 0) + 1);
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
modules: modules.map((m) => ({
|
|
86
|
+
...m,
|
|
87
|
+
fileCount: counts.get(m.id) ?? 0,
|
|
88
|
+
})),
|
|
89
|
+
files: fileRows,
|
|
90
|
+
durationMs: Date.now() - t0,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function discoverModules(projectRoot) {
|
|
94
|
+
const byId = new Map();
|
|
95
|
+
const ensure = (draft) => {
|
|
96
|
+
if (!byId.has(draft.id))
|
|
97
|
+
byId.set(draft.id, draft);
|
|
98
|
+
};
|
|
99
|
+
// Always have a root catch-all for files outside named modules.
|
|
100
|
+
ensure({
|
|
101
|
+
id: ROOT_MODULE_ID,
|
|
102
|
+
name: path.basename(projectRoot) || 'root',
|
|
103
|
+
rootPath: '',
|
|
104
|
+
kind: 'root',
|
|
105
|
+
});
|
|
106
|
+
const harmony = listHarmonyProjectModulesLoose(projectRoot);
|
|
107
|
+
if (harmony.length > 0) {
|
|
108
|
+
for (const m of harmony) {
|
|
109
|
+
ensure({
|
|
110
|
+
id: moduleIdForPath(m.srcPath),
|
|
111
|
+
name: m.name,
|
|
112
|
+
rootPath: m.srcPath,
|
|
113
|
+
kind: 'harmony',
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return [...byId.values()];
|
|
117
|
+
}
|
|
118
|
+
for (const m of discoverOhpmPackages(projectRoot)) {
|
|
119
|
+
ensure(m);
|
|
120
|
+
}
|
|
121
|
+
const ws = (0, workspace_packages_1.loadWorkspacePackages)(projectRoot);
|
|
122
|
+
if (ws) {
|
|
123
|
+
for (const [name, dir] of ws.byName) {
|
|
124
|
+
const rootPath = dir.replace(/\\/g, '/').replace(/^\.\//, '').replace(/\/$/, '');
|
|
125
|
+
ensure({
|
|
126
|
+
id: moduleIdForPath(rootPath),
|
|
127
|
+
name,
|
|
128
|
+
rootPath,
|
|
129
|
+
kind: 'workspace',
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return [...byId.values()];
|
|
134
|
+
}
|
|
135
|
+
function listHarmonyProjectModulesLoose(projectRoot) {
|
|
136
|
+
const strict = (0, arkts_1.listHarmonyProjectModules)(projectRoot);
|
|
137
|
+
if (strict.length > 0)
|
|
138
|
+
return strict;
|
|
139
|
+
// Real DevEco `build-profile.json5` often uses unquoted keys; the strict
|
|
140
|
+
// parser only strips comments/trailing commas. Quote bare keys and retry.
|
|
141
|
+
const profilePath = path.join(projectRoot, 'build-profile.json5');
|
|
142
|
+
if (!fs.existsSync(profilePath))
|
|
143
|
+
return [];
|
|
144
|
+
let raw;
|
|
145
|
+
try {
|
|
146
|
+
const text = fs.readFileSync(profilePath, 'utf-8');
|
|
147
|
+
const stripped = text
|
|
148
|
+
.replace(/\/\/.*$/gm, '')
|
|
149
|
+
.replace(/\/\*[\s\S]*?\*\//g, '')
|
|
150
|
+
.replace(/,(\s*[}\]])/g, '$1')
|
|
151
|
+
.replace(/([{,]\s*)([A-Za-z_][\w]*)\s*:/g, '$1"$2":');
|
|
152
|
+
raw = JSON.parse(stripped);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
if (!raw || typeof raw !== 'object')
|
|
158
|
+
return [];
|
|
159
|
+
const modules = raw.modules;
|
|
160
|
+
if (!Array.isArray(modules))
|
|
161
|
+
return [];
|
|
162
|
+
const out = [];
|
|
163
|
+
for (const entry of modules) {
|
|
164
|
+
if (!entry || typeof entry !== 'object')
|
|
165
|
+
continue;
|
|
166
|
+
const rec = entry;
|
|
167
|
+
if (typeof rec.name !== 'string' || typeof rec.srcPath !== 'string')
|
|
168
|
+
continue;
|
|
169
|
+
const srcPath = (0, arkts_1.normalizeHarmonyModuleSrcPath)(rec.srcPath);
|
|
170
|
+
if (!srcPath)
|
|
171
|
+
continue;
|
|
172
|
+
out.push({ name: rec.name, srcPath });
|
|
173
|
+
}
|
|
174
|
+
return out;
|
|
175
|
+
}
|
|
176
|
+
function discoverOhpmPackages(projectRoot) {
|
|
177
|
+
const out = [];
|
|
178
|
+
const queue = [{ rel: '', depth: 0 }];
|
|
179
|
+
let visited = 0;
|
|
180
|
+
while (queue.length > 0) {
|
|
181
|
+
const { rel, depth } = queue.shift();
|
|
182
|
+
if (++visited > OHPM_WALK_DIR_BUDGET)
|
|
183
|
+
break;
|
|
184
|
+
const abs = path.join(projectRoot, rel);
|
|
185
|
+
let entries;
|
|
186
|
+
try {
|
|
187
|
+
entries = fs.readdirSync(abs, { withFileTypes: true });
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
for (const e of entries) {
|
|
193
|
+
if (e.isDirectory()) {
|
|
194
|
+
if (depth >= OHPM_WALK_MAX_DEPTH)
|
|
195
|
+
continue;
|
|
196
|
+
if (e.name.startsWith('.') || OHPM_SKIP_DIRS.has(e.name))
|
|
197
|
+
continue;
|
|
198
|
+
queue.push({ rel: rel ? `${rel}/${e.name}` : e.name, depth: depth + 1 });
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
if (e.name !== OHPM_MANIFEST)
|
|
202
|
+
continue;
|
|
203
|
+
const pkgName = readOhpmName(path.join(abs, e.name));
|
|
204
|
+
const rootPath = rel.replace(/\\/g, '/');
|
|
205
|
+
// Skip the synthetic root duplicate when root itself has oh-package.json5 —
|
|
206
|
+
// root catch-all already covers it; named modules are subdirs.
|
|
207
|
+
if (!rootPath)
|
|
208
|
+
continue;
|
|
209
|
+
out.push({
|
|
210
|
+
id: moduleIdForPath(rootPath),
|
|
211
|
+
name: pkgName || path.basename(rootPath),
|
|
212
|
+
rootPath,
|
|
213
|
+
kind: 'ohpm',
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return out;
|
|
218
|
+
}
|
|
219
|
+
function readOhpmName(manifestAbs) {
|
|
220
|
+
try {
|
|
221
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
222
|
+
const parsed = require('jsonc-parser').parse(fs.readFileSync(manifestAbs, 'utf-8'));
|
|
223
|
+
return typeof parsed?.name === 'string' && parsed.name.trim() ? parsed.name.trim() : null;
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
function moduleIdForPath(rootPath) {
|
|
230
|
+
if (!rootPath)
|
|
231
|
+
return ROOT_MODULE_ID;
|
|
232
|
+
// Stable, path-based id (filesystem-safe).
|
|
233
|
+
return rootPath.replace(/[^a-zA-Z0-9._/-]/g, '_');
|
|
234
|
+
}
|
|
235
|
+
function assignModule(fileRel, modules) {
|
|
236
|
+
const file = fileRel.replace(/\\/g, '/');
|
|
237
|
+
let best = null;
|
|
238
|
+
for (const m of modules) {
|
|
239
|
+
if (!m.rootPath)
|
|
240
|
+
continue; // root catch-all last
|
|
241
|
+
if (file === m.rootPath || file.startsWith(`${m.rootPath}/`)) {
|
|
242
|
+
if (!best || m.rootPath.length > best.rootPath.length)
|
|
243
|
+
best = m;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (best)
|
|
247
|
+
return best;
|
|
248
|
+
return modules.find((m) => m.id === ROOT_MODULE_ID) ?? modules[0];
|
|
249
|
+
}
|
|
250
|
+
function parseBuildPhase(raw) {
|
|
251
|
+
if (raw === 'none' ||
|
|
252
|
+
raw === 'building_fast' ||
|
|
253
|
+
raw === 'fast' ||
|
|
254
|
+
raw === 'indexing' ||
|
|
255
|
+
raw === 'full') {
|
|
256
|
+
return raw;
|
|
257
|
+
}
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/project-map/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface LiteralEvidenceHit {
|
|
2
|
+
kind: 'source_literal' | 'resource_reference';
|
|
3
|
+
filePath: string;
|
|
4
|
+
line: number;
|
|
5
|
+
startLine: number;
|
|
6
|
+
endLine: number;
|
|
7
|
+
text: string;
|
|
8
|
+
literal: string;
|
|
9
|
+
resource?: {
|
|
10
|
+
filePath: string;
|
|
11
|
+
line: number;
|
|
12
|
+
key: string;
|
|
13
|
+
value: string;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface LiteralEvidenceResult {
|
|
17
|
+
hits: LiteralEvidenceHit[];
|
|
18
|
+
stats: {
|
|
19
|
+
filesVisited: number;
|
|
20
|
+
filesRead: number;
|
|
21
|
+
bytesRead: number;
|
|
22
|
+
durationMs: number;
|
|
23
|
+
};
|
|
24
|
+
truncated: boolean;
|
|
25
|
+
limitsHit: string[];
|
|
26
|
+
}
|
|
27
|
+
export interface LiteralEvidenceOptions {
|
|
28
|
+
literalTexts: string[];
|
|
29
|
+
/** Indexed paths are prioritized, but resources and unindexed UI files are also discoverable. */
|
|
30
|
+
files?: string[];
|
|
31
|
+
maxFiles?: number;
|
|
32
|
+
maxBytes?: number;
|
|
33
|
+
maxFileBytes?: number;
|
|
34
|
+
maxDurationMs?: number;
|
|
35
|
+
maxHits?: number;
|
|
36
|
+
}
|
|
37
|
+
/** Strings are data, never regexes, paths, or commands. */
|
|
38
|
+
export declare function normalizeLiteralTexts(value: unknown): string[];
|
|
39
|
+
/**
|
|
40
|
+
* Follow only resource-value -> exact $r('app.string.key') source references.
|
|
41
|
+
* A text match is an observed source location, not proof that the whole flow is resolved.
|
|
42
|
+
*/
|
|
43
|
+
export declare function findLiteralEvidence(projectRoot: string, options: LiteralEvidenceOptions): LiteralEvidenceResult;
|
|
44
|
+
//# sourceMappingURL=literal-evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literal-evidence.d.ts","sourceRoot":"","sources":["../../src/search/literal-evidence.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,gBAAgB,GAAG,oBAAoB,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3E;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1F,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iGAAiG;IACjG,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAWD,2DAA2D;AAC3D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAI9D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,qBAAqB,CA8J/G"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.normalizeLiteralTexts = normalizeLiteralTexts;
|
|
40
|
+
exports.findLiteralEvidence = findLiteralEvidence;
|
|
41
|
+
/** Bounded, project-local source witnesses for verbatim UI text. */
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const ignore_1 = __importDefault(require("ignore"));
|
|
45
|
+
const jsonc_parser_1 = require("jsonc-parser");
|
|
46
|
+
const utils_1 = require("../utils");
|
|
47
|
+
const SOURCE_EXTENSIONS = new Set([
|
|
48
|
+
'.ets', '.ts', '.tsx', '.js', '.jsx', '.vue', '.svelte', '.cpp', '.cc', '.c',
|
|
49
|
+
'.h', '.hpp', '.java', '.kt', '.swift', '.dart', '.html', '.xml', '.qml',
|
|
50
|
+
]);
|
|
51
|
+
const SKIP_DIRS = new Set(['node_modules', 'oh_modules', '.git', '.homegraph', '.hvigor', 'dist', 'build', 'coverage']);
|
|
52
|
+
const resourceFile = (file) => /(?:^|\/)resources\/[^\n]*\/element\/string\.json$/i.test(file);
|
|
53
|
+
const allowedFile = (file) => resourceFile(file)
|
|
54
|
+
|| (SOURCE_EXTENSIONS.has(path.extname(file).toLowerCase()) && !/\.d\.ts$|\.min\.js$/i.test(file));
|
|
55
|
+
/** Strings are data, never regexes, paths, or commands. */
|
|
56
|
+
function normalizeLiteralTexts(value) {
|
|
57
|
+
if (!Array.isArray(value))
|
|
58
|
+
return [];
|
|
59
|
+
return [...new Set(value.slice(0, 8).filter((x) => typeof x === 'string')
|
|
60
|
+
.map(x => x.trim()).filter(x => x.length >= 2 && x.length <= 160 && !/[\u0000-\u001f\u007f]/.test(x)))];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Follow only resource-value -> exact $r('app.string.key') source references.
|
|
64
|
+
* A text match is an observed source location, not proof that the whole flow is resolved.
|
|
65
|
+
*/
|
|
66
|
+
function findLiteralEvidence(projectRoot, options) {
|
|
67
|
+
const started = Date.now();
|
|
68
|
+
const result = {
|
|
69
|
+
hits: [], stats: { filesVisited: 0, filesRead: 0, bytesRead: 0, durationMs: 0 }, truncated: false, limitsHit: [],
|
|
70
|
+
};
|
|
71
|
+
const texts = normalizeLiteralTexts(options.literalTexts);
|
|
72
|
+
if (!texts.length)
|
|
73
|
+
return result;
|
|
74
|
+
const bound = (value, fallback, ceiling) => typeof value === 'number' && Number.isFinite(value) ? Math.max(1, Math.min(ceiling, Math.floor(value))) : fallback;
|
|
75
|
+
const maxFiles = bound(options.maxFiles, 2000, 4000);
|
|
76
|
+
const maxBytes = bound(options.maxBytes, 12 * 1024 * 1024, 24 * 1024 * 1024);
|
|
77
|
+
const maxFileBytes = bound(options.maxFileBytes, 512 * 1024, 1024 * 1024);
|
|
78
|
+
const maxDurationMs = bound(options.maxDurationMs, 600, 1500);
|
|
79
|
+
const maxHits = bound(options.maxHits, 12, 24);
|
|
80
|
+
const mark = (reason) => {
|
|
81
|
+
result.truncated = true;
|
|
82
|
+
if (!result.limitsHit.includes(reason))
|
|
83
|
+
result.limitsHit.push(reason);
|
|
84
|
+
};
|
|
85
|
+
const timedOut = () => {
|
|
86
|
+
if (Date.now() - started < maxDurationMs)
|
|
87
|
+
return false;
|
|
88
|
+
mark('time');
|
|
89
|
+
return true;
|
|
90
|
+
};
|
|
91
|
+
const root = path.resolve(projectRoot);
|
|
92
|
+
const rules = new Map();
|
|
93
|
+
const loadIgnore = (directory) => {
|
|
94
|
+
const candidate = (0, utils_1.validatePathWithinRoot)(root, path.join(directory, '.gitignore'));
|
|
95
|
+
if (!candidate)
|
|
96
|
+
return;
|
|
97
|
+
try {
|
|
98
|
+
if (fs.lstatSync(candidate).isFile() && fs.statSync(candidate).size <= 64 * 1024) {
|
|
99
|
+
rules.set(directory, (0, ignore_1.default)().add(fs.readFileSync(candidate, 'utf8')));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch { /* A missing or unreadable ignore file is ordinary. */ }
|
|
103
|
+
};
|
|
104
|
+
const ignored = (relative, directory = false) => {
|
|
105
|
+
if (relative.split('/').some(part => SKIP_DIRS.has(part) || part.startsWith('.')))
|
|
106
|
+
return true;
|
|
107
|
+
for (const [base, matcher] of rules) {
|
|
108
|
+
const rel = path.relative(base, path.join(root, relative)).split(path.sep).join('/');
|
|
109
|
+
if (rel && !rel.startsWith('../') && matcher.ignores(rel + (directory ? '/' : '')))
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
return false;
|
|
113
|
+
};
|
|
114
|
+
loadIgnore(root);
|
|
115
|
+
const candidates = new Set();
|
|
116
|
+
// A deterministic bounded walk also discovers resource files excluded by AST indexing.
|
|
117
|
+
const directories = [root];
|
|
118
|
+
let entriesVisited = 0;
|
|
119
|
+
for (let cursor = 0; cursor < directories.length && !timedOut(); cursor++) {
|
|
120
|
+
const directory = directories[cursor];
|
|
121
|
+
loadIgnore(directory);
|
|
122
|
+
let entries;
|
|
123
|
+
try {
|
|
124
|
+
entries = fs.readdirSync(directory, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
for (const entry of entries) {
|
|
130
|
+
if (++entriesVisited > maxFiles * 4) {
|
|
131
|
+
mark('entries');
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
if (timedOut())
|
|
135
|
+
break;
|
|
136
|
+
const relative = path.relative(root, path.join(directory, entry.name)).split(path.sep).join('/');
|
|
137
|
+
if (entry.isSymbolicLink() || ignored(relative, entry.isDirectory()))
|
|
138
|
+
continue;
|
|
139
|
+
if (entry.isDirectory())
|
|
140
|
+
directories.push(path.join(directory, entry.name));
|
|
141
|
+
else if (entry.isFile() && allowedFile(relative))
|
|
142
|
+
candidates.add(relative);
|
|
143
|
+
}
|
|
144
|
+
if (entriesVisited > maxFiles * 4)
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
for (const file of (options.files ?? []).slice(0, maxFiles * 2)) {
|
|
148
|
+
const relative = path.relative(root, path.resolve(root, file)).split(path.sep).join('/');
|
|
149
|
+
if (!relative.startsWith('../') && !ignored(relative) && allowedFile(relative))
|
|
150
|
+
candidates.add(relative);
|
|
151
|
+
}
|
|
152
|
+
// UI/managed source is a separate entry modality; native graph density cannot starve it.
|
|
153
|
+
const priority = (file) => resourceFile(file) ? 0 : /\.(ets|tsx|jsx|vue|svelte)$/i.test(file) ? 1 : 2;
|
|
154
|
+
const sorted = [...candidates].sort((a, b) => priority(a) - priority(b) || a.localeCompare(b));
|
|
155
|
+
const resources = [];
|
|
156
|
+
const read = (relative) => {
|
|
157
|
+
if (timedOut())
|
|
158
|
+
return undefined;
|
|
159
|
+
if (result.stats.filesVisited >= maxFiles) {
|
|
160
|
+
mark('files');
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
result.stats.filesVisited++;
|
|
164
|
+
const absolute = (0, utils_1.validatePathWithinRoot)(root, relative);
|
|
165
|
+
if (!absolute)
|
|
166
|
+
return undefined;
|
|
167
|
+
try {
|
|
168
|
+
const st = fs.lstatSync(absolute);
|
|
169
|
+
if (!st.isFile())
|
|
170
|
+
return undefined;
|
|
171
|
+
if (st.size > maxFileBytes) {
|
|
172
|
+
mark('file_bytes');
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
if (result.stats.bytesRead + st.size > maxBytes) {
|
|
176
|
+
mark('bytes');
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
const data = fs.readFileSync(absolute, 'utf8');
|
|
180
|
+
result.stats.filesRead++;
|
|
181
|
+
result.stats.bytesRead += Buffer.byteLength(data);
|
|
182
|
+
return data.includes('\0') ? undefined : data;
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
const append = (file, content, offset, literal, resource) => {
|
|
189
|
+
const line = content.slice(0, offset).split('\n').length;
|
|
190
|
+
if (result.hits.some(hit => hit.filePath === file && hit.line === line))
|
|
191
|
+
return;
|
|
192
|
+
if (result.hits.length >= maxHits) {
|
|
193
|
+
mark('hits');
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const lines = content.split('\n');
|
|
197
|
+
// Grow a contiguous range around the matching line. Never spend the whole
|
|
198
|
+
// snippet on preceding boilerplate and silently omit the witness itself.
|
|
199
|
+
let startLine = line;
|
|
200
|
+
let endLine = line;
|
|
201
|
+
let chars = (lines[line - 1]?.length ?? 0) + 1;
|
|
202
|
+
if (chars > 2400) {
|
|
203
|
+
mark('snippet');
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
while (endLine < Math.min(lines.length, line + 12)
|
|
207
|
+
&& chars + (lines[endLine]?.length ?? 0) + 1 <= 2400) {
|
|
208
|
+
chars += (lines[endLine]?.length ?? 0) + 1;
|
|
209
|
+
endLine++;
|
|
210
|
+
}
|
|
211
|
+
while (startLine > Math.max(1, line - 8)
|
|
212
|
+
&& chars + (lines[startLine - 2]?.length ?? 0) + 1 <= 2400) {
|
|
213
|
+
chars += (lines[startLine - 2]?.length ?? 0) + 1;
|
|
214
|
+
startLine--;
|
|
215
|
+
}
|
|
216
|
+
if (startLine > Math.max(1, line - 8) || endLine < Math.min(lines.length, line + 12))
|
|
217
|
+
mark('snippet');
|
|
218
|
+
const emitted = lines.slice(startLine - 1, endLine);
|
|
219
|
+
result.hits.push({ kind: resource ? 'resource_reference' : 'source_literal', filePath: file,
|
|
220
|
+
line, startLine, endLine: startLine + emitted.length - 1, text: emitted.join('\n'), literal,
|
|
221
|
+
...(resource ? { resource } : {}) });
|
|
222
|
+
};
|
|
223
|
+
for (const file of sorted) {
|
|
224
|
+
if (timedOut() || result.stats.filesVisited >= maxFiles || result.stats.bytesRead >= maxBytes) {
|
|
225
|
+
if (result.stats.filesVisited >= maxFiles)
|
|
226
|
+
mark('files');
|
|
227
|
+
if (result.stats.bytesRead >= maxBytes)
|
|
228
|
+
mark('bytes');
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
const content = read(file);
|
|
232
|
+
if (content === undefined)
|
|
233
|
+
continue;
|
|
234
|
+
if (resourceFile(file)) {
|
|
235
|
+
const data = (0, jsonc_parser_1.parse)(content, undefined, { allowTrailingComma: true });
|
|
236
|
+
let visited = 0;
|
|
237
|
+
const visit = (value, depth) => {
|
|
238
|
+
if (++visited > 10000 || depth > 12 || timedOut() || !value || typeof value !== 'object')
|
|
239
|
+
return;
|
|
240
|
+
if (Array.isArray(value)) {
|
|
241
|
+
for (const item of value)
|
|
242
|
+
visit(item, depth + 1);
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
const entry = value;
|
|
246
|
+
if (typeof entry.name === 'string' && typeof entry.value === 'string' && /^[A-Za-z_][\w]*$/.test(entry.name)) {
|
|
247
|
+
for (const literal of texts) {
|
|
248
|
+
if (entry.value.toLocaleLowerCase().includes(literal.toLocaleLowerCase()) && resources.length < 64) {
|
|
249
|
+
resources.push({ literal, filePath: file, line: content.slice(0, content.indexOf(JSON.stringify(entry.name))).split('\n').length,
|
|
250
|
+
key: entry.name, value: entry.value.slice(0, 200) });
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
for (const child of Object.values(entry))
|
|
255
|
+
visit(child, depth + 1);
|
|
256
|
+
};
|
|
257
|
+
visit(data, 0);
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
for (const literal of texts) {
|
|
261
|
+
// Exact text witnesses do not reinterpret regex metacharacters or tokenize labels.
|
|
262
|
+
const offset = content.toLocaleLowerCase().indexOf(literal.toLocaleLowerCase());
|
|
263
|
+
if (offset >= 0)
|
|
264
|
+
append(file, content, offset, literal);
|
|
265
|
+
}
|
|
266
|
+
const reference = /\$r\s*\(\s*(['"])(?:app|[A-Za-z_]\w*)\.string\.([A-Za-z_]\w*)\1\s*\)/g;
|
|
267
|
+
let match;
|
|
268
|
+
while ((match = reference.exec(content)) !== null) {
|
|
269
|
+
for (const resource of resources) {
|
|
270
|
+
if (resource.key === match[2])
|
|
271
|
+
append(file, content, match.index, resource.literal, resource);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
result.stats.durationMs = Date.now() - started;
|
|
276
|
+
return result;
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=literal-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literal-evidence.js","sourceRoot":"","sources":["../../src/search/literal-evidence.ts"],"names":[],"mappings":"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"}
|