homegraph 1.5.3 → 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 (132) hide show
  1. package/CHANGELOG.md +26 -1
  2. package/README.md +51 -5
  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/migrate-snapshot.d.ts.map +1 -1
  40. package/dist/arkui/migrate-snapshot.js +58 -34
  41. package/dist/arkui/migrate-snapshot.js.map +1 -1
  42. package/dist/bin/addon-commands.d.ts +27 -0
  43. package/dist/bin/addon-commands.d.ts.map +1 -0
  44. package/dist/bin/addon-commands.js +254 -0
  45. package/dist/bin/addon-commands.js.map +1 -0
  46. package/dist/bin/homegraph.js +6 -1
  47. package/dist/bin/homegraph.js.map +1 -1
  48. package/dist/bin/node-version-check.d.ts +1 -1
  49. package/dist/bin/node-version-check.js +1 -1
  50. package/dist/db/sqlite-adapter.d.ts +2 -3
  51. package/dist/db/sqlite-adapter.d.ts.map +1 -1
  52. package/dist/db/sqlite-adapter.js +2 -3
  53. package/dist/db/sqlite-adapter.js.map +1 -1
  54. package/dist/extraction/languages/arkts.d.ts +14 -0
  55. package/dist/extraction/languages/arkts.d.ts.map +1 -1
  56. package/dist/extraction/languages/arkts.js +78 -32
  57. package/dist/extraction/languages/arkts.js.map +1 -1
  58. package/dist/index.d.ts +1 -0
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js.map +1 -1
  61. package/dist/mcp/explore-repeat-guard.d.ts +123 -0
  62. package/dist/mcp/explore-repeat-guard.d.ts.map +1 -0
  63. package/dist/mcp/explore-repeat-guard.js +503 -0
  64. package/dist/mcp/explore-repeat-guard.js.map +1 -0
  65. package/dist/mcp/explore-session-state.d.ts +20 -0
  66. package/dist/mcp/explore-session-state.d.ts.map +1 -1
  67. package/dist/mcp/explore-session-state.js +31 -0
  68. package/dist/mcp/explore-session-state.js.map +1 -1
  69. package/dist/mcp/proxy.d.ts.map +1 -1
  70. package/dist/mcp/proxy.js +15 -4
  71. package/dist/mcp/proxy.js.map +1 -1
  72. package/dist/mcp/query-pool.d.ts.map +1 -1
  73. package/dist/mcp/query-pool.js +10 -13
  74. package/dist/mcp/query-pool.js.map +1 -1
  75. package/dist/mcp/server-instructions.d.ts +5 -7
  76. package/dist/mcp/server-instructions.d.ts.map +1 -1
  77. package/dist/mcp/server-instructions.js +36 -101
  78. package/dist/mcp/server-instructions.js.map +1 -1
  79. package/dist/mcp/tools.d.ts +33 -2
  80. package/dist/mcp/tools.d.ts.map +1 -1
  81. package/dist/mcp/tools.js +1403 -266
  82. package/dist/mcp/tools.js.map +1 -1
  83. package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
  84. package/dist/resolution/callback-synthesizer.js +166 -0
  85. package/dist/resolution/callback-synthesizer.js.map +1 -1
  86. package/dist/search/query-utils.d.ts +47 -7
  87. package/dist/search/query-utils.d.ts.map +1 -1
  88. package/dist/search/query-utils.js +335 -109
  89. package/dist/search/query-utils.js.map +1 -1
  90. package/dist/spec/build/scan.js +1 -1
  91. package/dist/spec/build/scan.js.map +1 -1
  92. package/dist/spec/build/scope-resolver.d.ts +24 -5
  93. package/dist/spec/build/scope-resolver.d.ts.map +1 -1
  94. package/dist/spec/build/scope-resolver.js +76 -10
  95. package/dist/spec/build/scope-resolver.js.map +1 -1
  96. package/dist/spec/config.d.ts +8 -0
  97. package/dist/spec/config.d.ts.map +1 -1
  98. package/dist/spec/config.js +3 -0
  99. package/dist/spec/config.js.map +1 -1
  100. package/dist/spec/evolve/pipeline.d.ts.map +1 -1
  101. package/dist/spec/evolve/pipeline.js +2 -1
  102. package/dist/spec/evolve/pipeline.js.map +1 -1
  103. package/dist/spec/git/commits.d.ts +8 -3
  104. package/dist/spec/git/commits.d.ts.map +1 -1
  105. package/dist/spec/git/commits.js +12 -11
  106. package/dist/spec/git/commits.js.map +1 -1
  107. package/dist/spec/mine/addon/adapter.d.ts +45 -0
  108. package/dist/spec/mine/addon/adapter.d.ts.map +1 -0
  109. package/dist/spec/mine/addon/adapter.js +118 -0
  110. package/dist/spec/mine/addon/adapter.js.map +1 -0
  111. package/dist/spec/mine/addon/render.d.ts +20 -0
  112. package/dist/spec/mine/addon/render.d.ts.map +1 -0
  113. package/dist/spec/mine/addon/render.js +41 -0
  114. package/dist/spec/mine/addon/render.js.map +1 -0
  115. package/dist/spec/mine/addon/types.d.ts +70 -0
  116. package/dist/spec/mine/addon/types.d.ts.map +1 -0
  117. package/dist/spec/mine/addon/types.js +14 -0
  118. package/dist/spec/mine/addon/types.js.map +1 -0
  119. package/dist/spec/mine/generator.d.ts +5 -1
  120. package/dist/spec/mine/generator.d.ts.map +1 -1
  121. package/dist/spec/mine/generator.js +69 -7
  122. package/dist/spec/mine/generator.js.map +1 -1
  123. package/dist/spec/mine/pipeline.d.ts.map +1 -1
  124. package/dist/spec/mine/pipeline.js +5 -1
  125. package/dist/spec/mine/pipeline.js.map +1 -1
  126. package/dist/spec/mine/scanner.d.ts +1 -0
  127. package/dist/spec/mine/scanner.d.ts.map +1 -1
  128. package/dist/spec/mine/scanner.js +1 -1
  129. package/dist/spec/mine/scanner.js.map +1 -1
  130. package/dist/spec/types.d.ts +1 -1
  131. package/dist/spec/types.d.ts.map +1 -1
  132. package/package.json +6 -6
@@ -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) },