gitnexus 1.6.6-rc.99 → 1.6.6

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 (541) hide show
  1. package/README.md +122 -68
  2. package/dist/_shared/graph/types.d.ts +17 -1
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/index.d.ts +3 -5
  5. package/dist/_shared/index.d.ts.map +1 -1
  6. package/dist/_shared/index.js +2 -4
  7. package/dist/_shared/index.js.map +1 -1
  8. package/dist/_shared/scope-resolution/module-scope-index.d.ts +1 -2
  9. package/dist/_shared/scope-resolution/module-scope-index.d.ts.map +1 -1
  10. package/dist/_shared/scope-resolution/module-scope-index.js +1 -2
  11. package/dist/_shared/scope-resolution/module-scope-index.js.map +1 -1
  12. package/dist/_shared/scope-resolution/parsed-file.d.ts +24 -0
  13. package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
  14. package/dist/_shared/scope-resolution/reference-site.d.ts +13 -1
  15. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  16. package/dist/_shared/scope-resolution/registries/context.d.ts +1 -0
  17. package/dist/_shared/scope-resolution/registries/context.d.ts.map +1 -1
  18. package/dist/_shared/scope-resolution/registries/context.js +6 -0
  19. package/dist/_shared/scope-resolution/registries/context.js.map +1 -1
  20. package/dist/_shared/scope-resolution/registries/evidence.d.ts +2 -3
  21. package/dist/_shared/scope-resolution/registries/evidence.d.ts.map +1 -1
  22. package/dist/_shared/scope-resolution/registries/evidence.js +2 -3
  23. package/dist/_shared/scope-resolution/registries/evidence.js.map +1 -1
  24. package/dist/_shared/scope-resolution/registries/macro-registry.d.ts +29 -0
  25. package/dist/_shared/scope-resolution/registries/macro-registry.d.ts.map +1 -0
  26. package/dist/_shared/scope-resolution/registries/macro-registry.js +32 -0
  27. package/dist/_shared/scope-resolution/registries/macro-registry.js.map +1 -0
  28. package/dist/_shared/scope-resolution/symbol-definition.d.ts +9 -0
  29. package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
  30. package/dist/_shared/scope-resolution/types.d.ts +1 -1
  31. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  32. package/dist/cli/ai-context.d.ts +35 -1
  33. package/dist/cli/ai-context.js +111 -12
  34. package/dist/cli/analyze-config.d.ts +92 -0
  35. package/dist/cli/analyze-config.js +364 -0
  36. package/dist/cli/analyze.d.ts +17 -1
  37. package/dist/cli/analyze.js +224 -71
  38. package/dist/cli/cli-message.d.ts +1 -1
  39. package/dist/cli/doctor.d.ts +18 -0
  40. package/dist/cli/doctor.js +32 -0
  41. package/dist/cli/i18n/en.d.ts +2 -2
  42. package/dist/cli/i18n/en.js +2 -2
  43. package/dist/cli/i18n/resources.d.ts +2 -2
  44. package/dist/cli/i18n/zh-CN.js +2 -2
  45. package/dist/cli/index.js +4 -2
  46. package/dist/cli/resolve-invocation.d.ts +21 -0
  47. package/dist/cli/resolve-invocation.js +68 -0
  48. package/dist/cli/setup.d.ts +33 -0
  49. package/dist/cli/setup.js +96 -35
  50. package/dist/cli/skill-gen.js +2 -2
  51. package/dist/cli/wiki.js +20 -4
  52. package/dist/core/embeddings/embedder.d.ts +1 -1
  53. package/dist/core/embeddings/embedder.js +14 -1
  54. package/dist/core/embeddings/runtime-support.d.ts +41 -0
  55. package/dist/core/embeddings/runtime-support.js +65 -0
  56. package/dist/core/group/extractors/grpc-patterns/proto.js +2 -1
  57. package/dist/core/group/extractors/http-patterns/java.js +15 -1
  58. package/dist/core/ingestion/call-processor.d.ts +57 -227
  59. package/dist/core/ingestion/call-processor.js +172 -2595
  60. package/dist/core/ingestion/call-routing.d.ts +6 -5
  61. package/dist/core/ingestion/call-routing.js +6 -6
  62. package/dist/core/ingestion/call-types.d.ts +0 -75
  63. package/dist/core/ingestion/class-extractors/configs/c-cpp.js +26 -1
  64. package/dist/core/ingestion/class-extractors/configs/ruby.js +3 -0
  65. package/dist/core/ingestion/class-extractors/generic.js +9 -11
  66. package/dist/core/ingestion/class-types.d.ts +23 -0
  67. package/dist/core/ingestion/cobol/cobol-preprocessor.d.ts +11 -0
  68. package/dist/core/ingestion/cobol/cobol-preprocessor.js +227 -73
  69. package/dist/core/ingestion/cobol-processor.d.ts +1 -0
  70. package/dist/core/ingestion/cobol-processor.js +51 -2
  71. package/dist/core/ingestion/emit-references.js +8 -2
  72. package/dist/core/ingestion/export-detection.d.ts +2 -1
  73. package/dist/core/ingestion/export-detection.js +2 -6
  74. package/dist/core/ingestion/field-extractors/configs/dart.d.ts +0 -6
  75. package/dist/core/ingestion/field-extractors/configs/dart.js +62 -44
  76. package/dist/core/ingestion/field-extractors/configs/go.d.ts +0 -9
  77. package/dist/core/ingestion/field-extractors/configs/go.js +40 -1
  78. package/dist/core/ingestion/field-extractors/configs/jvm.js +43 -4
  79. package/dist/core/ingestion/field-extractors/configs/php.js +1 -2
  80. package/dist/core/ingestion/field-extractors/configs/swift.d.ts +12 -1
  81. package/dist/core/ingestion/field-extractors/configs/swift.js +31 -6
  82. package/dist/core/ingestion/field-extractors/generic.d.ts +6 -0
  83. package/dist/core/ingestion/field-extractors/generic.js +5 -4
  84. package/dist/core/ingestion/field-extractors/typescript.js +0 -29
  85. package/dist/core/ingestion/filesystem-walker.d.ts +0 -9
  86. package/dist/core/ingestion/filesystem-walker.js +0 -11
  87. package/dist/core/ingestion/finalize-orchestrator.js +14 -2
  88. package/dist/core/ingestion/import-resolvers/configs/swift.d.ts +21 -0
  89. package/dist/core/ingestion/import-resolvers/configs/swift.js +72 -11
  90. package/dist/core/ingestion/import-resolvers/python.d.ts +1 -1
  91. package/dist/core/ingestion/import-resolvers/standard.d.ts +2 -2
  92. package/dist/core/ingestion/import-resolvers/standard.js +6 -5
  93. package/dist/core/ingestion/import-resolvers/utils.d.ts +2 -5
  94. package/dist/core/ingestion/import-resolvers/utils.js +1 -9
  95. package/dist/core/ingestion/language-provider.d.ts +39 -119
  96. package/dist/core/ingestion/language-provider.js +0 -2
  97. package/dist/core/ingestion/languages/c/capture-side-channel.d.ts +62 -0
  98. package/dist/core/ingestion/languages/c/capture-side-channel.js +65 -0
  99. package/dist/core/ingestion/languages/c/captures.js +41 -23
  100. package/dist/core/ingestion/languages/c/import-decomposer.d.ts +9 -0
  101. package/dist/core/ingestion/languages/c/import-decomposer.js +15 -0
  102. package/dist/core/ingestion/languages/c/import-target.js +52 -9
  103. package/dist/core/ingestion/languages/c/index.d.ts +2 -1
  104. package/dist/core/ingestion/languages/c/index.js +2 -1
  105. package/dist/core/ingestion/languages/c/query.js +15 -0
  106. package/dist/core/ingestion/languages/c/scope-resolver.js +47 -4
  107. package/dist/core/ingestion/languages/c/static-linkage.d.ts +8 -0
  108. package/dist/core/ingestion/languages/c/static-linkage.js +46 -1
  109. package/dist/core/ingestion/languages/c-cpp.js +16 -7
  110. package/dist/core/ingestion/languages/cobol/captures.js +25 -2
  111. package/dist/core/ingestion/languages/cpp/adl.d.ts +88 -4
  112. package/dist/core/ingestion/languages/cpp/adl.js +380 -160
  113. package/dist/core/ingestion/languages/cpp/arity-metadata.js +2 -8
  114. package/dist/core/ingestion/languages/cpp/capture-side-channel.d.ts +65 -0
  115. package/dist/core/ingestion/languages/cpp/capture-side-channel.js +78 -0
  116. package/dist/core/ingestion/languages/cpp/captures.js +162 -54
  117. package/dist/core/ingestion/languages/cpp/file-local-linkage.d.ts +18 -52
  118. package/dist/core/ingestion/languages/cpp/file-local-linkage.js +49 -1
  119. package/dist/core/ingestion/languages/cpp/import-decomposer.d.ts +7 -0
  120. package/dist/core/ingestion/languages/cpp/import-decomposer.js +12 -0
  121. package/dist/core/ingestion/languages/cpp/index.d.ts +1 -0
  122. package/dist/core/ingestion/languages/cpp/index.js +1 -0
  123. package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +8 -0
  124. package/dist/core/ingestion/languages/cpp/inline-namespaces.js +21 -0
  125. package/dist/core/ingestion/languages/cpp/query.js +21 -0
  126. package/dist/core/ingestion/languages/cpp/range-bindings.js +20 -5
  127. package/dist/core/ingestion/languages/cpp/scope-resolver.js +52 -5
  128. package/dist/core/ingestion/languages/cpp/two-phase-lookup.d.ts +20 -0
  129. package/dist/core/ingestion/languages/cpp/two-phase-lookup.js +83 -3
  130. package/dist/core/ingestion/languages/csharp/captures.js +205 -41
  131. package/dist/core/ingestion/languages/csharp/index.d.ts +3 -4
  132. package/dist/core/ingestion/languages/csharp/index.js +3 -4
  133. package/dist/core/ingestion/languages/csharp/interpret.js +17 -3
  134. package/dist/core/ingestion/languages/csharp/namespace-siblings.d.ts +17 -7
  135. package/dist/core/ingestion/languages/csharp/namespace-siblings.js +129 -124
  136. package/dist/core/ingestion/languages/csharp/qualified-type-names.d.ts +14 -0
  137. package/dist/core/ingestion/languages/csharp/qualified-type-names.js +59 -0
  138. package/dist/core/ingestion/languages/csharp/query.js +13 -0
  139. package/dist/core/ingestion/languages/csharp/receiver-binding.js +10 -6
  140. package/dist/core/ingestion/languages/csharp/scope-resolver.js +8 -1
  141. package/dist/core/ingestion/languages/csharp.js +0 -5
  142. package/dist/core/ingestion/languages/dart/arity-metadata.d.ts +25 -0
  143. package/dist/core/ingestion/languages/dart/arity-metadata.js +35 -0
  144. package/dist/core/ingestion/languages/dart/arity.d.ts +19 -0
  145. package/dist/core/ingestion/languages/dart/arity.js +31 -0
  146. package/dist/core/ingestion/languages/dart/built-ins.d.ts +11 -0
  147. package/dist/core/ingestion/languages/dart/built-ins.js +34 -0
  148. package/dist/core/ingestion/languages/dart/cache-stats.d.ts +13 -0
  149. package/dist/core/ingestion/languages/dart/cache-stats.js +24 -0
  150. package/dist/core/ingestion/languages/dart/captures.d.ts +29 -0
  151. package/dist/core/ingestion/languages/dart/captures.js +445 -0
  152. package/dist/core/ingestion/languages/dart/expand-wildcards.d.ts +13 -0
  153. package/dist/core/ingestion/languages/dart/expand-wildcards.js +31 -0
  154. package/dist/core/ingestion/languages/dart/import-target.d.ts +15 -0
  155. package/dist/core/ingestion/languages/dart/import-target.js +65 -0
  156. package/dist/core/ingestion/languages/dart/index.d.ts +28 -0
  157. package/dist/core/ingestion/languages/dart/index.js +28 -0
  158. package/dist/core/ingestion/languages/dart/interpret.d.ts +24 -0
  159. package/dist/core/ingestion/languages/dart/interpret.js +95 -0
  160. package/dist/core/ingestion/languages/dart/merge-bindings.d.ts +10 -0
  161. package/dist/core/ingestion/languages/dart/merge-bindings.js +39 -0
  162. package/dist/core/ingestion/languages/dart/query.d.ts +26 -0
  163. package/dist/core/ingestion/languages/dart/query.js +142 -0
  164. package/dist/core/ingestion/languages/dart/receiver-binding.d.ts +24 -0
  165. package/dist/core/ingestion/languages/dart/receiver-binding.js +87 -0
  166. package/dist/core/ingestion/languages/dart/scope-resolver.d.ts +29 -0
  167. package/dist/core/ingestion/languages/dart/scope-resolver.js +194 -0
  168. package/dist/core/ingestion/languages/dart/signature-bindings.d.ts +23 -0
  169. package/dist/core/ingestion/languages/dart/signature-bindings.js +51 -0
  170. package/dist/core/ingestion/languages/dart/simple-hooks.d.ts +20 -0
  171. package/dist/core/ingestion/languages/dart/simple-hooks.js +47 -0
  172. package/dist/core/ingestion/languages/dart.d.ts +0 -1
  173. package/dist/core/ingestion/languages/dart.js +15 -29
  174. package/dist/core/ingestion/languages/go/arity-metadata.d.ts +1 -0
  175. package/dist/core/ingestion/languages/go/arity-metadata.js +31 -1
  176. package/dist/core/ingestion/languages/go/captures.js +162 -3
  177. package/dist/core/ingestion/languages/go/interface-impls.js +476 -50
  178. package/dist/core/ingestion/languages/go/interpret.js +21 -11
  179. package/dist/core/ingestion/languages/go/method-owners.js +20 -8
  180. package/dist/core/ingestion/languages/go/query.js +15 -7
  181. package/dist/core/ingestion/languages/go/range-binding.js +24 -9
  182. package/dist/core/ingestion/languages/go/receiver-binding.js +1 -1
  183. package/dist/core/ingestion/languages/go/scope-resolver.js +2 -2
  184. package/dist/core/ingestion/languages/go/simple-hooks.js +10 -5
  185. package/dist/core/ingestion/languages/go/type-binding.d.ts +1 -0
  186. package/dist/core/ingestion/languages/go/type-binding.js +40 -2
  187. package/dist/core/ingestion/languages/go.d.ts +0 -1
  188. package/dist/core/ingestion/languages/go.js +0 -5
  189. package/dist/core/ingestion/languages/index.d.ts +0 -5
  190. package/dist/core/ingestion/languages/index.js +0 -3
  191. package/dist/core/ingestion/languages/java/captures.js +252 -23
  192. package/dist/core/ingestion/languages/java/interpret.js +12 -6
  193. package/dist/core/ingestion/languages/java/package-siblings.js +18 -5
  194. package/dist/core/ingestion/languages/java/query.js +16 -1
  195. package/dist/core/ingestion/languages/java/scope-resolver.d.ts +2 -8
  196. package/dist/core/ingestion/languages/java/scope-resolver.js +2 -8
  197. package/dist/core/ingestion/languages/java.js +0 -5
  198. package/dist/core/ingestion/languages/javascript/captures.js +185 -11
  199. package/dist/core/ingestion/languages/javascript/query.js +107 -1
  200. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +57 -0
  201. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +60 -0
  202. package/dist/core/ingestion/languages/kotlin/captures.js +213 -22
  203. package/dist/core/ingestion/languages/kotlin/companion-scopes.d.ts +7 -0
  204. package/dist/core/ingestion/languages/kotlin/companion-scopes.js +10 -0
  205. package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
  206. package/dist/core/ingestion/languages/kotlin/index.js +1 -0
  207. package/dist/core/ingestion/languages/kotlin/query.js +30 -0
  208. package/dist/core/ingestion/languages/kotlin/scope-resolver.d.ts +5 -7
  209. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +22 -7
  210. package/dist/core/ingestion/languages/kotlin.js +8 -5
  211. package/dist/core/ingestion/languages/php/captures.js +135 -19
  212. package/dist/core/ingestion/languages/php/import-decomposer.js +21 -63
  213. package/dist/core/ingestion/languages/php/index.d.ts +3 -4
  214. package/dist/core/ingestion/languages/php/index.js +3 -4
  215. package/dist/core/ingestion/languages/php/query.js +5 -0
  216. package/dist/core/ingestion/languages/php/receiver-binding.js +8 -4
  217. package/dist/core/ingestion/languages/php.js +0 -4
  218. package/dist/core/ingestion/languages/python/captures.js +128 -13
  219. package/dist/core/ingestion/languages/python/depends-references.js +1 -1
  220. package/dist/core/ingestion/languages/python/import-target.d.ts +4 -5
  221. package/dist/core/ingestion/languages/python/import-target.js +108 -16
  222. package/dist/core/ingestion/languages/python/index-stats.d.ts +18 -0
  223. package/dist/core/ingestion/languages/python/index-stats.js +25 -0
  224. package/dist/core/ingestion/languages/python/index.d.ts +3 -4
  225. package/dist/core/ingestion/languages/python/index.js +3 -4
  226. package/dist/core/ingestion/languages/python/query.js +17 -0
  227. package/dist/core/ingestion/languages/python/scope-resolver.js +7 -6
  228. package/dist/core/ingestion/languages/python.d.ts +0 -2
  229. package/dist/core/ingestion/languages/python.js +0 -7
  230. package/dist/core/ingestion/languages/ruby/captures.js +174 -31
  231. package/dist/core/ingestion/languages/ruby/import-target.js +2 -1
  232. package/dist/core/ingestion/languages/ruby/interpret.js +2 -1
  233. package/dist/core/ingestion/languages/ruby/query.js +10 -0
  234. package/dist/core/ingestion/languages/ruby/scope-resolver.js +61 -11
  235. package/dist/core/ingestion/languages/ruby.js +4 -53
  236. package/dist/core/ingestion/languages/rust/captures.js +95 -13
  237. package/dist/core/ingestion/languages/rust/query.js +64 -1
  238. package/dist/core/ingestion/languages/rust/range-binding.js +40 -12
  239. package/dist/core/ingestion/languages/rust/receiver-binding.js +9 -0
  240. package/dist/core/ingestion/languages/rust/scope-resolver.js +75 -1
  241. package/dist/core/ingestion/languages/rust.d.ts +0 -2
  242. package/dist/core/ingestion/languages/rust.js +0 -6
  243. package/dist/core/ingestion/languages/swift/arity-metadata.d.ts +24 -0
  244. package/dist/core/ingestion/languages/swift/arity-metadata.js +41 -0
  245. package/dist/core/ingestion/languages/swift/arity.d.ts +29 -0
  246. package/dist/core/ingestion/languages/swift/arity.js +42 -0
  247. package/dist/core/ingestion/languages/swift/base-type.d.ts +20 -0
  248. package/dist/core/ingestion/languages/swift/base-type.js +27 -0
  249. package/dist/core/ingestion/languages/swift/cache-stats.d.ts +15 -0
  250. package/dist/core/ingestion/languages/swift/cache-stats.js +26 -0
  251. package/dist/core/ingestion/languages/swift/captures.d.ts +35 -0
  252. package/dist/core/ingestion/languages/swift/captures.js +495 -0
  253. package/dist/core/ingestion/languages/swift/implicit-imports.d.ts +34 -0
  254. package/dist/core/ingestion/languages/swift/implicit-imports.js +57 -0
  255. package/dist/core/ingestion/languages/swift/import-decomposer.d.ts +24 -0
  256. package/dist/core/ingestion/languages/swift/import-decomposer.js +84 -0
  257. package/dist/core/ingestion/languages/swift/import-target.d.ts +33 -0
  258. package/dist/core/ingestion/languages/swift/import-target.js +81 -0
  259. package/dist/core/ingestion/languages/swift/index.d.ts +37 -0
  260. package/dist/core/ingestion/languages/swift/index.js +37 -0
  261. package/dist/core/ingestion/languages/swift/interpret.d.ts +15 -0
  262. package/dist/core/ingestion/languages/swift/interpret.js +89 -0
  263. package/dist/core/ingestion/languages/swift/merge-bindings.d.ts +20 -0
  264. package/dist/core/ingestion/languages/swift/merge-bindings.js +48 -0
  265. package/dist/core/ingestion/languages/swift/query.d.ts +46 -0
  266. package/dist/core/ingestion/languages/swift/query.js +194 -0
  267. package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +40 -0
  268. package/dist/core/ingestion/languages/swift/receiver-binding.js +161 -0
  269. package/dist/core/ingestion/languages/swift/scope-resolver.d.ts +50 -0
  270. package/dist/core/ingestion/languages/swift/scope-resolver.js +189 -0
  271. package/dist/core/ingestion/languages/swift/sibling-type-bindings.d.ts +34 -0
  272. package/dist/core/ingestion/languages/swift/sibling-type-bindings.js +65 -0
  273. package/dist/core/ingestion/languages/swift/signature-bindings.d.ts +25 -0
  274. package/dist/core/ingestion/languages/swift/signature-bindings.js +66 -0
  275. package/dist/core/ingestion/languages/swift/simple-hooks.d.ts +37 -0
  276. package/dist/core/ingestion/languages/swift/simple-hooks.js +60 -0
  277. package/dist/core/ingestion/languages/swift/target-grouping.d.ts +51 -0
  278. package/dist/core/ingestion/languages/swift/target-grouping.js +93 -0
  279. package/dist/core/ingestion/languages/swift/target-siblings.d.ts +30 -0
  280. package/dist/core/ingestion/languages/swift/target-siblings.js +71 -0
  281. package/dist/core/ingestion/languages/swift.d.ts +0 -5
  282. package/dist/core/ingestion/languages/swift.js +11 -87
  283. package/dist/core/ingestion/languages/typescript/array-callback.d.ts +3 -29
  284. package/dist/core/ingestion/languages/typescript/array-callback.js +4 -43
  285. package/dist/core/ingestion/languages/typescript/captures.js +147 -17
  286. package/dist/core/ingestion/languages/typescript/index.d.ts +3 -4
  287. package/dist/core/ingestion/languages/typescript/index.js +3 -4
  288. package/dist/core/ingestion/languages/typescript/query.d.ts +2 -3
  289. package/dist/core/ingestion/languages/typescript/query.js +125 -4
  290. package/dist/core/ingestion/languages/typescript/receiver-binding.js +0 -1
  291. package/dist/core/ingestion/languages/typescript.d.ts +2 -3
  292. package/dist/core/ingestion/languages/typescript.js +46 -23
  293. package/dist/core/ingestion/languages/vue/captures.d.ts +46 -0
  294. package/dist/core/ingestion/languages/vue/captures.js +67 -0
  295. package/dist/core/ingestion/languages/vue/import-target.d.ts +27 -0
  296. package/dist/core/ingestion/languages/vue/import-target.js +58 -0
  297. package/dist/core/ingestion/languages/vue/index.d.ts +49 -0
  298. package/dist/core/ingestion/languages/vue/index.js +49 -0
  299. package/dist/core/ingestion/languages/vue/scope-resolver.d.ts +55 -0
  300. package/dist/core/ingestion/languages/vue/scope-resolver.js +292 -0
  301. package/dist/core/ingestion/languages/vue.js +12 -4
  302. package/dist/core/ingestion/local-symbol-pruner.d.ts +11 -0
  303. package/dist/core/ingestion/local-symbol-pruner.js +63 -0
  304. package/dist/core/ingestion/method-extractors/configs/dart.js +14 -1
  305. package/dist/core/ingestion/method-extractors/configs/jvm.js +37 -20
  306. package/dist/core/ingestion/method-extractors/configs/php.js +0 -1
  307. package/dist/core/ingestion/method-extractors/configs/swift.js +11 -4
  308. package/dist/core/ingestion/method-types.d.ts +2 -2
  309. package/dist/core/ingestion/model/index.d.ts +0 -3
  310. package/dist/core/ingestion/model/index.js +0 -8
  311. package/dist/core/ingestion/model/resolve.d.ts +7 -43
  312. package/dist/core/ingestion/model/resolve.js +7 -226
  313. package/dist/core/ingestion/model/scope-resolution-indexes.d.ts +46 -1
  314. package/dist/core/ingestion/model/semantic-model.d.ts +4 -6
  315. package/dist/core/ingestion/model/semantic-model.js +1 -1
  316. package/dist/core/ingestion/model/symbol-table.d.ts +3 -4
  317. package/dist/core/ingestion/model/symbol-table.js +3 -4
  318. package/dist/core/ingestion/parsing-processor.d.ts +30 -24
  319. package/dist/core/ingestion/parsing-processor.js +76 -640
  320. package/dist/core/ingestion/pipeline-phases/communities.d.ts +1 -1
  321. package/dist/core/ingestion/pipeline-phases/communities.js +5 -2
  322. package/dist/core/ingestion/pipeline-phases/cross-file.d.ts +9 -8
  323. package/dist/core/ingestion/pipeline-phases/cross-file.js +16 -12
  324. package/dist/core/ingestion/pipeline-phases/index.d.ts +1 -0
  325. package/dist/core/ingestion/pipeline-phases/index.js +1 -0
  326. package/dist/core/ingestion/pipeline-phases/mro.d.ts +1 -1
  327. package/dist/core/ingestion/pipeline-phases/mro.js +2 -2
  328. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +44 -22
  329. package/dist/core/ingestion/pipeline-phases/parse-impl.js +426 -565
  330. package/dist/core/ingestion/pipeline-phases/parse.d.ts +13 -33
  331. package/dist/core/ingestion/pipeline-phases/parse.js +2 -2
  332. package/dist/core/ingestion/pipeline-phases/processes.d.ts +1 -1
  333. package/dist/core/ingestion/pipeline-phases/processes.js +5 -3
  334. package/dist/core/ingestion/pipeline-phases/prune-local-symbols.d.ts +14 -0
  335. package/dist/core/ingestion/pipeline-phases/prune-local-symbols.js +26 -0
  336. package/dist/core/ingestion/pipeline.d.ts +27 -19
  337. package/dist/core/ingestion/pipeline.js +4 -2
  338. package/dist/core/ingestion/resolve-references.js +15 -3
  339. package/dist/core/ingestion/route-extractors/laravel.d.ts +10 -0
  340. package/dist/core/ingestion/route-extractors/laravel.js +88 -9
  341. package/dist/core/ingestion/scope-extractor-bridge.d.ts +2 -1
  342. package/dist/core/ingestion/scope-extractor-bridge.js +2 -2
  343. package/dist/core/ingestion/scope-extractor.js +13 -0
  344. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +181 -15
  345. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +21 -10
  346. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +10 -2
  347. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +7 -1
  348. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +58 -6
  349. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +24 -5
  350. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +68 -1
  351. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +189 -29
  352. package/dist/core/ingestion/scope-resolution/passes/imported-return-types.js +21 -1
  353. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1 -1
  354. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +8 -11
  355. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +171 -50
  356. package/dist/core/ingestion/scope-resolution/pipeline/registry.d.ts +3 -4
  357. package/dist/core/ingestion/scope-resolution/pipeline/registry.js +9 -4
  358. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +28 -5
  359. package/dist/core/ingestion/scope-resolution/pipeline/run.js +191 -24
  360. package/dist/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +31 -0
  361. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +72 -0
  362. package/dist/core/ingestion/scope-resolution/scope/walkers.js +440 -39
  363. package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +18 -2
  364. package/dist/core/ingestion/scope-resolution/workspace-index.js +94 -7
  365. package/dist/core/ingestion/tree-sitter-queries.d.ts +14 -14
  366. package/dist/core/ingestion/tree-sitter-queries.js +380 -158
  367. package/dist/core/ingestion/ts-js-hoc-utils.d.ts +12 -0
  368. package/dist/core/ingestion/ts-js-hoc-utils.js +105 -0
  369. package/dist/core/ingestion/type-env.d.ts +2 -1
  370. package/dist/core/ingestion/type-env.js +6 -8
  371. package/dist/core/ingestion/type-extractors/c-cpp.js +8 -10
  372. package/dist/core/ingestion/type-extractors/csharp.js +18 -34
  373. package/dist/core/ingestion/type-extractors/go.js +2 -10
  374. package/dist/core/ingestion/type-extractors/jvm.js +6 -5
  375. package/dist/core/ingestion/type-extractors/php.js +1 -1
  376. package/dist/core/ingestion/type-extractors/python.js +1 -1
  377. package/dist/core/ingestion/type-extractors/ruby.js +2 -2
  378. package/dist/core/ingestion/type-extractors/rust.js +0 -16
  379. package/dist/core/ingestion/type-extractors/shared.d.ts +2 -2
  380. package/dist/core/ingestion/type-extractors/shared.js +25 -11
  381. package/dist/core/ingestion/type-extractors/swift.js +5 -5
  382. package/dist/core/ingestion/type-extractors/types.d.ts +1 -1
  383. package/dist/core/ingestion/type-extractors/typescript.js +1 -1
  384. package/dist/core/ingestion/utils/ast-helpers.d.ts +119 -1
  385. package/dist/core/ingestion/utils/ast-helpers.js +260 -13
  386. package/dist/core/ingestion/utils/callable-labels.d.ts +13 -0
  387. package/dist/core/ingestion/utils/callable-labels.js +14 -0
  388. package/dist/core/ingestion/utils/deferred-resolution-profile.d.ts +10 -0
  389. package/dist/core/ingestion/utils/deferred-resolution-profile.js +30 -0
  390. package/dist/core/ingestion/utils/heap-probe.d.ts +20 -0
  391. package/dist/core/ingestion/utils/heap-probe.js +39 -0
  392. package/dist/core/ingestion/utils/heritage-marker.d.ts +33 -0
  393. package/dist/core/ingestion/utils/heritage-marker.js +41 -0
  394. package/dist/core/ingestion/utils/qualified-name.d.ts +37 -0
  395. package/dist/core/ingestion/utils/qualified-name.js +67 -0
  396. package/dist/core/ingestion/variable-extractors/configs/c-cpp.js +49 -0
  397. package/dist/core/ingestion/variable-extractors/configs/dart.js +76 -62
  398. package/dist/core/ingestion/variable-extractors/configs/go.js +74 -7
  399. package/dist/core/ingestion/variable-extractors/configs/jvm.js +35 -8
  400. package/dist/core/ingestion/variable-extractors/generic.js +40 -12
  401. package/dist/core/ingestion/variable-types.d.ts +9 -0
  402. package/dist/core/ingestion/vue-sfc-extractor.d.ts +97 -7
  403. package/dist/core/ingestion/vue-sfc-extractor.js +433 -11
  404. package/dist/core/ingestion/workers/parse-worker.d.ts +0 -11
  405. package/dist/core/ingestion/workers/parse-worker.js +358 -187
  406. package/dist/core/ingestion/workers/worker-pool.d.ts +78 -9
  407. package/dist/core/ingestion/workers/worker-pool.js +346 -49
  408. package/dist/core/lbug/csv-generator.js +20 -2
  409. package/dist/core/lbug/lbug-adapter.js +29 -10
  410. package/dist/core/lbug/native-check.js +17 -5
  411. package/dist/core/lbug/pool-adapter.d.ts +0 -19
  412. package/dist/core/lbug/pool-adapter.js +40 -77
  413. package/dist/core/lbug/query-result-utils.d.ts +19 -0
  414. package/dist/core/lbug/query-result-utils.js +28 -0
  415. package/dist/core/run-analyze.d.ts +9 -2
  416. package/dist/core/run-analyze.js +24 -3
  417. package/dist/core/tree-sitter/parser-loader.d.ts +13 -0
  418. package/dist/core/tree-sitter/parser-loader.js +4 -0
  419. package/dist/core/tree-sitter/safe-parse.d.ts +70 -3
  420. package/dist/core/tree-sitter/safe-parse.js +214 -11
  421. package/dist/core/wiki/generator.js +13 -5
  422. package/dist/core/wiki/graph-queries.d.ts +3 -0
  423. package/dist/core/wiki/graph-queries.js +9 -1
  424. package/dist/core/wiki/llm-client.d.ts +1 -1
  425. package/dist/core/wiki/llm-client.js +7 -2
  426. package/dist/core/wiki/local-cli-client.d.ts +2 -1
  427. package/dist/core/wiki/local-cli-client.js +62 -4
  428. package/dist/mcp/compatible-stdio-transport.d.ts +3 -0
  429. package/dist/mcp/compatible-stdio-transport.js +22 -0
  430. package/dist/mcp/core/embedder.d.ts +1 -1
  431. package/dist/mcp/core/embedder.js +13 -1
  432. package/dist/mcp/local/local-backend.d.ts +37 -5
  433. package/dist/mcp/local/local-backend.js +227 -129
  434. package/dist/mcp/resources.js +3 -3
  435. package/dist/mcp/server.js +9 -1
  436. package/dist/storage/git.d.ts +11 -0
  437. package/dist/storage/git.js +30 -0
  438. package/dist/storage/parse-cache.d.ts +23 -1
  439. package/dist/storage/parse-cache.js +138 -32
  440. package/dist/storage/parsedfile-store.d.ts +142 -0
  441. package/dist/storage/parsedfile-store.js +367 -0
  442. package/dist/storage/repo-manager.d.ts +2 -1
  443. package/dist/storage/scope-index-store.d.ts +114 -0
  444. package/dist/storage/scope-index-store.js +236 -0
  445. package/dist/types/pipeline.d.ts +6 -3
  446. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +2 -1
  447. package/hooks/claude/gitnexus-hook.cjs +2 -1
  448. package/hooks/claude/resolve-analyze-cmd.cjs +323 -0
  449. package/package.json +4 -5
  450. package/scripts/bench-scope-resolution.ts +1 -3
  451. package/scripts/cross-platform-tests.ts +4 -1
  452. package/skills/gitnexus-cli.md +8 -6
  453. package/skills/gitnexus-debugging.md +15 -15
  454. package/skills/gitnexus-exploring.md +11 -11
  455. package/skills/gitnexus-guide.md +1 -1
  456. package/skills/gitnexus-impact-analysis.md +10 -10
  457. package/skills/gitnexus-pr-review.md +19 -19
  458. package/skills/gitnexus-refactoring.md +25 -25
  459. package/web/assets/{agent-BRX-afm3.js → agent-EkX7webX.js} +156 -131
  460. package/web/assets/{architectureDiagram-UL44E2DR-B1oYB8-c.js → architectureDiagram-UL44E2DR-BoczH8cv.js} +1 -1
  461. package/web/assets/{chunk-LCXTWHL2-SPC6pgWI.js → chunk-LCXTWHL2-By5HB3b-.js} +1 -1
  462. package/web/assets/{chunk-RG4AUYOV-DZXr4Yv3.js → chunk-RG4AUYOV-BQE_DkpL.js} +1 -1
  463. package/web/assets/{classDiagram-KGZ6W3CR-BqpOj8L9.js → classDiagram-KGZ6W3CR-Dj_02GUH.js} +1 -1
  464. package/web/assets/{classDiagram-v2-72OJOZXJ-FmElywK2.js → classDiagram-v2-72OJOZXJ-D-NArMpf.js} +1 -1
  465. package/web/assets/{diagram-3NCE3AQN-BWtJXMDq.js → diagram-3NCE3AQN-VXtXDO95.js} +1 -1
  466. package/web/assets/{diagram-GF46GFSD-Hh-fChxU.js → diagram-GF46GFSD-B1qab2Ah.js} +1 -1
  467. package/web/assets/{diagram-QXG6HAR7-DYeQHxGU.js → diagram-QXG6HAR7-BSCHGzzT.js} +1 -1
  468. package/web/assets/{diagram-WEQXMOUZ-DYGU4T0y.js → diagram-WEQXMOUZ-DHtknmNT.js} +1 -1
  469. package/web/assets/{erDiagram-L5TCEMPS-bN3wlP2A.js → erDiagram-L5TCEMPS-Db-IYTmm.js} +1 -1
  470. package/web/assets/{flowDiagram-H6V6AXG4-YACVtF3-.js → flowDiagram-H6V6AXG4-BHDoyVoW.js} +1 -1
  471. package/web/assets/{index-BhnAdWTt.js → index-BR0IhgbR.js} +10 -10
  472. package/web/assets/{infoDiagram-3YFTVSEB-BWBzD28-.js → infoDiagram-3YFTVSEB-6h8wbWEe.js} +1 -1
  473. package/web/assets/{ishikawaDiagram-BNXS4ZKH-B8qYT-j9.js → ishikawaDiagram-BNXS4ZKH-Dx2OkPk1.js} +1 -1
  474. package/web/assets/{kanban-definition-75IXJCU3-BeoPr5Tl.js → kanban-definition-75IXJCU3-CIIEZfqV.js} +1 -1
  475. package/web/assets/{mindmap-definition-2TDM6QVE-CdLLN_so.js → mindmap-definition-2TDM6QVE-DUAqydRq.js} +1 -1
  476. package/web/assets/{pieDiagram-CU6KROY3-DEd2a_k_.js → pieDiagram-CU6KROY3-BntYuYZa.js} +1 -1
  477. package/web/assets/{requirementDiagram-JXO7QTGE-QNeTo5C_.js → requirementDiagram-JXO7QTGE-QCD6I29n.js} +1 -1
  478. package/web/assets/{sequenceDiagram-VS2MUI6T-BHC7q7yJ.js → sequenceDiagram-VS2MUI6T-DScFwLz2.js} +1 -1
  479. package/web/assets/{stateDiagram-7D4R322I-KONnc2Px.js → stateDiagram-7D4R322I-AkRAm6Hl.js} +1 -1
  480. package/web/assets/{stateDiagram-v2-36443NZ5-C2QfuMlu.js → stateDiagram-v2-36443NZ5-BCK1vigR.js} +1 -1
  481. package/web/assets/{timeline-definition-O6YCAMPW-D4t4NJx1.js → timeline-definition-O6YCAMPW-BvpIVXjX.js} +1 -1
  482. package/web/assets/{vennDiagram-MWXL3ELB-6bctC9Yg.js → vennDiagram-MWXL3ELB-BYGWk6dK.js} +1 -1
  483. package/web/assets/{wardleyDiagram-CUQ6CDDI-BPZYNTvC.js → wardleyDiagram-CUQ6CDDI-Dk1z7H2T.js} +1 -1
  484. package/web/assets/{xychartDiagram-N2JHSOCM-lBI9O6DW.js → xychartDiagram-N2JHSOCM-2N6NCSWN.js} +1 -1
  485. package/web/index.html +1 -1
  486. package/dist/_shared/scope-resolution/shadow/aggregate.d.ts +0 -63
  487. package/dist/_shared/scope-resolution/shadow/aggregate.d.ts.map +0 -1
  488. package/dist/_shared/scope-resolution/shadow/aggregate.js +0 -122
  489. package/dist/_shared/scope-resolution/shadow/aggregate.js.map +0 -1
  490. package/dist/_shared/scope-resolution/shadow/diff.d.ts +0 -59
  491. package/dist/_shared/scope-resolution/shadow/diff.d.ts.map +0 -1
  492. package/dist/_shared/scope-resolution/shadow/diff.js +0 -79
  493. package/dist/_shared/scope-resolution/shadow/diff.js.map +0 -1
  494. package/dist/core/ingestion/ast-cache.d.ts +0 -26
  495. package/dist/core/ingestion/ast-cache.js +0 -48
  496. package/dist/core/ingestion/heritage-extractors/configs/go.d.ts +0 -13
  497. package/dist/core/ingestion/heritage-extractors/configs/go.js +0 -20
  498. package/dist/core/ingestion/heritage-extractors/configs/ruby.d.ts +0 -18
  499. package/dist/core/ingestion/heritage-extractors/configs/ruby.js +0 -65
  500. package/dist/core/ingestion/heritage-extractors/generic.d.ts +0 -23
  501. package/dist/core/ingestion/heritage-extractors/generic.js +0 -47
  502. package/dist/core/ingestion/heritage-processor.d.ts +0 -54
  503. package/dist/core/ingestion/heritage-processor.js +0 -367
  504. package/dist/core/ingestion/heritage-types.d.ts +0 -73
  505. package/dist/core/ingestion/heritage-types.js +0 -2
  506. package/dist/core/ingestion/import-processor.d.ts +0 -23
  507. package/dist/core/ingestion/import-processor.js +0 -377
  508. package/dist/core/ingestion/model/heritage-map.d.ts +0 -105
  509. package/dist/core/ingestion/model/heritage-map.js +0 -294
  510. package/dist/core/ingestion/model/resolution-context.d.ts +0 -93
  511. package/dist/core/ingestion/model/resolution-context.js +0 -337
  512. package/dist/core/ingestion/named-bindings/csharp.d.ts +0 -3
  513. package/dist/core/ingestion/named-bindings/csharp.js +0 -37
  514. package/dist/core/ingestion/named-bindings/java.d.ts +0 -3
  515. package/dist/core/ingestion/named-bindings/java.js +0 -29
  516. package/dist/core/ingestion/named-bindings/kotlin.d.ts +0 -3
  517. package/dist/core/ingestion/named-bindings/kotlin.js +0 -36
  518. package/dist/core/ingestion/named-bindings/php.d.ts +0 -3
  519. package/dist/core/ingestion/named-bindings/php.js +0 -61
  520. package/dist/core/ingestion/named-bindings/python.d.ts +0 -3
  521. package/dist/core/ingestion/named-bindings/python.js +0 -49
  522. package/dist/core/ingestion/named-bindings/rust.d.ts +0 -3
  523. package/dist/core/ingestion/named-bindings/rust.js +0 -66
  524. package/dist/core/ingestion/named-bindings/types.d.ts +0 -16
  525. package/dist/core/ingestion/named-bindings/types.js +0 -6
  526. package/dist/core/ingestion/named-bindings/typescript.d.ts +0 -3
  527. package/dist/core/ingestion/named-bindings/typescript.js +0 -58
  528. package/dist/core/ingestion/pipeline-phases/cross-file-impl.d.ts +0 -17
  529. package/dist/core/ingestion/pipeline-phases/cross-file-impl.js +0 -209
  530. package/dist/core/ingestion/pipeline-phases/orm-extraction.d.ts +0 -22
  531. package/dist/core/ingestion/pipeline-phases/orm-extraction.js +0 -92
  532. package/dist/core/ingestion/pipeline-phases/wildcard-synthesis.d.ts +0 -70
  533. package/dist/core/ingestion/pipeline-phases/wildcard-synthesis.js +0 -312
  534. package/dist/core/ingestion/registry-primary-flag.d.ts +0 -89
  535. package/dist/core/ingestion/registry-primary-flag.js +0 -122
  536. package/dist/core/ingestion/shadow-harness.d.ts +0 -113
  537. package/dist/core/ingestion/shadow-harness.js +0 -148
  538. package/dist/core/ingestion/utils/ruby-self-call.d.ts +0 -52
  539. package/dist/core/ingestion/utils/ruby-self-call.js +0 -59
  540. package/scripts/ci-list-migrated-languages.ts +0 -24
  541. package/scripts/run-parity.ts +0 -128
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Synchronous heap probes for large-repo OOM investigation (#1983).
3
+ *
4
+ * Writes to stderr (not pino) so lines flush under CI=1 / gdb attach.
5
+ * Enabled with `GITNEXUS_DEBUG_HEAP=1` or `GITNEXUS_PROFILE_DEFERRED=1`.
6
+ */
7
+ import { appendFileSync } from 'node:fs';
8
+ import { parseTruthyEnv } from './env.js';
9
+ import { isDeferredResolutionProfileEnabled } from './deferred-resolution-profile.js';
10
+ export const isDebugHeapEnabled = () => parseTruthyEnv(process.env.GITNEXUS_DEBUG_HEAP) || isDeferredResolutionProfileEnabled();
11
+ export const heapUsedMb = () => Math.round(process.memoryUsage().heapUsed / 1024 / 1024);
12
+ const rssMb = () => Math.round(process.memoryUsage().rss / 1024 / 1024);
13
+ /**
14
+ * Flush a one-line heap snapshot to stderr.
15
+ *
16
+ * stderr is async on a pipe (Linux), so a probe written just before an
17
+ * OOM-kill is lost in the pipe buffer. For OOM investigation set
18
+ * `GITNEXUS_HEAP_PROBE_FILE=/path` — each probe is then ALSO appended to
19
+ * that file with a synchronous `appendFileSync`, whose `write(2)` syscall
20
+ * completes (data handed to the kernel) before the call returns, so the
21
+ * last line survives SIGKILL. Includes rss alongside heapUsed so the
22
+ * native/off-heap gap is visible.
23
+ */
24
+ export const logHeapProbe = (label, detail) => {
25
+ if (!isDebugHeapEnabled())
26
+ return;
27
+ const suffix = detail ? ` ${detail}` : '';
28
+ const line = `[gitnexus-heap] ${label} used_mb=${heapUsedMb()} rss_mb=${rssMb()}${suffix}\n`;
29
+ process.stderr.write(line);
30
+ const file = process.env.GITNEXUS_HEAP_PROBE_FILE;
31
+ if (file) {
32
+ try {
33
+ appendFileSync(file, line);
34
+ }
35
+ catch {
36
+ // Best-effort diagnostics sink; never let a probe failure abort analyze.
37
+ }
38
+ }
39
+ };
@@ -0,0 +1,33 @@
1
+ /**
2
+ * #1994: shared codec for the synthetic `__heritage__:` / `__property__:` import
3
+ * markers used by the Ruby and Dart scope resolvers to carry side-effect facts
4
+ * (mixin includes, attr_accessor properties) through the import channel. Both
5
+ * languages share the exact `':'`-delimited wire format, so a single encode/decode
6
+ * pair removes the per-site hand-rolled string handling that produced the #1981
7
+ * edge-drop. Language-NEUTRAL — keyed only on the literal prefixes; no provider
8
+ * branching belongs here.
9
+ */
10
+ export type MarkerKind = 'heritage' | 'property';
11
+ export declare const HERITAGE_MARKER_PREFIX: string;
12
+ export declare const PROPERTY_MARKER_PREFIX: string;
13
+ /**
14
+ * Build a marker string `<prefix><field>:<field>:...`. The `':'` delimiter IS the
15
+ * wire format, so a field that itself contains `':'` is structurally invalid and
16
+ * THROWS — callers must pre-normalize colon-bearing values (e.g. a qualified mixin
17
+ * arg `Outer::Mixin` → `Outer.Mixin`). This makes the #1981 silent edge-drop a
18
+ * loud failure instead.
19
+ */
20
+ export declare function encodeMarker(kind: MarkerKind, fields: readonly string[]): string;
21
+ /**
22
+ * Parse a marker string back into its kind + positional fields, or `null` if `raw`
23
+ * is not a marker. Mirrors the historical `slice(PREFIX.length).split(':')`.
24
+ */
25
+ export declare function decodeMarker(raw: string): {
26
+ kind: MarkerKind;
27
+ fields: string[];
28
+ } | null;
29
+ /**
30
+ * True if `raw` is a synthetic heritage/property marker — exactly the prior
31
+ * `startsWith('__heritage__:') || startsWith('__property__:')` pair.
32
+ */
33
+ export declare function isHeritageMarker(raw: string): boolean;
@@ -0,0 +1,41 @@
1
+ const PREFIX_BY_KIND = {
2
+ heritage: '__heritage__:',
3
+ property: '__property__:',
4
+ };
5
+ export const HERITAGE_MARKER_PREFIX = PREFIX_BY_KIND.heritage;
6
+ export const PROPERTY_MARKER_PREFIX = PREFIX_BY_KIND.property;
7
+ /**
8
+ * Build a marker string `<prefix><field>:<field>:...`. The `':'` delimiter IS the
9
+ * wire format, so a field that itself contains `':'` is structurally invalid and
10
+ * THROWS — callers must pre-normalize colon-bearing values (e.g. a qualified mixin
11
+ * arg `Outer::Mixin` → `Outer.Mixin`). This makes the #1981 silent edge-drop a
12
+ * loud failure instead.
13
+ */
14
+ export function encodeMarker(kind, fields) {
15
+ for (const field of fields) {
16
+ if (field.includes(':')) {
17
+ throw new Error(`encodeMarker: field "${field}" contains the ':' delimiter; normalize it before encoding`);
18
+ }
19
+ }
20
+ return PREFIX_BY_KIND[kind] + fields.join(':');
21
+ }
22
+ /**
23
+ * Parse a marker string back into its kind + positional fields, or `null` if `raw`
24
+ * is not a marker. Mirrors the historical `slice(PREFIX.length).split(':')`.
25
+ */
26
+ export function decodeMarker(raw) {
27
+ if (raw.startsWith(PREFIX_BY_KIND.heritage)) {
28
+ return { kind: 'heritage', fields: raw.slice(PREFIX_BY_KIND.heritage.length).split(':') };
29
+ }
30
+ if (raw.startsWith(PREFIX_BY_KIND.property)) {
31
+ return { kind: 'property', fields: raw.slice(PREFIX_BY_KIND.property.length).split(':') };
32
+ }
33
+ return null;
34
+ }
35
+ /**
36
+ * True if `raw` is a synthetic heritage/property marker — exactly the prior
37
+ * `startsWith('__heritage__:') || startsWith('__property__:')` pair.
38
+ */
39
+ export function isHeritageMarker(raw) {
40
+ return raw.startsWith(PREFIX_BY_KIND.heritage) || raw.startsWith(PREFIX_BY_KIND.property);
41
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Shared qualified-name normalization.
3
+ *
4
+ * One canonical transform from a raw, language-specific qualified name
5
+ * (`Other::Inner`, `pkg\Sub\Type`, ` A . B `) to the `.`-joined form the
6
+ * graph and the `QualifiedNameIndex` are keyed by (`Other.Inner`, `pkg.Sub.Type`,
7
+ * `A.B`). Extracted from `class-extractors/generic.ts` so the structure-phase
8
+ * `buildQualifiedName`, the scope-resolution inheritance resolver, and the
9
+ * per-language capture emitters all key against ONE normalizer — a raw `::`
10
+ * qualifier must normalize to the exact key the index already holds, or the
11
+ * qualified lookup silently misses (issue #1982).
12
+ *
13
+ * Do NOT confuse with `heritage-extractors/supertype-alternation.ts`'s
14
+ * `simplifyRawName`, which collapses a qualified name to its LAST segment
15
+ * (`Other::Inner` → `Inner`) — that is a tail extractor, not a normalizer, and
16
+ * using it as a lookup key guarantees a miss.
17
+ *
18
+ * Pure string functions; no AST or tree-sitter dependency.
19
+ */
20
+ /**
21
+ * Normalize a raw qualified name to the `.`-joined canonical form:
22
+ * strips whitespace, converts `::` and `\` separators to `.`, collapses
23
+ * repeated dots, and trims leading/trailing dots.
24
+ */
25
+ export declare const normalizeQualifiedName: (value: string) => string;
26
+ /**
27
+ * Split a raw qualified name into its normalized, non-empty segments
28
+ * (`Other::Inner` → `['Other', 'Inner']`). Returns `[]` for an empty or
29
+ * separator-only input.
30
+ */
31
+ export declare const splitQualifiedName: (value: string) => string[];
32
+ /**
33
+ * Strip a trailing generic argument list at angle-bracket depth 0
34
+ * (`Models.Box<int>` → `Models.Box`). Constructor and inheritance sites
35
+ * often carry type arguments that are not part of the indexed def key.
36
+ */
37
+ export declare function stripTrailingTypeArguments(value: string): string;
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Shared qualified-name normalization.
3
+ *
4
+ * One canonical transform from a raw, language-specific qualified name
5
+ * (`Other::Inner`, `pkg\Sub\Type`, ` A . B `) to the `.`-joined form the
6
+ * graph and the `QualifiedNameIndex` are keyed by (`Other.Inner`, `pkg.Sub.Type`,
7
+ * `A.B`). Extracted from `class-extractors/generic.ts` so the structure-phase
8
+ * `buildQualifiedName`, the scope-resolution inheritance resolver, and the
9
+ * per-language capture emitters all key against ONE normalizer — a raw `::`
10
+ * qualifier must normalize to the exact key the index already holds, or the
11
+ * qualified lookup silently misses (issue #1982).
12
+ *
13
+ * Do NOT confuse with `heritage-extractors/supertype-alternation.ts`'s
14
+ * `simplifyRawName`, which collapses a qualified name to its LAST segment
15
+ * (`Other::Inner` → `Inner`) — that is a tail extractor, not a normalizer, and
16
+ * using it as a lookup key guarantees a miss.
17
+ *
18
+ * Pure string functions; no AST or tree-sitter dependency.
19
+ */
20
+ /**
21
+ * Normalize a raw qualified name to the `.`-joined canonical form:
22
+ * strips whitespace, converts `::` and `\` separators to `.`, collapses
23
+ * repeated dots, and trims leading/trailing dots.
24
+ */
25
+ export const normalizeQualifiedName = (value) => value
26
+ .replace(/\s+/g, '')
27
+ .replace(/^::/, '')
28
+ .replace(/::/g, '.')
29
+ .replace(/\\/g, '.')
30
+ .replace(/\.+/g, '.')
31
+ .replace(/^\.+|\.+$/g, '');
32
+ /**
33
+ * Split a raw qualified name into its normalized, non-empty segments
34
+ * (`Other::Inner` → `['Other', 'Inner']`). Returns `[]` for an empty or
35
+ * separator-only input.
36
+ */
37
+ export const splitQualifiedName = (value) => {
38
+ const normalized = normalizeQualifiedName(value);
39
+ return normalized ? normalized.split('.').filter(Boolean) : [];
40
+ };
41
+ /**
42
+ * Strip a trailing generic argument list at angle-bracket depth 0
43
+ * (`Models.Box<int>` → `Models.Box`). Constructor and inheritance sites
44
+ * often carry type arguments that are not part of the indexed def key.
45
+ */
46
+ export function stripTrailingTypeArguments(value) {
47
+ let depth = 0;
48
+ let ltAt0 = -1;
49
+ for (let i = 0; i < value.length; i++) {
50
+ const c = value[i];
51
+ if (c === '<') {
52
+ if (depth === 0)
53
+ ltAt0 = i;
54
+ depth++;
55
+ }
56
+ else if (c === '>') {
57
+ depth = Math.max(0, depth - 1);
58
+ if (depth === 0 && ltAt0 >= 0) {
59
+ const after = value.slice(i + 1).trim();
60
+ if (after.length === 0)
61
+ return value.slice(0, ltAt0);
62
+ ltAt0 = -1;
63
+ }
64
+ }
65
+ }
66
+ return value;
67
+ }
@@ -32,6 +32,54 @@ function extractCVarName(node) {
32
32
  }
33
33
  return undefined;
34
34
  }
35
+ /**
36
+ * Locate the `structured_binding_declarator` inside a `declaration` node, if any.
37
+ *
38
+ * C++ structured bindings (`auto [a, b] = pair;`) parse as:
39
+ * declaration → init_declarator → structured_binding_declarator → identifier+
40
+ * The reference form (`auto& [x, y] = tup;`) wraps it one level deeper:
41
+ * declaration → init_declarator → reference_declarator → structured_binding_declarator
42
+ */
43
+ function findStructuredBindingDeclarator(node) {
44
+ for (let i = 0; i < node.namedChildCount; i++) {
45
+ const child = node.namedChild(i);
46
+ if (child?.type !== 'init_declarator')
47
+ continue;
48
+ const declarator = child.childForFieldName('declarator');
49
+ if (declarator?.type === 'structured_binding_declarator')
50
+ return declarator;
51
+ // `auto& [x, y]` → reference_declarator wraps the structured_binding_declarator.
52
+ if (declarator?.type === 'reference_declarator') {
53
+ const inner = declarator.namedChildren.find((c) => c.type === 'structured_binding_declarator');
54
+ if (inner)
55
+ return inner;
56
+ }
57
+ }
58
+ return undefined;
59
+ }
60
+ /**
61
+ * Extract every bound name from a C/C++ declaration.
62
+ *
63
+ * For a structured binding `auto [a, b] = ...;` this returns each bound
64
+ * identifier (`['a', 'b']`); the binding's `structured_binding_declarator`
65
+ * lists one `identifier` per name. For an ordinary single-name declaration
66
+ * (`int n = 0;`) it falls back to the single name extractor so behaviour is
67
+ * unchanged (issue #1919 F9).
68
+ */
69
+ function extractCVarNames(node) {
70
+ const binding = findStructuredBindingDeclarator(node);
71
+ if (binding !== undefined) {
72
+ const names = [];
73
+ for (let i = 0; i < binding.namedChildCount; i++) {
74
+ const child = binding.namedChild(i);
75
+ if (child?.type === 'identifier')
76
+ names.push(child.text);
77
+ }
78
+ return names;
79
+ }
80
+ const single = extractCVarName(node);
81
+ return single !== undefined ? [single] : [];
82
+ }
35
83
  function extractCVarType(node) {
36
84
  const typeNode = node.childForFieldName('type');
37
85
  if (typeNode)
@@ -52,6 +100,7 @@ const shared = {
52
100
  staticNodeTypes: [],
53
101
  variableNodeTypes: ['declaration'],
54
102
  extractName: extractCVarName,
103
+ extractNames: extractCVarNames,
55
104
  extractType: extractCVarType,
56
105
  extractVisibility(node) {
57
106
  // C/C++ visibility is file-scoped by default (static = file-private)
@@ -1,68 +1,79 @@
1
1
  // gitnexus/src/core/ingestion/variable-extractors/configs/dart.ts
2
2
  import { SupportedLanguages } from '../../../../_shared/index.js';
3
- import { extractSimpleTypeName } from '../../type-extractors/shared.js';
4
3
  /**
5
4
  * Dart variable extraction config.
6
5
  *
7
- * Dart has top-level variable and constant declarations:
8
- * - `const maxSize = 100;`
9
- * - `final String name = "dart";`
10
- * - `var counter = 0;`
11
- * - `int x = 5;`
6
+ * Top-level Dart variables are NOT wrapped in a `declaration` node (that wrapper
7
+ * only occurs for class-body members). The structure query (`DART_QUERIES`)
8
+ * captures them as `@definition.variable` on the loose container node, which is
9
+ * one of two real shapes:
12
10
  *
13
- * tree-sitter-dart uses:
14
- * - declaration (with initialized_identifier_list) for file-scope variables
11
+ * - `var name = 'x';` / `int x = 5;`
12
+ * initialized_identifier_list > initialized_identifier > identifier
13
+ * - `final int count = 3;` / `const a = 1, b = 2;`
14
+ * → static_final_declaration_list > static_final_declaration > identifier
15
+ *
16
+ * The variable extractor is invoked on that captured container node to enrich
17
+ * the Variable symbol with name(s)/type/const/mutable metadata.
18
+ *
19
+ * NOTE: the const/final modifier (`const_builtin` / `final_builtin`) and the
20
+ * type annotation (`type_identifier`) are siblings of the captured container —
21
+ * they live on the parent (program), NOT inside it — so const-ness and the type
22
+ * are read from the captured node's parent. (This is why the previous
23
+ * `type_identifier`-as-direct-child read found nothing.)
15
24
  */
16
- function extractDartVarName(node) {
17
- // declaration → initialized_variable_definition → identifier
18
- for (let i = 0; i < node.namedChildCount; i++) {
19
- const child = node.namedChild(i);
20
- if (child?.type === 'initialized_variable_definition') {
21
- const name = child.childForFieldName('name');
22
- if (name)
23
- return name.text;
24
- // Fallback: first identifier
25
- for (let j = 0; j < child.namedChildCount; j++) {
26
- const gc = child.namedChild(j);
27
- if (gc?.type === 'identifier')
28
- return gc.text;
29
- }
30
- }
31
- // declaration → initialized_identifier_list → initialized_identifier → identifier
32
- if (child?.type === 'initialized_identifier_list') {
33
- for (let j = 0; j < child.namedChildCount; j++) {
34
- const gc = child.namedChild(j);
35
- if (gc?.type === 'initialized_identifier') {
36
- const ident = gc.namedChildren.find((c) => c.type === 'identifier');
37
- if (ident)
38
- return ident.text;
39
- }
40
- }
25
+ /** The `initialized_identifier` / `static_final_declaration` name children. */
26
+ function nameNodes(container) {
27
+ const out = [];
28
+ for (let i = 0; i < container.namedChildCount; i++) {
29
+ const entry = container.namedChild(i);
30
+ if (!entry)
31
+ continue;
32
+ if (entry.type === 'initialized_identifier' || entry.type === 'static_final_declaration') {
33
+ const ident = entry.firstNamedChild;
34
+ if (ident?.type === 'identifier')
35
+ out.push(ident);
41
36
  }
42
37
  }
43
- return undefined;
38
+ return out;
44
39
  }
45
- function extractDartVarType(node) {
46
- for (let i = 0; i < node.namedChildCount; i++) {
47
- const child = node.namedChild(i);
48
- if (child?.type === 'initialized_variable_definition') {
49
- const typeNode = child.childForFieldName('type');
50
- if (typeNode)
51
- return extractSimpleTypeName(typeNode) ?? typeNode.text?.trim();
52
- }
40
+ function extractDartVarNames(node) {
41
+ return nameNodes(node).map((n) => n.text);
42
+ }
43
+ /**
44
+ * Scan the container's immediately-preceding siblings (the modifier / type
45
+ * nodes of THIS declaration), stopping at the previous statement's `;` so a
46
+ * neighbouring declaration's modifiers/type never bleed in. Top-level Dart
47
+ * declarations sit as loose siblings under `program` separated by `;`:
48
+ * final int count = 3; var name = 'x'; const a = 1, b = 2;
49
+ * so the leading `type_identifier` / `const_builtin` / `final_builtin` of a
50
+ * declaration are the siblings between the prior `;` and the captured container.
51
+ */
52
+ function scanLeadingSiblings(node) {
53
+ const out = [];
54
+ let sib = node.previousSibling;
55
+ while (sib !== null && sib.type !== ';') {
56
+ out.push(sib);
57
+ sib = sib.previousSibling;
53
58
  }
54
- // Look for type_identifier directly on the node
55
- for (let i = 0; i < node.namedChildCount; i++) {
56
- const child = node.namedChild(i);
57
- if (child?.type === 'type_identifier')
58
- return child.text;
59
+ return out;
60
+ }
61
+ /**
62
+ * The declared type annotation, read from the captured container's leading
63
+ * sibling `type_identifier`. Returns undefined for inferred (`var`)
64
+ * declarations, which have an `inferred_type` sibling instead.
65
+ */
66
+ function extractDartVarType(node) {
67
+ for (const sib of scanLeadingSiblings(node)) {
68
+ if (sib.type === 'type_identifier')
69
+ return sib.text;
59
70
  }
60
71
  return undefined;
61
72
  }
62
- function hasDartKeyword(node, keyword) {
63
- for (let i = 0; i < node.childCount; i++) {
64
- const child = node.child(i);
65
- if (child?.text === keyword)
73
+ /** Whether a `const_builtin` / `final_builtin` leads this declaration. */
74
+ function hasReadonlyModifier(node) {
75
+ for (const sib of scanLeadingSiblings(node)) {
76
+ if (sib.type === 'const_builtin' || sib.type === 'final_builtin')
66
77
  return true;
67
78
  }
68
79
  return false;
@@ -71,24 +82,27 @@ export const dartVariableConfig = {
71
82
  language: SupportedLanguages.Dart,
72
83
  constNodeTypes: [],
73
84
  staticNodeTypes: [],
74
- variableNodeTypes: ['declaration'],
75
- extractName: extractDartVarName,
85
+ // The two real top-level container shapes captured as @definition.variable.
86
+ variableNodeTypes: ['initialized_identifier_list', 'static_final_declaration_list'],
87
+ extractName: (node) => extractDartVarNames(node)[0],
88
+ extractNames: extractDartVarNames,
76
89
  extractType: extractDartVarType,
77
- extractVisibility(node) {
78
- const name = extractDartVarName(node);
79
- if (!name)
80
- return 'public';
81
- // Dart convention: underscore prefix = library-private
90
+ extractVisibilityForName(_node, name) {
91
+ // Dart convention: underscore prefix = library-private.
82
92
  return name.startsWith('_') ? 'private' : 'public';
83
93
  },
84
- isConst(node) {
85
- return hasDartKeyword(node, 'const') || hasDartKeyword(node, 'final');
94
+ extractVisibility(node) {
95
+ const first = extractDartVarNames(node)[0];
96
+ if (!first)
97
+ return 'public';
98
+ return first.startsWith('_') ? 'private' : 'public';
86
99
  },
100
+ isConst: hasReadonlyModifier,
87
101
  isStatic(_node) {
88
- // Top-level Dart variables are not static
102
+ // Top-level Dart variables are not static.
89
103
  return false;
90
104
  },
91
105
  isMutable(node) {
92
- return !hasDartKeyword(node, 'const') && !hasDartKeyword(node, 'final');
106
+ return !hasReadonlyModifier(node);
93
107
  },
94
108
  };
@@ -15,7 +15,69 @@ import { extractSimpleTypeName } from '../../type-extractors/shared.js';
15
15
  *
16
16
  * Visibility: uppercase first letter = exported (public), lowercase = unexported (package).
17
17
  */
18
+ function goVisibilityForName(name) {
19
+ const firstChar = name.charAt(0);
20
+ return firstChar === firstChar.toUpperCase() && firstChar !== firstChar.toLowerCase()
21
+ ? 'public'
22
+ : 'package';
23
+ }
24
+ function collectGoSpecNames(spec) {
25
+ const names = [];
26
+ for (let i = 0; i < spec.namedChildCount; i++) {
27
+ const child = spec.namedChild(i);
28
+ if (!child)
29
+ continue;
30
+ if (child.type === 'identifier') {
31
+ names.push(child.text);
32
+ continue;
33
+ }
34
+ break;
35
+ }
36
+ return names;
37
+ }
38
+ function collectGoSpecs(node) {
39
+ const specs = [];
40
+ for (let i = 0; i < node.namedChildCount; i++) {
41
+ const child = node.namedChild(i);
42
+ if (child?.type === 'var_spec' || child?.type === 'const_spec') {
43
+ specs.push(child);
44
+ continue;
45
+ }
46
+ if (child?.type === 'var_spec_list') {
47
+ specs.push(...collectGoSpecs(child));
48
+ }
49
+ }
50
+ return specs;
51
+ }
52
+ function collectGoDeclarationNames(node) {
53
+ if (node.type === 'short_var_declaration') {
54
+ const left = node.childForFieldName('left');
55
+ if (left?.type !== 'expression_list')
56
+ return [];
57
+ return left.namedChildren
58
+ .filter((child) => child.type === 'identifier')
59
+ .map((child) => child.text);
60
+ }
61
+ const names = [];
62
+ for (const spec of collectGoSpecs(node))
63
+ names.push(...collectGoSpecNames(spec));
64
+ return names;
65
+ }
66
+ function findGoSpecForName(node, name) {
67
+ for (const spec of collectGoSpecs(node)) {
68
+ if (collectGoSpecNames(spec).includes(name))
69
+ return spec;
70
+ }
71
+ return undefined;
72
+ }
73
+ function extractGoSpecType(spec) {
74
+ const typeNode = spec.childForFieldName('type');
75
+ return typeNode ? (extractSimpleTypeName(typeNode) ?? typeNode.text?.trim()) : undefined;
76
+ }
18
77
  function extractGoVarName(node) {
78
+ const firstName = collectGoDeclarationNames(node)[0];
79
+ if (firstName)
80
+ return firstName;
19
81
  // var_declaration/const_declaration → var_spec/const_spec → identifier
20
82
  for (let i = 0; i < node.namedChildCount; i++) {
21
83
  const child = node.namedChild(i);
@@ -43,13 +105,10 @@ function extractGoVarName(node) {
43
105
  return undefined;
44
106
  }
45
107
  function extractGoVarType(node) {
46
- for (let i = 0; i < node.namedChildCount; i++) {
47
- const child = node.namedChild(i);
48
- if (child?.type === 'var_spec' || child?.type === 'const_spec') {
49
- const typeNode = child.childForFieldName('type');
50
- if (typeNode)
51
- return extractSimpleTypeName(typeNode) ?? typeNode.text?.trim();
52
- }
108
+ for (const spec of collectGoSpecs(node)) {
109
+ const typeName = extractGoSpecType(spec);
110
+ if (typeName)
111
+ return typeName;
53
112
  }
54
113
  return undefined;
55
114
  }
@@ -60,6 +119,10 @@ export const goVariableConfig = {
60
119
  variableNodeTypes: ['var_declaration', 'short_var_declaration'],
61
120
  extractName: extractGoVarName,
62
121
  extractType: extractGoVarType,
122
+ extractTypeForName(node, name) {
123
+ const spec = findGoSpecForName(node, name);
124
+ return spec ? extractGoSpecType(spec) : undefined;
125
+ },
63
126
  extractVisibility(node) {
64
127
  const name = extractGoVarName(node);
65
128
  if (!name)
@@ -70,6 +133,10 @@ export const goVariableConfig = {
70
133
  ? 'public'
71
134
  : 'package';
72
135
  },
136
+ extractNames: collectGoDeclarationNames,
137
+ extractVisibilityForName(_node, name) {
138
+ return goVisibilityForName(name);
139
+ },
73
140
  isConst(node) {
74
141
  return node.type === 'const_declaration';
75
142
  },
@@ -46,6 +46,18 @@ export const javaVariableConfig = {
46
46
  return !hasModifier(node, 'modifiers', 'final');
47
47
  },
48
48
  };
49
+ /** Single-binding name of a Kotlin property_declaration:
50
+ * property_declaration → variable_declaration → simple_identifier. */
51
+ function kotlinSingleVarName(node) {
52
+ for (let i = 0; i < node.namedChildCount; i++) {
53
+ const child = node.namedChild(i);
54
+ if (child?.type === 'variable_declaration') {
55
+ const ident = child.namedChildren.find((c) => c.type === 'simple_identifier');
56
+ return ident?.text;
57
+ }
58
+ }
59
+ return undefined;
60
+ }
49
61
  /**
50
62
  * Kotlin variable extraction config.
51
63
  *
@@ -57,16 +69,31 @@ export const kotlinVariableConfig = {
57
69
  constNodeTypes: [],
58
70
  staticNodeTypes: [],
59
71
  variableNodeTypes: ['property_declaration'],
60
- extractName(node) {
61
- // property_declaration variable_declaration simple_identifier
62
- for (let i = 0; i < node.namedChildCount; i++) {
63
- const child = node.namedChild(i);
64
- if (child?.type === 'variable_declaration') {
65
- const ident = child.namedChildren.find((c) => c.type === 'simple_identifier');
66
- return ident?.text;
72
+ extractName: kotlinSingleVarName,
73
+ // F51 (issue #1919): destructuring declarations bind several names at one
74
+ // node. `val (a, b) = pair` parses as
75
+ // property_declaration multi_variable_declaration
76
+ // → variable_declaration → simple_identifier (one per name)
77
+ // (real-parse-verified). The single-name `extractName` above misses these
78
+ // entirely. When a multi_variable_declaration is present we return EACH
79
+ // bound name; the Kotlin `_` placeholder is a discard and is skipped. A
80
+ // plain single declaration falls through to the existing variable_declaration
81
+ // shape so `val x = 1` still yields exactly one name (no double-count).
82
+ extractNames(node) {
83
+ const multi = node.namedChildren.find((c) => c.type === 'multi_variable_declaration');
84
+ if (multi !== undefined) {
85
+ const names = [];
86
+ for (const decl of multi.namedChildren) {
87
+ if (decl.type !== 'variable_declaration')
88
+ continue;
89
+ const ident = decl.namedChildren.find((c) => c.type === 'simple_identifier');
90
+ if (ident !== undefined && ident.text !== '_')
91
+ names.push(ident.text);
67
92
  }
93
+ return names;
68
94
  }
69
- return undefined;
95
+ const single = kotlinSingleVarName(node);
96
+ return single !== undefined ? [single] : [];
70
97
  },
71
98
  extractType(node) {
72
99
  // Look for type annotation in variable_declaration child