homegraph 1.5.2 → 1.5.4

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 (242) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/README.md +63 -10
  3. package/dist/addons/dynamic-import.d.ts +18 -0
  4. package/dist/addons/dynamic-import.d.ts.map +1 -0
  5. package/dist/addons/dynamic-import.js +25 -0
  6. package/dist/addons/dynamic-import.js.map +1 -0
  7. package/dist/addons/init-template.d.ts +15 -0
  8. package/dist/addons/init-template.d.ts.map +1 -0
  9. package/dist/addons/init-template.js +290 -0
  10. package/dist/addons/init-template.js.map +1 -0
  11. package/dist/addons/loader.d.ts +18 -0
  12. package/dist/addons/loader.d.ts.map +1 -0
  13. package/dist/addons/loader.js +88 -0
  14. package/dist/addons/loader.js.map +1 -0
  15. package/dist/addons/manager.d.ts +106 -0
  16. package/dist/addons/manager.d.ts.map +1 -0
  17. package/dist/addons/manager.js +437 -0
  18. package/dist/addons/manager.js.map +1 -0
  19. package/dist/addons/paths.d.ts +22 -0
  20. package/dist/addons/paths.d.ts.map +1 -0
  21. package/dist/addons/paths.js +65 -0
  22. package/dist/addons/paths.js.map +1 -0
  23. package/dist/addons/registry.d.ts +38 -0
  24. package/dist/addons/registry.d.ts.map +1 -0
  25. package/dist/addons/registry.js +160 -0
  26. package/dist/addons/registry.js.map +1 -0
  27. package/dist/addons/semver.d.ts +21 -0
  28. package/dist/addons/semver.d.ts.map +1 -0
  29. package/dist/addons/semver.js +79 -0
  30. package/dist/addons/semver.js.map +1 -0
  31. package/dist/addons/types.d.ts +51 -0
  32. package/dist/addons/types.d.ts.map +1 -0
  33. package/dist/addons/types.js +14 -0
  34. package/dist/addons/types.js.map +1 -0
  35. package/dist/addons/validate.d.ts +38 -0
  36. package/dist/addons/validate.d.ts.map +1 -0
  37. package/dist/addons/validate.js +165 -0
  38. package/dist/addons/validate.js.map +1 -0
  39. package/dist/arkui/index.d.ts +4 -0
  40. package/dist/arkui/index.d.ts.map +1 -0
  41. package/dist/arkui/index.js +23 -0
  42. package/dist/arkui/index.js.map +1 -0
  43. package/dist/arkui/migrate-passage.d.ts +28 -0
  44. package/dist/arkui/migrate-passage.d.ts.map +1 -0
  45. package/dist/arkui/migrate-passage.js +310 -0
  46. package/dist/arkui/migrate-passage.js.map +1 -0
  47. package/dist/arkui/migrate-semantics.d.ts +47 -0
  48. package/dist/arkui/migrate-semantics.d.ts.map +1 -0
  49. package/dist/arkui/migrate-semantics.js +229 -0
  50. package/dist/arkui/migrate-semantics.js.map +1 -0
  51. package/dist/arkui/migrate-snapshot.d.ts +79 -0
  52. package/dist/arkui/migrate-snapshot.d.ts.map +1 -0
  53. package/dist/arkui/migrate-snapshot.js +364 -0
  54. package/dist/arkui/migrate-snapshot.js.map +1 -0
  55. package/dist/bin/addon-commands.d.ts +27 -0
  56. package/dist/bin/addon-commands.d.ts.map +1 -0
  57. package/dist/bin/addon-commands.js +254 -0
  58. package/dist/bin/addon-commands.js.map +1 -0
  59. package/dist/bin/fatal-handler.js +2 -2
  60. package/dist/bin/homegraph.js +111 -157
  61. package/dist/bin/homegraph.js.map +1 -1
  62. package/dist/bin/node-version-check.d.ts +6 -15
  63. package/dist/bin/node-version-check.d.ts.map +1 -1
  64. package/dist/bin/node-version-check.js +8 -37
  65. package/dist/bin/node-version-check.js.map +1 -1
  66. package/dist/db/index.d.ts +36 -1
  67. package/dist/db/index.d.ts.map +1 -1
  68. package/dist/db/index.js +92 -6
  69. package/dist/db/index.js.map +1 -1
  70. package/dist/db/migrations.d.ts +1 -1
  71. package/dist/db/migrations.d.ts.map +1 -1
  72. package/dist/db/migrations.js +15 -1
  73. package/dist/db/migrations.js.map +1 -1
  74. package/dist/db/queries.d.ts +42 -0
  75. package/dist/db/queries.d.ts.map +1 -1
  76. package/dist/db/queries.js +177 -10
  77. package/dist/db/queries.js.map +1 -1
  78. package/dist/db/schema.sql +6 -1
  79. package/dist/db/sqlite-adapter.d.ts +7 -3
  80. package/dist/db/sqlite-adapter.d.ts.map +1 -1
  81. package/dist/db/sqlite-adapter.js +44 -3
  82. package/dist/db/sqlite-adapter.js.map +1 -1
  83. package/dist/extraction/extraction-version.d.ts +1 -1
  84. package/dist/extraction/extraction-version.js +1 -1
  85. package/dist/extraction/generated-detection.d.ts +42 -11
  86. package/dist/extraction/generated-detection.d.ts.map +1 -1
  87. package/dist/extraction/generated-detection.js +141 -20
  88. package/dist/extraction/generated-detection.js.map +1 -1
  89. package/dist/extraction/index.d.ts +42 -0
  90. package/dist/extraction/index.d.ts.map +1 -1
  91. package/dist/extraction/index.js +96 -0
  92. package/dist/extraction/index.js.map +1 -1
  93. package/dist/extraction/languages/arkts.d.ts +33 -2
  94. package/dist/extraction/languages/arkts.d.ts.map +1 -1
  95. package/dist/extraction/languages/arkts.js +525 -129
  96. package/dist/extraction/languages/arkts.js.map +1 -1
  97. package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -1
  98. package/dist/extraction/wasm-runtime-flags.js +9 -6
  99. package/dist/extraction/wasm-runtime-flags.js.map +1 -1
  100. package/dist/graph-sources.d.ts +41 -0
  101. package/dist/graph-sources.d.ts.map +1 -0
  102. package/dist/graph-sources.js +82 -0
  103. package/dist/graph-sources.js.map +1 -0
  104. package/dist/index.d.ts +20 -1
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +79 -9
  107. package/dist/index.js.map +1 -1
  108. package/dist/installer/index.d.ts.map +1 -1
  109. package/dist/installer/index.js +0 -48
  110. package/dist/installer/index.js.map +1 -1
  111. package/dist/installer/targets/antigravity.js +1 -1
  112. package/dist/installer/targets/antigravity.js.map +1 -1
  113. package/dist/installer/targets/deveco.js +1 -1
  114. package/dist/installer/targets/deveco.js.map +1 -1
  115. package/dist/installer/targets/hermes.d.ts +1 -1
  116. package/dist/installer/targets/hermes.js +2 -2
  117. package/dist/installer/targets/hermes.js.map +1 -1
  118. package/dist/installer/targets/opencode.js +1 -1
  119. package/dist/installer/targets/opencode.js.map +1 -1
  120. package/dist/installer/targets/shared.js +1 -1
  121. package/dist/installer/targets/shared.js.map +1 -1
  122. package/dist/mcp/daemon-paths.d.ts +5 -4
  123. package/dist/mcp/daemon-paths.d.ts.map +1 -1
  124. package/dist/mcp/daemon-paths.js +28 -13
  125. package/dist/mcp/daemon-paths.js.map +1 -1
  126. package/dist/mcp/daemon-registry.d.ts.map +1 -1
  127. package/dist/mcp/daemon-registry.js +4 -1
  128. package/dist/mcp/daemon-registry.js.map +1 -1
  129. package/dist/mcp/daemon.d.ts +1 -1
  130. package/dist/mcp/daemon.js +1 -1
  131. package/dist/mcp/engine.d.ts.map +1 -1
  132. package/dist/mcp/engine.js +12 -3
  133. package/dist/mcp/engine.js.map +1 -1
  134. package/dist/mcp/explore-dedup.d.ts +137 -0
  135. package/dist/mcp/explore-dedup.d.ts.map +1 -0
  136. package/dist/mcp/explore-dedup.js +236 -0
  137. package/dist/mcp/explore-dedup.js.map +1 -0
  138. package/dist/mcp/explore-repeat-guard.d.ts +123 -0
  139. package/dist/mcp/explore-repeat-guard.d.ts.map +1 -0
  140. package/dist/mcp/explore-repeat-guard.js +503 -0
  141. package/dist/mcp/explore-repeat-guard.js.map +1 -0
  142. package/dist/mcp/explore-session-state.d.ts +237 -0
  143. package/dist/mcp/explore-session-state.d.ts.map +1 -0
  144. package/dist/mcp/explore-session-state.js +353 -0
  145. package/dist/mcp/explore-session-state.js.map +1 -0
  146. package/dist/mcp/index.d.ts.map +1 -1
  147. package/dist/mcp/index.js +4 -7
  148. package/dist/mcp/index.js.map +1 -1
  149. package/dist/mcp/proxy.d.ts.map +1 -1
  150. package/dist/mcp/proxy.js +20 -18
  151. package/dist/mcp/proxy.js.map +1 -1
  152. package/dist/mcp/query-pool.d.ts.map +1 -1
  153. package/dist/mcp/query-pool.js +10 -13
  154. package/dist/mcp/query-pool.js.map +1 -1
  155. package/dist/mcp/query-worker.d.ts +1 -1
  156. package/dist/mcp/query-worker.js +1 -1
  157. package/dist/mcp/server-instructions.d.ts +5 -2
  158. package/dist/mcp/server-instructions.d.ts.map +1 -1
  159. package/dist/mcp/server-instructions.js +43 -32
  160. package/dist/mcp/server-instructions.js.map +1 -1
  161. package/dist/mcp/session.d.ts +14 -3
  162. package/dist/mcp/session.d.ts.map +1 -1
  163. package/dist/mcp/session.js +17 -14
  164. package/dist/mcp/session.js.map +1 -1
  165. package/dist/mcp/startup-handshake.d.ts +1 -1
  166. package/dist/mcp/startup-handshake.js +1 -1
  167. package/dist/mcp/tools.d.ts +149 -8
  168. package/dist/mcp/tools.d.ts.map +1 -1
  169. package/dist/mcp/tools.js +4265 -575
  170. package/dist/mcp/tools.js.map +1 -1
  171. package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
  172. package/dist/resolution/callback-synthesizer.js +166 -0
  173. package/dist/resolution/callback-synthesizer.js.map +1 -1
  174. package/dist/resolution/frameworks/arkts-napi.d.ts +14 -0
  175. package/dist/resolution/frameworks/arkts-napi.d.ts.map +1 -1
  176. package/dist/resolution/frameworks/arkts-napi.js +169 -49
  177. package/dist/resolution/frameworks/arkts-napi.js.map +1 -1
  178. package/dist/search/query-utils.d.ts +157 -5
  179. package/dist/search/query-utils.d.ts.map +1 -1
  180. package/dist/search/query-utils.js +1105 -70
  181. package/dist/search/query-utils.js.map +1 -1
  182. package/dist/spec/build/scan.js +1 -1
  183. package/dist/spec/build/scan.js.map +1 -1
  184. package/dist/spec/build/scope-resolver.d.ts +24 -5
  185. package/dist/spec/build/scope-resolver.d.ts.map +1 -1
  186. package/dist/spec/build/scope-resolver.js +76 -10
  187. package/dist/spec/build/scope-resolver.js.map +1 -1
  188. package/dist/spec/config.d.ts +8 -0
  189. package/dist/spec/config.d.ts.map +1 -1
  190. package/dist/spec/config.js +3 -0
  191. package/dist/spec/config.js.map +1 -1
  192. package/dist/spec/evolve/pipeline.d.ts.map +1 -1
  193. package/dist/spec/evolve/pipeline.js +2 -1
  194. package/dist/spec/evolve/pipeline.js.map +1 -1
  195. package/dist/spec/git/commits.d.ts +8 -3
  196. package/dist/spec/git/commits.d.ts.map +1 -1
  197. package/dist/spec/git/commits.js +12 -11
  198. package/dist/spec/git/commits.js.map +1 -1
  199. package/dist/spec/mine/addon/adapter.d.ts +45 -0
  200. package/dist/spec/mine/addon/adapter.d.ts.map +1 -0
  201. package/dist/spec/mine/addon/adapter.js +118 -0
  202. package/dist/spec/mine/addon/adapter.js.map +1 -0
  203. package/dist/spec/mine/addon/render.d.ts +20 -0
  204. package/dist/spec/mine/addon/render.d.ts.map +1 -0
  205. package/dist/spec/mine/addon/render.js +41 -0
  206. package/dist/spec/mine/addon/render.js.map +1 -0
  207. package/dist/spec/mine/addon/types.d.ts +70 -0
  208. package/dist/spec/mine/addon/types.d.ts.map +1 -0
  209. package/dist/spec/mine/addon/types.js +14 -0
  210. package/dist/spec/mine/addon/types.js.map +1 -0
  211. package/dist/spec/mine/generator.d.ts +5 -1
  212. package/dist/spec/mine/generator.d.ts.map +1 -1
  213. package/dist/spec/mine/generator.js +69 -7
  214. package/dist/spec/mine/generator.js.map +1 -1
  215. package/dist/spec/mine/pipeline.d.ts.map +1 -1
  216. package/dist/spec/mine/pipeline.js +5 -1
  217. package/dist/spec/mine/pipeline.js.map +1 -1
  218. package/dist/spec/mine/scanner.d.ts +1 -0
  219. package/dist/spec/mine/scanner.d.ts.map +1 -1
  220. package/dist/spec/mine/scanner.js +1 -1
  221. package/dist/spec/mine/scanner.js.map +1 -1
  222. package/dist/spec/types.d.ts +1 -1
  223. package/dist/spec/types.d.ts.map +1 -1
  224. package/dist/types.d.ts +8 -0
  225. package/dist/types.d.ts.map +1 -1
  226. package/dist/upgrade/index.d.ts +14 -26
  227. package/dist/upgrade/index.d.ts.map +1 -1
  228. package/dist/upgrade/index.js +28 -123
  229. package/dist/upgrade/index.js.map +1 -1
  230. package/dist/upgrade/remove-binary.d.ts +19 -19
  231. package/dist/upgrade/remove-binary.d.ts.map +1 -1
  232. package/dist/upgrade/remove-binary.js +20 -21
  233. package/dist/upgrade/remove-binary.js.map +1 -1
  234. package/dist/upgrade/update-check.d.ts +4 -3
  235. package/dist/upgrade/update-check.d.ts.map +1 -1
  236. package/dist/upgrade/update-check.js +4 -3
  237. package/dist/upgrade/update-check.js.map +1 -1
  238. package/package.json +13 -9
  239. package/dist/telemetry/index.d.ts +0 -143
  240. package/dist/telemetry/index.d.ts.map +0 -1
  241. package/dist/telemetry/index.js +0 -541
  242. package/dist/telemetry/index.js.map +0 -1
