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.
Files changed (213) hide show
  1. package/dist/bin/command-supervision.d.ts.map +1 -1
  2. package/dist/bin/command-supervision.js +7 -4
  3. package/dist/bin/command-supervision.js.map +1 -1
  4. package/dist/extraction/index.d.ts +1 -1
  5. package/dist/extraction/index.d.ts.map +1 -1
  6. package/dist/extraction/index.js +54 -43
  7. package/dist/extraction/index.js.map +1 -1
  8. package/dist/extraction/languages/arkts.d.ts +69 -12
  9. package/dist/extraction/languages/arkts.d.ts.map +1 -1
  10. package/dist/extraction/languages/arkts.js +739 -86
  11. package/dist/extraction/languages/arkts.js.map +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +3 -2
  14. package/dist/index.js.map +1 -1
  15. package/dist/mcp/diff-impact.d.ts +131 -0
  16. package/dist/mcp/diff-impact.d.ts.map +1 -0
  17. package/dist/mcp/diff-impact.js +385 -0
  18. package/dist/mcp/diff-impact.js.map +1 -0
  19. package/dist/mcp/liveness-watchdog.d.ts +18 -0
  20. package/dist/mcp/liveness-watchdog.d.ts.map +1 -1
  21. package/dist/mcp/liveness-watchdog.js +134 -22
  22. package/dist/mcp/liveness-watchdog.js.map +1 -1
  23. package/dist/mcp/server-instructions.d.ts +1 -1
  24. package/dist/mcp/server-instructions.d.ts.map +1 -1
  25. package/dist/mcp/server-instructions.js +2 -0
  26. package/dist/mcp/server-instructions.js.map +1 -1
  27. package/dist/mcp/tools.d.ts +21 -5
  28. package/dist/mcp/tools.d.ts.map +1 -1
  29. package/dist/mcp/tools.js +305 -55
  30. package/dist/mcp/tools.js.map +1 -1
  31. package/dist/resolution/callback-synthesizer.d.ts +2 -1
  32. package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
  33. package/dist/resolution/callback-synthesizer.js +153 -53
  34. package/dist/resolution/callback-synthesizer.js.map +1 -1
  35. package/dist/resolution/frameworks/arkts-entry.d.ts.map +1 -1
  36. package/dist/resolution/frameworks/arkts-entry.js +20 -9
  37. package/dist/resolution/frameworks/arkts-entry.js.map +1 -1
  38. package/dist/resolution/index.d.ts.map +1 -1
  39. package/dist/resolution/index.js +1 -1
  40. package/dist/resolution/index.js.map +1 -1
  41. package/dist/resolution/memory-budget.d.ts +33 -0
  42. package/dist/resolution/memory-budget.d.ts.map +1 -1
  43. package/dist/resolution/memory-budget.js +58 -0
  44. package/dist/resolution/memory-budget.js.map +1 -1
  45. package/dist/resolution/resolver-pool.d.ts +2 -0
  46. package/dist/resolution/resolver-pool.d.ts.map +1 -1
  47. package/dist/resolution/resolver-pool.js +4 -0
  48. package/dist/resolution/resolver-pool.js.map +1 -1
  49. package/dist/ui/shimmer-progress.d.ts.map +1 -1
  50. package/dist/ui/shimmer-progress.js +4 -1
  51. package/dist/ui/shimmer-progress.js.map +1 -1
  52. package/package.json +4 -5
  53. package/dist/arkts/ohos-api-index.d.ts +0 -15
  54. package/dist/arkts/ohos-api-index.d.ts.map +0 -1
  55. package/dist/arkts/ohos-api-index.js +0 -190
  56. package/dist/arkts/ohos-api-index.js.map +0 -1
  57. package/dist/arkts/ohos-sdk-input.d.ts +0 -36
  58. package/dist/arkts/ohos-sdk-input.d.ts.map +0 -1
  59. package/dist/arkts/ohos-sdk-input.js +0 -214
  60. package/dist/arkts/ohos-sdk-input.js.map +0 -1
  61. package/dist/extraction/languages/arkts-state-decorators.d.ts +0 -13
  62. package/dist/extraction/languages/arkts-state-decorators.d.ts.map +0 -1
  63. package/dist/extraction/languages/arkts-state-decorators.js +0 -26
  64. package/dist/extraction/languages/arkts-state-decorators.js.map +0 -1
  65. package/dist/extraction/languages/arkts-viewtree.d.ts +0 -24
  66. package/dist/extraction/languages/arkts-viewtree.d.ts.map +0 -1
  67. package/dist/extraction/languages/arkts-viewtree.js +0 -148
  68. package/dist/extraction/languages/arkts-viewtree.js.map +0 -1
  69. package/dist/extraction/languages/ohos-api-consumer.d.ts +0 -34
  70. package/dist/extraction/languages/ohos-api-consumer.d.ts.map +0 -1
  71. package/dist/extraction/languages/ohos-api-consumer.js +0 -283
  72. package/dist/extraction/languages/ohos-api-consumer.js.map +0 -1
  73. package/dist/reasoning/config.d.ts +0 -45
  74. package/dist/reasoning/config.d.ts.map +0 -1
  75. package/dist/reasoning/config.js +0 -171
  76. package/dist/reasoning/config.js.map +0 -1
  77. package/dist/reasoning/credentials.d.ts +0 -5
  78. package/dist/reasoning/credentials.d.ts.map +0 -1
  79. package/dist/reasoning/credentials.js +0 -83
  80. package/dist/reasoning/credentials.js.map +0 -1
  81. package/dist/reasoning/login.d.ts +0 -21
  82. package/dist/reasoning/login.d.ts.map +0 -1
  83. package/dist/reasoning/login.js +0 -85
  84. package/dist/reasoning/login.js.map +0 -1
  85. package/dist/reasoning/reasoner.d.ts +0 -43
  86. package/dist/reasoning/reasoner.d.ts.map +0 -1
  87. package/dist/reasoning/reasoner.js +0 -308
  88. package/dist/reasoning/reasoner.js.map +0 -1
  89. package/dist/spec/build/git-scanner.d.ts +0 -93
  90. package/dist/spec/build/git-scanner.d.ts.map +0 -1
  91. package/dist/spec/build/git-scanner.js +0 -254
  92. package/dist/spec/build/git-scanner.js.map +0 -1
  93. package/dist/spec/evolve/llm-client.d.ts +0 -50
  94. package/dist/spec/evolve/llm-client.d.ts.map +0 -1
  95. package/dist/spec/evolve/llm-client.js +0 -176
  96. package/dist/spec/evolve/llm-client.js.map +0 -1
  97. package/dist/spec/evolve/logic-checker.d.ts +0 -12
  98. package/dist/spec/evolve/logic-checker.d.ts.map +0 -1
  99. package/dist/spec/evolve/logic-checker.js +0 -24
  100. package/dist/spec/evolve/logic-checker.js.map +0 -1
  101. package/dist/spec/git-utils.d.ts +0 -8
  102. package/dist/spec/git-utils.d.ts.map +0 -1
  103. package/dist/spec/git-utils.js +0 -14
  104. package/dist/spec/git-utils.js.map +0 -1
  105. package/dist/spec/llm/index.d.ts +0 -3
  106. package/dist/spec/llm/index.d.ts.map +0 -1
  107. package/dist/spec/llm/index.js +0 -11
  108. package/dist/spec/llm/index.js.map +0 -1
  109. package/dist/spec/mine/clusterer.d.ts +0 -63
  110. package/dist/spec/mine/clusterer.d.ts.map +0 -1
  111. package/dist/spec/mine/clusterer.js +0 -904
  112. package/dist/spec/mine/clusterer.js.map +0 -1
  113. package/dist/spec/mine/progress-handler.d.ts +0 -22
  114. package/dist/spec/mine/progress-handler.d.ts.map +0 -1
  115. package/dist/spec/mine/progress-handler.js +0 -108
  116. package/dist/spec/mine/progress-handler.js.map +0 -1
  117. package/dist/spec/mine/progress.d.ts +0 -23
  118. package/dist/spec/mine/progress.d.ts.map +0 -1
  119. package/dist/spec/mine/progress.js +0 -12
  120. package/dist/spec/mine/progress.js.map +0 -1
  121. package/dist/spec/mining/diff-parser.d.ts +0 -33
  122. package/dist/spec/mining/diff-parser.d.ts.map +0 -1
  123. package/dist/spec/mining/diff-parser.js +0 -166
  124. package/dist/spec/mining/diff-parser.js.map +0 -1
  125. package/dist/spec/mining/git-scanner.d.ts +0 -103
  126. package/dist/spec/mining/git-scanner.d.ts.map +0 -1
  127. package/dist/spec/mining/git-scanner.js +0 -307
  128. package/dist/spec/mining/git-scanner.js.map +0 -1
  129. package/dist/spec/mining/pipeline.d.ts +0 -53
  130. package/dist/spec/mining/pipeline.d.ts.map +0 -1
  131. package/dist/spec/mining/pipeline.js +0 -178
  132. package/dist/spec/mining/pipeline.js.map +0 -1
  133. package/dist/spec/mining/scope-resolver.d.ts +0 -45
  134. package/dist/spec/mining/scope-resolver.d.ts.map +0 -1
  135. package/dist/spec/mining/scope-resolver.js +0 -103
  136. package/dist/spec/mining/scope-resolver.js.map +0 -1
  137. package/dist/spec/mining/spec-extractor.d.ts +0 -69
  138. package/dist/spec/mining/spec-extractor.d.ts.map +0 -1
  139. package/dist/spec/mining/spec-extractor.js +0 -369
  140. package/dist/spec/mining/spec-extractor.js.map +0 -1
  141. package/dist/spec/utils.d.ts +0 -155
  142. package/dist/spec/utils.d.ts.map +0 -1
  143. package/dist/spec/utils.js +0 -411
  144. package/dist/spec/utils.js.map +0 -1
  145. package/scripts/add-lang/bench.sh +0 -60
  146. package/scripts/add-lang/check-grammar.mjs +0 -75
  147. package/scripts/add-lang/dump-ast.mjs +0 -103
  148. package/scripts/add-lang/verify-extraction.mjs +0 -70
  149. package/scripts/agent-eval/ab-adoption.sh +0 -91
  150. package/scripts/agent-eval/ab-hook.sh +0 -86
  151. package/scripts/agent-eval/ab-impl.sh +0 -78
  152. package/scripts/agent-eval/ab-new-vs-baseline.sh +0 -102
  153. package/scripts/agent-eval/ab-sufficiency.sh +0 -78
  154. package/scripts/agent-eval/arms-F.sh +0 -21
  155. package/scripts/agent-eval/arms-matrix.sh +0 -37
  156. package/scripts/agent-eval/audit.sh +0 -68
  157. package/scripts/agent-eval/bench-readme.sh +0 -28
  158. package/scripts/agent-eval/bench-why-repo.sh +0 -22
  159. package/scripts/agent-eval/block-read-hook.sh +0 -19
  160. package/scripts/agent-eval/hook-settings.json +0 -15
  161. package/scripts/agent-eval/itrun.sh +0 -120
  162. package/scripts/agent-eval/offload-eval-3arm.sh +0 -72
  163. package/scripts/agent-eval/offload-eval-cost.mjs +0 -133
  164. package/scripts/agent-eval/offload-eval-effort.mjs +0 -108
  165. package/scripts/agent-eval/offload-eval-frontload-matrix.sh +0 -25
  166. package/scripts/agent-eval/offload-eval-frontload.sh +0 -47
  167. package/scripts/agent-eval/offload-eval-ground-truth.json +0 -18
  168. package/scripts/agent-eval/offload-eval-hook.mjs +0 -84
  169. package/scripts/agent-eval/offload-eval-judge.mjs +0 -103
  170. package/scripts/agent-eval/offload-eval-matrix.sh +0 -20
  171. package/scripts/agent-eval/offload-eval-metrics.mjs +0 -94
  172. package/scripts/agent-eval/offload-eval-refs1.sh +0 -50
  173. package/scripts/agent-eval/offload-eval-setup.sh +0 -24
  174. package/scripts/agent-eval/offload-eval-styles.sh +0 -72
  175. package/scripts/agent-eval/offload-eval-summarize.mjs +0 -68
  176. package/scripts/agent-eval/offload-eval.md +0 -76
  177. package/scripts/agent-eval/parse-arms.mjs +0 -116
  178. package/scripts/agent-eval/parse-bench-readme.mjs +0 -84
  179. package/scripts/agent-eval/parse-run.mjs +0 -45
  180. package/scripts/agent-eval/parse-session.mjs +0 -93
  181. package/scripts/agent-eval/probe-context.mjs +0 -21
  182. package/scripts/agent-eval/probe-explore.mjs +0 -40
  183. package/scripts/agent-eval/probe-node.mjs +0 -20
  184. package/scripts/agent-eval/probe-sweep.mjs +0 -119
  185. package/scripts/agent-eval/probe-trace.mjs +0 -20
  186. package/scripts/agent-eval/redirect-read-hook.sh +0 -38
  187. package/scripts/agent-eval/repro-concurrent-explore.mjs +0 -119
  188. package/scripts/agent-eval/repro-daemon-clients.mjs +0 -125
  189. package/scripts/agent-eval/run-agent.sh +0 -34
  190. package/scripts/agent-eval/run-all.sh +0 -75
  191. package/scripts/agent-eval/run-arms.sh +0 -56
  192. package/scripts/agent-eval/seq-matrix.mjs +0 -137
  193. package/scripts/build-bundle.sh +0 -123
  194. package/scripts/exp_boundary_eval/README.md +0 -247
  195. package/scripts/exp_boundary_eval/_test_mcp_chain.py +0 -78
  196. package/scripts/exp_boundary_eval/_test_stdin.py +0 -8
  197. package/scripts/exp_boundary_eval/_utils.py +0 -1116
  198. package/scripts/exp_boundary_eval/analyze.py +0 -1313
  199. package/scripts/exp_boundary_eval/deveco_arm.py +0 -519
  200. package/scripts/exp_boundary_eval/run_all.py +0 -378
  201. package/scripts/exp_boundary_eval/run_one.py +0 -165
  202. package/scripts/exp_boundary_eval/run_session.py +0 -158
  203. package/scripts/exp_boundary_eval/setup.py +0 -120
  204. package/scripts/exp_boundary_eval/win_mcp_launcher.py +0 -73
  205. package/scripts/exp_boundary_eval/win_mcp_stdio_wrap.js +0 -36
  206. package/scripts/exp_boundary_eval/win_node_launcher.py +0 -24
  207. package/scripts/extract-release-notes.mjs +0 -130
  208. package/scripts/local-install.sh +0 -41
  209. package/scripts/npm-sdk.js +0 -75
  210. package/scripts/npm-shim.js +0 -275
  211. package/scripts/ohos-sdk-publish.mjs +0 -133
  212. package/scripts/pack-npm.sh +0 -119
  213. 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
