homegraph 1.5.0 → 1.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/command-supervision.d.ts.map +1 -1
- package/dist/bin/command-supervision.js +7 -4
- package/dist/bin/command-supervision.js.map +1 -1
- package/dist/extraction/index.d.ts +1 -1
- package/dist/extraction/index.d.ts.map +1 -1
- package/dist/extraction/index.js +54 -43
- package/dist/extraction/index.js.map +1 -1
- package/dist/extraction/languages/arkts.d.ts +69 -12
- package/dist/extraction/languages/arkts.d.ts.map +1 -1
- package/dist/extraction/languages/arkts.js +739 -86
- package/dist/extraction/languages/arkts.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/diff-impact.d.ts +131 -0
- package/dist/mcp/diff-impact.d.ts.map +1 -0
- package/dist/mcp/diff-impact.js +385 -0
- package/dist/mcp/diff-impact.js.map +1 -0
- package/dist/mcp/liveness-watchdog.d.ts +18 -0
- package/dist/mcp/liveness-watchdog.d.ts.map +1 -1
- package/dist/mcp/liveness-watchdog.js +134 -22
- package/dist/mcp/liveness-watchdog.js.map +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.d.ts.map +1 -1
- package/dist/mcp/server-instructions.js +2 -0
- package/dist/mcp/server-instructions.js.map +1 -1
- package/dist/mcp/tools.d.ts +21 -5
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +305 -55
- package/dist/mcp/tools.js.map +1 -1
- package/dist/resolution/callback-synthesizer.d.ts +2 -1
- package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
- package/dist/resolution/callback-synthesizer.js +153 -53
- package/dist/resolution/callback-synthesizer.js.map +1 -1
- package/dist/resolution/frameworks/arkts-entry.d.ts.map +1 -1
- package/dist/resolution/frameworks/arkts-entry.js +20 -9
- package/dist/resolution/frameworks/arkts-entry.js.map +1 -1
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +1 -1
- package/dist/resolution/index.js.map +1 -1
- package/dist/resolution/memory-budget.d.ts +33 -0
- package/dist/resolution/memory-budget.d.ts.map +1 -1
- package/dist/resolution/memory-budget.js +58 -0
- package/dist/resolution/memory-budget.js.map +1 -1
- package/dist/resolution/resolver-pool.d.ts +2 -0
- package/dist/resolution/resolver-pool.d.ts.map +1 -1
- package/dist/resolution/resolver-pool.js +4 -0
- package/dist/resolution/resolver-pool.js.map +1 -1
- package/dist/ui/shimmer-progress.d.ts.map +1 -1
- package/dist/ui/shimmer-progress.js +4 -1
- package/dist/ui/shimmer-progress.js.map +1 -1
- package/package.json +4 -5
- package/dist/arkts/ohos-api-index.d.ts +0 -15
- package/dist/arkts/ohos-api-index.d.ts.map +0 -1
- package/dist/arkts/ohos-api-index.js +0 -190
- package/dist/arkts/ohos-api-index.js.map +0 -1
- package/dist/arkts/ohos-sdk-input.d.ts +0 -36
- package/dist/arkts/ohos-sdk-input.d.ts.map +0 -1
- package/dist/arkts/ohos-sdk-input.js +0 -214
- package/dist/arkts/ohos-sdk-input.js.map +0 -1
- package/dist/extraction/languages/arkts-state-decorators.d.ts +0 -13
- package/dist/extraction/languages/arkts-state-decorators.d.ts.map +0 -1
- package/dist/extraction/languages/arkts-state-decorators.js +0 -26
- package/dist/extraction/languages/arkts-state-decorators.js.map +0 -1
- package/dist/extraction/languages/arkts-viewtree.d.ts +0 -24
- package/dist/extraction/languages/arkts-viewtree.d.ts.map +0 -1
- package/dist/extraction/languages/arkts-viewtree.js +0 -148
- package/dist/extraction/languages/arkts-viewtree.js.map +0 -1
- package/dist/extraction/languages/ohos-api-consumer.d.ts +0 -34
- package/dist/extraction/languages/ohos-api-consumer.d.ts.map +0 -1
- package/dist/extraction/languages/ohos-api-consumer.js +0 -283
- package/dist/extraction/languages/ohos-api-consumer.js.map +0 -1
- package/dist/reasoning/config.d.ts +0 -45
- package/dist/reasoning/config.d.ts.map +0 -1
- package/dist/reasoning/config.js +0 -171
- package/dist/reasoning/config.js.map +0 -1
- package/dist/reasoning/credentials.d.ts +0 -5
- package/dist/reasoning/credentials.d.ts.map +0 -1
- package/dist/reasoning/credentials.js +0 -83
- package/dist/reasoning/credentials.js.map +0 -1
- package/dist/reasoning/login.d.ts +0 -21
- package/dist/reasoning/login.d.ts.map +0 -1
- package/dist/reasoning/login.js +0 -85
- package/dist/reasoning/login.js.map +0 -1
- package/dist/reasoning/reasoner.d.ts +0 -43
- package/dist/reasoning/reasoner.d.ts.map +0 -1
- package/dist/reasoning/reasoner.js +0 -308
- package/dist/reasoning/reasoner.js.map +0 -1
- package/dist/spec/build/git-scanner.d.ts +0 -93
- package/dist/spec/build/git-scanner.d.ts.map +0 -1
- package/dist/spec/build/git-scanner.js +0 -254
- package/dist/spec/build/git-scanner.js.map +0 -1
- package/dist/spec/evolve/llm-client.d.ts +0 -50
- package/dist/spec/evolve/llm-client.d.ts.map +0 -1
- package/dist/spec/evolve/llm-client.js +0 -176
- package/dist/spec/evolve/llm-client.js.map +0 -1
- package/dist/spec/evolve/logic-checker.d.ts +0 -12
- package/dist/spec/evolve/logic-checker.d.ts.map +0 -1
- package/dist/spec/evolve/logic-checker.js +0 -24
- package/dist/spec/evolve/logic-checker.js.map +0 -1
- package/dist/spec/git-utils.d.ts +0 -8
- package/dist/spec/git-utils.d.ts.map +0 -1
- package/dist/spec/git-utils.js +0 -14
- package/dist/spec/git-utils.js.map +0 -1
- package/dist/spec/llm/index.d.ts +0 -3
- package/dist/spec/llm/index.d.ts.map +0 -1
- package/dist/spec/llm/index.js +0 -11
- package/dist/spec/llm/index.js.map +0 -1
- package/dist/spec/mine/clusterer.d.ts +0 -63
- package/dist/spec/mine/clusterer.d.ts.map +0 -1
- package/dist/spec/mine/clusterer.js +0 -904
- package/dist/spec/mine/clusterer.js.map +0 -1
- package/dist/spec/mine/progress-handler.d.ts +0 -22
- package/dist/spec/mine/progress-handler.d.ts.map +0 -1
- package/dist/spec/mine/progress-handler.js +0 -108
- package/dist/spec/mine/progress-handler.js.map +0 -1
- package/dist/spec/mine/progress.d.ts +0 -23
- package/dist/spec/mine/progress.d.ts.map +0 -1
- package/dist/spec/mine/progress.js +0 -12
- package/dist/spec/mine/progress.js.map +0 -1
- package/dist/spec/mining/diff-parser.d.ts +0 -33
- package/dist/spec/mining/diff-parser.d.ts.map +0 -1
- package/dist/spec/mining/diff-parser.js +0 -166
- package/dist/spec/mining/diff-parser.js.map +0 -1
- package/dist/spec/mining/git-scanner.d.ts +0 -103
- package/dist/spec/mining/git-scanner.d.ts.map +0 -1
- package/dist/spec/mining/git-scanner.js +0 -307
- package/dist/spec/mining/git-scanner.js.map +0 -1
- package/dist/spec/mining/pipeline.d.ts +0 -53
- package/dist/spec/mining/pipeline.d.ts.map +0 -1
- package/dist/spec/mining/pipeline.js +0 -178
- package/dist/spec/mining/pipeline.js.map +0 -1
- package/dist/spec/mining/scope-resolver.d.ts +0 -45
- package/dist/spec/mining/scope-resolver.d.ts.map +0 -1
- package/dist/spec/mining/scope-resolver.js +0 -103
- package/dist/spec/mining/scope-resolver.js.map +0 -1
- package/dist/spec/mining/spec-extractor.d.ts +0 -69
- package/dist/spec/mining/spec-extractor.d.ts.map +0 -1
- package/dist/spec/mining/spec-extractor.js +0 -369
- package/dist/spec/mining/spec-extractor.js.map +0 -1
- package/dist/spec/utils.d.ts +0 -155
- package/dist/spec/utils.d.ts.map +0 -1
- package/dist/spec/utils.js +0 -411
- package/dist/spec/utils.js.map +0 -1
- package/scripts/add-lang/bench.sh +0 -60
- package/scripts/add-lang/check-grammar.mjs +0 -75
- package/scripts/add-lang/dump-ast.mjs +0 -103
- package/scripts/add-lang/verify-extraction.mjs +0 -70
- package/scripts/agent-eval/ab-adoption.sh +0 -91
- package/scripts/agent-eval/ab-hook.sh +0 -86
- package/scripts/agent-eval/ab-impl.sh +0 -78
- package/scripts/agent-eval/ab-new-vs-baseline.sh +0 -102
- package/scripts/agent-eval/ab-sufficiency.sh +0 -78
- package/scripts/agent-eval/arms-F.sh +0 -21
- package/scripts/agent-eval/arms-matrix.sh +0 -37
- package/scripts/agent-eval/audit.sh +0 -68
- package/scripts/agent-eval/bench-readme.sh +0 -28
- package/scripts/agent-eval/bench-why-repo.sh +0 -22
- package/scripts/agent-eval/block-read-hook.sh +0 -19
- package/scripts/agent-eval/hook-settings.json +0 -15
- package/scripts/agent-eval/itrun.sh +0 -120
- package/scripts/agent-eval/offload-eval-3arm.sh +0 -72
- package/scripts/agent-eval/offload-eval-cost.mjs +0 -133
- package/scripts/agent-eval/offload-eval-effort.mjs +0 -108
- package/scripts/agent-eval/offload-eval-frontload-matrix.sh +0 -25
- package/scripts/agent-eval/offload-eval-frontload.sh +0 -47
- package/scripts/agent-eval/offload-eval-ground-truth.json +0 -18
- package/scripts/agent-eval/offload-eval-hook.mjs +0 -84
- package/scripts/agent-eval/offload-eval-judge.mjs +0 -103
- package/scripts/agent-eval/offload-eval-matrix.sh +0 -20
- package/scripts/agent-eval/offload-eval-metrics.mjs +0 -94
- package/scripts/agent-eval/offload-eval-refs1.sh +0 -50
- package/scripts/agent-eval/offload-eval-setup.sh +0 -24
- package/scripts/agent-eval/offload-eval-styles.sh +0 -72
- package/scripts/agent-eval/offload-eval-summarize.mjs +0 -68
- package/scripts/agent-eval/offload-eval.md +0 -76
- package/scripts/agent-eval/parse-arms.mjs +0 -116
- package/scripts/agent-eval/parse-bench-readme.mjs +0 -84
- package/scripts/agent-eval/parse-run.mjs +0 -45
- package/scripts/agent-eval/parse-session.mjs +0 -93
- package/scripts/agent-eval/probe-context.mjs +0 -21
- package/scripts/agent-eval/probe-explore.mjs +0 -40
- package/scripts/agent-eval/probe-node.mjs +0 -20
- package/scripts/agent-eval/probe-sweep.mjs +0 -119
- package/scripts/agent-eval/probe-trace.mjs +0 -20
- package/scripts/agent-eval/redirect-read-hook.sh +0 -38
- package/scripts/agent-eval/repro-concurrent-explore.mjs +0 -119
- package/scripts/agent-eval/repro-daemon-clients.mjs +0 -125
- package/scripts/agent-eval/run-agent.sh +0 -34
- package/scripts/agent-eval/run-all.sh +0 -75
- package/scripts/agent-eval/run-arms.sh +0 -56
- package/scripts/agent-eval/seq-matrix.mjs +0 -137
- package/scripts/build-bundle.sh +0 -123
- package/scripts/exp_boundary_eval/README.md +0 -247
- package/scripts/exp_boundary_eval/_test_mcp_chain.py +0 -78
- package/scripts/exp_boundary_eval/_test_stdin.py +0 -8
- package/scripts/exp_boundary_eval/_utils.py +0 -1116
- package/scripts/exp_boundary_eval/analyze.py +0 -1313
- package/scripts/exp_boundary_eval/deveco_arm.py +0 -519
- package/scripts/exp_boundary_eval/run_all.py +0 -378
- package/scripts/exp_boundary_eval/run_one.py +0 -165
- package/scripts/exp_boundary_eval/run_session.py +0 -158
- package/scripts/exp_boundary_eval/setup.py +0 -120
- package/scripts/exp_boundary_eval/win_mcp_launcher.py +0 -73
- package/scripts/exp_boundary_eval/win_mcp_stdio_wrap.js +0 -36
- package/scripts/exp_boundary_eval/win_node_launcher.py +0 -24
- package/scripts/extract-release-notes.mjs +0 -130
- package/scripts/local-install.sh +0 -41
- package/scripts/npm-sdk.js +0 -75
- package/scripts/npm-shim.js +0 -275
- package/scripts/ohos-sdk-publish.mjs +0 -133
- package/scripts/pack-npm.sh +0 -119
- package/scripts/prepare-release.mjs +0 -270
|
@@ -54,6 +54,7 @@ export declare function synthesizeCallbackEdges(queries: QueryBuilder, ctx: Reso
|
|
|
54
54
|
edges: Edge[];
|
|
55
55
|
ms: number;
|
|
56
56
|
}>;
|
|
57
|
-
|
|
57
|
+
size?: number;
|
|
58
|
+
} | null, backpressure?: () => Promise<void> | null, dbPath?: string): Promise<number>;
|
|
58
59
|
export {};
|
|
59
60
|
//# sourceMappingURL=callback-synthesizer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callback-synthesizer.d.ts","sourceRoot":"","sources":["../../src/resolution/callback-synthesizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAE,IAAI,EAAkB,MAAM,UAAU,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"callback-synthesizer.d.ts","sourceRoot":"","sources":["../../src/resolution/callback-synthesizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAE,IAAI,EAAkB,MAAM,UAAU,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAWjD,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AA64GrE,mGAAmG;AACnG,KAAK,OAAO,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;AAE5C;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;IAChC,GAAG,EAAE,CACH,OAAO,EAAE,YAAY,EACrB,GAAG,EAAE,iBAAiB,EACtB,WAAW,EAAE,UAAU,EACvB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,KACrC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;CACtB;AAsGD;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,EAAE,YAAY,EAiEtC,CAAC;AAIF,eAAO,MAAM,oBAAoB,QAA0C,CAAC;AAC5E,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,YAAY,EACrB,GAAG,EAAE,iBAAiB,EACtB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,EAIlD,IAAI,CAAC,EAAE;IAAE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EAInG,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EAGzC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAwOjB"}
|
|
@@ -1,4 +1,37 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.SYNTH_PROGRESS_STEPS = exports.SYNTH_PASSES = void 0;
|
|
4
37
|
exports.synthesizeCallbackEdges = synthesizeCallbackEdges;
|
|
@@ -6,6 +39,8 @@ const generated_detection_1 = require("../extraction/generated-detection");
|
|
|
6
39
|
const strip_comments_1 = require("./strip-comments");
|
|
7
40
|
const c_fnptr_synthesizer_1 = require("./c-fnptr-synthesizer");
|
|
8
41
|
const goframe_synthesizer_1 = require("./goframe-synthesizer");
|
|
42
|
+
const memory_budget_1 = require("./memory-budget");
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
9
44
|
const arkts_entry_1 = require("./frameworks/arkts-entry");
|
|
10
45
|
const cooperative_yield_1 = require("./cooperative-yield");
|
|
11
46
|
const REGISTRAR_NAME = /^(on[A-Z]\w*|subscribe|addListener|addEventListener|register|watch|listen|addCallback)$/;
|
|
@@ -3818,9 +3853,7 @@ function arktsEntryEdges(queries, ctx) {
|
|
|
3818
3853
|
}
|
|
3819
3854
|
}
|
|
3820
3855
|
}
|
|
3821
|
-
for (const cls of [
|
|
3822
|
-
if (cls.language !== 'arkts')
|
|
3823
|
-
continue;
|
|
3856
|
+
for (const cls of iterateArktsTypeNodes(queries, ['class', 'struct'])) {
|
|
3824
3857
|
const methods = queries
|
|
3825
3858
|
.getOutgoingEdges(cls.id, ['contains'])
|
|
3826
3859
|
.map((e) => queries.getNodeById(e.target))
|
|
@@ -3831,18 +3864,18 @@ function arktsEntryEdges(queries, ctx) {
|
|
|
3831
3864
|
add(onCreate.id, onWindowStageCreate.id, 'arkts-lifecycle', { via: 'ability' });
|
|
3832
3865
|
}
|
|
3833
3866
|
}
|
|
3834
|
-
for (const comp of [
|
|
3835
|
-
|
|
3836
|
-
|
|
3837
|
-
|
|
3838
|
-
|
|
3839
|
-
|
|
3840
|
-
|
|
3841
|
-
|
|
3842
|
-
|
|
3843
|
-
|
|
3844
|
-
|
|
3845
|
-
|
|
3867
|
+
for (const comp of iterateArktsTypeNodes(queries, ['component', 'class', 'struct'])) {
|
|
3868
|
+
let owner = comp;
|
|
3869
|
+
if (comp.kind === 'component') {
|
|
3870
|
+
for (const c of queries.getNodesByFile(comp.filePath)) {
|
|
3871
|
+
if ((c.kind === 'struct' || c.kind === 'class') &&
|
|
3872
|
+
c.language === 'arkts' &&
|
|
3873
|
+
c.name === comp.name) {
|
|
3874
|
+
owner = c;
|
|
3875
|
+
break;
|
|
3876
|
+
}
|
|
3877
|
+
}
|
|
3878
|
+
}
|
|
3846
3879
|
const methods = queries
|
|
3847
3880
|
.getOutgoingEdges(owner.id, ['contains'])
|
|
3848
3881
|
.map((e) => queries.getNodeById(e.target))
|
|
@@ -3859,6 +3892,15 @@ function arktsEntryEdges(queries, ctx) {
|
|
|
3859
3892
|
}
|
|
3860
3893
|
return edges;
|
|
3861
3894
|
}
|
|
3895
|
+
/** Stream ArkTS class/struct/component nodes without materializing full-kind arrays. */
|
|
3896
|
+
function* iterateArktsTypeNodes(queries, kinds) {
|
|
3897
|
+
for (const kind of kinds) {
|
|
3898
|
+
for (const n of queries.iterateNodesByKind(kind)) {
|
|
3899
|
+
if (n.language === 'arkts')
|
|
3900
|
+
yield n;
|
|
3901
|
+
}
|
|
3902
|
+
}
|
|
3903
|
+
}
|
|
3862
3904
|
const ALWAYS = () => true;
|
|
3863
3905
|
/**
|
|
3864
3906
|
* The independent passes, in MERGE ORDER — the first-seen dedup in
|
|
@@ -3875,7 +3917,7 @@ exports.SYNTH_PASSES = [
|
|
|
3875
3917
|
{ name: 'jsxEdges', gate: ALWAYS, run: (_q, c, y) => reactJsxChildEdges(c, y) },
|
|
3876
3918
|
{ name: 'vueEdges', gate: (has) => has('vue'), run: (_q, c, y) => vueTemplateEdges(c, y) },
|
|
3877
3919
|
{ name: 'svelteKitEdges', gate: (has) => has('svelte'), run: (_q, c, y) => svelteKitLoadEdges(c, y) },
|
|
3878
|
-
{ name: 'pascalEdges', gate:
|
|
3920
|
+
{ name: 'pascalEdges', gate: (has) => has('pascal'), run: (_q, c, y) => pascalFormEdges(c, y) },
|
|
3879
3921
|
{ name: 'flutterEdges', gate: (has) => has('dart'), run: (q, c, y) => flutterBuildEdges(q, c, y) },
|
|
3880
3922
|
{ name: 'arkuiStateEdges', gate: (has) => has('arkts'), run: (q, c, y) => arkuiStateBuildEdges(q, c, y) },
|
|
3881
3923
|
{ name: 'arkuiEmitter', gate: (has) => has('arkts'), run: (_q, c, y) => arkuiEmitterEdges(c, y) },
|
|
@@ -3890,7 +3932,11 @@ exports.SYNTH_PASSES = [
|
|
|
3890
3932
|
{ name: 'kotlinExpectActual', gate: (has) => has('kotlin'), run: (q, _c, y) => kotlinExpectActualEdges(q, y) },
|
|
3891
3933
|
{ name: 'goGrpcEdges', gate: (has) => has('go'), run: (q, _c, y) => goGrpcStubImplEdges(q, y) },
|
|
3892
3934
|
{ name: 'rnEventEdgesList', gate: (has) => has(...JS_FAMILY), run: (_q, c, y) => rnEventEdges(c, y) },
|
|
3893
|
-
{
|
|
3935
|
+
{
|
|
3936
|
+
name: 'fabricNativeEdges',
|
|
3937
|
+
gate: (has) => has(...JS_FAMILY),
|
|
3938
|
+
run: (_q, c, y) => fabricNativeImplEdges(c, y),
|
|
3939
|
+
},
|
|
3894
3940
|
// Expo module nodes (`expo-module:` ids) are emitted only from .swift/.kt
|
|
3895
3941
|
// files, and a pair needs BOTH platforms — so without both languages the
|
|
3896
3942
|
// pass's only collection loop is provably empty (it was streaming every
|
|
@@ -3907,7 +3953,7 @@ exports.SYNTH_PASSES = [
|
|
|
3907
3953
|
},
|
|
3908
3954
|
{ name: 'ginEdges', gate: (has) => has('go'), run: (q, c, y) => ginMiddlewareChainEdges(q, c, y) },
|
|
3909
3955
|
{ name: 'thunkEdges', gate: (has) => has(...JS_FAMILY), run: (q, c, y) => reduxThunkEdges(q, c, y) },
|
|
3910
|
-
{ name: 'registryEdges', gate:
|
|
3956
|
+
{ name: 'registryEdges', gate: (has) => has(...JS_FAMILY), run: (_q, c, y) => objectRegistryEdges(c, y) },
|
|
3911
3957
|
{ name: 'rtkEdges', gate: (has) => has(...JS_FAMILY), run: (q, c, y) => rtkQueryEdges(q, c, y) },
|
|
3912
3958
|
{ name: 'piniaEdges', gate: (has) => has('vue', ...JS_FAMILY), run: (_q, c, y) => piniaStoreEdges(c, y) },
|
|
3913
3959
|
{ name: 'vuexEdges', gate: (has) => has('vue', ...JS_FAMILY), run: (_q, c, y) => vuexDispatchEdges(c, y) },
|
|
@@ -3940,7 +3986,10 @@ pool,
|
|
|
3940
3986
|
// WAL-valve writer backstop (WalCheckpointValve.backpressure), called at
|
|
3941
3987
|
// pool-idle points in the edge-insert loops below — the passes themselves
|
|
3942
3988
|
// only read; every write in this function happens with the pool idle.
|
|
3943
|
-
backpressure
|
|
3989
|
+
backpressure,
|
|
3990
|
+
// On-disk DB path for the same per-pass cost estimate the resolver pool uses.
|
|
3991
|
+
// Optional — falls back to a node/edge-count heuristic when absent.
|
|
3992
|
+
dbPath) {
|
|
3944
3993
|
// Each sub-pass below is a whole-graph scan, and there are ~30 of them, all
|
|
3945
3994
|
// running synchronously on the indexer's main thread. Their AGGREGATE can run
|
|
3946
3995
|
// for well over a minute on a large repo — long enough for the #850 liveness
|
|
@@ -4033,9 +4082,8 @@ backpressure) {
|
|
|
4033
4082
|
// persist until that merge — so every pass sees the same committed
|
|
4034
4083
|
// post-resolution DB state whether it runs sequentially here or on a resolver
|
|
4035
4084
|
// pool worker. With a live pool (already booted on ≥150k-ref repos), passes
|
|
4036
|
-
// fan
|
|
4037
|
-
//
|
|
4038
|
-
// thread, so a worker crash isolates to a retry instead of failing synthesis.
|
|
4085
|
+
// fan across workers up to a memory-budget concurrency (not unbounded
|
|
4086
|
+
// Promise.all) — tight soft `--mem` → serial; large budgets still parallelize.
|
|
4039
4087
|
const passEdges = new Array(exports.SYNTH_PASSES.length).fill(NONE);
|
|
4040
4088
|
const markPass = (label, dt) => {
|
|
4041
4089
|
if (process.env.HOMEGRAPH_SYNTH_TIMINGS && (dt > 250 || process.env.HOMEGRAPH_SYNTH_TIMINGS === 'all')) {
|
|
@@ -4065,42 +4113,94 @@ backpressure) {
|
|
|
4065
4113
|
// main-thread retry keeps coverage. Skipping loses only that pass's
|
|
4066
4114
|
// synthesized edges; the index still completes.
|
|
4067
4115
|
const MAIN_RETRY_MAX_NODES = 1_500_000;
|
|
4068
|
-
const
|
|
4069
|
-
|
|
4070
|
-
|
|
4071
|
-
|
|
4072
|
-
|
|
4073
|
-
|
|
4074
|
-
|
|
4075
|
-
|
|
4076
|
-
}
|
|
4077
|
-
catch (err) {
|
|
4078
|
-
if (graphNodes > MAIN_RETRY_MAX_NODES) {
|
|
4079
|
-
// Worker died at a scale where the main-thread retry is a process
|
|
4080
|
-
// OOM risk: skip the pass, keep the index alive, and say so.
|
|
4081
|
-
console.error(`[synthesis] pass '${pass.name}' failed on a worker at ${graphNodes} nodes — skipped (edges from this pass are absent): ${err instanceof Error ? err.message : String(err)}`);
|
|
4082
|
-
markPass(`${pass.name} (skipped at scale)`, 0);
|
|
4083
|
-
return;
|
|
4084
|
-
}
|
|
4085
|
-
// Worker-side failure (crash, OOM, unknown pass after a version
|
|
4086
|
-
// mismatch): retry this one pass on the main thread.
|
|
4087
|
-
await runPassOnMain(i);
|
|
4088
|
-
}
|
|
4089
|
-
}));
|
|
4116
|
+
const counts = queries.getNodeAndEdgeCount();
|
|
4117
|
+
const graphNodes = counts.nodes;
|
|
4118
|
+
let dbSizeBytes = 0;
|
|
4119
|
+
if (dbPath) {
|
|
4120
|
+
try {
|
|
4121
|
+
dbSizeBytes = fs.statSync(dbPath).size;
|
|
4122
|
+
}
|
|
4123
|
+
catch { /* fresh/missing — heuristic below */ }
|
|
4090
4124
|
}
|
|
4091
|
-
|
|
4125
|
+
if (dbSizeBytes <= 0) {
|
|
4126
|
+
dbSizeBytes = Math.max((counts.nodes + counts.edges) * 200, 64 * 1024 * 1024);
|
|
4127
|
+
}
|
|
4128
|
+
const poolWorkers = pool?.size ?? 0;
|
|
4129
|
+
const budget = (0, memory_budget_1.synthMemoryBudgetBytes)();
|
|
4130
|
+
const concurrency = (0, memory_budget_1.resolveSynthConcurrency)({
|
|
4131
|
+
explicit: process.env.HOMEGRAPH_SYNTH_CONCURRENCY,
|
|
4132
|
+
memoryBudget: budget,
|
|
4133
|
+
dbSizeBytes,
|
|
4134
|
+
poolWorkers,
|
|
4135
|
+
});
|
|
4136
|
+
if (process.env.HOMEGRAPH_SYNTH_TIMINGS) {
|
|
4137
|
+
console.error(`[synth-timing] concurrency=${concurrency} (pool=${poolWorkers} budget=${Math.round(budget / 1024 / 1024)}MB db=${Math.round(dbSizeBytes / 1024 / 1024)}MB)`);
|
|
4138
|
+
}
|
|
4139
|
+
/**
|
|
4140
|
+
* Fold one pass into the ordered first-wins list and drop its array. Used on
|
|
4141
|
+
* the serial path so we never hold every pass's Edge[] at once — but we must
|
|
4142
|
+
* NOT insert into the DB yet: later passes assume the same committed
|
|
4143
|
+
* post-resolution graph (the parallel path's invariant).
|
|
4144
|
+
*/
|
|
4145
|
+
const mergedSerial = [];
|
|
4146
|
+
const seenKeys = new Set();
|
|
4147
|
+
const foldPassEdges = (edges) => {
|
|
4148
|
+
for (const e of edges) {
|
|
4149
|
+
const key = `${e.source}>${e.target}`;
|
|
4150
|
+
if (seenKeys.has(key))
|
|
4151
|
+
continue;
|
|
4152
|
+
seenKeys.add(key);
|
|
4153
|
+
mergedSerial.push(e);
|
|
4154
|
+
}
|
|
4155
|
+
};
|
|
4156
|
+
const runPassOnPool = async (i) => {
|
|
4157
|
+
const pass = exports.SYNTH_PASSES[i];
|
|
4158
|
+
try {
|
|
4159
|
+
const out = await pool.runSynthPass(pass.name);
|
|
4160
|
+
passEdges[i] = out.edges;
|
|
4161
|
+
markPass(pass.name, out.ms);
|
|
4162
|
+
}
|
|
4163
|
+
catch (err) {
|
|
4164
|
+
if (graphNodes > MAIN_RETRY_MAX_NODES) {
|
|
4165
|
+
console.error(`[synthesis] pass '${pass.name}' failed on a worker at ${graphNodes} nodes — skipped (edges from this pass are absent): ${err instanceof Error ? err.message : String(err)}`);
|
|
4166
|
+
markPass(`${pass.name} (skipped at scale)`, 0);
|
|
4167
|
+
return;
|
|
4168
|
+
}
|
|
4169
|
+
await runPassOnMain(i);
|
|
4170
|
+
}
|
|
4171
|
+
};
|
|
4172
|
+
// Serial (concurrency 1): registry order + fold-as-you-go (no mid-pass DB
|
|
4173
|
+
// writes). Parallel: limited fan-out across the pool, hold results until
|
|
4174
|
+
// ordered merge.
|
|
4175
|
+
let serialFold = false;
|
|
4176
|
+
if (!pool || concurrency <= 1 || gatedIn.length <= 1) {
|
|
4177
|
+
serialFold = true;
|
|
4092
4178
|
for (const i of gatedIn) {
|
|
4093
4179
|
await runPassOnMain(i);
|
|
4180
|
+
foldPassEdges(passEdges[i]);
|
|
4181
|
+
passEdges[i] = NONE;
|
|
4094
4182
|
}
|
|
4095
4183
|
}
|
|
4096
|
-
|
|
4097
|
-
|
|
4098
|
-
|
|
4099
|
-
|
|
4100
|
-
|
|
4101
|
-
|
|
4102
|
-
|
|
4103
|
-
|
|
4184
|
+
else {
|
|
4185
|
+
let next = 0;
|
|
4186
|
+
const runners = Array.from({ length: Math.min(concurrency, gatedIn.length) }, async () => {
|
|
4187
|
+
while (next < gatedIn.length) {
|
|
4188
|
+
const idx = next++;
|
|
4189
|
+
await runPassOnPool(gatedIn[idx]);
|
|
4190
|
+
}
|
|
4191
|
+
});
|
|
4192
|
+
await Promise.all(runners);
|
|
4193
|
+
}
|
|
4194
|
+
const merged = serialFold ? mergedSerial : [];
|
|
4195
|
+
if (!serialFold) {
|
|
4196
|
+
const seen = new Set();
|
|
4197
|
+
for (const e of passEdges.flat()) {
|
|
4198
|
+
const key = `${e.source}>${e.target}`;
|
|
4199
|
+
if (seen.has(key))
|
|
4200
|
+
continue;
|
|
4201
|
+
seen.add(key);
|
|
4202
|
+
merged.push(e);
|
|
4203
|
+
}
|
|
4104
4204
|
}
|
|
4105
4205
|
__mark('dedupe-merge');
|
|
4106
4206
|
// Chunked insert with yields: on the Linux kernel the merged synthesized
|