@@ -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;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
+ {"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;AAyiHrE,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,EAmEtC,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"}
@@ -743,6 +743,170 @@ async function arkuiEmitterEdges(ctx, onYield) {
743
743
  }
744
744
  return edges;
745
745
  }
746
+ /** Cap for commonEvent event-key fan-out (same rationale as emitter). */
747
+ const ARKUI_COMMON_EVENT_FANOUT_CAP = 8;
748
+ /**
749
+ * HarmonyOS `commonEventManager.publish` ↔ `createSubscriber`/`subscribe` when
750
+ * both name the same literal event string. Without this, notification / screen /
751
+ * package flows die at the publish call (no static edge to the subscriber).
752
+ *
753
+ * Precision: literal event strings only; fan-out capped; `.ets` only.
754
+ */
755
+ async function arkuiCommonEventEdges(ctx, onYield) {
756
+ let scanned = 0;
757
+ const publishes = new Map();
758
+ const subscribers = new Map();
759
+ const push = (map, key, site) => {
760
+ (map.get(key) ?? map.set(key, []).get(key)).push(site);
761
+ };
762
+ for (const file of ctx.getAllFiles()) {
763
+ if ((++scanned & 15) === 0)
764
+ await onYield();
765
+ if (!file.endsWith('.ets'))
766
+ continue;
767
+ const content = ctx.readFile(file);
768
+ if (!content || !/commonEventManager|CommonEvent/i.test(content))
769
+ continue;
770
+ const safe = (0, strip_comments_1.stripCommentsForRegex)(content, 'typescript');
771
+ if (!/commonEventManager\s*\./.test(safe) && !/\bpublish\s*\(/.test(safe))
772
+ continue;
773
+ const nodes = ctx.getNodesInFile(file)
774
+ .filter((n) => n.kind === 'method' || n.kind === 'function');
775
+ const enclAt = (index) => {
776
+ const line = safe.slice(0, index).split('\n').length;
777
+ const encl = nodes
778
+ .filter((n) => n.startLine <= line && n.endLine >= line)
779
+ .sort((a, b) => (a.endLine - a.startLine) - (b.endLine - b.startLine))[0];
780
+ return encl ? { nodeId: encl.id, file, line } : null;
781
+ };
782
+ // publish({ event: 'usual.event.X' }) or publish('usual.event.X', …)
783
+ const pubRe = /\b(?:commonEventManager\s*\.\s*)?publish\s*\(\s*(?:\{[^}]{0,200}?\bevent\s*:\s*['"]([^'"]+)['"]|['"]([^'"]+)['"])/g;
784
+ let m;
785
+ while ((m = pubRe.exec(safe))) {
786
+ const event = (m[1] || m[2] || '').trim();
787
+ if (!event || event.length < 4)
788
+ continue;
789
+ const site = enclAt(m.index);
790
+ if (site)
791
+ push(publishes, event, site);
792
+ }
793
+ // createSubscriber({ events: ['usual.event.X', ...] }) — subscriber side
794
+ const createRe = /\bcreateSubscriber\s*\(\s*\{[^}]{0,400}?\bevents\s*:\s*\[([^\]]{0,400})\]/g;
795
+ while ((m = createRe.exec(safe))) {
796
+ const list = m[1] || '';
797
+ const site = enclAt(m.index);
798
+ if (!site)
799
+ continue;
800
+ for (const em of list.matchAll(/['"]([^'"]+)['"]/g)) {
801
+ const event = em[1].trim();
802
+ if (event.length >= 4)
803
+ push(subscribers, event, site);
804
+ }
805
+ }
806
+ // Also: subscribe(…) in a method that earlier referenced events: ['…'] in same method body
807
+ // (createSubscriber often inlined). Covered by createSubscriber scan above when both in one file.
808
+ }
809
+ const edges = [];
810
+ const seen = new Set();
811
+ for (const [event, pubs] of publishes) {
812
+ const subs = subscribers.get(event);
813
+ if (!subs)
814
+ continue;
815
+ if (pubs.length > ARKUI_COMMON_EVENT_FANOUT_CAP || subs.length > ARKUI_COMMON_EVENT_FANOUT_CAP)
816
+ continue;
817
+ for (const p of pubs)
818
+ for (const s of subs) {
819
+ if (p.nodeId === s.nodeId)
820
+ continue;
821
+ const dedupe = `${p.nodeId}>${s.nodeId}>ce:${event}`;
822
+ if (seen.has(dedupe))
823
+ continue;
824
+ seen.add(dedupe);
825
+ edges.push({
826
+ source: p.nodeId,
827
+ target: s.nodeId,
828
+ kind: 'calls',
829
+ line: p.line,
830
+ provenance: 'heuristic',
831
+ metadata: {
832
+ synthesizedBy: 'arkui-common-event',
833
+ event,
834
+ registeredAt: `${s.file}:${s.line}`,
835
+ },
836
+ });
837
+ }
838
+ }
839
+ return edges;
840
+ }
841
+ /**
842
+ * `@kit.ArkTS` / `@ohos.taskpool`: `taskpool.execute(new taskpool.Task(fn, …))`
843
+ * or `taskpool.execute(fn, …)` — static call is only `execute`, so the worker
844
+ * function never appears on the caller's trail. Bridge execute-site → named `fn`
845
+ * when the name resolves uniquely (or same-file).
846
+ */
847
+ async function arkuiTaskpoolEdges(ctx, onYield) {
848
+ const edges = [];
849
+ const seen = new Set();
850
+ let scanned = 0;
851
+ const execRe = /\btaskpool\s*\.\s*execute\s*\(\s*(?:new\s+(?:taskpool\.)?Task\s*\(\s*)?([A-Za-z_$][\w]*)/g;
852
+ for (const file of ctx.getAllFiles()) {
853
+ if ((++scanned & 15) === 0)
854
+ await onYield();
855
+ if (!/\.(?:ets|ts)$/.test(file))
856
+ continue;
857
+ const content = ctx.readFile(file);
858
+ if (!content || !content.includes('taskpool'))
859
+ continue;
860
+ const safe = (0, strip_comments_1.stripCommentsForRegex)(content, 'typescript');
861
+ if (!/\btaskpool\s*\.\s*execute\s*\(/.test(safe))
862
+ continue;
863
+ const nodes = ctx.getNodesInFile(file)
864
+ .filter((n) => n.kind === 'method' || n.kind === 'function');
865
+ execRe.lastIndex = 0;
866
+ let m;
867
+ while ((m = execRe.exec(safe))) {
868
+ const fnName = m[1];
869
+ if (!fnName || fnName === 'Task' || fnName === 'taskpool')
870
+ continue;
871
+ const line = safe.slice(0, m.index).split('\n').length;
872
+ const encl = nodes
873
+ .filter((n) => n.startLine <= line && n.endLine >= line)
874
+ .sort((a, b) => (a.endLine - a.startLine) - (b.endLine - b.startLine))[0];
875
+ if (!encl)
876
+ continue;
877
+ let targets = ctx.getNodesByName(fnName)
878
+ .filter((n) => (n.kind === 'function' || n.kind === 'method') && !(0, generated_detection_1.isGeneratedFile)(n.filePath));
879
+ if (targets.length === 0)
880
+ continue;
881
+ const sameFile = targets.filter((n) => n.filePath === file);
882
+ if (sameFile.length > 0)
883
+ targets = sameFile;
884
+ if (targets.length > 3)
885
+ continue; // ambiguous name — don't guess
886
+ for (const t of targets) {
887
+ if (t.id === encl.id)
888
+ continue;
889
+ const dedupe = `${encl.id}>${t.id}>taskpool`;
890
+ if (seen.has(dedupe))
891
+ continue;
892
+ seen.add(dedupe);
893
+ edges.push({
894
+ source: encl.id,
895
+ target: t.id,
896
+ kind: 'calls',
897
+ line,
898
+ provenance: 'heuristic',
899
+ metadata: {
900
+ synthesizedBy: 'arkui-taskpool',
901
+ via: fnName,
902
+ registeredAt: `${file}:${line}`,
903
+ },
904
+ });
905
+ }
906
+ }
907
+ }
908
+ return edges;
909
+ }
746
910
  /** `router.pushUrl({ url: 'pages/Detail' })` / replaceUrl — literal urls only. */
747
911
  const ARKUI_ROUTER_RE = /\brouter\s*\.\s*(?:pushUrl|replaceUrl)\s*\(\s*\{[^)]{0,200}?\burl\s*:\s*['"]([\w\-./]+)['"]/g;
748
912
  /**
@@ -3921,6 +4085,8 @@ exports.SYNTH_PASSES = [
3921
4085
  { name: 'flutterEdges', gate: (has) => has('dart'), run: (q, c, y) => flutterBuildEdges(q, c, y) },
3922
4086
  { name: 'arkuiStateEdges', gate: (has) => has('arkts'), run: (q, c, y) => arkuiStateBuildEdges(q, c, y) },
3923
4087
  { name: 'arkuiEmitter', gate: (has) => has('arkts'), run: (_q, c, y) => arkuiEmitterEdges(c, y) },
4088
+ { name: 'arkuiCommonEvent', gate: (has) => has('arkts'), run: (_q, c, y) => arkuiCommonEventEdges(c, y) },
4089
+ { name: 'arkuiTaskpool', gate: (has) => has('arkts'), run: (_q, c, y) => arkuiTaskpoolEdges(c, y) },
3924
4090
  { name: 'arkuiRoutes', gate: (has) => has('arkts'), run: (_q, c, y) => arkuiRouterEdges(c, y) },
3925
4091
  { name: 'arktsStartupEdges', gate: (has) => has('arkts'), run: async (q, c) => arktsEntryEdges(q, c) },
3926
4092
  { name: 'cppEdges', gate: (has) => has('cpp'), run: (q, _c, y) => cppOverrideEdges(q, y) },