- } | null, backpressure?: () => Promise<void> | null): Promise<number>;
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;AASjD,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;AA6FD;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,EAAE,YAAY,EA6DtC,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,CAAA;CAAE,GAAG,IAAI,EAIpF,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GACxC,OAAO,CAAC,MAAM,CAAC,CAmLjB"}
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 [...queries.getNodesByKind('class'), ...queries.getNodesByKind('struct')]) {
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
- ...queries.getNodesByKind('component'),
3836
- ...queries.getNodesByKind('class'),
3837
- ...queries.getNodesByKind('struct'),
3838
- ]) {
3839
- if (comp.language !== 'arkts')
3840
- continue;
3841
- const owner = comp.kind === 'component'
3842
- ? queries.getNodesByKind('struct').find((c) => c.filePath === comp.filePath && c.name === comp.name) ??
3843
- queries.getNodesByKind('class').find((c) => c.filePath === comp.filePath && c.name === comp.name) ??
3844
- comp
3845
- : comp;
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: ALWAYS, run: (_q, c, y) => pascalFormEdges(c, y) },
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
- { name: 'fabricNativeEdges', gate: ALWAYS, run: (_q, c, y) => fabricNativeImplEdges(c, y) },
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: ALWAYS, run: (_q, c, y) => objectRegistryEdges(c, y) },
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 out across its read-only workers and the per-pass wall-clock comes from
4037
- // the worker; a pass that fails on a worker falls back to running on the main
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 graphNodes = queries.getNodeAndEdgeCount().nodes;
4069
- if (pool && gatedIn.length > 1) {
4070
- await Promise.all(gatedIn.map(async (i) => {
4071
- const pass = exports.SYNTH_PASSES[i];
4072
- try {
4073
- const out = await pool.runSynthPass(pass.name);
4074
- passEdges[i] = out.edges;
4075
- markPass(pass.name, out.ms);
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
- else {
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
- const merged = [];
4097
- const seen = new Set();
4098
- for (const e of passEdges.flat()) {
4099
- const key = `${e.source}>${e.target}`;
4100
- if (seen.has(key))
4101
- continue;
4102
- seen.add(key);
4103
- merged.push(e);
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